1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2a9de470cSBruce Richardson * Copyright(c) 2015-2017 Intel Corporation 3a9de470cSBruce Richardson */ 4a9de470cSBruce Richardson 5a9de470cSBruce Richardson #include <rte_common.h> 6a9de470cSBruce Richardson #include <rte_hexdump.h> 7a9de470cSBruce Richardson #include <rte_mbuf.h> 8a9de470cSBruce Richardson #include <rte_malloc.h> 9a9de470cSBruce Richardson #include <rte_memcpy.h> 10a9de470cSBruce Richardson #include <rte_pause.h> 11a9de470cSBruce Richardson 12a9de470cSBruce Richardson #include <rte_crypto.h> 13a9de470cSBruce Richardson #include <rte_cryptodev.h> 14a9de470cSBruce Richardson 15a9de470cSBruce Richardson #include "test.h" 16a9de470cSBruce Richardson #include "test_cryptodev.h" 17a9de470cSBruce Richardson #include "test_cryptodev_blockcipher.h" 18a9de470cSBruce Richardson #include "test_cryptodev_aes_test_vectors.h" 19a9de470cSBruce Richardson #include "test_cryptodev_des_test_vectors.h" 20a9de470cSBruce Richardson #include "test_cryptodev_hash_test_vectors.h" 211daecf63SSunyang Wu #include "test_cryptodev_sm4_test_vectors.h" 22a9de470cSBruce Richardson 23a9de470cSBruce Richardson static int 2493982b21SPablo de Lara verify_algo_support(const struct blockcipher_test_case *t, 2593982b21SPablo de Lara const uint8_t dev_id, const uint32_t digest_len) 2693982b21SPablo de Lara { 2793982b21SPablo de Lara int ret = 0; 2893982b21SPablo de Lara const struct blockcipher_test_data *tdata = t->test_data; 2993982b21SPablo de Lara struct rte_cryptodev_sym_capability_idx cap_idx; 3093982b21SPablo de Lara const struct rte_cryptodev_symmetric_capability *capability; 3193982b21SPablo de Lara 3293982b21SPablo de Lara if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) { 3393982b21SPablo de Lara cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3493982b21SPablo de Lara cap_idx.algo.cipher = tdata->crypto_algo; 3593982b21SPablo de Lara capability = rte_cryptodev_sym_capability_get(dev_id, &cap_idx); 3693982b21SPablo de Lara if (capability == NULL) 3793982b21SPablo de Lara return -1; 3893982b21SPablo de Lara 39d5728a5aSShiri Kuzin if (cap_idx.algo.cipher != RTE_CRYPTO_CIPHER_NULL && 40d5728a5aSShiri Kuzin !(t->test_data->wrapped_key)) 4193982b21SPablo de Lara ret = rte_cryptodev_sym_capability_check_cipher(capability, 4293982b21SPablo de Lara tdata->cipher_key.len, 4393982b21SPablo de Lara tdata->iv.len); 4493982b21SPablo de Lara if (ret != 0) 4593982b21SPablo de Lara return -1; 4693982b21SPablo de Lara } 4793982b21SPablo de Lara 4893982b21SPablo de Lara if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) { 4993982b21SPablo de Lara cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5093982b21SPablo de Lara cap_idx.algo.auth = tdata->auth_algo; 5193982b21SPablo de Lara capability = rte_cryptodev_sym_capability_get(dev_id, &cap_idx); 5293982b21SPablo de Lara if (capability == NULL) 5393982b21SPablo de Lara return -1; 5493982b21SPablo de Lara 5593982b21SPablo de Lara if (cap_idx.algo.auth != RTE_CRYPTO_AUTH_NULL) 5693982b21SPablo de Lara ret = rte_cryptodev_sym_capability_check_auth(capability, 5793982b21SPablo de Lara tdata->auth_key.len, 5893982b21SPablo de Lara digest_len, 5993982b21SPablo de Lara 0); 6093982b21SPablo de Lara if (ret != 0) 6193982b21SPablo de Lara return -1; 6293982b21SPablo de Lara } 6393982b21SPablo de Lara 6493982b21SPablo de Lara return 0; 6593982b21SPablo de Lara } 6693982b21SPablo de Lara 6793982b21SPablo de Lara static int 68a9de470cSBruce Richardson test_blockcipher_one_case(const struct blockcipher_test_case *t, 69a9de470cSBruce Richardson struct rte_mempool *mbuf_pool, 70a9de470cSBruce Richardson struct rte_mempool *op_mpool, 71a9de470cSBruce Richardson struct rte_mempool *sess_mpool, 72a9de470cSBruce Richardson uint8_t dev_id, 73a9de470cSBruce Richardson char *test_msg) 74a9de470cSBruce Richardson { 75a9de470cSBruce Richardson struct rte_mbuf *ibuf = NULL; 76a9de470cSBruce Richardson struct rte_mbuf *obuf = NULL; 77a9de470cSBruce Richardson struct rte_mbuf *iobuf; 78a9de470cSBruce Richardson struct rte_crypto_sym_xform *cipher_xform = NULL; 79a9de470cSBruce Richardson struct rte_crypto_sym_xform *auth_xform = NULL; 80a9de470cSBruce Richardson struct rte_crypto_sym_xform *init_xform = NULL; 81a9de470cSBruce Richardson struct rte_crypto_sym_op *sym_op = NULL; 82a9de470cSBruce Richardson struct rte_crypto_op *op = NULL; 83a9de470cSBruce Richardson struct rte_cryptodev_info dev_info; 842a440d6aSAkhil Goyal void *sess = NULL; 85a9de470cSBruce Richardson 86a9de470cSBruce Richardson int status = TEST_SUCCESS; 87a9de470cSBruce Richardson const struct blockcipher_test_data *tdata = t->test_data; 88a9de470cSBruce Richardson uint8_t cipher_key[tdata->cipher_key.len]; 89a9de470cSBruce Richardson uint8_t auth_key[tdata->auth_key.len]; 90a9de470cSBruce Richardson uint32_t buf_len = tdata->ciphertext.len; 91b4c469ecSPablo de Lara uint32_t digest_len = tdata->digest.len; 92a9de470cSBruce Richardson char *buf_p = NULL; 93a9de470cSBruce Richardson uint8_t src_pattern = 0xa5; 94a9de470cSBruce Richardson uint8_t dst_pattern = 0xb6; 95a9de470cSBruce Richardson uint8_t tmp_src_buf[MBUF_SIZE]; 96a9de470cSBruce Richardson uint8_t tmp_dst_buf[MBUF_SIZE]; 976356c286STejasree Kondoj uint32_t pad_len; 98a9de470cSBruce Richardson 9963e1fbc3SCiara Power int nb_segs_in = 1; 10063e1fbc3SCiara Power int nb_segs_out = 1; 10163e1fbc3SCiara Power uint64_t sgl_type = t->sgl_flag; 1025e73a1f8SFan Zhang uint32_t nb_iterates = 0; 103a9de470cSBruce Richardson 104a9de470cSBruce Richardson rte_cryptodev_info_get(dev_id, &dev_info); 105a9de470cSBruce Richardson uint64_t feat_flags = dev_info.feature_flags; 106afcfa2fdSPablo de Lara 107afcfa2fdSPablo de Lara if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 108afcfa2fdSPablo de Lara if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 109bf5c7112SCiara Power printf("Device doesn't support sessionless operations " 110afcfa2fdSPablo de Lara "Test Skipped.\n"); 111afcfa2fdSPablo de Lara snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 112afcfa2fdSPablo de Lara "SKIPPED"); 113cf43d9d0SAkhil Goyal return TEST_SKIPPED; 114afcfa2fdSPablo de Lara } 115afcfa2fdSPablo de Lara } 1166356c286STejasree Kondoj if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_DIGEST_ENCRYPTED) { 1176356c286STejasree Kondoj if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 1186356c286STejasree Kondoj printf("Device doesn't support encrypted digest " 1196356c286STejasree Kondoj "Test Skipped.\n"); 1206356c286STejasree Kondoj snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 1216356c286STejasree Kondoj "SKIPPED"); 1226356c286STejasree Kondoj return TEST_SKIPPED; 1236356c286STejasree Kondoj } 1246356c286STejasree Kondoj } 125afcfa2fdSPablo de Lara if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SG) { 12663e1fbc3SCiara Power if (sgl_type == 0) { 12763e1fbc3SCiara Power if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) 12863e1fbc3SCiara Power sgl_type = RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT; 12963e1fbc3SCiara Power else 13063e1fbc3SCiara Power sgl_type = RTE_CRYPTODEV_FF_IN_PLACE_SGL; 13163e1fbc3SCiara Power } 132a9de470cSBruce Richardson 13363e1fbc3SCiara Power if (!(feat_flags & sgl_type)) { 13463e1fbc3SCiara Power printf("Device doesn't support scatter-gather type." 135a9de470cSBruce Richardson " Test Skipped.\n"); 13693982b21SPablo de Lara snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 13793982b21SPablo de Lara "SKIPPED"); 138cf43d9d0SAkhil Goyal return TEST_SKIPPED; 139a9de470cSBruce Richardson } 14063e1fbc3SCiara Power 14163e1fbc3SCiara Power if (sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT || 14263e1fbc3SCiara Power sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT || 14363e1fbc3SCiara Power sgl_type == RTE_CRYPTODEV_FF_IN_PLACE_SGL) 14463e1fbc3SCiara Power nb_segs_in = t->sgl_segs == 0 ? 3 : t->sgl_segs; 14563e1fbc3SCiara Power 14663e1fbc3SCiara Power if (sgl_type == RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT || 14763e1fbc3SCiara Power sgl_type == RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT) 14863e1fbc3SCiara Power nb_segs_out = t->sgl_segs == 0 ? 3 : t->sgl_segs; 149a9de470cSBruce Richardson } 150a9de470cSBruce Richardson 151d5728a5aSShiri Kuzin if (!!(feat_flags & RTE_CRYPTODEV_FF_CIPHER_WRAPPED_KEY) ^ 152d5728a5aSShiri Kuzin tdata->wrapped_key) { 153d5728a5aSShiri Kuzin snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 154d5728a5aSShiri Kuzin "SKIPPED"); 155d5728a5aSShiri Kuzin return TEST_SKIPPED; 156d5728a5aSShiri Kuzin } 157a9de470cSBruce Richardson 1584868f659SFan Zhang if (global_api_test_type == CRYPTODEV_RAW_API_TEST && 1594868f659SFan Zhang !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)) { 1604868f659SFan Zhang printf("Device doesn't support raw data-path APIs. " 1614868f659SFan Zhang "Test Skipped.\n"); 1624868f659SFan Zhang snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED"); 1634868f659SFan Zhang return TEST_SKIPPED; 1644868f659SFan Zhang } 1654868f659SFan Zhang 16655be2162SPablo de Lara if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) { 16755be2162SPablo de Lara uint64_t oop_flags = RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT | 16855be2162SPablo de Lara RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT | 16955be2162SPablo de Lara RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT | 17055be2162SPablo de Lara RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT; 17155be2162SPablo de Lara if (!(feat_flags & oop_flags)) { 17255be2162SPablo de Lara printf("Device doesn't support out-of-place operations." 17355be2162SPablo de Lara "Test Skipped.\n"); 17455be2162SPablo de Lara snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 17555be2162SPablo de Lara "SKIPPED"); 176cf43d9d0SAkhil Goyal return TEST_SKIPPED; 17755be2162SPablo de Lara } 1784868f659SFan Zhang if (global_api_test_type == CRYPTODEV_RAW_API_TEST) { 1794868f659SFan Zhang printf("Raw Data Path APIs do not support OOP, " 1804868f659SFan Zhang "Test Skipped.\n"); 1814868f659SFan Zhang snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED"); 182085f128aSCiara Power status = TEST_SKIPPED; 1834868f659SFan Zhang goto error_exit; 1844868f659SFan Zhang } 18555be2162SPablo de Lara } 18655be2162SPablo de Lara 187a9de470cSBruce Richardson if (tdata->cipher_key.len) 188a9de470cSBruce Richardson memcpy(cipher_key, tdata->cipher_key.data, 189a9de470cSBruce Richardson tdata->cipher_key.len); 190a9de470cSBruce Richardson if (tdata->auth_key.len) 191a9de470cSBruce Richardson memcpy(auth_key, tdata->auth_key.data, 192a9de470cSBruce Richardson tdata->auth_key.len); 193a9de470cSBruce Richardson 19493982b21SPablo de Lara /* Check if PMD is capable of performing that test */ 19593982b21SPablo de Lara if (verify_algo_support(t, dev_id, digest_len) < 0) { 19693982b21SPablo de Lara RTE_LOG(DEBUG, USER1, 19793982b21SPablo de Lara "Device does not support this algorithm." 19893982b21SPablo de Lara "Test Skipped.\n"); 19993982b21SPablo de Lara snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED"); 200cf43d9d0SAkhil Goyal return TEST_SKIPPED; 20193982b21SPablo de Lara } 20293982b21SPablo de Lara 203a9de470cSBruce Richardson /* preparing data */ 204a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) 205a9de470cSBruce Richardson buf_len += digest_len; 206a9de470cSBruce Richardson 2076356c286STejasree Kondoj pad_len = RTE_ALIGN(buf_len, 16) - buf_len; 2086356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 2096356c286STejasree Kondoj buf_len += pad_len; 2106356c286STejasree Kondoj 211a9de470cSBruce Richardson /* for contiguous mbuf, nb_segs is 1 */ 212a9de470cSBruce Richardson ibuf = create_segmented_mbuf(mbuf_pool, 21363e1fbc3SCiara Power tdata->ciphertext.len, nb_segs_in, src_pattern); 214a9de470cSBruce Richardson if (ibuf == NULL) { 215a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 216a9de470cSBruce Richardson "line %u FAILED: %s", 217a9de470cSBruce Richardson __LINE__, "Cannot create source mbuf"); 218a9de470cSBruce Richardson status = TEST_FAILED; 219a9de470cSBruce Richardson goto error_exit; 220a9de470cSBruce Richardson } 221a9de470cSBruce Richardson 222a9de470cSBruce Richardson /* only encryption requires plaintext.data input, 223a9de470cSBruce Richardson * decryption/(digest gen)/(digest verify) use ciphertext.data 224a9de470cSBruce Richardson * to be computed 225a9de470cSBruce Richardson */ 226a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) 227a9de470cSBruce Richardson pktmbuf_write(ibuf, 0, tdata->plaintext.len, 228a9de470cSBruce Richardson tdata->plaintext.data); 229a9de470cSBruce Richardson else 230a9de470cSBruce Richardson pktmbuf_write(ibuf, 0, tdata->ciphertext.len, 231a9de470cSBruce Richardson tdata->ciphertext.data); 232a9de470cSBruce Richardson 233a9de470cSBruce Richardson buf_p = rte_pktmbuf_append(ibuf, digest_len); 234a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) 2356356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 2366356c286STejasree Kondoj rte_memcpy(buf_p, 2376356c286STejasree Kondoj tdata->ciphertext.data + tdata->ciphertext.len, 2386356c286STejasree Kondoj digest_len); 2396356c286STejasree Kondoj else 240a9de470cSBruce Richardson rte_memcpy(buf_p, tdata->digest.data, digest_len); 241a9de470cSBruce Richardson else 242a9de470cSBruce Richardson memset(buf_p, 0, digest_len); 2436356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) { 2446356c286STejasree Kondoj buf_p = rte_pktmbuf_append(ibuf, pad_len); 2456356c286STejasree Kondoj if (!buf_p) { 2466356c286STejasree Kondoj snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 2476356c286STejasree Kondoj "FAILED: %s", __LINE__, 2486356c286STejasree Kondoj "No room to append mbuf"); 2496356c286STejasree Kondoj status = TEST_FAILED; 2506356c286STejasree Kondoj goto error_exit; 2516356c286STejasree Kondoj } 2526356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) { 2536356c286STejasree Kondoj const uint8_t *temp_p = tdata->ciphertext.data + 2546356c286STejasree Kondoj tdata->ciphertext.len + 2556356c286STejasree Kondoj digest_len; 2566356c286STejasree Kondoj rte_memcpy(buf_p, temp_p, pad_len); 2576356c286STejasree Kondoj } else 2586356c286STejasree Kondoj memset(buf_p, 0xa5, pad_len); 2596356c286STejasree Kondoj } 260a9de470cSBruce Richardson 261a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) { 26263e1fbc3SCiara Power obuf = create_segmented_mbuf(mbuf_pool, 26363e1fbc3SCiara Power tdata->ciphertext.len, nb_segs_out, dst_pattern); 264a9de470cSBruce Richardson if (!obuf) { 265a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 266a9de470cSBruce Richardson "FAILED: %s", __LINE__, 267a9de470cSBruce Richardson "Allocation of rte_mbuf failed"); 268a9de470cSBruce Richardson status = TEST_FAILED; 269a9de470cSBruce Richardson goto error_exit; 270a9de470cSBruce Richardson } 271a9de470cSBruce Richardson memset(obuf->buf_addr, dst_pattern, obuf->buf_len); 272a9de470cSBruce Richardson 2730e51e342SGagandeep Singh if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 2746356c286STejasree Kondoj buf_p = rte_pktmbuf_append(obuf, buf_len + pad_len); 2750e51e342SGagandeep Singh else 2760e51e342SGagandeep Singh buf_p = rte_pktmbuf_append(obuf, buf_len); 277a9de470cSBruce Richardson if (!buf_p) { 278a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 279a9de470cSBruce Richardson "FAILED: %s", __LINE__, 280a9de470cSBruce Richardson "No room to append mbuf"); 281a9de470cSBruce Richardson status = TEST_FAILED; 282a9de470cSBruce Richardson goto error_exit; 283a9de470cSBruce Richardson } 284a9de470cSBruce Richardson memset(buf_p, 0, buf_len); 285a9de470cSBruce Richardson } 286a9de470cSBruce Richardson 287a9de470cSBruce Richardson /* Generate Crypto op data structure */ 288a9de470cSBruce Richardson op = rte_crypto_op_alloc(op_mpool, RTE_CRYPTO_OP_TYPE_SYMMETRIC); 289a9de470cSBruce Richardson if (!op) { 290a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 291a9de470cSBruce Richardson "line %u FAILED: %s", 292a9de470cSBruce Richardson __LINE__, "Failed to allocate symmetric crypto " 293a9de470cSBruce Richardson "operation struct"); 294a9de470cSBruce Richardson status = TEST_FAILED; 295a9de470cSBruce Richardson goto error_exit; 296a9de470cSBruce Richardson } 297a9de470cSBruce Richardson 298a9de470cSBruce Richardson sym_op = op->sym; 299a9de470cSBruce Richardson 3005e73a1f8SFan Zhang iterate: 3015e73a1f8SFan Zhang if (nb_iterates) { 3025e73a1f8SFan Zhang struct rte_mbuf *tmp_buf = ibuf; 3035e73a1f8SFan Zhang 3045e73a1f8SFan Zhang ibuf = obuf; 3055e73a1f8SFan Zhang obuf = tmp_buf; 3065e73a1f8SFan Zhang 3075e73a1f8SFan Zhang rte_pktmbuf_reset(ibuf); 3085e73a1f8SFan Zhang rte_pktmbuf_reset(obuf); 3095e73a1f8SFan Zhang 3105e73a1f8SFan Zhang rte_pktmbuf_append(ibuf, tdata->ciphertext.len); 3115e73a1f8SFan Zhang 3125e73a1f8SFan Zhang /* only encryption requires plaintext.data input, 3135e73a1f8SFan Zhang * decryption/(digest gen)/(digest verify) use ciphertext.data 3145e73a1f8SFan Zhang * to be computed 3155e73a1f8SFan Zhang */ 3165e73a1f8SFan Zhang if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) 3175e73a1f8SFan Zhang pktmbuf_write(ibuf, 0, tdata->plaintext.len, 3185e73a1f8SFan Zhang tdata->plaintext.data); 3195e73a1f8SFan Zhang else 3205e73a1f8SFan Zhang pktmbuf_write(ibuf, 0, tdata->ciphertext.len, 3215e73a1f8SFan Zhang tdata->ciphertext.data); 3225e73a1f8SFan Zhang 3235e73a1f8SFan Zhang buf_p = rte_pktmbuf_append(ibuf, digest_len); 3245e73a1f8SFan Zhang if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) 3255e73a1f8SFan Zhang rte_memcpy(buf_p, tdata->digest.data, digest_len); 3265e73a1f8SFan Zhang else 3275e73a1f8SFan Zhang memset(buf_p, 0, digest_len); 3285e73a1f8SFan Zhang 3295e73a1f8SFan Zhang memset(obuf->buf_addr, dst_pattern, obuf->buf_len); 3305e73a1f8SFan Zhang 3315e73a1f8SFan Zhang buf_p = rte_pktmbuf_append(obuf, buf_len); 3325e73a1f8SFan Zhang if (!buf_p) { 3335e73a1f8SFan Zhang snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 3345e73a1f8SFan Zhang "FAILED: %s", __LINE__, 3355e73a1f8SFan Zhang "No room to append mbuf"); 3365e73a1f8SFan Zhang status = TEST_FAILED; 3375e73a1f8SFan Zhang goto error_exit; 3385e73a1f8SFan Zhang } 3395e73a1f8SFan Zhang memset(buf_p, 0, buf_len); 3405e73a1f8SFan Zhang } 3415e73a1f8SFan Zhang 342a9de470cSBruce Richardson sym_op->m_src = ibuf; 343a9de470cSBruce Richardson 344a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) { 345a9de470cSBruce Richardson sym_op->m_dst = obuf; 346a9de470cSBruce Richardson iobuf = obuf; 347a9de470cSBruce Richardson } else { 348a9de470cSBruce Richardson sym_op->m_dst = NULL; 349a9de470cSBruce Richardson iobuf = ibuf; 350a9de470cSBruce Richardson } 351a9de470cSBruce Richardson 352a9de470cSBruce Richardson /* sessionless op requires allocate xform using 353a9de470cSBruce Richardson * rte_crypto_op_sym_xforms_alloc(), otherwise rte_zmalloc() 354a9de470cSBruce Richardson * is used 355a9de470cSBruce Richardson */ 356a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 357a9de470cSBruce Richardson uint32_t n_xforms = 0; 358a9de470cSBruce Richardson 359a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) 360a9de470cSBruce Richardson n_xforms++; 361a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) 362a9de470cSBruce Richardson n_xforms++; 363a9de470cSBruce Richardson 364a9de470cSBruce Richardson if (rte_crypto_op_sym_xforms_alloc(op, n_xforms) 365a9de470cSBruce Richardson == NULL) { 366a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 367a9de470cSBruce Richardson "FAILED: %s", __LINE__, "Failed to " 368a9de470cSBruce Richardson "allocate space for crypto transforms"); 369a9de470cSBruce Richardson status = TEST_FAILED; 370a9de470cSBruce Richardson goto error_exit; 371a9de470cSBruce Richardson } 372a9de470cSBruce Richardson } else { 373a9de470cSBruce Richardson cipher_xform = rte_zmalloc(NULL, 374a9de470cSBruce Richardson sizeof(struct rte_crypto_sym_xform), 0); 375a9de470cSBruce Richardson 376a9de470cSBruce Richardson auth_xform = rte_zmalloc(NULL, 377a9de470cSBruce Richardson sizeof(struct rte_crypto_sym_xform), 0); 378a9de470cSBruce Richardson 379a9de470cSBruce Richardson if (!cipher_xform || !auth_xform) { 380a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 381a9de470cSBruce Richardson "FAILED: %s", __LINE__, "Failed to " 382a9de470cSBruce Richardson "allocate memory for crypto transforms"); 383a9de470cSBruce Richardson status = TEST_FAILED; 384a9de470cSBruce Richardson goto error_exit; 385a9de470cSBruce Richardson } 386a9de470cSBruce Richardson } 387a9de470cSBruce Richardson 388a9de470cSBruce Richardson /* preparing xform, for sessioned op, init_xform is initialized 389a9de470cSBruce Richardson * here and later as param in rte_cryptodev_sym_session_create() call 390a9de470cSBruce Richardson */ 391a9de470cSBruce Richardson if (t->op_mask == BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN) { 392a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 393a9de470cSBruce Richardson cipher_xform = op->sym->xform; 394a9de470cSBruce Richardson auth_xform = cipher_xform->next; 395a9de470cSBruce Richardson auth_xform->next = NULL; 396a9de470cSBruce Richardson } else { 397a9de470cSBruce Richardson cipher_xform->next = auth_xform; 398a9de470cSBruce Richardson auth_xform->next = NULL; 399a9de470cSBruce Richardson init_xform = cipher_xform; 400a9de470cSBruce Richardson } 401a9de470cSBruce Richardson } else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC) { 402a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 403a9de470cSBruce Richardson auth_xform = op->sym->xform; 404a9de470cSBruce Richardson cipher_xform = auth_xform->next; 405a9de470cSBruce Richardson cipher_xform->next = NULL; 406a9de470cSBruce Richardson } else { 407a9de470cSBruce Richardson auth_xform->next = cipher_xform; 408a9de470cSBruce Richardson cipher_xform->next = NULL; 409a9de470cSBruce Richardson init_xform = auth_xform; 410a9de470cSBruce Richardson } 4116356c286STejasree Kondoj } else if (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN_ENC) { 4126356c286STejasree Kondoj if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 4136356c286STejasree Kondoj auth_xform = op->sym->xform; 4146356c286STejasree Kondoj cipher_xform = auth_xform->next; 4156356c286STejasree Kondoj cipher_xform->next = NULL; 4166356c286STejasree Kondoj } else { 4176356c286STejasree Kondoj auth_xform->next = cipher_xform; 4186356c286STejasree Kondoj cipher_xform->next = NULL; 4196356c286STejasree Kondoj init_xform = auth_xform; 4206356c286STejasree Kondoj } 4216356c286STejasree Kondoj } else if (t->op_mask == BLOCKCIPHER_TEST_OP_DEC_AUTH_VERIFY) { 4226356c286STejasree Kondoj if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) { 4236356c286STejasree Kondoj cipher_xform = op->sym->xform; 4246356c286STejasree Kondoj auth_xform = cipher_xform->next; 4256356c286STejasree Kondoj auth_xform->next = NULL; 4266356c286STejasree Kondoj } else { 4276356c286STejasree Kondoj cipher_xform->next = auth_xform; 4286356c286STejasree Kondoj auth_xform->next = NULL; 4296356c286STejasree Kondoj init_xform = cipher_xform; 4306356c286STejasree Kondoj } 431a9de470cSBruce Richardson } else if ((t->op_mask == BLOCKCIPHER_TEST_OP_ENCRYPT) || 432a9de470cSBruce Richardson (t->op_mask == BLOCKCIPHER_TEST_OP_DECRYPT)) { 433a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) 434a9de470cSBruce Richardson cipher_xform = op->sym->xform; 435a9de470cSBruce Richardson else 436a9de470cSBruce Richardson init_xform = cipher_xform; 437a9de470cSBruce Richardson cipher_xform->next = NULL; 438a9de470cSBruce Richardson } else if ((t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_GEN) || 439a9de470cSBruce Richardson (t->op_mask == BLOCKCIPHER_TEST_OP_AUTH_VERIFY)) { 440a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) 441a9de470cSBruce Richardson auth_xform = op->sym->xform; 442a9de470cSBruce Richardson else 443a9de470cSBruce Richardson init_xform = auth_xform; 444a9de470cSBruce Richardson auth_xform->next = NULL; 445a9de470cSBruce Richardson } else { 446a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 447a9de470cSBruce Richardson "line %u FAILED: %s", 448a9de470cSBruce Richardson __LINE__, "Unrecognized operation"); 449a9de470cSBruce Richardson status = TEST_FAILED; 450a9de470cSBruce Richardson goto error_exit; 451a9de470cSBruce Richardson } 452a9de470cSBruce Richardson 453a9de470cSBruce Richardson /*configure xforms & sym_op cipher and auth data*/ 454a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) { 455a9de470cSBruce Richardson cipher_xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER; 456a9de470cSBruce Richardson cipher_xform->cipher.algo = tdata->crypto_algo; 457a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) 458a9de470cSBruce Richardson cipher_xform->cipher.op = 459a9de470cSBruce Richardson RTE_CRYPTO_CIPHER_OP_ENCRYPT; 460a9de470cSBruce Richardson else 461a9de470cSBruce Richardson cipher_xform->cipher.op = 462a9de470cSBruce Richardson RTE_CRYPTO_CIPHER_OP_DECRYPT; 463a9de470cSBruce Richardson cipher_xform->cipher.key.data = cipher_key; 464a9de470cSBruce Richardson cipher_xform->cipher.key.length = tdata->cipher_key.len; 465a9de470cSBruce Richardson cipher_xform->cipher.iv.offset = IV_OFFSET; 466d5728a5aSShiri Kuzin cipher_xform->cipher.dataunit_len = tdata->xts_dataunit_len; 467d954825aSAnkur Dwivedi 468d954825aSAnkur Dwivedi if (tdata->crypto_algo == RTE_CRYPTO_CIPHER_NULL) 469d954825aSAnkur Dwivedi cipher_xform->cipher.iv.length = 0; 470d954825aSAnkur Dwivedi else 471a9de470cSBruce Richardson cipher_xform->cipher.iv.length = tdata->iv.len; 472a9de470cSBruce Richardson 4735e73a1f8SFan Zhang sym_op->cipher.data.offset = tdata->cipher_offset; 4745e73a1f8SFan Zhang sym_op->cipher.data.length = tdata->ciphertext.len - 4755e73a1f8SFan Zhang tdata->cipher_offset; 4766356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) { 4776356c286STejasree Kondoj sym_op->cipher.data.length += tdata->digest.len; 4786356c286STejasree Kondoj sym_op->cipher.data.length += pad_len; 4796356c286STejasree Kondoj } 480a9de470cSBruce Richardson rte_memcpy(rte_crypto_op_ctod_offset(op, uint8_t *, IV_OFFSET), 481a9de470cSBruce Richardson tdata->iv.data, 482a9de470cSBruce Richardson tdata->iv.len); 483a9de470cSBruce Richardson } 484a9de470cSBruce Richardson 485a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) { 486a9de470cSBruce Richardson uint32_t digest_offset = tdata->ciphertext.len; 487a9de470cSBruce Richardson 488a9de470cSBruce Richardson auth_xform->type = RTE_CRYPTO_SYM_XFORM_AUTH; 489a9de470cSBruce Richardson auth_xform->auth.algo = tdata->auth_algo; 490a9de470cSBruce Richardson auth_xform->auth.key.length = tdata->auth_key.len; 491a9de470cSBruce Richardson auth_xform->auth.key.data = auth_key; 492a9de470cSBruce Richardson auth_xform->auth.digest_length = digest_len; 493a9de470cSBruce Richardson 494a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) { 495a9de470cSBruce Richardson auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 496a9de470cSBruce Richardson sym_op->auth.digest.data = pktmbuf_mtod_offset 497a9de470cSBruce Richardson (iobuf, digest_offset); 498a9de470cSBruce Richardson sym_op->auth.digest.phys_addr = 499a9de470cSBruce Richardson pktmbuf_iova_offset(iobuf, 500a9de470cSBruce Richardson digest_offset); 501a9de470cSBruce Richardson } else { 502a9de470cSBruce Richardson auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 503a9de470cSBruce Richardson sym_op->auth.digest.data = pktmbuf_mtod_offset 504a9de470cSBruce Richardson (sym_op->m_src, digest_offset); 505a9de470cSBruce Richardson sym_op->auth.digest.phys_addr = 506a9de470cSBruce Richardson pktmbuf_iova_offset(sym_op->m_src, 507a9de470cSBruce Richardson digest_offset); 508a9de470cSBruce Richardson } 509a9de470cSBruce Richardson 5105e73a1f8SFan Zhang sym_op->auth.data.offset = tdata->auth_offset; 5115e73a1f8SFan Zhang sym_op->auth.data.length = tdata->ciphertext.len - 5125e73a1f8SFan Zhang tdata->auth_offset; 513a9de470cSBruce Richardson } 514a9de470cSBruce Richardson 5155e73a1f8SFan Zhang /** 5165e73a1f8SFan Zhang * Create session for sessioned op. For mbuf iteration test, 5175e73a1f8SFan Zhang * skip the session creation for the second iteration. 5185e73a1f8SFan Zhang */ 5195e73a1f8SFan Zhang if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS) && 5205e73a1f8SFan Zhang nb_iterates == 0) { 521bdce2564SAkhil Goyal sess = rte_cryptodev_sym_session_create(dev_id, init_xform, 522bdce2564SAkhil Goyal sess_mpool); 523bdce2564SAkhil Goyal if (sess == NULL) { 524439d222bSAnkur Dwivedi snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "UNSUPPORTED"); 525cf43d9d0SAkhil Goyal status = TEST_SKIPPED; 526439d222bSAnkur Dwivedi goto error_exit; 527439d222bSAnkur Dwivedi } 528439d222bSAnkur Dwivedi if (!sess || status < 0) { 529a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 530a9de470cSBruce Richardson "FAILED: %s", __LINE__, 531a9de470cSBruce Richardson "Session creation failed"); 532a9de470cSBruce Richardson status = TEST_FAILED; 533a9de470cSBruce Richardson goto error_exit; 534a9de470cSBruce Richardson } 535a9de470cSBruce Richardson 536a9de470cSBruce Richardson /* attach symmetric crypto session to crypto operations */ 537a9de470cSBruce Richardson rte_crypto_op_attach_sym_session(op, sess); 538a9de470cSBruce Richardson } 539a9de470cSBruce Richardson 540a9de470cSBruce Richardson debug_hexdump(stdout, "m_src(before):", 541a9de470cSBruce Richardson sym_op->m_src->buf_addr, sym_op->m_src->buf_len); 542a9de470cSBruce Richardson rte_memcpy(tmp_src_buf, sym_op->m_src->buf_addr, 543a9de470cSBruce Richardson sym_op->m_src->buf_len); 544a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) { 545a9de470cSBruce Richardson debug_hexdump(stdout, "m_dst(before):", 546a9de470cSBruce Richardson sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len); 547a9de470cSBruce Richardson rte_memcpy(tmp_dst_buf, sym_op->m_dst->buf_addr, 548a9de470cSBruce Richardson sym_op->m_dst->buf_len); 549a9de470cSBruce Richardson } 550a9de470cSBruce Richardson 551a9de470cSBruce Richardson /* Process crypto operation */ 5524868f659SFan Zhang if (global_api_test_type == CRYPTODEV_RAW_API_TEST) { 5534868f659SFan Zhang uint8_t is_cipher = 0, is_auth = 0; 5544868f659SFan Zhang if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) 5554868f659SFan Zhang is_cipher = 1; 5564868f659SFan Zhang if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) 5574868f659SFan Zhang is_auth = 1; 5584868f659SFan Zhang 5595080c984SAnoob Joseph status = process_sym_raw_dp_op(dev_id, 0, op, is_cipher, is_auth, 5605080c984SAnoob Joseph 0, tdata->iv.len); 5615080c984SAnoob Joseph if (status != TEST_SUCCESS) { 5625080c984SAnoob Joseph if (status == TEST_SKIPPED) 5635080c984SAnoob Joseph snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "SKIPPED"); 5645080c984SAnoob Joseph else 5655080c984SAnoob Joseph snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "FAILED"); 5665080c984SAnoob Joseph 5675080c984SAnoob Joseph goto error_exit; 5685080c984SAnoob Joseph } 5694868f659SFan Zhang } else { 570a9de470cSBruce Richardson if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 571a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 572a9de470cSBruce Richardson "line %u FAILED: %s", 573a9de470cSBruce Richardson __LINE__, "Error sending packet for encryption"); 574a9de470cSBruce Richardson status = TEST_FAILED; 575a9de470cSBruce Richardson goto error_exit; 576a9de470cSBruce Richardson } 577a9de470cSBruce Richardson 578a9de470cSBruce Richardson op = NULL; 579a9de470cSBruce Richardson 580a9de470cSBruce Richardson while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 581a9de470cSBruce Richardson rte_pause(); 582a9de470cSBruce Richardson 583a9de470cSBruce Richardson if (!op) { 584a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 585a9de470cSBruce Richardson "line %u FAILED: %s", 586a9de470cSBruce Richardson __LINE__, "Failed to process sym crypto op"); 587a9de470cSBruce Richardson status = TEST_FAILED; 588a9de470cSBruce Richardson goto error_exit; 589a9de470cSBruce Richardson } 5904868f659SFan Zhang } 591a9de470cSBruce Richardson 592a9de470cSBruce Richardson debug_hexdump(stdout, "m_src(after):", 593a9de470cSBruce Richardson sym_op->m_src->buf_addr, sym_op->m_src->buf_len); 594a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) 595a9de470cSBruce Richardson debug_hexdump(stdout, "m_dst(after):", 596a9de470cSBruce Richardson sym_op->m_dst->buf_addr, sym_op->m_dst->buf_len); 597a9de470cSBruce Richardson 598a9de470cSBruce Richardson /* Verify results */ 599a9de470cSBruce Richardson if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 600a9de470cSBruce Richardson if ((t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY) && 601a9de470cSBruce Richardson (op->status == RTE_CRYPTO_OP_STATUS_AUTH_FAILED)) 602a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 603a9de470cSBruce Richardson "FAILED: Digest verification failed " 604a9de470cSBruce Richardson "(0x%X)", __LINE__, op->status); 605a9de470cSBruce Richardson else 606a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 607a9de470cSBruce Richardson "FAILED: Operation failed " 608a9de470cSBruce Richardson "(0x%X)", __LINE__, op->status); 609a9de470cSBruce Richardson status = TEST_FAILED; 610a9de470cSBruce Richardson goto error_exit; 611a9de470cSBruce Richardson } 612a9de470cSBruce Richardson 613a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) { 614a9de470cSBruce Richardson uint8_t buffer[2048]; 615a9de470cSBruce Richardson const uint8_t *compare_ref; 616a9de470cSBruce Richardson uint32_t compare_len; 617a9de470cSBruce Richardson 618a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) { 6195e73a1f8SFan Zhang compare_ref = tdata->ciphertext.data + 6205e73a1f8SFan Zhang tdata->cipher_offset; 6215e73a1f8SFan Zhang compare_len = tdata->ciphertext.len - 6225e73a1f8SFan Zhang tdata->cipher_offset; 6236356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 6246356c286STejasree Kondoj compare_len += tdata->digest.len; 625a9de470cSBruce Richardson } else { 6265e73a1f8SFan Zhang compare_ref = tdata->plaintext.data + 6275e73a1f8SFan Zhang tdata->cipher_offset; 6285e73a1f8SFan Zhang compare_len = tdata->plaintext.len - 6295e73a1f8SFan Zhang tdata->cipher_offset; 630a9de470cSBruce Richardson } 631a9de470cSBruce Richardson 6325e73a1f8SFan Zhang if (memcmp(rte_pktmbuf_read(iobuf, tdata->cipher_offset, 6335e73a1f8SFan Zhang compare_len, buffer), compare_ref, 6345e73a1f8SFan Zhang compare_len)) { 635a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 636a9de470cSBruce Richardson "FAILED: %s", __LINE__, 637a9de470cSBruce Richardson "Crypto data not as expected"); 638a9de470cSBruce Richardson status = TEST_FAILED; 639a9de470cSBruce Richardson goto error_exit; 640a9de470cSBruce Richardson } 641a9de470cSBruce Richardson } 642a9de470cSBruce Richardson 6436356c286STejasree Kondoj /* Check digest data only in enc-then-auth_gen case. 6446356c286STejasree Kondoj * In auth_gen-then-enc case, cipher text contains both encrypted 6456356c286STejasree Kondoj * plain text and encrypted digest value. If cipher text is correct, 6466356c286STejasree Kondoj * it implies digest is also generated properly. 6476356c286STejasree Kondoj */ 6486356c286STejasree Kondoj if (!(t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED)) 649a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) { 650a9de470cSBruce Richardson uint8_t *auth_res = pktmbuf_mtod_offset(iobuf, 651a9de470cSBruce Richardson tdata->ciphertext.len); 652a9de470cSBruce Richardson 653a9de470cSBruce Richardson if (memcmp(auth_res, tdata->digest.data, digest_len)) { 654a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u " 655a9de470cSBruce Richardson "FAILED: %s", __LINE__, "Generated " 656a9de470cSBruce Richardson "digest data not as expected"); 657a9de470cSBruce Richardson status = TEST_FAILED; 658a9de470cSBruce Richardson goto error_exit; 659a9de470cSBruce Richardson } 660a9de470cSBruce Richardson } 661a9de470cSBruce Richardson 662a9de470cSBruce Richardson /* The only parts that should have changed in the buffer are 663a9de470cSBruce Richardson * plaintext/ciphertext and digest. 664a9de470cSBruce Richardson * In OOP only the dest buffer should change. 665a9de470cSBruce Richardson */ 666a9de470cSBruce Richardson if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_OOP) { 667a9de470cSBruce Richardson struct rte_mbuf *mbuf; 668a9de470cSBruce Richardson uint8_t value; 669a9de470cSBruce Richardson uint32_t head_unchanged_len, changed_len = 0; 670a9de470cSBruce Richardson uint32_t i; 671a9de470cSBruce Richardson uint32_t hdroom_used = 0, tlroom_used = 0; 672a9de470cSBruce Richardson uint32_t hdroom = 0; 673a9de470cSBruce Richardson 674a9de470cSBruce Richardson mbuf = sym_op->m_src; 675a9de470cSBruce Richardson /* 676a9de470cSBruce Richardson * Crypto PMDs specify the headroom & tailroom it would use 677a9de470cSBruce Richardson * when processing the crypto operation. PMD is free to modify 678a9de470cSBruce Richardson * this space, and so the verification check should skip that 679a9de470cSBruce Richardson * block. 680a9de470cSBruce Richardson */ 681a9de470cSBruce Richardson hdroom_used = dev_info.min_mbuf_headroom_req; 682a9de470cSBruce Richardson tlroom_used = dev_info.min_mbuf_tailroom_req; 683a9de470cSBruce Richardson 684a9de470cSBruce Richardson /* Get headroom */ 685a9de470cSBruce Richardson hdroom = rte_pktmbuf_headroom(mbuf); 686a9de470cSBruce Richardson 687a9de470cSBruce Richardson head_unchanged_len = mbuf->buf_len; 688a9de470cSBruce Richardson 689a9de470cSBruce Richardson for (i = 0; i < mbuf->buf_len; i++) { 690a9de470cSBruce Richardson 691a9de470cSBruce Richardson /* Skip headroom used by PMD */ 692a9de470cSBruce Richardson if (i == hdroom - hdroom_used) 693a9de470cSBruce Richardson i += hdroom_used; 694a9de470cSBruce Richardson 695a9de470cSBruce Richardson /* Skip tailroom used by PMD */ 696a9de470cSBruce Richardson if (i == (hdroom + mbuf->data_len)) 697a9de470cSBruce Richardson i += tlroom_used; 698a9de470cSBruce Richardson 699a9de470cSBruce Richardson value = *((uint8_t *)(mbuf->buf_addr)+i); 700a9de470cSBruce Richardson if (value != tmp_src_buf[i]) { 701a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 702a9de470cSBruce Richardson "line %u FAILED: OOP src outer mbuf data (0x%x) not as expected (0x%x)", 703a9de470cSBruce Richardson __LINE__, value, tmp_src_buf[i]); 704a9de470cSBruce Richardson status = TEST_FAILED; 705a9de470cSBruce Richardson goto error_exit; 706a9de470cSBruce Richardson } 707a9de470cSBruce Richardson } 708a9de470cSBruce Richardson 709a9de470cSBruce Richardson mbuf = sym_op->m_dst; 710a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH) { 711a9de470cSBruce Richardson head_unchanged_len = hdroom + sym_op->auth.data.offset; 712a9de470cSBruce Richardson changed_len = sym_op->auth.data.length; 713a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) 714a9de470cSBruce Richardson changed_len += digest_len; 715a9de470cSBruce Richardson } else { 716a9de470cSBruce Richardson /* cipher-only */ 717a9de470cSBruce Richardson head_unchanged_len = hdroom + 718a9de470cSBruce Richardson sym_op->cipher.data.offset; 719a9de470cSBruce Richardson changed_len = sym_op->cipher.data.length; 720a9de470cSBruce Richardson } 721a9de470cSBruce Richardson 7226356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 7236356c286STejasree Kondoj changed_len = sym_op->cipher.data.length + 7246356c286STejasree Kondoj digest_len + pad_len; 7256356c286STejasree Kondoj 726a9de470cSBruce Richardson for (i = 0; i < mbuf->buf_len; i++) { 727a9de470cSBruce Richardson if (i == head_unchanged_len) 728a9de470cSBruce Richardson i += changed_len; 729a9de470cSBruce Richardson value = *((uint8_t *)(mbuf->buf_addr)+i); 730a9de470cSBruce Richardson if (value != tmp_dst_buf[i]) { 731a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 732a9de470cSBruce Richardson "line %u FAILED: OOP dst outer mbuf data " 733a9de470cSBruce Richardson "(0x%x) not as expected (0x%x)", 734a9de470cSBruce Richardson __LINE__, value, tmp_dst_buf[i]); 735a9de470cSBruce Richardson status = TEST_FAILED; 736a9de470cSBruce Richardson goto error_exit; 737a9de470cSBruce Richardson } 738a9de470cSBruce Richardson } 7395e73a1f8SFan Zhang 7405e73a1f8SFan Zhang if (!nb_iterates) { 7415e73a1f8SFan Zhang nb_iterates++; 7425e73a1f8SFan Zhang goto iterate; 7435e73a1f8SFan Zhang } 744a9de470cSBruce Richardson } else { 745a9de470cSBruce Richardson /* In-place operation */ 746a9de470cSBruce Richardson struct rte_mbuf *mbuf; 747a9de470cSBruce Richardson uint8_t value; 748a9de470cSBruce Richardson uint32_t head_unchanged_len = 0, changed_len = 0; 749a9de470cSBruce Richardson uint32_t i; 750a9de470cSBruce Richardson uint32_t hdroom_used = 0, tlroom_used = 0; 751a9de470cSBruce Richardson uint32_t hdroom = 0; 752a9de470cSBruce Richardson 753a9de470cSBruce Richardson /* 754a9de470cSBruce Richardson * Crypto PMDs specify the headroom & tailroom it would use 755a9de470cSBruce Richardson * when processing the crypto operation. PMD is free to modify 756a9de470cSBruce Richardson * this space, and so the verification check should skip that 757a9de470cSBruce Richardson * block. 758a9de470cSBruce Richardson */ 759a9de470cSBruce Richardson hdroom_used = dev_info.min_mbuf_headroom_req; 760a9de470cSBruce Richardson tlroom_used = dev_info.min_mbuf_tailroom_req; 761a9de470cSBruce Richardson 762a9de470cSBruce Richardson mbuf = sym_op->m_src; 763a9de470cSBruce Richardson 764a9de470cSBruce Richardson /* Get headroom */ 765a9de470cSBruce Richardson hdroom = rte_pktmbuf_headroom(mbuf); 766a9de470cSBruce Richardson 767a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) { 768a9de470cSBruce Richardson head_unchanged_len = hdroom + 769a9de470cSBruce Richardson sym_op->cipher.data.offset; 770a9de470cSBruce Richardson changed_len = sym_op->cipher.data.length; 771a9de470cSBruce Richardson } else { 772a9de470cSBruce Richardson /* auth-only */ 773a9de470cSBruce Richardson head_unchanged_len = hdroom + 774a9de470cSBruce Richardson sym_op->auth.data.offset + 775a9de470cSBruce Richardson sym_op->auth.data.length; 776a9de470cSBruce Richardson changed_len = 0; 777a9de470cSBruce Richardson } 778a9de470cSBruce Richardson 779a9de470cSBruce Richardson if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) 780a9de470cSBruce Richardson changed_len += digest_len; 781a9de470cSBruce Richardson 7826356c286STejasree Kondoj if (t->op_mask & BLOCKCIPHER_TEST_OP_DIGEST_ENCRYPTED) 7836356c286STejasree Kondoj changed_len = sym_op->cipher.data.length; 7846356c286STejasree Kondoj 785a9de470cSBruce Richardson for (i = 0; i < mbuf->buf_len; i++) { 786a9de470cSBruce Richardson 787a9de470cSBruce Richardson /* Skip headroom used by PMD */ 788a9de470cSBruce Richardson if (i == hdroom - hdroom_used) 789a9de470cSBruce Richardson i += hdroom_used; 790a9de470cSBruce Richardson 791a9de470cSBruce Richardson if (i == head_unchanged_len) 792a9de470cSBruce Richardson i += changed_len; 793a9de470cSBruce Richardson 794a9de470cSBruce Richardson /* Skip tailroom used by PMD */ 795a9de470cSBruce Richardson if (i == (hdroom + mbuf->data_len)) 796a9de470cSBruce Richardson i += tlroom_used; 797a9de470cSBruce Richardson 798a9de470cSBruce Richardson value = *((uint8_t *)(mbuf->buf_addr)+i); 799a9de470cSBruce Richardson if (value != tmp_src_buf[i]) { 800a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, 801a9de470cSBruce Richardson "line %u FAILED: outer mbuf data (0x%x) " 802a9de470cSBruce Richardson "not as expected (0x%x)", 803a9de470cSBruce Richardson __LINE__, value, tmp_src_buf[i]); 804a9de470cSBruce Richardson status = TEST_FAILED; 805a9de470cSBruce Richardson goto error_exit; 806a9de470cSBruce Richardson } 807a9de470cSBruce Richardson } 808a9de470cSBruce Richardson } 809a9de470cSBruce Richardson 810a9de470cSBruce Richardson snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "PASS"); 811a9de470cSBruce Richardson 812a9de470cSBruce Richardson error_exit: 813a9de470cSBruce Richardson if (!(t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SESSIONLESS)) { 814bdce2564SAkhil Goyal if (sess) 815bdce2564SAkhil Goyal rte_cryptodev_sym_session_free(dev_id, sess); 816a9de470cSBruce Richardson rte_free(cipher_xform); 817a9de470cSBruce Richardson rte_free(auth_xform); 818a9de470cSBruce Richardson } 819a9de470cSBruce Richardson 820a9de470cSBruce Richardson rte_crypto_op_free(op); 821a9de470cSBruce Richardson 822a9de470cSBruce Richardson rte_pktmbuf_free(obuf); 823a9de470cSBruce Richardson 824a9de470cSBruce Richardson rte_pktmbuf_free(ibuf); 825a9de470cSBruce Richardson 826a9de470cSBruce Richardson return status; 827a9de470cSBruce Richardson } 828a9de470cSBruce Richardson 829e65da89cSCiara Power static int 830e65da89cSCiara Power blockcipher_test_case_run(const void *data) 831a9de470cSBruce Richardson { 832e65da89cSCiara Power const struct blockcipher_test_case *tc_data = data; 833e65da89cSCiara Power int status; 834a9de470cSBruce Richardson char test_msg[BLOCKCIPHER_TEST_MSG_LEN + 1]; 835e65da89cSCiara Power 836e65da89cSCiara Power status = test_blockcipher_one_case(tc_data, 837e65da89cSCiara Power p_testsuite_params->mbuf_pool, 838e65da89cSCiara Power p_testsuite_params->op_mpool, 839e65da89cSCiara Power p_testsuite_params->session_mpool, 840e65da89cSCiara Power p_testsuite_params->valid_devs[0], 841e65da89cSCiara Power test_msg); 842e65da89cSCiara Power return status; 843e65da89cSCiara Power } 844e65da89cSCiara Power 845e65da89cSCiara Power static int 846e65da89cSCiara Power aes_chain_setup(void) 847e65da89cSCiara Power { 848e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 849e65da89cSCiara Power struct rte_cryptodev_info dev_info; 850e65da89cSCiara Power uint64_t feat_flags; 851e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 852e65da89cSCiara Power RTE_CRYPTO_CIPHER_NULL, 853e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_CTR, 854e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_CBC 855e65da89cSCiara Power }; 856e65da89cSCiara Power const enum rte_crypto_auth_algorithm auths[] = { 857e65da89cSCiara Power RTE_CRYPTO_AUTH_NULL, 858e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1_HMAC, 859e65da89cSCiara Power RTE_CRYPTO_AUTH_AES_XCBC_MAC, 860e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA256_HMAC, 861e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA512_HMAC, 862e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA224_HMAC, 863e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA384_HMAC 864e65da89cSCiara Power }; 865e65da89cSCiara Power 866e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 867e65da89cSCiara Power feat_flags = dev_info.feature_flags; 868e65da89cSCiara Power 869e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 870e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 871e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 872e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for AES Chain " 873e65da89cSCiara Power "testsuite not met\n"); 874e65da89cSCiara Power return TEST_SKIPPED; 875e65da89cSCiara Power } 876e65da89cSCiara Power 877e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 878e65da89cSCiara Power && check_auth_capabilities_supported(auths, 879e65da89cSCiara Power RTE_DIM(auths)) != 0) { 880e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for AES Chain " 881e65da89cSCiara Power "testsuite not met\n"); 882e65da89cSCiara Power return TEST_SKIPPED; 883e65da89cSCiara Power } 884e65da89cSCiara Power 885e65da89cSCiara Power return 0; 886e65da89cSCiara Power } 887e65da89cSCiara Power 888e65da89cSCiara Power static int 889e65da89cSCiara Power aes_cipheronly_setup(void) 890e65da89cSCiara Power { 891e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 892e65da89cSCiara Power struct rte_cryptodev_info dev_info; 893e65da89cSCiara Power uint64_t feat_flags; 894e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 895e65da89cSCiara Power RTE_CRYPTO_CIPHER_NULL, 896e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_CTR, 897e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_CBC, 898e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_ECB, 899e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_XTS 900e65da89cSCiara Power }; 901e65da89cSCiara Power const enum rte_crypto_auth_algorithm auths[] = { 902e65da89cSCiara Power RTE_CRYPTO_AUTH_NULL, 903e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1_HMAC, 904e65da89cSCiara Power RTE_CRYPTO_AUTH_AES_XCBC_MAC 905e65da89cSCiara Power }; 906e65da89cSCiara Power 907e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 908e65da89cSCiara Power feat_flags = dev_info.feature_flags; 909e65da89cSCiara Power 910e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 911e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 912e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 913e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for AES Cipheronly " 914e65da89cSCiara Power "testsuite not met\n"); 915e65da89cSCiara Power return TEST_SKIPPED; 916e65da89cSCiara Power } 917e65da89cSCiara Power 918e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 919e65da89cSCiara Power && check_auth_capabilities_supported(auths, 920e65da89cSCiara Power RTE_DIM(auths)) != 0) { 921e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for AES Cipheronly " 922e65da89cSCiara Power "testsuite not met\n"); 923e65da89cSCiara Power return TEST_SKIPPED; 924e65da89cSCiara Power } 925e65da89cSCiara Power 926e65da89cSCiara Power return 0; 927e65da89cSCiara Power } 928e65da89cSCiara Power 929e65da89cSCiara Power static int 930e65da89cSCiara Power aes_docsis_setup(void) 931e65da89cSCiara Power { 932e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 933e65da89cSCiara Power struct rte_cryptodev_info dev_info; 934e65da89cSCiara Power uint64_t feat_flags; 935e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 936e65da89cSCiara Power RTE_CRYPTO_CIPHER_AES_DOCSISBPI 937e65da89cSCiara Power }; 938e65da89cSCiara Power 939e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 940e65da89cSCiara Power feat_flags = dev_info.feature_flags; 941e65da89cSCiara Power 942e65da89cSCiara Power /* Data-path service does not support DOCSIS yet */ 943e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 944e65da89cSCiara Power (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 945e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for AES Docsis " 946e65da89cSCiara Power "testsuite not met\n"); 947e65da89cSCiara Power return TEST_SKIPPED; 948e65da89cSCiara Power } 949e65da89cSCiara Power 950e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 951e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for AES Docsis " 952e65da89cSCiara Power "testsuite not met\n"); 953e65da89cSCiara Power return TEST_SKIPPED; 954e65da89cSCiara Power } 955e65da89cSCiara Power 956e65da89cSCiara Power return 0; 957e65da89cSCiara Power } 958e65da89cSCiara Power 959e65da89cSCiara Power static int 960e65da89cSCiara Power triple_des_chain_setup(void) 961e65da89cSCiara Power { 962e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 963e65da89cSCiara Power struct rte_cryptodev_info dev_info; 964e65da89cSCiara Power uint64_t feat_flags; 965e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 966e65da89cSCiara Power RTE_CRYPTO_CIPHER_3DES_CTR, 967e65da89cSCiara Power RTE_CRYPTO_CIPHER_3DES_CBC 968e65da89cSCiara Power }; 969e65da89cSCiara Power const enum rte_crypto_auth_algorithm auths[] = { 970e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1_HMAC, 971e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1 972e65da89cSCiara Power }; 973e65da89cSCiara Power 974e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 975e65da89cSCiara Power feat_flags = dev_info.feature_flags; 976e65da89cSCiara Power 977e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 978e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 979e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 980e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for 3DES Chain " 981e65da89cSCiara Power "testsuite not met\n"); 982e65da89cSCiara Power return TEST_SKIPPED; 983e65da89cSCiara Power } 984e65da89cSCiara Power 985e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 986e65da89cSCiara Power && check_auth_capabilities_supported(auths, 987e65da89cSCiara Power RTE_DIM(auths)) != 0) { 988e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for 3DES Chain " 989e65da89cSCiara Power "testsuite not met\n"); 990e65da89cSCiara Power return TEST_SKIPPED; 991e65da89cSCiara Power } 992e65da89cSCiara Power 993e65da89cSCiara Power return 0; 994e65da89cSCiara Power } 995e65da89cSCiara Power 996e65da89cSCiara Power static int 997e65da89cSCiara Power triple_des_cipheronly_setup(void) 998e65da89cSCiara Power { 999e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 1000e65da89cSCiara Power struct rte_cryptodev_info dev_info; 1001e65da89cSCiara Power uint64_t feat_flags; 1002e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 1003e65da89cSCiara Power RTE_CRYPTO_CIPHER_3DES_CTR, 1004e65da89cSCiara Power RTE_CRYPTO_CIPHER_3DES_CBC 1005e65da89cSCiara Power }; 1006e65da89cSCiara Power 1007e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 1008e65da89cSCiara Power feat_flags = dev_info.feature_flags; 1009e65da89cSCiara Power 1010e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1011e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1012e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1013e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for 3DES " 1014e65da89cSCiara Power "Cipheronly testsuite not met\n"); 1015e65da89cSCiara Power return TEST_SKIPPED; 1016e65da89cSCiara Power } 1017e65da89cSCiara Power 1018e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 1019e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for 3DES " 1020e65da89cSCiara Power "Cipheronly testsuite not met\n"); 1021e65da89cSCiara Power return TEST_SKIPPED; 1022e65da89cSCiara Power } 1023e65da89cSCiara Power 1024e65da89cSCiara Power return 0; 1025e65da89cSCiara Power } 1026e65da89cSCiara Power 1027e65da89cSCiara Power static int 1028e65da89cSCiara Power des_cipheronly_setup(void) 1029e65da89cSCiara Power { 1030e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 1031e65da89cSCiara Power struct rte_cryptodev_info dev_info; 1032e65da89cSCiara Power uint64_t feat_flags; 1033e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 1034e65da89cSCiara Power RTE_CRYPTO_CIPHER_DES_CBC 1035e65da89cSCiara Power }; 1036e65da89cSCiara Power 1037e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 1038e65da89cSCiara Power feat_flags = dev_info.feature_flags; 1039e65da89cSCiara Power 1040e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1041e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1042e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1043e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for DES " 1044e65da89cSCiara Power "Cipheronly testsuite not met\n"); 1045e65da89cSCiara Power return TEST_SKIPPED; 1046e65da89cSCiara Power } 1047e65da89cSCiara Power 1048e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 1049e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for DES " 1050e65da89cSCiara Power "Cipheronly testsuite not met\n"); 1051e65da89cSCiara Power return TEST_SKIPPED; 1052e65da89cSCiara Power } 1053e65da89cSCiara Power 1054e65da89cSCiara Power return 0; 1055e65da89cSCiara Power } 1056e65da89cSCiara Power 1057e65da89cSCiara Power static int 1058e65da89cSCiara Power des_docsis_setup(void) 1059e65da89cSCiara Power { 1060e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 1061e65da89cSCiara Power struct rte_cryptodev_info dev_info; 1062e65da89cSCiara Power uint64_t feat_flags; 1063e65da89cSCiara Power const enum rte_crypto_cipher_algorithm ciphers[] = { 1064e65da89cSCiara Power RTE_CRYPTO_CIPHER_DES_DOCSISBPI 1065e65da89cSCiara Power }; 1066e65da89cSCiara Power 1067e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 1068e65da89cSCiara Power feat_flags = dev_info.feature_flags; 1069e65da89cSCiara Power 1070e65da89cSCiara Power /* Data-path service does not support DOCSIS yet */ 1071e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1072e65da89cSCiara Power (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1073e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for DES Docsis " 1074e65da89cSCiara Power "testsuite not met\n"); 1075e65da89cSCiara Power return TEST_SKIPPED; 1076e65da89cSCiara Power } 1077e65da89cSCiara Power 1078e65da89cSCiara Power if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 1079e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for DES Docsis " 1080e65da89cSCiara Power "testsuite not met\n"); 1081e65da89cSCiara Power return TEST_SKIPPED; 1082e65da89cSCiara Power } 1083e65da89cSCiara Power 1084e65da89cSCiara Power return 0; 1085e65da89cSCiara Power } 1086e65da89cSCiara Power 1087e65da89cSCiara Power static int 1088e65da89cSCiara Power authonly_setup(void) 1089e65da89cSCiara Power { 1090e65da89cSCiara Power uint8_t dev_id = p_testsuite_params->valid_devs[0]; 1091e65da89cSCiara Power struct rte_cryptodev_info dev_info; 1092e65da89cSCiara Power uint64_t feat_flags; 1093e65da89cSCiara Power const enum rte_crypto_auth_algorithm auths[] = { 1094e65da89cSCiara Power RTE_CRYPTO_AUTH_MD5, 1095e65da89cSCiara Power RTE_CRYPTO_AUTH_MD5_HMAC, 1096e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1, 1097e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA1_HMAC, 1098e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA224, 1099e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA224_HMAC, 1100e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA256, 1101e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA256_HMAC, 1102e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA384, 1103e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA384_HMAC, 1104e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA512, 1105e65da89cSCiara Power RTE_CRYPTO_AUTH_SHA512_HMAC, 1106e65da89cSCiara Power RTE_CRYPTO_AUTH_AES_CMAC, 1107e65da89cSCiara Power RTE_CRYPTO_AUTH_NULL, 1108e65da89cSCiara Power RTE_CRYPTO_AUTH_AES_XCBC_MAC 1109e65da89cSCiara Power }; 1110e65da89cSCiara Power 1111e65da89cSCiara Power rte_cryptodev_info_get(dev_id, &dev_info); 1112e65da89cSCiara Power feat_flags = dev_info.feature_flags; 1113e65da89cSCiara Power 1114e65da89cSCiara Power if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1115e65da89cSCiara Power ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1116e65da89cSCiara Power !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1117e65da89cSCiara Power RTE_LOG(INFO, USER1, "Feature flag requirements for Auth Only " 1118e65da89cSCiara Power "testsuite not met\n"); 1119e65da89cSCiara Power return TEST_SKIPPED; 1120e65da89cSCiara Power } 1121e65da89cSCiara Power 1122e65da89cSCiara Power if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1123e65da89cSCiara Power RTE_LOG(INFO, USER1, "Capability requirements for Auth Only " 1124e65da89cSCiara Power "testsuite not met\n"); 1125e65da89cSCiara Power return TEST_SKIPPED; 1126e65da89cSCiara Power } 1127e65da89cSCiara Power 1128e65da89cSCiara Power return 0; 1129e65da89cSCiara Power } 1130e65da89cSCiara Power 11311daecf63SSunyang Wu static int 11321daecf63SSunyang Wu sm4_chain_setup(void) 11331daecf63SSunyang Wu { 11341daecf63SSunyang Wu uint8_t dev_id = p_testsuite_params->valid_devs[0]; 11351daecf63SSunyang Wu struct rte_cryptodev_info dev_info; 11361daecf63SSunyang Wu uint64_t feat_flags; 11371daecf63SSunyang Wu const enum rte_crypto_cipher_algorithm ciphers[] = { 11381daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_CTR, 11391daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_CBC, 11401daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_OFB, 11411daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_CFB 11421daecf63SSunyang Wu }; 11431daecf63SSunyang Wu const enum rte_crypto_auth_algorithm auths[] = { 11441daecf63SSunyang Wu RTE_CRYPTO_AUTH_SM3, 11451daecf63SSunyang Wu RTE_CRYPTO_AUTH_SM3_HMAC, 11461daecf63SSunyang Wu }; 11471daecf63SSunyang Wu 11481daecf63SSunyang Wu rte_cryptodev_info_get(dev_id, &dev_info); 11491daecf63SSunyang Wu feat_flags = dev_info.feature_flags; 11501daecf63SSunyang Wu 11511daecf63SSunyang Wu if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 11521daecf63SSunyang Wu (global_api_test_type == CRYPTODEV_RAW_API_TEST && 11531daecf63SSunyang Wu !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11541daecf63SSunyang Wu RTE_LOG(INFO, USER1, "Feature flag for SM4 Chain testsuite not met\n"); 11551daecf63SSunyang Wu return TEST_SKIPPED; 11561daecf63SSunyang Wu } 11571daecf63SSunyang Wu 11581daecf63SSunyang Wu if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 && 11591daecf63SSunyang Wu check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 11601daecf63SSunyang Wu RTE_LOG(INFO, USER1, "Capability for SM4 Chain testsuite not met\n"); 11611daecf63SSunyang Wu return TEST_SKIPPED; 11621daecf63SSunyang Wu } 11631daecf63SSunyang Wu 11641daecf63SSunyang Wu return 0; 11651daecf63SSunyang Wu } 11661daecf63SSunyang Wu 11671daecf63SSunyang Wu static int 11681daecf63SSunyang Wu sm4_cipheronly_setup(void) 11691daecf63SSunyang Wu { 11701daecf63SSunyang Wu uint8_t dev_id = p_testsuite_params->valid_devs[0]; 11711daecf63SSunyang Wu struct rte_cryptodev_info dev_info; 11721daecf63SSunyang Wu uint64_t feat_flags; 11731daecf63SSunyang Wu const enum rte_crypto_cipher_algorithm ciphers[] = { 11741daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_CBC, 11751daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_ECB, 11761daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_CTR, 11771daecf63SSunyang Wu RTE_CRYPTO_CIPHER_SM4_OFB, 1178*4acc862bSHanxiao Li RTE_CRYPTO_CIPHER_SM4_CFB, 1179*4acc862bSHanxiao Li RTE_CRYPTO_CIPHER_SM4_XTS 11801daecf63SSunyang Wu }; 11811daecf63SSunyang Wu 11821daecf63SSunyang Wu rte_cryptodev_info_get(dev_id, &dev_info); 11831daecf63SSunyang Wu feat_flags = dev_info.feature_flags; 11841daecf63SSunyang Wu 11851daecf63SSunyang Wu if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 11861daecf63SSunyang Wu (global_api_test_type == CRYPTODEV_RAW_API_TEST && 11871daecf63SSunyang Wu !(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11881daecf63SSunyang Wu RTE_LOG(INFO, USER1, "Feature flag for SM4 Cipheronly not met\n"); 11891daecf63SSunyang Wu return TEST_SKIPPED; 11901daecf63SSunyang Wu } 11911daecf63SSunyang Wu 11921daecf63SSunyang Wu if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 11931daecf63SSunyang Wu RTE_LOG(INFO, USER1, "Capability for SM4 Cipheronly not met\n"); 11941daecf63SSunyang Wu return TEST_SKIPPED; 11951daecf63SSunyang Wu } 11961daecf63SSunyang Wu 11971daecf63SSunyang Wu return 0; 11981daecf63SSunyang Wu } 11991daecf63SSunyang Wu 1200e65da89cSCiara Power struct unit_test_suite * 1201e65da89cSCiara Power build_blockcipher_test_suite(enum blockcipher_test_type test_type) 1202e65da89cSCiara Power { 1203e65da89cSCiara Power int i, n_test_cases = 0; 1204e65da89cSCiara Power struct unit_test_suite *ts; 1205e65da89cSCiara Power const char *ts_name = NULL; 1206e65da89cSCiara Power const struct blockcipher_test_case *blk_tcs; 1207e65da89cSCiara Power struct unit_test_case *tc; 1208e65da89cSCiara Power int (*ts_setup)(void) = NULL; 1209a9de470cSBruce Richardson 1210a9de470cSBruce Richardson switch (test_type) { 1211a9de470cSBruce Richardson case BLKCIPHER_AES_CHAIN_TYPE: 1212e65da89cSCiara Power n_test_cases = RTE_DIM(aes_chain_test_cases); 1213e65da89cSCiara Power blk_tcs = aes_chain_test_cases; 1214e65da89cSCiara Power ts_name = "AES Chain"; 1215e65da89cSCiara Power ts_setup = aes_chain_setup; 1216a9de470cSBruce Richardson break; 1217a9de470cSBruce Richardson case BLKCIPHER_AES_CIPHERONLY_TYPE: 1218e65da89cSCiara Power n_test_cases = RTE_DIM(aes_cipheronly_test_cases); 1219e65da89cSCiara Power blk_tcs = aes_cipheronly_test_cases; 1220e65da89cSCiara Power ts_name = "AES Cipher Only"; 1221e65da89cSCiara Power ts_setup = aes_cipheronly_setup; 1222a9de470cSBruce Richardson break; 1223a9de470cSBruce Richardson case BLKCIPHER_AES_DOCSIS_TYPE: 1224e65da89cSCiara Power n_test_cases = RTE_DIM(aes_docsis_test_cases); 1225e65da89cSCiara Power blk_tcs = aes_docsis_test_cases; 1226e65da89cSCiara Power ts_name = "AES Docsis"; 1227e65da89cSCiara Power ts_setup = aes_docsis_setup; 1228a9de470cSBruce Richardson break; 1229a9de470cSBruce Richardson case BLKCIPHER_3DES_CHAIN_TYPE: 1230e65da89cSCiara Power n_test_cases = RTE_DIM(triple_des_chain_test_cases); 1231e65da89cSCiara Power blk_tcs = triple_des_chain_test_cases; 1232e65da89cSCiara Power ts_name = "3DES Chain"; 1233e65da89cSCiara Power ts_setup = triple_des_chain_setup; 1234a9de470cSBruce Richardson break; 1235a9de470cSBruce Richardson case BLKCIPHER_3DES_CIPHERONLY_TYPE: 1236e65da89cSCiara Power n_test_cases = RTE_DIM(triple_des_cipheronly_test_cases); 1237e65da89cSCiara Power blk_tcs = triple_des_cipheronly_test_cases; 1238e65da89cSCiara Power ts_name = "3DES Cipher Only"; 1239e65da89cSCiara Power ts_setup = triple_des_cipheronly_setup; 1240a9de470cSBruce Richardson break; 1241a9de470cSBruce Richardson case BLKCIPHER_DES_CIPHERONLY_TYPE: 1242e65da89cSCiara Power n_test_cases = RTE_DIM(des_cipheronly_test_cases); 1243e65da89cSCiara Power blk_tcs = des_cipheronly_test_cases; 1244e65da89cSCiara Power ts_name = "DES Cipher Only"; 1245e65da89cSCiara Power ts_setup = des_cipheronly_setup; 1246a9de470cSBruce Richardson break; 1247a9de470cSBruce Richardson case BLKCIPHER_DES_DOCSIS_TYPE: 1248e65da89cSCiara Power n_test_cases = RTE_DIM(des_docsis_test_cases); 1249e65da89cSCiara Power blk_tcs = des_docsis_test_cases; 1250e65da89cSCiara Power ts_name = "DES Docsis"; 1251e65da89cSCiara Power ts_setup = des_docsis_setup; 1252a9de470cSBruce Richardson break; 12531daecf63SSunyang Wu case BLKCIPHER_SM4_CHAIN_TYPE: 12541daecf63SSunyang Wu n_test_cases = RTE_DIM(sm4_chain_test_cases); 12551daecf63SSunyang Wu blk_tcs = sm4_chain_test_cases; 12561daecf63SSunyang Wu ts_name = "SM4 Chain"; 12571daecf63SSunyang Wu ts_setup = sm4_chain_setup; 12581daecf63SSunyang Wu break; 12591daecf63SSunyang Wu case BLKCIPHER_SM4_CIPHERONLY_TYPE: 12601daecf63SSunyang Wu n_test_cases = RTE_DIM(sm4_cipheronly_test_cases); 12611daecf63SSunyang Wu blk_tcs = sm4_cipheronly_test_cases; 12621daecf63SSunyang Wu ts_name = "SM4 Cipher Only"; 12631daecf63SSunyang Wu ts_setup = sm4_cipheronly_setup; 12641daecf63SSunyang Wu break; 1265a9de470cSBruce Richardson case BLKCIPHER_AUTHONLY_TYPE: 1266e65da89cSCiara Power n_test_cases = RTE_DIM(hash_test_cases); 1267e65da89cSCiara Power blk_tcs = hash_test_cases; 1268e65da89cSCiara Power ts_name = "Auth Only"; 1269e65da89cSCiara Power ts_setup = authonly_setup; 1270a9de470cSBruce Richardson break; 1271a9de470cSBruce Richardson default: 12729c8c8064SThomas Monjalon return NULL; 1273a9de470cSBruce Richardson } 1274a9de470cSBruce Richardson 1275e65da89cSCiara Power ts = calloc(1, sizeof(struct unit_test_suite) + 1276e65da89cSCiara Power (sizeof(struct unit_test_case) * (n_test_cases + 1))); 1277e65da89cSCiara Power ts->suite_name = ts_name; 1278e65da89cSCiara Power ts->setup = ts_setup; 1279e65da89cSCiara Power 1280a9de470cSBruce Richardson for (i = 0; i < n_test_cases; i++) { 1281e65da89cSCiara Power tc = &ts->unit_test_cases[i]; 1282e65da89cSCiara Power tc->name = blk_tcs[i].test_descr; 1283e65da89cSCiara Power tc->enabled = 1; 1284e65da89cSCiara Power tc->setup = ut_setup; 1285e65da89cSCiara Power tc->teardown = ut_teardown; 1286e65da89cSCiara Power tc->testcase = NULL; 1287e65da89cSCiara Power tc->testcase_with_data = blockcipher_test_case_run; 1288e65da89cSCiara Power tc->data = &blk_tcs[i]; 1289a9de470cSBruce Richardson } 1290e65da89cSCiara Power tc = &ts->unit_test_cases[i]; 1291e65da89cSCiara Power tc->name = NULL; 1292e65da89cSCiara Power tc->enabled = 0; 1293e65da89cSCiara Power tc->setup = NULL; 1294e65da89cSCiara Power tc->teardown = NULL; 1295e65da89cSCiara Power tc->testcase = NULL; 1296e65da89cSCiara Power tc->testcase_with_data = NULL; 1297e65da89cSCiara Power tc->data = NULL; 1298e65da89cSCiara Power 1299e65da89cSCiara Power return ts; 1300a9de470cSBruce Richardson } 1301a9de470cSBruce Richardson 1302e65da89cSCiara Power void 1303e65da89cSCiara Power free_blockcipher_test_suite(struct unit_test_suite *ts) 1304e65da89cSCiara Power { 1305e65da89cSCiara Power free(ts); 1306a9de470cSBruce Richardson } 1307