14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2015-2017 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <rte_common.h>
64418919fSjohnjiang #include <rte_hexdump.h>
74418919fSjohnjiang #include <rte_mbuf.h>
84418919fSjohnjiang #include <rte_malloc.h>
94418919fSjohnjiang #include <rte_memcpy.h>
104418919fSjohnjiang #include <rte_pause.h>
114418919fSjohnjiang 
124418919fSjohnjiang #include <rte_crypto.h>
134418919fSjohnjiang #include <rte_cryptodev.h>
144418919fSjohnjiang #include <rte_cryptodev_pmd.h>
154418919fSjohnjiang 
164418919fSjohnjiang #include "test.h"
174418919fSjohnjiang #include "test_cryptodev.h"
184418919fSjohnjiang #include "test_cryptodev_blockcipher.h"
194418919fSjohnjiang #include "test_cryptodev_aes_test_vectors.h"
204418919fSjohnjiang #include "test_cryptodev_des_test_vectors.h"
214418919fSjohnjiang #include "test_cryptodev_hash_test_vectors.h"
224418919fSjohnjiang 
234418919fSjohnjiang static int
244418919fSjohnjiang test_blockcipher_one_case(const struct blockcipher_test_case *t,
254418919fSjohnjiang 	struct rte_mempool *mbuf_pool,
264418919fSjohnjiang 	struct rte_mempool *op_mpool,
274418919fSjohnjiang 	struct rte_mempool *sess_mpool,
284418919fSjohnjiang 	struct rte_mempool *sess_priv_mpool,
294418919fSjohnjiang 	uint8_t dev_id,
304418919fSjohnjiang 	int driver_id,
314418919fSjohnjiang 	char *test_msg)
324418919fSjohnjiang {
334418919fSjohnjiang 	struct rte_mbuf *ibuf = NULL;
344418919fSjohnjiang 	struct rte_mbuf *obuf = NULL;
354418919fSjohnjiang 	struct rte_mbuf *iobuf;
364418919fSjohnjiang 	struct rte_crypto_sym_xform *cipher_xform = NULL;
374418919fSjohnjiang 	struct rte_crypto_sym_xform *auth_xform = NULL;
384418919fSjohnjiang 	struct rte_crypto_sym_xform *init_xform = NULL;
394418919fSjohnjiang 	struct rte_crypto_sym_op *sym_op = NULL;
404418919fSjohnjiang 	struct rte_crypto_op *op = NULL;
414418919fSjohnjiang 	struct rte_cryptodev_info dev_info;
424418919fSjohnjiang 	struct rte_cryptodev_sym_session *sess = NULL;
434418919fSjohnjiang 
444418919fSjohnjiang 	int status = TEST_SUCCESS;
454418919fSjohnjiang 	const struct blockcipher_test_data *tdata = t->test_data;
464418919fSjohnjiang 	uint8_t cipher_key[tdata->cipher_key.len];
474418919fSjohnjiang 	uint8_t auth_key[tdata->auth_key.len];
484418919fSjohnjiang 	uint32_t buf_len = tdata->ciphertext.len;
494418919fSjohnjiang 	uint32_t digest_len = 0;
504418919fSjohnjiang 	char *buf_p = NULL;
514418919fSjohnjiang 	uint8_t src_pattern = 0xa5;
524418919fSjohnjiang 	uint8_t dst_pattern = 0xb6;
534418919fSjohnjiang 	uint8_t tmp_src_buf[MBUF_SIZE];
544418919fSjohnjiang 	uint8_t tmp_dst_buf[MBUF_SIZE];
554418919fSjohnjiang 
564418919fSjohnjiang 	int openssl_pmd = rte_cryptodev_driver_id_get(
574418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
584418919fSjohnjiang 	int ccp_pmd = rte_cryptodev_driver_id_get(
594418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
604418919fSjohnjiang 	int scheduler_pmd = rte_cryptodev_driver_id_get(
614418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
624418919fSjohnjiang 	int armv8_pmd = rte_cryptodev_driver_id_get(
634418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
644418919fSjohnjiang 	int aesni_mb_pmd = rte_cryptodev_driver_id_get(
654418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
664418919fSjohnjiang 	int qat_pmd = rte_cryptodev_driver_id_get(
674418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
684418919fSjohnjiang 	int dpaa2_sec_pmd = rte_cryptodev_driver_id_get(
694418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
704418919fSjohnjiang 	int dpaa_sec_pmd = rte_cryptodev_driver_id_get(
714418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
724418919fSjohnjiang 	int caam_jr_pmd = rte_cryptodev_driver_id_get(
734418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
744418919fSjohnjiang 	int mrvl_pmd = rte_cryptodev_driver_id_get(
754418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
764418919fSjohnjiang 	int virtio_pmd = rte_cryptodev_driver_id_get(
774418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
784418919fSjohnjiang 	int octeontx_pmd = rte_cryptodev_driver_id_get(
794418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
804418919fSjohnjiang 	int octeontx2_pmd = rte_cryptodev_driver_id_get(
814418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
824418919fSjohnjiang 	int null_pmd = rte_cryptodev_driver_id_get(
834418919fSjohnjiang 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
844418919fSjohnjiang 	int nitrox_pmd = rte_cryptodev_driver_id_get(
854418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
864418919fSjohnjiang 
874418919fSjohnjiang 	int nb_segs = 1;
884418919fSjohnjiang 	uint32_t nb_iterates = 0;
894418919fSjohnjiang 
904418919fSjohnjiang 	rte_cryptodev_info_get(dev_id, &dev_info);
914418919fSjohnjiang 
924418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SG) {
934418919fSjohnjiang 		uint64_t feat_flags = dev_info.feature_flags;
944418919fSjohnjiang 		uint64_t oop_flag = RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT;
954418919fSjohnjiang 
96*0c6bd470Sfengbojiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
974418919fSjohnjiang 			if (!(feat_flags & oop_flag)) {
984418919fSjohnjiang 				printf("Device doesn't support out-of-place "
994418919fSjohnjiang 					"scatter-gather in input mbuf. "
1004418919fSjohnjiang 					"Test Skipped.\n");
1014418919fSjohnjiang 				return 0;
1024418919fSjohnjiang 			}
1034418919fSjohnjiang 		} else {
1044418919fSjohnjiang 			if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
1054418919fSjohnjiang 				printf("Device doesn't support in-place "
1064418919fSjohnjiang 					"scatter-gather mbufs. "
1074418919fSjohnjiang 					"Test Skipped.\n");
1084418919fSjohnjiang 				return 0;
1094418919fSjohnjiang 			}
1104418919fSjohnjiang 		}
1114418919fSjohnjiang 
1124418919fSjohnjiang 		nb_segs = 3;
1134418919fSjohnjiang 	}
1144418919fSjohnjiang 
1154418919fSjohnjiang 	if (tdata->cipher_key.len)
1164418919fSjohnjiang 		memcpy(cipher_key, tdata->cipher_key.data,
1174418919fSjohnjiang 			tdata->cipher_key.len);
1184418919fSjohnjiang 	if (tdata->auth_key.len)
1194418919fSjohnjiang 		memcpy(auth_key, tdata->auth_key.data,
1204418919fSjohnjiang 			tdata->auth_key.len);
1214418919fSjohnjiang 
1224418919fSjohnjiang 	if (driver_id == dpaa2_sec_pmd ||
1234418919fSjohnjiang 			driver_id == dpaa_sec_pmd ||
1244418919fSjohnjiang 			driver_id == caam_jr_pmd ||
1254418919fSjohnjiang 			driver_id == qat_pmd ||
1264418919fSjohnjiang 			driver_id == openssl_pmd ||
1274418919fSjohnjiang 			driver_id == armv8_pmd ||
1284418919fSjohnjiang 			driver_id == mrvl_pmd ||
1294418919fSjohnjiang 			driver_id == ccp_pmd ||
1304418919fSjohnjiang 			driver_id == virtio_pmd ||
1314418919fSjohnjiang 			driver_id == octeontx_pmd ||
1324418919fSjohnjiang 			driver_id == octeontx2_pmd ||
1334418919fSjohnjiang 			driver_id == null_pmd ||
1344418919fSjohnjiang 			driver_id == nitrox_pmd) { /* Fall through */
1354418919fSjohnjiang 		digest_len = tdata->digest.len;
1364418919fSjohnjiang 	} else if (driver_id == aesni_mb_pmd ||
1374418919fSjohnjiang 			driver_id == scheduler_pmd) {
1384418919fSjohnjiang 		digest_len = tdata->digest.truncated_len;
1394418919fSjohnjiang 	} else {
1404418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
1414418919fSjohnjiang 			"line %u FAILED: %s",
1424418919fSjohnjiang 			__LINE__, "Unsupported PMD type");
1434418919fSjohnjiang 		status = TEST_FAILED;
1444418919fSjohnjiang 		goto error_exit;
1454418919fSjohnjiang 	}
1464418919fSjohnjiang 
1474418919fSjohnjiang 	/* preparing data */
1484418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
1494418919fSjohnjiang 		buf_len += digest_len;
1504418919fSjohnjiang 
1514418919fSjohnjiang 	/* for contiguous mbuf, nb_segs is 1 */
1524418919fSjohnjiang 	ibuf = create_segmented_mbuf(mbuf_pool,
1534418919fSjohnjiang 			tdata->ciphertext.len, nb_segs, src_pattern);
1544418919fSjohnjiang 	if (ibuf == NULL) {
1554418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
1564418919fSjohnjiang 			"line %u FAILED: %s",
1574418919fSjohnjiang 			__LINE__, "Cannot create source mbuf");
1584418919fSjohnjiang 		status = TEST_FAILED;
1594418919fSjohnjiang 		goto error_exit;
1604418919fSjohnjiang 	}
1614418919fSjohnjiang 
1624418919fSjohnjiang 	/* only encryption requires plaintext.data input,
1634418919fSjohnjiang 	 * decryption/(digest gen)/(digest verify) use ciphertext.data
1644418919fSjohnjiang 	 * to be computed
1654418919fSjohnjiang 	 */
1664418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
1674418919fSjohnjiang 		pktmbuf_write(ibuf, 0, tdata->plaintext.len,
1684418919fSjohnjiang 				tdata->plaintext.data);
1694418919fSjohnjiang 	else
1704418919fSjohnjiang 		pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
1714418919fSjohnjiang 				tdata->ciphertext.data);
1724418919fSjohnjiang 
1734418919fSjohnjiang 	buf_p = rte_pktmbuf_append(ibuf, digest_len);
1744418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
1754418919fSjohnjiang 		rte_memcpy(buf_p, tdata->digest.data, digest_len);
1764418919fSjohnjiang 	else
1774418919fSjohnjiang 		memset(buf_p, 0, digest_len);
1784418919fSjohnjiang 
1794418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
1804418919fSjohnjiang 		obuf = rte_pktmbuf_alloc(mbuf_pool);
1814418919fSjohnjiang 		if (!obuf) {
1824418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
1834418919fSjohnjiang 				"FAILED: %s", __LINE__,
1844418919fSjohnjiang 				"Allocation of rte_mbuf failed");
1854418919fSjohnjiang 			status = TEST_FAILED;
1864418919fSjohnjiang 			goto error_exit;
1874418919fSjohnjiang 		}
1884418919fSjohnjiang 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
1894418919fSjohnjiang 
1904418919fSjohnjiang 		buf_p = rte_pktmbuf_append(obuf, buf_len);
1914418919fSjohnjiang 		if (!buf_p) {
1924418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
1934418919fSjohnjiang 				"FAILED: %s", __LINE__,
1944418919fSjohnjiang 				"No room to append mbuf");
1954418919fSjohnjiang 			status = TEST_FAILED;
1964418919fSjohnjiang 			goto error_exit;
1974418919fSjohnjiang 		}
1984418919fSjohnjiang 		memset(buf_p, 0, buf_len);
1994418919fSjohnjiang 	}
2004418919fSjohnjiang 
2014418919fSjohnjiang 	/* Generate Crypto op data structure */
2024418919fSjohnjiang 	op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2034418919fSjohnjiang 	if (!op) {
2044418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
2054418919fSjohnjiang 			"line %u FAILED: %s",
2064418919fSjohnjiang 			__LINE__, "Failed to allocate symmetric crypto "
2074418919fSjohnjiang 			"operation struct");
2084418919fSjohnjiang 		status = TEST_FAILED;
2094418919fSjohnjiang 		goto error_exit;
2104418919fSjohnjiang 	}
2114418919fSjohnjiang 
2124418919fSjohnjiang 	sym_op = op->sym;
2134418919fSjohnjiang 
2144418919fSjohnjiang iterate:
2154418919fSjohnjiang 	if (nb_iterates) {
2164418919fSjohnjiang 		struct rte_mbuf *tmp_buf = ibuf;
2174418919fSjohnjiang 
2184418919fSjohnjiang 		ibuf = obuf;
2194418919fSjohnjiang 		obuf = tmp_buf;
2204418919fSjohnjiang 
2214418919fSjohnjiang 		rte_pktmbuf_reset(ibuf);
2224418919fSjohnjiang 		rte_pktmbuf_reset(obuf);
2234418919fSjohnjiang 
2244418919fSjohnjiang 		rte_pktmbuf_append(ibuf, tdata->ciphertext.len);
2254418919fSjohnjiang 
2264418919fSjohnjiang 		/* only encryption requires plaintext.data input,
2274418919fSjohnjiang 		 * decryption/(digest gen)/(digest verify) use ciphertext.data
2284418919fSjohnjiang 		 * to be computed
2294418919fSjohnjiang 		 */
2304418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
2314418919fSjohnjiang 			pktmbuf_write(ibuf, 0, tdata->plaintext.len,
2324418919fSjohnjiang 					tdata->plaintext.data);
2334418919fSjohnjiang 		else
2344418919fSjohnjiang 			pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
2354418919fSjohnjiang 					tdata->ciphertext.data);
2364418919fSjohnjiang 
2374418919fSjohnjiang 		buf_p = rte_pktmbuf_append(ibuf, digest_len);
2384418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
2394418919fSjohnjiang 			rte_memcpy(buf_p, tdata->digest.data, digest_len);
2404418919fSjohnjiang 		else
2414418919fSjohnjiang 			memset(buf_p, 0, digest_len);
2424418919fSjohnjiang 
2434418919fSjohnjiang 		memset(obuf->buf_addr, dst_pattern, obuf->buf_len);
2444418919fSjohnjiang 
2454418919fSjohnjiang 		buf_p = rte_pktmbuf_append(obuf, buf_len);
2464418919fSjohnjiang 		if (!buf_p) {
2474418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
2484418919fSjohnjiang 				"FAILED: %s", __LINE__,
2494418919fSjohnjiang 				"No room to append mbuf");
2504418919fSjohnjiang 			status = TEST_FAILED;
2514418919fSjohnjiang 			goto error_exit;
2524418919fSjohnjiang 		}
2534418919fSjohnjiang 		memset(buf_p, 0, buf_len);
2544418919fSjohnjiang 	}
2554418919fSjohnjiang 
2564418919fSjohnjiang 	sym_op->m_src = ibuf;
2574418919fSjohnjiang 
2584418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
2594418919fSjohnjiang 		sym_op->m_dst = obuf;
2604418919fSjohnjiang 		iobuf = obuf;
2614418919fSjohnjiang 	} else {
2624418919fSjohnjiang 		sym_op->m_dst = NULL;
2634418919fSjohnjiang 		iobuf = ibuf;
2644418919fSjohnjiang 	}
2654418919fSjohnjiang 
2664418919fSjohnjiang 	/* sessionless op requires allocate xform using
2674418919fSjohnjiang 	 * rte_crypto_op_sym_xforms_alloc(), otherwise rte_zmalloc()
2684418919fSjohnjiang 	 * is used
2694418919fSjohnjiang 	 */
2704418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
2714418919fSjohnjiang 		uint32_t n_xforms = 0;
2724418919fSjohnjiang 
2734418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
2744418919fSjohnjiang 			n_xforms++;
2754418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
2764418919fSjohnjiang 			n_xforms++;
2774418919fSjohnjiang 
2784418919fSjohnjiang 		if (rte_crypto_op_sym_xforms_alloc(op, n_xforms)
2794418919fSjohnjiang 			== NULL) {
2804418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
2814418919fSjohnjiang 				"FAILED: %s", __LINE__, "Failed to "
2824418919fSjohnjiang 				"allocate space for crypto transforms");
2834418919fSjohnjiang 			status = TEST_FAILED;
2844418919fSjohnjiang 			goto error_exit;
2854418919fSjohnjiang 		}
2864418919fSjohnjiang 	} else {
2874418919fSjohnjiang 		cipher_xform = rte_zmalloc(NULL,
2884418919fSjohnjiang 			sizeof(struct rte_crypto_sym_xform), 0);
2894418919fSjohnjiang 
2904418919fSjohnjiang 		auth_xform = rte_zmalloc(NULL,
2914418919fSjohnjiang 			sizeof(struct rte_crypto_sym_xform), 0);
2924418919fSjohnjiang 
2934418919fSjohnjiang 		if (!cipher_xform || !auth_xform) {
2944418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
2954418919fSjohnjiang 				"FAILED: %s", __LINE__, "Failed to "
2964418919fSjohnjiang 				"allocate memory for crypto transforms");
2974418919fSjohnjiang 			status = TEST_FAILED;
2984418919fSjohnjiang 			goto error_exit;
2994418919fSjohnjiang 		}
3004418919fSjohnjiang 	}
3014418919fSjohnjiang 
3024418919fSjohnjiang 	/* preparing xform, for sessioned op, init_xform is initialized
3034418919fSjohnjiang 	 * here and later as param in rte_cryptodev_sym_session_create() call
3044418919fSjohnjiang 	 */
3054418919fSjohnjiang 	if (t->op_mask == BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN) {
3064418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
3074418919fSjohnjiang 			cipher_xform = op->sym->xform;
3084418919fSjohnjiang 			auth_xform = cipher_xform->next;
3094418919fSjohnjiang 			auth_xform->next = NULL;
3104418919fSjohnjiang 		} else {
3114418919fSjohnjiang 			cipher_xform->next = auth_xform;
3124418919fSjohnjiang 			auth_xform->next = NULL;
3134418919fSjohnjiang 			init_xform = cipher_xform;
3144418919fSjohnjiang 		}
3154418919fSjohnjiang 	} else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC) {
3164418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) {
3174418919fSjohnjiang 			auth_xform = op->sym->xform;
3184418919fSjohnjiang 			cipher_xform = auth_xform->next;
3194418919fSjohnjiang 			cipher_xform->next = NULL;
3204418919fSjohnjiang 		} else {
3214418919fSjohnjiang 			auth_xform->next = cipher_xform;
3224418919fSjohnjiang 			cipher_xform->next = NULL;
3234418919fSjohnjiang 			init_xform = auth_xform;
3244418919fSjohnjiang 		}
3254418919fSjohnjiang 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_ENCRYPT) ||
3264418919fSjohnjiang 			(t->op_mask == BLOCKCIPHER_TEST_OP_DECRYPT)) {
3274418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
3284418919fSjohnjiang 			cipher_xform = op->sym->xform;
3294418919fSjohnjiang 		else
3304418919fSjohnjiang 			init_xform = cipher_xform;
3314418919fSjohnjiang 		cipher_xform->next = NULL;
3324418919fSjohnjiang 	} else if ((t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN) ||
3334418919fSjohnjiang 			(t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY)) {
3344418919fSjohnjiang 		if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)
3354418919fSjohnjiang 			auth_xform = op->sym->xform;
3364418919fSjohnjiang 		else
3374418919fSjohnjiang 			init_xform = auth_xform;
3384418919fSjohnjiang 		auth_xform->next = NULL;
3394418919fSjohnjiang 	} else {
3404418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
3414418919fSjohnjiang 			"line %u FAILED: %s",
3424418919fSjohnjiang 			__LINE__, "Unrecognized operation");
3434418919fSjohnjiang 		status = TEST_FAILED;
3444418919fSjohnjiang 		goto error_exit;
3454418919fSjohnjiang 	}
3464418919fSjohnjiang 
3474418919fSjohnjiang 	/*configure xforms & sym_op cipher and auth data*/
3484418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
3494418919fSjohnjiang 		cipher_xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3504418919fSjohnjiang 		cipher_xform->cipher.algo = tdata->crypto_algo;
3514418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
3524418919fSjohnjiang 			cipher_xform->cipher.op =
3534418919fSjohnjiang 				RTE_CRYPTO_CIPHER_OP_ENCRYPT;
3544418919fSjohnjiang 		else
3554418919fSjohnjiang 			cipher_xform->cipher.op =
3564418919fSjohnjiang 				RTE_CRYPTO_CIPHER_OP_DECRYPT;
3574418919fSjohnjiang 		cipher_xform->cipher.key.data = cipher_key;
3584418919fSjohnjiang 		cipher_xform->cipher.key.length = tdata->cipher_key.len;
3594418919fSjohnjiang 		cipher_xform->cipher.iv.offset = IV_OFFSET;
3604418919fSjohnjiang 		cipher_xform->cipher.iv.length = tdata->iv.len;
3614418919fSjohnjiang 
3624418919fSjohnjiang 		sym_op->cipher.data.offset = tdata->cipher_offset;
3634418919fSjohnjiang 		sym_op->cipher.data.length = tdata->ciphertext.len -
3644418919fSjohnjiang 				tdata->cipher_offset;
3654418919fSjohnjiang 		rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET),
3664418919fSjohnjiang 				tdata->iv.data,
3674418919fSjohnjiang 				tdata->iv.len);
3684418919fSjohnjiang 	}
3694418919fSjohnjiang 
3704418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
3714418919fSjohnjiang 		uint32_t digest_offset = tdata->ciphertext.len;
3724418919fSjohnjiang 
3734418919fSjohnjiang 		auth_xform->type = RTE_CRYPTO_SYM_XFORM_AUTH;
3744418919fSjohnjiang 		auth_xform->auth.algo = tdata->auth_algo;
3754418919fSjohnjiang 		auth_xform->auth.key.length = tdata->auth_key.len;
3764418919fSjohnjiang 		auth_xform->auth.key.data = auth_key;
3774418919fSjohnjiang 		auth_xform->auth.digest_length = digest_len;
3784418919fSjohnjiang 
3794418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
3804418919fSjohnjiang 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
3814418919fSjohnjiang 			sym_op->auth.digest.data = pktmbuf_mtod_offset
3824418919fSjohnjiang 				(iobuf, digest_offset);
3834418919fSjohnjiang 			sym_op->auth.digest.phys_addr =
3844418919fSjohnjiang 				pktmbuf_iova_offset(iobuf,
3854418919fSjohnjiang 					digest_offset);
3864418919fSjohnjiang 		} else {
3874418919fSjohnjiang 			auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
3884418919fSjohnjiang 			sym_op->auth.digest.data = pktmbuf_mtod_offset
3894418919fSjohnjiang 				(sym_op->m_src, digest_offset);
3904418919fSjohnjiang 			sym_op->auth.digest.phys_addr =
3914418919fSjohnjiang 				pktmbuf_iova_offset(sym_op->m_src,
3924418919fSjohnjiang 					digest_offset);
3934418919fSjohnjiang 		}
3944418919fSjohnjiang 
3954418919fSjohnjiang 		sym_op->auth.data.offset = tdata->auth_offset;
3964418919fSjohnjiang 		sym_op->auth.data.length = tdata->ciphertext.len -
3974418919fSjohnjiang 				tdata->auth_offset;
3984418919fSjohnjiang 	}
3994418919fSjohnjiang 
4004418919fSjohnjiang 	/**
4014418919fSjohnjiang 	 * Create session for sessioned op. For mbuf iteration test,
4024418919fSjohnjiang 	 * skip the session creation for the second iteration.
4034418919fSjohnjiang 	 */
4044418919fSjohnjiang 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) &&
4054418919fSjohnjiang 			nb_iterates == 0) {
4064418919fSjohnjiang 		sess = rte_cryptodev_sym_session_create(sess_mpool);
4074418919fSjohnjiang 
4084418919fSjohnjiang 		rte_cryptodev_sym_session_init(dev_id, sess, init_xform,
4094418919fSjohnjiang 				sess_priv_mpool);
4104418919fSjohnjiang 		if (!sess) {
4114418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
4124418919fSjohnjiang 				"FAILED: %s", __LINE__,
4134418919fSjohnjiang 				"Session creation failed");
4144418919fSjohnjiang 			status = TEST_FAILED;
4154418919fSjohnjiang 			goto error_exit;
4164418919fSjohnjiang 		}
4174418919fSjohnjiang 
4184418919fSjohnjiang 		/* attach symmetric crypto session to crypto operations */
4194418919fSjohnjiang 		rte_crypto_op_attach_sym_session(op, sess);
4204418919fSjohnjiang 	}
4214418919fSjohnjiang 
4224418919fSjohnjiang 	debug_hexdump(stdout, "m_src(before):",
4234418919fSjohnjiang 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
4244418919fSjohnjiang 	rte_memcpy(tmp_src_buf, sym_op->m_src->buf_addr,
4254418919fSjohnjiang 						sym_op->m_src->buf_len);
4264418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
4274418919fSjohnjiang 		debug_hexdump(stdout, "m_dst(before):",
4284418919fSjohnjiang 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
4294418919fSjohnjiang 		rte_memcpy(tmp_dst_buf, sym_op->m_dst->buf_addr,
4304418919fSjohnjiang 						sym_op->m_dst->buf_len);
4314418919fSjohnjiang 	}
4324418919fSjohnjiang 
4334418919fSjohnjiang 	/* Process crypto operation */
4344418919fSjohnjiang 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
4354418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
4364418919fSjohnjiang 			"line %u FAILED: %s",
4374418919fSjohnjiang 			__LINE__, "Error sending packet for encryption");
4384418919fSjohnjiang 		status = TEST_FAILED;
4394418919fSjohnjiang 		goto error_exit;
4404418919fSjohnjiang 	}
4414418919fSjohnjiang 
4424418919fSjohnjiang 	op = NULL;
4434418919fSjohnjiang 
4444418919fSjohnjiang 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
4454418919fSjohnjiang 		rte_pause();
4464418919fSjohnjiang 
4474418919fSjohnjiang 	if (!op) {
4484418919fSjohnjiang 		snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
4494418919fSjohnjiang 			"line %u FAILED: %s",
4504418919fSjohnjiang 			__LINE__, "Failed to process sym crypto op");
4514418919fSjohnjiang 		status = TEST_FAILED;
4524418919fSjohnjiang 		goto error_exit;
4534418919fSjohnjiang 	}
4544418919fSjohnjiang 
4554418919fSjohnjiang 	debug_hexdump(stdout, "m_src(after):",
4564418919fSjohnjiang 			sym_op->m_src->buf_addr, sym_op->m_src->buf_len);
4574418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP)
4584418919fSjohnjiang 		debug_hexdump(stdout, "m_dst(after):",
4594418919fSjohnjiang 			sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len);
4604418919fSjohnjiang 
4614418919fSjohnjiang 	/* Verify results */
4624418919fSjohnjiang 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
4634418919fSjohnjiang 		if ((t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) &&
4644418919fSjohnjiang 			(op->status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED))
4654418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
4664418919fSjohnjiang 				"FAILED: Digest verification failed "
4674418919fSjohnjiang 				"(0x%X)", __LINE__, op->status);
4684418919fSjohnjiang 		else
4694418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
4704418919fSjohnjiang 				"FAILED: Operation failed "
4714418919fSjohnjiang 				"(0x%X)", __LINE__, op->status);
4724418919fSjohnjiang 		status = TEST_FAILED;
4734418919fSjohnjiang 		goto error_exit;
4744418919fSjohnjiang 	}
4754418919fSjohnjiang 
4764418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
4774418919fSjohnjiang 		uint8_t buffer[2048];
4784418919fSjohnjiang 		const uint8_t *compare_ref;
4794418919fSjohnjiang 		uint32_t compare_len;
4804418919fSjohnjiang 
4814418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) {
4824418919fSjohnjiang 			compare_ref = tdata->ciphertext.data +
4834418919fSjohnjiang 					tdata->cipher_offset;
4844418919fSjohnjiang 			compare_len = tdata->ciphertext.len -
4854418919fSjohnjiang 					tdata->cipher_offset;
4864418919fSjohnjiang 		} else {
4874418919fSjohnjiang 			compare_ref = tdata->plaintext.data +
4884418919fSjohnjiang 					tdata->cipher_offset;
4894418919fSjohnjiang 			compare_len = tdata->plaintext.len -
4904418919fSjohnjiang 					tdata->cipher_offset;
4914418919fSjohnjiang 		}
4924418919fSjohnjiang 
4934418919fSjohnjiang 		if (memcmp(rte_pktmbuf_read(iobuf, tdata->cipher_offset,
4944418919fSjohnjiang 				compare_len, buffer), compare_ref,
4954418919fSjohnjiang 				compare_len)) {
4964418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
4974418919fSjohnjiang 				"FAILED: %s", __LINE__,
4984418919fSjohnjiang 				"Crypto data not as expected");
4994418919fSjohnjiang 			status = TEST_FAILED;
5004418919fSjohnjiang 			goto error_exit;
5014418919fSjohnjiang 		}
5024418919fSjohnjiang 	}
5034418919fSjohnjiang 
5044418919fSjohnjiang 	if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
5054418919fSjohnjiang 		uint8_t *auth_res = pktmbuf_mtod_offset(iobuf,
5064418919fSjohnjiang 					tdata->ciphertext.len);
5074418919fSjohnjiang 
5084418919fSjohnjiang 		if (memcmp(auth_res, tdata->digest.data, digest_len)) {
5094418919fSjohnjiang 			snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
5104418919fSjohnjiang 				"FAILED: %s", __LINE__, "Generated "
5114418919fSjohnjiang 				"digest data not as expected");
5124418919fSjohnjiang 			status = TEST_FAILED;
5134418919fSjohnjiang 			goto error_exit;
5144418919fSjohnjiang 		}
5154418919fSjohnjiang 	}
5164418919fSjohnjiang 
5174418919fSjohnjiang 	/* The only parts that should have changed in the buffer are
5184418919fSjohnjiang 	 * plaintext/ciphertext and digest.
5194418919fSjohnjiang 	 * In OOP only the dest buffer should change.
5204418919fSjohnjiang 	 */
5214418919fSjohnjiang 	if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) {
5224418919fSjohnjiang 		struct rte_mbuf *mbuf;
5234418919fSjohnjiang 		uint8_t value;
5244418919fSjohnjiang 		uint32_t head_unchanged_len, changed_len = 0;
5254418919fSjohnjiang 		uint32_t i;
5264418919fSjohnjiang 		uint32_t hdroom_used = 0, tlroom_used = 0;
5274418919fSjohnjiang 		uint32_t hdroom = 0;
5284418919fSjohnjiang 
5294418919fSjohnjiang 		mbuf = sym_op->m_src;
5304418919fSjohnjiang 		/*
5314418919fSjohnjiang 		 * Crypto PMDs specify the headroom & tailroom it would use
5324418919fSjohnjiang 		 * when processing the crypto operation. PMD is free to modify
5334418919fSjohnjiang 		 * this space, and so the verification check should skip that
5344418919fSjohnjiang 		 * block.
5354418919fSjohnjiang 		 */
5364418919fSjohnjiang 		hdroom_used = dev_info.min_mbuf_headroom_req;
5374418919fSjohnjiang 		tlroom_used = dev_info.min_mbuf_tailroom_req;
5384418919fSjohnjiang 
5394418919fSjohnjiang 		/* Get headroom */
5404418919fSjohnjiang 		hdroom = rte_pktmbuf_headroom(mbuf);
5414418919fSjohnjiang 
5424418919fSjohnjiang 		head_unchanged_len = mbuf->buf_len;
5434418919fSjohnjiang 
5444418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
5454418919fSjohnjiang 
5464418919fSjohnjiang 			/* Skip headroom used by PMD */
5474418919fSjohnjiang 			if (i == hdroom - hdroom_used)
5484418919fSjohnjiang 				i += hdroom_used;
5494418919fSjohnjiang 
5504418919fSjohnjiang 			/* Skip tailroom used by PMD */
5514418919fSjohnjiang 			if (i == (hdroom + mbuf->data_len))
5524418919fSjohnjiang 				i += tlroom_used;
5534418919fSjohnjiang 
5544418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
5554418919fSjohnjiang 			if (value != tmp_src_buf[i]) {
5564418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
5574418919fSjohnjiang 	"line %u FAILED: OOP src outer mbuf data (0x%x) not as expected (0x%x)",
5584418919fSjohnjiang 					__LINE__, value, tmp_src_buf[i]);
5594418919fSjohnjiang 				status = TEST_FAILED;
5604418919fSjohnjiang 				goto error_exit;
5614418919fSjohnjiang 			}
5624418919fSjohnjiang 		}
5634418919fSjohnjiang 
5644418919fSjohnjiang 		mbuf = sym_op->m_dst;
5654418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) {
5664418919fSjohnjiang 			head_unchanged_len = hdroom + sym_op->auth.data.offset;
5674418919fSjohnjiang 			changed_len = sym_op->auth.data.length;
5684418919fSjohnjiang 			if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
5694418919fSjohnjiang 				changed_len += digest_len;
5704418919fSjohnjiang 		} else {
5714418919fSjohnjiang 			/* cipher-only */
5724418919fSjohnjiang 			head_unchanged_len = hdroom +
5734418919fSjohnjiang 					sym_op->cipher.data.offset;
5744418919fSjohnjiang 			changed_len = sym_op->cipher.data.length;
5754418919fSjohnjiang 		}
5764418919fSjohnjiang 
5774418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
5784418919fSjohnjiang 			if (i == head_unchanged_len)
5794418919fSjohnjiang 				i += changed_len;
5804418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
5814418919fSjohnjiang 			if (value != tmp_dst_buf[i]) {
5824418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
5834418919fSjohnjiang 				"line %u FAILED: OOP dst outer mbuf data "
5844418919fSjohnjiang 				"(0x%x) not as expected (0x%x)",
5854418919fSjohnjiang 				__LINE__, value, tmp_dst_buf[i]);
5864418919fSjohnjiang 				status = TEST_FAILED;
5874418919fSjohnjiang 				goto error_exit;
5884418919fSjohnjiang 			}
5894418919fSjohnjiang 		}
5904418919fSjohnjiang 
5914418919fSjohnjiang 		if (!nb_iterates) {
5924418919fSjohnjiang 			nb_iterates++;
5934418919fSjohnjiang 			goto iterate;
5944418919fSjohnjiang 		}
5954418919fSjohnjiang 	} else {
5964418919fSjohnjiang 		/* In-place operation */
5974418919fSjohnjiang 		struct rte_mbuf *mbuf;
5984418919fSjohnjiang 		uint8_t value;
5994418919fSjohnjiang 		uint32_t head_unchanged_len = 0, changed_len = 0;
6004418919fSjohnjiang 		uint32_t i;
6014418919fSjohnjiang 		uint32_t hdroom_used = 0, tlroom_used = 0;
6024418919fSjohnjiang 		uint32_t hdroom = 0;
6034418919fSjohnjiang 
6044418919fSjohnjiang 		/*
6054418919fSjohnjiang 		 * Crypto PMDs specify the headroom & tailroom it would use
6064418919fSjohnjiang 		 * when processing the crypto operation. PMD is free to modify
6074418919fSjohnjiang 		 * this space, and so the verification check should skip that
6084418919fSjohnjiang 		 * block.
6094418919fSjohnjiang 		 */
6104418919fSjohnjiang 		hdroom_used = dev_info.min_mbuf_headroom_req;
6114418919fSjohnjiang 		tlroom_used = dev_info.min_mbuf_tailroom_req;
6124418919fSjohnjiang 
6134418919fSjohnjiang 		mbuf = sym_op->m_src;
6144418919fSjohnjiang 
6154418919fSjohnjiang 		/* Get headroom */
6164418919fSjohnjiang 		hdroom = rte_pktmbuf_headroom(mbuf);
6174418919fSjohnjiang 
6184418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
6194418919fSjohnjiang 			head_unchanged_len = hdroom +
6204418919fSjohnjiang 					sym_op->cipher.data.offset;
6214418919fSjohnjiang 			changed_len = sym_op->cipher.data.length;
6224418919fSjohnjiang 		} else {
6234418919fSjohnjiang 			/* auth-only */
6244418919fSjohnjiang 			head_unchanged_len = hdroom +
6254418919fSjohnjiang 					sym_op->auth.data.offset +
6264418919fSjohnjiang 					sym_op->auth.data.length;
6274418919fSjohnjiang 			changed_len = 0;
6284418919fSjohnjiang 		}
6294418919fSjohnjiang 
6304418919fSjohnjiang 		if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN)
6314418919fSjohnjiang 			changed_len += digest_len;
6324418919fSjohnjiang 
6334418919fSjohnjiang 		for (i = 0; i < mbuf->buf_len; i++) {
6344418919fSjohnjiang 
6354418919fSjohnjiang 			/* Skip headroom used by PMD */
6364418919fSjohnjiang 			if (i == hdroom - hdroom_used)
6374418919fSjohnjiang 				i += hdroom_used;
6384418919fSjohnjiang 
6394418919fSjohnjiang 			if (i == head_unchanged_len)
6404418919fSjohnjiang 				i += changed_len;
6414418919fSjohnjiang 
6424418919fSjohnjiang 			/* Skip tailroom used by PMD */
6434418919fSjohnjiang 			if (i == (hdroom + mbuf->data_len))
6444418919fSjohnjiang 				i += tlroom_used;
6454418919fSjohnjiang 
6464418919fSjohnjiang 			value = *((uint8_t *)(mbuf->buf_addr)+i);
6474418919fSjohnjiang 			if (value != tmp_src_buf[i]) {
6484418919fSjohnjiang 				snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
6494418919fSjohnjiang 				"line %u FAILED: outer mbuf data (0x%x) "
6504418919fSjohnjiang 				"not as expected (0x%x)",
6514418919fSjohnjiang 				__LINE__, value, tmp_src_buf[i]);
6524418919fSjohnjiang 				status = TEST_FAILED;
6534418919fSjohnjiang 				goto error_exit;
6544418919fSjohnjiang 			}
6554418919fSjohnjiang 		}
6564418919fSjohnjiang 	}
6574418919fSjohnjiang 
6584418919fSjohnjiang 	snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "PASS");
6594418919fSjohnjiang 
6604418919fSjohnjiang error_exit:
6614418919fSjohnjiang 	if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)) {
6624418919fSjohnjiang 		if (sess) {
6634418919fSjohnjiang 			rte_cryptodev_sym_session_clear(dev_id, sess);
6644418919fSjohnjiang 			rte_cryptodev_sym_session_free(sess);
6654418919fSjohnjiang 		}
6664418919fSjohnjiang 		if (cipher_xform)
6674418919fSjohnjiang 			rte_free(cipher_xform);
6684418919fSjohnjiang 		if (auth_xform)
6694418919fSjohnjiang 			rte_free(auth_xform);
6704418919fSjohnjiang 	}
6714418919fSjohnjiang 
6724418919fSjohnjiang 	if (op)
6734418919fSjohnjiang 		rte_crypto_op_free(op);
6744418919fSjohnjiang 
6754418919fSjohnjiang 	if (obuf)
6764418919fSjohnjiang 		rte_pktmbuf_free(obuf);
6774418919fSjohnjiang 
6784418919fSjohnjiang 	if (ibuf)
6794418919fSjohnjiang 		rte_pktmbuf_free(ibuf);
6804418919fSjohnjiang 
6814418919fSjohnjiang 	return status;
6824418919fSjohnjiang }
6834418919fSjohnjiang 
6844418919fSjohnjiang int
6854418919fSjohnjiang test_blockcipher_all_tests(struct rte_mempool *mbuf_pool,
6864418919fSjohnjiang 	struct rte_mempool *op_mpool,
6874418919fSjohnjiang 	struct rte_mempool *sess_mpool,
6884418919fSjohnjiang 	struct rte_mempool *sess_priv_mpool,
6894418919fSjohnjiang 	uint8_t dev_id,
6904418919fSjohnjiang 	int driver_id,
6914418919fSjohnjiang 	enum blockcipher_test_type test_type)
6924418919fSjohnjiang {
6934418919fSjohnjiang 	int status, overall_status = TEST_SUCCESS;
6944418919fSjohnjiang 	uint32_t i, test_index = 0;
6954418919fSjohnjiang 	char test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1];
6964418919fSjohnjiang 	uint32_t n_test_cases = 0;
6974418919fSjohnjiang 	uint32_t target_pmd_mask = 0;
6984418919fSjohnjiang 	const struct blockcipher_test_case *tcs = NULL;
6994418919fSjohnjiang 
7004418919fSjohnjiang 	int openssl_pmd = rte_cryptodev_driver_id_get(
7014418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
7024418919fSjohnjiang 	int ccp_pmd = rte_cryptodev_driver_id_get(
7034418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
7044418919fSjohnjiang 	int dpaa2_sec_pmd = rte_cryptodev_driver_id_get(
7054418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
7064418919fSjohnjiang 	int dpaa_sec_pmd = rte_cryptodev_driver_id_get(
7074418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
7084418919fSjohnjiang 	int caam_jr_pmd = rte_cryptodev_driver_id_get(
7094418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
7104418919fSjohnjiang 	int scheduler_pmd = rte_cryptodev_driver_id_get(
7114418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
7124418919fSjohnjiang 	int armv8_pmd = rte_cryptodev_driver_id_get(
7134418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
7144418919fSjohnjiang 	int aesni_mb_pmd = rte_cryptodev_driver_id_get(
7154418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7164418919fSjohnjiang 	int qat_pmd = rte_cryptodev_driver_id_get(
7174418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
7184418919fSjohnjiang 	int mrvl_pmd = rte_cryptodev_driver_id_get(
7194418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
7204418919fSjohnjiang 	int virtio_pmd = rte_cryptodev_driver_id_get(
7214418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
7224418919fSjohnjiang 	int octeontx_pmd = rte_cryptodev_driver_id_get(
7234418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
7244418919fSjohnjiang 	int octeontx2_pmd = rte_cryptodev_driver_id_get(
7254418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
7264418919fSjohnjiang 	int null_pmd = rte_cryptodev_driver_id_get(
7274418919fSjohnjiang 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
7284418919fSjohnjiang 	int nitrox_pmd = rte_cryptodev_driver_id_get(
7294418919fSjohnjiang 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
7304418919fSjohnjiang 
7314418919fSjohnjiang 	switch (test_type) {
7324418919fSjohnjiang 	case BLKCIPHER_AES_CHAIN_TYPE:
7334418919fSjohnjiang 		n_test_cases = sizeof(aes_chain_test_cases) /
7344418919fSjohnjiang 		sizeof(aes_chain_test_cases[0]);
7354418919fSjohnjiang 		tcs = aes_chain_test_cases;
7364418919fSjohnjiang 		break;
7374418919fSjohnjiang 	case BLKCIPHER_AES_CIPHERONLY_TYPE:
7384418919fSjohnjiang 		n_test_cases = sizeof(aes_cipheronly_test_cases) /
7394418919fSjohnjiang 		sizeof(aes_cipheronly_test_cases[0]);
7404418919fSjohnjiang 		tcs = aes_cipheronly_test_cases;
7414418919fSjohnjiang 		break;
7424418919fSjohnjiang 	case BLKCIPHER_AES_DOCSIS_TYPE:
7434418919fSjohnjiang 		n_test_cases = sizeof(aes_docsis_test_cases) /
7444418919fSjohnjiang 		sizeof(aes_docsis_test_cases[0]);
7454418919fSjohnjiang 		tcs = aes_docsis_test_cases;
7464418919fSjohnjiang 		break;
7474418919fSjohnjiang 	case BLKCIPHER_3DES_CHAIN_TYPE:
7484418919fSjohnjiang 		n_test_cases = sizeof(triple_des_chain_test_cases) /
7494418919fSjohnjiang 		sizeof(triple_des_chain_test_cases[0]);
7504418919fSjohnjiang 		tcs = triple_des_chain_test_cases;
7514418919fSjohnjiang 		break;
7524418919fSjohnjiang 	case BLKCIPHER_3DES_CIPHERONLY_TYPE:
7534418919fSjohnjiang 		n_test_cases = sizeof(triple_des_cipheronly_test_cases) /
7544418919fSjohnjiang 		sizeof(triple_des_cipheronly_test_cases[0]);
7554418919fSjohnjiang 		tcs = triple_des_cipheronly_test_cases;
7564418919fSjohnjiang 		break;
7574418919fSjohnjiang 	case BLKCIPHER_DES_CIPHERONLY_TYPE:
7584418919fSjohnjiang 		n_test_cases = sizeof(des_cipheronly_test_cases) /
7594418919fSjohnjiang 		sizeof(des_cipheronly_test_cases[0]);
7604418919fSjohnjiang 		tcs = des_cipheronly_test_cases;
7614418919fSjohnjiang 		break;
7624418919fSjohnjiang 	case BLKCIPHER_DES_DOCSIS_TYPE:
7634418919fSjohnjiang 		n_test_cases = sizeof(des_docsis_test_cases) /
7644418919fSjohnjiang 		sizeof(des_docsis_test_cases[0]);
7654418919fSjohnjiang 		tcs = des_docsis_test_cases;
7664418919fSjohnjiang 		break;
7674418919fSjohnjiang 	case BLKCIPHER_AUTHONLY_TYPE:
7684418919fSjohnjiang 		n_test_cases = sizeof(hash_test_cases) /
7694418919fSjohnjiang 		sizeof(hash_test_cases[0]);
7704418919fSjohnjiang 		tcs = hash_test_cases;
7714418919fSjohnjiang 		break;
7724418919fSjohnjiang 	default:
7734418919fSjohnjiang 		break;
7744418919fSjohnjiang 	}
7754418919fSjohnjiang 
7764418919fSjohnjiang 	if (driver_id == aesni_mb_pmd)
7774418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB;
7784418919fSjohnjiang 	else if (driver_id == qat_pmd)
7794418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_QAT;
7804418919fSjohnjiang 	else if (driver_id == openssl_pmd)
7814418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL;
7824418919fSjohnjiang 	else if (driver_id == armv8_pmd)
7834418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_ARMV8;
7844418919fSjohnjiang 	else if (driver_id == scheduler_pmd)
7854418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_SCHEDULER;
7864418919fSjohnjiang 	else if (driver_id == dpaa2_sec_pmd)
7874418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_DPAA2_SEC;
7884418919fSjohnjiang 	else if (driver_id == ccp_pmd)
7894418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_CCP;
7904418919fSjohnjiang 	else if (driver_id == dpaa_sec_pmd)
7914418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_DPAA_SEC;
7924418919fSjohnjiang 	else if (driver_id == caam_jr_pmd)
7934418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_CAAM_JR;
7944418919fSjohnjiang 	else if (driver_id == mrvl_pmd)
7954418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MVSAM;
7964418919fSjohnjiang 	else if (driver_id == virtio_pmd)
7974418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_VIRTIO;
7984418919fSjohnjiang 	else if (driver_id == octeontx_pmd)
7994418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OCTEONTX;
8004418919fSjohnjiang 	else if (driver_id == octeontx2_pmd)
8014418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OCTEONTX2;
8024418919fSjohnjiang 	else if (driver_id == null_pmd)
8034418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_NULL;
8044418919fSjohnjiang 	else if (driver_id == nitrox_pmd)
8054418919fSjohnjiang 		target_pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_NITROX;
8064418919fSjohnjiang 	else
8074418919fSjohnjiang 		TEST_ASSERT(0, "Unrecognized cryptodev type");
8084418919fSjohnjiang 
8094418919fSjohnjiang 	for (i = 0; i < n_test_cases; i++) {
8104418919fSjohnjiang 		const struct blockcipher_test_case *tc = &tcs[i];
8114418919fSjohnjiang 
8124418919fSjohnjiang 		if (!(tc->pmd_mask & target_pmd_mask))
8134418919fSjohnjiang 			continue;
8144418919fSjohnjiang 
8154418919fSjohnjiang 		status = test_blockcipher_one_case(tc, mbuf_pool, op_mpool,
8164418919fSjohnjiang 			sess_mpool, sess_priv_mpool, dev_id, driver_id,
8174418919fSjohnjiang 			test_msg);
8184418919fSjohnjiang 
8194418919fSjohnjiang 		printf("  %u) TestCase %s %s\n", test_index ++,
8204418919fSjohnjiang 			tc->test_descr, test_msg);
8214418919fSjohnjiang 
8224418919fSjohnjiang 		if (status != TEST_SUCCESS) {
8234418919fSjohnjiang 			if (overall_status == TEST_SUCCESS)
8244418919fSjohnjiang 				overall_status = status;
8254418919fSjohnjiang 
8264418919fSjohnjiang 			if (tc->feature_mask & BLOCKCIPHER_TEST_FEATURE_STOPPER)
8274418919fSjohnjiang 				break;
8284418919fSjohnjiang 		}
8294418919fSjohnjiang 	}
8304418919fSjohnjiang 
8314418919fSjohnjiang 	return overall_status;
8324418919fSjohnjiang }
833