xref: /OK3568_Linux_fs/external/security/librkcrypto/test/test_ae.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2022 Rockchip Electronics Co. Ltd.
3*4882a593Smuzhiyun  */
4*4882a593Smuzhiyun #include <stdio.h>
5*4882a593Smuzhiyun #include <stdlib.h>
6*4882a593Smuzhiyun #include <string.h>
7*4882a593Smuzhiyun #include <unistd.h>
8*4882a593Smuzhiyun #include "rkcrypto_core.h"
9*4882a593Smuzhiyun #include "rkcrypto_mem.h"
10*4882a593Smuzhiyun #include "cmode_adapter.h"
11*4882a593Smuzhiyun #include "test_ae.h"
12*4882a593Smuzhiyun #include "test_utils.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define DATA_BUTT	0xFFFFFFFF
15*4882a593Smuzhiyun #define TEST_DATA_MAX	(1024 * 1024)
16*4882a593Smuzhiyun #define TEST_AAD_MAX	(1 * 1024)
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun struct test_ae_item {
19*4882a593Smuzhiyun 	uint32_t algo[2];
20*4882a593Smuzhiyun 	uint32_t modes[RK_CIPHER_MODE_MAX];
21*4882a593Smuzhiyun 	uint32_t key_lens[3];
22*4882a593Smuzhiyun 	uint32_t data_lens[3];
23*4882a593Smuzhiyun 	uint32_t aad_lens[3];
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun static struct test_ae_item test_item_tbl[] = {
27*4882a593Smuzhiyun 	{
28*4882a593Smuzhiyun 		.algo  = {RK_ALGO_AES, RK_ALGO_SM4},
29*4882a593Smuzhiyun 		.modes = {
30*4882a593Smuzhiyun 			RK_CIPHER_MODE_GCM,
31*4882a593Smuzhiyun 			DATA_BUTT,
32*4882a593Smuzhiyun 		},
33*4882a593Smuzhiyun 		.key_lens = {16, 24, 32},
34*4882a593Smuzhiyun 		.data_lens  = {256, 32 * 1024, TEST_DATA_MAX},
35*4882a593Smuzhiyun 		.aad_lens = {20, 256, TEST_AAD_MAX},
36*4882a593Smuzhiyun 	},
37*4882a593Smuzhiyun };
38*4882a593Smuzhiyun 
test_ae_item_virt(const struct test_ae_item * item,int verbose)39*4882a593Smuzhiyun static RK_RES test_ae_item_virt(const struct test_ae_item *item, int verbose)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
42*4882a593Smuzhiyun 	uint32_t h, i, k, l, n;
43*4882a593Smuzhiyun 	rk_handle handle = 0;
44*4882a593Smuzhiyun 	rk_ae_config ae_cfg;
45*4882a593Smuzhiyun 	uint8_t *plain = NULL, *ae_soft = NULL, *ae_hard = NULL, *aad = NULL;
46*4882a593Smuzhiyun 	uint8_t iv_tmp[32];
47*4882a593Smuzhiyun 	uint32_t algo = 0, mode = 0, key_len, iv_len, data_len, aad_len, operation;
48*4882a593Smuzhiyun 	uint32_t tag_len = 16;
49*4882a593Smuzhiyun 	uint8_t tag_hard[16], tag_soft[16];
50*4882a593Smuzhiyun 	size_t page_size = getpagesize();
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	if (posix_memalign((void *)&plain, page_size, TEST_DATA_MAX) || !plain) {
53*4882a593Smuzhiyun 		printf("plain malloc %dByte error!\n", TEST_DATA_MAX);
54*4882a593Smuzhiyun 		goto exit;
55*4882a593Smuzhiyun 	}
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	if (posix_memalign((void *)&ae_soft, page_size, TEST_DATA_MAX) || !ae_soft) {
58*4882a593Smuzhiyun 		printf("ae_soft malloc %dByte error!\n", TEST_DATA_MAX);
59*4882a593Smuzhiyun 		goto exit;
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	if (posix_memalign((void *)&ae_hard, page_size, TEST_DATA_MAX) || !ae_hard) {
63*4882a593Smuzhiyun 		printf("ae_hard malloc %dByte error!\n", TEST_DATA_MAX);
64*4882a593Smuzhiyun 		goto exit;
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	if (posix_memalign((void *)&aad, page_size, TEST_AAD_MAX) || !aad) {
68*4882a593Smuzhiyun 		printf("aad malloc %dByte error!\n", TEST_AAD_MAX);
69*4882a593Smuzhiyun 		goto exit;
70*4882a593Smuzhiyun 	}
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	iv_len  = 12;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	for (h = 0; h < ARRAY_SIZE(item->algo); h++) {
75*4882a593Smuzhiyun 		algo = item->algo[h];
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 		for (i = 0; i < ARRAY_SIZE(item->modes); i++) {
78*4882a593Smuzhiyun 			mode = item->modes[i];
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 			if (mode == DATA_BUTT)
81*4882a593Smuzhiyun 				break;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 			for (k = 0; k < ARRAY_SIZE(item->key_lens); k++) {
84*4882a593Smuzhiyun 				key_len = item->key_lens[k];
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 				if (algo == RK_ALGO_SM4 && key_len !=16)
87*4882a593Smuzhiyun 					continue;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 				for (l = 0; l < ARRAY_SIZE(item->data_lens); l++) {
90*4882a593Smuzhiyun 					data_len  = item->data_lens[l];
91*4882a593Smuzhiyun 					test_get_rng(plain, data_len);
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 					for (n = 0; n < ARRAY_SIZE(item->aad_lens); n++) {
94*4882a593Smuzhiyun 						aad_len = item->aad_lens[n];
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 						memset(ae_soft, 0x00, data_len);
97*4882a593Smuzhiyun 						memset(ae_hard, 0x00, data_len);
98*4882a593Smuzhiyun 						memset(tag_hard, 0x00, sizeof(tag_hard));
99*4882a593Smuzhiyun 						memset(tag_soft, 0x00, sizeof(tag_soft));
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 						/* encryption */
102*4882a593Smuzhiyun 						operation = RK_OP_CIPHER_ENC;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 						memset(&ae_cfg, 0x00, sizeof(ae_cfg));
105*4882a593Smuzhiyun 						ae_cfg.algo         = algo;
106*4882a593Smuzhiyun 						ae_cfg.mode         = mode;
107*4882a593Smuzhiyun 						ae_cfg.operation    = operation;
108*4882a593Smuzhiyun 						ae_cfg.key_len      = key_len;
109*4882a593Smuzhiyun 						ae_cfg.iv_len       = iv_len;
110*4882a593Smuzhiyun 						ae_cfg.aad_len      = aad_len;
111*4882a593Smuzhiyun 						ae_cfg.tag_len      = tag_len;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 						test_get_rng(ae_cfg.key, key_len);
114*4882a593Smuzhiyun 						test_get_rng(ae_cfg.iv, iv_len);
115*4882a593Smuzhiyun 						test_get_rng(aad, aad_len);
116*4882a593Smuzhiyun 						memcpy(iv_tmp, ae_cfg.iv, iv_len);
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 						res = rk_ae_init(&ae_cfg, &handle);
119*4882a593Smuzhiyun 						if (res) {
120*4882a593Smuzhiyun 							if (res != RK_CRYPTO_ERR_NOT_SUPPORTED) {
121*4882a593Smuzhiyun 								printf("rk_ae_init error[%x]\n", res);
122*4882a593Smuzhiyun 								goto exit;
123*4882a593Smuzhiyun 							}
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 							if (verbose)
126*4882a593Smuzhiyun 								printf("virt:\t[%s-%u]\t%s\t%s\tN/A\n",
127*4882a593Smuzhiyun 									test_algo_name(algo), key_len * 8,
128*4882a593Smuzhiyun 									test_mode_name(mode),
129*4882a593Smuzhiyun 									test_op_name(operation));
130*4882a593Smuzhiyun 							res = RK_CRYPTO_SUCCESS;
131*4882a593Smuzhiyun 							continue;
132*4882a593Smuzhiyun 						}
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 						if (is_no_multi_blocksize(mode))
135*4882a593Smuzhiyun 							data_len = data_len - 3;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 						res = rk_ae_set_aad_virt(handle, aad);
138*4882a593Smuzhiyun 						if (res) {
139*4882a593Smuzhiyun 							rk_ae_final(handle);
140*4882a593Smuzhiyun 							printf("rk_ae_set_aad_virt error[%x]\n", res);
141*4882a593Smuzhiyun 							goto exit;
142*4882a593Smuzhiyun 						}
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 						res = rk_ae_crypt_virt(handle, plain, ae_hard, data_len, tag_hard);
145*4882a593Smuzhiyun 						if (res) {
146*4882a593Smuzhiyun 							rk_ae_final(handle);
147*4882a593Smuzhiyun 							printf("rk_ae_crypt_virt error[%x]\n", res);
148*4882a593Smuzhiyun 							goto exit;
149*4882a593Smuzhiyun 						}
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 						rk_ae_final(handle);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 						res = soft_ae(algo, mode, operation,
154*4882a593Smuzhiyun 								ae_cfg.key, ae_cfg.key_len, iv_tmp, iv_len,
155*4882a593Smuzhiyun 								aad, ae_cfg.aad_len, ae_cfg.tag_len,
156*4882a593Smuzhiyun 								plain, data_len, ae_soft, tag_soft);
157*4882a593Smuzhiyun 						if (res) {
158*4882a593Smuzhiyun 							printf("soft_ae error[%x]\n", res);
159*4882a593Smuzhiyun 							goto exit;
160*4882a593Smuzhiyun 						}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 						/* Verify the result */
163*4882a593Smuzhiyun 						if (memcmp(ae_hard, ae_soft, data_len) != 0) {
164*4882a593Smuzhiyun 							printf("rkcrypto_test_ae_virt compare data failed.\n");
165*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
166*4882a593Smuzhiyun 							goto exit;
167*4882a593Smuzhiyun 						}
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 						if (memcmp(tag_hard, tag_soft, ae_cfg.tag_len) != 0) {
170*4882a593Smuzhiyun 							printf("rkcrypto_test_ae_virt compare tag failed.\n");
171*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
172*4882a593Smuzhiyun 							goto exit;
173*4882a593Smuzhiyun 						}
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 						if (verbose)
176*4882a593Smuzhiyun 							printf("virt:\t[%s-%u]\t%s\t%s\tPASS\n",
177*4882a593Smuzhiyun 								test_algo_name(algo), key_len * 8,
178*4882a593Smuzhiyun 								test_mode_name(mode), test_op_name(operation));
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 						/* decryption */
181*4882a593Smuzhiyun 						operation = RK_OP_CIPHER_DEC;
182*4882a593Smuzhiyun 						ae_cfg.operation = operation;
183*4882a593Smuzhiyun 						memcpy(ae_cfg.iv, iv_tmp, iv_len);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 						res = rk_ae_init(&ae_cfg, &handle);
186*4882a593Smuzhiyun 						if (res) {
187*4882a593Smuzhiyun 							if (res != RK_CRYPTO_ERR_NOT_SUPPORTED) {
188*4882a593Smuzhiyun 								printf("rk_ae_init error[%x]\n", res);
189*4882a593Smuzhiyun 								goto exit;
190*4882a593Smuzhiyun 							}
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 							if (verbose)
193*4882a593Smuzhiyun 								printf("virt:\t[%s-%u]\t%s\t%s\tN/A\n",
194*4882a593Smuzhiyun 									test_algo_name(algo), key_len * 8,
195*4882a593Smuzhiyun 									test_mode_name(mode),
196*4882a593Smuzhiyun 									test_op_name(operation));
197*4882a593Smuzhiyun 							res = RK_CRYPTO_SUCCESS;
198*4882a593Smuzhiyun 							continue;
199*4882a593Smuzhiyun 						}
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 						res = rk_ae_set_aad_virt(handle, aad);
202*4882a593Smuzhiyun 						if (res) {
203*4882a593Smuzhiyun 							rk_ae_final(handle);
204*4882a593Smuzhiyun 							printf("rk_ae_set_aad_virt error[%x]\n", res);
205*4882a593Smuzhiyun 							goto exit;
206*4882a593Smuzhiyun 						}
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 						res = rk_ae_crypt_virt(handle, ae_hard, ae_hard, data_len, tag_hard);
209*4882a593Smuzhiyun 						if (res) {
210*4882a593Smuzhiyun 							rk_ae_final(handle);
211*4882a593Smuzhiyun 							printf("rk_ae_crypt_virt error[%x]\n", res);
212*4882a593Smuzhiyun 							goto exit;
213*4882a593Smuzhiyun 						}
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 						rk_ae_final(handle);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 						/* Verify the result */
218*4882a593Smuzhiyun 						if (memcmp(ae_hard, plain, data_len) != 0) {
219*4882a593Smuzhiyun 							printf("rkcrypto_test_ae_virt compare data failed.\n");
220*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
221*4882a593Smuzhiyun 							goto exit;
222*4882a593Smuzhiyun 						}
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 						if (verbose)
225*4882a593Smuzhiyun 							printf("virt:\t[%s-%u]\t%s\t%s\tPASS\n",
226*4882a593Smuzhiyun 								test_algo_name(algo), key_len * 8,
227*4882a593Smuzhiyun 								test_mode_name(mode), test_op_name(operation));
228*4882a593Smuzhiyun 					}
229*4882a593Smuzhiyun 				}
230*4882a593Smuzhiyun 			}
231*4882a593Smuzhiyun 		}
232*4882a593Smuzhiyun 	}
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
235*4882a593Smuzhiyun exit:
236*4882a593Smuzhiyun 	if (plain)
237*4882a593Smuzhiyun 		free(plain);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	if (ae_soft)
240*4882a593Smuzhiyun 		free(ae_soft);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	if (ae_hard)
243*4882a593Smuzhiyun 		free(ae_hard);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	if (aad)
246*4882a593Smuzhiyun 		free(aad);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	if (res)
249*4882a593Smuzhiyun 		printf("virt:\t[%s-%u]\t%s\t%s\tFAIL\n",
250*4882a593Smuzhiyun 		       test_algo_name(algo), key_len * 8,
251*4882a593Smuzhiyun 		       test_mode_name(mode), test_op_name(operation));
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	return res;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun 
test_ae_item_fd(const struct test_ae_item * item,int verbose)256*4882a593Smuzhiyun static RK_RES test_ae_item_fd(const struct test_ae_item *item, int verbose)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
259*4882a593Smuzhiyun 	uint32_t h, i, k, l, n;
260*4882a593Smuzhiyun 	rk_handle handle = 0;
261*4882a593Smuzhiyun 	rk_ae_config ae_cfg;
262*4882a593Smuzhiyun 	rk_crypto_mem *plain = NULL, *ae_soft = NULL, *ae_hard = NULL, *aad = NULL;
263*4882a593Smuzhiyun 	uint8_t iv_tmp[32];
264*4882a593Smuzhiyun 	uint32_t algo = 0, mode = 0, key_len, iv_len, data_len, aad_len, operation;
265*4882a593Smuzhiyun 	uint32_t tag_len = 16;
266*4882a593Smuzhiyun 	uint8_t tag_hard[16], tag_soft[16];
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	plain = rk_crypto_mem_alloc(TEST_DATA_MAX);
269*4882a593Smuzhiyun 	if (!plain) {
270*4882a593Smuzhiyun 		printf("plain malloc %dByte error!\n", TEST_DATA_MAX);
271*4882a593Smuzhiyun 		goto exit;
272*4882a593Smuzhiyun 	}
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	ae_soft = rk_crypto_mem_alloc(TEST_DATA_MAX);
275*4882a593Smuzhiyun 	if (!ae_soft) {
276*4882a593Smuzhiyun 		printf("ae_soft malloc %dByte error!\n", TEST_DATA_MAX);
277*4882a593Smuzhiyun 		goto exit;
278*4882a593Smuzhiyun 	}
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	ae_hard = rk_crypto_mem_alloc(TEST_DATA_MAX);
281*4882a593Smuzhiyun 	if (!ae_hard) {
282*4882a593Smuzhiyun 		printf("ae_hard malloc %dByte error!\n", TEST_DATA_MAX);
283*4882a593Smuzhiyun 		goto exit;
284*4882a593Smuzhiyun 	}
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	aad = rk_crypto_mem_alloc(TEST_AAD_MAX);
287*4882a593Smuzhiyun 	if (!aad) {
288*4882a593Smuzhiyun 		printf("aad malloc %dByte error!\n", TEST_AAD_MAX);
289*4882a593Smuzhiyun 		goto exit;
290*4882a593Smuzhiyun 	}
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	memset(tag_hard, 0x00, sizeof(tag_hard));
293*4882a593Smuzhiyun 	memset(tag_soft, 0x00, sizeof(tag_soft));
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	iv_len  = 12;
296*4882a593Smuzhiyun 	for (h = 0; h < ARRAY_SIZE(item->algo); h++) {
297*4882a593Smuzhiyun 		algo = item->algo[h];
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 		for (i = 0; i < ARRAY_SIZE(item->modes); i++) {
300*4882a593Smuzhiyun 			mode = item->modes[i];
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 			if (mode == DATA_BUTT)
303*4882a593Smuzhiyun 				break;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 			for (k = 0; k < ARRAY_SIZE(item->key_lens); k++) {
306*4882a593Smuzhiyun 				key_len = item->key_lens[k];
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 				if (algo == RK_ALGO_SM4 && key_len !=16)
309*4882a593Smuzhiyun 						continue;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 				for (l = 0; l < ARRAY_SIZE(item->data_lens); l++) {
312*4882a593Smuzhiyun 					data_len  = item->data_lens[l];
313*4882a593Smuzhiyun 					test_get_rng(plain->vaddr, data_len);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 					for (n = 0; n < ARRAY_SIZE(item->aad_lens); n++) {
316*4882a593Smuzhiyun 						aad_len = item->aad_lens[n];
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 						/* encryption */
319*4882a593Smuzhiyun 						operation = RK_OP_CIPHER_ENC;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 						memset(&ae_cfg, 0x00, sizeof(ae_cfg));
322*4882a593Smuzhiyun 						ae_cfg.algo       = algo;
323*4882a593Smuzhiyun 						ae_cfg.mode       = mode;
324*4882a593Smuzhiyun 						ae_cfg.operation  = operation;
325*4882a593Smuzhiyun 						ae_cfg.key_len    = key_len;
326*4882a593Smuzhiyun 						ae_cfg.iv_len     = iv_len;
327*4882a593Smuzhiyun 						ae_cfg.aad_len    = aad_len;
328*4882a593Smuzhiyun 						ae_cfg.tag_len    = tag_len;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 						test_get_rng(ae_cfg.key, key_len);
331*4882a593Smuzhiyun 						test_get_rng(ae_cfg.iv, iv_len);
332*4882a593Smuzhiyun 						test_get_rng(aad->vaddr, aad_len);
333*4882a593Smuzhiyun 						memcpy(iv_tmp, ae_cfg.iv, iv_len);
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 						res = rk_ae_init(&ae_cfg, &handle);
336*4882a593Smuzhiyun 						if (res) {
337*4882a593Smuzhiyun 							if (res != RK_CRYPTO_ERR_NOT_SUPPORTED) {
338*4882a593Smuzhiyun 								printf("rk_ae_init error[%x]\n", res);
339*4882a593Smuzhiyun 								goto exit;
340*4882a593Smuzhiyun 							}
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 							if (verbose)
343*4882a593Smuzhiyun 								printf("dma_fd:\t[%s-%u]\t%s\t%s\tN/A\n",
344*4882a593Smuzhiyun 									test_algo_name(algo), key_len * 8,
345*4882a593Smuzhiyun 									test_mode_name(mode),
346*4882a593Smuzhiyun 									test_op_name(operation));
347*4882a593Smuzhiyun 							res = RK_CRYPTO_SUCCESS;
348*4882a593Smuzhiyun 							continue;
349*4882a593Smuzhiyun 						}
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 						if (is_no_multi_blocksize(mode))
352*4882a593Smuzhiyun 							data_len = data_len - 3;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 						res = rk_ae_set_aad(handle, aad->dma_fd);
355*4882a593Smuzhiyun 						if (res) {
356*4882a593Smuzhiyun 							rk_ae_final(handle);
357*4882a593Smuzhiyun 							printf("rk_ae_set_aad_virt error[%x]\n", res);
358*4882a593Smuzhiyun 							goto exit;
359*4882a593Smuzhiyun 						}
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 						res = rk_ae_crypt(handle, plain->dma_fd, ae_hard->dma_fd, data_len, tag_hard);
362*4882a593Smuzhiyun 						if (res) {
363*4882a593Smuzhiyun 							rk_ae_final(handle);
364*4882a593Smuzhiyun 							printf("rk_ae_crypt error[%x]\n", res);
365*4882a593Smuzhiyun 							goto exit;
366*4882a593Smuzhiyun 						}
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 						rk_ae_final(handle);
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 						res = soft_ae(algo, mode, operation,
371*4882a593Smuzhiyun 								ae_cfg.key, ae_cfg.key_len, iv_tmp, iv_len,
372*4882a593Smuzhiyun 								aad->vaddr, aad_len, ae_cfg.tag_len,
373*4882a593Smuzhiyun 								plain->vaddr, data_len, ae_soft->vaddr, tag_soft);
374*4882a593Smuzhiyun 						if (res) {
375*4882a593Smuzhiyun 							printf("soft_ae error[%x]\n", res);
376*4882a593Smuzhiyun 							goto exit;
377*4882a593Smuzhiyun 						}
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 						/* Verify the result */
380*4882a593Smuzhiyun 						if (memcmp(ae_hard->vaddr, ae_soft->vaddr, data_len) != 0) {
381*4882a593Smuzhiyun 							printf("rkcrypto_test_ae compare data failed.\n");
382*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
383*4882a593Smuzhiyun 							goto exit;
384*4882a593Smuzhiyun 						}
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 						if (memcmp(tag_hard, tag_soft, ae_cfg.tag_len) != 0) {
387*4882a593Smuzhiyun 							printf("rkcrypto_test_ae compare tag failed.\n");
388*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
389*4882a593Smuzhiyun 							goto exit;
390*4882a593Smuzhiyun 						}
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 						if (verbose)
393*4882a593Smuzhiyun 							printf("dma_fd:\t[%s-%u]\t%s\t%s\tPASS\n",
394*4882a593Smuzhiyun 								test_algo_name(algo), key_len * 8,
395*4882a593Smuzhiyun 								test_mode_name(mode), test_op_name(operation));
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 						/* decryption */
398*4882a593Smuzhiyun 						operation = RK_OP_CIPHER_DEC;
399*4882a593Smuzhiyun 						ae_cfg.operation = operation;
400*4882a593Smuzhiyun 						memcpy(ae_cfg.iv, iv_tmp, iv_len);
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 						res = rk_ae_init(&ae_cfg, &handle);
403*4882a593Smuzhiyun 						if (res) {
404*4882a593Smuzhiyun 							if (res != RK_CRYPTO_ERR_NOT_SUPPORTED) {
405*4882a593Smuzhiyun 								printf("rk_ae_init error[%x]\n", res);
406*4882a593Smuzhiyun 								goto exit;
407*4882a593Smuzhiyun 							}
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 							if (verbose)
410*4882a593Smuzhiyun 								printf("dma_fd:\t[%s-%u]\t%s\t%s\tN/A\n",
411*4882a593Smuzhiyun 									test_algo_name(algo), key_len * 8,
412*4882a593Smuzhiyun 									test_mode_name(mode),
413*4882a593Smuzhiyun 									test_op_name(operation));
414*4882a593Smuzhiyun 							res = RK_CRYPTO_SUCCESS;
415*4882a593Smuzhiyun 							continue;
416*4882a593Smuzhiyun 						}
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun 						res = rk_ae_set_aad(handle, aad->dma_fd);
419*4882a593Smuzhiyun 						if (res) {
420*4882a593Smuzhiyun 							rk_ae_final(handle);
421*4882a593Smuzhiyun 							printf("rk_ae_set_aad_virt error[%x]\n", res);
422*4882a593Smuzhiyun 							goto exit;
423*4882a593Smuzhiyun 						}
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 						res = rk_ae_crypt(handle, ae_hard->dma_fd, ae_hard->dma_fd, data_len, tag_hard);
426*4882a593Smuzhiyun 						if (res) {
427*4882a593Smuzhiyun 							rk_ae_final(handle);
428*4882a593Smuzhiyun 							printf("rk_ae_crypt error[%x]\n", res);
429*4882a593Smuzhiyun 							goto exit;
430*4882a593Smuzhiyun 						}
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 						rk_ae_final(handle);
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 						/* Verify the result */
435*4882a593Smuzhiyun 						if (memcmp(ae_hard->vaddr, plain->vaddr, data_len) != 0) {
436*4882a593Smuzhiyun 							printf("rkcrypto_test_ae compare data failed.\n");
437*4882a593Smuzhiyun 							res = RK_CRYPTO_ERR_GENERIC;
438*4882a593Smuzhiyun 							goto exit;
439*4882a593Smuzhiyun 						}
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 						if (verbose)
442*4882a593Smuzhiyun 							printf("dma_fd:\t[%s-%u]\t%s\t%s\tPASS\n",
443*4882a593Smuzhiyun 								test_algo_name(algo), key_len * 8,
444*4882a593Smuzhiyun 								test_mode_name(mode), test_op_name(operation));
445*4882a593Smuzhiyun 					}
446*4882a593Smuzhiyun 				}
447*4882a593Smuzhiyun 			}
448*4882a593Smuzhiyun 		}
449*4882a593Smuzhiyun 	}
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	res = RK_CRYPTO_SUCCESS;
452*4882a593Smuzhiyun exit:
453*4882a593Smuzhiyun 	if (plain)
454*4882a593Smuzhiyun 		rk_crypto_mem_free(plain);
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	if (ae_soft)
457*4882a593Smuzhiyun 		rk_crypto_mem_free(ae_soft);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun 	if (ae_hard)
460*4882a593Smuzhiyun 		rk_crypto_mem_free(ae_hard);
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun 	if (aad)
463*4882a593Smuzhiyun 		rk_crypto_mem_free(aad);
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	if (res)
466*4882a593Smuzhiyun 		printf("dma_fd:\t[%s-%u]\t%s\t%s\tFAIL\n",
467*4882a593Smuzhiyun 		       test_algo_name(algo), key_len * 8,
468*4882a593Smuzhiyun 		       test_mode_name(mode), test_op_name(operation));
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	return res;
471*4882a593Smuzhiyun }
472*4882a593Smuzhiyun 
test_ae(int verbose)473*4882a593Smuzhiyun RK_RES test_ae(int verbose)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun 	RK_RES res = RK_CRYPTO_ERR_GENERIC;
476*4882a593Smuzhiyun 	uint32_t i;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	res = rk_crypto_init();
479*4882a593Smuzhiyun 	if (res) {
480*4882a593Smuzhiyun 		printf("rk_crypto_init error %08x\n", res);
481*4882a593Smuzhiyun 		return res;
482*4882a593Smuzhiyun 	}
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(test_item_tbl); i++) {
485*4882a593Smuzhiyun 		res = test_ae_item_virt(&test_item_tbl[i], verbose);
486*4882a593Smuzhiyun 		if (res)
487*4882a593Smuzhiyun 			goto exit;
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun 		res = test_ae_item_fd(&test_item_tbl[i], verbose);
490*4882a593Smuzhiyun 		if (res)
491*4882a593Smuzhiyun 			goto exit;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 		if (verbose)
494*4882a593Smuzhiyun 			printf("\n");
495*4882a593Smuzhiyun 	}
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun exit:
498*4882a593Smuzhiyun 	rk_crypto_deinit();
499*4882a593Smuzhiyun 	return res;
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun 
502