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>
14495c8ff4SLin Jinhan #include <rockchip/crypto_fix_test_data.h>
15cc6ac5d6SJoseph Chen
16415ed02bSLin Jinhan #define PERF_TOTAL_SIZE (128 * 1024 * 1024)
17415ed02bSLin Jinhan #define PERF_BUFF_SIZE (4 * 1024 * 1024)
18415ed02bSLin Jinhan
19415ed02bSLin Jinhan #define CALC_RATE_MPBS(bytes, ms) (((bytes) / 1024) / (ms))
20415ed02bSLin Jinhan
21495c8ff4SLin Jinhan struct hash_test_data {
22495c8ff4SLin Jinhan const char *algo_name;
23495c8ff4SLin Jinhan const char *mode_name;
24495c8ff4SLin Jinhan u32 algo;
25495c8ff4SLin Jinhan const u8 *data;
26495c8ff4SLin Jinhan u32 data_len;
27495c8ff4SLin Jinhan const u8 *hash;
28495c8ff4SLin Jinhan u32 hash_len;
29495c8ff4SLin Jinhan const u8 *key;
30495c8ff4SLin Jinhan u32 key_len;
31cc6ac5d6SJoseph Chen };
32cc6ac5d6SJoseph Chen
33495c8ff4SLin Jinhan struct cipher_test_data {
34495c8ff4SLin Jinhan const char *algo_name;
35495c8ff4SLin Jinhan const char *mode_name;
36495c8ff4SLin Jinhan u32 algo;
37495c8ff4SLin Jinhan u32 mode;
38495c8ff4SLin Jinhan const u8 *key;
39495c8ff4SLin Jinhan const u8 *twk_key;
40495c8ff4SLin Jinhan u32 key_len;
41495c8ff4SLin Jinhan const u8 *iv;
42495c8ff4SLin Jinhan u32 iv_len;
43495c8ff4SLin Jinhan const u8 *plain;
44495c8ff4SLin Jinhan u32 plain_len;
45495c8ff4SLin Jinhan const u8 *cipher;
46495c8ff4SLin Jinhan u32 cipher_len;
47c781c41cSLin Jinhan const u8 *aad;
48c781c41cSLin Jinhan u32 aad_len;
49c781c41cSLin Jinhan const u8 *tag;
50c781c41cSLin Jinhan u32 tag_len;
51cc6ac5d6SJoseph Chen };
52cc6ac5d6SJoseph Chen
53495c8ff4SLin Jinhan struct rsa_test_data {
54495c8ff4SLin Jinhan const char *algo_name;
55495c8ff4SLin Jinhan const char *mode_name;
56495c8ff4SLin Jinhan u32 algo;
57495c8ff4SLin Jinhan const u8 *n;
58495c8ff4SLin Jinhan u32 n_len;
59495c8ff4SLin Jinhan const u8 *e;
60495c8ff4SLin Jinhan u32 e_len;
61495c8ff4SLin Jinhan const u8 *d;
62495c8ff4SLin Jinhan u32 d_len;
63495c8ff4SLin Jinhan const u8 *c;
64495c8ff4SLin Jinhan u32 c_len;
65495c8ff4SLin Jinhan const u8 *sign_in;
66495c8ff4SLin Jinhan u32 sign_in_len;
67495c8ff4SLin Jinhan const u8 *sign_out;
68495c8ff4SLin Jinhan u32 sign_out_len;
69cc6ac5d6SJoseph Chen };
70cc6ac5d6SJoseph Chen
71*299fe3b6SLin Jinhan struct ec_test_data {
72*299fe3b6SLin Jinhan const char *algo_name;
73*299fe3b6SLin Jinhan u32 algo;
74*299fe3b6SLin Jinhan const u8 *pub_x;
75*299fe3b6SLin Jinhan u32 pub_x_len;
76*299fe3b6SLin Jinhan const u8 *pub_y;
77*299fe3b6SLin Jinhan u32 pub_y_len;
78*299fe3b6SLin Jinhan const u8 *hash_in;
79*299fe3b6SLin Jinhan u32 hash_in_len;
80*299fe3b6SLin Jinhan const u8 *sign_in;
81*299fe3b6SLin Jinhan u32 sign_in_len;
82*299fe3b6SLin Jinhan };
83*299fe3b6SLin Jinhan
8465ac8e46SLin Jinhan #define IS_MAC_MODE(mode) ((mode) == RK_MODE_CBC_MAC || \
8565ac8e46SLin Jinhan (mode) == RK_MODE_CMAC)
8665ac8e46SLin Jinhan
87c781c41cSLin Jinhan #define IS_AE_MODE(mode) ((mode) == RK_MODE_CCM || \
88c781c41cSLin Jinhan (mode) == RK_MODE_GCM)
89495c8ff4SLin Jinhan #define HASH_TEST(algo_type, data_in, hash_val) {\
90495c8ff4SLin Jinhan .algo_name = "HASH", \
91495c8ff4SLin Jinhan .mode_name = #algo_type, \
92495c8ff4SLin Jinhan .algo = CRYPTO_##algo_type, \
93495c8ff4SLin Jinhan .data = (data_in),\
94495c8ff4SLin Jinhan .data_len = sizeof(data_in), \
95495c8ff4SLin Jinhan .hash = (hash_val), \
96495c8ff4SLin Jinhan .hash_len = sizeof(hash_val) \
97cc6ac5d6SJoseph Chen }
98cc6ac5d6SJoseph Chen
99495c8ff4SLin Jinhan #define HMAC_TEST(algo_type, data_in, hash_val, hmac_key) {\
100495c8ff4SLin Jinhan .algo_name = "HMAC", \
101495c8ff4SLin Jinhan .mode_name = #algo_type, \
102495c8ff4SLin Jinhan .algo = CRYPTO_HMAC_##algo_type, \
103495c8ff4SLin Jinhan .data = (data_in),\
104495c8ff4SLin Jinhan .data_len = sizeof(data_in), \
105495c8ff4SLin Jinhan .hash = (hash_val), \
106495c8ff4SLin Jinhan .hash_len = sizeof(hash_val), \
107495c8ff4SLin Jinhan .key = (hmac_key), \
108495c8ff4SLin Jinhan .key_len = sizeof(hmac_key)\
109495c8ff4SLin Jinhan }
110495c8ff4SLin Jinhan
111495c8ff4SLin Jinhan #define CIPHER_XTS_TEST(algo_type, mode_type, key1, key2, iv_val, in, out) { \
112495c8ff4SLin Jinhan .algo_name = #algo_type, \
113495c8ff4SLin Jinhan .mode_name = #mode_type, \
114495c8ff4SLin Jinhan .algo = CRYPTO_##algo_type,\
115495c8ff4SLin Jinhan .mode = RK_MODE_##mode_type, \
116495c8ff4SLin Jinhan .key = (key1), \
117495c8ff4SLin Jinhan .twk_key = (key2), \
118495c8ff4SLin Jinhan .key_len = sizeof(key1), \
119495c8ff4SLin Jinhan .iv = (iv_val), \
120495c8ff4SLin Jinhan .iv_len = sizeof(iv_val), \
121495c8ff4SLin Jinhan .plain = (in), \
122495c8ff4SLin Jinhan .plain_len = sizeof(in), \
123495c8ff4SLin Jinhan .cipher = (out), \
124495c8ff4SLin Jinhan .cipher_len = sizeof(out) \
125495c8ff4SLin Jinhan }
126495c8ff4SLin Jinhan
127495c8ff4SLin Jinhan #define CIPHER_TEST(algo, mode, key, iv, plain, cipher) \
128495c8ff4SLin Jinhan CIPHER_XTS_TEST(algo, mode, key, NULL, iv, plain, cipher)
129495c8ff4SLin Jinhan
130c781c41cSLin Jinhan #define CIPHER_AE_TEST(algo_type, mode_type, key_val, iv_val, \
131c781c41cSLin Jinhan in, out, aad_val, tag_val) { \
132c781c41cSLin Jinhan .algo_name = #algo_type, \
133c781c41cSLin Jinhan .mode_name = #mode_type, \
134c781c41cSLin Jinhan .algo = CRYPTO_##algo_type,\
135c781c41cSLin Jinhan .mode = RK_MODE_##mode_type, \
136c781c41cSLin Jinhan .key = (key_val), \
137c781c41cSLin Jinhan .key_len = sizeof(key_val), \
138c781c41cSLin Jinhan .iv = (iv_val), \
139c781c41cSLin Jinhan .iv_len = sizeof(iv_val), \
140c781c41cSLin Jinhan .plain = (in), \
141c781c41cSLin Jinhan .plain_len = sizeof(in), \
142c781c41cSLin Jinhan .cipher = (out), \
143c781c41cSLin Jinhan .cipher_len = sizeof(out), \
144c781c41cSLin Jinhan .aad = (aad_val), \
145c781c41cSLin Jinhan .aad_len = sizeof(aad_val), \
146c781c41cSLin Jinhan .tag = (tag_val), \
147c781c41cSLin Jinhan .tag_len = sizeof(tag_val), \
148c781c41cSLin Jinhan }
149c781c41cSLin Jinhan
150495c8ff4SLin Jinhan #define RSA_TEST(nbits, bn, be, bc, bd, in, out) { \
151495c8ff4SLin Jinhan .algo_name = "RSA", \
152495c8ff4SLin Jinhan .mode_name = #nbits, \
153495c8ff4SLin Jinhan .algo = CRYPTO_RSA##nbits, \
154495c8ff4SLin Jinhan .n = (bn), \
155495c8ff4SLin Jinhan .n_len = sizeof(bn), \
156495c8ff4SLin Jinhan .e = (be), \
157495c8ff4SLin Jinhan .e_len = sizeof(be), \
158495c8ff4SLin Jinhan .d = (bd), \
159495c8ff4SLin Jinhan .d_len = sizeof(bd), \
160495c8ff4SLin Jinhan .c = (bc), \
161495c8ff4SLin Jinhan .c_len = sizeof(bc), \
162495c8ff4SLin Jinhan .sign_in = (in), \
163495c8ff4SLin Jinhan .sign_in_len = sizeof(in), \
164495c8ff4SLin Jinhan .sign_out = (out), \
165495c8ff4SLin Jinhan .sign_out_len = sizeof(out) \
166495c8ff4SLin Jinhan }
167495c8ff4SLin Jinhan
168*299fe3b6SLin Jinhan #define EC_TEST(name, x, y, hash, sign) { \
169*299fe3b6SLin Jinhan .algo_name = #name, \
170*299fe3b6SLin Jinhan .algo = CRYPTO_##name, \
171*299fe3b6SLin Jinhan .pub_x = (x), \
172*299fe3b6SLin Jinhan .pub_x_len = sizeof(x), \
173*299fe3b6SLin Jinhan .pub_y = (y), \
174*299fe3b6SLin Jinhan .pub_y_len = sizeof(y), \
175*299fe3b6SLin Jinhan .hash_in = (hash), \
176*299fe3b6SLin Jinhan .hash_in_len = sizeof(hash), \
177*299fe3b6SLin Jinhan .sign_in = (sign), \
178*299fe3b6SLin Jinhan .sign_in_len = sizeof(sign), \
179*299fe3b6SLin Jinhan }
180*299fe3b6SLin Jinhan
181495c8ff4SLin Jinhan #define EMPTY_TEST() {}
182495c8ff4SLin Jinhan
183495c8ff4SLin Jinhan const struct hash_test_data hash_data_set[] = {
184495c8ff4SLin Jinhan HASH_TEST(MD5, foo_data, hash_md5),
185495c8ff4SLin Jinhan HASH_TEST(SHA1, foo_data, hash_sha1),
186495c8ff4SLin Jinhan HASH_TEST(SHA256, foo_data, hash_sha256),
187495c8ff4SLin Jinhan HASH_TEST(SHA512, foo_data, hash_sha512),
188495c8ff4SLin Jinhan HASH_TEST(SM3, foo_data, hash_sm3),
189495c8ff4SLin Jinhan
190495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_HMAC)
191495c8ff4SLin Jinhan EMPTY_TEST(),
192495c8ff4SLin Jinhan HMAC_TEST(MD5, foo_data, hmac_md5, hmac_key),
193495c8ff4SLin Jinhan HMAC_TEST(SHA1, foo_data, hmac_sha1, hmac_key),
194495c8ff4SLin Jinhan HMAC_TEST(SHA256, foo_data, hmac_sha256, hmac_key),
195495c8ff4SLin Jinhan HMAC_TEST(SHA512, foo_data, hmac_sha512, hmac_key),
196495c8ff4SLin Jinhan HMAC_TEST(SM3, foo_data, hmac_sm3, hmac_key),
197495c8ff4SLin Jinhan #endif
198495c8ff4SLin Jinhan };
199495c8ff4SLin Jinhan
200495c8ff4SLin Jinhan const struct cipher_test_data cipher_data_set[] = {
201495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_CIPHER)
202495c8ff4SLin Jinhan CIPHER_TEST(DES, ECB, des_key, des_iv, foo_data, des_ecb_cipher),
203495c8ff4SLin Jinhan CIPHER_TEST(DES, CBC, des_key, des_iv, foo_data, des_cbc_cipher),
204495c8ff4SLin Jinhan CIPHER_TEST(DES, CFB, des_key, des_iv, foo_data, des_cfb_cipher),
205495c8ff4SLin Jinhan CIPHER_TEST(DES, OFB, des_key, des_iv, foo_data, des_ofb_cipher),
206495c8ff4SLin Jinhan
207495c8ff4SLin Jinhan EMPTY_TEST(),
208495c8ff4SLin Jinhan CIPHER_TEST(DES, ECB, tdes_key, tdes_iv, foo_data, tdes_ecb_cipher),
209495c8ff4SLin Jinhan CIPHER_TEST(DES, CBC, tdes_key, tdes_iv, foo_data, tdes_cbc_cipher),
210495c8ff4SLin Jinhan CIPHER_TEST(DES, CFB, tdes_key, tdes_iv, foo_data, tdes_cfb_cipher),
211495c8ff4SLin Jinhan CIPHER_TEST(DES, OFB, tdes_key, tdes_iv, foo_data, tdes_ofb_cipher),
212495c8ff4SLin Jinhan
213495c8ff4SLin Jinhan EMPTY_TEST(),
214495c8ff4SLin Jinhan CIPHER_TEST(AES, ECB, aes_key, aes_iv, foo_data, aes_ecb_cipher),
215495c8ff4SLin Jinhan CIPHER_TEST(AES, CBC, aes_key, aes_iv, foo_data, aes_cbc_cipher),
216495c8ff4SLin Jinhan CIPHER_TEST(AES, CFB, aes_key, aes_iv, foo_data, aes_cfb_cipher),
217495c8ff4SLin Jinhan CIPHER_TEST(AES, OFB, aes_key, aes_iv, foo_data, aes_ofb_cipher),
218495c8ff4SLin Jinhan CIPHER_TEST(AES, CTS, aes_key, aes_iv, foo_data, aes_cts_cipher),
219495c8ff4SLin Jinhan CIPHER_TEST(AES, CTR, aes_key, aes_iv, foo_data, aes_ctr_cipher),
220495c8ff4SLin Jinhan CIPHER_XTS_TEST(AES, XTS, aes_key, aes_twk_key,
221495c8ff4SLin Jinhan aes_iv, foo_data, aes_xts_cipher),
22265ac8e46SLin Jinhan CIPHER_TEST(AES, CBC_MAC, aes_key, aes_iv, foo_data, aes_cbc_mac),
22365ac8e46SLin Jinhan CIPHER_TEST(AES, CMAC, aes_key, aes_iv, foo_data, aes_cmac),
224c781c41cSLin Jinhan CIPHER_AE_TEST(AES, CCM, aes_key, aes_ccm_iv, foo_data, aes_ccm_cipher,
225c781c41cSLin Jinhan ad_data, aes_ccm_tag),
226c781c41cSLin Jinhan CIPHER_AE_TEST(AES, GCM, aes_key, aes_iv, foo_data, aes_gcm_cipher,
227c781c41cSLin Jinhan ad_data, aes_gcm_tag),
228495c8ff4SLin Jinhan
229495c8ff4SLin Jinhan EMPTY_TEST(),
230495c8ff4SLin Jinhan CIPHER_TEST(SM4, ECB, sm4_key, sm4_iv, foo_data, sm4_ecb_cipher),
231495c8ff4SLin Jinhan CIPHER_TEST(SM4, CBC, sm4_key, sm4_iv, foo_data, sm4_cbc_cipher),
232495c8ff4SLin Jinhan CIPHER_TEST(SM4, CFB, sm4_key, sm4_iv, foo_data, sm4_cfb_cipher),
233495c8ff4SLin Jinhan CIPHER_TEST(SM4, OFB, sm4_key, sm4_iv, foo_data, sm4_ofb_cipher),
234495c8ff4SLin Jinhan CIPHER_TEST(SM4, CTS, sm4_key, sm4_iv, foo_data, sm4_cts_cipher),
235495c8ff4SLin Jinhan CIPHER_TEST(SM4, CTR, sm4_key, sm4_iv, foo_data, sm4_ctr_cipher),
236495c8ff4SLin Jinhan CIPHER_XTS_TEST(SM4, XTS, sm4_key, sm4_twk_key,
237495c8ff4SLin Jinhan sm4_iv, foo_data, sm4_xts_cipher),
23865ac8e46SLin Jinhan CIPHER_TEST(SM4, CBC_MAC, sm4_key, sm4_iv, foo_data, sm4_cbc_mac),
23965ac8e46SLin Jinhan CIPHER_TEST(SM4, CMAC, sm4_key, sm4_iv, foo_data, sm4_cmac),
240c781c41cSLin Jinhan CIPHER_AE_TEST(SM4, CCM, sm4_key, sm4_ccm_iv, foo_data, sm4_ccm_cipher,
241c781c41cSLin Jinhan ad_data, sm4_ccm_tag),
242c781c41cSLin Jinhan CIPHER_AE_TEST(SM4, GCM, sm4_key, sm4_iv, foo_data, sm4_gcm_cipher,
243c781c41cSLin Jinhan ad_data, sm4_gcm_tag),
244495c8ff4SLin Jinhan #else
245495c8ff4SLin Jinhan EMPTY_TEST(),
246495c8ff4SLin Jinhan #endif
247495c8ff4SLin Jinhan };
248495c8ff4SLin Jinhan
249495c8ff4SLin Jinhan const struct rsa_test_data rsa_data_set[] = {
250495c8ff4SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_RSA)
251415ed02bSLin Jinhan
252415ed02bSLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1
253495c8ff4SLin Jinhan RSA_TEST(2048, rsa2048_n, rsa2048_e, rsa2048_c, rsa2048_d,
254495c8ff4SLin Jinhan rsa2048_sign_in, rsa2048_sign_out),
255495c8ff4SLin Jinhan #else
256415ed02bSLin Jinhan RSA_TEST(4096, rsa4096_n, rsa4096_e, NULL, rsa4096_d,
257415ed02bSLin Jinhan rsa4096_sign_in, rsa4096_sign_out),
258415ed02bSLin Jinhan #endif
259415ed02bSLin Jinhan
260415ed02bSLin Jinhan #else
261495c8ff4SLin Jinhan EMPTY_TEST(),
262495c8ff4SLin Jinhan #endif
263495c8ff4SLin Jinhan };
264495c8ff4SLin Jinhan
265*299fe3b6SLin Jinhan const struct ec_test_data ec_data_set[] = {
266*299fe3b6SLin Jinhan #if CONFIG_IS_ENABLED(ROCKCHIP_EC)
267*299fe3b6SLin Jinhan EC_TEST(ECC_192R1, ecc192r1_pub_x, ecc192r1_pub_y, ecc192r1_hash, ecc192r1_sign),
268*299fe3b6SLin Jinhan EC_TEST(SM2, sm2_pub_x, sm2_pub_y, sm2_hash, sm2_sign),
269*299fe3b6SLin Jinhan #else
270*299fe3b6SLin Jinhan EMPTY_TEST(),
271*299fe3b6SLin Jinhan #endif
272*299fe3b6SLin Jinhan };
273*299fe3b6SLin Jinhan
dump_hex(const char * name,const u8 * array,u32 len)274495c8ff4SLin Jinhan static void dump_hex(const char *name, const u8 *array, u32 len)
27580ca1a53SLin Jinhan {
276495c8ff4SLin Jinhan int i;
277495c8ff4SLin Jinhan
278495c8ff4SLin Jinhan printf("[%s]: %uByte", name, len);
279495c8ff4SLin Jinhan for (i = 0; i < len; i++) {
280495c8ff4SLin Jinhan if (i % 32 == 0)
281495c8ff4SLin Jinhan printf("\n");
282495c8ff4SLin Jinhan printf("%02x ", array[i]);
283495c8ff4SLin Jinhan }
284495c8ff4SLin Jinhan printf("\n");
285495c8ff4SLin Jinhan }
286495c8ff4SLin Jinhan
print_result_MBps(const char * algo_name,const char * mode_name,const char * crypt,ulong MBps,const u8 * expect,const u8 * actual,u32 len)287415ed02bSLin Jinhan static inline void print_result_MBps(const char *algo_name,
288415ed02bSLin Jinhan const char *mode_name,
289415ed02bSLin Jinhan const char *crypt, ulong MBps,
290415ed02bSLin Jinhan const u8 *expect, const u8 *actual,
291415ed02bSLin Jinhan u32 len)
292495c8ff4SLin Jinhan {
293495c8ff4SLin Jinhan if (memcmp(expect, actual, len) == 0) {
294415ed02bSLin Jinhan printf("[%s] %-8s%-8s PASS (%luMBps)\n",
295415ed02bSLin Jinhan algo_name, mode_name, crypt, MBps);
296495c8ff4SLin Jinhan } else {
297495c8ff4SLin Jinhan printf("[%s] %-8s%-8s FAIL\n",
298495c8ff4SLin Jinhan algo_name, mode_name, crypt);
299495c8ff4SLin Jinhan dump_hex("expect", expect, len);
300495c8ff4SLin Jinhan dump_hex("actual", actual, len);
301495c8ff4SLin Jinhan }
302495c8ff4SLin Jinhan }
303495c8ff4SLin Jinhan
print_result_ms(const char * algo_name,const char * mode_name,const char * crypt,ulong time_cost,const u8 * expect,const u8 * actual,u32 len)304415ed02bSLin Jinhan static inline void print_result_ms(const char *algo_name, const char *mode_name,
305415ed02bSLin Jinhan const char *crypt, ulong time_cost,
306415ed02bSLin Jinhan const u8 *expect, const u8 *actual, u32 len)
307415ed02bSLin Jinhan {
308415ed02bSLin Jinhan if (memcmp(expect, actual, len) == 0) {
309415ed02bSLin Jinhan printf("[%s] %-8s%-8s PASS (%lums)\n",
310415ed02bSLin Jinhan algo_name, mode_name, crypt, time_cost);
311415ed02bSLin Jinhan } else {
312415ed02bSLin Jinhan printf("[%s] %-8s%-8s FAIL\n",
313415ed02bSLin Jinhan algo_name, mode_name, crypt);
314415ed02bSLin Jinhan dump_hex("expect", expect, len);
315415ed02bSLin Jinhan dump_hex("actual", actual, len);
316415ed02bSLin Jinhan }
317415ed02bSLin Jinhan }
318415ed02bSLin Jinhan
test_hash_perf(struct udevice * dev,u32 algo,const u8 * key,u32 key_len,ulong * MBps)319415ed02bSLin Jinhan int test_hash_perf(struct udevice *dev, u32 algo,
320415ed02bSLin Jinhan const u8 *key, u32 key_len, ulong *MBps)
321415ed02bSLin Jinhan {
322415ed02bSLin Jinhan u32 total_size = PERF_TOTAL_SIZE;
323415ed02bSLin Jinhan u32 data_size = PERF_BUFF_SIZE;
324415ed02bSLin Jinhan sha_context ctx;
325415ed02bSLin Jinhan u8 *data = NULL;
326415ed02bSLin Jinhan u8 hash_out[64];
327415ed02bSLin Jinhan int ret, i;
328415ed02bSLin Jinhan
329415ed02bSLin Jinhan *MBps = 0;
330415ed02bSLin Jinhan
331415ed02bSLin Jinhan ctx.algo = algo;
332415ed02bSLin Jinhan ctx.length = total_size;
333415ed02bSLin Jinhan
334415ed02bSLin Jinhan data = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
335415ed02bSLin Jinhan if (!data) {
336415ed02bSLin Jinhan printf("%s, %d: memalign %u error!\n",
337415ed02bSLin Jinhan __func__, __LINE__, data_size);
338415ed02bSLin Jinhan return -EINVAL;
339415ed02bSLin Jinhan }
340415ed02bSLin Jinhan
341415ed02bSLin Jinhan memset(data, 0xab, data_size);
342415ed02bSLin Jinhan
343415ed02bSLin Jinhan ulong start = get_timer(0);
344415ed02bSLin Jinhan
345415ed02bSLin Jinhan if (key)
346415ed02bSLin Jinhan ret = crypto_hmac_init(dev, &ctx, (u8 *)key, key_len);
347415ed02bSLin Jinhan else
348415ed02bSLin Jinhan ret = crypto_sha_init(dev, &ctx);
349415ed02bSLin Jinhan
350415ed02bSLin Jinhan if (ret) {
351415ed02bSLin Jinhan printf("crypto_sha_init error ret = %d!\n", ret);
352415ed02bSLin Jinhan goto exit;
353415ed02bSLin Jinhan }
354415ed02bSLin Jinhan
355415ed02bSLin Jinhan for (i = 0; i < total_size / data_size; i++) {
356415ed02bSLin Jinhan ret = crypto_sha_update(dev, (u32 *)data, data_size);
357415ed02bSLin Jinhan if (ret) {
358415ed02bSLin Jinhan printf("crypto_sha_update error!\n");
359415ed02bSLin Jinhan goto exit;
360415ed02bSLin Jinhan }
361415ed02bSLin Jinhan }
362415ed02bSLin Jinhan
363415ed02bSLin Jinhan ret = crypto_sha_final(dev, &ctx, hash_out);
364415ed02bSLin Jinhan if (ret) {
365415ed02bSLin Jinhan printf("crypto_sha_final error ret = %d!\n", ret);
366415ed02bSLin Jinhan goto exit;
367415ed02bSLin Jinhan }
368415ed02bSLin Jinhan
369415ed02bSLin Jinhan ulong time_cost = get_timer(start);
370415ed02bSLin Jinhan
371415ed02bSLin Jinhan *MBps = CALC_RATE_MPBS(total_size, time_cost);
372415ed02bSLin Jinhan
373415ed02bSLin Jinhan exit:
374415ed02bSLin Jinhan free(data);
375415ed02bSLin Jinhan
376415ed02bSLin Jinhan return ret;
377415ed02bSLin Jinhan }
378415ed02bSLin Jinhan
test_cipher_perf(struct udevice * dev,cipher_context * ctx,ulong * MBps,bool enc)379415ed02bSLin Jinhan int test_cipher_perf(struct udevice *dev, cipher_context *ctx,
380415ed02bSLin Jinhan ulong *MBps, bool enc)
381415ed02bSLin Jinhan {
382415ed02bSLin Jinhan u32 total_size = PERF_TOTAL_SIZE;
383415ed02bSLin Jinhan u32 data_size = PERF_BUFF_SIZE;
384415ed02bSLin Jinhan u8 *plain = NULL, *cipher = NULL;
385c781c41cSLin Jinhan u8 aad[128], tag[16];
38665ac8e46SLin Jinhan int ret = 0, i;
387415ed02bSLin Jinhan
388415ed02bSLin Jinhan *MBps = 0;
389415ed02bSLin Jinhan
390415ed02bSLin Jinhan plain = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
391415ed02bSLin Jinhan if (!plain) {
392415ed02bSLin Jinhan printf("%s, %d: memalign %u error!\n",
393415ed02bSLin Jinhan __func__, __LINE__, data_size);
394415ed02bSLin Jinhan return -EINVAL;
395415ed02bSLin Jinhan }
396415ed02bSLin Jinhan
397415ed02bSLin Jinhan cipher = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
398415ed02bSLin Jinhan if (!cipher) {
399415ed02bSLin Jinhan printf("%s, %d: memalign %u error!\n",
400415ed02bSLin Jinhan __func__, __LINE__, data_size);
401415ed02bSLin Jinhan free(plain);
402415ed02bSLin Jinhan return -EINVAL;
403415ed02bSLin Jinhan }
404415ed02bSLin Jinhan
405415ed02bSLin Jinhan memset(plain, 0xab, data_size);
406c781c41cSLin Jinhan memset(aad, 0xcb, sizeof(aad));
407415ed02bSLin Jinhan
408415ed02bSLin Jinhan ulong start = get_timer(0);
409415ed02bSLin Jinhan
410415ed02bSLin Jinhan for (i = 0; i < total_size / data_size; i++) {
41165ac8e46SLin Jinhan if (IS_MAC_MODE(ctx->mode))
41265ac8e46SLin Jinhan ret = crypto_mac(dev, ctx, plain, data_size, cipher);
413c781c41cSLin Jinhan else if (IS_AE_MODE(ctx->mode))
414c781c41cSLin Jinhan ret = crypto_ae(dev, ctx, plain, data_size,
415c781c41cSLin Jinhan aad, sizeof(aad), cipher, tag);
41665ac8e46SLin Jinhan else
41765ac8e46SLin Jinhan ret = crypto_cipher(dev, ctx, plain, cipher,
41865ac8e46SLin Jinhan data_size, enc);
419415ed02bSLin Jinhan if (ret) {
420c781c41cSLin Jinhan printf("%s, %d:crypto calc error! ret = %d\n",
42165ac8e46SLin Jinhan __func__, __LINE__, ret);
422415ed02bSLin Jinhan goto exit;
423415ed02bSLin Jinhan }
424415ed02bSLin Jinhan }
425415ed02bSLin Jinhan
426415ed02bSLin Jinhan ulong time_cost = get_timer(start);
427415ed02bSLin Jinhan
428415ed02bSLin Jinhan *MBps = CALC_RATE_MPBS(total_size, time_cost);
429415ed02bSLin Jinhan exit:
430415ed02bSLin Jinhan free(plain);
431415ed02bSLin Jinhan free(cipher);
432415ed02bSLin Jinhan
433415ed02bSLin Jinhan return ret;
434415ed02bSLin Jinhan }
435415ed02bSLin Jinhan
test_hash_result(void)436495c8ff4SLin Jinhan int test_hash_result(void)
437495c8ff4SLin Jinhan {
438495c8ff4SLin Jinhan const struct hash_test_data *test_data = NULL;
439495c8ff4SLin Jinhan sha_context csha_ctx;
440495c8ff4SLin Jinhan struct udevice *dev;
441495c8ff4SLin Jinhan unsigned int i;
442495c8ff4SLin Jinhan u8 out[64];
44380ca1a53SLin Jinhan int ret;
44480ca1a53SLin Jinhan
445495c8ff4SLin Jinhan printf("\n=================== hash & hmac test ===================\n");
44680ca1a53SLin Jinhan
447495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(hash_data_set); i++) {
448495c8ff4SLin Jinhan test_data = &hash_data_set[i];
449495c8ff4SLin Jinhan if (test_data->algo == 0) {
450495c8ff4SLin Jinhan printf("\n");
451495c8ff4SLin Jinhan continue;
452495c8ff4SLin Jinhan }
453495c8ff4SLin Jinhan
454495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo);
455495c8ff4SLin Jinhan if (!dev) {
456495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n",
457495c8ff4SLin Jinhan test_data->algo_name,
458495c8ff4SLin Jinhan test_data->mode_name);
459495c8ff4SLin Jinhan continue;
460495c8ff4SLin Jinhan }
461495c8ff4SLin Jinhan
462495c8ff4SLin Jinhan csha_ctx.algo = test_data->algo;
463495c8ff4SLin Jinhan csha_ctx.length = test_data->data_len;
464495c8ff4SLin Jinhan
465495c8ff4SLin Jinhan memset(out, 0x00, sizeof(out));
466495c8ff4SLin Jinhan if (test_data->key) {
467495c8ff4SLin Jinhan ret = crypto_hmac_init(dev, &csha_ctx,
468495c8ff4SLin Jinhan (u8 *)test_data->key,
469495c8ff4SLin Jinhan test_data->key_len);
470495c8ff4SLin Jinhan ret |= crypto_hmac_update(dev, (void *)test_data->data,
471495c8ff4SLin Jinhan test_data->data_len);
472495c8ff4SLin Jinhan ret |= crypto_hmac_final(dev, &csha_ctx, out);
473495c8ff4SLin Jinhan if (ret) {
474495c8ff4SLin Jinhan printf("hmac calc error ret = %d\n", ret);
475495c8ff4SLin Jinhan goto error;
476495c8ff4SLin Jinhan }
477495c8ff4SLin Jinhan } else {
478495c8ff4SLin Jinhan ret = crypto_sha_init(dev, &csha_ctx);
479495c8ff4SLin Jinhan ret |= crypto_sha_update(dev, (void *)test_data->data,
480495c8ff4SLin Jinhan test_data->data_len);
481495c8ff4SLin Jinhan ret |= crypto_sha_final(dev, &csha_ctx, out);
482495c8ff4SLin Jinhan if (ret) {
483495c8ff4SLin Jinhan printf("hash calc error ret = %d\n", ret);
484495c8ff4SLin Jinhan goto error;
485495c8ff4SLin Jinhan }
486495c8ff4SLin Jinhan }
487495c8ff4SLin Jinhan
488415ed02bSLin Jinhan ulong MBps = 0;
489415ed02bSLin Jinhan
490415ed02bSLin Jinhan test_hash_perf(dev, test_data->algo,
491415ed02bSLin Jinhan test_data->key, test_data->key_len, &MBps);
492415ed02bSLin Jinhan print_result_MBps(test_data->algo_name, test_data->mode_name,
493415ed02bSLin Jinhan "", MBps, test_data->hash, out,
494415ed02bSLin Jinhan test_data->hash_len);
495495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
496495c8ff4SLin Jinhan }
497495c8ff4SLin Jinhan
498495c8ff4SLin Jinhan return 0;
499495c8ff4SLin Jinhan error:
500495c8ff4SLin Jinhan printf("%s %s test error!\n",
501495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name);
502495c8ff4SLin Jinhan return ret;
503495c8ff4SLin Jinhan }
504495c8ff4SLin Jinhan
test_cipher_result(void)505495c8ff4SLin Jinhan int test_cipher_result(void)
506495c8ff4SLin Jinhan {
507495c8ff4SLin Jinhan const struct cipher_test_data *test_data = NULL;
508495c8ff4SLin Jinhan struct udevice *dev;
509495c8ff4SLin Jinhan cipher_context ctx;
510c781c41cSLin Jinhan u8 out[256], tag[16];
511495c8ff4SLin Jinhan int ret;
512495c8ff4SLin Jinhan u32 i;
513495c8ff4SLin Jinhan
514495c8ff4SLin Jinhan printf("\n===================== cipher test ======================\n");
515495c8ff4SLin Jinhan
516495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(cipher_data_set); i++) {
517495c8ff4SLin Jinhan test_data = &cipher_data_set[i];
518495c8ff4SLin Jinhan if (test_data->algo == 0) {
519495c8ff4SLin Jinhan printf("\n");
520495c8ff4SLin Jinhan continue;
521495c8ff4SLin Jinhan }
522495c8ff4SLin Jinhan
523495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo);
524495c8ff4SLin Jinhan if (!dev) {
525495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n",
526495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name);
527495c8ff4SLin Jinhan continue;
528495c8ff4SLin Jinhan }
529495c8ff4SLin Jinhan
530495c8ff4SLin Jinhan memset(&ctx, 0x00, sizeof(ctx));
531495c8ff4SLin Jinhan
532495c8ff4SLin Jinhan ctx.algo = test_data->algo;
533495c8ff4SLin Jinhan ctx.mode = test_data->mode;
534495c8ff4SLin Jinhan ctx.key = test_data->key;
535495c8ff4SLin Jinhan ctx.twk_key = test_data->twk_key;
536495c8ff4SLin Jinhan ctx.key_len = test_data->key_len;
537495c8ff4SLin Jinhan ctx.iv = test_data->iv;
538495c8ff4SLin Jinhan ctx.iv_len = test_data->iv_len;
539495c8ff4SLin Jinhan
540415ed02bSLin Jinhan ulong MBps = 0;
541415ed02bSLin Jinhan
542415ed02bSLin Jinhan test_cipher_perf(dev, &ctx, &MBps, true);
543415ed02bSLin Jinhan
54465ac8e46SLin Jinhan /* AES/SM4 mac */
54565ac8e46SLin Jinhan if (IS_MAC_MODE(ctx.mode))
54665ac8e46SLin Jinhan ret = crypto_mac(dev, &ctx, test_data->plain,
54765ac8e46SLin Jinhan test_data->plain_len, out);
548c781c41cSLin Jinhan else if (IS_AE_MODE(ctx.mode))
549c781c41cSLin Jinhan ret = crypto_ae(dev, &ctx,
550c781c41cSLin Jinhan test_data->plain, test_data->plain_len,
551c781c41cSLin Jinhan test_data->aad, test_data->aad_len,
552c781c41cSLin Jinhan out, tag);
55365ac8e46SLin Jinhan else
554495c8ff4SLin Jinhan ret = crypto_cipher(dev, &ctx, test_data->plain,
555495c8ff4SLin Jinhan out, test_data->plain_len, true);
556495c8ff4SLin Jinhan if (ret)
557495c8ff4SLin Jinhan goto error;
558495c8ff4SLin Jinhan
559c781c41cSLin Jinhan if (test_data->tag &&
560c781c41cSLin Jinhan memcmp(test_data->tag, tag, test_data->tag_len) != 0) {
561c781c41cSLin Jinhan printf("tag mismatch!!!\n");
562c781c41cSLin Jinhan dump_hex("expect", test_data->tag, test_data->tag_len);
563c781c41cSLin Jinhan dump_hex("actual", tag, test_data->tag_len);
564c781c41cSLin Jinhan goto error;
565c781c41cSLin Jinhan }
566c781c41cSLin Jinhan
567415ed02bSLin Jinhan print_result_MBps(test_data->algo_name, test_data->mode_name,
568415ed02bSLin Jinhan "encrypt", MBps, test_data->cipher, out,
569495c8ff4SLin Jinhan test_data->cipher_len);
570495c8ff4SLin Jinhan
571c781c41cSLin Jinhan if (!IS_MAC_MODE(ctx.mode) && !IS_AE_MODE(ctx.mode)) {
572415ed02bSLin Jinhan test_cipher_perf(dev, &ctx, &MBps, false);
573495c8ff4SLin Jinhan ret = crypto_cipher(dev, &ctx, test_data->cipher,
574495c8ff4SLin Jinhan out, test_data->cipher_len, false);
575495c8ff4SLin Jinhan if (ret)
576495c8ff4SLin Jinhan goto error;
577495c8ff4SLin Jinhan
57865ac8e46SLin Jinhan print_result_MBps(test_data->algo_name,
57965ac8e46SLin Jinhan test_data->mode_name,
58065ac8e46SLin Jinhan "decrypt", MBps,
58165ac8e46SLin Jinhan test_data->plain, out,
582495c8ff4SLin Jinhan test_data->plain_len);
58365ac8e46SLin Jinhan }
584495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
585495c8ff4SLin Jinhan }
586495c8ff4SLin Jinhan return 0;
587495c8ff4SLin Jinhan error:
58865ac8e46SLin Jinhan printf("%s %s test error, ret = %d!\n",
58965ac8e46SLin Jinhan test_data->algo_name, test_data->mode_name, ret);
590495c8ff4SLin Jinhan return ret;
591495c8ff4SLin Jinhan }
592495c8ff4SLin Jinhan
test_rsa_result(void)593495c8ff4SLin Jinhan int test_rsa_result(void)
594495c8ff4SLin Jinhan {
595495c8ff4SLin Jinhan const struct rsa_test_data *test_data = NULL;
596495c8ff4SLin Jinhan u8 *hard_out = NULL, *e_tmp;
597495c8ff4SLin Jinhan u32 data_size = 4096 / 8;
598415ed02bSLin Jinhan ulong start, time_cost;
599495c8ff4SLin Jinhan struct udevice *dev;
600495c8ff4SLin Jinhan rsa_key rsa_key;
601495c8ff4SLin Jinhan int ret, i;
602495c8ff4SLin Jinhan
603495c8ff4SLin Jinhan hard_out = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
604495c8ff4SLin Jinhan if (!hard_out) {
60580ca1a53SLin Jinhan printf("%s, %d: memalign %u error!\n",
60680ca1a53SLin Jinhan __func__, __LINE__, data_size);
60780ca1a53SLin Jinhan return -EINVAL;
60880ca1a53SLin Jinhan }
60980ca1a53SLin Jinhan
610495c8ff4SLin Jinhan e_tmp = (u8 *)memalign(CONFIG_SYS_CACHELINE_SIZE, data_size);
611495c8ff4SLin Jinhan if (!e_tmp) {
612495c8ff4SLin Jinhan printf("%s, %d: memalign %u error!\n",
613495c8ff4SLin Jinhan __func__, __LINE__, data_size);
614495c8ff4SLin Jinhan return -EINVAL;
61580ca1a53SLin Jinhan }
61680ca1a53SLin Jinhan
617495c8ff4SLin Jinhan printf("\n====================== rsa test ========================\n");
618495c8ff4SLin Jinhan for (i = 0; i < ARRAY_SIZE(rsa_data_set); i++) {
619495c8ff4SLin Jinhan test_data = &rsa_data_set[i];
620495c8ff4SLin Jinhan if (test_data->algo == 0) {
621495c8ff4SLin Jinhan printf("\n");
622495c8ff4SLin Jinhan continue;
623495c8ff4SLin Jinhan }
62480ca1a53SLin Jinhan
625495c8ff4SLin Jinhan dev = crypto_get_device(test_data->algo);
626495c8ff4SLin Jinhan if (!dev) {
627495c8ff4SLin Jinhan printf("[%s] %-16s unsupported!!!\n",
628495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name);
629495c8ff4SLin Jinhan continue;
630495c8ff4SLin Jinhan }
63180ca1a53SLin Jinhan
632495c8ff4SLin Jinhan /* sign test */
633495c8ff4SLin Jinhan memset(&rsa_key, 0x00, sizeof(rsa_key));
634495c8ff4SLin Jinhan rsa_key.algo = test_data->algo;
635495c8ff4SLin Jinhan rsa_key.n = (u32 *)test_data->n;
636495c8ff4SLin Jinhan rsa_key.e = (u32 *)test_data->d;
637495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1
638495c8ff4SLin Jinhan rsa_key.c = (u32 *)test_data->c;
639495c8ff4SLin Jinhan #endif
64080ca1a53SLin Jinhan
641415ed02bSLin Jinhan start = get_timer(0);
642495c8ff4SLin Jinhan ret = crypto_rsa_verify(dev, &rsa_key,
643495c8ff4SLin Jinhan (u8 *)test_data->sign_in, hard_out);
644495c8ff4SLin Jinhan if (ret) {
645495c8ff4SLin Jinhan printf("sign test error, ret = %d\n", ret);
646495c8ff4SLin Jinhan goto error;
647495c8ff4SLin Jinhan }
648415ed02bSLin Jinhan time_cost = get_timer(start);
649415ed02bSLin Jinhan print_result_ms(test_data->algo_name, test_data->mode_name,
650415ed02bSLin Jinhan "sign", time_cost, test_data->sign_out,
651495c8ff4SLin Jinhan hard_out, test_data->n_len);
652495c8ff4SLin Jinhan
653495c8ff4SLin Jinhan /* verify test */
654495c8ff4SLin Jinhan memset(&rsa_key, 0x00, sizeof(rsa_key));
655495c8ff4SLin Jinhan memset(e_tmp, 0x00, data_size);
656495c8ff4SLin Jinhan memcpy(e_tmp, test_data->e, test_data->e_len);
657495c8ff4SLin Jinhan rsa_key.algo = test_data->algo;
658495c8ff4SLin Jinhan rsa_key.n = (u32 *)test_data->n;
659495c8ff4SLin Jinhan rsa_key.e = (u32 *)e_tmp;
660495c8ff4SLin Jinhan #ifdef CONFIG_ROCKCHIP_CRYPTO_V1
661495c8ff4SLin Jinhan rsa_key.c = (u32 *)test_data->c;
662495c8ff4SLin Jinhan #endif
663495c8ff4SLin Jinhan
664415ed02bSLin Jinhan start = get_timer(0);
665495c8ff4SLin Jinhan ret = crypto_rsa_verify(dev, &rsa_key,
666495c8ff4SLin Jinhan (u8 *)test_data->sign_out, hard_out);
667495c8ff4SLin Jinhan if (ret) {
668495c8ff4SLin Jinhan printf("verify test error, ret = %d\n", ret);
669495c8ff4SLin Jinhan goto error;
670495c8ff4SLin Jinhan }
671415ed02bSLin Jinhan time_cost = get_timer(start);
672495c8ff4SLin Jinhan
673415ed02bSLin Jinhan print_result_ms(test_data->algo_name, test_data->mode_name,
674415ed02bSLin Jinhan "verify", time_cost, test_data->sign_in,
675495c8ff4SLin Jinhan hard_out, test_data->n_len);
676495c8ff4SLin Jinhan
677495c8ff4SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
678495c8ff4SLin Jinhan }
679495c8ff4SLin Jinhan
680495c8ff4SLin Jinhan free(hard_out);
681495c8ff4SLin Jinhan free(e_tmp);
682495c8ff4SLin Jinhan
683495c8ff4SLin Jinhan return 0;
684495c8ff4SLin Jinhan error:
685495c8ff4SLin Jinhan free(hard_out);
686495c8ff4SLin Jinhan free(e_tmp);
687495c8ff4SLin Jinhan printf("%s %s test error!\n",
688495c8ff4SLin Jinhan test_data->algo_name, test_data->mode_name);
68980ca1a53SLin Jinhan return ret;
69080ca1a53SLin Jinhan }
69180ca1a53SLin Jinhan
test_ec_result(void)692*299fe3b6SLin Jinhan int test_ec_result(void)
693*299fe3b6SLin Jinhan {
694*299fe3b6SLin Jinhan const struct ec_test_data *test_data = NULL;
695*299fe3b6SLin Jinhan ulong start, time_cost;
696*299fe3b6SLin Jinhan struct udevice *dev;
697*299fe3b6SLin Jinhan ec_key ec_key;
698*299fe3b6SLin Jinhan int ret, i;
699*299fe3b6SLin Jinhan
700*299fe3b6SLin Jinhan printf("\n====================== ec test ========================\n");
701*299fe3b6SLin Jinhan for (i = 0; i < ARRAY_SIZE(ec_data_set); i++) {
702*299fe3b6SLin Jinhan test_data = &ec_data_set[i];
703*299fe3b6SLin Jinhan if (test_data->algo == 0) {
704*299fe3b6SLin Jinhan printf("\n");
705*299fe3b6SLin Jinhan continue;
706*299fe3b6SLin Jinhan }
707*299fe3b6SLin Jinhan
708*299fe3b6SLin Jinhan dev = crypto_get_device(test_data->algo);
709*299fe3b6SLin Jinhan if (!dev) {
710*299fe3b6SLin Jinhan printf("[%s] %-16s unsupported!!!\n",
711*299fe3b6SLin Jinhan test_data->algo_name, "");
712*299fe3b6SLin Jinhan continue;
713*299fe3b6SLin Jinhan }
714*299fe3b6SLin Jinhan
715*299fe3b6SLin Jinhan /* verify test */
716*299fe3b6SLin Jinhan memset(&ec_key, 0x00, sizeof(ec_key));
717*299fe3b6SLin Jinhan ec_key.algo = test_data->algo;
718*299fe3b6SLin Jinhan ec_key.x = (u32 *)test_data->pub_x;
719*299fe3b6SLin Jinhan ec_key.y = (u32 *)test_data->pub_y;
720*299fe3b6SLin Jinhan
721*299fe3b6SLin Jinhan start = get_timer(0);
722*299fe3b6SLin Jinhan ret = crypto_ec_verify(dev, &ec_key,
723*299fe3b6SLin Jinhan (u8 *)test_data->hash_in,
724*299fe3b6SLin Jinhan test_data->hash_in_len,
725*299fe3b6SLin Jinhan (u8 *)test_data->sign_in);
726*299fe3b6SLin Jinhan if (ret) {
727*299fe3b6SLin Jinhan printf("verify test error, ret = %d\n", ret);
728*299fe3b6SLin Jinhan goto error;
729*299fe3b6SLin Jinhan }
730*299fe3b6SLin Jinhan time_cost = get_timer(start);
731*299fe3b6SLin Jinhan
732*299fe3b6SLin Jinhan printf("[%-9s] %-8s PASS (%lums)\n",
733*299fe3b6SLin Jinhan test_data->algo_name, "verify", time_cost);
734*299fe3b6SLin Jinhan
735*299fe3b6SLin Jinhan printf("+++++++++++++++++++++++++++++++++++++++++++++++++++\n");
736*299fe3b6SLin Jinhan }
737*299fe3b6SLin Jinhan
738*299fe3b6SLin Jinhan return 0;
739*299fe3b6SLin Jinhan error:
740*299fe3b6SLin Jinhan printf("%s test error!\n", test_data->algo_name);
741*299fe3b6SLin Jinhan return ret;
742*299fe3b6SLin Jinhan }
743*299fe3b6SLin Jinhan
test_all_result(void)744495c8ff4SLin Jinhan static int test_all_result(void)
745495c8ff4SLin Jinhan {
746495c8ff4SLin Jinhan int ret = 0;
747495c8ff4SLin Jinhan
748495c8ff4SLin Jinhan ret = test_hash_result();
749495c8ff4SLin Jinhan if (ret)
750495c8ff4SLin Jinhan goto exit;
751495c8ff4SLin Jinhan
752495c8ff4SLin Jinhan ret = test_cipher_result();
753495c8ff4SLin Jinhan if (ret)
754495c8ff4SLin Jinhan goto exit;
755495c8ff4SLin Jinhan
756495c8ff4SLin Jinhan ret = test_rsa_result();
757495c8ff4SLin Jinhan if (ret)
758495c8ff4SLin Jinhan goto exit;
759495c8ff4SLin Jinhan
760*299fe3b6SLin Jinhan ret = test_ec_result();
761*299fe3b6SLin Jinhan if (ret)
762*299fe3b6SLin Jinhan goto exit;
763*299fe3b6SLin Jinhan
764495c8ff4SLin Jinhan exit:
765495c8ff4SLin Jinhan return 0;
766495c8ff4SLin Jinhan }
767495c8ff4SLin Jinhan
do_crypto(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])768cc6ac5d6SJoseph Chen static int do_crypto(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
769cc6ac5d6SJoseph Chen {
770495c8ff4SLin Jinhan return test_all_result();
771cc6ac5d6SJoseph Chen }
772cc6ac5d6SJoseph Chen
773cc6ac5d6SJoseph Chen U_BOOT_CMD(
774cc6ac5d6SJoseph Chen crypto, 1, 1, do_crypto,
775cc6ac5d6SJoseph Chen "crypto test",
776cc6ac5d6SJoseph Chen ""
777cc6ac5d6SJoseph Chen );
778