xref: /rk3399_rockchip-uboot/cmd/crypto.c (revision 495c8ff485bc8cfdba6b11a32566b33b6bb0c373)
1cc6ac5d6SJoseph Chen // SPDX-License-Identifier: GPL-2.0
2cc6ac5d6SJoseph Chen /*
3cc6ac5d6SJoseph Chen  * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4cc6ac5d6SJoseph Chen  */
5cc6ac5d6SJoseph Chen 
6cc6ac5d6SJoseph Chen #include <common.h>
7cc6ac5d6SJoseph Chen #include <command.h>
8cc6ac5d6SJoseph Chen #include <crypto.h>
9cc6ac5d6SJoseph Chen #include <dm.h>
10cc6ac5d6SJoseph Chen #include <u-boot/md5.h>
11cc6ac5d6SJoseph Chen #include <u-boot/sha1.h>
12cc6ac5d6SJoseph Chen #include <u-boot/sha256.h>
13e7b6c6a9SLin Jinhan #include <u-boot/sha512.h>
14*495c8ff4SLin Jinhan #include <rockchip/crypto_fix_test_data.h>
15cc6ac5d6SJoseph Chen 
16*495c8ff4SLin Jinhan struct hash_test_data {
17*495c8ff4SLin Jinhan 	const char	*algo_name;
18*495c8ff4SLin Jinhan 	const char	*mode_name;
19*495c8ff4SLin Jinhan 	u32		algo;
20*495c8ff4SLin Jinhan 	const u8	*data;
21*495c8ff4SLin Jinhan 	u32		data_len;
22*495c8ff4SLin Jinhan 	const u8	*hash;
23*495c8ff4SLin Jinhan 	u32		hash_len;
24*495c8ff4SLin Jinhan 	const u8	*key;
25*495c8ff4SLin Jinhan 	u32		key_len;
26cc6ac5d6SJoseph Chen };
27cc6ac5d6SJoseph Chen 
28*495c8ff4SLin Jinhan struct cipher_test_data {
29*495c8ff4SLin Jinhan 	const char	*algo_name;
30*495c8ff4SLin Jinhan 	const char	*mode_name;
31*495c8ff4SLin Jinhan 	u32		algo;
32*495c8ff4SLin Jinhan 	u32		mode;
33*495c8ff4SLin Jinhan 	const u8	*key;
34*495c8ff4SLin Jinhan 	const u8	*twk_key;
35*495c8ff4SLin Jinhan 	u32		key_len;
36*495c8ff4SLin Jinhan 	const u8	*iv;
37*495c8ff4SLin Jinhan 	u32		iv_len;
38*495c8ff4SLin Jinhan 	const u8	*plain;
39*495c8ff4SLin Jinhan 	u32		plain_len;
40*495c8ff4SLin Jinhan 	const u8	*cipher;
41*495c8ff4SLin Jinhan 	u32		cipher_len;
42cc6ac5d6SJoseph Chen };
43cc6ac5d6SJoseph Chen 
44*495c8ff4SLin Jinhan struct rsa_test_data {
45*495c8ff4SLin Jinhan 	const char	*algo_name;
46*495c8ff4SLin Jinhan 	const char	*mode_name;
47*495c8ff4SLin Jinhan 	u32		algo;
48*495c8ff4SLin Jinhan 	const u8	*n;
49*495c8ff4SLin Jinhan 	u32		n_len;
50*495c8ff4SLin Jinhan 	const u8	*e;
51*495c8ff4SLin Jinhan 	u32		e_len;
52*495c8ff4SLin Jinhan 	const u8	*d;
53*495c8ff4SLin Jinhan 	u32		d_len;
54*495c8ff4SLin Jinhan 	const u8	*c;
55*495c8ff4SLin Jinhan 	u32		c_len;
56*495c8ff4SLin Jinhan 	const u8	*sign_in;
57*495c8ff4SLin Jinhan 	u32		sign_in_len;
58*495c8ff4SLin Jinhan 	const u8	*sign_out;
59*495c8ff4SLin Jinhan 	u32		sign_out_len;
60cc6ac5d6SJoseph Chen };
61cc6ac5d6SJoseph Chen 
62*495c8ff4SLin Jinhan #define HASH_TEST(algo_type, data_in, hash_val) {\
63*495c8ff4SLin Jinhan 	.algo_name = "HASH", \
64*495c8ff4SLin Jinhan 	.mode_name = #algo_type, \
65*495c8ff4SLin Jinhan 	.algo      = CRYPTO_##algo_type, \
66*495c8ff4SLin Jinhan 	.data      = (data_in),\
67*495c8ff4SLin Jinhan 	.data_len  = sizeof(data_in), \
68*495c8ff4SLin Jinhan 	.hash      = (hash_val), \
69*495c8ff4SLin Jinhan 	.hash_len  = sizeof(hash_val) \
70cc6ac5d6SJoseph Chen }
71cc6ac5d6SJoseph Chen 
72*495c8ff4SLin Jinhan #define HMAC_TEST(algo_type, data_in, hash_val, hmac_key) {\
73*495c8ff4SLin Jinhan 	.algo_name = "HMAC", \
74*495c8ff4SLin Jinhan 	.mode_name = #algo_type, \
75*495c8ff4SLin Jinhan 	.algo      = CRYPTO_HMAC_##algo_type, \
76*495c8ff4SLin Jinhan 	.data      = (data_in),\
77*495c8ff4SLin Jinhan 	.data_len  = sizeof(data_in), \
78*495c8ff4SLin Jinhan 	.hash      = (hash_val), \
79*495c8ff4SLin Jinhan 	.hash_len  = sizeof(hash_val), \
80*495c8ff4SLin Jinhan 	.key       = (hmac_key), \
81*495c8ff4SLin Jinhan 	.key_len   = sizeof(hmac_key)\
82*495c8ff4SLin Jinhan }
83*495c8ff4SLin Jinhan 
84*495c8ff4SLin Jinhan #define CIPHER_XTS_TEST(algo_type, mode_type, key1, key2, iv_val, in, out) { \
85*495c8ff4SLin Jinhan 	.algo_name  = #algo_type, \
86*495c8ff4SLin Jinhan 	.mode_name  = #mode_type, \
87*495c8ff4SLin Jinhan 	.algo       = CRYPTO_##algo_type,\
88*495c8ff4SLin Jinhan 	.mode       = RK_MODE_##mode_type, \
89*495c8ff4SLin Jinhan 	.key        = (key1), \
90*495c8ff4SLin Jinhan 	.twk_key    = (key2), \
91*495c8ff4SLin Jinhan 	.key_len    = sizeof(key1), \
92*495c8ff4SLin Jinhan 	.iv         = (iv_val), \
93*495c8ff4SLin Jinhan 	.iv_len     = sizeof(iv_val), \
94*495c8ff4SLin Jinhan 	.plain      = (in), \
95*495c8ff4SLin Jinhan 	.plain_len  = sizeof(in), \
96*495c8ff4SLin Jinhan 	.cipher     = (out), \
97*495c8ff4SLin Jinhan 	.cipher_len = sizeof(out) \
98*495c8ff4SLin Jinhan }
99*495c8ff4SLin Jinhan 
100*495c8ff4SLin Jinhan #define CIPHER_TEST(algo, mode, key, iv, plain, cipher) \
101*495c8ff4SLin Jinhan 		CIPHER_XTS_TEST(algo, mode, key, NULL, iv, plain, cipher)
102*495c8ff4SLin Jinhan 
103*495c8ff4SLin Jinhan #define RSA_TEST(nbits, bn, be, bc, bd, in, out) { \
104*495c8ff4SLin Jinhan 	.algo_name    = "RSA", \
105*495c8ff4SLin Jinhan 	.mode_name    = #nbits, \
106*495c8ff4SLin Jinhan 	.algo         = CRYPTO_RSA##nbits, \
107*495c8ff4SLin Jinhan 	.n            = (bn), \
108*495c8ff4SLin Jinhan 	.n_len        = sizeof(bn), \
109*495c8ff4SLin Jinhan 	.e            = (be), \
110*495c8ff4SLin Jinhan 	.e_len        = sizeof(be), \
111*495c8ff4SLin Jinhan 	.d            = (bd), \
112*495c8ff4SLin Jinhan 	.d_len        = sizeof(bd), \
113*495c8ff4SLin Jinhan 	.c            = (bc), \
114*495c8ff4SLin Jinhan 	.c_len        = sizeof(bc), \
115*495c8ff4SLin Jinhan 	.sign_in      = (in), \
116*495c8ff4SLin Jinhan 	.sign_in_len  = sizeof(in), \
117*495c8ff4SLin Jinhan 	.sign_out     = (out), \
118*495c8ff4SLin Jinhan 	.sign_out_len = sizeof(out) \
119*495c8ff4SLin Jinhan }
120*495c8ff4SLin Jinhan 
121*495c8ff4SLin Jinhan #define EMPTY_TEST() {}
122*495c8ff4SLin Jinhan 
123*495c8ff4SLin Jinhan const struct hash_test_data hash_data_set[] = {
124*495c8ff4SLin Jinhan 	HASH_TEST(MD5,    foo_data, hash_md5),
125*495c8ff4SLin Jinhan 	HASH_TEST(SHA1,   foo_data, hash_sha1),
126*495c8ff4SLin Jinhan 	HASH_TEST(SHA256, foo_data, hash_sha256),
127*495c8ff4SLin Jinhan 	HASH_TEST(SHA512, foo_data, hash_sha512),
128*495c8ff4SLin Jinhan 	HASH_TEST(SM3,    foo_data, hash_sm3),
129*495c8ff4SLin Jinhan 
130*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_HMAC)
131*495c8ff4SLin Jinhan 	EMPTY_TEST(),
132*495c8ff4SLin Jinhan 	HMAC_TEST(MD5,    foo_data, hmac_md5,    hmac_key),
133*495c8ff4SLin Jinhan 	HMAC_TEST(SHA1,   foo_data, hmac_sha1,   hmac_key),
134*495c8ff4SLin Jinhan 	HMAC_TEST(SHA256, foo_data, hmac_sha256, hmac_key),
135*495c8ff4SLin Jinhan 	HMAC_TEST(SHA512, foo_data, hmac_sha512, hmac_key),
136*495c8ff4SLin Jinhan 	HMAC_TEST(SM3,    foo_data, hmac_sm3,    hmac_key),
137*495c8ff4SLin Jinhan #endif
138*495c8ff4SLin Jinhan };
139*495c8ff4SLin Jinhan 
140*495c8ff4SLin Jinhan const struct cipher_test_data cipher_data_set[] = {
141*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_CIPHER)
142*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, ECB, des_key, des_iv, foo_data, des_ecb_cipher),
143*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, CBC, des_key, des_iv, foo_data, des_cbc_cipher),
144*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, CFB, des_key, des_iv, foo_data, des_cfb_cipher),
145*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, OFB, des_key, des_iv, foo_data, des_ofb_cipher),
146*495c8ff4SLin Jinhan 
147*495c8ff4SLin Jinhan 	EMPTY_TEST(),
148*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, ECB, tdes_key, tdes_iv, foo_data, tdes_ecb_cipher),
149*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, CBC, tdes_key, tdes_iv, foo_data, tdes_cbc_cipher),
150*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, CFB, tdes_key, tdes_iv, foo_data, tdes_cfb_cipher),
151*495c8ff4SLin Jinhan 	CIPHER_TEST(DES, OFB, tdes_key, tdes_iv, foo_data, tdes_ofb_cipher),
152*495c8ff4SLin Jinhan 
153*495c8ff4SLin Jinhan 	EMPTY_TEST(),
154*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, ECB, aes_key, aes_iv, foo_data, aes_ecb_cipher),
155*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, CBC, aes_key, aes_iv, foo_data, aes_cbc_cipher),
156*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, CFB, aes_key, aes_iv, foo_data, aes_cfb_cipher),
157*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, OFB, aes_key, aes_iv, foo_data, aes_ofb_cipher),
158*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, CTS, aes_key, aes_iv, foo_data, aes_cts_cipher),
159*495c8ff4SLin Jinhan 	CIPHER_TEST(AES, CTR, aes_key, aes_iv, foo_data, aes_ctr_cipher),
160*495c8ff4SLin Jinhan 	CIPHER_XTS_TEST(AES, XTS, aes_key, aes_twk_key,
161*495c8ff4SLin Jinhan 			aes_iv, foo_data, aes_xts_cipher),
162*495c8ff4SLin Jinhan 
163*495c8ff4SLin Jinhan 	EMPTY_TEST(),
164*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, ECB, sm4_key, sm4_iv, foo_data, sm4_ecb_cipher),
165*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, CBC, sm4_key, sm4_iv, foo_data, sm4_cbc_cipher),
166*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, CFB, sm4_key, sm4_iv, foo_data, sm4_cfb_cipher),
167*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, OFB, sm4_key, sm4_iv, foo_data, sm4_ofb_cipher),
168*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, CTS, sm4_key, sm4_iv, foo_data, sm4_cts_cipher),
169*495c8ff4SLin Jinhan 	CIPHER_TEST(SM4, CTR, sm4_key, sm4_iv, foo_data, sm4_ctr_cipher),
170*495c8ff4SLin Jinhan 	CIPHER_XTS_TEST(SM4, XTS, sm4_key, sm4_twk_key,
171*495c8ff4SLin Jinhan 			sm4_iv, foo_data, sm4_xts_cipher),
172*495c8ff4SLin Jinhan #else
173*495c8ff4SLin Jinhan 	EMPTY_TEST(),
174*495c8ff4SLin Jinhan #endif
175*495c8ff4SLin Jinhan };
176*495c8ff4SLin Jinhan 
177*495c8ff4SLin Jinhan const struct rsa_test_data rsa_data_set[] = {
178*495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_RSA)
179*495c8ff4SLin Jinhan 	RSA_TEST(2048, rsa2048_n, rsa2048_e, rsa2048_c, rsa2048_d,
180*495c8ff4SLin Jinhan 		 rsa2048_sign_in, rsa2048_sign_out),
181*495c8ff4SLin Jinhan #else
182*495c8ff4SLin Jinhan 	EMPTY_TEST(),
183*495c8ff4SLin Jinhan #endif
184*495c8ff4SLin Jinhan };
185*495c8ff4SLin Jinhan 
186*495c8ff4SLin Jinhan static void dump_hex(const char *name, const u8 *array, u32 len)
18780ca1a53SLin Jinhan {
188*495c8ff4SLin Jinhan 	int i;
189*495c8ff4SLin Jinhan 
190*495c8ff4SLin Jinhan 	printf("[%s]: %uByte", name, len);
191*495c8ff4SLin Jinhan 	for (i = 0; i < len; i++) {
192*495c8ff4SLin Jinhan 		if (i % 32 == 0)
193*495c8ff4SLin Jinhan 			printf("\n");
194*495c8ff4SLin Jinhan 		printf("%02x ", array[i]);
195*495c8ff4SLin Jinhan 	}
196*495c8ff4SLin Jinhan 	printf("\n");
197*495c8ff4SLin Jinhan }
198*495c8ff4SLin Jinhan 
199*495c8ff4SLin Jinhan static inline void check_result(const char *algo_name, const char *mode_name,
200*495c8ff4SLin Jinhan 				const char *crypt,
201*495c8ff4SLin Jinhan 				const u8 *expect, const u8 *actual, u32 len)
202*495c8ff4SLin Jinhan {
203*495c8ff4SLin Jinhan 	if (memcmp(expect, actual, len) == 0) {
204*495c8ff4SLin Jinhan 		printf("[%s] %-8s%-8s PASS\n",
205*495c8ff4SLin Jinhan 		       algo_name, mode_name, crypt);
206*495c8ff4SLin Jinhan 	} else {
207*495c8ff4SLin Jinhan 		printf("[%s] %-8s%-8s FAIL\n",
208*495c8ff4SLin Jinhan 		       algo_name, mode_name, crypt);
209*495c8ff4SLin Jinhan 		dump_hex("expect", expect, len);
210*495c8ff4SLin Jinhan 		dump_hex("actual", actual, len);
211*495c8ff4SLin Jinhan 	}
212*495c8ff4SLin Jinhan }
213*495c8ff4SLin Jinhan 
214*495c8ff4SLin Jinhan int test_hash_result(void)
215*495c8ff4SLin Jinhan {
216*495c8ff4SLin Jinhan 	const struct hash_test_data *test_data = NULL;
217*495c8ff4SLin Jinhan 	sha_context csha_ctx;
218*495c8ff4SLin Jinhan 	struct udevice *dev;
219*495c8ff4SLin Jinhan 	unsigned int i;
220*495c8ff4SLin Jinhan 	u8 out[64];
22180ca1a53SLin Jinhan 	int ret;
22280ca1a53SLin Jinhan 
223*495c8ff4SLin Jinhan 	printf("\n=================== hash & hmac test ===================\n");
22480ca1a53SLin Jinhan 
225*495c8ff4SLin Jinhan 	for (i = 0; i < ARRAY_SIZE(hash_data_set); i++) {
226*495c8ff4SLin Jinhan 		test_data = &hash_data_set[i];
227*495c8ff4SLin Jinhan 		if (test_data->algo == 0) {
228*495c8ff4SLin Jinhan 			printf("\n");
229*495c8ff4SLin Jinhan 			continue;
230*495c8ff4SLin Jinhan 		}
231*495c8ff4SLin Jinhan 
232*495c8ff4SLin Jinhan 		dev = crypto_get_device(test_data->algo);
233*495c8ff4SLin Jinhan 		if (!dev) {
234*495c8ff4SLin Jinhan 			printf("[%s] %-16s unsupported!!!\n",
235*495c8ff4SLin Jinhan 			       test_data->algo_name,
236*495c8ff4SLin Jinhan 			       test_data->mode_name);
237*495c8ff4SLin Jinhan 			continue;
238*495c8ff4SLin Jinhan 		}
239*495c8ff4SLin Jinhan 
240*495c8ff4SLin Jinhan 		csha_ctx.algo   = test_data->algo;
241*495c8ff4SLin Jinhan 		csha_ctx.length = test_data->data_len;
242*495c8ff4SLin Jinhan 
243*495c8ff4SLin Jinhan 		memset(out, 0x00, sizeof(out));
244*495c8ff4SLin Jinhan 		if (test_data->key) {
245*495c8ff4SLin Jinhan 			ret = crypto_hmac_init(dev, &csha_ctx,
246*495c8ff4SLin Jinhan 					       (u8 *)test_data->key,
247*495c8ff4SLin Jinhan 					       test_data->key_len);
248*495c8ff4SLin Jinhan 			ret |= crypto_hmac_update(dev, (void *)test_data->data,
249*495c8ff4SLin Jinhan 						  test_data->data_len);
250*495c8ff4SLin Jinhan 			ret |= crypto_hmac_final(dev, &csha_ctx, out);
251*495c8ff4SLin Jinhan 			if (ret) {
252*495c8ff4SLin Jinhan 				printf("hmac calc error ret = %d\n", ret);
253*495c8ff4SLin Jinhan 				goto error;
254*495c8ff4SLin Jinhan 			}
255*495c8ff4SLin Jinhan 		} else {
256*495c8ff4SLin Jinhan 			ret = crypto_sha_init(dev, &csha_ctx);
257*495c8ff4SLin Jinhan 			ret |= crypto_sha_update(dev, (void *)test_data->data,
258*495c8ff4SLin Jinhan 						 test_data->data_len);
259*495c8ff4SLin Jinhan 			ret |= crypto_sha_final(dev, &csha_ctx, out);
260*495c8ff4SLin Jinhan 			if (ret) {
261*495c8ff4SLin Jinhan 				printf("hash calc error ret = %d\n", ret);
262*495c8ff4SLin Jinhan 				goto error;
263*495c8ff4SLin Jinhan 			}
264*495c8ff4SLin Jinhan 		}
265*495c8ff4SLin Jinhan 
266*495c8ff4SLin Jinhan 		check_result(test_data->algo_name, test_data->mode_name,
267*495c8ff4SLin Jinhan 			     "", test_data->hash, out, test_data->hash_len);
268*495c8ff4SLin Jinhan 		printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
269*495c8ff4SLin Jinhan 	}
270*495c8ff4SLin Jinhan 
271*495c8ff4SLin Jinhan 	return 0;
272*495c8ff4SLin Jinhan error:
273*495c8ff4SLin Jinhan 	printf("%s %s test error!\n",
274*495c8ff4SLin Jinhan 	       test_data->algo_name, test_data->mode_name);
275*495c8ff4SLin Jinhan 	return ret;
276*495c8ff4SLin Jinhan }
277*495c8ff4SLin Jinhan 
278*495c8ff4SLin Jinhan int test_cipher_result(void)
279*495c8ff4SLin Jinhan {
280*495c8ff4SLin Jinhan 	const struct cipher_test_data *test_data = NULL;
281*495c8ff4SLin Jinhan 	struct udevice *dev;
282*495c8ff4SLin Jinhan 	cipher_context ctx;
283*495c8ff4SLin Jinhan 	u8 out[256];
284*495c8ff4SLin Jinhan 	int ret;
285*495c8ff4SLin Jinhan 	u32 i;
286*495c8ff4SLin Jinhan 
287*495c8ff4SLin Jinhan 	printf("\n===================== cipher test ======================\n");
288*495c8ff4SLin Jinhan 
289*495c8ff4SLin Jinhan 	for (i = 0; i < ARRAY_SIZE(cipher_data_set); i++) {
290*495c8ff4SLin Jinhan 		test_data = &cipher_data_set[i];
291*495c8ff4SLin Jinhan 		if (test_data->algo == 0) {
292*495c8ff4SLin Jinhan 			printf("\n");
293*495c8ff4SLin Jinhan 			continue;
294*495c8ff4SLin Jinhan 		}
295*495c8ff4SLin Jinhan 
296*495c8ff4SLin Jinhan 		dev = crypto_get_device(test_data->algo);
297*495c8ff4SLin Jinhan 		if (!dev) {
298*495c8ff4SLin Jinhan 			printf("[%s] %-16s unsupported!!!\n",
299*495c8ff4SLin Jinhan 			       test_data->algo_name, test_data->mode_name);
300*495c8ff4SLin Jinhan 			continue;
301*495c8ff4SLin Jinhan 		}
302*495c8ff4SLin Jinhan 
303*495c8ff4SLin Jinhan 		memset(&ctx, 0x00, sizeof(ctx));
304*495c8ff4SLin Jinhan 
305*495c8ff4SLin Jinhan 		ctx.algo    = test_data->algo;
306*495c8ff4SLin Jinhan 		ctx.mode    = test_data->mode;
307*495c8ff4SLin Jinhan 		ctx.key     = test_data->key;
308*495c8ff4SLin Jinhan 		ctx.twk_key = test_data->twk_key;
309*495c8ff4SLin Jinhan 		ctx.key_len = test_data->key_len;
310*495c8ff4SLin Jinhan 		ctx.iv      = test_data->iv;
311*495c8ff4SLin Jinhan 		ctx.iv_len  = test_data->iv_len;
312*495c8ff4SLin Jinhan 
313*495c8ff4SLin Jinhan 		ret = crypto_cipher(dev, &ctx, test_data->plain,
314*495c8ff4SLin Jinhan 				    out, test_data->plain_len, true);
315*495c8ff4SLin Jinhan 		if (ret)
316*495c8ff4SLin Jinhan 			goto error;
317*495c8ff4SLin Jinhan 
318*495c8ff4SLin Jinhan 		check_result(test_data->algo_name, test_data->mode_name,
319*495c8ff4SLin Jinhan 			     "encrypt", test_data->cipher, out,
320*495c8ff4SLin Jinhan 			     test_data->cipher_len);
321*495c8ff4SLin Jinhan 
322*495c8ff4SLin Jinhan 		ret = crypto_cipher(dev, &ctx, test_data->cipher,
323*495c8ff4SLin Jinhan 				    out, test_data->cipher_len, false);
324*495c8ff4SLin Jinhan 		if (ret)
325*495c8ff4SLin Jinhan 			goto error;
326*495c8ff4SLin Jinhan 
327*495c8ff4SLin Jinhan 		check_result(test_data->algo_name, test_data->mode_name,
328*495c8ff4SLin Jinhan 			     "decrypt", test_data->plain, out,
329*495c8ff4SLin Jinhan 			     test_data->plain_len);
330*495c8ff4SLin Jinhan 		printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
331*495c8ff4SLin Jinhan 	}
332*495c8ff4SLin Jinhan 	return 0;
333*495c8ff4SLin Jinhan error:
334*495c8ff4SLin Jinhan 	printf("%s %s test error!\n",
335*495c8ff4SLin Jinhan 	       test_data->algo_name, test_data->mode_name);
336*495c8ff4SLin Jinhan 	return ret;
337*495c8ff4SLin Jinhan }
338*495c8ff4SLin Jinhan 
339*495c8ff4SLin Jinhan int test_rsa_result(void)
340*495c8ff4SLin Jinhan {
341*495c8ff4SLin Jinhan 	const struct rsa_test_data *test_data = NULL;
342*495c8ff4SLin Jinhan 	u8 *hard_out = NULL, *e_tmp;
343*495c8ff4SLin Jinhan 	u32 data_size = 4096 / 8;
344*495c8ff4SLin Jinhan 	struct udevice *dev;
345*495c8ff4SLin Jinhan 	rsa_key rsa_key;
346*495c8ff4SLin Jinhan 	int ret, i;
347*495c8ff4SLin Jinhan 
348*495c8ff4SLin Jinhan 	hard_out = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
349*495c8ff4SLin Jinhan 	if (!hard_out) {
35080ca1a53SLin Jinhan 		printf("%s, %d: memalign %u error!\n",
35180ca1a53SLin Jinhan 		       __func__, __LINE__, data_size);
35280ca1a53SLin Jinhan 		return -EINVAL;
35380ca1a53SLin Jinhan 	}
35480ca1a53SLin Jinhan 
355*495c8ff4SLin Jinhan 	e_tmp = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
356*495c8ff4SLin Jinhan 	if (!e_tmp) {
357*495c8ff4SLin Jinhan 		printf("%s, %d: memalign %u error!\n",
358*495c8ff4SLin Jinhan 		       __func__, __LINE__, data_size);
359*495c8ff4SLin Jinhan 		return -EINVAL;
36080ca1a53SLin Jinhan 	}
36180ca1a53SLin Jinhan 
362*495c8ff4SLin Jinhan 	printf("\n====================== rsa test ========================\n");
363*495c8ff4SLin Jinhan 	for (i = 0; i < ARRAY_SIZE(rsa_data_set); i++) {
364*495c8ff4SLin Jinhan 		test_data = &rsa_data_set[i];
365*495c8ff4SLin Jinhan 		if (test_data->algo == 0) {
366*495c8ff4SLin Jinhan 			printf("\n");
367*495c8ff4SLin Jinhan 			continue;
368*495c8ff4SLin Jinhan 		}
36980ca1a53SLin Jinhan 
370*495c8ff4SLin Jinhan 		dev = crypto_get_device(test_data->algo);
371*495c8ff4SLin Jinhan 		if (!dev) {
372*495c8ff4SLin Jinhan 			printf("[%s] %-16s unsupported!!!\n",
373*495c8ff4SLin Jinhan 			       test_data->algo_name, test_data->mode_name);
374*495c8ff4SLin Jinhan 			continue;
375*495c8ff4SLin Jinhan 		}
37680ca1a53SLin Jinhan 
377*495c8ff4SLin Jinhan 		/* sign test */
378*495c8ff4SLin Jinhan 		memset(&rsa_key, 0x00, sizeof(rsa_key));
379*495c8ff4SLin Jinhan 		rsa_key.algo = test_data->algo;
380*495c8ff4SLin Jinhan 		rsa_key.n = (u32 *)test_data->n;
381*495c8ff4SLin Jinhan 		rsa_key.e = (u32 *)test_data->d;
382*495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1
383*495c8ff4SLin Jinhan 		rsa_key.c = (u32 *)test_data->c;
384*495c8ff4SLin Jinhan #endif
38580ca1a53SLin Jinhan 
386*495c8ff4SLin Jinhan 		ret = crypto_rsa_verify(dev, &rsa_key,
387*495c8ff4SLin Jinhan 					(u8 *)test_data->sign_in, hard_out);
388*495c8ff4SLin Jinhan 		if (ret) {
389*495c8ff4SLin Jinhan 			printf("sign test error, ret = %d\n", ret);
390*495c8ff4SLin Jinhan 			goto error;
391*495c8ff4SLin Jinhan 		}
392*495c8ff4SLin Jinhan 
393*495c8ff4SLin Jinhan 		check_result(test_data->algo_name, test_data->mode_name,
394*495c8ff4SLin Jinhan 			     "sign", test_data->sign_out,
395*495c8ff4SLin Jinhan 			     hard_out, test_data->n_len);
396*495c8ff4SLin Jinhan 
397*495c8ff4SLin Jinhan 		/* verify test */
398*495c8ff4SLin Jinhan 		memset(&rsa_key, 0x00, sizeof(rsa_key));
399*495c8ff4SLin Jinhan 		memset(e_tmp, 0x00, data_size);
400*495c8ff4SLin Jinhan 		memcpy(e_tmp, test_data->e, test_data->e_len);
401*495c8ff4SLin Jinhan 		rsa_key.algo = test_data->algo;
402*495c8ff4SLin Jinhan 		rsa_key.n = (u32 *)test_data->n;
403*495c8ff4SLin Jinhan 		rsa_key.e = (u32 *)e_tmp;
404*495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1
405*495c8ff4SLin Jinhan 		rsa_key.c = (u32 *)test_data->c;
406*495c8ff4SLin Jinhan #endif
407*495c8ff4SLin Jinhan 
408*495c8ff4SLin Jinhan 		ret = crypto_rsa_verify(dev, &rsa_key,
409*495c8ff4SLin Jinhan 					(u8 *)test_data->sign_out, hard_out);
410*495c8ff4SLin Jinhan 		if (ret) {
411*495c8ff4SLin Jinhan 			printf("verify test error, ret = %d\n", ret);
412*495c8ff4SLin Jinhan 			goto error;
413*495c8ff4SLin Jinhan 		}
414*495c8ff4SLin Jinhan 
415*495c8ff4SLin Jinhan 		check_result(test_data->algo_name, test_data->mode_name,
416*495c8ff4SLin Jinhan 			     "verify", test_data->sign_in,
417*495c8ff4SLin Jinhan 			     hard_out, test_data->n_len);
418*495c8ff4SLin Jinhan 
419*495c8ff4SLin Jinhan 		printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
420*495c8ff4SLin Jinhan 	}
421*495c8ff4SLin Jinhan 
422*495c8ff4SLin Jinhan 	free(hard_out);
423*495c8ff4SLin Jinhan 	free(e_tmp);
424*495c8ff4SLin Jinhan 
425*495c8ff4SLin Jinhan 	return 0;
426*495c8ff4SLin Jinhan error:
427*495c8ff4SLin Jinhan 	free(hard_out);
428*495c8ff4SLin Jinhan 	free(e_tmp);
429*495c8ff4SLin Jinhan 	printf("%s %s test error!\n",
430*495c8ff4SLin Jinhan 	       test_data->algo_name, test_data->mode_name);
43180ca1a53SLin Jinhan 	return ret;
43280ca1a53SLin Jinhan }
43380ca1a53SLin Jinhan 
434*495c8ff4SLin Jinhan static int test_all_result(void)
435*495c8ff4SLin Jinhan {
436*495c8ff4SLin Jinhan 	int ret = 0;
437*495c8ff4SLin Jinhan 
438*495c8ff4SLin Jinhan 	ret = test_hash_result();
439*495c8ff4SLin Jinhan 	if (ret)
440*495c8ff4SLin Jinhan 		goto exit;
441*495c8ff4SLin Jinhan 
442*495c8ff4SLin Jinhan 	ret = test_cipher_result();
443*495c8ff4SLin Jinhan 	if (ret)
444*495c8ff4SLin Jinhan 		goto exit;
445*495c8ff4SLin Jinhan 
446*495c8ff4SLin Jinhan 	ret = test_rsa_result();
447*495c8ff4SLin Jinhan 	if (ret)
448*495c8ff4SLin Jinhan 		goto exit;
449*495c8ff4SLin Jinhan 
450*495c8ff4SLin Jinhan exit:
451*495c8ff4SLin Jinhan 	return 0;
452*495c8ff4SLin Jinhan }
453*495c8ff4SLin Jinhan 
454cc6ac5d6SJoseph Chen static int do_crypto(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
455cc6ac5d6SJoseph Chen {
456*495c8ff4SLin Jinhan 	return test_all_result();
457cc6ac5d6SJoseph Chen }
458cc6ac5d6SJoseph Chen 
459cc6ac5d6SJoseph Chen U_BOOT_CMD(
460cc6ac5d6SJoseph Chen 	crypto, 1, 1, do_crypto,
461cc6ac5d6SJoseph Chen 	"crypto test",
462cc6ac5d6SJoseph Chen 	""
463cc6ac5d6SJoseph Chen );
464