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