xref: /OK3568_Linux_fs/external/security/librkcrypto/test/test_rsa.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun #include <stdlib.h>
5*4882a593Smuzhiyun #include <string.h>
6*4882a593Smuzhiyun #include <unistd.h>
7*4882a593Smuzhiyun #include "rkcrypto_core.h"
8*4882a593Smuzhiyun #include "rkcrypto_trace.h"
9*4882a593Smuzhiyun #include "cmode_adapter.h"
10*4882a593Smuzhiyun #include "test_rsa.h"
11*4882a593Smuzhiyun #include "test_utils.h"
12*4882a593Smuzhiyun #include "rsa_key_data.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define TEST_END_PASS(nbits, padding_name)  do { \
15*4882a593Smuzhiyun 		if (verbose) \
16*4882a593Smuzhiyun 			printf("******** %-20s %-u\t%-16s test PASS !!! ********\n", \
17*4882a593Smuzhiyun 			       __func__, nbits, padding_name); \
18*4882a593Smuzhiyun 	} while (0)
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define TEST_END_FAIL(nbits, padding_name)  do { \
21*4882a593Smuzhiyun 		if (verbose) \
22*4882a593Smuzhiyun 			printf("******** %-20s %-u\t%-16s test FAIL !!! ********\n", \
23*4882a593Smuzhiyun 			       __func__, nbits, padding_name); \
24*4882a593Smuzhiyun 	} while (0)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define TEST_END_NA(nbits, padding_name)  do { \
27*4882a593Smuzhiyun 		if (verbose) \
28*4882a593Smuzhiyun 			printf("******** %-20s %-u\t%-16s test N/A  !!! ********\n", \
29*4882a593Smuzhiyun 			       __func__, nbits, padding_name); \
30*4882a593Smuzhiyun 	} while (0)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun typedef RK_RES (*test_rsa_one)(uint32_t padding, const char *padding_name,
33*4882a593Smuzhiyun 			       uint32_t nbits, uint32_t data_len, int verbose);
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun struct test_rsa_item {
36*4882a593Smuzhiyun 	test_rsa_one	do_test;
37*4882a593Smuzhiyun 	uint32_t	padding;
38*4882a593Smuzhiyun 	const char	*padding_name;
39*4882a593Smuzhiyun 	uint32_t	data_size;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static RK_RES test_rsa_pub_enc(uint32_t padding, const char *padding_name,
43*4882a593Smuzhiyun 			       uint32_t nbits, uint32_t data_len, int verbose);
44*4882a593Smuzhiyun static RK_RES test_rsa_priv_enc(uint32_t padding, const char *padding_name,
45*4882a593Smuzhiyun 				uint32_t nbits, uint32_t data_len, int verbose);
46*4882a593Smuzhiyun static RK_RES test_rsa_sign(uint32_t padding, const char *padding_name,
47*4882a593Smuzhiyun 			    uint32_t nbits, uint32_t data_len, int verbose);
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define TEST_RSA_CRYPT(test, name, size)	{test, RK_RSA_CRYPT_PADDING_##name, #name, size}
50*4882a593Smuzhiyun #define TEST_RSA_SIGN(test, name, size)		{test, RK_RSA_SIGN_PADDING_##name, #name, size}
51*4882a593Smuzhiyun #define TEST_RSA_EMPTY()			{NULL, 0, NULL, 0}
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun static const struct test_rsa_item test_rsa_tbl[] = {
54*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  NONE,             0),
55*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  BLOCK_TYPE_0,     SHA256_HASH_SIZE),
56*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  BLOCK_TYPE_1,     SHA256_HASH_SIZE),
57*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  BLOCK_TYPE_2,     SHA256_HASH_SIZE),
58*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  PKCS1_V1_5,       SHA256_HASH_SIZE),
59*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  OAEP_SHA1,        SHA1_HASH_SIZE),
60*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  OAEP_SHA256,      SHA256_HASH_SIZE),
61*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  OAEP_SHA384,      SHA384_HASH_SIZE),
62*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_pub_enc,  OAEP_SHA512,      SHA512_HASH_SIZE),
63*4882a593Smuzhiyun 	TEST_RSA_EMPTY(),
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, NONE,             0),
66*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, BLOCK_TYPE_0,     SHA256_HASH_SIZE),
67*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, BLOCK_TYPE_1,     SHA256_HASH_SIZE),
68*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, BLOCK_TYPE_2,     SHA256_HASH_SIZE),
69*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, PKCS1_V1_5,	    SHA256_HASH_SIZE),
70*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, OAEP_SHA1,        SHA1_HASH_SIZE),
71*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, OAEP_SHA224,      SHA224_HASH_SIZE),
72*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, OAEP_SHA256,      SHA256_HASH_SIZE),
73*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, OAEP_SHA384,      SHA384_HASH_SIZE),
74*4882a593Smuzhiyun 	TEST_RSA_CRYPT(test_rsa_priv_enc, OAEP_SHA512,      SHA512_HASH_SIZE),
75*4882a593Smuzhiyun 	TEST_RSA_EMPTY(),
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,      PKCS1_V15_SHA1,   512),
78*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,      PKCS1_V15_SHA224, 512),
79*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,      PKCS1_V15_SHA256, 512),
80*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,      PKCS1_V15_SHA384, 512),
81*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,      PKCS1_V15_SHA512, 512),
82*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,	  PKCS1_PSS_SHA1,   512),
83*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,	  PKCS1_PSS_SHA224, 512),
84*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,	  PKCS1_PSS_SHA256, 512),
85*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,	  PKCS1_PSS_SHA384, 512),
86*4882a593Smuzhiyun 	TEST_RSA_SIGN(test_rsa_sign,	  PKCS1_PSS_SHA512, 512),
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #ifdef RSA_OPENSSL_COMPRAE
90*4882a593Smuzhiyun #include <openssl/rsa.h>
91*4882a593Smuzhiyun #include <openssl/bn.h>
92*4882a593Smuzhiyun #include <openssl/rand.h>
93*4882a593Smuzhiyun #include <openssl/evp.h>
94*4882a593Smuzhiyun #include <openssl/ec_key.h>
95*4882a593Smuzhiyun #include <openssl/base.h>
96*4882a593Smuzhiyun #include <openssl/sha.h>
97*4882a593Smuzhiyun #include <openssl/err.h>
98*4882a593Smuzhiyun 
rk2ssl_padding(uint32_t rk_padding,int * ssl_padding,const EVP_MD ** digest_md)99*4882a593Smuzhiyun static RK_RES rk2ssl_padding(uint32_t rk_padding, int *ssl_padding, const EVP_MD **digest_md)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	switch (rk_padding) {
102*4882a593Smuzhiyun 	/* crypt padding */
103*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA1:
104*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_OAEP_PADDING;
105*4882a593Smuzhiyun 		*digest_md   = EVP_sha1();
106*4882a593Smuzhiyun 		break;
107*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA224:
108*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_OAEP_PADDING;
109*4882a593Smuzhiyun 		*digest_md   = EVP_sha224();
110*4882a593Smuzhiyun 		break;
111*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA256:
112*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_OAEP_PADDING;
113*4882a593Smuzhiyun 		*digest_md   = EVP_sha256();
114*4882a593Smuzhiyun 		break;
115*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA384:
116*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_OAEP_PADDING;
117*4882a593Smuzhiyun 		*digest_md   = EVP_sha384();
118*4882a593Smuzhiyun 		break;
119*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA512:
120*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_OAEP_PADDING;
121*4882a593Smuzhiyun 		*digest_md   = EVP_sha512();
122*4882a593Smuzhiyun 		break;
123*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_PKCS1_V1_5:
124*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
125*4882a593Smuzhiyun 		*digest_md   = NULL;
126*4882a593Smuzhiyun 		break;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	/* sign padding */
129*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA1:
130*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
131*4882a593Smuzhiyun 		*digest_md   = EVP_sha1();
132*4882a593Smuzhiyun 		break;
133*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA224:
134*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
135*4882a593Smuzhiyun 		*digest_md   = EVP_sha224();
136*4882a593Smuzhiyun 		break;
137*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA256:
138*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
139*4882a593Smuzhiyun 		*digest_md   = EVP_sha256();
140*4882a593Smuzhiyun 		break;
141*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA384:
142*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
143*4882a593Smuzhiyun 		*digest_md   = EVP_sha384();
144*4882a593Smuzhiyun 		break;
145*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA512:
146*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PADDING;
147*4882a593Smuzhiyun 		*digest_md   = EVP_sha512();
148*4882a593Smuzhiyun 		break;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA1:
151*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PSS_PADDING;
152*4882a593Smuzhiyun 		*digest_md   = EVP_sha1();
153*4882a593Smuzhiyun 		break;
154*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA224:
155*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PSS_PADDING;
156*4882a593Smuzhiyun 		*digest_md   = EVP_sha224();
157*4882a593Smuzhiyun 		break;
158*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA256:
159*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PSS_PADDING;
160*4882a593Smuzhiyun 		*digest_md   = EVP_sha256();
161*4882a593Smuzhiyun 		break;
162*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA384:
163*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PSS_PADDING;
164*4882a593Smuzhiyun 		*digest_md   = EVP_sha384();
165*4882a593Smuzhiyun 		break;
166*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA512:
167*4882a593Smuzhiyun 		*ssl_padding = RSA_PKCS1_PSS_PADDING;
168*4882a593Smuzhiyun 		*digest_md   = EVP_sha512();
169*4882a593Smuzhiyun 		break;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	default:
172*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PARAMETER;
173*4882a593Smuzhiyun 	}
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	return RK_CRYPTO_SUCCESS;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
openssl_dump_last_error(void)178*4882a593Smuzhiyun static void openssl_dump_last_error(void)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	ERR_load_ERR_strings();
181*4882a593Smuzhiyun 	ERR_load_crypto_strings();
182*4882a593Smuzhiyun 	unsigned long ulErr = ERR_get_error();
183*4882a593Smuzhiyun 	char szErrMsg[512] = {0};
184*4882a593Smuzhiyun 	char *pTmp = NULL;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	pTmp = ERR_error_string(ulErr, szErrMsg);
187*4882a593Smuzhiyun 	printf("%s\n", pTmp);
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun 
openssl_alloc_evpkey(rk_rsa_priv_key_pack * priv)190*4882a593Smuzhiyun static EVP_PKEY *openssl_alloc_evpkey(rk_rsa_priv_key_pack *priv)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun 	BIGNUM *be = NULL;
193*4882a593Smuzhiyun 	BIGNUM *bn = NULL;
194*4882a593Smuzhiyun 	BIGNUM *bd = NULL;
195*4882a593Smuzhiyun 	RSA *rsa_key = NULL;
196*4882a593Smuzhiyun 	EVP_PKEY *evp_key = NULL;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun 	be = BN_new();
199*4882a593Smuzhiyun 	if (!be)
200*4882a593Smuzhiyun 		goto error;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	bd = BN_new();
203*4882a593Smuzhiyun 	if (!bd)
204*4882a593Smuzhiyun 		goto error;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	bn = BN_new();
207*4882a593Smuzhiyun 	if (!bn)
208*4882a593Smuzhiyun 		goto error;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	rsa_key = RSA_new();
211*4882a593Smuzhiyun 	if (!rsa_key)
212*4882a593Smuzhiyun 		goto error;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	BN_bin2bn(priv->key.n, priv->key.n_len, bn);
215*4882a593Smuzhiyun 	BN_bin2bn(priv->key.e, priv->key.e_len, be);
216*4882a593Smuzhiyun 	BN_bin2bn(priv->key.d, priv->key.d_len, bd);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	rsa_key->e = be;
219*4882a593Smuzhiyun 	rsa_key->d = bd;
220*4882a593Smuzhiyun 	rsa_key->n = bn;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	evp_key = EVP_PKEY_new();
223*4882a593Smuzhiyun 	if (!evp_key) {
224*4882a593Smuzhiyun 		printf("EVP_PKEY_new failed!\n");
225*4882a593Smuzhiyun 		goto error;
226*4882a593Smuzhiyun 	}
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	if (EVP_PKEY_set1_RSA(evp_key, rsa_key) != 1) {
229*4882a593Smuzhiyun 		printf("EVP_PKEY_set1_RSA err\n");
230*4882a593Smuzhiyun 		goto error;
231*4882a593Smuzhiyun 	}
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	return evp_key;
234*4882a593Smuzhiyun error:
235*4882a593Smuzhiyun 	if (be)
236*4882a593Smuzhiyun 		BN_free(be);
237*4882a593Smuzhiyun 	if (bn)
238*4882a593Smuzhiyun 		BN_free(bn);
239*4882a593Smuzhiyun 	if (bd)
240*4882a593Smuzhiyun 		BN_free(bd);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	rsa_key->e = NULL;
243*4882a593Smuzhiyun 	rsa_key->d = NULL;
244*4882a593Smuzhiyun 	rsa_key->n = NULL;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	if (evp_key)
247*4882a593Smuzhiyun 		EVP_PKEY_free(evp_key);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	return NULL;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
openssl_free_evpkey(EVP_PKEY * evp_key)252*4882a593Smuzhiyun static void openssl_free_evpkey(EVP_PKEY *evp_key)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun 	if (evp_key)
255*4882a593Smuzhiyun 		EVP_PKEY_free(evp_key);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
openssl_encrypt(const uint8_t * in,uint32_t in_len,uint8_t * out,uint32_t * out_len,int padding,const EVP_MD * digest_algorithm,rk_rsa_priv_key_pack * priv)258*4882a593Smuzhiyun static RK_RES openssl_encrypt(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len,
259*4882a593Smuzhiyun 			      int padding, const EVP_MD *digest_algorithm,
260*4882a593Smuzhiyun 			      rk_rsa_priv_key_pack *priv)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
263*4882a593Smuzhiyun 	size_t tmp_len;
264*4882a593Smuzhiyun 	EVP_PKEY *evp_key = NULL;
265*4882a593Smuzhiyun 	EVP_PKEY_CTX *pkey_ctx = NULL;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	evp_key = openssl_alloc_evpkey(priv);
268*4882a593Smuzhiyun 	if (!evp_key)
269*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_OUT_OF_MEMORY;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	pkey_ctx = EVP_PKEY_CTX_new(evp_key, NULL /* engine */);
272*4882a593Smuzhiyun 	if (!pkey_ctx) {
273*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_new err\n");
274*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_GENERIC;
275*4882a593Smuzhiyun 	}
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	if (EVP_PKEY_encrypt_init(pkey_ctx) <= 0) {
278*4882a593Smuzhiyun 		printf("EVP_PKEY_encrypt_init err\n");
279*4882a593Smuzhiyun 		goto exit;
280*4882a593Smuzhiyun 	}
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, padding) <= 0) {
283*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_set_rsa_padding err\n");
284*4882a593Smuzhiyun 		goto exit;
285*4882a593Smuzhiyun 	}
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	if (padding == RSA_PKCS1_OAEP_PADDING) {
288*4882a593Smuzhiyun 		if (!EVP_PKEY_CTX_set_rsa_oaep_md(pkey_ctx, digest_algorithm)) {
289*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_oaep_md err\n");
290*4882a593Smuzhiyun 			goto exit;
291*4882a593Smuzhiyun 		}
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 		if (!EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, digest_algorithm)) {
294*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_mgf1_md err\n");
295*4882a593Smuzhiyun 			goto exit;
296*4882a593Smuzhiyun 		}
297*4882a593Smuzhiyun 	}
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	if (EVP_PKEY_encrypt(pkey_ctx, NULL /* out */, &tmp_len, in, in_len) <= 0) {
300*4882a593Smuzhiyun 		printf("EVP_PKEY_encrypt err\n");
301*4882a593Smuzhiyun 		goto exit;
302*4882a593Smuzhiyun 	}
303*4882a593Smuzhiyun 	if (EVP_PKEY_encrypt(pkey_ctx, out, &tmp_len, in, in_len) <= 0) {
304*4882a593Smuzhiyun 		printf("EVP_PKEY_encrypt err\n");
305*4882a593Smuzhiyun 		goto exit;
306*4882a593Smuzhiyun 	}
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	*out_len = (uint32_t)tmp_len;
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
311*4882a593Smuzhiyun exit:
312*4882a593Smuzhiyun 	if (res)
313*4882a593Smuzhiyun 		openssl_dump_last_error();
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	EVP_PKEY_CTX_free(pkey_ctx);
316*4882a593Smuzhiyun 	openssl_free_evpkey(evp_key);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	return res;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun 
openssl_decrypt(const uint8_t * in,uint32_t in_len,uint8_t * out,uint32_t * out_len,int padding,const EVP_MD * digest_algorithm,rk_rsa_priv_key_pack * priv)321*4882a593Smuzhiyun static RK_RES openssl_decrypt(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len,
322*4882a593Smuzhiyun 			      int padding, const EVP_MD *digest_algorithm,
323*4882a593Smuzhiyun 			      rk_rsa_priv_key_pack *priv)
324*4882a593Smuzhiyun {
325*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
326*4882a593Smuzhiyun 	size_t tmp_len;
327*4882a593Smuzhiyun 	EVP_PKEY *evp_key = NULL;
328*4882a593Smuzhiyun 	EVP_PKEY_CTX *pkey_ctx = NULL;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	evp_key = openssl_alloc_evpkey(priv);
331*4882a593Smuzhiyun 	if (!evp_key) {
332*4882a593Smuzhiyun 		printf("openssl_alloc_evpkey err\n");
333*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_OUT_OF_MEMORY;
334*4882a593Smuzhiyun 	}
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	pkey_ctx = EVP_PKEY_CTX_new(evp_key, NULL /* engine */);
337*4882a593Smuzhiyun 	if (!pkey_ctx) {
338*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_new err\n");
339*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_GENERIC;
340*4882a593Smuzhiyun 	}
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	if (EVP_PKEY_decrypt_init(pkey_ctx) <= 0) {
343*4882a593Smuzhiyun 		printf("EVP_PKEY_encrypt_init err\n");
344*4882a593Smuzhiyun 		goto exit;
345*4882a593Smuzhiyun 	}
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, padding) <= 0) {
348*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_set_rsa_padding err\n");
349*4882a593Smuzhiyun 		goto exit;
350*4882a593Smuzhiyun 	}
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	if (padding == RSA_PKCS1_OAEP_PADDING) {
353*4882a593Smuzhiyun 		if (!EVP_PKEY_CTX_set_rsa_oaep_md(pkey_ctx, digest_algorithm)) {
354*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_oaep_md err\n");
355*4882a593Smuzhiyun 			goto exit;
356*4882a593Smuzhiyun 		}
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 		if (!EVP_PKEY_CTX_set_rsa_mgf1_md(pkey_ctx, digest_algorithm)) {
359*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_mgf1_md err\n");
360*4882a593Smuzhiyun 			goto exit;
361*4882a593Smuzhiyun 		}
362*4882a593Smuzhiyun 	}
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	if (EVP_PKEY_decrypt(pkey_ctx, NULL /* out */, &tmp_len, in, in_len) <= 0) {
365*4882a593Smuzhiyun 		printf("EVP_PKEY_decrypt err\n");
366*4882a593Smuzhiyun 		goto exit;
367*4882a593Smuzhiyun 	}
368*4882a593Smuzhiyun 	if (EVP_PKEY_decrypt(pkey_ctx, out, &tmp_len, in, in_len) <= 0) {
369*4882a593Smuzhiyun 		printf("EVP_PKEY_decrypt err\n");
370*4882a593Smuzhiyun 		goto exit;
371*4882a593Smuzhiyun 	}
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	*out_len = (uint32_t)tmp_len;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
376*4882a593Smuzhiyun exit:
377*4882a593Smuzhiyun 	if (res)
378*4882a593Smuzhiyun 		openssl_dump_last_error();
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 	EVP_PKEY_CTX_free(pkey_ctx);
381*4882a593Smuzhiyun 	openssl_free_evpkey(evp_key);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	return res;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun 
openssl_sign(const uint8_t * in,uint32_t in_len,uint8_t * out,uint32_t * out_len,int padding,const EVP_MD * digest_algorithm,rk_rsa_priv_key_pack * priv)386*4882a593Smuzhiyun static RK_RES openssl_sign(const uint8_t *in, uint32_t in_len, uint8_t *out, uint32_t *out_len,
387*4882a593Smuzhiyun 			   int padding, const EVP_MD *digest_algorithm, rk_rsa_priv_key_pack *priv)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
390*4882a593Smuzhiyun 	size_t tmp_len = *out_len;
391*4882a593Smuzhiyun 	EVP_PKEY_CTX *pkey_ctx;
392*4882a593Smuzhiyun 	EVP_PKEY *evp_key = NULL;
393*4882a593Smuzhiyun 	EVP_MD_CTX *digest_ctx = NULL;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	digest_ctx = EVP_MD_CTX_new();
396*4882a593Smuzhiyun 	if (!digest_ctx) {
397*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
398*4882a593Smuzhiyun 		goto exit;
399*4882a593Smuzhiyun 	}
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	evp_key = openssl_alloc_evpkey(priv);
402*4882a593Smuzhiyun 	if (!evp_key) {
403*4882a593Smuzhiyun 		printf("openssl_alloc_evpkey err\n");
404*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
405*4882a593Smuzhiyun 		goto exit;
406*4882a593Smuzhiyun 	}
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	if (EVP_DigestSignInit(digest_ctx, &pkey_ctx, digest_algorithm,
409*4882a593Smuzhiyun 			       NULL /* engine */, evp_key) != 1) {
410*4882a593Smuzhiyun 		printf("EVP_DigestSignInit err\n");
411*4882a593Smuzhiyun 		goto exit;
412*4882a593Smuzhiyun 	}
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, padding) <= 0) {
415*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_set_rsa_padding err\n");
416*4882a593Smuzhiyun 		goto exit;
417*4882a593Smuzhiyun 	}
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 	if (padding == RSA_PKCS1_PSS_PADDING) {
420*4882a593Smuzhiyun 		uint32_t saltlen = EVP_MD_size(digest_algorithm);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 		if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, saltlen) <= 0) {
423*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_pss_saltlen err\n");
424*4882a593Smuzhiyun 			goto exit;
425*4882a593Smuzhiyun 		}
426*4882a593Smuzhiyun 	}
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	if (EVP_DigestSignUpdate(digest_ctx, in, in_len) != 1) {
429*4882a593Smuzhiyun 		printf("EVP_DigestSignUpdate err\n");
430*4882a593Smuzhiyun 		goto exit;
431*4882a593Smuzhiyun 	}
432*4882a593Smuzhiyun 	if (EVP_DigestSignFinal(digest_ctx, NULL, &tmp_len) != 1) {
433*4882a593Smuzhiyun 		printf("EVP_DigestSignFinal err\n");
434*4882a593Smuzhiyun 		goto exit;
435*4882a593Smuzhiyun 	}
436*4882a593Smuzhiyun 	if (EVP_DigestSignFinal(digest_ctx, out, &tmp_len) <= 0) {
437*4882a593Smuzhiyun 		printf("EVP_DigestSignFinal err\n");
438*4882a593Smuzhiyun 		goto exit;
439*4882a593Smuzhiyun 	}
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	*out_len = (uint32_t)tmp_len;
442*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
443*4882a593Smuzhiyun exit:
444*4882a593Smuzhiyun 	if (res)
445*4882a593Smuzhiyun 		openssl_dump_last_error();
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	if (digest_ctx)
448*4882a593Smuzhiyun 		EVP_MD_CTX_free(digest_ctx);
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 	openssl_free_evpkey(evp_key);
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun 	return res;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun 
openssl_verify(const uint8_t * in,uint32_t in_len,uint8_t * sign,uint32_t sign_len,int padding,const EVP_MD * digest_algorithm,rk_rsa_priv_key_pack * priv)456*4882a593Smuzhiyun static RK_RES openssl_verify(const uint8_t *in, uint32_t in_len, uint8_t *sign, uint32_t sign_len,
457*4882a593Smuzhiyun 			     int padding, const EVP_MD *digest_algorithm, rk_rsa_priv_key_pack *priv)
458*4882a593Smuzhiyun {
459*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
460*4882a593Smuzhiyun 	EVP_PKEY_CTX *pkey_ctx;
461*4882a593Smuzhiyun 	EVP_PKEY *evp_key = NULL;
462*4882a593Smuzhiyun 	EVP_MD_CTX *digest_ctx = NULL;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	digest_ctx = EVP_MD_CTX_new();
465*4882a593Smuzhiyun 	if (!digest_ctx) {
466*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
467*4882a593Smuzhiyun 		goto exit;
468*4882a593Smuzhiyun 	}
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	evp_key = openssl_alloc_evpkey(priv);
471*4882a593Smuzhiyun 	if (!evp_key) {
472*4882a593Smuzhiyun 		printf("openssl_alloc_evpkey err\n");
473*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
474*4882a593Smuzhiyun 		goto exit;
475*4882a593Smuzhiyun 	}
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	if (EVP_DigestVerifyInit(digest_ctx, &pkey_ctx, digest_algorithm,
478*4882a593Smuzhiyun 			       NULL /* engine */, evp_key) != 1) {
479*4882a593Smuzhiyun 		printf("EVP_DigestVerifyInit err\n");
480*4882a593Smuzhiyun 		goto exit;
481*4882a593Smuzhiyun 	}
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	if (EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, padding) <= 0) {
484*4882a593Smuzhiyun 		printf("EVP_PKEY_CTX_set_rsa_padding err\n");
485*4882a593Smuzhiyun 		goto exit;
486*4882a593Smuzhiyun 	}
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	if (padding == RSA_PKCS1_PSS_PADDING) {
489*4882a593Smuzhiyun 		uint32_t saltlen = EVP_MD_size(digest_algorithm);
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 		if (EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, saltlen) <= 0) {
492*4882a593Smuzhiyun 			printf("EVP_PKEY_CTX_set_rsa_pss_saltlen err\n");
493*4882a593Smuzhiyun 			goto exit;
494*4882a593Smuzhiyun 		}
495*4882a593Smuzhiyun 	}
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	if (EVP_DigestVerifyUpdate(digest_ctx, in, in_len) != 1) {
498*4882a593Smuzhiyun 		printf("EVP_DigestVerifyUpdate err\n");
499*4882a593Smuzhiyun 		goto exit;
500*4882a593Smuzhiyun 	}
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	if (!EVP_DigestVerifyFinal(digest_ctx, sign, sign_len)) {
503*4882a593Smuzhiyun 		printf("EVP_DigestVerifyFinal err\n");
504*4882a593Smuzhiyun 		goto exit;
505*4882a593Smuzhiyun 	}
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
508*4882a593Smuzhiyun exit:
509*4882a593Smuzhiyun 	if (res)
510*4882a593Smuzhiyun 		openssl_dump_last_error();
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	if (digest_ctx)
513*4882a593Smuzhiyun 		EVP_MD_CTX_free(digest_ctx);
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	openssl_free_evpkey(evp_key);
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	return res;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun #endif
521*4882a593Smuzhiyun 
get_hash_algo_from_padding(uint32_t padding,uint32_t * hlen,uint32_t * hash_algo)522*4882a593Smuzhiyun static RK_RES get_hash_algo_from_padding(uint32_t padding, uint32_t *hlen, uint32_t *hash_algo)
523*4882a593Smuzhiyun {
524*4882a593Smuzhiyun 	uint32_t shaalgo = RK_ALGO_SHA1;
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun 	switch (padding) {
527*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA1:
528*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA1:
529*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA1:
530*4882a593Smuzhiyun 		*hlen = SHA1_HASH_SIZE;
531*4882a593Smuzhiyun 		shaalgo = RK_ALGO_SHA1;
532*4882a593Smuzhiyun 		break;
533*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA224:
534*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA224:
535*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA224:
536*4882a593Smuzhiyun 		*hlen = SHA224_HASH_SIZE;
537*4882a593Smuzhiyun 		shaalgo = RK_ALGO_SHA224;
538*4882a593Smuzhiyun 		break;
539*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA256:
540*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA256:
541*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA256:
542*4882a593Smuzhiyun 		*hlen = SHA256_HASH_SIZE;
543*4882a593Smuzhiyun 		shaalgo = RK_ALGO_SHA256;
544*4882a593Smuzhiyun 		break;
545*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA384:
546*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA384:
547*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA384:
548*4882a593Smuzhiyun 		*hlen = SHA384_HASH_SIZE;
549*4882a593Smuzhiyun 		shaalgo = RK_ALGO_SHA384;
550*4882a593Smuzhiyun 		break;
551*4882a593Smuzhiyun 	case RK_RSA_CRYPT_PADDING_OAEP_SHA512:
552*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_V15_SHA512:
553*4882a593Smuzhiyun 	case RK_RSA_SIGN_PADDING_PKCS1_PSS_SHA512:
554*4882a593Smuzhiyun 		*hlen = SHA512_HASH_SIZE;
555*4882a593Smuzhiyun 		shaalgo = RK_ALGO_SHA512;
556*4882a593Smuzhiyun 		break;
557*4882a593Smuzhiyun 	default:
558*4882a593Smuzhiyun 		D_TRACE("unknown padding %x", padding);
559*4882a593Smuzhiyun 		*hlen = 0;
560*4882a593Smuzhiyun 		shaalgo = 0;
561*4882a593Smuzhiyun 		return RK_CRYPTO_ERR_PADDING;
562*4882a593Smuzhiyun 	}
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	*hash_algo = shaalgo;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	return RK_CRYPTO_SUCCESS;
567*4882a593Smuzhiyun }
568*4882a593Smuzhiyun 
calc_padding_digest(uint32_t padding,const uint8_t * data,uint32_t data_len,uint8_t * digest)569*4882a593Smuzhiyun static RK_RES calc_padding_digest(uint32_t padding, const uint8_t *data, uint32_t data_len,
570*4882a593Smuzhiyun 				  uint8_t *digest)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	RK_RES res;
573*4882a593Smuzhiyun 	uint32_t hash_algo, hash_len;
574*4882a593Smuzhiyun 	rk_hash_config hash_cfg;
575*4882a593Smuzhiyun 	rk_handle hash_hdl = 0;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun 	res = get_hash_algo_from_padding(padding, &hash_len, &hash_algo);
578*4882a593Smuzhiyun 	if (res)
579*4882a593Smuzhiyun 		goto exit;
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun 	memset(&hash_cfg, 0x00, sizeof(hash_cfg));
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	hash_cfg.algo = hash_algo;
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	res = rk_hash_init(&hash_cfg, &hash_hdl);
586*4882a593Smuzhiyun 	if (res)
587*4882a593Smuzhiyun 		goto exit;
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun 	if (data && data_len != 0) {
590*4882a593Smuzhiyun 		res = rk_hash_update_virt(hash_hdl, data, data_len);
591*4882a593Smuzhiyun 		if (res) {
592*4882a593Smuzhiyun 			rk_hash_final(hash_hdl, NULL);
593*4882a593Smuzhiyun 			goto exit;
594*4882a593Smuzhiyun 		}
595*4882a593Smuzhiyun 	}
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	res = rk_hash_final(hash_hdl, digest);
598*4882a593Smuzhiyun exit:
599*4882a593Smuzhiyun 	if (res)
600*4882a593Smuzhiyun 		D_TRACE("digest error.");
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	return res;
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun 
test_rsa_pub_enc(uint32_t padding,const char * padding_name,uint32_t nbits,uint32_t data_len,int verbose)605*4882a593Smuzhiyun static RK_RES test_rsa_pub_enc(uint32_t padding, const char *padding_name,
606*4882a593Smuzhiyun 			       uint32_t nbits, uint32_t data_len, int verbose)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_SUCCESS;
609*4882a593Smuzhiyun 	uint8_t  *data = NULL;
610*4882a593Smuzhiyun 	uint8_t  *enc_buf = NULL;
611*4882a593Smuzhiyun 	uint8_t  *dec_buf = NULL;
612*4882a593Smuzhiyun 	uint32_t out_len, nbytes = nbits / 8;
613*4882a593Smuzhiyun 	rk_rsa_pub_key_pack pub_key;
614*4882a593Smuzhiyun 	rk_rsa_priv_key_pack priv_key;
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun 	data = (uint8_t *)malloc(data_len);
617*4882a593Smuzhiyun 	if (!data) {
618*4882a593Smuzhiyun 		printf("malloc for data failed\n");
619*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
620*4882a593Smuzhiyun 		goto exit;
621*4882a593Smuzhiyun 	}
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	memset(data, 0xab, data_len);
624*4882a593Smuzhiyun 	/* make sure data < n */
625*4882a593Smuzhiyun 	data[0] = 0x11;
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun 	enc_buf = (uint8_t *)malloc(nbytes);
628*4882a593Smuzhiyun 	if (!enc_buf) {
629*4882a593Smuzhiyun 		printf("malloc for enc_buf failed\n");
630*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
631*4882a593Smuzhiyun 		goto exit;
632*4882a593Smuzhiyun 	}
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	dec_buf = (uint8_t *)malloc(nbytes);
635*4882a593Smuzhiyun 	if (!dec_buf) {
636*4882a593Smuzhiyun 		printf("malloc for dec_buf failed\n");
637*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
638*4882a593Smuzhiyun 		goto exit;
639*4882a593Smuzhiyun 	}
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 	test_init_pubkey(&pub_key, nbits);
642*4882a593Smuzhiyun 	test_init_privkey(&priv_key, nbits);
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	res = rk_rsa_pub_encrypt(&pub_key, padding, data, data_len, enc_buf, &out_len);
645*4882a593Smuzhiyun 	if (res) {
646*4882a593Smuzhiyun 		if (res != RK_CRYPTO_ERR_NOT_SUPPORTED &&
647*4882a593Smuzhiyun 		    res != RK_CRYPTO_ERR_PADDING_OVERFLOW)
648*4882a593Smuzhiyun 			printf("rk_rsa_pub_encrypt failed %x\n", res);
649*4882a593Smuzhiyun 		goto exit;
650*4882a593Smuzhiyun 	}
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun #ifdef RSA_OPENSSL_COMPRAE
653*4882a593Smuzhiyun 	int ssl_padding;
654*4882a593Smuzhiyun 	const EVP_MD *digest_md;
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	if (rk2ssl_padding(padding, &ssl_padding, &digest_md) == RK_CRYPTO_SUCCESS) {
657*4882a593Smuzhiyun 		res = openssl_decrypt(enc_buf, out_len, dec_buf, &out_len,
658*4882a593Smuzhiyun 				      ssl_padding, digest_md, &priv_key);
659*4882a593Smuzhiyun 		if (res) {
660*4882a593Smuzhiyun 			printf("openssl_decrypt error!\n");
661*4882a593Smuzhiyun 			goto exit;
662*4882a593Smuzhiyun 		}
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 		if (out_len != data_len || memcmp(data, dec_buf, data_len)) {
665*4882a593Smuzhiyun 			printf("rk_rsa_pub_encrypt not match openssl_decrypt\n");
666*4882a593Smuzhiyun 			test_dump_hex("result", dec_buf, out_len);
667*4882a593Smuzhiyun 			test_dump_hex("expect", data, data_len);
668*4882a593Smuzhiyun 			res = RK_CRYPTO_ERR_GENERIC;
669*4882a593Smuzhiyun 			goto exit;
670*4882a593Smuzhiyun 		}
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 		res = openssl_encrypt(data, data_len, enc_buf, &out_len,
673*4882a593Smuzhiyun 				      ssl_padding, digest_md, &priv_key);
674*4882a593Smuzhiyun 		if (res) {
675*4882a593Smuzhiyun 			printf("openssl_encrypt error!\n");
676*4882a593Smuzhiyun 			goto exit;
677*4882a593Smuzhiyun 		}
678*4882a593Smuzhiyun 	}
679*4882a593Smuzhiyun #endif
680*4882a593Smuzhiyun 	res = rk_rsa_priv_decrypt(&priv_key, padding, enc_buf, out_len, dec_buf, &out_len);
681*4882a593Smuzhiyun 	if (res) {
682*4882a593Smuzhiyun 		printf("rk_rsa_priv_decrypt failed %x\n", res);
683*4882a593Smuzhiyun 		goto exit;
684*4882a593Smuzhiyun 	}
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	if (data_len != out_len || memcmp(dec_buf, data, data_len)) {
687*4882a593Smuzhiyun 		printf("rk_rsa_priv_decrypt compare failed\n");
688*4882a593Smuzhiyun 		test_dump_hex("result", enc_buf, out_len);
689*4882a593Smuzhiyun 		test_dump_hex("expect", data, data_len);
690*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_GENERIC;
691*4882a593Smuzhiyun 		goto exit;
692*4882a593Smuzhiyun 	}
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun exit:
695*4882a593Smuzhiyun 	if (data)
696*4882a593Smuzhiyun 		free(data);
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	if (enc_buf)
699*4882a593Smuzhiyun 		free(enc_buf);
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 	if (dec_buf)
702*4882a593Smuzhiyun 		free(dec_buf);
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun 	if (res == RK_CRYPTO_ERR_NOT_SUPPORTED ||
705*4882a593Smuzhiyun 	    res == RK_CRYPTO_ERR_PADDING_OVERFLOW) {
706*4882a593Smuzhiyun 		TEST_END_NA(nbits, padding_name);
707*4882a593Smuzhiyun 		res = RK_CRYPTO_SUCCESS;
708*4882a593Smuzhiyun 	} else if (res) {
709*4882a593Smuzhiyun 		TEST_END_FAIL(nbits, padding_name);
710*4882a593Smuzhiyun 	} else {
711*4882a593Smuzhiyun 		TEST_END_PASS(nbits, padding_name);
712*4882a593Smuzhiyun 	}
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 	return res;
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun 
test_rsa_priv_enc(uint32_t padding,const char * padding_name,uint32_t nbits,uint32_t data_len,int verbose)717*4882a593Smuzhiyun static RK_RES test_rsa_priv_enc(uint32_t padding, const char *padding_name,
718*4882a593Smuzhiyun 				uint32_t nbits, uint32_t data_len, int verbose)
719*4882a593Smuzhiyun {
720*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_SUCCESS;
721*4882a593Smuzhiyun 	uint8_t  *data = NULL;
722*4882a593Smuzhiyun 	uint8_t  *enc_buf = NULL;
723*4882a593Smuzhiyun 	uint8_t  *dec_buf = NULL;
724*4882a593Smuzhiyun 	uint32_t out_len, nbytes = nbits / 8;
725*4882a593Smuzhiyun 	rk_rsa_pub_key_pack pub_key;
726*4882a593Smuzhiyun 	rk_rsa_priv_key_pack priv_key;
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	data = (uint8_t *)malloc(data_len);
729*4882a593Smuzhiyun 	if (!data) {
730*4882a593Smuzhiyun 		printf("malloc for data failed\n");
731*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
732*4882a593Smuzhiyun 		goto exit;
733*4882a593Smuzhiyun 	}
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	memset(data, 0xab, data_len);
736*4882a593Smuzhiyun 	/* make sure data < n */
737*4882a593Smuzhiyun 	data[0] = 0x11;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	enc_buf = (uint8_t *)malloc(nbytes);
740*4882a593Smuzhiyun 	if (!enc_buf) {
741*4882a593Smuzhiyun 		printf("malloc for enc_buf failed\n");
742*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
743*4882a593Smuzhiyun 		goto exit;
744*4882a593Smuzhiyun 	}
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	dec_buf = (uint8_t *)malloc(nbytes);
747*4882a593Smuzhiyun 	if (!dec_buf) {
748*4882a593Smuzhiyun 		printf("malloc for dec_buf failed\n");
749*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
750*4882a593Smuzhiyun 		goto exit;
751*4882a593Smuzhiyun 	}
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	test_init_pubkey(&pub_key, nbits);
754*4882a593Smuzhiyun 	test_init_privkey(&priv_key, nbits);
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 	res = rk_rsa_priv_encrypt(&priv_key, padding, data, data_len, enc_buf, &out_len);
757*4882a593Smuzhiyun 	if (res) {
758*4882a593Smuzhiyun 		if (res != RK_CRYPTO_ERR_NOT_SUPPORTED &&
759*4882a593Smuzhiyun 		    res != RK_CRYPTO_ERR_PADDING_OVERFLOW)
760*4882a593Smuzhiyun 			printf("rk_rsa_priv_encrypt failed %x\n", res);
761*4882a593Smuzhiyun 		goto exit;
762*4882a593Smuzhiyun 	}
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun 	res = rk_rsa_pub_decrypt(&pub_key, padding, enc_buf, out_len, dec_buf, &out_len);
765*4882a593Smuzhiyun 	if (res) {
766*4882a593Smuzhiyun 		printf("rk_rsa_pub_decrypt failed %x\n", res);
767*4882a593Smuzhiyun 		goto exit;
768*4882a593Smuzhiyun 	}
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	if (data_len != out_len || memcmp(dec_buf, data, data_len)) {
771*4882a593Smuzhiyun 		printf("rk_rsa_pub_decrypt compare failed\n");
772*4882a593Smuzhiyun 		test_dump_hex("result", enc_buf, out_len);
773*4882a593Smuzhiyun 		test_dump_hex("expect", data, data_len);
774*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_GENERIC;
775*4882a593Smuzhiyun 		goto exit;
776*4882a593Smuzhiyun 	}
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun exit:
779*4882a593Smuzhiyun 	if (data)
780*4882a593Smuzhiyun 		free(data);
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 	if (enc_buf)
783*4882a593Smuzhiyun 		free(enc_buf);
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun 	if (dec_buf)
786*4882a593Smuzhiyun 		free(dec_buf);
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	if (res == RK_CRYPTO_ERR_NOT_SUPPORTED ||
789*4882a593Smuzhiyun 	    res == RK_CRYPTO_ERR_PADDING_OVERFLOW) {
790*4882a593Smuzhiyun 		TEST_END_NA(nbits, padding_name);
791*4882a593Smuzhiyun 		res = RK_CRYPTO_SUCCESS;
792*4882a593Smuzhiyun 	} else if (res) {
793*4882a593Smuzhiyun 		TEST_END_FAIL(nbits, padding_name);
794*4882a593Smuzhiyun 	} else {
795*4882a593Smuzhiyun 		TEST_END_PASS(nbits, padding_name);
796*4882a593Smuzhiyun 	}
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	return res;
799*4882a593Smuzhiyun }
800*4882a593Smuzhiyun 
test_rsa_sign_common(uint32_t padding,const char * padding_name,uint32_t nbits,const uint8_t * in,uint32_t in_len,const uint8_t * hash,int verbose)801*4882a593Smuzhiyun static RK_RES test_rsa_sign_common(uint32_t padding, const char *padding_name,
802*4882a593Smuzhiyun 				   uint32_t nbits, const uint8_t *in, uint32_t in_len,
803*4882a593Smuzhiyun 				   const uint8_t *hash, int verbose)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_SUCCESS;
806*4882a593Smuzhiyun 	uint8_t  *sign = NULL;
807*4882a593Smuzhiyun 	uint32_t sign_len, nbytes = nbits / 8;
808*4882a593Smuzhiyun 	const char *test_name = hash ? "test_rsa_sign_digest" : "test_rsa_sign_data";
809*4882a593Smuzhiyun 	rk_rsa_pub_key_pack pub_key;
810*4882a593Smuzhiyun 	rk_rsa_priv_key_pack priv_key;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	sign = (uint8_t *)malloc(nbytes);
813*4882a593Smuzhiyun 	if (!sign) {
814*4882a593Smuzhiyun 		printf("malloc for sign failed\n");
815*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
816*4882a593Smuzhiyun 		goto exit;
817*4882a593Smuzhiyun 	}
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	test_init_pubkey(&pub_key, nbits);
820*4882a593Smuzhiyun 	test_init_privkey(&priv_key, nbits);
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun 	res = rk_rsa_sign(&priv_key, padding, in, in_len, hash, sign, &sign_len);
823*4882a593Smuzhiyun 	if (res) {
824*4882a593Smuzhiyun 		if (res != RK_CRYPTO_ERR_NOT_SUPPORTED &&
825*4882a593Smuzhiyun 		    res != RK_CRYPTO_ERR_PADDING_OVERFLOW)
826*4882a593Smuzhiyun 			printf("rk_rsa_sign failed %x\n", res);
827*4882a593Smuzhiyun 		else {
828*4882a593Smuzhiyun 			res = RK_CRYPTO_SUCCESS;
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun 			if (verbose) {
831*4882a593Smuzhiyun 				printf("******** %-20s %u\t%-16s test N/A  !!! ********\n",
832*4882a593Smuzhiyun 				       "test_rsa_sign_data", nbits, padding_name);
833*4882a593Smuzhiyun 				printf("******** %-20s %u\t%-16s test N/A  !!! ********\n",
834*4882a593Smuzhiyun 				       "test_rsa_sign_digest", nbits, padding_name);
835*4882a593Smuzhiyun 			}
836*4882a593Smuzhiyun 		}
837*4882a593Smuzhiyun 		goto exit;
838*4882a593Smuzhiyun 	}
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun #ifdef RSA_OPENSSL_COMPRAE
841*4882a593Smuzhiyun 	int ssl_padding;
842*4882a593Smuzhiyun 	const EVP_MD *digest_md;
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun 	if (rk2ssl_padding(padding, &ssl_padding, &digest_md) == RK_CRYPTO_SUCCESS) {
845*4882a593Smuzhiyun 		res = openssl_verify(in, in_len, sign, sign_len, ssl_padding, digest_md, &priv_key);
846*4882a593Smuzhiyun 		if (res) {
847*4882a593Smuzhiyun 			printf("openssl_verify error!\n");
848*4882a593Smuzhiyun 			goto exit;
849*4882a593Smuzhiyun 		}
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun 		res = openssl_sign(in, in_len, sign, &sign_len,
852*4882a593Smuzhiyun 			ssl_padding, digest_md, &priv_key);
853*4882a593Smuzhiyun 		if (res) {
854*4882a593Smuzhiyun 			printf("openssl_sign error!\n");
855*4882a593Smuzhiyun 			goto exit;
856*4882a593Smuzhiyun 		}
857*4882a593Smuzhiyun 	}
858*4882a593Smuzhiyun #endif
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 	res = rk_rsa_verify(&pub_key, padding, in, in_len, hash, sign, sign_len);
861*4882a593Smuzhiyun 	if (res) {
862*4882a593Smuzhiyun 		printf("rk_rsa_verify failed %x\n", res);
863*4882a593Smuzhiyun 		goto exit;
864*4882a593Smuzhiyun 	}
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	/* modify sign data to make it wrong */
867*4882a593Smuzhiyun 	*sign += 1;
868*4882a593Smuzhiyun 	res = rk_rsa_verify(&pub_key, padding, in, in_len, hash, sign, sign_len);
869*4882a593Smuzhiyun 	if (res != RK_CRYPTO_ERR_VERIFY) {
870*4882a593Smuzhiyun 		printf("rk_rsa_verify should be RK_CRYPTO_ERR_VERIFY but %x\n", res);
871*4882a593Smuzhiyun 		goto exit;
872*4882a593Smuzhiyun 	}
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun 	if (verbose)
877*4882a593Smuzhiyun 		printf("******** %-20s %u\t%-16s test PASS !!! ********\n",
878*4882a593Smuzhiyun 		       test_name, nbits, padding_name);
879*4882a593Smuzhiyun 
880*4882a593Smuzhiyun exit:
881*4882a593Smuzhiyun 	if (sign)
882*4882a593Smuzhiyun 		free(sign);
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun 	if (res && verbose)
885*4882a593Smuzhiyun 		printf("******** %-20s %u\t%-16s test FAIL !!! ********\n",
886*4882a593Smuzhiyun 		       test_name, nbits, padding_name);
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun 	return res;
889*4882a593Smuzhiyun }
890*4882a593Smuzhiyun 
test_rsa_sign(uint32_t padding,const char * padding_name,uint32_t nbits,uint32_t in_len,int verbose)891*4882a593Smuzhiyun static RK_RES test_rsa_sign(uint32_t padding, const char *padding_name,
892*4882a593Smuzhiyun 			    uint32_t nbits, uint32_t in_len, int verbose)
893*4882a593Smuzhiyun {
894*4882a593Smuzhiyun 	RK_RES res;
895*4882a593Smuzhiyun 	uint8_t  *data = NULL;
896*4882a593Smuzhiyun 	uint8_t digest[SHA512_HASH_SIZE];
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun 	data = (uint8_t *)malloc(in_len);
899*4882a593Smuzhiyun 	if (!data) {
900*4882a593Smuzhiyun 		printf("malloc for data failed\n");
901*4882a593Smuzhiyun 		res = RK_CRYPTO_ERR_OUT_OF_MEMORY;
902*4882a593Smuzhiyun 		goto exit;
903*4882a593Smuzhiyun 	}
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun 	memset(data, 0xab, in_len);
906*4882a593Smuzhiyun 	memset(digest, 0x00, sizeof(digest));
907*4882a593Smuzhiyun 
908*4882a593Smuzhiyun 	res = calc_padding_digest(padding, data, in_len, digest);
909*4882a593Smuzhiyun 	if (res) {
910*4882a593Smuzhiyun 		if (res == RK_CRYPTO_ERR_NOT_SUPPORTED) {
911*4882a593Smuzhiyun 			if (verbose) {
912*4882a593Smuzhiyun 				printf("******** %-20s %u\t%-16s test N/A  !!! ********\n",
913*4882a593Smuzhiyun 				       "test_rsa_sign_data", nbits, padding_name);
914*4882a593Smuzhiyun 				printf("******** %-20s %u\t%-16s test N/A  !!! ********\n",
915*4882a593Smuzhiyun 				       "test_rsa_sign_digest", nbits, padding_name);
916*4882a593Smuzhiyun 			}
917*4882a593Smuzhiyun 			res = RK_CRYPTO_SUCCESS;
918*4882a593Smuzhiyun 			goto exit;
919*4882a593Smuzhiyun 		}
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun 		printf("calc_padding_digest %x\n", res);
922*4882a593Smuzhiyun 		goto exit;
923*4882a593Smuzhiyun 	}
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun 	res = test_rsa_sign_common(padding, padding_name, nbits, data, in_len,
926*4882a593Smuzhiyun 				   NULL, verbose);
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun 	if (res) {
929*4882a593Smuzhiyun 		printf("test_rsa_sign data failed %x\n", res);
930*4882a593Smuzhiyun 		goto exit;
931*4882a593Smuzhiyun 	}
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	res = test_rsa_sign_common(padding, padding_name, nbits, data, in_len,
934*4882a593Smuzhiyun 				   digest, verbose);
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun 	if (res) {
937*4882a593Smuzhiyun 		printf("test_rsa_sign digest failed %x\n", res);
938*4882a593Smuzhiyun 		goto exit;
939*4882a593Smuzhiyun 	}
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun exit:
942*4882a593Smuzhiyun 	if (data)
943*4882a593Smuzhiyun 		free(data);
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun 	return res;
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun 
test_rsa(int verbose)948*4882a593Smuzhiyun RK_RES test_rsa(int verbose)
949*4882a593Smuzhiyun {
950*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
951*4882a593Smuzhiyun 	uint32_t i, j, data_size;
952*4882a593Smuzhiyun 	uint32_t rsa_key_nbits[] = {
953*4882a593Smuzhiyun 		RSA_BITS_1024,
954*4882a593Smuzhiyun 		RSA_BITS_2048,
955*4882a593Smuzhiyun 		RSA_BITS_3072,
956*4882a593Smuzhiyun 		RSA_BITS_4096,
957*4882a593Smuzhiyun 	};
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun 	res = rk_crypto_init();
960*4882a593Smuzhiyun 	if (res) {
961*4882a593Smuzhiyun 		printf("rk_crypto_init error %08x\n", res);
962*4882a593Smuzhiyun 		return res;
963*4882a593Smuzhiyun 	}
964*4882a593Smuzhiyun 
965*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(rsa_key_nbits); i++) {
966*4882a593Smuzhiyun 		/* verbose == 0 means alled by the stress test, only test RSA 2048 */
967*4882a593Smuzhiyun 		if (!verbose && rsa_key_nbits[i] != RSA_BITS_2048)
968*4882a593Smuzhiyun 			continue;
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun 		for (j = 0; j < ARRAY_SIZE(test_rsa_tbl); j++) {
971*4882a593Smuzhiyun 			if (!test_rsa_tbl[j].do_test) {
972*4882a593Smuzhiyun 				if (verbose)
973*4882a593Smuzhiyun 					printf("\n");
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun 				continue;
976*4882a593Smuzhiyun 			}
977*4882a593Smuzhiyun 
978*4882a593Smuzhiyun 			data_size =  test_rsa_tbl[j].data_size ? : (rsa_key_nbits[i] / 8);
979*4882a593Smuzhiyun 			res = test_rsa_tbl[j].do_test(test_rsa_tbl[j].padding,
980*4882a593Smuzhiyun 						      test_rsa_tbl[j].padding_name,
981*4882a593Smuzhiyun 						      rsa_key_nbits[i],
982*4882a593Smuzhiyun 						      data_size,
983*4882a593Smuzhiyun 						      verbose);
984*4882a593Smuzhiyun 			if (res)
985*4882a593Smuzhiyun 				goto exit;
986*4882a593Smuzhiyun 		}
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 		if (verbose)
989*4882a593Smuzhiyun 			printf("\n");
990*4882a593Smuzhiyun 	}
991*4882a593Smuzhiyun exit:
992*4882a593Smuzhiyun 	rk_crypto_deinit();
993*4882a593Smuzhiyun 	return res;
994*4882a593Smuzhiyun }
995