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