1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang  * Copyright(c) 2015-2017 Intel Corporation
3*4418919fSjohnjiang  */
4*4418919fSjohnjiang 
5*4418919fSjohnjiang #include <rte_common.h>
6*4418919fSjohnjiang #include <rte_hexdump.h>
7*4418919fSjohnjiang #include <rte_mbuf.h>
8*4418919fSjohnjiang #include <rte_malloc.h>
9*4418919fSjohnjiang #include <rte_memcpy.h>
10*4418919fSjohnjiang #include <rte_pause.h>
11*4418919fSjohnjiang 
12*4418919fSjohnjiang #include <rte_crypto.h>
13*4418919fSjohnjiang #include <rte_cryptodev.h>
14*4418919fSjohnjiang #include <rte_cryptodev_pmd.h>
15*4418919fSjohnjiang 
16*4418919fSjohnjiang #include "test.h"
17*4418919fSjohnjiang #include "test_cryptodev.h"
18*4418919fSjohnjiang #include "test_cryptodev_blockcipher.h"
19*4418919fSjohnjiang #include "test_cryptodev_aes_test_vectors.h"
20*4418919fSjohnjiang #include "test_cryptodev_des_test_vectors.h"
21*4418919fSjohnjiang #include "test_cryptodev_hash_test_vectors.h"
22*4418919fSjohnjiang 
23*4418919fSjohnjiang static int
24*4418919fSjohnjiang test_blockcipher_one_case(const struct blockcipher_test_case *t,
25*4418919fSjohnjiang 	struct rte_mempool *mbuf_pool,
26*4418919fSjohnjiang 	struct rte_mempool *op_mpool,
27*4418919fSjohnjiang 	struct rte_mempool *sess_mpool,
28*4418919fSjohnjiang 	struct rte_mempool *sess_priv_mpool,
29*4418919fSjohnjiang 	uint8_t dev_id,
30*4418919fSjohnjiang 	int driver_id,
31*4418919fSjohnjiang 	char *test_msg)
32*4418919fSjohnjiang {
33*4418919fSjohnjiang 	struct rte_mbuf *ibuf = NULL;
34*4418919fSjohnjiang 	struct rte_mbuf *obuf = NULL;
35*4418919fSjohnjiang 	struct rte_mbuf *iobuf;
36*4418919fSjohnjiang 	struct rte_crypto_sym_xform *cipher_xform = NULL;
37*4418919fSjohnjiang 	struct rte_crypto_sym_xform *auth_xform = NULL;
38*4418919fSjohnjiang 	struct rte_crypto_sym_xform *init_xform = NULL;
39*4418919fSjohnjiang 	struct rte_crypto_sym_op *sym_op = NULL;
40*4418919fSjohnjiang 	struct rte_crypto_op *op = NULL;
41*4418919fSjohnjiang 	struct rte_cryptodev_info dev_info;
42*4418919fSjohnjiang 	struct rte_cryptodev_sym_session *sess = NULL;
43*4418919fSjohnjiang 
44*4418919fSjohnjiang 	int status = TEST_SUCCESS;
45*4418919fSjohnjiang 	const struct blockcipher_test_data *tdata = t->test_data;
46*4418919fSjohnjiang 	uint8_t cipher_key[tdata->cipher_key.len];
47*4418919fSjohnjiang 	uint8_t auth_key[tdata->auth_key.len];
48*4418919fSjohnjiang 	uint32_t buf_len = tdata->ciphertext.len;
49*4418919fSjohnjiang 	uint32_t digest_len = 0;
50*4418919fSjohnjiang 	char *buf_p = NULL;
51*4418919fSjohnjiang 	uint8_t src_pattern = 0xa5;
52*4418919fSjohnjiang 	uint8_t dst_pattern = 0xb6;
53*4418919fSjohnjiang 	uint8_t tmp_src_buf[MBUF_SIZE];
54*4418919fSjohnjiang 	uint8_t tmp_dst_buf[MBUF_SIZE];
55*4418919fSjohnjiang 
56*4418919fSjohnjiang 	int openssl_pmd = rte_cryptodev_driver_id_get(
57*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
58*4418919fSjohnjiang 	int ccp_pmd = rte_cryptodev_driver_id_get(
59*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
60*4418919fSjohnjiang 	int scheduler_pmd = rte_cryptodev_driver_id_get(
61*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
62*4418919fSjohnjiang 	int armv8_pmd = rte_cryptodev_driver_id_get(
63*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
64*4418919fSjohnjiang 	int aesni_mb_pmd = rte_cryptodev_driver_id_get(
65*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
66*4418919fSjohnjiang 	int qat_pmd = rte_cryptodev_driver_id_get(
67*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
68*4418919fSjohnjiang 	int dpaa2_sec_pmd = rte_cryptodev_driver_id_get(
69*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
70*4418919fSjohnjiang 	int dpaa_sec_pmd = rte_cryptodev_driver_id_get(
71*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
72*4418919fSjohnjiang 	int caam_jr_pmd = rte_cryptodev_driver_id_get(
73*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
74*4418919fSjohnjiang 	int mrvl_pmd = rte_cryptodev_driver_id_get(
75*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
76*4418919fSjohnjiang 	int virtio_pmd = rte_cryptodev_driver_id_get(
77*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
78*4418919fSjohnjiang 	int octeontx_pmd = rte_cryptodev_driver_id_get(
79*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
80*4418919fSjohnjiang 	int octeontx2_pmd = rte_cryptodev_driver_id_get(
81*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
82*4418919fSjohnjiang 	int null_pmd = rte_cryptodev_driver_id_get(
83*4418919fSjohnjiang 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
84*4418919fSjohnjiang 	int nitrox_pmd = rte_cryptodev_driver_id_get(
85*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
86*4418919fSjohnjiang 
87*4418919fSjohnjiang 	int nb_segs = 1;
88*4418919fSjohnjiang 	uint32_t nb_iterates = 0;
89*4418919fSjohnjiang 
90*4418919fSjohnjiang 	rte_cryptodev_info_get(dev_id, &dev_info);
91*4418919fSjohnjiang 
92*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SG) {
93*4418919fSjohnjiang 		uint64_t feat_flags = dev_info.feature_flags;
94*4418919fSjohnjiang 		uint64_t oop_flag = RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT;
95*4418919fSjohnjiang 
96*4418919fSjohnjiang 		if (t->feature_mask && BLOCKCIPHER_TEST_FEATURE_OOP) {
97*4418919fSjohnjiang 			if (!(feat_flags & oop_flag)) {
98*4418919fSjohnjiang 				printf("Device doesn't support out-of-place "
99*4418919fSjohnjiang 					"scatter-gather in input mbuf. "
100*4418919fSjohnjiang 					"Test Skipped.\n");
101*4418919fSjohnjiang 				return 0;
102*4418919fSjohnjiang 			}
103*4418919fSjohnjiang 		} else {
104*4418919fSjohnjiang 			if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
105*4418919fSjohnjiang 				printf("Device doesn't support in-place "
106*4418919fSjohnjiang 					"scatter-gather mbufs. "
107*4418919fSjohnjiang 					"Test Skipped.\n");
108*4418919fSjohnjiang 				return 0;
109*4418919fSjohnjiang 			}
110*4418919fSjohnjiang 		}
111*4418919fSjohnjiang 
112*4418919fSjohnjiang 		nb_segs = 3;
113*4418919fSjohnjiang 	}
114*4418919fSjohnjiang 
115*4418919fSjohnjiang 	if (tdata->cipher_key.len)
116*4418919fSjohnjiang 		memcpy(cipher_key, tdata->cipher_key.data,
117*4418919fSjohnjiang 			tdata->cipher_key.len);
118*4418919fSjohnjiang 	if (tdata->auth_key.len)
119*4418919fSjohnjiang 		memcpy(auth_key, tdata->auth_key.data,
120*4418919fSjohnjiang 			tdata->auth_key.len);
121*4418919fSjohnjiang 
122*4418919fSjohnjiang 	if (driver_id == dpaa2_sec_pmd ||
123*4418919fSjohnjiang 			driver_id == dpaa_sec_pmd ||
124*4418919fSjohnjiang 			driver_id == caam_jr_pmd ||
125*4418919fSjohnjiang 			driver_id == qat_pmd ||
126*4418919fSjohnjiang 			driver_id == openssl_pmd ||
127*4418919fSjohnjiang 			driver_id == armv8_pmd ||
128*4418919fSjohnjiang 			driver_id == mrvl_pmd ||
129*4418919fSjohnjiang 			driver_id == ccp_pmd ||
130*4418919fSjohnjiang 			driver_id == virtio_pmd ||
131*4418919fSjohnjiang 			driver_id == octeontx_pmd ||
132*4418919fSjohnjiang 			driver_id == octeontx2_pmd ||
133*4418919fSjohnjiang 			driver_id == null_pmd ||
134*4418919fSjohnjiang 			driver_id == nitrox_pmd) { /* Fall through */
135*4418919fSjohnjiang 		digest_len = tdata->digest.len;
136*4418919fSjohnjiang 	} else if (driver_id == aesni_mb_pmd ||
137*4418919fSjohnjiang 			driver_id == scheduler_pmd) {
138*4418919fSjohnjiang 		digest_len = tdata->digest.truncated_len;
139*4418919fSjohnjiang 	} else {
140*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
141*4418919fSjohnjiang 			"line %u FAILED: %s",
142*4418919fSjohnjiang 			__LINE__, "Unsupported PMD type");
143*4418919fSjohnjiang 		status = TEST_FAILED;
144*4418919fSjohnjiang 		goto error_exit;
145*4418919fSjohnjiang 	}
146*4418919fSjohnjiang 
147*4418919fSjohnjiang 	/* preparing data */
148*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
149*4418919fSjohnjiang 		buf_len += digest_len;
150*4418919fSjohnjiang 
151*4418919fSjohnjiang 	/* for contiguous mbuf, nb_segs is 1 */
152*4418919fSjohnjiang 	ibuf = create_segmented_mbuf(mbuf_pool,
153*4418919fSjohnjiang 			tdata->ciphertext.len, nb_segs, src_pattern);
154*4418919fSjohnjiang 	if (ibuf == NULL) {
155*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
156*4418919fSjohnjiang 			"line %u FAILED: %s",
157*4418919fSjohnjiang 			__LINE__, "Cannot create source mbuf");
158*4418919fSjohnjiang 		status = TEST_FAILED;
159*4418919fSjohnjiang 		goto error_exit;
160*4418919fSjohnjiang 	}
161*4418919fSjohnjiang 
162*4418919fSjohnjiang 	/* only encryption requires plaintext.data input,
163*4418919fSjohnjiang 	 * decryption/(digest gen)/(digest verify) use ciphertext.data
164*4418919fSjohnjiang 	 * to be computed
165*4418919fSjohnjiang 	 */
166*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
167*4418919fSjohnjiang 		pktmbuf_write(ibuf, 0, tdata->plaintext.len,
168*4418919fSjohnjiang 				tdata->plaintext.data);
169*4418919fSjohnjiang 	else
170*4418919fSjohnjiang 		pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
171*4418919fSjohnjiang 				tdata->ciphertext.data);
172*4418919fSjohnjiang 
173*4418919fSjohnjiang 	buf_p = rte_pktmbuf_append(ibuf, digest_len);
174*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
175*4418919fSjohnjiang 		rte_memcpy(buf_p, tdata->digest.data, digest_len);
176*4418919fSjohnjiang 	else
177*4418919fSjohnjiang 		memset(buf_p, 0, digest_len);
178*4418919fSjohnjiang 
179*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
180*4418919fSjohnjiang 		obuf = rte_pktmbuf_alloc(mbuf_pool);
181*4418919fSjohnjiang 		if (!obuf) {
182*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
183*4418919fSjohnjiang 				"FAILED: %s", __LINE__,
184*4418919fSjohnjiang 				"Allocation of rte_mbuf failed");
185*4418919fSjohnjiang 			status = TEST_FAILED;
186*4418919fSjohnjiang 			goto error_exit;
187*4418919fSjohnjiang 		}
188*4418919fSjohnjiang 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
189*4418919fSjohnjiang 
190*4418919fSjohnjiang 		buf_p = rte_pktmbuf_append(obuf, buf_len);
191*4418919fSjohnjiang 		if (!buf_p) {
192*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
193*4418919fSjohnjiang 				"FAILED: %s", __LINE__,
194*4418919fSjohnjiang 				"No room to append mbuf");
195*4418919fSjohnjiang 			status = TEST_FAILED;
196*4418919fSjohnjiang 			goto error_exit;
197*4418919fSjohnjiang 		}
198*4418919fSjohnjiang 		memset(buf_p, 0, buf_len);
199*4418919fSjohnjiang 	}
200*4418919fSjohnjiang 
201*4418919fSjohnjiang 	/* Generate Crypto op data structure */
202*4418919fSjohnjiang 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
203*4418919fSjohnjiang 	if (!op) {
204*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
205*4418919fSjohnjiang 			"line %u FAILED: %s",
206*4418919fSjohnjiang 			__LINE__, "Failed to allocate symmetric crypto "
207*4418919fSjohnjiang 			"operation struct");
208*4418919fSjohnjiang 		status = TEST_FAILED;
209*4418919fSjohnjiang 		goto error_exit;
210*4418919fSjohnjiang 	}
211*4418919fSjohnjiang 
212*4418919fSjohnjiang 	sym_op = op->sym;
213*4418919fSjohnjiang 
214*4418919fSjohnjiang iterate:
215*4418919fSjohnjiang 	if (nb_iterates) {
216*4418919fSjohnjiang 		struct rte_mbuf *tmp_buf = ibuf;
217*4418919fSjohnjiang 
218*4418919fSjohnjiang 		ibuf = obuf;
219*4418919fSjohnjiang 		obuf = tmp_buf;
220*4418919fSjohnjiang 
221*4418919fSjohnjiang 		rte_pktmbuf_reset(ibuf);
222*4418919fSjohnjiang 		rte_pktmbuf_reset(obuf);
223*4418919fSjohnjiang 
224*4418919fSjohnjiang 		rte_pktmbuf_append(ibuf, tdata->ciphertext.len);
225*4418919fSjohnjiang 
226*4418919fSjohnjiang 		/* only encryption requires plaintext.data input,
227*4418919fSjohnjiang 		 * decryption/(digest gen)/(digest verify) use ciphertext.data
228*4418919fSjohnjiang 		 * to be computed
229*4418919fSjohnjiang 		 */
230*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
231*4418919fSjohnjiang 			pktmbuf_write(ibuf, 0, tdata->plaintext.len,
232*4418919fSjohnjiang 					tdata->plaintext.data);
233*4418919fSjohnjiang 		else
234*4418919fSjohnjiang 			pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
235*4418919fSjohnjiang 					tdata->ciphertext.data);
236*4418919fSjohnjiang 
237*4418919fSjohnjiang 		buf_p = rte_pktmbuf_append(ibuf, digest_len);
238*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
239*4418919fSjohnjiang 			rte_memcpy(buf_p, tdata->digest.data, digest_len);
240*4418919fSjohnjiang 		else
241*4418919fSjohnjiang 			memset(buf_p, 0, digest_len);
242*4418919fSjohnjiang 
243*4418919fSjohnjiang 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
244*4418919fSjohnjiang 
245*4418919fSjohnjiang 		buf_p = rte_pktmbuf_append(obuf, buf_len);
246*4418919fSjohnjiang 		if (!buf_p) {
247*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
248*4418919fSjohnjiang 				"FAILED: %s", __LINE__,
249*4418919fSjohnjiang 				"No room to append mbuf");
250*4418919fSjohnjiang 			status = TEST_FAILED;
251*4418919fSjohnjiang 			goto error_exit;
252*4418919fSjohnjiang 		}
253*4418919fSjohnjiang 		memset(buf_p, 0, buf_len);
254*4418919fSjohnjiang 	}
255*4418919fSjohnjiang 
256*4418919fSjohnjiang 	sym_op->m_src = ibuf;
257*4418919fSjohnjiang 
258*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
259*4418919fSjohnjiang 		sym_op->m_dst = obuf;
260*4418919fSjohnjiang 		iobuf = obuf;
261*4418919fSjohnjiang 	} else {
262*4418919fSjohnjiang 		sym_op->m_dst = NULL;
263*4418919fSjohnjiang 		iobuf = ibuf;
264*4418919fSjohnjiang 	}
265*4418919fSjohnjiang 
266*4418919fSjohnjiang 	/* sessionless op requires allocate xform using
267*4418919fSjohnjiang 	 * rte_crypto_op_sym_xforms_alloc(), otherwise rte_zmalloc()
268*4418919fSjohnjiang 	 * is used
269*4418919fSjohnjiang 	 */
270*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
271*4418919fSjohnjiang 		uint32_t n_xforms = 0;
272*4418919fSjohnjiang 
273*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
274*4418919fSjohnjiang 			n_xforms++;
275*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
276*4418919fSjohnjiang 			n_xforms++;
277*4418919fSjohnjiang 
278*4418919fSjohnjiang 		if (rte_crypto_op_sym_xforms_alloc(op, n_xforms)
279*4418919fSjohnjiang 			== NULL) {
280*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
281*4418919fSjohnjiang 				"FAILED: %s", __LINE__, "Failed to "
282*4418919fSjohnjiang 				"allocate space for crypto transforms");
283*4418919fSjohnjiang 			status = TEST_FAILED;
284*4418919fSjohnjiang 			goto error_exit;
285*4418919fSjohnjiang 		}
286*4418919fSjohnjiang 	} else {
287*4418919fSjohnjiang 		cipher_xform = rte_zmalloc(NULL,
288*4418919fSjohnjiang 			sizeof(struct rte_crypto_sym_xform), 0);
289*4418919fSjohnjiang 
290*4418919fSjohnjiang 		auth_xform = rte_zmalloc(NULL,
291*4418919fSjohnjiang 			sizeof(struct rte_crypto_sym_xform), 0);
292*4418919fSjohnjiang 
293*4418919fSjohnjiang 		if (!cipher_xform || !auth_xform) {
294*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
295*4418919fSjohnjiang 				"FAILED: %s", __LINE__, "Failed to "
296*4418919fSjohnjiang 				"allocate memory for crypto transforms");
297*4418919fSjohnjiang 			status = TEST_FAILED;
298*4418919fSjohnjiang 			goto error_exit;
299*4418919fSjohnjiang 		}
300*4418919fSjohnjiang 	}
301*4418919fSjohnjiang 
302*4418919fSjohnjiang 	/* preparing xform, for sessioned op, init_xform is initialized
303*4418919fSjohnjiang 	 * here and later as param in rte_cryptodev_sym_session_create() call
304*4418919fSjohnjiang 	 */
305*4418919fSjohnjiang 	if (t->op_mask == BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN) {
306*4418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
307*4418919fSjohnjiang 			cipher_xform = op->sym->xform;
308*4418919fSjohnjiang 			auth_xform = cipher_xform->next;
309*4418919fSjohnjiang 			auth_xform->next = NULL;
310*4418919fSjohnjiang 		} else {
311*4418919fSjohnjiang 			cipher_xform->next = auth_xform;
312*4418919fSjohnjiang 			auth_xform->next = NULL;
313*4418919fSjohnjiang 			init_xform = cipher_xform;
314*4418919fSjohnjiang 		}
315*4418919fSjohnjiang 	} else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC) {
316*4418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
317*4418919fSjohnjiang 			auth_xform = op->sym->xform;
318*4418919fSjohnjiang 			cipher_xform = auth_xform->next;
319*4418919fSjohnjiang 			cipher_xform->next = NULL;
320*4418919fSjohnjiang 		} else {
321*4418919fSjohnjiang 			auth_xform->next = cipher_xform;
322*4418919fSjohnjiang 			cipher_xform->next = NULL;
323*4418919fSjohnjiang 			init_xform = auth_xform;
324*4418919fSjohnjiang 		}
325*4418919fSjohnjiang 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_ENCRYPT) ||
326*4418919fSjohnjiang 			(t->op_mask == BLOCKCIPHER_TEST_OP_DECRYPT)) {
327*4418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
328*4418919fSjohnjiang 			cipher_xform = op->sym->xform;
329*4418919fSjohnjiang 		else
330*4418919fSjohnjiang 			init_xform = cipher_xform;
331*4418919fSjohnjiang 		cipher_xform->next = NULL;
332*4418919fSjohnjiang 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN) ||
333*4418919fSjohnjiang 			(t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY)) {
334*4418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
335*4418919fSjohnjiang 			auth_xform = op->sym->xform;
336*4418919fSjohnjiang 		else
337*4418919fSjohnjiang 			init_xform = auth_xform;
338*4418919fSjohnjiang 		auth_xform->next = NULL;
339*4418919fSjohnjiang 	} else {
340*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
341*4418919fSjohnjiang 			"line %u FAILED: %s",
342*4418919fSjohnjiang 			__LINE__, "Unrecognized operation");
343*4418919fSjohnjiang 		status = TEST_FAILED;
344*4418919fSjohnjiang 		goto error_exit;
345*4418919fSjohnjiang 	}
346*4418919fSjohnjiang 
347*4418919fSjohnjiang 	/*configure xforms & sym_op cipher and auth data*/
348*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
349*4418919fSjohnjiang 		cipher_xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
350*4418919fSjohnjiang 		cipher_xform->cipher.algo = tdata->crypto_algo;
351*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
352*4418919fSjohnjiang 			cipher_xform->cipher.op =
353*4418919fSjohnjiang 				RTE_CRYPTO_CIPHER_OP_ENCRYPT;
354*4418919fSjohnjiang 		else
355*4418919fSjohnjiang 			cipher_xform->cipher.op =
356*4418919fSjohnjiang 				RTE_CRYPTO_CIPHER_OP_DECRYPT;
357*4418919fSjohnjiang 		cipher_xform->cipher.key.data = cipher_key;
358*4418919fSjohnjiang 		cipher_xform->cipher.key.length = tdata->cipher_key.len;
359*4418919fSjohnjiang 		cipher_xform->cipher.iv.offset = IV_OFFSET;
360*4418919fSjohnjiang 		cipher_xform->cipher.iv.length = tdata->iv.len;
361*4418919fSjohnjiang 
362*4418919fSjohnjiang 		sym_op->cipher.data.offset = tdata->cipher_offset;
363*4418919fSjohnjiang 		sym_op->cipher.data.length = tdata->ciphertext.len -
364*4418919fSjohnjiang 				tdata->cipher_offset;
365*4418919fSjohnjiang 		rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
366*4418919fSjohnjiang 				tdata->iv.data,
367*4418919fSjohnjiang 				tdata->iv.len);
368*4418919fSjohnjiang 	}
369*4418919fSjohnjiang 
370*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
371*4418919fSjohnjiang 		uint32_t digest_offset = tdata->ciphertext.len;
372*4418919fSjohnjiang 
373*4418919fSjohnjiang 		auth_xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
374*4418919fSjohnjiang 		auth_xform->auth.algo = tdata->auth_algo;
375*4418919fSjohnjiang 		auth_xform->auth.key.length = tdata->auth_key.len;
376*4418919fSjohnjiang 		auth_xform->auth.key.data = auth_key;
377*4418919fSjohnjiang 		auth_xform->auth.digest_length = digest_len;
378*4418919fSjohnjiang 
379*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
380*4418919fSjohnjiang 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
381*4418919fSjohnjiang 			sym_op->auth.digest.data = pktmbuf_mtod_offset
382*4418919fSjohnjiang 				(iobuf, digest_offset);
383*4418919fSjohnjiang 			sym_op->auth.digest.phys_addr =
384*4418919fSjohnjiang 				pktmbuf_iova_offset(iobuf,
385*4418919fSjohnjiang 					digest_offset);
386*4418919fSjohnjiang 		} else {
387*4418919fSjohnjiang 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
388*4418919fSjohnjiang 			sym_op->auth.digest.data = pktmbuf_mtod_offset
389*4418919fSjohnjiang 				(sym_op->m_src, digest_offset);
390*4418919fSjohnjiang 			sym_op->auth.digest.phys_addr =
391*4418919fSjohnjiang 				pktmbuf_iova_offset(sym_op->m_src,
392*4418919fSjohnjiang 					digest_offset);
393*4418919fSjohnjiang 		}
394*4418919fSjohnjiang 
395*4418919fSjohnjiang 		sym_op->auth.data.offset = tdata->auth_offset;
396*4418919fSjohnjiang 		sym_op->auth.data.length = tdata->ciphertext.len -
397*4418919fSjohnjiang 				tdata->auth_offset;
398*4418919fSjohnjiang 	}
399*4418919fSjohnjiang 
400*4418919fSjohnjiang 	/**
401*4418919fSjohnjiang 	 * Create session for sessioned op. For mbuf iteration test,
402*4418919fSjohnjiang 	 * skip the session creation for the second iteration.
403*4418919fSjohnjiang 	 */
404*4418919fSjohnjiang 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) &&
405*4418919fSjohnjiang 			nb_iterates == 0) {
406*4418919fSjohnjiang 		sess = rte_cryptodev_sym_session_create(sess_mpool);
407*4418919fSjohnjiang 
408*4418919fSjohnjiang 		rte_cryptodev_sym_session_init(dev_id, sess, init_xform,
409*4418919fSjohnjiang 				sess_priv_mpool);
410*4418919fSjohnjiang 		if (!sess) {
411*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
412*4418919fSjohnjiang 				"FAILED: %s", __LINE__,
413*4418919fSjohnjiang 				"Session creation failed");
414*4418919fSjohnjiang 			status = TEST_FAILED;
415*4418919fSjohnjiang 			goto error_exit;
416*4418919fSjohnjiang 		}
417*4418919fSjohnjiang 
418*4418919fSjohnjiang 		/* attach symmetric crypto session to crypto operations */
419*4418919fSjohnjiang 		rte_crypto_op_attach_sym_session(op, sess);
420*4418919fSjohnjiang 	}
421*4418919fSjohnjiang 
422*4418919fSjohnjiang 	debug_hexdump(stdout, "m_src(before):",
423*4418919fSjohnjiang 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
424*4418919fSjohnjiang 	rte_memcpy(tmp_src_buf, sym_op->m_src->buf_addr,
425*4418919fSjohnjiang 						sym_op->m_src->buf_len);
426*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
427*4418919fSjohnjiang 		debug_hexdump(stdout, "m_dst(before):",
428*4418919fSjohnjiang 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
429*4418919fSjohnjiang 		rte_memcpy(tmp_dst_buf, sym_op->m_dst->buf_addr,
430*4418919fSjohnjiang 						sym_op->m_dst->buf_len);
431*4418919fSjohnjiang 	}
432*4418919fSjohnjiang 
433*4418919fSjohnjiang 	/* Process crypto operation */
434*4418919fSjohnjiang 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
435*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
436*4418919fSjohnjiang 			"line %u FAILED: %s",
437*4418919fSjohnjiang 			__LINE__, "Error sending packet for encryption");
438*4418919fSjohnjiang 		status = TEST_FAILED;
439*4418919fSjohnjiang 		goto error_exit;
440*4418919fSjohnjiang 	}
441*4418919fSjohnjiang 
442*4418919fSjohnjiang 	op = NULL;
443*4418919fSjohnjiang 
444*4418919fSjohnjiang 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
445*4418919fSjohnjiang 		rte_pause();
446*4418919fSjohnjiang 
447*4418919fSjohnjiang 	if (!op) {
448*4418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
449*4418919fSjohnjiang 			"line %u FAILED: %s",
450*4418919fSjohnjiang 			__LINE__, "Failed to process sym crypto op");
451*4418919fSjohnjiang 		status = TEST_FAILED;
452*4418919fSjohnjiang 		goto error_exit;
453*4418919fSjohnjiang 	}
454*4418919fSjohnjiang 
455*4418919fSjohnjiang 	debug_hexdump(stdout, "m_src(after):",
456*4418919fSjohnjiang 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
457*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP)
458*4418919fSjohnjiang 		debug_hexdump(stdout, "m_dst(after):",
459*4418919fSjohnjiang 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
460*4418919fSjohnjiang 
461*4418919fSjohnjiang 	/* Verify results */
462*4418919fSjohnjiang 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
463*4418919fSjohnjiang 		if ((t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) &&
464*4418919fSjohnjiang 			(op->status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED))
465*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
466*4418919fSjohnjiang 				"FAILED: Digest verification failed "
467*4418919fSjohnjiang 				"(0x%X)", __LINE__, op->status);
468*4418919fSjohnjiang 		else
469*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
470*4418919fSjohnjiang 				"FAILED: Operation failed "
471*4418919fSjohnjiang 				"(0x%X)", __LINE__, op->status);
472*4418919fSjohnjiang 		status = TEST_FAILED;
473*4418919fSjohnjiang 		goto error_exit;
474*4418919fSjohnjiang 	}
475*4418919fSjohnjiang 
476*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
477*4418919fSjohnjiang 		uint8_t buffer[2048];
478*4418919fSjohnjiang 		const uint8_t *compare_ref;
479*4418919fSjohnjiang 		uint32_t compare_len;
480*4418919fSjohnjiang 
481*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) {
482*4418919fSjohnjiang 			compare_ref = tdata->ciphertext.data +
483*4418919fSjohnjiang 					tdata->cipher_offset;
484*4418919fSjohnjiang 			compare_len = tdata->ciphertext.len -
485*4418919fSjohnjiang 					tdata->cipher_offset;
486*4418919fSjohnjiang 		} else {
487*4418919fSjohnjiang 			compare_ref = tdata->plaintext.data +
488*4418919fSjohnjiang 					tdata->cipher_offset;
489*4418919fSjohnjiang 			compare_len = tdata->plaintext.len -
490*4418919fSjohnjiang 					tdata->cipher_offset;
491*4418919fSjohnjiang 		}
492*4418919fSjohnjiang 
493*4418919fSjohnjiang 		if (memcmp(rte_pktmbuf_read(iobuf, tdata->cipher_offset,
494*4418919fSjohnjiang 				compare_len, buffer), compare_ref,
495*4418919fSjohnjiang 				compare_len)) {
496*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
497*4418919fSjohnjiang 				"FAILED: %s", __LINE__,
498*4418919fSjohnjiang 				"Crypto data not as expected");
499*4418919fSjohnjiang 			status = TEST_FAILED;
500*4418919fSjohnjiang 			goto error_exit;
501*4418919fSjohnjiang 		}
502*4418919fSjohnjiang 	}
503*4418919fSjohnjiang 
504*4418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
505*4418919fSjohnjiang 		uint8_t *auth_res = pktmbuf_mtod_offset(iobuf,
506*4418919fSjohnjiang 					tdata->ciphertext.len);
507*4418919fSjohnjiang 
508*4418919fSjohnjiang 		if (memcmp(auth_res, tdata->digest.data, digest_len)) {
509*4418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
510*4418919fSjohnjiang 				"FAILED: %s", __LINE__, "Generated "
511*4418919fSjohnjiang 				"digest data not as expected");
512*4418919fSjohnjiang 			status = TEST_FAILED;
513*4418919fSjohnjiang 			goto error_exit;
514*4418919fSjohnjiang 		}
515*4418919fSjohnjiang 	}
516*4418919fSjohnjiang 
517*4418919fSjohnjiang 	/* The only parts that should have changed in the buffer are
518*4418919fSjohnjiang 	 * plaintext/ciphertext and digest.
519*4418919fSjohnjiang 	 * In OOP only the dest buffer should change.
520*4418919fSjohnjiang 	 */
521*4418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
522*4418919fSjohnjiang 		struct rte_mbuf *mbuf;
523*4418919fSjohnjiang 		uint8_t value;
524*4418919fSjohnjiang 		uint32_t head_unchanged_len, changed_len = 0;
525*4418919fSjohnjiang 		uint32_t i;
526*4418919fSjohnjiang 		uint32_t hdroom_used = 0, tlroom_used = 0;
527*4418919fSjohnjiang 		uint32_t hdroom = 0;
528*4418919fSjohnjiang 
529*4418919fSjohnjiang 		mbuf = sym_op->m_src;
530*4418919fSjohnjiang 		/*
531*4418919fSjohnjiang 		 * Crypto PMDs specify the headroom & tailroom it would use
532*4418919fSjohnjiang 		 * when processing the crypto operation. PMD is free to modify
533*4418919fSjohnjiang 		 * this space, and so the verification check should skip that
534*4418919fSjohnjiang 		 * block.
535*4418919fSjohnjiang 		 */
536*4418919fSjohnjiang 		hdroom_used = dev_info.min_mbuf_headroom_req;
537*4418919fSjohnjiang 		tlroom_used = dev_info.min_mbuf_tailroom_req;
538*4418919fSjohnjiang 
539*4418919fSjohnjiang 		/* Get headroom */
540*4418919fSjohnjiang 		hdroom = rte_pktmbuf_headroom(mbuf);
541*4418919fSjohnjiang 
542*4418919fSjohnjiang 		head_unchanged_len = mbuf->buf_len;
543*4418919fSjohnjiang 
544*4418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
545*4418919fSjohnjiang 
546*4418919fSjohnjiang 			/* Skip headroom used by PMD */
547*4418919fSjohnjiang 			if (i == hdroom - hdroom_used)
548*4418919fSjohnjiang 				i += hdroom_used;
549*4418919fSjohnjiang 
550*4418919fSjohnjiang 			/* Skip tailroom used by PMD */
551*4418919fSjohnjiang 			if (i == (hdroom + mbuf->data_len))
552*4418919fSjohnjiang 				i += tlroom_used;
553*4418919fSjohnjiang 
554*4418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
555*4418919fSjohnjiang 			if (value != tmp_src_buf[i]) {
556*4418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
557*4418919fSjohnjiang 	"line %u FAILED: OOP src outer mbuf data (0x%x) not as expected (0x%x)",
558*4418919fSjohnjiang 					__LINE__, value, tmp_src_buf[i]);
559*4418919fSjohnjiang 				status = TEST_FAILED;
560*4418919fSjohnjiang 				goto error_exit;
561*4418919fSjohnjiang 			}
562*4418919fSjohnjiang 		}
563*4418919fSjohnjiang 
564*4418919fSjohnjiang 		mbuf = sym_op->m_dst;
565*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
566*4418919fSjohnjiang 			head_unchanged_len = hdroom + sym_op->auth.data.offset;
567*4418919fSjohnjiang 			changed_len = sym_op->auth.data.length;
568*4418919fSjohnjiang 			if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
569*4418919fSjohnjiang 				changed_len += digest_len;
570*4418919fSjohnjiang 		} else {
571*4418919fSjohnjiang 			/* cipher-only */
572*4418919fSjohnjiang 			head_unchanged_len = hdroom +
573*4418919fSjohnjiang 					sym_op->cipher.data.offset;
574*4418919fSjohnjiang 			changed_len = sym_op->cipher.data.length;
575*4418919fSjohnjiang 		}
576*4418919fSjohnjiang 
577*4418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
578*4418919fSjohnjiang 			if (i == head_unchanged_len)
579*4418919fSjohnjiang 				i += changed_len;
580*4418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
581*4418919fSjohnjiang 			if (value != tmp_dst_buf[i]) {
582*4418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
583*4418919fSjohnjiang 				"line %u FAILED: OOP dst outer mbuf data "
584*4418919fSjohnjiang 				"(0x%x) not as expected (0x%x)",
585*4418919fSjohnjiang 				__LINE__, value, tmp_dst_buf[i]);
586*4418919fSjohnjiang 				status = TEST_FAILED;
587*4418919fSjohnjiang 				goto error_exit;
588*4418919fSjohnjiang 			}
589*4418919fSjohnjiang 		}
590*4418919fSjohnjiang 
591*4418919fSjohnjiang 		if (!nb_iterates) {
592*4418919fSjohnjiang 			nb_iterates++;
593*4418919fSjohnjiang 			goto iterate;
594*4418919fSjohnjiang 		}
595*4418919fSjohnjiang 	} else {
596*4418919fSjohnjiang 		/* In-place operation */
597*4418919fSjohnjiang 		struct rte_mbuf *mbuf;
598*4418919fSjohnjiang 		uint8_t value;
599*4418919fSjohnjiang 		uint32_t head_unchanged_len = 0, changed_len = 0;
600*4418919fSjohnjiang 		uint32_t i;
601*4418919fSjohnjiang 		uint32_t hdroom_used = 0, tlroom_used = 0;
602*4418919fSjohnjiang 		uint32_t hdroom = 0;
603*4418919fSjohnjiang 
604*4418919fSjohnjiang 		/*
605*4418919fSjohnjiang 		 * Crypto PMDs specify the headroom & tailroom it would use
606*4418919fSjohnjiang 		 * when processing the crypto operation. PMD is free to modify
607*4418919fSjohnjiang 		 * this space, and so the verification check should skip that
608*4418919fSjohnjiang 		 * block.
609*4418919fSjohnjiang 		 */
610*4418919fSjohnjiang 		hdroom_used = dev_info.min_mbuf_headroom_req;
611*4418919fSjohnjiang 		tlroom_used = dev_info.min_mbuf_tailroom_req;
612*4418919fSjohnjiang 
613*4418919fSjohnjiang 		mbuf = sym_op->m_src;
614*4418919fSjohnjiang 
615*4418919fSjohnjiang 		/* Get headroom */
616*4418919fSjohnjiang 		hdroom = rte_pktmbuf_headroom(mbuf);
617*4418919fSjohnjiang 
618*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
619*4418919fSjohnjiang 			head_unchanged_len = hdroom +
620*4418919fSjohnjiang 					sym_op->cipher.data.offset;
621*4418919fSjohnjiang 			changed_len = sym_op->cipher.data.length;
622*4418919fSjohnjiang 		} else {
623*4418919fSjohnjiang 			/* auth-only */
624*4418919fSjohnjiang 			head_unchanged_len = hdroom +
625*4418919fSjohnjiang 					sym_op->auth.data.offset +
626*4418919fSjohnjiang 					sym_op->auth.data.length;
627*4418919fSjohnjiang 			changed_len = 0;
628*4418919fSjohnjiang 		}
629*4418919fSjohnjiang 
630*4418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
631*4418919fSjohnjiang 			changed_len += digest_len;
632*4418919fSjohnjiang 
633*4418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
634*4418919fSjohnjiang 
635*4418919fSjohnjiang 			/* Skip headroom used by PMD */
636*4418919fSjohnjiang 			if (i == hdroom - hdroom_used)
637*4418919fSjohnjiang 				i += hdroom_used;
638*4418919fSjohnjiang 
639*4418919fSjohnjiang 			if (i == head_unchanged_len)
640*4418919fSjohnjiang 				i += changed_len;
641*4418919fSjohnjiang 
642*4418919fSjohnjiang 			/* Skip tailroom used by PMD */
643*4418919fSjohnjiang 			if (i == (hdroom + mbuf->data_len))
644*4418919fSjohnjiang 				i += tlroom_used;
645*4418919fSjohnjiang 
646*4418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
647*4418919fSjohnjiang 			if (value != tmp_src_buf[i]) {
648*4418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
649*4418919fSjohnjiang 				"line %u FAILED: outer mbuf data (0x%x) "
650*4418919fSjohnjiang 				"not as expected (0x%x)",
651*4418919fSjohnjiang 				__LINE__, value, tmp_src_buf[i]);
652*4418919fSjohnjiang 				status = TEST_FAILED;
653*4418919fSjohnjiang 				goto error_exit;
654*4418919fSjohnjiang 			}
655*4418919fSjohnjiang 		}
656*4418919fSjohnjiang 	}
657*4418919fSjohnjiang 
658*4418919fSjohnjiang 	snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "PASS");
659*4418919fSjohnjiang 
660*4418919fSjohnjiang error_exit:
661*4418919fSjohnjiang 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)) {
662*4418919fSjohnjiang 		if (sess) {
663*4418919fSjohnjiang 			rte_cryptodev_sym_session_clear(dev_id, sess);
664*4418919fSjohnjiang 			rte_cryptodev_sym_session_free(sess);
665*4418919fSjohnjiang 		}
666*4418919fSjohnjiang 		if (cipher_xform)
667*4418919fSjohnjiang 			rte_free(cipher_xform);
668*4418919fSjohnjiang 		if (auth_xform)
669*4418919fSjohnjiang 			rte_free(auth_xform);
670*4418919fSjohnjiang 	}
671*4418919fSjohnjiang 
672*4418919fSjohnjiang 	if (op)
673*4418919fSjohnjiang 		rte_crypto_op_free(op);
674*4418919fSjohnjiang 
675*4418919fSjohnjiang 	if (obuf)
676*4418919fSjohnjiang 		rte_pktmbuf_free(obuf);
677*4418919fSjohnjiang 
678*4418919fSjohnjiang 	if (ibuf)
679*4418919fSjohnjiang 		rte_pktmbuf_free(ibuf);
680*4418919fSjohnjiang 
681*4418919fSjohnjiang 	return status;
682*4418919fSjohnjiang }
683*4418919fSjohnjiang 
684*4418919fSjohnjiang int
685*4418919fSjohnjiang test_blockcipher_all_tests(struct rte_mempool *mbuf_pool,
686*4418919fSjohnjiang 	struct rte_mempool *op_mpool,
687*4418919fSjohnjiang 	struct rte_mempool *sess_mpool,
688*4418919fSjohnjiang 	struct rte_mempool *sess_priv_mpool,
689*4418919fSjohnjiang 	uint8_t dev_id,
690*4418919fSjohnjiang 	int driver_id,
691*4418919fSjohnjiang 	enum blockcipher_test_type test_type)
692*4418919fSjohnjiang {
693*4418919fSjohnjiang 	int status, overall_status = TEST_SUCCESS;
694*4418919fSjohnjiang 	uint32_t i, test_index = 0;
695*4418919fSjohnjiang 	char test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1];
696*4418919fSjohnjiang 	uint32_t n_test_cases = 0;
697*4418919fSjohnjiang 	uint32_t target_pmd_mask = 0;
698*4418919fSjohnjiang 	const struct blockcipher_test_case *tcs = NULL;
699*4418919fSjohnjiang 
700*4418919fSjohnjiang 	int openssl_pmd = rte_cryptodev_driver_id_get(
701*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
702*4418919fSjohnjiang 	int ccp_pmd = rte_cryptodev_driver_id_get(
703*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
704*4418919fSjohnjiang 	int dpaa2_sec_pmd = rte_cryptodev_driver_id_get(
705*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
706*4418919fSjohnjiang 	int dpaa_sec_pmd = rte_cryptodev_driver_id_get(
707*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
708*4418919fSjohnjiang 	int caam_jr_pmd = rte_cryptodev_driver_id_get(
709*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
710*4418919fSjohnjiang 	int scheduler_pmd = rte_cryptodev_driver_id_get(
711*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
712*4418919fSjohnjiang 	int armv8_pmd = rte_cryptodev_driver_id_get(
713*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
714*4418919fSjohnjiang 	int aesni_mb_pmd = rte_cryptodev_driver_id_get(
715*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
716*4418919fSjohnjiang 	int qat_pmd = rte_cryptodev_driver_id_get(
717*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
718*4418919fSjohnjiang 	int mrvl_pmd = rte_cryptodev_driver_id_get(
719*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
720*4418919fSjohnjiang 	int virtio_pmd = rte_cryptodev_driver_id_get(
721*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
722*4418919fSjohnjiang 	int octeontx_pmd = rte_cryptodev_driver_id_get(
723*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
724*4418919fSjohnjiang 	int octeontx2_pmd = rte_cryptodev_driver_id_get(
725*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
726*4418919fSjohnjiang 	int null_pmd = rte_cryptodev_driver_id_get(
727*4418919fSjohnjiang 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
728*4418919fSjohnjiang 	int nitrox_pmd = rte_cryptodev_driver_id_get(
729*4418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
730*4418919fSjohnjiang 
731*4418919fSjohnjiang 	switch (test_type) {
732*4418919fSjohnjiang 	case BLKCIPHER_AES_CHAIN_TYPE:
733*4418919fSjohnjiang 		n_test_cases = sizeof(aes_chain_test_cases) /
734*4418919fSjohnjiang 		sizeof(aes_chain_test_cases[0]);
735*4418919fSjohnjiang 		tcs = aes_chain_test_cases;
736*4418919fSjohnjiang 		break;
737*4418919fSjohnjiang 	case BLKCIPHER_AES_CIPHERONLY_TYPE:
738*4418919fSjohnjiang 		n_test_cases = sizeof(aes_cipheronly_test_cases) /
739*4418919fSjohnjiang 		sizeof(aes_cipheronly_test_cases[0]);
740*4418919fSjohnjiang 		tcs = aes_cipheronly_test_cases;
741*4418919fSjohnjiang 		break;
742*4418919fSjohnjiang 	case BLKCIPHER_AES_DOCSIS_TYPE:
743*4418919fSjohnjiang 		n_test_cases = sizeof(aes_docsis_test_cases) /
744*4418919fSjohnjiang 		sizeof(aes_docsis_test_cases[0]);
745*4418919fSjohnjiang 		tcs = aes_docsis_test_cases;
746*4418919fSjohnjiang 		break;
747*4418919fSjohnjiang 	case BLKCIPHER_3DES_CHAIN_TYPE:
748*4418919fSjohnjiang 		n_test_cases = sizeof(triple_des_chain_test_cases) /
749*4418919fSjohnjiang 		sizeof(triple_des_chain_test_cases[0]);
750*4418919fSjohnjiang 		tcs = triple_des_chain_test_cases;
751*4418919fSjohnjiang 		break;
752*4418919fSjohnjiang 	case BLKCIPHER_3DES_CIPHERONLY_TYPE:
753*4418919fSjohnjiang 		n_test_cases = sizeof(triple_des_cipheronly_test_cases) /
754*4418919fSjohnjiang 		sizeof(triple_des_cipheronly_test_cases[0]);
755*4418919fSjohnjiang 		tcs = triple_des_cipheronly_test_cases;
756*4418919fSjohnjiang 		break;
757*4418919fSjohnjiang 	case BLKCIPHER_DES_CIPHERONLY_TYPE:
758*4418919fSjohnjiang 		n_test_cases = sizeof(des_cipheronly_test_cases) /
759*4418919fSjohnjiang 		sizeof(des_cipheronly_test_cases[0]);
760*4418919fSjohnjiang 		tcs = des_cipheronly_test_cases;
761*4418919fSjohnjiang 		break;
762*4418919fSjohnjiang 	case BLKCIPHER_DES_DOCSIS_TYPE:
763*4418919fSjohnjiang 		n_test_cases = sizeof(des_docsis_test_cases) /
764*4418919fSjohnjiang 		sizeof(des_docsis_test_cases[0]);
765*4418919fSjohnjiang 		tcs = des_docsis_test_cases;
766*4418919fSjohnjiang 		break;
767*4418919fSjohnjiang 	case BLKCIPHER_AUTHONLY_TYPE:
768*4418919fSjohnjiang 		n_test_cases = sizeof(hash_test_cases) /
769*4418919fSjohnjiang 		sizeof(hash_test_cases[0]);
770*4418919fSjohnjiang 		tcs = hash_test_cases;
771*4418919fSjohnjiang 		break;
772*4418919fSjohnjiang 	default:
773*4418919fSjohnjiang 		break;
774*4418919fSjohnjiang 	}
775*4418919fSjohnjiang 
776*4418919fSjohnjiang 	if (driver_id == aesni_mb_pmd)
777*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB;
778*4418919fSjohnjiang 	else if (driver_id == qat_pmd)
779*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_QAT;
780*4418919fSjohnjiang 	else if (driver_id == openssl_pmd)
781*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL;
782*4418919fSjohnjiang 	else if (driver_id == armv8_pmd)
783*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_ARMV8;
784*4418919fSjohnjiang 	else if (driver_id == scheduler_pmd)
785*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_SCHEDULER;
786*4418919fSjohnjiang 	else if (driver_id == dpaa2_sec_pmd)
787*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC;
788*4418919fSjohnjiang 	else if (driver_id == ccp_pmd)
789*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_CCP;
790*4418919fSjohnjiang 	else if (driver_id == dpaa_sec_pmd)
791*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC;
792*4418919fSjohnjiang 	else if (driver_id == caam_jr_pmd)
793*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR;
794*4418919fSjohnjiang 	else if (driver_id == mrvl_pmd)
795*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MVSAM;
796*4418919fSjohnjiang 	else if (driver_id == virtio_pmd)
797*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_VIRTIO;
798*4418919fSjohnjiang 	else if (driver_id == octeontx_pmd)
799*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OCTEONTX;
800*4418919fSjohnjiang 	else if (driver_id == octeontx2_pmd)
801*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OCTEONTX2;
802*4418919fSjohnjiang 	else if (driver_id == null_pmd)
803*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_NULL;
804*4418919fSjohnjiang 	else if (driver_id == nitrox_pmd)
805*4418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_NITROX;
806*4418919fSjohnjiang 	else
807*4418919fSjohnjiang 		TEST_ASSERT(0, "Unrecognized cryptodev type");
808*4418919fSjohnjiang 
809*4418919fSjohnjiang 	for (i = 0; i < n_test_cases; i++) {
810*4418919fSjohnjiang 		const struct blockcipher_test_case *tc = &tcs[i];
811*4418919fSjohnjiang 
812*4418919fSjohnjiang 		if (!(tc->pmd_mask & target_pmd_mask))
813*4418919fSjohnjiang 			continue;
814*4418919fSjohnjiang 
815*4418919fSjohnjiang 		status = test_blockcipher_one_case(tc, mbuf_pool, op_mpool,
816*4418919fSjohnjiang 			sess_mpool, sess_priv_mpool, dev_id, driver_id,
817*4418919fSjohnjiang 			test_msg);
818*4418919fSjohnjiang 
819*4418919fSjohnjiang 		printf("  %u) TestCase %s %s\n", test_index ++,
820*4418919fSjohnjiang 			tc->test_descr, test_msg);
821*4418919fSjohnjiang 
822*4418919fSjohnjiang 		if (status != TEST_SUCCESS) {
823*4418919fSjohnjiang 			if (overall_status == TEST_SUCCESS)
824*4418919fSjohnjiang 				overall_status = status;
825*4418919fSjohnjiang 
826*4418919fSjohnjiang 			if (tc->feature_mask & BLOCKCIPHER_TEST_FEATURE_STOPPER)
827*4418919fSjohnjiang 				break;
828*4418919fSjohnjiang 		}
829*4418919fSjohnjiang 	}
830*4418919fSjohnjiang 
831*4418919fSjohnjiang 	return overall_status;
832*4418919fSjohnjiang }
833