1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2020 Intel Corporation 3 * Copyright 2020 NXP 4 */ 5 6 #include <time.h> 7 8 #include <rte_common.h> 9 #include <rte_hexdump.h> 10 #include <rte_mbuf.h> 11 #include <rte_malloc.h> 12 #include <rte_memcpy.h> 13 #include <rte_pause.h> 14 #include <rte_bus_vdev.h> 15 #include <rte_ether.h> 16 #include <rte_errno.h> 17 18 #include <rte_crypto.h> 19 #include <rte_cryptodev.h> 20 #include <rte_ip.h> 21 #include <rte_string_fns.h> 22 #include <rte_tcp.h> 23 #include <rte_udp.h> 24 25 #ifdef RTE_CRYPTO_SCHEDULER 26 #include <rte_cryptodev_scheduler.h> 27 #include <rte_cryptodev_scheduler_operations.h> 28 #endif 29 30 #include <rte_lcore.h> 31 32 #include "test.h" 33 #include "test_cryptodev.h" 34 35 #include "test_cryptodev_blockcipher.h" 36 #include "test_cryptodev_aes_test_vectors.h" 37 #include "test_cryptodev_des_test_vectors.h" 38 #include "test_cryptodev_hash_test_vectors.h" 39 #include "test_cryptodev_kasumi_test_vectors.h" 40 #include "test_cryptodev_kasumi_hash_test_vectors.h" 41 #include "test_cryptodev_snow3g_test_vectors.h" 42 #include "test_cryptodev_snow3g_hash_test_vectors.h" 43 #include "test_cryptodev_zuc_test_vectors.h" 44 #include "test_cryptodev_aead_test_vectors.h" 45 #include "test_cryptodev_hmac_test_vectors.h" 46 #include "test_cryptodev_mixed_test_vectors.h" 47 #ifdef RTE_LIB_SECURITY 48 #include "test_cryptodev_security_ipsec.h" 49 #include "test_cryptodev_security_ipsec_test_vectors.h" 50 #include "test_cryptodev_security_pdcp_test_vectors.h" 51 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 52 #include "test_cryptodev_security_pdcp_test_func.h" 53 #include "test_cryptodev_security_docsis_test_vectors.h" 54 55 #define SDAP_DISABLED 0 56 #define SDAP_ENABLED 1 57 #endif 58 59 #define VDEV_ARGS_SIZE 100 60 #define MAX_NB_SESSIONS 4 61 62 #define MAX_DRV_SERVICE_CTX_SIZE 256 63 64 #define MAX_RAW_DEQUEUE_COUNT 65535 65 66 #define IN_PLACE 0 67 #define OUT_OF_PLACE 1 68 69 static int gbl_driver_id; 70 71 static enum rte_security_session_action_type gbl_action_type = 72 RTE_SECURITY_ACTION_TYPE_NONE; 73 74 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 75 76 struct crypto_unittest_params { 77 struct rte_crypto_sym_xform cipher_xform; 78 struct rte_crypto_sym_xform auth_xform; 79 struct rte_crypto_sym_xform aead_xform; 80 #ifdef RTE_LIB_SECURITY 81 struct rte_security_docsis_xform docsis_xform; 82 #endif 83 84 union { 85 void *sess; 86 #ifdef RTE_LIB_SECURITY 87 void *sec_session; 88 #endif 89 }; 90 #ifdef RTE_LIB_SECURITY 91 enum rte_security_session_action_type type; 92 #endif 93 struct rte_crypto_op *op; 94 95 struct rte_mbuf *obuf, *ibuf; 96 97 uint8_t *digest; 98 }; 99 100 #define ALIGN_POW2_ROUNDUP(num, align) \ 101 (((num) + (align) - 1) & ~((align) - 1)) 102 103 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \ 104 for (j = 0; j < num_child_ts; index++, j++) \ 105 parent_ts.unit_test_suites[index] = child_ts[j] 106 107 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \ 108 for (j = 0; j < num_blk_types; index++, j++) \ 109 parent_ts.unit_test_suites[index] = \ 110 build_blockcipher_test_suite(blk_types[j]) 111 112 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \ 113 for (j = index; j < index + num_blk_types; j++) \ 114 free_blockcipher_test_suite(parent_ts.unit_test_suites[j]) 115 116 /* 117 * Forward declarations. 118 */ 119 static int 120 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 121 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 122 uint8_t *hmac_key); 123 124 static int 125 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess, 126 struct crypto_unittest_params *ut_params, 127 struct crypto_testsuite_params *ts_param, 128 const uint8_t *cipher, 129 const uint8_t *digest, 130 const uint8_t *iv); 131 132 static int 133 security_proto_supported(enum rte_security_session_action_type action, 134 enum rte_security_session_protocol proto); 135 136 static int 137 dev_configure_and_start(uint64_t ff_disable); 138 139 static struct rte_mbuf * 140 setup_test_string(struct rte_mempool *mpool, 141 const char *string, size_t len, uint8_t blocksize) 142 { 143 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 144 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 145 146 if (m) { 147 char *dst; 148 149 memset(m->buf_addr, 0, m->buf_len); 150 dst = rte_pktmbuf_append(m, t_len); 151 if (!dst) { 152 rte_pktmbuf_free(m); 153 return NULL; 154 } 155 if (string != NULL) 156 rte_memcpy(dst, string, t_len); 157 else 158 memset(dst, 0, t_len); 159 } 160 161 return m; 162 } 163 164 /* Get number of bytes in X bits (rounding up) */ 165 static uint32_t 166 ceil_byte_length(uint32_t num_bits) 167 { 168 if (num_bits % 8) 169 return ((num_bits >> 3) + 1); 170 else 171 return (num_bits >> 3); 172 } 173 174 static void 175 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 176 uint8_t is_op_success) 177 { 178 struct rte_crypto_op *op = user_data; 179 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 180 RTE_CRYPTO_OP_STATUS_ERROR; 181 } 182 183 static struct crypto_testsuite_params testsuite_params = { NULL }; 184 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; 185 static struct crypto_unittest_params unittest_params; 186 187 void 188 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 189 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 190 uint8_t len_in_bits, uint8_t cipher_iv_len) 191 { 192 struct rte_crypto_sym_op *sop = op->sym; 193 struct rte_crypto_op *ret_op = NULL; 194 struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX]; 195 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 196 union rte_crypto_sym_ofs ofs; 197 struct rte_crypto_sym_vec vec; 198 struct rte_crypto_sgl sgl, dest_sgl; 199 uint32_t max_len; 200 union rte_cryptodev_session_ctx sess; 201 uint64_t auth_end_iova; 202 uint32_t count = 0; 203 struct rte_crypto_raw_dp_ctx *ctx; 204 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 205 auth_len = 0; 206 int32_t n; 207 uint32_t n_success; 208 int ctx_service_size; 209 int32_t status = 0; 210 int enqueue_status, dequeue_status; 211 struct crypto_unittest_params *ut_params = &unittest_params; 212 int is_sgl = sop->m_src->nb_segs > 1; 213 int is_oop = 0; 214 215 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id); 216 if (ctx_service_size < 0) { 217 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 218 return; 219 } 220 221 ctx = malloc(ctx_service_size); 222 if (!ctx) { 223 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 224 return; 225 } 226 227 /* Both are enums, setting crypto_sess will suit any session type */ 228 sess.crypto_sess = op->sym->session; 229 230 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, 231 op->sess_type, sess, 0) < 0) { 232 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 233 goto exit; 234 } 235 236 cipher_iv.iova = 0; 237 cipher_iv.va = NULL; 238 aad_auth_iv.iova = 0; 239 aad_auth_iv.va = NULL; 240 digest.iova = 0; 241 digest.va = NULL; 242 sgl.vec = data_vec; 243 vec.num = 1; 244 vec.src_sgl = &sgl; 245 vec.iv = &cipher_iv; 246 vec.digest = &digest; 247 vec.aad = &aad_auth_iv; 248 vec.status = &status; 249 250 ofs.raw = 0; 251 252 if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src)) 253 is_oop = 1; 254 255 if (is_cipher && is_auth) { 256 cipher_offset = sop->cipher.data.offset; 257 cipher_len = sop->cipher.data.length; 258 auth_offset = sop->auth.data.offset; 259 auth_len = sop->auth.data.length; 260 max_len = RTE_MAX(cipher_offset + cipher_len, 261 auth_offset + auth_len); 262 if (len_in_bits) { 263 max_len = max_len >> 3; 264 cipher_offset = cipher_offset >> 3; 265 auth_offset = auth_offset >> 3; 266 cipher_len = cipher_len >> 3; 267 auth_len = auth_len >> 3; 268 } 269 ofs.ofs.cipher.head = cipher_offset; 270 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 271 ofs.ofs.auth.head = auth_offset; 272 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 273 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 274 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 275 aad_auth_iv.va = rte_crypto_op_ctod_offset( 276 op, void *, IV_OFFSET + cipher_iv_len); 277 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 278 cipher_iv_len); 279 digest.va = (void *)sop->auth.digest.data; 280 digest.iova = sop->auth.digest.phys_addr; 281 282 if (is_sgl) { 283 uint32_t remaining_off = auth_offset + auth_len; 284 struct rte_mbuf *sgl_buf = sop->m_src; 285 if (is_oop) 286 sgl_buf = sop->m_dst; 287 288 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf) 289 && sgl_buf->next != NULL) { 290 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 291 sgl_buf = sgl_buf->next; 292 } 293 294 auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset( 295 sgl_buf, remaining_off); 296 } else { 297 auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) + 298 auth_offset + auth_len; 299 } 300 /* Then check if digest-encrypted conditions are met */ 301 if ((auth_offset + auth_len < cipher_offset + cipher_len) && 302 (digest.iova == auth_end_iova) && is_sgl) 303 max_len = RTE_MAX(max_len, 304 auth_offset + auth_len + 305 ut_params->auth_xform.auth.digest_length); 306 307 } else if (is_cipher) { 308 cipher_offset = sop->cipher.data.offset; 309 cipher_len = sop->cipher.data.length; 310 max_len = cipher_len + cipher_offset; 311 if (len_in_bits) { 312 max_len = max_len >> 3; 313 cipher_offset = cipher_offset >> 3; 314 cipher_len = cipher_len >> 3; 315 } 316 ofs.ofs.cipher.head = cipher_offset; 317 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 318 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 319 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 320 321 } else if (is_auth) { 322 auth_offset = sop->auth.data.offset; 323 auth_len = sop->auth.data.length; 324 max_len = auth_len + auth_offset; 325 if (len_in_bits) { 326 max_len = max_len >> 3; 327 auth_offset = auth_offset >> 3; 328 auth_len = auth_len >> 3; 329 } 330 ofs.ofs.auth.head = auth_offset; 331 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 332 aad_auth_iv.va = rte_crypto_op_ctod_offset( 333 op, void *, IV_OFFSET + cipher_iv_len); 334 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 335 cipher_iv_len); 336 digest.va = (void *)sop->auth.digest.data; 337 digest.iova = sop->auth.digest.phys_addr; 338 339 } else { /* aead */ 340 cipher_offset = sop->aead.data.offset; 341 cipher_len = sop->aead.data.length; 342 max_len = cipher_len + cipher_offset; 343 if (len_in_bits) { 344 max_len = max_len >> 3; 345 cipher_offset = cipher_offset >> 3; 346 cipher_len = cipher_len >> 3; 347 } 348 ofs.ofs.cipher.head = cipher_offset; 349 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 350 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 351 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 352 aad_auth_iv.va = (void *)sop->aead.aad.data; 353 aad_auth_iv.iova = sop->aead.aad.phys_addr; 354 digest.va = (void *)sop->aead.digest.data; 355 digest.iova = sop->aead.digest.phys_addr; 356 } 357 358 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 359 data_vec, RTE_DIM(data_vec)); 360 if (n < 0 || n > sop->m_src->nb_segs) { 361 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 362 goto exit; 363 } 364 365 sgl.num = n; 366 /* Out of place */ 367 if (is_oop) { 368 dest_sgl.vec = dest_data_vec; 369 vec.dest_sgl = &dest_sgl; 370 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len, 371 dest_data_vec, RTE_DIM(dest_data_vec)); 372 if (n < 0 || n > sop->m_dst->nb_segs) { 373 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 374 goto exit; 375 } 376 dest_sgl.num = n; 377 } else 378 vec.dest_sgl = NULL; 379 380 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 381 &enqueue_status) < 1) { 382 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 383 goto exit; 384 } 385 386 if (enqueue_status == 0) { 387 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 388 if (status < 0) { 389 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 390 goto exit; 391 } 392 } else if (enqueue_status < 0) { 393 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 394 goto exit; 395 } 396 397 n = n_success = 0; 398 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 399 n = rte_cryptodev_raw_dequeue_burst(ctx, 400 NULL, 1, post_process_raw_dp_op, 401 (void **)&ret_op, 0, &n_success, 402 &dequeue_status); 403 if (dequeue_status < 0) { 404 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 405 goto exit; 406 } 407 if (n == 0) 408 rte_pause(); 409 } 410 411 if (n == 1 && dequeue_status == 0) { 412 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 413 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 414 goto exit; 415 } 416 } 417 418 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 419 ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR || 420 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 421 RTE_CRYPTO_OP_STATUS_SUCCESS; 422 423 exit: 424 free(ctx); 425 } 426 427 static void 428 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 429 { 430 int32_t n, st; 431 struct rte_crypto_sym_op *sop; 432 union rte_crypto_sym_ofs ofs; 433 struct rte_crypto_sgl sgl; 434 struct rte_crypto_sym_vec symvec; 435 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 436 struct rte_crypto_vec vec[UINT8_MAX]; 437 438 sop = op->sym; 439 440 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 441 sop->aead.data.length, vec, RTE_DIM(vec)); 442 443 if (n < 0 || n != sop->m_src->nb_segs) { 444 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 445 return; 446 } 447 448 sgl.vec = vec; 449 sgl.num = n; 450 symvec.src_sgl = &sgl; 451 symvec.iv = &iv_ptr; 452 symvec.digest = &digest_ptr; 453 symvec.aad = &aad_ptr; 454 symvec.status = &st; 455 symvec.num = 1; 456 457 /* for CPU crypto the IOVA address is not required */ 458 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 459 digest_ptr.va = (void *)sop->aead.digest.data; 460 aad_ptr.va = (void *)sop->aead.aad.data; 461 462 ofs.raw = 0; 463 464 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 465 &symvec); 466 467 if (n != 1) 468 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 469 else 470 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 471 } 472 473 static void 474 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 475 { 476 int32_t n, st; 477 struct rte_crypto_sym_op *sop; 478 union rte_crypto_sym_ofs ofs; 479 struct rte_crypto_sgl sgl; 480 struct rte_crypto_sym_vec symvec; 481 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 482 struct rte_crypto_vec vec[UINT8_MAX]; 483 484 sop = op->sym; 485 486 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 487 sop->auth.data.length, vec, RTE_DIM(vec)); 488 489 if (n < 0 || n != sop->m_src->nb_segs) { 490 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 491 return; 492 } 493 494 sgl.vec = vec; 495 sgl.num = n; 496 symvec.src_sgl = &sgl; 497 symvec.iv = &iv_ptr; 498 symvec.digest = &digest_ptr; 499 symvec.status = &st; 500 symvec.num = 1; 501 502 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 503 digest_ptr.va = (void *)sop->auth.digest.data; 504 505 ofs.raw = 0; 506 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 507 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 508 (sop->cipher.data.offset + sop->cipher.data.length); 509 510 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 511 &symvec); 512 513 if (n != 1) 514 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 515 else 516 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 517 } 518 519 static struct rte_crypto_op * 520 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 521 { 522 523 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 524 525 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 526 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 527 return NULL; 528 } 529 530 op = NULL; 531 532 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 533 rte_pause(); 534 535 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 536 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 537 return NULL; 538 } 539 540 return op; 541 } 542 543 static int 544 testsuite_setup(void) 545 { 546 struct crypto_testsuite_params *ts_params = &testsuite_params; 547 struct rte_cryptodev_info info; 548 uint32_t i = 0, nb_devs, dev_id; 549 uint16_t qp_id; 550 551 memset(ts_params, 0, sizeof(*ts_params)); 552 553 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 554 if (ts_params->mbuf_pool == NULL) { 555 /* Not already created so create */ 556 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 557 "CRYPTO_MBUFPOOL", 558 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 559 rte_socket_id()); 560 if (ts_params->mbuf_pool == NULL) { 561 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 562 return TEST_FAILED; 563 } 564 } 565 566 ts_params->large_mbuf_pool = rte_mempool_lookup( 567 "CRYPTO_LARGE_MBUFPOOL"); 568 if (ts_params->large_mbuf_pool == NULL) { 569 /* Not already created so create */ 570 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 571 "CRYPTO_LARGE_MBUFPOOL", 572 1, 0, 0, UINT16_MAX, 573 rte_socket_id()); 574 if (ts_params->large_mbuf_pool == NULL) { 575 RTE_LOG(ERR, USER1, 576 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 577 return TEST_FAILED; 578 } 579 } 580 581 ts_params->op_mpool = rte_crypto_op_pool_create( 582 "MBUF_CRYPTO_SYM_OP_POOL", 583 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 584 NUM_MBUFS, MBUF_CACHE_SIZE, 585 DEFAULT_NUM_XFORMS * 586 sizeof(struct rte_crypto_sym_xform) + 587 MAXIMUM_IV_LENGTH, 588 rte_socket_id()); 589 if (ts_params->op_mpool == NULL) { 590 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 591 return TEST_FAILED; 592 } 593 594 nb_devs = rte_cryptodev_count(); 595 if (nb_devs < 1) { 596 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 597 return TEST_SKIPPED; 598 } 599 600 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) { 601 RTE_LOG(WARNING, USER1, "No %s devices found?\n", 602 rte_cryptodev_driver_name_get(gbl_driver_id)); 603 return TEST_SKIPPED; 604 } 605 606 /* Create list of valid crypto devs */ 607 for (i = 0; i < nb_devs; i++) { 608 rte_cryptodev_info_get(i, &info); 609 if (info.driver_id == gbl_driver_id) 610 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 611 } 612 613 if (ts_params->valid_dev_count < 1) 614 return TEST_FAILED; 615 616 /* Set up all the qps on the first of the valid devices found */ 617 618 dev_id = ts_params->valid_devs[0]; 619 620 rte_cryptodev_info_get(dev_id, &info); 621 622 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 623 ts_params->conf.socket_id = SOCKET_ID_ANY; 624 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 625 626 unsigned int session_size = 627 rte_cryptodev_sym_get_private_session_size(dev_id); 628 629 #ifdef RTE_LIB_SECURITY 630 unsigned int security_session_size = rte_security_session_get_size( 631 rte_cryptodev_get_sec_ctx(dev_id)); 632 633 if (session_size < security_session_size) 634 session_size = security_session_size; 635 #endif 636 /* 637 * Create mempool with maximum number of sessions. 638 */ 639 if (info.sym.max_nb_sessions != 0 && 640 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 641 RTE_LOG(ERR, USER1, "Device does not support " 642 "at least %u sessions\n", 643 MAX_NB_SESSIONS); 644 return TEST_FAILED; 645 } 646 647 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 648 "test_sess_mp", MAX_NB_SESSIONS, session_size, 0, 0, 649 SOCKET_ID_ANY); 650 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 651 "session mempool allocation failed"); 652 653 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 654 &ts_params->conf), 655 "Failed to configure cryptodev %u with %u qps", 656 dev_id, ts_params->conf.nb_queue_pairs); 657 658 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 659 ts_params->qp_conf.mp_session = ts_params->session_mpool; 660 661 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 662 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 663 dev_id, qp_id, &ts_params->qp_conf, 664 rte_cryptodev_socket_id(dev_id)), 665 "Failed to setup queue pair %u on cryptodev %u", 666 qp_id, dev_id); 667 } 668 669 return TEST_SUCCESS; 670 } 671 672 static void 673 testsuite_teardown(void) 674 { 675 struct crypto_testsuite_params *ts_params = &testsuite_params; 676 int res; 677 678 if (ts_params->mbuf_pool != NULL) { 679 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 680 rte_mempool_avail_count(ts_params->mbuf_pool)); 681 } 682 683 if (ts_params->op_mpool != NULL) { 684 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 685 rte_mempool_avail_count(ts_params->op_mpool)); 686 } 687 688 if (ts_params->session_mpool != NULL) { 689 rte_mempool_free(ts_params->session_mpool); 690 ts_params->session_mpool = NULL; 691 } 692 693 res = rte_cryptodev_close(ts_params->valid_devs[0]); 694 if (res) 695 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res); 696 } 697 698 static int 699 check_capabilities_supported(enum rte_crypto_sym_xform_type type, 700 const int *algs, uint16_t num_algs) 701 { 702 uint8_t dev_id = testsuite_params.valid_devs[0]; 703 bool some_alg_supported = FALSE; 704 uint16_t i; 705 706 for (i = 0; i < num_algs && !some_alg_supported; i++) { 707 struct rte_cryptodev_sym_capability_idx alg = { 708 type, {algs[i]} 709 }; 710 if (rte_cryptodev_sym_capability_get(dev_id, 711 &alg) != NULL) 712 some_alg_supported = TRUE; 713 } 714 if (!some_alg_supported) 715 return TEST_SKIPPED; 716 717 return 0; 718 } 719 720 int 721 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 722 uint16_t num_ciphers) 723 { 724 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, 725 (const int *) ciphers, num_ciphers); 726 } 727 728 int 729 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 730 uint16_t num_auths) 731 { 732 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, 733 (const int *) auths, num_auths); 734 } 735 736 int 737 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 738 uint16_t num_aeads) 739 { 740 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, 741 (const int *) aeads, num_aeads); 742 } 743 744 static int 745 null_testsuite_setup(void) 746 { 747 struct crypto_testsuite_params *ts_params = &testsuite_params; 748 uint8_t dev_id = ts_params->valid_devs[0]; 749 struct rte_cryptodev_info dev_info; 750 const enum rte_crypto_cipher_algorithm ciphers[] = { 751 RTE_CRYPTO_CIPHER_NULL 752 }; 753 const enum rte_crypto_auth_algorithm auths[] = { 754 RTE_CRYPTO_AUTH_NULL 755 }; 756 757 rte_cryptodev_info_get(dev_id, &dev_info); 758 759 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 760 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL " 761 "testsuite not met\n"); 762 return TEST_SKIPPED; 763 } 764 765 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 766 && check_auth_capabilities_supported(auths, 767 RTE_DIM(auths)) != 0) { 768 RTE_LOG(INFO, USER1, "Capability requirements for NULL " 769 "testsuite not met\n"); 770 return TEST_SKIPPED; 771 } 772 773 return 0; 774 } 775 776 static int 777 crypto_gen_testsuite_setup(void) 778 { 779 struct crypto_testsuite_params *ts_params = &testsuite_params; 780 uint8_t dev_id = ts_params->valid_devs[0]; 781 struct rte_cryptodev_info dev_info; 782 783 rte_cryptodev_info_get(dev_id, &dev_info); 784 785 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 786 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen " 787 "testsuite not met\n"); 788 return TEST_SKIPPED; 789 } 790 791 return 0; 792 } 793 794 #ifdef RTE_LIB_SECURITY 795 static int 796 ipsec_proto_testsuite_setup(void) 797 { 798 struct crypto_testsuite_params *ts_params = &testsuite_params; 799 struct crypto_unittest_params *ut_params = &unittest_params; 800 struct rte_cryptodev_info dev_info; 801 int ret = 0; 802 803 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 804 805 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) { 806 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto " 807 "testsuite not met\n"); 808 return TEST_SKIPPED; 809 } 810 811 /* Reconfigure to enable security */ 812 ret = dev_configure_and_start(0); 813 if (ret != TEST_SUCCESS) 814 return ret; 815 816 /* Set action type */ 817 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 818 819 if (security_proto_supported( 820 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 821 RTE_SECURITY_PROTOCOL_IPSEC) < 0) { 822 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto " 823 "test not met\n"); 824 ret = TEST_SKIPPED; 825 } 826 827 test_ipsec_alg_list_populate(); 828 test_ipsec_ah_alg_list_populate(); 829 830 /* 831 * Stop the device. Device would be started again by individual test 832 * case setup routine. 833 */ 834 rte_cryptodev_stop(ts_params->valid_devs[0]); 835 836 return ret; 837 } 838 839 static int 840 pdcp_proto_testsuite_setup(void) 841 { 842 struct crypto_testsuite_params *ts_params = &testsuite_params; 843 uint8_t dev_id = ts_params->valid_devs[0]; 844 struct rte_cryptodev_info dev_info; 845 const enum rte_crypto_cipher_algorithm ciphers[] = { 846 RTE_CRYPTO_CIPHER_NULL, 847 RTE_CRYPTO_CIPHER_AES_CTR, 848 RTE_CRYPTO_CIPHER_ZUC_EEA3, 849 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 850 }; 851 const enum rte_crypto_auth_algorithm auths[] = { 852 RTE_CRYPTO_AUTH_NULL, 853 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 854 RTE_CRYPTO_AUTH_AES_CMAC, 855 RTE_CRYPTO_AUTH_ZUC_EIA3 856 }; 857 858 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_auth_key)); 859 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_bearer)); 860 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_crypto_key)); 861 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_in)); 862 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_in_len)); 863 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_out)); 864 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_data_sn_size)); 865 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_hfn)); 866 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_hfn_threshold)); 867 RTE_BUILD_BUG_ON(RTE_DIM(pdcp_test_params) != RTE_DIM(pdcp_test_packet_direction)); 868 869 rte_cryptodev_info_get(dev_id, &dev_info); 870 871 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 872 !(dev_info.feature_flags & 873 RTE_CRYPTODEV_FF_SECURITY)) { 874 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto " 875 "testsuite not met\n"); 876 return TEST_SKIPPED; 877 } 878 879 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 880 && check_auth_capabilities_supported(auths, 881 RTE_DIM(auths)) != 0) { 882 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto " 883 "testsuite not met\n"); 884 return TEST_SKIPPED; 885 } 886 887 return 0; 888 } 889 890 static int 891 docsis_proto_testsuite_setup(void) 892 { 893 struct crypto_testsuite_params *ts_params = &testsuite_params; 894 uint8_t dev_id = ts_params->valid_devs[0]; 895 struct rte_cryptodev_info dev_info; 896 const enum rte_crypto_cipher_algorithm ciphers[] = { 897 RTE_CRYPTO_CIPHER_AES_DOCSISBPI 898 }; 899 900 rte_cryptodev_info_get(dev_id, &dev_info); 901 902 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 903 !(dev_info.feature_flags & 904 RTE_CRYPTODEV_FF_SECURITY)) { 905 RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS " 906 "Proto testsuite not met\n"); 907 return TEST_SKIPPED; 908 } 909 910 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 911 RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto " 912 "testsuite not met\n"); 913 return TEST_SKIPPED; 914 } 915 916 return 0; 917 } 918 #endif 919 920 static int 921 aes_ccm_auth_testsuite_setup(void) 922 { 923 struct crypto_testsuite_params *ts_params = &testsuite_params; 924 uint8_t dev_id = ts_params->valid_devs[0]; 925 struct rte_cryptodev_info dev_info; 926 const enum rte_crypto_aead_algorithm aeads[] = { 927 RTE_CRYPTO_AEAD_AES_CCM 928 }; 929 930 rte_cryptodev_info_get(dev_id, &dev_info); 931 932 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 933 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 934 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 935 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM " 936 "testsuite not met\n"); 937 return TEST_SKIPPED; 938 } 939 940 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 941 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM " 942 "testsuite not met\n"); 943 return TEST_SKIPPED; 944 } 945 946 return 0; 947 } 948 949 static int 950 aes_gcm_auth_testsuite_setup(void) 951 { 952 struct crypto_testsuite_params *ts_params = &testsuite_params; 953 uint8_t dev_id = ts_params->valid_devs[0]; 954 struct rte_cryptodev_info dev_info; 955 const enum rte_crypto_aead_algorithm aeads[] = { 956 RTE_CRYPTO_AEAD_AES_GCM 957 }; 958 959 rte_cryptodev_info_get(dev_id, &dev_info); 960 961 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 962 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM " 963 "testsuite not met\n"); 964 return TEST_SKIPPED; 965 } 966 967 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 968 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM " 969 "testsuite not met\n"); 970 return TEST_SKIPPED; 971 } 972 973 return 0; 974 } 975 976 static int 977 aes_gmac_auth_testsuite_setup(void) 978 { 979 struct crypto_testsuite_params *ts_params = &testsuite_params; 980 uint8_t dev_id = ts_params->valid_devs[0]; 981 struct rte_cryptodev_info dev_info; 982 const enum rte_crypto_auth_algorithm auths[] = { 983 RTE_CRYPTO_AUTH_AES_GMAC 984 }; 985 986 rte_cryptodev_info_get(dev_id, &dev_info); 987 988 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 989 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 990 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 991 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC " 992 "testsuite not met\n"); 993 return TEST_SKIPPED; 994 } 995 996 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 997 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC " 998 "testsuite not met\n"); 999 return TEST_SKIPPED; 1000 } 1001 1002 return 0; 1003 } 1004 1005 static int 1006 chacha20_poly1305_testsuite_setup(void) 1007 { 1008 struct crypto_testsuite_params *ts_params = &testsuite_params; 1009 uint8_t dev_id = ts_params->valid_devs[0]; 1010 struct rte_cryptodev_info dev_info; 1011 const enum rte_crypto_aead_algorithm aeads[] = { 1012 RTE_CRYPTO_AEAD_CHACHA20_POLY1305 1013 }; 1014 1015 rte_cryptodev_info_get(dev_id, &dev_info); 1016 1017 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1018 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1019 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1020 RTE_LOG(INFO, USER1, "Feature flag requirements for " 1021 "Chacha20-Poly1305 testsuite not met\n"); 1022 return TEST_SKIPPED; 1023 } 1024 1025 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1026 RTE_LOG(INFO, USER1, "Capability requirements for " 1027 "Chacha20-Poly1305 testsuite not met\n"); 1028 return TEST_SKIPPED; 1029 } 1030 1031 return 0; 1032 } 1033 1034 static int 1035 snow3g_testsuite_setup(void) 1036 { 1037 struct crypto_testsuite_params *ts_params = &testsuite_params; 1038 uint8_t dev_id = ts_params->valid_devs[0]; 1039 struct rte_cryptodev_info dev_info; 1040 const enum rte_crypto_cipher_algorithm ciphers[] = { 1041 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1042 1043 }; 1044 const enum rte_crypto_auth_algorithm auths[] = { 1045 RTE_CRYPTO_AUTH_SNOW3G_UIA2 1046 }; 1047 1048 rte_cryptodev_info_get(dev_id, &dev_info); 1049 1050 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1051 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G " 1052 "testsuite not met\n"); 1053 return TEST_SKIPPED; 1054 } 1055 1056 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1057 && check_auth_capabilities_supported(auths, 1058 RTE_DIM(auths)) != 0) { 1059 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G " 1060 "testsuite not met\n"); 1061 return TEST_SKIPPED; 1062 } 1063 1064 return 0; 1065 } 1066 1067 static int 1068 zuc_testsuite_setup(void) 1069 { 1070 struct crypto_testsuite_params *ts_params = &testsuite_params; 1071 uint8_t dev_id = ts_params->valid_devs[0]; 1072 struct rte_cryptodev_info dev_info; 1073 const enum rte_crypto_cipher_algorithm ciphers[] = { 1074 RTE_CRYPTO_CIPHER_ZUC_EEA3 1075 }; 1076 const enum rte_crypto_auth_algorithm auths[] = { 1077 RTE_CRYPTO_AUTH_ZUC_EIA3 1078 }; 1079 1080 rte_cryptodev_info_get(dev_id, &dev_info); 1081 1082 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1083 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " 1084 "testsuite not met\n"); 1085 return TEST_SKIPPED; 1086 } 1087 1088 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1089 && check_auth_capabilities_supported(auths, 1090 RTE_DIM(auths)) != 0) { 1091 RTE_LOG(INFO, USER1, "Capability requirements for ZUC " 1092 "testsuite not met\n"); 1093 return TEST_SKIPPED; 1094 } 1095 1096 return 0; 1097 } 1098 1099 static int 1100 hmac_md5_auth_testsuite_setup(void) 1101 { 1102 struct crypto_testsuite_params *ts_params = &testsuite_params; 1103 uint8_t dev_id = ts_params->valid_devs[0]; 1104 struct rte_cryptodev_info dev_info; 1105 const enum rte_crypto_auth_algorithm auths[] = { 1106 RTE_CRYPTO_AUTH_MD5_HMAC 1107 }; 1108 1109 rte_cryptodev_info_get(dev_id, &dev_info); 1110 1111 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1112 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1113 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1114 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 " 1115 "Auth testsuite not met\n"); 1116 return TEST_SKIPPED; 1117 } 1118 1119 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1120 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 " 1121 "testsuite not met\n"); 1122 return TEST_SKIPPED; 1123 } 1124 1125 return 0; 1126 } 1127 1128 static int 1129 kasumi_testsuite_setup(void) 1130 { 1131 struct crypto_testsuite_params *ts_params = &testsuite_params; 1132 uint8_t dev_id = ts_params->valid_devs[0]; 1133 struct rte_cryptodev_info dev_info; 1134 const enum rte_crypto_cipher_algorithm ciphers[] = { 1135 RTE_CRYPTO_CIPHER_KASUMI_F8 1136 }; 1137 const enum rte_crypto_auth_algorithm auths[] = { 1138 RTE_CRYPTO_AUTH_KASUMI_F9 1139 }; 1140 1141 rte_cryptodev_info_get(dev_id, &dev_info); 1142 1143 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1144 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1145 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1146 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi " 1147 "testsuite not met\n"); 1148 return TEST_SKIPPED; 1149 } 1150 1151 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1152 && check_auth_capabilities_supported(auths, 1153 RTE_DIM(auths)) != 0) { 1154 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi " 1155 "testsuite not met\n"); 1156 return TEST_SKIPPED; 1157 } 1158 1159 return 0; 1160 } 1161 1162 static int 1163 negative_aes_gcm_testsuite_setup(void) 1164 { 1165 struct crypto_testsuite_params *ts_params = &testsuite_params; 1166 uint8_t dev_id = ts_params->valid_devs[0]; 1167 struct rte_cryptodev_info dev_info; 1168 const enum rte_crypto_aead_algorithm aeads[] = { 1169 RTE_CRYPTO_AEAD_AES_GCM 1170 }; 1171 1172 rte_cryptodev_info_get(dev_id, &dev_info); 1173 1174 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1175 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1176 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1177 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1178 "AES GCM testsuite not met\n"); 1179 return TEST_SKIPPED; 1180 } 1181 1182 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1183 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1184 "AES GCM testsuite not met\n"); 1185 return TEST_SKIPPED; 1186 } 1187 1188 return 0; 1189 } 1190 1191 static int 1192 negative_aes_gmac_testsuite_setup(void) 1193 { 1194 struct crypto_testsuite_params *ts_params = &testsuite_params; 1195 uint8_t dev_id = ts_params->valid_devs[0]; 1196 struct rte_cryptodev_info dev_info; 1197 const enum rte_crypto_auth_algorithm auths[] = { 1198 RTE_CRYPTO_AUTH_AES_GMAC 1199 }; 1200 1201 rte_cryptodev_info_get(dev_id, &dev_info); 1202 1203 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1204 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1205 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1206 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1207 "AES GMAC testsuite not met\n"); 1208 return TEST_SKIPPED; 1209 } 1210 1211 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1212 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1213 "AES GMAC testsuite not met\n"); 1214 return TEST_SKIPPED; 1215 } 1216 1217 return 0; 1218 } 1219 1220 static int 1221 mixed_cipher_hash_testsuite_setup(void) 1222 { 1223 struct crypto_testsuite_params *ts_params = &testsuite_params; 1224 uint8_t dev_id = ts_params->valid_devs[0]; 1225 struct rte_cryptodev_info dev_info; 1226 uint64_t feat_flags; 1227 const enum rte_crypto_cipher_algorithm ciphers[] = { 1228 RTE_CRYPTO_CIPHER_NULL, 1229 RTE_CRYPTO_CIPHER_AES_CTR, 1230 RTE_CRYPTO_CIPHER_ZUC_EEA3, 1231 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1232 }; 1233 const enum rte_crypto_auth_algorithm auths[] = { 1234 RTE_CRYPTO_AUTH_NULL, 1235 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 1236 RTE_CRYPTO_AUTH_AES_CMAC, 1237 RTE_CRYPTO_AUTH_ZUC_EIA3 1238 }; 1239 1240 rte_cryptodev_info_get(dev_id, &dev_info); 1241 feat_flags = dev_info.feature_flags; 1242 1243 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1244 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1245 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed " 1246 "Cipher Hash testsuite not met\n"); 1247 return TEST_SKIPPED; 1248 } 1249 1250 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1251 && check_auth_capabilities_supported(auths, 1252 RTE_DIM(auths)) != 0) { 1253 RTE_LOG(INFO, USER1, "Capability requirements for Mixed " 1254 "Cipher Hash testsuite not met\n"); 1255 return TEST_SKIPPED; 1256 } 1257 1258 return 0; 1259 } 1260 1261 static int 1262 esn_testsuite_setup(void) 1263 { 1264 struct crypto_testsuite_params *ts_params = &testsuite_params; 1265 uint8_t dev_id = ts_params->valid_devs[0]; 1266 struct rte_cryptodev_info dev_info; 1267 const enum rte_crypto_cipher_algorithm ciphers[] = { 1268 RTE_CRYPTO_CIPHER_AES_CBC 1269 }; 1270 const enum rte_crypto_auth_algorithm auths[] = { 1271 RTE_CRYPTO_AUTH_SHA1_HMAC 1272 }; 1273 1274 rte_cryptodev_info_get(dev_id, &dev_info); 1275 1276 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1277 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1278 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1279 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " 1280 "testsuite not met\n"); 1281 return TEST_SKIPPED; 1282 } 1283 1284 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1285 && check_auth_capabilities_supported(auths, 1286 RTE_DIM(auths)) != 0) { 1287 RTE_LOG(INFO, USER1, "Capability requirements for ESN " 1288 "testsuite not met\n"); 1289 return TEST_SKIPPED; 1290 } 1291 1292 return 0; 1293 } 1294 1295 static int 1296 multi_session_testsuite_setup(void) 1297 { 1298 struct crypto_testsuite_params *ts_params = &testsuite_params; 1299 uint8_t dev_id = ts_params->valid_devs[0]; 1300 struct rte_cryptodev_info dev_info; 1301 const enum rte_crypto_cipher_algorithm ciphers[] = { 1302 RTE_CRYPTO_CIPHER_AES_CBC 1303 }; 1304 const enum rte_crypto_auth_algorithm auths[] = { 1305 RTE_CRYPTO_AUTH_SHA512_HMAC 1306 }; 1307 1308 rte_cryptodev_info_get(dev_id, &dev_info); 1309 1310 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1311 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi " 1312 "Session testsuite not met\n"); 1313 return TEST_SKIPPED; 1314 } 1315 1316 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1317 && check_auth_capabilities_supported(auths, 1318 RTE_DIM(auths)) != 0) { 1319 RTE_LOG(INFO, USER1, "Capability requirements for Multi " 1320 "Session testsuite not met\n"); 1321 return TEST_SKIPPED; 1322 } 1323 1324 return 0; 1325 } 1326 1327 static int 1328 negative_hmac_sha1_testsuite_setup(void) 1329 { 1330 struct crypto_testsuite_params *ts_params = &testsuite_params; 1331 uint8_t dev_id = ts_params->valid_devs[0]; 1332 struct rte_cryptodev_info dev_info; 1333 const enum rte_crypto_cipher_algorithm ciphers[] = { 1334 RTE_CRYPTO_CIPHER_AES_CBC 1335 }; 1336 const enum rte_crypto_auth_algorithm auths[] = { 1337 RTE_CRYPTO_AUTH_SHA1_HMAC 1338 }; 1339 1340 rte_cryptodev_info_get(dev_id, &dev_info); 1341 1342 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1343 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1344 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1345 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1346 "HMAC SHA1 testsuite not met\n"); 1347 return TEST_SKIPPED; 1348 } 1349 1350 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1351 && check_auth_capabilities_supported(auths, 1352 RTE_DIM(auths)) != 0) { 1353 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1354 "HMAC SHA1 testsuite not met\n"); 1355 return TEST_SKIPPED; 1356 } 1357 1358 return 0; 1359 } 1360 1361 static int 1362 dev_configure_and_start(uint64_t ff_disable) 1363 { 1364 struct crypto_testsuite_params *ts_params = &testsuite_params; 1365 struct crypto_unittest_params *ut_params = &unittest_params; 1366 1367 uint16_t qp_id; 1368 1369 /* Clear unit test parameters before running test */ 1370 memset(ut_params, 0, sizeof(*ut_params)); 1371 1372 /* Reconfigure device to default parameters */ 1373 ts_params->conf.socket_id = SOCKET_ID_ANY; 1374 ts_params->conf.ff_disable = ff_disable; 1375 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 1376 ts_params->qp_conf.mp_session = ts_params->session_mpool; 1377 1378 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1379 &ts_params->conf), 1380 "Failed to configure cryptodev %u", 1381 ts_params->valid_devs[0]); 1382 1383 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 1384 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1385 ts_params->valid_devs[0], qp_id, 1386 &ts_params->qp_conf, 1387 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1388 "Failed to setup queue pair %u on cryptodev %u", 1389 qp_id, ts_params->valid_devs[0]); 1390 } 1391 1392 1393 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 1394 1395 /* Start the device */ 1396 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 1397 "Failed to start cryptodev %u", 1398 ts_params->valid_devs[0]); 1399 1400 return TEST_SUCCESS; 1401 } 1402 1403 int 1404 ut_setup(void) 1405 { 1406 /* Configure and start the device with security feature disabled */ 1407 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 1408 } 1409 1410 static int 1411 ut_setup_security(void) 1412 { 1413 /* Configure and start the device with no features disabled */ 1414 return dev_configure_and_start(0); 1415 } 1416 1417 void 1418 ut_teardown(void) 1419 { 1420 struct crypto_testsuite_params *ts_params = &testsuite_params; 1421 struct crypto_unittest_params *ut_params = &unittest_params; 1422 1423 /* free crypto session structure */ 1424 #ifdef RTE_LIB_SECURITY 1425 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 1426 if (ut_params->sec_session) { 1427 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 1428 (ts_params->valid_devs[0]), 1429 ut_params->sec_session); 1430 ut_params->sec_session = NULL; 1431 } 1432 } else 1433 #endif 1434 { 1435 if (ut_params->sess) { 1436 rte_cryptodev_sym_session_free(ts_params->valid_devs[0], 1437 ut_params->sess); 1438 ut_params->sess = NULL; 1439 } 1440 } 1441 1442 /* free crypto operation structure */ 1443 rte_crypto_op_free(ut_params->op); 1444 1445 /* 1446 * free mbuf - both obuf and ibuf are usually the same, 1447 * so check if they point at the same address is necessary, 1448 * to avoid freeing the mbuf twice. 1449 */ 1450 if (ut_params->obuf) { 1451 rte_pktmbuf_free(ut_params->obuf); 1452 if (ut_params->ibuf == ut_params->obuf) 1453 ut_params->ibuf = 0; 1454 ut_params->obuf = 0; 1455 } 1456 if (ut_params->ibuf) { 1457 rte_pktmbuf_free(ut_params->ibuf); 1458 ut_params->ibuf = 0; 1459 } 1460 1461 if (ts_params->mbuf_pool != NULL) 1462 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 1463 rte_mempool_avail_count(ts_params->mbuf_pool)); 1464 1465 /* Stop the device */ 1466 rte_cryptodev_stop(ts_params->valid_devs[0]); 1467 } 1468 1469 static int 1470 test_device_configure_invalid_dev_id(void) 1471 { 1472 struct crypto_testsuite_params *ts_params = &testsuite_params; 1473 uint16_t dev_id, num_devs = 0; 1474 1475 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 1476 "Need at least %d devices for test", 1); 1477 1478 /* valid dev_id values */ 1479 dev_id = ts_params->valid_devs[0]; 1480 1481 /* Stop the device in case it's started so it can be configured */ 1482 rte_cryptodev_stop(dev_id); 1483 1484 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 1485 "Failed test for rte_cryptodev_configure: " 1486 "invalid dev_num %u", dev_id); 1487 1488 /* invalid dev_id values */ 1489 dev_id = num_devs; 1490 1491 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1492 "Failed test for rte_cryptodev_configure: " 1493 "invalid dev_num %u", dev_id); 1494 1495 dev_id = 0xff; 1496 1497 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1498 "Failed test for rte_cryptodev_configure:" 1499 "invalid dev_num %u", dev_id); 1500 1501 return TEST_SUCCESS; 1502 } 1503 1504 static int 1505 test_device_configure_invalid_queue_pair_ids(void) 1506 { 1507 struct crypto_testsuite_params *ts_params = &testsuite_params; 1508 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1509 1510 /* Stop the device in case it's started so it can be configured */ 1511 rte_cryptodev_stop(ts_params->valid_devs[0]); 1512 1513 /* valid - max value queue pairs */ 1514 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1515 1516 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1517 &ts_params->conf), 1518 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1519 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1520 1521 /* valid - one queue pairs */ 1522 ts_params->conf.nb_queue_pairs = 1; 1523 1524 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1525 &ts_params->conf), 1526 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1527 ts_params->valid_devs[0], 1528 ts_params->conf.nb_queue_pairs); 1529 1530 1531 /* invalid - zero queue pairs */ 1532 ts_params->conf.nb_queue_pairs = 0; 1533 1534 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1535 &ts_params->conf), 1536 "Failed test for rte_cryptodev_configure, dev_id %u," 1537 " invalid qps: %u", 1538 ts_params->valid_devs[0], 1539 ts_params->conf.nb_queue_pairs); 1540 1541 1542 /* invalid - max value supported by field queue pairs */ 1543 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1544 1545 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1546 &ts_params->conf), 1547 "Failed test for rte_cryptodev_configure, dev_id %u," 1548 " invalid qps: %u", 1549 ts_params->valid_devs[0], 1550 ts_params->conf.nb_queue_pairs); 1551 1552 1553 /* invalid - max value + 1 queue pairs */ 1554 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1555 1556 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1557 &ts_params->conf), 1558 "Failed test for rte_cryptodev_configure, dev_id %u," 1559 " invalid qps: %u", 1560 ts_params->valid_devs[0], 1561 ts_params->conf.nb_queue_pairs); 1562 1563 /* revert to original testsuite value */ 1564 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1565 1566 return TEST_SUCCESS; 1567 } 1568 1569 static int 1570 test_queue_pair_descriptor_setup(void) 1571 { 1572 struct crypto_testsuite_params *ts_params = &testsuite_params; 1573 struct rte_cryptodev_qp_conf qp_conf = { 1574 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1575 }; 1576 uint16_t qp_id; 1577 1578 /* Stop the device in case it's started so it can be configured */ 1579 rte_cryptodev_stop(ts_params->valid_devs[0]); 1580 1581 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1582 &ts_params->conf), 1583 "Failed to configure cryptodev %u", 1584 ts_params->valid_devs[0]); 1585 1586 /* 1587 * Test various ring sizes on this device. memzones can't be 1588 * freed so are re-used if ring is released and re-created. 1589 */ 1590 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1591 qp_conf.mp_session = ts_params->session_mpool; 1592 1593 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1594 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1595 ts_params->valid_devs[0], qp_id, &qp_conf, 1596 rte_cryptodev_socket_id( 1597 ts_params->valid_devs[0])), 1598 "Failed test for " 1599 "rte_cryptodev_queue_pair_setup: num_inflights " 1600 "%u on qp %u on cryptodev %u", 1601 qp_conf.nb_descriptors, qp_id, 1602 ts_params->valid_devs[0]); 1603 } 1604 1605 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1606 1607 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1608 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1609 ts_params->valid_devs[0], qp_id, &qp_conf, 1610 rte_cryptodev_socket_id( 1611 ts_params->valid_devs[0])), 1612 "Failed test for" 1613 " rte_cryptodev_queue_pair_setup: num_inflights" 1614 " %u on qp %u on cryptodev %u", 1615 qp_conf.nb_descriptors, qp_id, 1616 ts_params->valid_devs[0]); 1617 } 1618 1619 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1620 1621 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1622 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1623 ts_params->valid_devs[0], qp_id, &qp_conf, 1624 rte_cryptodev_socket_id( 1625 ts_params->valid_devs[0])), 1626 "Failed test for " 1627 "rte_cryptodev_queue_pair_setup: num_inflights" 1628 " %u on qp %u on cryptodev %u", 1629 qp_conf.nb_descriptors, qp_id, 1630 ts_params->valid_devs[0]); 1631 } 1632 1633 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1634 1635 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1636 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1637 ts_params->valid_devs[0], qp_id, &qp_conf, 1638 rte_cryptodev_socket_id( 1639 ts_params->valid_devs[0])), 1640 "Failed test for" 1641 " rte_cryptodev_queue_pair_setup:" 1642 "num_inflights %u on qp %u on cryptodev %u", 1643 qp_conf.nb_descriptors, qp_id, 1644 ts_params->valid_devs[0]); 1645 } 1646 1647 /* test invalid queue pair id */ 1648 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1649 1650 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1651 1652 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1653 ts_params->valid_devs[0], 1654 qp_id, &qp_conf, 1655 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1656 "Failed test for rte_cryptodev_queue_pair_setup:" 1657 "invalid qp %u on cryptodev %u", 1658 qp_id, ts_params->valid_devs[0]); 1659 1660 qp_id = 0xffff; /*invalid*/ 1661 1662 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1663 ts_params->valid_devs[0], 1664 qp_id, &qp_conf, 1665 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1666 "Failed test for rte_cryptodev_queue_pair_setup:" 1667 "invalid qp %u on cryptodev %u", 1668 qp_id, ts_params->valid_devs[0]); 1669 1670 return TEST_SUCCESS; 1671 } 1672 1673 /* ***** Plaintext data for tests ***** */ 1674 1675 const char catch_22_quote_1[] = 1676 "There was only one catch and that was Catch-22, which " 1677 "specified that a concern for one's safety in the face of " 1678 "dangers that were real and immediate was the process of a " 1679 "rational mind. Orr was crazy and could be grounded. All he " 1680 "had to do was ask; and as soon as he did, he would no longer " 1681 "be crazy and would have to fly more missions. Orr would be " 1682 "crazy to fly more missions and sane if he didn't, but if he " 1683 "was sane he had to fly them. If he flew them he was crazy " 1684 "and didn't have to; but if he didn't want to he was sane and " 1685 "had to. Yossarian was moved very deeply by the absolute " 1686 "simplicity of this clause of Catch-22 and let out a " 1687 "respectful whistle. \"That's some catch, that Catch-22\", he " 1688 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1689 1690 const char catch_22_quote[] = 1691 "What a lousy earth! He wondered how many people were " 1692 "destitute that same night even in his own prosperous country, " 1693 "how many homes were shanties, how many husbands were drunk " 1694 "and wives socked, and how many children were bullied, abused, " 1695 "or abandoned. How many families hungered for food they could " 1696 "not afford to buy? How many hearts were broken? How many " 1697 "suicides would take place that same night, how many people " 1698 "would go insane? How many cockroaches and landlords would " 1699 "triumph? How many winners were losers, successes failures, " 1700 "and rich men poor men? How many wise guys were stupid? How " 1701 "many happy endings were unhappy endings? How many honest men " 1702 "were liars, brave men cowards, loyal men traitors, how many " 1703 "sainted men were corrupt, how many people in positions of " 1704 "trust had sold their souls to bodyguards, how many had never " 1705 "had souls? How many straight-and-narrow paths were crooked " 1706 "paths? How many best families were worst families and how " 1707 "many good people were bad people? When you added them all up " 1708 "and then subtracted, you might be left with only the children, " 1709 "and perhaps with Albert Einstein and an old violinist or " 1710 "sculptor somewhere."; 1711 1712 #define QUOTE_480_BYTES (480) 1713 #define QUOTE_512_BYTES (512) 1714 #define QUOTE_768_BYTES (768) 1715 #define QUOTE_1024_BYTES (1024) 1716 1717 1718 1719 /* ***** SHA1 Hash Tests ***** */ 1720 1721 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1722 1723 static uint8_t hmac_sha1_key[] = { 1724 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1725 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1726 0xDE, 0xF4, 0xDE, 0xAD }; 1727 1728 /* ***** SHA224 Hash Tests ***** */ 1729 1730 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1731 1732 1733 /* ***** AES-CBC Cipher Tests ***** */ 1734 1735 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1736 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1737 1738 static uint8_t aes_cbc_key[] = { 1739 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1740 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1741 1742 static uint8_t aes_cbc_iv[] = { 1743 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1744 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1745 1746 1747 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1748 1749 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1750 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1751 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1752 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1753 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1754 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1755 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1756 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1757 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1758 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1759 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1760 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1761 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1762 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1763 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1764 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1765 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1766 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1767 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1768 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1769 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1770 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1771 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1772 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1773 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1774 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1775 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1776 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1777 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1778 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1779 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1780 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1781 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1782 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1783 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1784 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1785 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1786 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1787 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1788 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1789 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1790 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1791 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1792 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1793 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1794 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1795 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1796 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1797 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1798 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1799 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1800 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1801 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1802 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1803 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1804 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1805 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1806 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1807 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1808 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1809 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1810 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1811 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1812 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1813 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1814 }; 1815 1816 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1817 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1818 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1819 0x18, 0x8c, 0x1d, 0x32 1820 }; 1821 1822 1823 /* Multisession Vector context Test */ 1824 /*Begin Session 0 */ 1825 static uint8_t ms_aes_cbc_key0[] = { 1826 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1827 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1828 }; 1829 1830 static uint8_t ms_aes_cbc_iv0[] = { 1831 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1832 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1833 }; 1834 1835 static const uint8_t ms_aes_cbc_cipher0[] = { 1836 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1837 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1838 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1839 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1840 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1841 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1842 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1843 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1844 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1845 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1846 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1847 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1848 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1849 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1850 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1851 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1852 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1853 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1854 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1855 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1856 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1857 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1858 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1859 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1860 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1861 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1862 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1863 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1864 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1865 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1866 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1867 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1868 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1869 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1870 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1871 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1872 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1873 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1874 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1875 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1876 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1877 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1878 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1879 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1880 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1881 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1882 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1883 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1884 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1885 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1886 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1887 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1888 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1889 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1890 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1891 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1892 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1893 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1894 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1895 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1896 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1897 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1898 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1899 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1900 }; 1901 1902 1903 static uint8_t ms_hmac_key0[] = { 1904 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1905 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1906 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1907 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1908 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1909 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1910 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1911 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1912 }; 1913 1914 static const uint8_t ms_hmac_digest0[] = { 1915 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1916 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1917 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1918 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1919 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1920 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1921 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1922 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1923 }; 1924 1925 /* End Session 0 */ 1926 /* Begin session 1 */ 1927 1928 static uint8_t ms_aes_cbc_key1[] = { 1929 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1930 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1931 }; 1932 1933 static uint8_t ms_aes_cbc_iv1[] = { 1934 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1935 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1936 }; 1937 1938 static const uint8_t ms_aes_cbc_cipher1[] = { 1939 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1940 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1941 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1942 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1943 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1944 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1945 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1946 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1947 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1948 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1949 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1950 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1951 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1952 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1953 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1954 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1955 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1956 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1957 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1958 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1959 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1960 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1961 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1962 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1963 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1964 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1965 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1966 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1967 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1968 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1969 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1970 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1971 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1972 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1973 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1974 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1975 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1976 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1977 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1978 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1979 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1980 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1981 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1982 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1983 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1984 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1985 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1986 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1987 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1988 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1989 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1990 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1991 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1992 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1993 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1994 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1995 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1996 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1997 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1998 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1999 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 2000 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 2001 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 2002 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 2003 2004 }; 2005 2006 static uint8_t ms_hmac_key1[] = { 2007 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2008 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2009 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2010 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2011 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2012 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2013 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2014 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2015 }; 2016 2017 static const uint8_t ms_hmac_digest1[] = { 2018 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 2019 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 2020 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 2021 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 2022 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 2023 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 2024 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 2025 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 2026 }; 2027 /* End Session 1 */ 2028 /* Begin Session 2 */ 2029 static uint8_t ms_aes_cbc_key2[] = { 2030 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 2031 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 2032 }; 2033 2034 static uint8_t ms_aes_cbc_iv2[] = { 2035 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 2036 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 2037 }; 2038 2039 static const uint8_t ms_aes_cbc_cipher2[] = { 2040 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 2041 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 2042 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 2043 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 2044 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 2045 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 2046 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 2047 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 2048 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 2049 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 2050 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 2051 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 2052 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 2053 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 2054 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 2055 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 2056 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 2057 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 2058 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 2059 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 2060 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 2061 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 2062 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 2063 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 2064 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 2065 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 2066 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 2067 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 2068 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 2069 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 2070 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 2071 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 2072 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 2073 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 2074 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 2075 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 2076 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 2077 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 2078 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 2079 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 2080 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 2081 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 2082 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 2083 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 2084 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 2085 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 2086 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 2087 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 2088 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 2089 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 2090 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 2091 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 2092 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 2093 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 2094 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 2095 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 2096 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 2097 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 2098 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 2099 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 2100 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 2101 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 2102 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 2103 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 2104 }; 2105 2106 static uint8_t ms_hmac_key2[] = { 2107 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2108 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2109 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2110 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2111 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2112 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2113 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2114 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2115 }; 2116 2117 static const uint8_t ms_hmac_digest2[] = { 2118 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 2119 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 2120 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 2121 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 2122 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 2123 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 2124 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 2125 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 2126 }; 2127 2128 /* End Session 2 */ 2129 2130 2131 static int 2132 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 2133 { 2134 struct crypto_testsuite_params *ts_params = &testsuite_params; 2135 struct crypto_unittest_params *ut_params = &unittest_params; 2136 /* Verify the capabilities */ 2137 struct rte_cryptodev_sym_capability_idx cap_idx; 2138 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2139 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 2140 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2141 &cap_idx) == NULL) 2142 return TEST_SKIPPED; 2143 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2144 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 2145 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2146 &cap_idx) == NULL) 2147 return TEST_SKIPPED; 2148 2149 /* Generate test mbuf data and space for digest */ 2150 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2151 catch_22_quote, QUOTE_512_BYTES, 0); 2152 2153 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2154 DIGEST_BYTE_LENGTH_SHA1); 2155 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2156 2157 /* Setup Cipher Parameters */ 2158 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2159 ut_params->cipher_xform.next = &ut_params->auth_xform; 2160 2161 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2162 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 2163 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 2164 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2165 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2166 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2167 2168 /* Setup HMAC Parameters */ 2169 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2170 2171 ut_params->auth_xform.next = NULL; 2172 2173 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 2174 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 2175 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 2176 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 2177 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 2178 2179 rte_errno = 0; 2180 ut_params->sess = rte_cryptodev_sym_session_create( 2181 ts_params->valid_devs[0], &ut_params->cipher_xform, 2182 ts_params->session_mpool); 2183 if (rte_errno == ENOTSUP) 2184 return TEST_SKIPPED; 2185 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2186 2187 /* Generate crypto op data structure */ 2188 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2189 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2190 TEST_ASSERT_NOT_NULL(ut_params->op, 2191 "Failed to allocate symmetric crypto operation struct"); 2192 2193 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2194 2195 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2196 2197 /* set crypto operation source mbuf */ 2198 sym_op->m_src = ut_params->ibuf; 2199 2200 /* Set crypto operation authentication parameters */ 2201 sym_op->auth.digest.data = ut_params->digest; 2202 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2203 ut_params->ibuf, QUOTE_512_BYTES); 2204 2205 sym_op->auth.data.offset = 0; 2206 sym_op->auth.data.length = QUOTE_512_BYTES; 2207 2208 /* Copy IV at the end of the crypto operation */ 2209 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2210 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 2211 2212 /* Set crypto operation cipher parameters */ 2213 sym_op->cipher.data.offset = 0; 2214 sym_op->cipher.data.length = QUOTE_512_BYTES; 2215 2216 /* Process crypto operation */ 2217 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2218 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2219 ut_params->op); 2220 else 2221 TEST_ASSERT_NOT_NULL( 2222 process_crypto_request(ts_params->valid_devs[0], 2223 ut_params->op), 2224 "failed to process sym crypto op"); 2225 2226 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2227 "crypto op processing failed"); 2228 2229 /* Validate obuf */ 2230 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 2231 uint8_t *); 2232 2233 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 2234 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 2235 QUOTE_512_BYTES, 2236 "ciphertext data not as expected"); 2237 2238 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 2239 2240 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 2241 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 2242 gbl_driver_id == rte_cryptodev_driver_id_get( 2243 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 2244 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 2245 DIGEST_BYTE_LENGTH_SHA1, 2246 "Generated digest data not as expected"); 2247 2248 return TEST_SUCCESS; 2249 } 2250 2251 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 2252 2253 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 2254 2255 static uint8_t hmac_sha512_key[] = { 2256 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 2257 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2258 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2259 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 2260 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 2261 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2262 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 2263 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 2264 2265 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 2266 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 2267 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 2268 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 2269 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 2270 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 2271 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 2272 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 2273 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 2274 2275 2276 2277 static int 2278 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2279 struct crypto_unittest_params *ut_params, 2280 uint8_t *cipher_key, 2281 uint8_t *hmac_key); 2282 2283 static int 2284 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess, 2285 struct crypto_unittest_params *ut_params, 2286 struct crypto_testsuite_params *ts_params, 2287 const uint8_t *cipher, 2288 const uint8_t *digest, 2289 const uint8_t *iv); 2290 2291 2292 static int 2293 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2294 struct crypto_unittest_params *ut_params, 2295 uint8_t *cipher_key, 2296 uint8_t *hmac_key) 2297 { 2298 2299 /* Setup Cipher Parameters */ 2300 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2301 ut_params->cipher_xform.next = NULL; 2302 2303 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2304 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 2305 ut_params->cipher_xform.cipher.key.data = cipher_key; 2306 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2307 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2308 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2309 2310 /* Setup HMAC Parameters */ 2311 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2312 ut_params->auth_xform.next = &ut_params->cipher_xform; 2313 2314 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 2315 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 2316 ut_params->auth_xform.auth.key.data = hmac_key; 2317 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 2318 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 2319 2320 return TEST_SUCCESS; 2321 } 2322 2323 2324 static int 2325 test_AES_CBC_HMAC_SHA512_decrypt_perform(void *sess, 2326 struct crypto_unittest_params *ut_params, 2327 struct crypto_testsuite_params *ts_params, 2328 const uint8_t *cipher, 2329 const uint8_t *digest, 2330 const uint8_t *iv) 2331 { 2332 /* Generate test mbuf data and digest */ 2333 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2334 (const char *) 2335 cipher, 2336 QUOTE_512_BYTES, 0); 2337 2338 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2339 DIGEST_BYTE_LENGTH_SHA512); 2340 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2341 2342 rte_memcpy(ut_params->digest, 2343 digest, 2344 DIGEST_BYTE_LENGTH_SHA512); 2345 2346 /* Generate Crypto op data structure */ 2347 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2348 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2349 TEST_ASSERT_NOT_NULL(ut_params->op, 2350 "Failed to allocate symmetric crypto operation struct"); 2351 2352 rte_crypto_op_attach_sym_session(ut_params->op, sess); 2353 2354 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2355 2356 /* set crypto operation source mbuf */ 2357 sym_op->m_src = ut_params->ibuf; 2358 2359 sym_op->auth.digest.data = ut_params->digest; 2360 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2361 ut_params->ibuf, QUOTE_512_BYTES); 2362 2363 sym_op->auth.data.offset = 0; 2364 sym_op->auth.data.length = QUOTE_512_BYTES; 2365 2366 /* Copy IV at the end of the crypto operation */ 2367 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2368 iv, CIPHER_IV_LENGTH_AES_CBC); 2369 2370 sym_op->cipher.data.offset = 0; 2371 sym_op->cipher.data.length = QUOTE_512_BYTES; 2372 2373 /* Process crypto operation */ 2374 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2375 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2376 ut_params->op); 2377 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2378 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2379 ut_params->op, 1, 1, 0, 0); 2380 else 2381 TEST_ASSERT_NOT_NULL( 2382 process_crypto_request(ts_params->valid_devs[0], 2383 ut_params->op), 2384 "failed to process sym crypto op"); 2385 2386 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2387 "crypto op processing failed"); 2388 2389 ut_params->obuf = ut_params->op->sym->m_src; 2390 2391 /* Validate obuf */ 2392 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2393 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 2394 catch_22_quote, 2395 QUOTE_512_BYTES, 2396 "Plaintext data not as expected"); 2397 2398 /* Validate obuf */ 2399 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2400 "Digest verification failed"); 2401 2402 return TEST_SUCCESS; 2403 } 2404 2405 /* ***** SNOW 3G Tests ***** */ 2406 static int 2407 create_wireless_algo_hash_session(uint8_t dev_id, 2408 const uint8_t *key, const uint8_t key_len, 2409 const uint8_t iv_len, const uint8_t auth_len, 2410 enum rte_crypto_auth_operation op, 2411 enum rte_crypto_auth_algorithm algo) 2412 { 2413 uint8_t hash_key[key_len]; 2414 2415 struct crypto_testsuite_params *ts_params = &testsuite_params; 2416 struct crypto_unittest_params *ut_params = &unittest_params; 2417 2418 memcpy(hash_key, key, key_len); 2419 2420 debug_hexdump(stdout, "key:", key, key_len); 2421 2422 /* Setup Authentication Parameters */ 2423 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2424 ut_params->auth_xform.next = NULL; 2425 2426 ut_params->auth_xform.auth.op = op; 2427 ut_params->auth_xform.auth.algo = algo; 2428 ut_params->auth_xform.auth.key.length = key_len; 2429 ut_params->auth_xform.auth.key.data = hash_key; 2430 ut_params->auth_xform.auth.digest_length = auth_len; 2431 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2432 ut_params->auth_xform.auth.iv.length = iv_len; 2433 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2434 &ut_params->auth_xform, ts_params->session_mpool); 2435 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 2436 return TEST_SKIPPED; 2437 2438 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2439 return 0; 2440 } 2441 2442 static int 2443 create_wireless_algo_cipher_session(uint8_t dev_id, 2444 enum rte_crypto_cipher_operation op, 2445 enum rte_crypto_cipher_algorithm algo, 2446 const uint8_t *key, const uint8_t key_len, 2447 uint8_t iv_len) 2448 { 2449 uint8_t cipher_key[key_len]; 2450 struct crypto_testsuite_params *ts_params = &testsuite_params; 2451 struct crypto_unittest_params *ut_params = &unittest_params; 2452 2453 memcpy(cipher_key, key, key_len); 2454 2455 /* Setup Cipher Parameters */ 2456 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2457 ut_params->cipher_xform.next = NULL; 2458 2459 ut_params->cipher_xform.cipher.algo = algo; 2460 ut_params->cipher_xform.cipher.op = op; 2461 ut_params->cipher_xform.cipher.key.data = cipher_key; 2462 ut_params->cipher_xform.cipher.key.length = key_len; 2463 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2464 ut_params->cipher_xform.cipher.iv.length = iv_len; 2465 2466 debug_hexdump(stdout, "key:", key, key_len); 2467 2468 /* Create Crypto session */ 2469 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2470 &ut_params->cipher_xform, ts_params->session_mpool); 2471 2472 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 2473 return TEST_SKIPPED; 2474 2475 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2476 return 0; 2477 } 2478 2479 static int 2480 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2481 unsigned int cipher_len, 2482 unsigned int cipher_offset) 2483 { 2484 struct crypto_testsuite_params *ts_params = &testsuite_params; 2485 struct crypto_unittest_params *ut_params = &unittest_params; 2486 2487 /* Generate Crypto op data structure */ 2488 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2489 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2490 TEST_ASSERT_NOT_NULL(ut_params->op, 2491 "Failed to allocate pktmbuf offload"); 2492 2493 /* Set crypto operation data parameters */ 2494 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2495 2496 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2497 2498 /* set crypto operation source mbuf */ 2499 sym_op->m_src = ut_params->ibuf; 2500 2501 /* iv */ 2502 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2503 iv, iv_len); 2504 sym_op->cipher.data.length = cipher_len; 2505 sym_op->cipher.data.offset = cipher_offset; 2506 return 0; 2507 } 2508 2509 static int 2510 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2511 unsigned int cipher_len, 2512 unsigned int cipher_offset) 2513 { 2514 struct crypto_testsuite_params *ts_params = &testsuite_params; 2515 struct crypto_unittest_params *ut_params = &unittest_params; 2516 2517 /* Generate Crypto op data structure */ 2518 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2519 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2520 TEST_ASSERT_NOT_NULL(ut_params->op, 2521 "Failed to allocate pktmbuf offload"); 2522 2523 /* Set crypto operation data parameters */ 2524 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2525 2526 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2527 2528 /* set crypto operation source mbuf */ 2529 sym_op->m_src = ut_params->ibuf; 2530 sym_op->m_dst = ut_params->obuf; 2531 2532 /* iv */ 2533 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2534 iv, iv_len); 2535 sym_op->cipher.data.length = cipher_len; 2536 sym_op->cipher.data.offset = cipher_offset; 2537 return 0; 2538 } 2539 2540 static int 2541 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2542 enum rte_crypto_cipher_operation cipher_op, 2543 enum rte_crypto_auth_operation auth_op, 2544 enum rte_crypto_auth_algorithm auth_algo, 2545 enum rte_crypto_cipher_algorithm cipher_algo, 2546 const uint8_t *key, uint8_t key_len, 2547 uint8_t auth_iv_len, uint8_t auth_len, 2548 uint8_t cipher_iv_len) 2549 2550 { 2551 uint8_t cipher_auth_key[key_len]; 2552 2553 struct crypto_testsuite_params *ts_params = &testsuite_params; 2554 struct crypto_unittest_params *ut_params = &unittest_params; 2555 2556 memcpy(cipher_auth_key, key, key_len); 2557 2558 /* Setup Authentication Parameters */ 2559 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2560 ut_params->auth_xform.next = NULL; 2561 2562 ut_params->auth_xform.auth.op = auth_op; 2563 ut_params->auth_xform.auth.algo = auth_algo; 2564 ut_params->auth_xform.auth.key.length = key_len; 2565 /* Hash key = cipher key */ 2566 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2567 ut_params->auth_xform.auth.digest_length = auth_len; 2568 /* Auth IV will be after cipher IV */ 2569 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2570 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2571 2572 /* Setup Cipher Parameters */ 2573 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2574 ut_params->cipher_xform.next = &ut_params->auth_xform; 2575 2576 ut_params->cipher_xform.cipher.algo = cipher_algo; 2577 ut_params->cipher_xform.cipher.op = cipher_op; 2578 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2579 ut_params->cipher_xform.cipher.key.length = key_len; 2580 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2581 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2582 2583 debug_hexdump(stdout, "key:", key, key_len); 2584 2585 /* Create Crypto session*/ 2586 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2587 &ut_params->cipher_xform, ts_params->session_mpool); 2588 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 2589 return TEST_SKIPPED; 2590 2591 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2592 return 0; 2593 } 2594 2595 static int 2596 create_wireless_cipher_auth_session(uint8_t dev_id, 2597 enum rte_crypto_cipher_operation cipher_op, 2598 enum rte_crypto_auth_operation auth_op, 2599 enum rte_crypto_auth_algorithm auth_algo, 2600 enum rte_crypto_cipher_algorithm cipher_algo, 2601 const struct wireless_test_data *tdata) 2602 { 2603 const uint8_t key_len = tdata->key.len; 2604 uint8_t cipher_auth_key[key_len]; 2605 2606 struct crypto_testsuite_params *ts_params = &testsuite_params; 2607 struct crypto_unittest_params *ut_params = &unittest_params; 2608 const uint8_t *key = tdata->key.data; 2609 const uint8_t auth_len = tdata->digest.len; 2610 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2611 uint8_t auth_iv_len = tdata->auth_iv.len; 2612 2613 memcpy(cipher_auth_key, key, key_len); 2614 2615 /* Setup Authentication Parameters */ 2616 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2617 ut_params->auth_xform.next = NULL; 2618 2619 ut_params->auth_xform.auth.op = auth_op; 2620 ut_params->auth_xform.auth.algo = auth_algo; 2621 ut_params->auth_xform.auth.key.length = key_len; 2622 /* Hash key = cipher key */ 2623 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2624 ut_params->auth_xform.auth.digest_length = auth_len; 2625 /* Auth IV will be after cipher IV */ 2626 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2627 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2628 2629 /* Setup Cipher Parameters */ 2630 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2631 ut_params->cipher_xform.next = &ut_params->auth_xform; 2632 2633 ut_params->cipher_xform.cipher.algo = cipher_algo; 2634 ut_params->cipher_xform.cipher.op = cipher_op; 2635 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2636 ut_params->cipher_xform.cipher.key.length = key_len; 2637 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2638 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2639 2640 2641 debug_hexdump(stdout, "key:", key, key_len); 2642 2643 /* Create Crypto session*/ 2644 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2645 &ut_params->cipher_xform, ts_params->session_mpool); 2646 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 2647 return TEST_SKIPPED; 2648 2649 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2650 return 0; 2651 } 2652 2653 static int 2654 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2655 const struct wireless_test_data *tdata) 2656 { 2657 return create_wireless_cipher_auth_session(dev_id, 2658 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2659 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2660 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2661 } 2662 2663 static int 2664 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2665 enum rte_crypto_cipher_operation cipher_op, 2666 enum rte_crypto_auth_operation auth_op, 2667 enum rte_crypto_auth_algorithm auth_algo, 2668 enum rte_crypto_cipher_algorithm cipher_algo, 2669 const uint8_t *key, const uint8_t key_len, 2670 uint8_t auth_iv_len, uint8_t auth_len, 2671 uint8_t cipher_iv_len) 2672 { 2673 uint8_t auth_cipher_key[key_len]; 2674 struct crypto_testsuite_params *ts_params = &testsuite_params; 2675 struct crypto_unittest_params *ut_params = &unittest_params; 2676 2677 memcpy(auth_cipher_key, key, key_len); 2678 2679 /* Setup Authentication Parameters */ 2680 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2681 ut_params->auth_xform.auth.op = auth_op; 2682 ut_params->auth_xform.next = &ut_params->cipher_xform; 2683 ut_params->auth_xform.auth.algo = auth_algo; 2684 ut_params->auth_xform.auth.key.length = key_len; 2685 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2686 ut_params->auth_xform.auth.digest_length = auth_len; 2687 /* Auth IV will be after cipher IV */ 2688 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2689 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2690 2691 /* Setup Cipher Parameters */ 2692 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2693 ut_params->cipher_xform.next = NULL; 2694 ut_params->cipher_xform.cipher.algo = cipher_algo; 2695 ut_params->cipher_xform.cipher.op = cipher_op; 2696 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2697 ut_params->cipher_xform.cipher.key.length = key_len; 2698 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2699 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2700 2701 debug_hexdump(stdout, "key:", key, key_len); 2702 2703 /* Create Crypto session*/ 2704 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2705 ut_params->auth_xform.next = NULL; 2706 ut_params->cipher_xform.next = &ut_params->auth_xform; 2707 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2708 &ut_params->cipher_xform, ts_params->session_mpool); 2709 } else 2710 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 2711 &ut_params->auth_xform, ts_params->session_mpool); 2712 2713 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 2714 return TEST_SKIPPED; 2715 2716 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2717 2718 return 0; 2719 } 2720 2721 static int 2722 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2723 unsigned int auth_tag_len, 2724 const uint8_t *iv, unsigned int iv_len, 2725 unsigned int data_pad_len, 2726 enum rte_crypto_auth_operation op, 2727 unsigned int auth_len, unsigned int auth_offset) 2728 { 2729 struct crypto_testsuite_params *ts_params = &testsuite_params; 2730 2731 struct crypto_unittest_params *ut_params = &unittest_params; 2732 2733 /* Generate Crypto op data structure */ 2734 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2735 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2736 TEST_ASSERT_NOT_NULL(ut_params->op, 2737 "Failed to allocate pktmbuf offload"); 2738 2739 /* Set crypto operation data parameters */ 2740 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2741 2742 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2743 2744 /* set crypto operation source mbuf */ 2745 sym_op->m_src = ut_params->ibuf; 2746 2747 /* iv */ 2748 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2749 iv, iv_len); 2750 /* digest */ 2751 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2752 ut_params->ibuf, auth_tag_len); 2753 2754 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2755 "no room to append auth tag"); 2756 ut_params->digest = sym_op->auth.digest.data; 2757 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2758 ut_params->ibuf, data_pad_len); 2759 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2760 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2761 else 2762 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2763 2764 debug_hexdump(stdout, "digest:", 2765 sym_op->auth.digest.data, 2766 auth_tag_len); 2767 2768 sym_op->auth.data.length = auth_len; 2769 sym_op->auth.data.offset = auth_offset; 2770 2771 return 0; 2772 } 2773 2774 static int 2775 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2776 enum rte_crypto_auth_operation op) 2777 { 2778 struct crypto_testsuite_params *ts_params = &testsuite_params; 2779 struct crypto_unittest_params *ut_params = &unittest_params; 2780 2781 const uint8_t *auth_tag = tdata->digest.data; 2782 const unsigned int auth_tag_len = tdata->digest.len; 2783 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2784 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2785 2786 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2787 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2788 const uint8_t *auth_iv = tdata->auth_iv.data; 2789 const uint8_t auth_iv_len = tdata->auth_iv.len; 2790 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2791 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2792 2793 /* Generate Crypto op data structure */ 2794 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2795 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2796 TEST_ASSERT_NOT_NULL(ut_params->op, 2797 "Failed to allocate pktmbuf offload"); 2798 /* Set crypto operation data parameters */ 2799 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2800 2801 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2802 2803 /* set crypto operation source mbuf */ 2804 sym_op->m_src = ut_params->ibuf; 2805 2806 /* digest */ 2807 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2808 ut_params->ibuf, auth_tag_len); 2809 2810 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2811 "no room to append auth tag"); 2812 ut_params->digest = sym_op->auth.digest.data; 2813 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2814 ut_params->ibuf, data_pad_len); 2815 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2816 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2817 else 2818 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2819 2820 debug_hexdump(stdout, "digest:", 2821 sym_op->auth.digest.data, 2822 auth_tag_len); 2823 2824 /* Copy cipher and auth IVs at the end of the crypto operation */ 2825 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2826 IV_OFFSET); 2827 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2828 iv_ptr += cipher_iv_len; 2829 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2830 2831 sym_op->cipher.data.length = cipher_len; 2832 sym_op->cipher.data.offset = 0; 2833 sym_op->auth.data.length = auth_len; 2834 sym_op->auth.data.offset = 0; 2835 2836 return 0; 2837 } 2838 2839 static int 2840 create_zuc_cipher_hash_generate_operation( 2841 const struct wireless_test_data *tdata) 2842 { 2843 return create_wireless_cipher_hash_operation(tdata, 2844 RTE_CRYPTO_AUTH_OP_GENERATE); 2845 } 2846 2847 static int 2848 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2849 const unsigned auth_tag_len, 2850 const uint8_t *auth_iv, uint8_t auth_iv_len, 2851 unsigned data_pad_len, 2852 enum rte_crypto_auth_operation op, 2853 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2854 const unsigned cipher_len, const unsigned cipher_offset, 2855 const unsigned auth_len, const unsigned auth_offset) 2856 { 2857 struct crypto_testsuite_params *ts_params = &testsuite_params; 2858 struct crypto_unittest_params *ut_params = &unittest_params; 2859 2860 enum rte_crypto_cipher_algorithm cipher_algo = 2861 ut_params->cipher_xform.cipher.algo; 2862 enum rte_crypto_auth_algorithm auth_algo = 2863 ut_params->auth_xform.auth.algo; 2864 2865 /* Generate Crypto op data structure */ 2866 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2867 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2868 TEST_ASSERT_NOT_NULL(ut_params->op, 2869 "Failed to allocate pktmbuf offload"); 2870 /* Set crypto operation data parameters */ 2871 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2872 2873 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2874 2875 /* set crypto operation source mbuf */ 2876 sym_op->m_src = ut_params->ibuf; 2877 2878 /* digest */ 2879 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2880 ut_params->ibuf, auth_tag_len); 2881 2882 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2883 "no room to append auth tag"); 2884 ut_params->digest = sym_op->auth.digest.data; 2885 2886 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2887 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2888 ut_params->ibuf, data_pad_len); 2889 } else { 2890 struct rte_mbuf *m = ut_params->ibuf; 2891 unsigned int offset = data_pad_len; 2892 2893 while (offset > m->data_len && m->next != NULL) { 2894 offset -= m->data_len; 2895 m = m->next; 2896 } 2897 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2898 m, offset); 2899 } 2900 2901 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2902 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2903 else 2904 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2905 2906 debug_hexdump(stdout, "digest:", 2907 sym_op->auth.digest.data, 2908 auth_tag_len); 2909 2910 /* Copy cipher and auth IVs at the end of the crypto operation */ 2911 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2912 IV_OFFSET); 2913 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2914 iv_ptr += cipher_iv_len; 2915 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2916 2917 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2918 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2919 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2920 sym_op->cipher.data.length = cipher_len; 2921 sym_op->cipher.data.offset = cipher_offset; 2922 } else { 2923 sym_op->cipher.data.length = cipher_len >> 3; 2924 sym_op->cipher.data.offset = cipher_offset >> 3; 2925 } 2926 2927 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2928 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2929 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2930 sym_op->auth.data.length = auth_len; 2931 sym_op->auth.data.offset = auth_offset; 2932 } else { 2933 sym_op->auth.data.length = auth_len >> 3; 2934 sym_op->auth.data.offset = auth_offset >> 3; 2935 } 2936 2937 return 0; 2938 } 2939 2940 static int 2941 create_wireless_algo_auth_cipher_operation( 2942 const uint8_t *auth_tag, unsigned int auth_tag_len, 2943 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2944 const uint8_t *auth_iv, uint8_t auth_iv_len, 2945 unsigned int data_pad_len, 2946 unsigned int cipher_len, unsigned int cipher_offset, 2947 unsigned int auth_len, unsigned int auth_offset, 2948 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2949 { 2950 struct crypto_testsuite_params *ts_params = &testsuite_params; 2951 struct crypto_unittest_params *ut_params = &unittest_params; 2952 2953 enum rte_crypto_cipher_algorithm cipher_algo = 2954 ut_params->cipher_xform.cipher.algo; 2955 enum rte_crypto_auth_algorithm auth_algo = 2956 ut_params->auth_xform.auth.algo; 2957 2958 /* Generate Crypto op data structure */ 2959 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2960 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2961 TEST_ASSERT_NOT_NULL(ut_params->op, 2962 "Failed to allocate pktmbuf offload"); 2963 2964 /* Set crypto operation data parameters */ 2965 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2966 2967 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2968 2969 /* set crypto operation mbufs */ 2970 sym_op->m_src = ut_params->ibuf; 2971 if (op_mode == OUT_OF_PLACE) 2972 sym_op->m_dst = ut_params->obuf; 2973 2974 /* digest */ 2975 if (!do_sgl) { 2976 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2977 (op_mode == IN_PLACE ? 2978 ut_params->ibuf : ut_params->obuf), 2979 uint8_t *, data_pad_len); 2980 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2981 (op_mode == IN_PLACE ? 2982 ut_params->ibuf : ut_params->obuf), 2983 data_pad_len); 2984 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2985 } else { 2986 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2987 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2988 sym_op->m_src : sym_op->m_dst); 2989 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2990 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2991 sgl_buf = sgl_buf->next; 2992 } 2993 2994 /* The last segment should be large enough to hold full digest */ 2995 if (sgl_buf->data_len < auth_tag_len) { 2996 rte_pktmbuf_free(sgl_buf->next); 2997 sgl_buf->next = NULL; 2998 TEST_ASSERT_NOT_NULL(rte_pktmbuf_append(sgl_buf, 2999 auth_tag_len - sgl_buf->data_len), 3000 "No room to append auth tag"); 3001 } 3002 3003 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 3004 uint8_t *, remaining_off); 3005 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 3006 remaining_off); 3007 memset(sym_op->auth.digest.data, 0, remaining_off); 3008 while (sgl_buf->next != NULL) { 3009 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 3010 0, rte_pktmbuf_data_len(sgl_buf)); 3011 sgl_buf = sgl_buf->next; 3012 } 3013 } 3014 3015 /* Copy digest for the verification */ 3016 if (verify) 3017 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 3018 3019 /* Copy cipher and auth IVs at the end of the crypto operation */ 3020 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 3021 ut_params->op, uint8_t *, IV_OFFSET); 3022 3023 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 3024 iv_ptr += cipher_iv_len; 3025 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 3026 3027 /* Only copy over the offset data needed from src to dst in OOP, 3028 * if the auth and cipher offsets are not aligned 3029 */ 3030 if (op_mode == OUT_OF_PLACE) { 3031 if (cipher_offset > auth_offset) 3032 rte_memcpy( 3033 rte_pktmbuf_mtod_offset( 3034 sym_op->m_dst, 3035 uint8_t *, auth_offset >> 3), 3036 rte_pktmbuf_mtod_offset( 3037 sym_op->m_src, 3038 uint8_t *, auth_offset >> 3), 3039 ((cipher_offset >> 3) - (auth_offset >> 3))); 3040 } 3041 3042 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 3043 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 3044 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 3045 sym_op->cipher.data.length = cipher_len; 3046 sym_op->cipher.data.offset = cipher_offset; 3047 } else { 3048 sym_op->cipher.data.length = cipher_len >> 3; 3049 sym_op->cipher.data.offset = cipher_offset >> 3; 3050 } 3051 3052 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 3053 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 3054 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 3055 sym_op->auth.data.length = auth_len; 3056 sym_op->auth.data.offset = auth_offset; 3057 } else { 3058 sym_op->auth.data.length = auth_len >> 3; 3059 sym_op->auth.data.offset = auth_offset >> 3; 3060 } 3061 3062 return 0; 3063 } 3064 3065 static int 3066 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 3067 { 3068 struct crypto_testsuite_params *ts_params = &testsuite_params; 3069 struct crypto_unittest_params *ut_params = &unittest_params; 3070 3071 int retval; 3072 unsigned plaintext_pad_len; 3073 unsigned plaintext_len; 3074 uint8_t *plaintext; 3075 struct rte_cryptodev_info dev_info; 3076 3077 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3078 uint64_t feat_flags = dev_info.feature_flags; 3079 3080 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3081 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3082 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3083 return TEST_SKIPPED; 3084 } 3085 3086 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3087 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3088 printf("Device doesn't support RAW data-path APIs.\n"); 3089 return TEST_SKIPPED; 3090 } 3091 3092 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3093 return TEST_SKIPPED; 3094 3095 /* Verify the capabilities */ 3096 struct rte_cryptodev_sym_capability_idx cap_idx; 3097 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3098 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3099 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3100 &cap_idx) == NULL) 3101 return TEST_SKIPPED; 3102 3103 /* Create SNOW 3G session */ 3104 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3105 tdata->key.data, tdata->key.len, 3106 tdata->auth_iv.len, tdata->digest.len, 3107 RTE_CRYPTO_AUTH_OP_GENERATE, 3108 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3109 if (retval < 0) 3110 return retval; 3111 3112 /* alloc mbuf and set payload */ 3113 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3114 3115 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3116 rte_pktmbuf_tailroom(ut_params->ibuf)); 3117 3118 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3119 /* Append data which is padded to a multiple of */ 3120 /* the algorithms block size */ 3121 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3122 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3123 plaintext_pad_len); 3124 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3125 3126 /* Create SNOW 3G operation */ 3127 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3128 tdata->auth_iv.data, tdata->auth_iv.len, 3129 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3130 tdata->validAuthLenInBits.len, 3131 0); 3132 if (retval < 0) 3133 return retval; 3134 3135 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3136 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3137 ut_params->op, 0, 1, 1, 0); 3138 else 3139 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3140 ut_params->op); 3141 ut_params->obuf = ut_params->op->sym->m_src; 3142 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3143 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3144 + plaintext_pad_len; 3145 3146 /* Validate obuf */ 3147 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3148 ut_params->digest, 3149 tdata->digest.data, 3150 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 3151 "SNOW 3G Generated auth tag not as expected"); 3152 3153 return 0; 3154 } 3155 3156 static int 3157 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 3158 { 3159 struct crypto_testsuite_params *ts_params = &testsuite_params; 3160 struct crypto_unittest_params *ut_params = &unittest_params; 3161 3162 int retval; 3163 unsigned plaintext_pad_len; 3164 unsigned plaintext_len; 3165 uint8_t *plaintext; 3166 struct rte_cryptodev_info dev_info; 3167 3168 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3169 uint64_t feat_flags = dev_info.feature_flags; 3170 3171 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3172 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3173 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3174 return TEST_SKIPPED; 3175 } 3176 3177 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3178 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3179 printf("Device doesn't support RAW data-path APIs.\n"); 3180 return TEST_SKIPPED; 3181 } 3182 3183 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3184 return TEST_SKIPPED; 3185 3186 /* Verify the capabilities */ 3187 struct rte_cryptodev_sym_capability_idx cap_idx; 3188 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3189 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3190 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3191 &cap_idx) == NULL) 3192 return TEST_SKIPPED; 3193 3194 /* Create SNOW 3G session */ 3195 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3196 tdata->key.data, tdata->key.len, 3197 tdata->auth_iv.len, tdata->digest.len, 3198 RTE_CRYPTO_AUTH_OP_VERIFY, 3199 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3200 if (retval < 0) 3201 return retval; 3202 /* alloc mbuf and set payload */ 3203 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3204 3205 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3206 rte_pktmbuf_tailroom(ut_params->ibuf)); 3207 3208 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3209 /* Append data which is padded to a multiple of */ 3210 /* the algorithms block size */ 3211 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3212 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3213 plaintext_pad_len); 3214 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3215 3216 /* Create SNOW 3G operation */ 3217 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3218 tdata->digest.len, 3219 tdata->auth_iv.data, tdata->auth_iv.len, 3220 plaintext_pad_len, 3221 RTE_CRYPTO_AUTH_OP_VERIFY, 3222 tdata->validAuthLenInBits.len, 3223 0); 3224 if (retval < 0) 3225 return retval; 3226 3227 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3228 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3229 ut_params->op, 0, 1, 1, 0); 3230 else 3231 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3232 ut_params->op); 3233 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3234 ut_params->obuf = ut_params->op->sym->m_src; 3235 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3236 + plaintext_pad_len; 3237 3238 /* Validate obuf */ 3239 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3240 return 0; 3241 else 3242 return -1; 3243 3244 return 0; 3245 } 3246 3247 static int 3248 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 3249 { 3250 struct crypto_testsuite_params *ts_params = &testsuite_params; 3251 struct crypto_unittest_params *ut_params = &unittest_params; 3252 3253 int retval; 3254 unsigned plaintext_pad_len; 3255 unsigned plaintext_len; 3256 uint8_t *plaintext; 3257 struct rte_cryptodev_info dev_info; 3258 3259 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3260 uint64_t feat_flags = dev_info.feature_flags; 3261 3262 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3263 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3264 printf("Device doesn't support RAW data-path APIs.\n"); 3265 return TEST_SKIPPED; 3266 } 3267 3268 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3269 return TEST_SKIPPED; 3270 3271 /* Verify the capabilities */ 3272 struct rte_cryptodev_sym_capability_idx cap_idx; 3273 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3274 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3275 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3276 &cap_idx) == NULL) 3277 return TEST_SKIPPED; 3278 3279 /* Create KASUMI session */ 3280 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3281 tdata->key.data, tdata->key.len, 3282 0, tdata->digest.len, 3283 RTE_CRYPTO_AUTH_OP_GENERATE, 3284 RTE_CRYPTO_AUTH_KASUMI_F9); 3285 if (retval < 0) 3286 return retval; 3287 3288 /* alloc mbuf and set payload */ 3289 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3290 3291 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3292 rte_pktmbuf_tailroom(ut_params->ibuf)); 3293 3294 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3295 /* Append data which is padded to a multiple of */ 3296 /* the algorithms block size */ 3297 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3298 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3299 plaintext_pad_len); 3300 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3301 3302 /* Create KASUMI operation */ 3303 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3304 NULL, 0, 3305 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3306 tdata->plaintext.len, 3307 0); 3308 if (retval < 0) 3309 return retval; 3310 3311 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3312 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 3313 ut_params->op); 3314 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3315 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3316 ut_params->op, 0, 1, 1, 0); 3317 else 3318 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3319 ut_params->op); 3320 3321 ut_params->obuf = ut_params->op->sym->m_src; 3322 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3323 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3324 + plaintext_pad_len; 3325 3326 /* Validate obuf */ 3327 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3328 ut_params->digest, 3329 tdata->digest.data, 3330 DIGEST_BYTE_LENGTH_KASUMI_F9, 3331 "KASUMI Generated auth tag not as expected"); 3332 3333 return 0; 3334 } 3335 3336 static int 3337 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 3338 { 3339 struct crypto_testsuite_params *ts_params = &testsuite_params; 3340 struct crypto_unittest_params *ut_params = &unittest_params; 3341 3342 int retval; 3343 unsigned plaintext_pad_len; 3344 unsigned plaintext_len; 3345 uint8_t *plaintext; 3346 struct rte_cryptodev_info dev_info; 3347 3348 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3349 uint64_t feat_flags = dev_info.feature_flags; 3350 3351 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3352 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3353 printf("Device doesn't support RAW data-path APIs.\n"); 3354 return TEST_SKIPPED; 3355 } 3356 3357 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3358 return TEST_SKIPPED; 3359 3360 /* Verify the capabilities */ 3361 struct rte_cryptodev_sym_capability_idx cap_idx; 3362 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3363 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3364 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3365 &cap_idx) == NULL) 3366 return TEST_SKIPPED; 3367 3368 /* Create KASUMI session */ 3369 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3370 tdata->key.data, tdata->key.len, 3371 0, tdata->digest.len, 3372 RTE_CRYPTO_AUTH_OP_VERIFY, 3373 RTE_CRYPTO_AUTH_KASUMI_F9); 3374 if (retval < 0) 3375 return retval; 3376 /* alloc mbuf and set payload */ 3377 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3378 3379 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3380 rte_pktmbuf_tailroom(ut_params->ibuf)); 3381 3382 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3383 /* Append data which is padded to a multiple */ 3384 /* of the algorithms block size */ 3385 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3386 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3387 plaintext_pad_len); 3388 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3389 3390 /* Create KASUMI operation */ 3391 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3392 tdata->digest.len, 3393 NULL, 0, 3394 plaintext_pad_len, 3395 RTE_CRYPTO_AUTH_OP_VERIFY, 3396 tdata->plaintext.len, 3397 0); 3398 if (retval < 0) 3399 return retval; 3400 3401 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3402 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3403 ut_params->op, 0, 1, 1, 0); 3404 else 3405 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3406 ut_params->op); 3407 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3408 ut_params->obuf = ut_params->op->sym->m_src; 3409 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3410 + plaintext_pad_len; 3411 3412 /* Validate obuf */ 3413 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3414 return 0; 3415 else 3416 return -1; 3417 3418 return 0; 3419 } 3420 3421 static int 3422 test_snow3g_hash_generate_test_case_1(void) 3423 { 3424 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3425 } 3426 3427 static int 3428 test_snow3g_hash_generate_test_case_2(void) 3429 { 3430 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3431 } 3432 3433 static int 3434 test_snow3g_hash_generate_test_case_3(void) 3435 { 3436 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3437 } 3438 3439 static int 3440 test_snow3g_hash_generate_test_case_4(void) 3441 { 3442 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3443 } 3444 3445 static int 3446 test_snow3g_hash_generate_test_case_5(void) 3447 { 3448 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3449 } 3450 3451 static int 3452 test_snow3g_hash_generate_test_case_6(void) 3453 { 3454 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3455 } 3456 3457 static int 3458 test_snow3g_hash_verify_test_case_1(void) 3459 { 3460 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3461 3462 } 3463 3464 static int 3465 test_snow3g_hash_verify_test_case_2(void) 3466 { 3467 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3468 } 3469 3470 static int 3471 test_snow3g_hash_verify_test_case_3(void) 3472 { 3473 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3474 } 3475 3476 static int 3477 test_snow3g_hash_verify_test_case_4(void) 3478 { 3479 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3480 } 3481 3482 static int 3483 test_snow3g_hash_verify_test_case_5(void) 3484 { 3485 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3486 } 3487 3488 static int 3489 test_snow3g_hash_verify_test_case_6(void) 3490 { 3491 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3492 } 3493 3494 static int 3495 test_kasumi_hash_generate_test_case_1(void) 3496 { 3497 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3498 } 3499 3500 static int 3501 test_kasumi_hash_generate_test_case_2(void) 3502 { 3503 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3504 } 3505 3506 static int 3507 test_kasumi_hash_generate_test_case_3(void) 3508 { 3509 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3510 } 3511 3512 static int 3513 test_kasumi_hash_generate_test_case_4(void) 3514 { 3515 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3516 } 3517 3518 static int 3519 test_kasumi_hash_generate_test_case_5(void) 3520 { 3521 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3522 } 3523 3524 static int 3525 test_kasumi_hash_generate_test_case_6(void) 3526 { 3527 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3528 } 3529 3530 static int 3531 test_kasumi_hash_verify_test_case_1(void) 3532 { 3533 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3534 } 3535 3536 static int 3537 test_kasumi_hash_verify_test_case_2(void) 3538 { 3539 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3540 } 3541 3542 static int 3543 test_kasumi_hash_verify_test_case_3(void) 3544 { 3545 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3546 } 3547 3548 static int 3549 test_kasumi_hash_verify_test_case_4(void) 3550 { 3551 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3552 } 3553 3554 static int 3555 test_kasumi_hash_verify_test_case_5(void) 3556 { 3557 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3558 } 3559 3560 static int 3561 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3562 { 3563 struct crypto_testsuite_params *ts_params = &testsuite_params; 3564 struct crypto_unittest_params *ut_params = &unittest_params; 3565 3566 int retval; 3567 uint8_t *plaintext, *ciphertext; 3568 unsigned plaintext_pad_len; 3569 unsigned plaintext_len; 3570 struct rte_cryptodev_info dev_info; 3571 3572 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3573 uint64_t feat_flags = dev_info.feature_flags; 3574 3575 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3576 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3577 printf("Device doesn't support RAW data-path APIs.\n"); 3578 return TEST_SKIPPED; 3579 } 3580 3581 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3582 return TEST_SKIPPED; 3583 3584 /* Verify the capabilities */ 3585 struct rte_cryptodev_sym_capability_idx cap_idx; 3586 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3587 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3588 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3589 &cap_idx) == NULL) 3590 return TEST_SKIPPED; 3591 3592 /* Create KASUMI session */ 3593 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3594 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3595 RTE_CRYPTO_CIPHER_KASUMI_F8, 3596 tdata->key.data, tdata->key.len, 3597 tdata->cipher_iv.len); 3598 if (retval < 0) 3599 return retval; 3600 3601 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3602 3603 /* Clear mbuf payload */ 3604 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3605 rte_pktmbuf_tailroom(ut_params->ibuf)); 3606 3607 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3608 /* Append data which is padded to a multiple */ 3609 /* of the algorithms block size */ 3610 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3611 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3612 plaintext_pad_len); 3613 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3614 3615 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3616 3617 /* Create KASUMI operation */ 3618 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3619 tdata->cipher_iv.len, 3620 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3621 tdata->validCipherOffsetInBits.len); 3622 if (retval < 0) 3623 return retval; 3624 3625 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3626 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3627 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3628 else 3629 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3630 ut_params->op); 3631 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3632 3633 ut_params->obuf = ut_params->op->sym->m_dst; 3634 if (ut_params->obuf) 3635 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3636 else 3637 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3638 3639 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3640 3641 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3642 (tdata->validCipherOffsetInBits.len >> 3); 3643 /* Validate obuf */ 3644 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3645 ciphertext, 3646 reference_ciphertext, 3647 tdata->validCipherLenInBits.len, 3648 "KASUMI Ciphertext data not as expected"); 3649 return 0; 3650 } 3651 3652 static int 3653 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3654 { 3655 struct crypto_testsuite_params *ts_params = &testsuite_params; 3656 struct crypto_unittest_params *ut_params = &unittest_params; 3657 3658 int retval; 3659 3660 unsigned int plaintext_pad_len; 3661 unsigned int plaintext_len; 3662 3663 uint8_t buffer[10000]; 3664 const uint8_t *ciphertext; 3665 3666 struct rte_cryptodev_info dev_info; 3667 3668 /* Verify the capabilities */ 3669 struct rte_cryptodev_sym_capability_idx cap_idx; 3670 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3671 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3672 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3673 &cap_idx) == NULL) 3674 return TEST_SKIPPED; 3675 3676 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3677 3678 uint64_t feat_flags = dev_info.feature_flags; 3679 3680 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3681 printf("Device doesn't support in-place scatter-gather. " 3682 "Test Skipped.\n"); 3683 return TEST_SKIPPED; 3684 } 3685 3686 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3687 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3688 printf("Device doesn't support RAW data-path APIs.\n"); 3689 return TEST_SKIPPED; 3690 } 3691 3692 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3693 return TEST_SKIPPED; 3694 3695 /* Create KASUMI session */ 3696 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3697 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3698 RTE_CRYPTO_CIPHER_KASUMI_F8, 3699 tdata->key.data, tdata->key.len, 3700 tdata->cipher_iv.len); 3701 if (retval < 0) 3702 return retval; 3703 3704 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3705 3706 3707 /* Append data which is padded to a multiple */ 3708 /* of the algorithms block size */ 3709 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3710 3711 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3712 plaintext_pad_len, 10, 0); 3713 3714 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3715 3716 /* Create KASUMI operation */ 3717 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3718 tdata->cipher_iv.len, 3719 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3720 tdata->validCipherOffsetInBits.len); 3721 if (retval < 0) 3722 return retval; 3723 3724 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3725 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3726 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3727 else 3728 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3729 ut_params->op); 3730 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3731 3732 ut_params->obuf = ut_params->op->sym->m_dst; 3733 3734 if (ut_params->obuf) 3735 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3736 plaintext_len, buffer); 3737 else 3738 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3739 tdata->validCipherOffsetInBits.len >> 3, 3740 plaintext_len, buffer); 3741 3742 /* Validate obuf */ 3743 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3744 3745 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3746 (tdata->validCipherOffsetInBits.len >> 3); 3747 /* Validate obuf */ 3748 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3749 ciphertext, 3750 reference_ciphertext, 3751 tdata->validCipherLenInBits.len, 3752 "KASUMI Ciphertext data not as expected"); 3753 return 0; 3754 } 3755 3756 static int 3757 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3758 { 3759 struct crypto_testsuite_params *ts_params = &testsuite_params; 3760 struct crypto_unittest_params *ut_params = &unittest_params; 3761 3762 int retval; 3763 uint8_t *plaintext, *ciphertext; 3764 unsigned plaintext_pad_len; 3765 unsigned plaintext_len; 3766 3767 /* Verify the capabilities */ 3768 struct rte_cryptodev_sym_capability_idx cap_idx; 3769 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3770 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3771 /* Data-path service does not support OOP */ 3772 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3773 &cap_idx) == NULL) 3774 return TEST_SKIPPED; 3775 3776 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3777 return TEST_SKIPPED; 3778 3779 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3780 return TEST_SKIPPED; 3781 3782 /* Create KASUMI session */ 3783 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3784 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3785 RTE_CRYPTO_CIPHER_KASUMI_F8, 3786 tdata->key.data, tdata->key.len, 3787 tdata->cipher_iv.len); 3788 if (retval < 0) 3789 return retval; 3790 3791 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3792 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3793 3794 /* Clear mbuf payload */ 3795 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3796 rte_pktmbuf_tailroom(ut_params->ibuf)); 3797 3798 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3799 /* Append data which is padded to a multiple */ 3800 /* of the algorithms block size */ 3801 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3802 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3803 plaintext_pad_len); 3804 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3805 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3806 3807 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3808 3809 /* Create KASUMI operation */ 3810 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3811 tdata->cipher_iv.len, 3812 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3813 tdata->validCipherOffsetInBits.len); 3814 if (retval < 0) 3815 return retval; 3816 3817 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3818 ut_params->op); 3819 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3820 3821 ut_params->obuf = ut_params->op->sym->m_dst; 3822 if (ut_params->obuf) 3823 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3824 else 3825 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3826 3827 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3828 3829 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3830 (tdata->validCipherOffsetInBits.len >> 3); 3831 /* Validate obuf */ 3832 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3833 ciphertext, 3834 reference_ciphertext, 3835 tdata->validCipherLenInBits.len, 3836 "KASUMI Ciphertext data not as expected"); 3837 return 0; 3838 } 3839 3840 static int 3841 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3842 { 3843 struct crypto_testsuite_params *ts_params = &testsuite_params; 3844 struct crypto_unittest_params *ut_params = &unittest_params; 3845 3846 int retval; 3847 unsigned int plaintext_pad_len; 3848 unsigned int plaintext_len; 3849 3850 const uint8_t *ciphertext; 3851 uint8_t buffer[2048]; 3852 3853 struct rte_cryptodev_info dev_info; 3854 3855 /* Verify the capabilities */ 3856 struct rte_cryptodev_sym_capability_idx cap_idx; 3857 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3858 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3859 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3860 &cap_idx) == NULL) 3861 return TEST_SKIPPED; 3862 3863 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3864 return TEST_SKIPPED; 3865 3866 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3867 return TEST_SKIPPED; 3868 3869 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3870 3871 uint64_t feat_flags = dev_info.feature_flags; 3872 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3873 printf("Device doesn't support out-of-place scatter-gather " 3874 "in both input and output mbufs. " 3875 "Test Skipped.\n"); 3876 return TEST_SKIPPED; 3877 } 3878 3879 /* Create KASUMI session */ 3880 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3881 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3882 RTE_CRYPTO_CIPHER_KASUMI_F8, 3883 tdata->key.data, tdata->key.len, 3884 tdata->cipher_iv.len); 3885 if (retval < 0) 3886 return retval; 3887 3888 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3889 /* Append data which is padded to a multiple */ 3890 /* of the algorithms block size */ 3891 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3892 3893 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3894 plaintext_pad_len, 10, 0); 3895 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3896 plaintext_pad_len, 3, 0); 3897 3898 /* Append data which is padded to a multiple */ 3899 /* of the algorithms block size */ 3900 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3901 3902 /* Create KASUMI operation */ 3903 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3904 tdata->cipher_iv.len, 3905 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3906 tdata->validCipherOffsetInBits.len); 3907 if (retval < 0) 3908 return retval; 3909 3910 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3911 ut_params->op); 3912 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3913 3914 ut_params->obuf = ut_params->op->sym->m_dst; 3915 if (ut_params->obuf) 3916 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3917 plaintext_pad_len, buffer); 3918 else 3919 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3920 tdata->validCipherOffsetInBits.len >> 3, 3921 plaintext_pad_len, buffer); 3922 3923 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3924 (tdata->validCipherOffsetInBits.len >> 3); 3925 /* Validate obuf */ 3926 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3927 ciphertext, 3928 reference_ciphertext, 3929 tdata->validCipherLenInBits.len, 3930 "KASUMI Ciphertext data not as expected"); 3931 return 0; 3932 } 3933 3934 3935 static int 3936 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3937 { 3938 struct crypto_testsuite_params *ts_params = &testsuite_params; 3939 struct crypto_unittest_params *ut_params = &unittest_params; 3940 3941 int retval; 3942 uint8_t *ciphertext, *plaintext; 3943 unsigned ciphertext_pad_len; 3944 unsigned ciphertext_len; 3945 3946 /* Verify the capabilities */ 3947 struct rte_cryptodev_sym_capability_idx cap_idx; 3948 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3949 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3950 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3951 &cap_idx) == NULL) 3952 return TEST_SKIPPED; 3953 3954 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3955 return TEST_SKIPPED; 3956 3957 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3958 return TEST_SKIPPED; 3959 3960 /* Create KASUMI session */ 3961 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3962 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3963 RTE_CRYPTO_CIPHER_KASUMI_F8, 3964 tdata->key.data, tdata->key.len, 3965 tdata->cipher_iv.len); 3966 if (retval < 0) 3967 return retval; 3968 3969 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3970 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3971 3972 /* Clear mbuf payload */ 3973 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3974 rte_pktmbuf_tailroom(ut_params->ibuf)); 3975 3976 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3977 /* Append data which is padded to a multiple */ 3978 /* of the algorithms block size */ 3979 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3980 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3981 ciphertext_pad_len); 3982 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3983 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3984 3985 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3986 3987 /* Create KASUMI operation */ 3988 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3989 tdata->cipher_iv.len, 3990 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3991 tdata->validCipherOffsetInBits.len); 3992 if (retval < 0) 3993 return retval; 3994 3995 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3996 ut_params->op); 3997 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3998 3999 ut_params->obuf = ut_params->op->sym->m_dst; 4000 if (ut_params->obuf) 4001 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4002 else 4003 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4004 4005 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4006 4007 const uint8_t *reference_plaintext = tdata->plaintext.data + 4008 (tdata->validCipherOffsetInBits.len >> 3); 4009 /* Validate obuf */ 4010 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4011 plaintext, 4012 reference_plaintext, 4013 tdata->validCipherLenInBits.len, 4014 "KASUMI Plaintext data not as expected"); 4015 return 0; 4016 } 4017 4018 static int 4019 test_kasumi_decryption(const struct kasumi_test_data *tdata) 4020 { 4021 struct crypto_testsuite_params *ts_params = &testsuite_params; 4022 struct crypto_unittest_params *ut_params = &unittest_params; 4023 4024 int retval; 4025 uint8_t *ciphertext, *plaintext; 4026 unsigned ciphertext_pad_len; 4027 unsigned ciphertext_len; 4028 struct rte_cryptodev_info dev_info; 4029 4030 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4031 uint64_t feat_flags = dev_info.feature_flags; 4032 4033 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4034 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4035 printf("Device doesn't support RAW data-path APIs.\n"); 4036 return TEST_SKIPPED; 4037 } 4038 4039 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4040 return TEST_SKIPPED; 4041 4042 /* Verify the capabilities */ 4043 struct rte_cryptodev_sym_capability_idx cap_idx; 4044 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4045 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4046 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4047 &cap_idx) == NULL) 4048 return TEST_SKIPPED; 4049 4050 /* Create KASUMI session */ 4051 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4052 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4053 RTE_CRYPTO_CIPHER_KASUMI_F8, 4054 tdata->key.data, tdata->key.len, 4055 tdata->cipher_iv.len); 4056 if (retval < 0) 4057 return retval; 4058 4059 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4060 4061 /* Clear mbuf payload */ 4062 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4063 rte_pktmbuf_tailroom(ut_params->ibuf)); 4064 4065 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4066 /* Append data which is padded to a multiple */ 4067 /* of the algorithms block size */ 4068 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 4069 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4070 ciphertext_pad_len); 4071 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4072 4073 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4074 4075 /* Create KASUMI operation */ 4076 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4077 tdata->cipher_iv.len, 4078 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 4079 tdata->validCipherOffsetInBits.len); 4080 if (retval < 0) 4081 return retval; 4082 4083 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4084 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4085 ut_params->op, 1, 0, 1, 0); 4086 else 4087 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4088 ut_params->op); 4089 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4090 4091 ut_params->obuf = ut_params->op->sym->m_dst; 4092 if (ut_params->obuf) 4093 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4094 else 4095 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4096 4097 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4098 4099 const uint8_t *reference_plaintext = tdata->plaintext.data + 4100 (tdata->validCipherOffsetInBits.len >> 3); 4101 /* Validate obuf */ 4102 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4103 plaintext, 4104 reference_plaintext, 4105 tdata->validCipherLenInBits.len, 4106 "KASUMI Plaintext data not as expected"); 4107 return 0; 4108 } 4109 4110 static int 4111 test_snow3g_encryption(const struct snow3g_test_data *tdata) 4112 { 4113 struct crypto_testsuite_params *ts_params = &testsuite_params; 4114 struct crypto_unittest_params *ut_params = &unittest_params; 4115 4116 int retval; 4117 uint8_t *plaintext, *ciphertext; 4118 unsigned plaintext_pad_len; 4119 unsigned plaintext_len; 4120 struct rte_cryptodev_info dev_info; 4121 4122 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4123 uint64_t feat_flags = dev_info.feature_flags; 4124 4125 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4126 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4127 printf("Device doesn't support RAW data-path APIs.\n"); 4128 return TEST_SKIPPED; 4129 } 4130 4131 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4132 return TEST_SKIPPED; 4133 4134 /* Verify the capabilities */ 4135 struct rte_cryptodev_sym_capability_idx cap_idx; 4136 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4137 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4138 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4139 &cap_idx) == NULL) 4140 return TEST_SKIPPED; 4141 4142 /* Create SNOW 3G session */ 4143 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4144 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4145 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4146 tdata->key.data, tdata->key.len, 4147 tdata->cipher_iv.len); 4148 if (retval < 0) 4149 return retval; 4150 4151 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4152 4153 /* Clear mbuf payload */ 4154 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4155 rte_pktmbuf_tailroom(ut_params->ibuf)); 4156 4157 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4158 /* Append data which is padded to a multiple of */ 4159 /* the algorithms block size */ 4160 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4161 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4162 plaintext_pad_len); 4163 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4164 4165 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4166 4167 /* Create SNOW 3G operation */ 4168 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4169 tdata->cipher_iv.len, 4170 tdata->validCipherLenInBits.len, 4171 0); 4172 if (retval < 0) 4173 return retval; 4174 4175 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4176 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4177 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4178 else 4179 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4180 ut_params->op); 4181 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4182 4183 ut_params->obuf = ut_params->op->sym->m_dst; 4184 if (ut_params->obuf) 4185 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4186 else 4187 ciphertext = plaintext; 4188 4189 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4190 4191 /* Validate obuf */ 4192 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4193 ciphertext, 4194 tdata->ciphertext.data, 4195 tdata->validDataLenInBits.len, 4196 "SNOW 3G Ciphertext data not as expected"); 4197 return 0; 4198 } 4199 4200 4201 static int 4202 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 4203 { 4204 struct crypto_testsuite_params *ts_params = &testsuite_params; 4205 struct crypto_unittest_params *ut_params = &unittest_params; 4206 uint8_t *plaintext, *ciphertext; 4207 4208 int retval; 4209 unsigned plaintext_pad_len; 4210 unsigned plaintext_len; 4211 struct rte_cryptodev_info dev_info; 4212 4213 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4214 uint64_t feat_flags = dev_info.feature_flags; 4215 4216 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4217 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4218 printf("Device does not support RAW data-path APIs.\n"); 4219 return -ENOTSUP; 4220 } 4221 4222 /* Verify the capabilities */ 4223 struct rte_cryptodev_sym_capability_idx cap_idx; 4224 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4225 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4226 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4227 &cap_idx) == NULL) 4228 return TEST_SKIPPED; 4229 4230 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4231 return TEST_SKIPPED; 4232 4233 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4234 return TEST_SKIPPED; 4235 4236 /* Create SNOW 3G session */ 4237 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4238 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4239 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4240 tdata->key.data, tdata->key.len, 4241 tdata->cipher_iv.len); 4242 if (retval < 0) 4243 return retval; 4244 4245 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4246 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4247 4248 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4249 "Failed to allocate input buffer in mempool"); 4250 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4251 "Failed to allocate output buffer in mempool"); 4252 4253 /* Clear mbuf payload */ 4254 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4255 rte_pktmbuf_tailroom(ut_params->ibuf)); 4256 4257 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4258 /* Append data which is padded to a multiple of */ 4259 /* the algorithms block size */ 4260 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4261 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4262 plaintext_pad_len); 4263 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4264 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4265 4266 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4267 4268 /* Create SNOW 3G operation */ 4269 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4270 tdata->cipher_iv.len, 4271 tdata->validCipherLenInBits.len, 4272 0); 4273 if (retval < 0) 4274 return retval; 4275 4276 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4277 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4278 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4279 else 4280 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4281 ut_params->op); 4282 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4283 4284 ut_params->obuf = ut_params->op->sym->m_dst; 4285 if (ut_params->obuf) 4286 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4287 else 4288 ciphertext = plaintext; 4289 4290 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4291 4292 /* Validate obuf */ 4293 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4294 ciphertext, 4295 tdata->ciphertext.data, 4296 tdata->validDataLenInBits.len, 4297 "SNOW 3G Ciphertext data not as expected"); 4298 return 0; 4299 } 4300 4301 static int 4302 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata, 4303 uint8_t sgl_in, uint8_t sgl_out) 4304 { 4305 struct crypto_testsuite_params *ts_params = &testsuite_params; 4306 struct crypto_unittest_params *ut_params = &unittest_params; 4307 4308 int retval; 4309 unsigned int plaintext_pad_len; 4310 unsigned int plaintext_len; 4311 uint8_t buffer[10000]; 4312 const uint8_t *ciphertext; 4313 4314 struct rte_cryptodev_info dev_info; 4315 4316 /* Verify the capabilities */ 4317 struct rte_cryptodev_sym_capability_idx cap_idx; 4318 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4319 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4320 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4321 &cap_idx) == NULL) 4322 return TEST_SKIPPED; 4323 4324 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4325 return TEST_SKIPPED; 4326 4327 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4328 return TEST_SKIPPED; 4329 4330 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4331 4332 uint64_t feat_flags = dev_info.feature_flags; 4333 4334 if (((sgl_in && sgl_out) && !(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 4335 || ((!sgl_in && sgl_out) && 4336 !(feat_flags & RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 4337 || ((sgl_in && !sgl_out) && 4338 !(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))) { 4339 printf("Device doesn't support out-of-place scatter gather type. " 4340 "Test Skipped.\n"); 4341 return TEST_SKIPPED; 4342 } 4343 4344 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4345 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4346 printf("Device does not support RAW data-path APIs.\n"); 4347 return -ENOTSUP; 4348 } 4349 4350 /* Create SNOW 3G session */ 4351 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4352 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4353 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4354 tdata->key.data, tdata->key.len, 4355 tdata->cipher_iv.len); 4356 if (retval < 0) 4357 return retval; 4358 4359 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4360 /* Append data which is padded to a multiple of */ 4361 /* the algorithms block size */ 4362 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4363 4364 if (sgl_in) 4365 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4366 plaintext_pad_len, 10, 0); 4367 else { 4368 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4369 rte_pktmbuf_append(ut_params->ibuf, plaintext_pad_len); 4370 } 4371 4372 if (sgl_out) 4373 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4374 plaintext_pad_len, 3, 0); 4375 else { 4376 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4377 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4378 } 4379 4380 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4381 "Failed to allocate input buffer in mempool"); 4382 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4383 "Failed to allocate output buffer in mempool"); 4384 4385 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 4386 4387 /* Create SNOW 3G operation */ 4388 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4389 tdata->cipher_iv.len, 4390 tdata->validCipherLenInBits.len, 4391 0); 4392 if (retval < 0) 4393 return retval; 4394 4395 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4396 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4397 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4398 else 4399 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4400 ut_params->op); 4401 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4402 4403 ut_params->obuf = ut_params->op->sym->m_dst; 4404 if (ut_params->obuf) 4405 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4406 plaintext_len, buffer); 4407 else 4408 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4409 plaintext_len, buffer); 4410 4411 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4412 4413 /* Validate obuf */ 4414 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4415 ciphertext, 4416 tdata->ciphertext.data, 4417 tdata->validDataLenInBits.len, 4418 "SNOW 3G Ciphertext data not as expected"); 4419 4420 return 0; 4421 } 4422 4423 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 4424 static void 4425 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 4426 { 4427 uint8_t curr_byte, prev_byte; 4428 uint32_t length_in_bytes = ceil_byte_length(length + offset); 4429 uint8_t lower_byte_mask = (1 << offset) - 1; 4430 unsigned i; 4431 4432 prev_byte = buffer[0]; 4433 buffer[0] >>= offset; 4434 4435 for (i = 1; i < length_in_bytes; i++) { 4436 curr_byte = buffer[i]; 4437 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 4438 (curr_byte >> offset); 4439 prev_byte = curr_byte; 4440 } 4441 } 4442 4443 static int 4444 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 4445 { 4446 struct crypto_testsuite_params *ts_params = &testsuite_params; 4447 struct crypto_unittest_params *ut_params = &unittest_params; 4448 uint8_t *plaintext, *ciphertext; 4449 int retval; 4450 uint32_t plaintext_len; 4451 uint32_t plaintext_pad_len; 4452 uint8_t extra_offset = 4; 4453 uint8_t *expected_ciphertext_shifted; 4454 struct rte_cryptodev_info dev_info; 4455 4456 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4457 uint64_t feat_flags = dev_info.feature_flags; 4458 4459 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4460 ((tdata->validDataLenInBits.len % 8) != 0)) { 4461 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4462 return TEST_SKIPPED; 4463 } 4464 4465 /* Verify the capabilities */ 4466 struct rte_cryptodev_sym_capability_idx cap_idx; 4467 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4468 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4469 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4470 &cap_idx) == NULL) 4471 return TEST_SKIPPED; 4472 4473 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4474 return TEST_SKIPPED; 4475 4476 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4477 return TEST_SKIPPED; 4478 4479 /* Create SNOW 3G session */ 4480 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4481 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4482 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4483 tdata->key.data, tdata->key.len, 4484 tdata->cipher_iv.len); 4485 if (retval < 0) 4486 return retval; 4487 4488 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4489 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4490 4491 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4492 "Failed to allocate input buffer in mempool"); 4493 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4494 "Failed to allocate output buffer in mempool"); 4495 4496 /* Clear mbuf payload */ 4497 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4498 rte_pktmbuf_tailroom(ut_params->ibuf)); 4499 4500 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4501 /* 4502 * Append data which is padded to a 4503 * multiple of the algorithms block size 4504 */ 4505 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4506 4507 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4508 plaintext_pad_len); 4509 4510 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4511 4512 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4513 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4514 4515 #ifdef RTE_APP_TEST_DEBUG 4516 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4517 #endif 4518 /* Create SNOW 3G operation */ 4519 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4520 tdata->cipher_iv.len, 4521 tdata->validCipherLenInBits.len, 4522 extra_offset); 4523 if (retval < 0) 4524 return retval; 4525 4526 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4527 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4528 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4529 else 4530 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4531 ut_params->op); 4532 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4533 4534 ut_params->obuf = ut_params->op->sym->m_dst; 4535 if (ut_params->obuf) 4536 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4537 else 4538 ciphertext = plaintext; 4539 4540 #ifdef RTE_APP_TEST_DEBUG 4541 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4542 #endif 4543 4544 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4545 4546 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4547 "failed to reserve memory for ciphertext shifted\n"); 4548 4549 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4550 ceil_byte_length(tdata->ciphertext.len)); 4551 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4552 extra_offset); 4553 /* Validate obuf */ 4554 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4555 ciphertext, 4556 expected_ciphertext_shifted, 4557 tdata->validDataLenInBits.len, 4558 extra_offset, 4559 "SNOW 3G Ciphertext data not as expected"); 4560 return 0; 4561 } 4562 4563 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4564 { 4565 struct crypto_testsuite_params *ts_params = &testsuite_params; 4566 struct crypto_unittest_params *ut_params = &unittest_params; 4567 4568 int retval; 4569 4570 uint8_t *plaintext, *ciphertext; 4571 unsigned ciphertext_pad_len; 4572 unsigned ciphertext_len; 4573 struct rte_cryptodev_info dev_info; 4574 4575 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4576 uint64_t feat_flags = dev_info.feature_flags; 4577 4578 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4579 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4580 printf("Device doesn't support RAW data-path APIs.\n"); 4581 return TEST_SKIPPED; 4582 } 4583 4584 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4585 return TEST_SKIPPED; 4586 4587 /* Verify the capabilities */ 4588 struct rte_cryptodev_sym_capability_idx cap_idx; 4589 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4590 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4591 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4592 &cap_idx) == NULL) 4593 return TEST_SKIPPED; 4594 4595 /* Create SNOW 3G session */ 4596 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4597 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4598 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4599 tdata->key.data, tdata->key.len, 4600 tdata->cipher_iv.len); 4601 if (retval < 0) 4602 return retval; 4603 4604 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4605 4606 /* Clear mbuf payload */ 4607 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4608 rte_pktmbuf_tailroom(ut_params->ibuf)); 4609 4610 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4611 /* Append data which is padded to a multiple of */ 4612 /* the algorithms block size */ 4613 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4614 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4615 ciphertext_pad_len); 4616 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4617 4618 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4619 4620 /* Create SNOW 3G operation */ 4621 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4622 tdata->cipher_iv.len, 4623 tdata->validCipherLenInBits.len, 4624 tdata->cipher.offset_bits); 4625 if (retval < 0) 4626 return retval; 4627 4628 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4629 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4630 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4631 else 4632 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4633 ut_params->op); 4634 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4635 ut_params->obuf = ut_params->op->sym->m_dst; 4636 if (ut_params->obuf) 4637 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4638 else 4639 plaintext = ciphertext; 4640 4641 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4642 4643 /* Validate obuf */ 4644 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4645 tdata->plaintext.data, 4646 tdata->validDataLenInBits.len, 4647 "SNOW 3G Plaintext data not as expected"); 4648 return 0; 4649 } 4650 4651 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4652 { 4653 struct crypto_testsuite_params *ts_params = &testsuite_params; 4654 struct crypto_unittest_params *ut_params = &unittest_params; 4655 4656 int retval; 4657 4658 uint8_t *plaintext, *ciphertext; 4659 unsigned ciphertext_pad_len; 4660 unsigned ciphertext_len; 4661 struct rte_cryptodev_info dev_info; 4662 4663 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4664 uint64_t feat_flags = dev_info.feature_flags; 4665 4666 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4667 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4668 printf("Device does not support RAW data-path APIs.\n"); 4669 return -ENOTSUP; 4670 } 4671 /* Verify the capabilities */ 4672 struct rte_cryptodev_sym_capability_idx cap_idx; 4673 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4674 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4675 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4676 &cap_idx) == NULL) 4677 return TEST_SKIPPED; 4678 4679 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4680 return TEST_SKIPPED; 4681 4682 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4683 return TEST_SKIPPED; 4684 4685 /* Create SNOW 3G session */ 4686 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4687 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4688 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4689 tdata->key.data, tdata->key.len, 4690 tdata->cipher_iv.len); 4691 if (retval < 0) 4692 return retval; 4693 4694 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4695 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4696 4697 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4698 "Failed to allocate input buffer"); 4699 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4700 "Failed to allocate output buffer"); 4701 4702 /* Clear mbuf payload */ 4703 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4704 rte_pktmbuf_tailroom(ut_params->ibuf)); 4705 4706 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4707 rte_pktmbuf_tailroom(ut_params->obuf)); 4708 4709 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4710 /* Append data which is padded to a multiple of */ 4711 /* the algorithms block size */ 4712 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4713 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4714 ciphertext_pad_len); 4715 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4716 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4717 4718 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4719 4720 /* Create SNOW 3G operation */ 4721 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4722 tdata->cipher_iv.len, 4723 tdata->validCipherLenInBits.len, 4724 0); 4725 if (retval < 0) 4726 return retval; 4727 4728 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4729 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4730 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4731 else 4732 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4733 ut_params->op); 4734 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4735 ut_params->obuf = ut_params->op->sym->m_dst; 4736 if (ut_params->obuf) 4737 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4738 else 4739 plaintext = ciphertext; 4740 4741 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4742 4743 /* Validate obuf */ 4744 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4745 tdata->plaintext.data, 4746 tdata->validDataLenInBits.len, 4747 "SNOW 3G Plaintext data not as expected"); 4748 return 0; 4749 } 4750 4751 static int 4752 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4753 { 4754 struct crypto_testsuite_params *ts_params = &testsuite_params; 4755 struct crypto_unittest_params *ut_params = &unittest_params; 4756 4757 int retval; 4758 4759 uint8_t *plaintext, *ciphertext; 4760 unsigned int plaintext_pad_len; 4761 unsigned int plaintext_len; 4762 4763 struct rte_cryptodev_info dev_info; 4764 struct rte_cryptodev_sym_capability_idx cap_idx; 4765 4766 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4767 uint64_t feat_flags = dev_info.feature_flags; 4768 4769 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4770 ((tdata->validAuthLenInBits.len % 8 != 0) || 4771 (tdata->validDataLenInBits.len % 8 != 0))) { 4772 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4773 return TEST_SKIPPED; 4774 } 4775 4776 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4777 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4778 printf("Device doesn't support RAW data-path APIs.\n"); 4779 return TEST_SKIPPED; 4780 } 4781 4782 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4783 return TEST_SKIPPED; 4784 4785 /* Check if device supports ZUC EEA3 */ 4786 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4787 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4788 4789 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4790 &cap_idx) == NULL) 4791 return TEST_SKIPPED; 4792 4793 /* Check if device supports ZUC EIA3 */ 4794 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4795 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4796 4797 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4798 &cap_idx) == NULL) 4799 return TEST_SKIPPED; 4800 4801 /* Create ZUC session */ 4802 retval = create_zuc_cipher_auth_encrypt_generate_session( 4803 ts_params->valid_devs[0], 4804 tdata); 4805 if (retval != 0) 4806 return retval; 4807 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4808 4809 /* clear mbuf payload */ 4810 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4811 rte_pktmbuf_tailroom(ut_params->ibuf)); 4812 4813 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4814 /* Append data which is padded to a multiple of */ 4815 /* the algorithms block size */ 4816 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4817 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4818 plaintext_pad_len); 4819 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4820 4821 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4822 4823 /* Create ZUC operation */ 4824 retval = create_zuc_cipher_hash_generate_operation(tdata); 4825 if (retval < 0) 4826 return retval; 4827 4828 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4829 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4830 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4831 else 4832 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4833 ut_params->op); 4834 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4835 ut_params->obuf = ut_params->op->sym->m_src; 4836 if (ut_params->obuf) 4837 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4838 else 4839 ciphertext = plaintext; 4840 4841 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4842 /* Validate obuf */ 4843 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4844 ciphertext, 4845 tdata->ciphertext.data, 4846 tdata->validDataLenInBits.len, 4847 "ZUC Ciphertext data not as expected"); 4848 4849 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4850 + plaintext_pad_len; 4851 4852 /* Validate obuf */ 4853 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4854 ut_params->digest, 4855 tdata->digest.data, 4856 4, 4857 "ZUC Generated auth tag not as expected"); 4858 return 0; 4859 } 4860 4861 static int 4862 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4863 { 4864 struct crypto_testsuite_params *ts_params = &testsuite_params; 4865 struct crypto_unittest_params *ut_params = &unittest_params; 4866 4867 int retval; 4868 4869 uint8_t *plaintext, *ciphertext; 4870 unsigned plaintext_pad_len; 4871 unsigned plaintext_len; 4872 struct rte_cryptodev_info dev_info; 4873 4874 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4875 uint64_t feat_flags = dev_info.feature_flags; 4876 4877 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4878 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4879 printf("Device doesn't support RAW data-path APIs.\n"); 4880 return TEST_SKIPPED; 4881 } 4882 4883 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4884 return TEST_SKIPPED; 4885 4886 /* Verify the capabilities */ 4887 struct rte_cryptodev_sym_capability_idx cap_idx; 4888 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4889 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4890 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4891 &cap_idx) == NULL) 4892 return TEST_SKIPPED; 4893 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4894 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4895 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4896 &cap_idx) == NULL) 4897 return TEST_SKIPPED; 4898 4899 /* Create SNOW 3G session */ 4900 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4901 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4902 RTE_CRYPTO_AUTH_OP_GENERATE, 4903 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4904 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4905 tdata->key.data, tdata->key.len, 4906 tdata->auth_iv.len, tdata->digest.len, 4907 tdata->cipher_iv.len); 4908 if (retval != 0) 4909 return retval; 4910 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4911 4912 /* clear mbuf payload */ 4913 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4914 rte_pktmbuf_tailroom(ut_params->ibuf)); 4915 4916 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4917 /* Append data which is padded to a multiple of */ 4918 /* the algorithms block size */ 4919 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4920 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4921 plaintext_pad_len); 4922 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4923 4924 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4925 4926 /* Create SNOW 3G operation */ 4927 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4928 tdata->digest.len, tdata->auth_iv.data, 4929 tdata->auth_iv.len, 4930 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4931 tdata->cipher_iv.data, tdata->cipher_iv.len, 4932 tdata->validCipherLenInBits.len, 4933 0, 4934 tdata->validAuthLenInBits.len, 4935 0 4936 ); 4937 if (retval < 0) 4938 return retval; 4939 4940 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4941 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4942 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4943 else 4944 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4945 ut_params->op); 4946 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4947 ut_params->obuf = ut_params->op->sym->m_src; 4948 if (ut_params->obuf) 4949 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4950 else 4951 ciphertext = plaintext; 4952 4953 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4954 /* Validate obuf */ 4955 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4956 ciphertext, 4957 tdata->ciphertext.data, 4958 tdata->validDataLenInBits.len, 4959 "SNOW 3G Ciphertext data not as expected"); 4960 4961 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4962 + plaintext_pad_len; 4963 4964 /* Validate obuf */ 4965 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4966 ut_params->digest, 4967 tdata->digest.data, 4968 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4969 "SNOW 3G Generated auth tag not as expected"); 4970 return 0; 4971 } 4972 4973 static int 4974 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4975 uint8_t op_mode, uint8_t verify) 4976 { 4977 struct crypto_testsuite_params *ts_params = &testsuite_params; 4978 struct crypto_unittest_params *ut_params = &unittest_params; 4979 4980 int retval; 4981 4982 uint8_t *plaintext = NULL, *ciphertext = NULL; 4983 unsigned int plaintext_pad_len; 4984 unsigned int plaintext_len; 4985 unsigned int ciphertext_pad_len; 4986 unsigned int ciphertext_len; 4987 4988 struct rte_cryptodev_info dev_info; 4989 4990 /* Verify the capabilities */ 4991 struct rte_cryptodev_sym_capability_idx cap_idx; 4992 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4993 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4994 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4995 &cap_idx) == NULL) 4996 return TEST_SKIPPED; 4997 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4998 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4999 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5000 &cap_idx) == NULL) 5001 return TEST_SKIPPED; 5002 5003 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5004 return TEST_SKIPPED; 5005 5006 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5007 5008 uint64_t feat_flags = dev_info.feature_flags; 5009 5010 if (op_mode == OUT_OF_PLACE) { 5011 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5012 printf("Device doesn't support digest encrypted.\n"); 5013 return TEST_SKIPPED; 5014 } 5015 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5016 return TEST_SKIPPED; 5017 } 5018 5019 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5020 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5021 printf("Device doesn't support RAW data-path APIs.\n"); 5022 return TEST_SKIPPED; 5023 } 5024 5025 /* Create SNOW 3G session */ 5026 retval = create_wireless_algo_auth_cipher_session( 5027 ts_params->valid_devs[0], 5028 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5029 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5030 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5031 : RTE_CRYPTO_AUTH_OP_GENERATE), 5032 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5033 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5034 tdata->key.data, tdata->key.len, 5035 tdata->auth_iv.len, tdata->digest.len, 5036 tdata->cipher_iv.len); 5037 if (retval != 0) 5038 return retval; 5039 5040 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5041 if (op_mode == OUT_OF_PLACE) 5042 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5043 5044 /* clear mbuf payload */ 5045 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5046 rte_pktmbuf_tailroom(ut_params->ibuf)); 5047 if (op_mode == OUT_OF_PLACE) 5048 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5049 rte_pktmbuf_tailroom(ut_params->obuf)); 5050 5051 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5052 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5053 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5054 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5055 5056 if (verify) { 5057 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5058 ciphertext_pad_len); 5059 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5060 if (op_mode == OUT_OF_PLACE) 5061 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5062 debug_hexdump(stdout, "ciphertext:", ciphertext, 5063 ciphertext_len); 5064 } else { 5065 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5066 plaintext_pad_len); 5067 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5068 if (op_mode == OUT_OF_PLACE) 5069 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5070 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5071 } 5072 5073 /* Create SNOW 3G operation */ 5074 retval = create_wireless_algo_auth_cipher_operation( 5075 tdata->digest.data, tdata->digest.len, 5076 tdata->cipher_iv.data, tdata->cipher_iv.len, 5077 tdata->auth_iv.data, tdata->auth_iv.len, 5078 (tdata->digest.offset_bytes == 0 ? 5079 (verify ? ciphertext_pad_len : plaintext_pad_len) 5080 : tdata->digest.offset_bytes), 5081 tdata->validCipherLenInBits.len, 5082 tdata->cipher.offset_bits, 5083 tdata->validAuthLenInBits.len, 5084 tdata->auth.offset_bits, 5085 op_mode, 0, verify); 5086 5087 if (retval < 0) 5088 return retval; 5089 5090 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5091 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5092 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5093 else 5094 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5095 ut_params->op); 5096 5097 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5098 5099 ut_params->obuf = (op_mode == IN_PLACE ? 5100 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5101 5102 if (verify) { 5103 if (ut_params->obuf) 5104 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5105 uint8_t *); 5106 else 5107 plaintext = ciphertext + 5108 (tdata->cipher.offset_bits >> 3); 5109 5110 debug_hexdump(stdout, "plaintext:", plaintext, 5111 (tdata->plaintext.len >> 3) - tdata->digest.len); 5112 debug_hexdump(stdout, "plaintext expected:", 5113 tdata->plaintext.data, 5114 (tdata->plaintext.len >> 3) - tdata->digest.len); 5115 } else { 5116 if (ut_params->obuf) 5117 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5118 uint8_t *); 5119 else 5120 ciphertext = plaintext; 5121 5122 debug_hexdump(stdout, "ciphertext:", ciphertext, 5123 ciphertext_len); 5124 debug_hexdump(stdout, "ciphertext expected:", 5125 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5126 5127 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5128 + (tdata->digest.offset_bytes == 0 ? 5129 plaintext_pad_len : tdata->digest.offset_bytes); 5130 5131 debug_hexdump(stdout, "digest:", ut_params->digest, 5132 tdata->digest.len); 5133 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 5134 tdata->digest.len); 5135 } 5136 5137 /* Validate obuf */ 5138 if (verify) { 5139 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5140 plaintext, 5141 tdata->plaintext.data, 5142 (tdata->plaintext.len - tdata->cipher.offset_bits - 5143 (tdata->digest.len << 3)), 5144 tdata->cipher.offset_bits, 5145 "SNOW 3G Plaintext data not as expected"); 5146 } else { 5147 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5148 ciphertext, 5149 tdata->ciphertext.data, 5150 (tdata->validDataLenInBits.len - 5151 tdata->cipher.offset_bits), 5152 tdata->cipher.offset_bits, 5153 "SNOW 3G Ciphertext data not as expected"); 5154 5155 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5156 ut_params->digest, 5157 tdata->digest.data, 5158 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5159 "SNOW 3G Generated auth tag not as expected"); 5160 } 5161 return 0; 5162 } 5163 5164 static int 5165 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 5166 uint8_t op_mode, uint8_t verify) 5167 { 5168 struct crypto_testsuite_params *ts_params = &testsuite_params; 5169 struct crypto_unittest_params *ut_params = &unittest_params; 5170 5171 int retval; 5172 5173 const uint8_t *plaintext = NULL; 5174 const uint8_t *ciphertext = NULL; 5175 const uint8_t *digest = NULL; 5176 unsigned int plaintext_pad_len; 5177 unsigned int plaintext_len; 5178 unsigned int ciphertext_pad_len; 5179 unsigned int ciphertext_len; 5180 uint8_t buffer[10000]; 5181 uint8_t digest_buffer[10000]; 5182 5183 struct rte_cryptodev_info dev_info; 5184 5185 /* Verify the capabilities */ 5186 struct rte_cryptodev_sym_capability_idx cap_idx; 5187 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5188 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5189 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5190 &cap_idx) == NULL) 5191 return TEST_SKIPPED; 5192 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5193 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5194 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5195 &cap_idx) == NULL) 5196 return TEST_SKIPPED; 5197 5198 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5199 return TEST_SKIPPED; 5200 5201 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5202 5203 uint64_t feat_flags = dev_info.feature_flags; 5204 5205 if (op_mode == IN_PLACE) { 5206 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5207 printf("Device doesn't support in-place scatter-gather " 5208 "in both input and output mbufs.\n"); 5209 return TEST_SKIPPED; 5210 } 5211 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5212 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5213 printf("Device doesn't support RAW data-path APIs.\n"); 5214 return TEST_SKIPPED; 5215 } 5216 } else { 5217 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5218 return TEST_SKIPPED; 5219 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5220 printf("Device doesn't support out-of-place scatter-gather " 5221 "in both input and output mbufs.\n"); 5222 return TEST_SKIPPED; 5223 } 5224 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5225 printf("Device doesn't support digest encrypted.\n"); 5226 return TEST_SKIPPED; 5227 } 5228 } 5229 5230 /* Create SNOW 3G session */ 5231 retval = create_wireless_algo_auth_cipher_session( 5232 ts_params->valid_devs[0], 5233 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5234 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5235 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5236 : RTE_CRYPTO_AUTH_OP_GENERATE), 5237 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5238 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5239 tdata->key.data, tdata->key.len, 5240 tdata->auth_iv.len, tdata->digest.len, 5241 tdata->cipher_iv.len); 5242 5243 if (retval != 0) 5244 return retval; 5245 5246 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5247 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5248 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5249 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5250 5251 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5252 plaintext_pad_len, 15, 0); 5253 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5254 "Failed to allocate input buffer in mempool"); 5255 5256 if (op_mode == OUT_OF_PLACE) { 5257 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5258 plaintext_pad_len, 15, 0); 5259 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5260 "Failed to allocate output buffer in mempool"); 5261 } 5262 5263 if (verify) { 5264 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5265 tdata->ciphertext.data); 5266 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5267 ciphertext_len, buffer); 5268 debug_hexdump(stdout, "ciphertext:", ciphertext, 5269 ciphertext_len); 5270 } else { 5271 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5272 tdata->plaintext.data); 5273 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5274 plaintext_len, buffer); 5275 debug_hexdump(stdout, "plaintext:", plaintext, 5276 plaintext_len); 5277 } 5278 memset(buffer, 0, sizeof(buffer)); 5279 5280 /* Create SNOW 3G operation */ 5281 retval = create_wireless_algo_auth_cipher_operation( 5282 tdata->digest.data, tdata->digest.len, 5283 tdata->cipher_iv.data, tdata->cipher_iv.len, 5284 tdata->auth_iv.data, tdata->auth_iv.len, 5285 (tdata->digest.offset_bytes == 0 ? 5286 (verify ? ciphertext_pad_len : plaintext_pad_len) 5287 : tdata->digest.offset_bytes), 5288 tdata->validCipherLenInBits.len, 5289 tdata->cipher.offset_bits, 5290 tdata->validAuthLenInBits.len, 5291 tdata->auth.offset_bits, 5292 op_mode, 1, verify); 5293 5294 if (retval < 0) 5295 return retval; 5296 5297 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5298 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5299 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5300 else 5301 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5302 ut_params->op); 5303 5304 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5305 5306 ut_params->obuf = (op_mode == IN_PLACE ? 5307 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5308 5309 if (verify) { 5310 if (ut_params->obuf) 5311 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5312 plaintext_len, buffer); 5313 else 5314 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5315 plaintext_len, buffer); 5316 5317 debug_hexdump(stdout, "plaintext:", plaintext, 5318 (tdata->plaintext.len >> 3) - tdata->digest.len); 5319 debug_hexdump(stdout, "plaintext expected:", 5320 tdata->plaintext.data, 5321 (tdata->plaintext.len >> 3) - tdata->digest.len); 5322 } else { 5323 if (ut_params->obuf) 5324 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5325 ciphertext_len, buffer); 5326 else 5327 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5328 ciphertext_len, buffer); 5329 5330 debug_hexdump(stdout, "ciphertext:", ciphertext, 5331 ciphertext_len); 5332 debug_hexdump(stdout, "ciphertext expected:", 5333 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5334 5335 if (ut_params->obuf) 5336 digest = rte_pktmbuf_read(ut_params->obuf, 5337 (tdata->digest.offset_bytes == 0 ? 5338 plaintext_pad_len : tdata->digest.offset_bytes), 5339 tdata->digest.len, digest_buffer); 5340 else 5341 digest = rte_pktmbuf_read(ut_params->ibuf, 5342 (tdata->digest.offset_bytes == 0 ? 5343 plaintext_pad_len : tdata->digest.offset_bytes), 5344 tdata->digest.len, digest_buffer); 5345 5346 debug_hexdump(stdout, "digest:", digest, 5347 tdata->digest.len); 5348 debug_hexdump(stdout, "digest expected:", 5349 tdata->digest.data, tdata->digest.len); 5350 } 5351 5352 /* Validate obuf */ 5353 if (verify) { 5354 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5355 plaintext, 5356 tdata->plaintext.data, 5357 (tdata->plaintext.len - tdata->cipher.offset_bits - 5358 (tdata->digest.len << 3)), 5359 tdata->cipher.offset_bits, 5360 "SNOW 3G Plaintext data not as expected"); 5361 } else { 5362 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5363 ciphertext, 5364 tdata->ciphertext.data, 5365 (tdata->validDataLenInBits.len - 5366 tdata->cipher.offset_bits), 5367 tdata->cipher.offset_bits, 5368 "SNOW 3G Ciphertext data not as expected"); 5369 5370 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5371 digest, 5372 tdata->digest.data, 5373 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5374 "SNOW 3G Generated auth tag not as expected"); 5375 } 5376 return 0; 5377 } 5378 5379 static int 5380 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 5381 uint8_t op_mode, uint8_t verify) 5382 { 5383 struct crypto_testsuite_params *ts_params = &testsuite_params; 5384 struct crypto_unittest_params *ut_params = &unittest_params; 5385 5386 int retval; 5387 5388 uint8_t *plaintext = NULL, *ciphertext = NULL; 5389 unsigned int plaintext_pad_len; 5390 unsigned int plaintext_len; 5391 unsigned int ciphertext_pad_len; 5392 unsigned int ciphertext_len; 5393 5394 struct rte_cryptodev_info dev_info; 5395 5396 /* Verify the capabilities */ 5397 struct rte_cryptodev_sym_capability_idx cap_idx; 5398 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5399 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5400 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5401 &cap_idx) == NULL) 5402 return TEST_SKIPPED; 5403 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5404 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5405 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5406 &cap_idx) == NULL) 5407 return TEST_SKIPPED; 5408 5409 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5410 5411 uint64_t feat_flags = dev_info.feature_flags; 5412 5413 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5414 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5415 printf("Device doesn't support RAW data-path APIs.\n"); 5416 return TEST_SKIPPED; 5417 } 5418 5419 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5420 return TEST_SKIPPED; 5421 5422 if (op_mode == OUT_OF_PLACE) { 5423 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5424 return TEST_SKIPPED; 5425 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5426 printf("Device doesn't support digest encrypted.\n"); 5427 return TEST_SKIPPED; 5428 } 5429 } 5430 5431 /* Create KASUMI session */ 5432 retval = create_wireless_algo_auth_cipher_session( 5433 ts_params->valid_devs[0], 5434 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5435 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5436 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5437 : RTE_CRYPTO_AUTH_OP_GENERATE), 5438 RTE_CRYPTO_AUTH_KASUMI_F9, 5439 RTE_CRYPTO_CIPHER_KASUMI_F8, 5440 tdata->key.data, tdata->key.len, 5441 0, tdata->digest.len, 5442 tdata->cipher_iv.len); 5443 5444 if (retval != 0) 5445 return retval; 5446 5447 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5448 if (op_mode == OUT_OF_PLACE) 5449 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5450 5451 /* clear mbuf payload */ 5452 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5453 rte_pktmbuf_tailroom(ut_params->ibuf)); 5454 if (op_mode == OUT_OF_PLACE) 5455 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5456 rte_pktmbuf_tailroom(ut_params->obuf)); 5457 5458 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5459 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5460 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5461 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5462 5463 if (verify) { 5464 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5465 ciphertext_pad_len); 5466 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5467 if (op_mode == OUT_OF_PLACE) 5468 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5469 debug_hexdump(stdout, "ciphertext:", ciphertext, 5470 ciphertext_len); 5471 } else { 5472 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5473 plaintext_pad_len); 5474 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5475 if (op_mode == OUT_OF_PLACE) 5476 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5477 debug_hexdump(stdout, "plaintext:", plaintext, 5478 plaintext_len); 5479 } 5480 5481 /* Create KASUMI operation */ 5482 retval = create_wireless_algo_auth_cipher_operation( 5483 tdata->digest.data, tdata->digest.len, 5484 tdata->cipher_iv.data, tdata->cipher_iv.len, 5485 NULL, 0, 5486 (tdata->digest.offset_bytes == 0 ? 5487 (verify ? ciphertext_pad_len : plaintext_pad_len) 5488 : tdata->digest.offset_bytes), 5489 tdata->validCipherLenInBits.len, 5490 tdata->validCipherOffsetInBits.len, 5491 tdata->validAuthLenInBits.len, 5492 0, 5493 op_mode, 0, verify); 5494 5495 if (retval < 0) 5496 return retval; 5497 5498 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5499 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5500 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5501 else 5502 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5503 ut_params->op); 5504 5505 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5506 5507 ut_params->obuf = (op_mode == IN_PLACE ? 5508 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5509 5510 5511 if (verify) { 5512 if (ut_params->obuf) 5513 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5514 uint8_t *); 5515 else 5516 plaintext = ciphertext; 5517 5518 debug_hexdump(stdout, "plaintext:", plaintext, 5519 (tdata->plaintext.len >> 3) - tdata->digest.len); 5520 debug_hexdump(stdout, "plaintext expected:", 5521 tdata->plaintext.data, 5522 (tdata->plaintext.len >> 3) - tdata->digest.len); 5523 } else { 5524 if (ut_params->obuf) 5525 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5526 uint8_t *); 5527 else 5528 ciphertext = plaintext; 5529 5530 debug_hexdump(stdout, "ciphertext:", ciphertext, 5531 ciphertext_len); 5532 debug_hexdump(stdout, "ciphertext expected:", 5533 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5534 5535 ut_params->digest = rte_pktmbuf_mtod( 5536 ut_params->obuf, uint8_t *) + 5537 (tdata->digest.offset_bytes == 0 ? 5538 plaintext_pad_len : tdata->digest.offset_bytes); 5539 5540 debug_hexdump(stdout, "digest:", ut_params->digest, 5541 tdata->digest.len); 5542 debug_hexdump(stdout, "digest expected:", 5543 tdata->digest.data, tdata->digest.len); 5544 } 5545 5546 /* Validate obuf */ 5547 if (verify) { 5548 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5549 plaintext, 5550 tdata->plaintext.data, 5551 tdata->plaintext.len >> 3, 5552 "KASUMI Plaintext data not as expected"); 5553 } else { 5554 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5555 ciphertext, 5556 tdata->ciphertext.data, 5557 tdata->ciphertext.len >> 3, 5558 "KASUMI Ciphertext data not as expected"); 5559 5560 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5561 ut_params->digest, 5562 tdata->digest.data, 5563 DIGEST_BYTE_LENGTH_KASUMI_F9, 5564 "KASUMI Generated auth tag not as expected"); 5565 } 5566 return 0; 5567 } 5568 5569 static int 5570 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5571 uint8_t op_mode, uint8_t verify) 5572 { 5573 struct crypto_testsuite_params *ts_params = &testsuite_params; 5574 struct crypto_unittest_params *ut_params = &unittest_params; 5575 5576 int retval; 5577 5578 const uint8_t *plaintext = NULL; 5579 const uint8_t *ciphertext = NULL; 5580 const uint8_t *digest = NULL; 5581 unsigned int plaintext_pad_len; 5582 unsigned int plaintext_len; 5583 unsigned int ciphertext_pad_len; 5584 unsigned int ciphertext_len; 5585 uint8_t buffer[10000]; 5586 uint8_t digest_buffer[10000]; 5587 5588 struct rte_cryptodev_info dev_info; 5589 5590 /* Verify the capabilities */ 5591 struct rte_cryptodev_sym_capability_idx cap_idx; 5592 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5593 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5594 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5595 &cap_idx) == NULL) 5596 return TEST_SKIPPED; 5597 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5598 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5599 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5600 &cap_idx) == NULL) 5601 return TEST_SKIPPED; 5602 5603 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5604 return TEST_SKIPPED; 5605 5606 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5607 5608 uint64_t feat_flags = dev_info.feature_flags; 5609 5610 if (op_mode == IN_PLACE) { 5611 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5612 printf("Device doesn't support in-place scatter-gather " 5613 "in both input and output mbufs.\n"); 5614 return TEST_SKIPPED; 5615 } 5616 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5617 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5618 printf("Device doesn't support RAW data-path APIs.\n"); 5619 return TEST_SKIPPED; 5620 } 5621 } else { 5622 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5623 return TEST_SKIPPED; 5624 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5625 printf("Device doesn't support out-of-place scatter-gather " 5626 "in both input and output mbufs.\n"); 5627 return TEST_SKIPPED; 5628 } 5629 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5630 printf("Device doesn't support digest encrypted.\n"); 5631 return TEST_SKIPPED; 5632 } 5633 } 5634 5635 /* Create KASUMI session */ 5636 retval = create_wireless_algo_auth_cipher_session( 5637 ts_params->valid_devs[0], 5638 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5639 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5640 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5641 : RTE_CRYPTO_AUTH_OP_GENERATE), 5642 RTE_CRYPTO_AUTH_KASUMI_F9, 5643 RTE_CRYPTO_CIPHER_KASUMI_F8, 5644 tdata->key.data, tdata->key.len, 5645 0, tdata->digest.len, 5646 tdata->cipher_iv.len); 5647 5648 if (retval != 0) 5649 return retval; 5650 5651 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5652 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5653 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5654 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5655 5656 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5657 plaintext_pad_len, 15, 0); 5658 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5659 "Failed to allocate input buffer in mempool"); 5660 5661 if (op_mode == OUT_OF_PLACE) { 5662 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5663 plaintext_pad_len, 15, 0); 5664 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5665 "Failed to allocate output buffer in mempool"); 5666 } 5667 5668 if (verify) { 5669 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5670 tdata->ciphertext.data); 5671 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5672 ciphertext_len, buffer); 5673 debug_hexdump(stdout, "ciphertext:", ciphertext, 5674 ciphertext_len); 5675 } else { 5676 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5677 tdata->plaintext.data); 5678 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5679 plaintext_len, buffer); 5680 debug_hexdump(stdout, "plaintext:", plaintext, 5681 plaintext_len); 5682 } 5683 memset(buffer, 0, sizeof(buffer)); 5684 5685 /* Create KASUMI operation */ 5686 retval = create_wireless_algo_auth_cipher_operation( 5687 tdata->digest.data, tdata->digest.len, 5688 tdata->cipher_iv.data, tdata->cipher_iv.len, 5689 NULL, 0, 5690 (tdata->digest.offset_bytes == 0 ? 5691 (verify ? ciphertext_pad_len : plaintext_pad_len) 5692 : tdata->digest.offset_bytes), 5693 tdata->validCipherLenInBits.len, 5694 tdata->validCipherOffsetInBits.len, 5695 tdata->validAuthLenInBits.len, 5696 0, 5697 op_mode, 1, verify); 5698 5699 if (retval < 0) 5700 return retval; 5701 5702 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5703 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5704 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5705 else 5706 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5707 ut_params->op); 5708 5709 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5710 5711 ut_params->obuf = (op_mode == IN_PLACE ? 5712 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5713 5714 if (verify) { 5715 if (ut_params->obuf) 5716 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5717 plaintext_len, buffer); 5718 else 5719 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5720 plaintext_len, buffer); 5721 5722 debug_hexdump(stdout, "plaintext:", plaintext, 5723 (tdata->plaintext.len >> 3) - tdata->digest.len); 5724 debug_hexdump(stdout, "plaintext expected:", 5725 tdata->plaintext.data, 5726 (tdata->plaintext.len >> 3) - tdata->digest.len); 5727 } else { 5728 if (ut_params->obuf) 5729 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5730 ciphertext_len, buffer); 5731 else 5732 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5733 ciphertext_len, buffer); 5734 5735 debug_hexdump(stdout, "ciphertext:", ciphertext, 5736 ciphertext_len); 5737 debug_hexdump(stdout, "ciphertext expected:", 5738 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5739 5740 if (ut_params->obuf) 5741 digest = rte_pktmbuf_read(ut_params->obuf, 5742 (tdata->digest.offset_bytes == 0 ? 5743 plaintext_pad_len : tdata->digest.offset_bytes), 5744 tdata->digest.len, digest_buffer); 5745 else 5746 digest = rte_pktmbuf_read(ut_params->ibuf, 5747 (tdata->digest.offset_bytes == 0 ? 5748 plaintext_pad_len : tdata->digest.offset_bytes), 5749 tdata->digest.len, digest_buffer); 5750 5751 debug_hexdump(stdout, "digest:", digest, 5752 tdata->digest.len); 5753 debug_hexdump(stdout, "digest expected:", 5754 tdata->digest.data, tdata->digest.len); 5755 } 5756 5757 /* Validate obuf */ 5758 if (verify) { 5759 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5760 plaintext, 5761 tdata->plaintext.data, 5762 tdata->plaintext.len >> 3, 5763 "KASUMI Plaintext data not as expected"); 5764 } else { 5765 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5766 ciphertext, 5767 tdata->ciphertext.data, 5768 tdata->validDataLenInBits.len, 5769 "KASUMI Ciphertext data not as expected"); 5770 5771 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5772 digest, 5773 tdata->digest.data, 5774 DIGEST_BYTE_LENGTH_KASUMI_F9, 5775 "KASUMI Generated auth tag not as expected"); 5776 } 5777 return 0; 5778 } 5779 5780 static int 5781 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5782 { 5783 struct crypto_testsuite_params *ts_params = &testsuite_params; 5784 struct crypto_unittest_params *ut_params = &unittest_params; 5785 5786 int retval; 5787 5788 uint8_t *plaintext, *ciphertext; 5789 unsigned plaintext_pad_len; 5790 unsigned plaintext_len; 5791 struct rte_cryptodev_info dev_info; 5792 5793 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5794 uint64_t feat_flags = dev_info.feature_flags; 5795 5796 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5797 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5798 printf("Device doesn't support RAW data-path APIs.\n"); 5799 return TEST_SKIPPED; 5800 } 5801 5802 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5803 return TEST_SKIPPED; 5804 5805 /* Verify the capabilities */ 5806 struct rte_cryptodev_sym_capability_idx cap_idx; 5807 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5808 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5809 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5810 &cap_idx) == NULL) 5811 return TEST_SKIPPED; 5812 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5813 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5814 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5815 &cap_idx) == NULL) 5816 return TEST_SKIPPED; 5817 5818 /* Create KASUMI session */ 5819 retval = create_wireless_algo_cipher_auth_session( 5820 ts_params->valid_devs[0], 5821 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5822 RTE_CRYPTO_AUTH_OP_GENERATE, 5823 RTE_CRYPTO_AUTH_KASUMI_F9, 5824 RTE_CRYPTO_CIPHER_KASUMI_F8, 5825 tdata->key.data, tdata->key.len, 5826 0, tdata->digest.len, 5827 tdata->cipher_iv.len); 5828 if (retval != 0) 5829 return retval; 5830 5831 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5832 5833 /* clear mbuf payload */ 5834 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5835 rte_pktmbuf_tailroom(ut_params->ibuf)); 5836 5837 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5838 /* Append data which is padded to a multiple of */ 5839 /* the algorithms block size */ 5840 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5841 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5842 plaintext_pad_len); 5843 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5844 5845 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5846 5847 /* Create KASUMI operation */ 5848 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5849 tdata->digest.len, NULL, 0, 5850 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5851 tdata->cipher_iv.data, tdata->cipher_iv.len, 5852 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5853 tdata->validCipherOffsetInBits.len, 5854 tdata->validAuthLenInBits.len, 5855 0 5856 ); 5857 if (retval < 0) 5858 return retval; 5859 5860 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5861 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5862 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5863 else 5864 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5865 ut_params->op); 5866 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5867 5868 if (ut_params->op->sym->m_dst) 5869 ut_params->obuf = ut_params->op->sym->m_dst; 5870 else 5871 ut_params->obuf = ut_params->op->sym->m_src; 5872 5873 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5874 tdata->validCipherOffsetInBits.len >> 3); 5875 5876 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5877 + plaintext_pad_len; 5878 5879 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5880 (tdata->validCipherOffsetInBits.len >> 3); 5881 /* Validate obuf */ 5882 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5883 ciphertext, 5884 reference_ciphertext, 5885 tdata->validCipherLenInBits.len, 5886 "KASUMI Ciphertext data not as expected"); 5887 5888 /* Validate obuf */ 5889 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5890 ut_params->digest, 5891 tdata->digest.data, 5892 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5893 "KASUMI Generated auth tag not as expected"); 5894 return 0; 5895 } 5896 5897 static int 5898 check_cipher_capability(const struct crypto_testsuite_params *ts_params, 5899 const enum rte_crypto_cipher_algorithm cipher_algo, 5900 const uint16_t key_size, const uint16_t iv_size) 5901 { 5902 struct rte_cryptodev_sym_capability_idx cap_idx; 5903 const struct rte_cryptodev_symmetric_capability *cap; 5904 5905 /* Check if device supports the algorithm */ 5906 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5907 cap_idx.algo.cipher = cipher_algo; 5908 5909 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5910 &cap_idx); 5911 5912 if (cap == NULL) 5913 return -1; 5914 5915 /* Check if device supports key size and IV size */ 5916 if (rte_cryptodev_sym_capability_check_cipher(cap, key_size, 5917 iv_size) < 0) { 5918 return -1; 5919 } 5920 5921 return 0; 5922 } 5923 5924 static int 5925 check_auth_capability(const struct crypto_testsuite_params *ts_params, 5926 const enum rte_crypto_auth_algorithm auth_algo, 5927 const uint16_t key_size, const uint16_t iv_size, 5928 const uint16_t tag_size) 5929 { 5930 struct rte_cryptodev_sym_capability_idx cap_idx; 5931 const struct rte_cryptodev_symmetric_capability *cap; 5932 5933 /* Check if device supports the algorithm */ 5934 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5935 cap_idx.algo.auth = auth_algo; 5936 5937 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5938 &cap_idx); 5939 5940 if (cap == NULL) 5941 return -1; 5942 5943 /* Check if device supports key size and IV size */ 5944 if (rte_cryptodev_sym_capability_check_auth(cap, key_size, 5945 tag_size, iv_size) < 0) { 5946 return -1; 5947 } 5948 5949 return 0; 5950 } 5951 5952 static int 5953 test_zuc_cipher(const struct wireless_test_data *tdata, 5954 enum rte_crypto_cipher_operation direction) 5955 { 5956 struct crypto_testsuite_params *ts_params = &testsuite_params; 5957 struct crypto_unittest_params *ut_params = &unittest_params; 5958 5959 int retval; 5960 uint8_t *plaintext = NULL; 5961 uint8_t *ciphertext = NULL; 5962 unsigned int plaintext_pad_len, ciphertext_pad_len; 5963 unsigned int plaintext_len = 0; 5964 unsigned int ciphertext_len = 0; 5965 struct rte_cryptodev_info dev_info; 5966 5967 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5968 uint64_t feat_flags = dev_info.feature_flags; 5969 5970 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5971 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5972 printf("Device doesn't support RAW data-path APIs.\n"); 5973 return TEST_SKIPPED; 5974 } 5975 5976 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5977 return TEST_SKIPPED; 5978 5979 /* Check if device supports ZUC EEA3 */ 5980 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 5981 tdata->key.len, tdata->cipher_iv.len) < 0) 5982 return TEST_SKIPPED; 5983 5984 /* Create ZUC session */ 5985 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5986 direction, 5987 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5988 tdata->key.data, tdata->key.len, 5989 tdata->cipher_iv.len); 5990 if (retval != 0) 5991 return retval; 5992 5993 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5994 5995 /* Clear mbuf payload */ 5996 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5997 rte_pktmbuf_tailroom(ut_params->ibuf)); 5998 5999 if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 6000 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6001 /* Append data which is padded to a multiple */ 6002 /* of the algorithms block size */ 6003 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6004 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6005 plaintext_pad_len); 6006 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6007 6008 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 6009 } else { 6010 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6011 /* Append data which is padded to a multiple */ 6012 /* of the algorithms block size */ 6013 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 6014 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6015 ciphertext_pad_len); 6016 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6017 6018 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 6019 } 6020 6021 /* Create ZUC operation */ 6022 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 6023 tdata->cipher_iv.len, 6024 tdata->plaintext.len, 6025 tdata->validCipherOffsetInBits.len); 6026 if (retval < 0) 6027 return retval; 6028 6029 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6030 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6031 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 6032 else 6033 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6034 ut_params->op); 6035 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6036 6037 ut_params->obuf = ut_params->op->sym->m_dst; 6038 6039 if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 6040 if (ut_params->obuf) 6041 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 6042 else 6043 ciphertext = plaintext; 6044 6045 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 6046 6047 /* Validate obuf */ 6048 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6049 ciphertext, 6050 tdata->ciphertext.data, 6051 tdata->validCipherLenInBits.len, 6052 "ZUC Ciphertext data not as expected"); 6053 } else { 6054 if (ut_params->obuf) 6055 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 6056 else 6057 plaintext = ciphertext; 6058 6059 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 6060 6061 const uint8_t *reference_plaintext = tdata->plaintext.data + 6062 (tdata->validCipherOffsetInBits.len >> 3); 6063 6064 /* Validate obuf */ 6065 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6066 plaintext, 6067 reference_plaintext, 6068 tdata->validCipherLenInBits.len, 6069 "ZUC Plaintext data not as expected"); 6070 } 6071 6072 return 0; 6073 } 6074 6075 static int 6076 test_zuc_cipher_sgl(const struct wireless_test_data *tdata, 6077 enum rte_crypto_cipher_operation direction) 6078 { 6079 struct crypto_testsuite_params *ts_params = &testsuite_params; 6080 struct crypto_unittest_params *ut_params = &unittest_params; 6081 6082 int retval; 6083 6084 unsigned int plaintext_pad_len, ciphertext_pad_len; 6085 unsigned int plaintext_len = 0; 6086 unsigned int ciphertext_len = 0; 6087 const uint8_t *ciphertext, *plaintext; 6088 uint8_t buffer[2048]; 6089 struct rte_cryptodev_info dev_info; 6090 6091 /* Check if device supports ZUC EEA3 */ 6092 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6093 tdata->key.len, tdata->cipher_iv.len) < 0) 6094 return TEST_SKIPPED; 6095 6096 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6097 return TEST_SKIPPED; 6098 6099 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6100 6101 uint64_t feat_flags = dev_info.feature_flags; 6102 6103 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6104 printf("Device doesn't support in-place scatter-gather. " 6105 "Test Skipped.\n"); 6106 return TEST_SKIPPED; 6107 } 6108 6109 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6110 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6111 printf("Device doesn't support RAW data-path APIs.\n"); 6112 return TEST_SKIPPED; 6113 } 6114 6115 if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 6116 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6117 6118 /* Append data which is padded to a multiple */ 6119 /* of the algorithms block size */ 6120 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6121 6122 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6123 plaintext_pad_len, 10, 0); 6124 6125 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6126 tdata->plaintext.data); 6127 } else { 6128 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6129 6130 /* Append data which is padded to a multiple */ 6131 /* of the algorithms block size */ 6132 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 6133 6134 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6135 ciphertext_pad_len, 10, 0); 6136 6137 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6138 tdata->ciphertext.data); 6139 6140 } 6141 6142 /* Create ZUC session */ 6143 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 6144 direction, 6145 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6146 tdata->key.data, tdata->key.len, 6147 tdata->cipher_iv.len); 6148 if (retval < 0) 6149 return retval; 6150 6151 /* Clear mbuf payload */ 6152 if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) 6153 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 6154 else 6155 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, tdata->ciphertext.data); 6156 6157 /* Create ZUC operation */ 6158 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 6159 tdata->cipher_iv.len, tdata->plaintext.len, 6160 tdata->validCipherOffsetInBits.len); 6161 if (retval < 0) 6162 return retval; 6163 6164 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6165 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6166 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 6167 else 6168 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6169 ut_params->op); 6170 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6171 6172 ut_params->obuf = ut_params->op->sym->m_dst; 6173 6174 if (direction == RTE_CRYPTO_CIPHER_OP_ENCRYPT) { 6175 if (ut_params->obuf) 6176 ciphertext = rte_pktmbuf_read(ut_params->obuf, 6177 0, plaintext_len, buffer); 6178 else 6179 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 6180 0, plaintext_len, buffer); 6181 6182 /* Validate obuf */ 6183 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 6184 6185 /* Validate obuf */ 6186 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6187 ciphertext, 6188 tdata->ciphertext.data, 6189 tdata->validCipherLenInBits.len, 6190 "ZUC Ciphertext data not as expected"); 6191 } else { 6192 if (ut_params->obuf) 6193 plaintext = rte_pktmbuf_read(ut_params->obuf, 6194 0, ciphertext_len, buffer); 6195 else 6196 plaintext = rte_pktmbuf_read(ut_params->ibuf, 6197 0, ciphertext_len, buffer); 6198 6199 /* Validate obuf */ 6200 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 6201 6202 /* Validate obuf */ 6203 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6204 plaintext, 6205 tdata->plaintext.data, 6206 tdata->validCipherLenInBits.len, 6207 "ZUC Plaintext data not as expected"); 6208 } 6209 6210 return 0; 6211 } 6212 6213 static int 6214 test_zuc_authentication(const struct wireless_test_data *tdata, 6215 enum rte_crypto_auth_operation auth_op) 6216 { 6217 struct crypto_testsuite_params *ts_params = &testsuite_params; 6218 struct crypto_unittest_params *ut_params = &unittest_params; 6219 6220 int retval; 6221 unsigned plaintext_pad_len; 6222 unsigned plaintext_len; 6223 uint8_t *plaintext; 6224 6225 struct rte_cryptodev_info dev_info; 6226 6227 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6228 uint64_t feat_flags = dev_info.feature_flags; 6229 6230 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 6231 (tdata->validAuthLenInBits.len % 8 != 0)) { 6232 printf("Device doesn't support NON-Byte Aligned Data.\n"); 6233 return TEST_SKIPPED; 6234 } 6235 6236 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6237 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6238 printf("Device doesn't support RAW data-path APIs.\n"); 6239 return TEST_SKIPPED; 6240 } 6241 6242 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6243 return TEST_SKIPPED; 6244 6245 /* Check if device supports ZUC EIA3 */ 6246 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6247 tdata->key.len, tdata->auth_iv.len, 6248 tdata->digest.len) < 0) 6249 return TEST_SKIPPED; 6250 6251 /* Create ZUC session */ 6252 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 6253 tdata->key.data, tdata->key.len, 6254 tdata->auth_iv.len, tdata->digest.len, 6255 auth_op, RTE_CRYPTO_AUTH_ZUC_EIA3); 6256 if (retval != 0) 6257 return retval; 6258 6259 /* alloc mbuf and set payload */ 6260 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6261 6262 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6263 rte_pktmbuf_tailroom(ut_params->ibuf)); 6264 6265 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6266 /* Append data which is padded to a multiple of */ 6267 /* the algorithms block size */ 6268 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6269 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6270 plaintext_pad_len); 6271 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6272 6273 /* Create ZUC operation */ 6274 retval = create_wireless_algo_hash_operation(tdata->digest.data, 6275 tdata->digest.len, 6276 tdata->auth_iv.data, tdata->auth_iv.len, 6277 plaintext_pad_len, 6278 auth_op, tdata->validAuthLenInBits.len, 0); 6279 if (retval < 0) 6280 return retval; 6281 6282 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6283 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6284 ut_params->op, 0, 1, 1, 0); 6285 else 6286 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6287 ut_params->op); 6288 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6289 ut_params->obuf = ut_params->op->sym->m_src; 6290 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6291 + plaintext_pad_len; 6292 6293 if (auth_op != RTE_CRYPTO_AUTH_OP_VERIFY) { 6294 /* Validate obuf */ 6295 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6296 ut_params->digest, 6297 tdata->digest.data, 6298 tdata->digest.len, 6299 "ZUC Generated auth tag not as expected"); 6300 return 0; 6301 } 6302 6303 /* Validate obuf */ 6304 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 6305 return 0; 6306 else 6307 return -1; 6308 6309 return 0; 6310 } 6311 6312 static int 6313 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 6314 uint8_t op_mode, uint8_t verify) 6315 { 6316 struct crypto_testsuite_params *ts_params = &testsuite_params; 6317 struct crypto_unittest_params *ut_params = &unittest_params; 6318 6319 int retval; 6320 6321 uint8_t *plaintext = NULL, *ciphertext = NULL; 6322 unsigned int plaintext_pad_len; 6323 unsigned int plaintext_len; 6324 unsigned int ciphertext_pad_len; 6325 unsigned int ciphertext_len; 6326 6327 struct rte_cryptodev_info dev_info; 6328 6329 /* Check if device supports ZUC EEA3 */ 6330 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6331 tdata->key.len, tdata->cipher_iv.len) < 0) 6332 return TEST_SKIPPED; 6333 6334 /* Check if device supports ZUC EIA3 */ 6335 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6336 tdata->key.len, tdata->auth_iv.len, 6337 tdata->digest.len) < 0) 6338 return TEST_SKIPPED; 6339 6340 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6341 6342 uint64_t feat_flags = dev_info.feature_flags; 6343 6344 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6345 printf("Device doesn't support digest encrypted.\n"); 6346 return TEST_SKIPPED; 6347 } 6348 if (op_mode == IN_PLACE) { 6349 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6350 printf("Device doesn't support in-place scatter-gather " 6351 "in both input and output mbufs.\n"); 6352 return TEST_SKIPPED; 6353 } 6354 6355 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6356 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6357 printf("Device doesn't support RAW data-path APIs.\n"); 6358 return TEST_SKIPPED; 6359 } 6360 } else { 6361 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6362 return TEST_SKIPPED; 6363 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6364 printf("Device doesn't support out-of-place scatter-gather " 6365 "in both input and output mbufs.\n"); 6366 return TEST_SKIPPED; 6367 } 6368 } 6369 6370 /* Create ZUC session */ 6371 retval = create_wireless_algo_auth_cipher_session( 6372 ts_params->valid_devs[0], 6373 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6374 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6375 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6376 : RTE_CRYPTO_AUTH_OP_GENERATE), 6377 RTE_CRYPTO_AUTH_ZUC_EIA3, 6378 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6379 tdata->key.data, tdata->key.len, 6380 tdata->auth_iv.len, tdata->digest.len, 6381 tdata->cipher_iv.len); 6382 6383 if (retval != 0) 6384 return retval; 6385 6386 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6387 if (op_mode == OUT_OF_PLACE) 6388 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6389 6390 /* clear mbuf payload */ 6391 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6392 rte_pktmbuf_tailroom(ut_params->ibuf)); 6393 if (op_mode == OUT_OF_PLACE) 6394 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6395 rte_pktmbuf_tailroom(ut_params->obuf)); 6396 6397 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6398 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6399 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6400 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6401 6402 if (verify) { 6403 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6404 ciphertext_pad_len); 6405 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6406 debug_hexdump(stdout, "ciphertext:", ciphertext, 6407 ciphertext_len); 6408 } else { 6409 /* make sure enough space to cover partial digest verify case */ 6410 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6411 ciphertext_pad_len); 6412 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6413 debug_hexdump(stdout, "plaintext:", plaintext, 6414 plaintext_len); 6415 } 6416 6417 if (op_mode == OUT_OF_PLACE) 6418 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6419 6420 /* Create ZUC operation */ 6421 retval = create_wireless_algo_auth_cipher_operation( 6422 tdata->digest.data, tdata->digest.len, 6423 tdata->cipher_iv.data, tdata->cipher_iv.len, 6424 tdata->auth_iv.data, tdata->auth_iv.len, 6425 (tdata->digest.offset_bytes == 0 ? 6426 (verify ? ciphertext_pad_len : plaintext_pad_len) 6427 : tdata->digest.offset_bytes), 6428 tdata->validCipherLenInBits.len, 6429 tdata->validCipherOffsetInBits.len, 6430 tdata->validAuthLenInBits.len, 6431 0, 6432 op_mode, 0, verify); 6433 6434 if (retval < 0) 6435 return retval; 6436 6437 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6438 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6439 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6440 else 6441 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6442 ut_params->op); 6443 6444 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6445 6446 ut_params->obuf = (op_mode == IN_PLACE ? 6447 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6448 6449 6450 if (verify) { 6451 if (ut_params->obuf) 6452 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6453 uint8_t *); 6454 else 6455 plaintext = ciphertext; 6456 6457 debug_hexdump(stdout, "plaintext:", plaintext, 6458 (tdata->plaintext.len >> 3) - tdata->digest.len); 6459 debug_hexdump(stdout, "plaintext expected:", 6460 tdata->plaintext.data, 6461 (tdata->plaintext.len >> 3) - tdata->digest.len); 6462 } else { 6463 if (ut_params->obuf) 6464 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6465 uint8_t *); 6466 else 6467 ciphertext = plaintext; 6468 6469 debug_hexdump(stdout, "ciphertext:", ciphertext, 6470 ciphertext_len); 6471 debug_hexdump(stdout, "ciphertext expected:", 6472 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6473 6474 ut_params->digest = rte_pktmbuf_mtod( 6475 ut_params->obuf, uint8_t *) + 6476 (tdata->digest.offset_bytes == 0 ? 6477 plaintext_pad_len : tdata->digest.offset_bytes); 6478 6479 debug_hexdump(stdout, "digest:", ut_params->digest, 6480 tdata->digest.len); 6481 debug_hexdump(stdout, "digest expected:", 6482 tdata->digest.data, tdata->digest.len); 6483 } 6484 6485 /* Validate obuf */ 6486 if (verify) { 6487 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6488 plaintext, 6489 tdata->plaintext.data, 6490 tdata->plaintext.len >> 3, 6491 "ZUC Plaintext data not as expected"); 6492 } else { 6493 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6494 ciphertext, 6495 tdata->ciphertext.data, 6496 tdata->ciphertext.len >> 3, 6497 "ZUC Ciphertext data not as expected"); 6498 6499 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6500 ut_params->digest, 6501 tdata->digest.data, 6502 DIGEST_BYTE_LENGTH_KASUMI_F9, 6503 "ZUC Generated auth tag not as expected"); 6504 } 6505 return 0; 6506 } 6507 6508 static int 6509 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 6510 uint8_t op_mode, uint8_t verify) 6511 { 6512 struct crypto_testsuite_params *ts_params = &testsuite_params; 6513 struct crypto_unittest_params *ut_params = &unittest_params; 6514 6515 int retval; 6516 6517 const uint8_t *plaintext = NULL; 6518 const uint8_t *ciphertext = NULL; 6519 const uint8_t *digest = NULL; 6520 unsigned int plaintext_pad_len; 6521 unsigned int plaintext_len; 6522 unsigned int ciphertext_pad_len; 6523 unsigned int ciphertext_len; 6524 uint8_t buffer[10000]; 6525 uint8_t digest_buffer[10000]; 6526 6527 struct rte_cryptodev_info dev_info; 6528 6529 /* Check if device supports ZUC EEA3 */ 6530 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6531 tdata->key.len, tdata->cipher_iv.len) < 0) 6532 return TEST_SKIPPED; 6533 6534 /* Check if device supports ZUC EIA3 */ 6535 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6536 tdata->key.len, tdata->auth_iv.len, 6537 tdata->digest.len) < 0) 6538 return TEST_SKIPPED; 6539 6540 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6541 6542 uint64_t feat_flags = dev_info.feature_flags; 6543 6544 if (op_mode == IN_PLACE) { 6545 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6546 printf("Device doesn't support in-place scatter-gather " 6547 "in both input and output mbufs.\n"); 6548 return TEST_SKIPPED; 6549 } 6550 6551 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6552 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6553 printf("Device doesn't support RAW data-path APIs.\n"); 6554 return TEST_SKIPPED; 6555 } 6556 } else { 6557 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6558 return TEST_SKIPPED; 6559 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6560 printf("Device doesn't support out-of-place scatter-gather " 6561 "in both input and output mbufs.\n"); 6562 return TEST_SKIPPED; 6563 } 6564 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6565 printf("Device doesn't support digest encrypted.\n"); 6566 return TEST_SKIPPED; 6567 } 6568 } 6569 6570 /* Create ZUC session */ 6571 retval = create_wireless_algo_auth_cipher_session( 6572 ts_params->valid_devs[0], 6573 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6574 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6575 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6576 : RTE_CRYPTO_AUTH_OP_GENERATE), 6577 RTE_CRYPTO_AUTH_ZUC_EIA3, 6578 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6579 tdata->key.data, tdata->key.len, 6580 tdata->auth_iv.len, tdata->digest.len, 6581 tdata->cipher_iv.len); 6582 6583 if (retval != 0) 6584 return retval; 6585 6586 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6587 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6588 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6589 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6590 6591 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6592 plaintext_pad_len, 15, 0); 6593 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6594 "Failed to allocate input buffer in mempool"); 6595 6596 if (op_mode == OUT_OF_PLACE) { 6597 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6598 plaintext_pad_len, 15, 0); 6599 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6600 "Failed to allocate output buffer in mempool"); 6601 } 6602 6603 if (verify) { 6604 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6605 tdata->ciphertext.data); 6606 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6607 ciphertext_len, buffer); 6608 debug_hexdump(stdout, "ciphertext:", ciphertext, 6609 ciphertext_len); 6610 } else { 6611 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6612 tdata->plaintext.data); 6613 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6614 plaintext_len, buffer); 6615 debug_hexdump(stdout, "plaintext:", plaintext, 6616 plaintext_len); 6617 } 6618 memset(buffer, 0, sizeof(buffer)); 6619 6620 /* Create ZUC operation */ 6621 retval = create_wireless_algo_auth_cipher_operation( 6622 tdata->digest.data, tdata->digest.len, 6623 tdata->cipher_iv.data, tdata->cipher_iv.len, 6624 tdata->auth_iv.data, tdata->auth_iv.len, 6625 (tdata->digest.offset_bytes == 0 ? 6626 (verify ? ciphertext_pad_len : plaintext_pad_len) 6627 : tdata->digest.offset_bytes), 6628 tdata->validCipherLenInBits.len, 6629 tdata->validCipherOffsetInBits.len, 6630 tdata->validAuthLenInBits.len, 6631 0, 6632 op_mode, 1, verify); 6633 6634 if (retval < 0) 6635 return retval; 6636 6637 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6638 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6639 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6640 else 6641 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6642 ut_params->op); 6643 6644 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6645 6646 ut_params->obuf = (op_mode == IN_PLACE ? 6647 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6648 6649 if (verify) { 6650 if (ut_params->obuf) 6651 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6652 plaintext_len, buffer); 6653 else 6654 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6655 plaintext_len, buffer); 6656 6657 debug_hexdump(stdout, "plaintext:", plaintext, 6658 (tdata->plaintext.len >> 3) - tdata->digest.len); 6659 debug_hexdump(stdout, "plaintext expected:", 6660 tdata->plaintext.data, 6661 (tdata->plaintext.len >> 3) - tdata->digest.len); 6662 } else { 6663 if (ut_params->obuf) 6664 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6665 ciphertext_len, buffer); 6666 else 6667 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6668 ciphertext_len, buffer); 6669 6670 debug_hexdump(stdout, "ciphertext:", ciphertext, 6671 ciphertext_len); 6672 debug_hexdump(stdout, "ciphertext expected:", 6673 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6674 6675 if (ut_params->obuf) 6676 digest = rte_pktmbuf_read(ut_params->obuf, 6677 (tdata->digest.offset_bytes == 0 ? 6678 plaintext_pad_len : tdata->digest.offset_bytes), 6679 tdata->digest.len, digest_buffer); 6680 else 6681 digest = rte_pktmbuf_read(ut_params->ibuf, 6682 (tdata->digest.offset_bytes == 0 ? 6683 plaintext_pad_len : tdata->digest.offset_bytes), 6684 tdata->digest.len, digest_buffer); 6685 6686 debug_hexdump(stdout, "digest:", digest, 6687 tdata->digest.len); 6688 debug_hexdump(stdout, "digest expected:", 6689 tdata->digest.data, tdata->digest.len); 6690 } 6691 6692 /* Validate obuf */ 6693 if (verify) { 6694 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6695 plaintext, 6696 tdata->plaintext.data, 6697 tdata->plaintext.len >> 3, 6698 "ZUC Plaintext data not as expected"); 6699 } else { 6700 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6701 ciphertext, 6702 tdata->ciphertext.data, 6703 tdata->validDataLenInBits.len, 6704 "ZUC Ciphertext data not as expected"); 6705 6706 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6707 digest, 6708 tdata->digest.data, 6709 DIGEST_BYTE_LENGTH_KASUMI_F9, 6710 "ZUC Generated auth tag not as expected"); 6711 } 6712 return 0; 6713 } 6714 6715 static int 6716 test_kasumi_encryption_test_case_1(void) 6717 { 6718 return test_kasumi_encryption(&kasumi_test_case_1); 6719 } 6720 6721 static int 6722 test_kasumi_encryption_test_case_1_sgl(void) 6723 { 6724 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6725 } 6726 6727 static int 6728 test_kasumi_encryption_test_case_1_oop(void) 6729 { 6730 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6731 } 6732 6733 static int 6734 test_kasumi_encryption_test_case_1_oop_sgl(void) 6735 { 6736 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6737 } 6738 6739 static int 6740 test_kasumi_encryption_test_case_2(void) 6741 { 6742 return test_kasumi_encryption(&kasumi_test_case_2); 6743 } 6744 6745 static int 6746 test_kasumi_encryption_test_case_3(void) 6747 { 6748 return test_kasumi_encryption(&kasumi_test_case_3); 6749 } 6750 6751 static int 6752 test_kasumi_encryption_test_case_4(void) 6753 { 6754 return test_kasumi_encryption(&kasumi_test_case_4); 6755 } 6756 6757 static int 6758 test_kasumi_encryption_test_case_5(void) 6759 { 6760 return test_kasumi_encryption(&kasumi_test_case_5); 6761 } 6762 6763 static int 6764 test_kasumi_decryption_test_case_1(void) 6765 { 6766 return test_kasumi_decryption(&kasumi_test_case_1); 6767 } 6768 6769 static int 6770 test_kasumi_decryption_test_case_1_oop(void) 6771 { 6772 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6773 } 6774 6775 static int 6776 test_kasumi_decryption_test_case_2(void) 6777 { 6778 return test_kasumi_decryption(&kasumi_test_case_2); 6779 } 6780 6781 static int 6782 test_kasumi_decryption_test_case_3(void) 6783 { 6784 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6785 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6786 return TEST_SKIPPED; 6787 return test_kasumi_decryption(&kasumi_test_case_3); 6788 } 6789 6790 static int 6791 test_kasumi_decryption_test_case_4(void) 6792 { 6793 return test_kasumi_decryption(&kasumi_test_case_4); 6794 } 6795 6796 static int 6797 test_kasumi_decryption_test_case_5(void) 6798 { 6799 return test_kasumi_decryption(&kasumi_test_case_5); 6800 } 6801 static int 6802 test_snow3g_encryption_test_case_1(void) 6803 { 6804 return test_snow3g_encryption(&snow3g_test_case_1); 6805 } 6806 6807 static int 6808 test_snow3g_encryption_test_case_1_oop(void) 6809 { 6810 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6811 } 6812 6813 static int 6814 test_snow3g_encryption_test_case_1_oop_sgl(void) 6815 { 6816 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 1, 1); 6817 } 6818 6819 static int 6820 test_snow3g_encryption_test_case_1_oop_lb_in_sgl_out(void) 6821 { 6822 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 0, 1); 6823 } 6824 6825 static int 6826 test_snow3g_encryption_test_case_1_oop_sgl_in_lb_out(void) 6827 { 6828 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1, 1, 0); 6829 } 6830 6831 static int 6832 test_snow3g_encryption_test_case_1_offset_oop(void) 6833 { 6834 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6835 } 6836 6837 static int 6838 test_snow3g_encryption_test_case_2(void) 6839 { 6840 return test_snow3g_encryption(&snow3g_test_case_2); 6841 } 6842 6843 static int 6844 test_snow3g_encryption_test_case_3(void) 6845 { 6846 return test_snow3g_encryption(&snow3g_test_case_3); 6847 } 6848 6849 static int 6850 test_snow3g_encryption_test_case_4(void) 6851 { 6852 return test_snow3g_encryption(&snow3g_test_case_4); 6853 } 6854 6855 static int 6856 test_snow3g_encryption_test_case_5(void) 6857 { 6858 return test_snow3g_encryption(&snow3g_test_case_5); 6859 } 6860 6861 static int 6862 test_snow3g_decryption_test_case_1(void) 6863 { 6864 return test_snow3g_decryption(&snow3g_test_case_1); 6865 } 6866 6867 static int 6868 test_snow3g_decryption_test_case_1_oop(void) 6869 { 6870 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6871 } 6872 6873 static int 6874 test_snow3g_decryption_test_case_2(void) 6875 { 6876 return test_snow3g_decryption(&snow3g_test_case_2); 6877 } 6878 6879 static int 6880 test_snow3g_decryption_test_case_3(void) 6881 { 6882 return test_snow3g_decryption(&snow3g_test_case_3); 6883 } 6884 6885 static int 6886 test_snow3g_decryption_test_case_4(void) 6887 { 6888 return test_snow3g_decryption(&snow3g_test_case_4); 6889 } 6890 6891 static int 6892 test_snow3g_decryption_test_case_5(void) 6893 { 6894 return test_snow3g_decryption(&snow3g_test_case_5); 6895 } 6896 6897 /* 6898 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6899 * Pattern digest from snow3g_test_data must be allocated as 6900 * 4 last bytes in plaintext. 6901 */ 6902 static void 6903 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6904 struct snow3g_hash_test_data *output) 6905 { 6906 if ((pattern != NULL) && (output != NULL)) { 6907 output->key.len = pattern->key.len; 6908 6909 memcpy(output->key.data, 6910 pattern->key.data, pattern->key.len); 6911 6912 output->auth_iv.len = pattern->auth_iv.len; 6913 6914 memcpy(output->auth_iv.data, 6915 pattern->auth_iv.data, pattern->auth_iv.len); 6916 6917 output->plaintext.len = pattern->plaintext.len; 6918 6919 memcpy(output->plaintext.data, 6920 pattern->plaintext.data, pattern->plaintext.len >> 3); 6921 6922 output->digest.len = pattern->digest.len; 6923 6924 memcpy(output->digest.data, 6925 &pattern->plaintext.data[pattern->digest.offset_bytes], 6926 pattern->digest.len); 6927 6928 output->validAuthLenInBits.len = 6929 pattern->validAuthLenInBits.len; 6930 } 6931 } 6932 6933 /* 6934 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6935 */ 6936 static int 6937 test_snow3g_decryption_with_digest_test_case_1(void) 6938 { 6939 struct snow3g_hash_test_data snow3g_hash_data; 6940 struct rte_cryptodev_info dev_info; 6941 struct crypto_testsuite_params *ts_params = &testsuite_params; 6942 6943 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6944 uint64_t feat_flags = dev_info.feature_flags; 6945 6946 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6947 printf("Device doesn't support encrypted digest operations.\n"); 6948 return TEST_SKIPPED; 6949 } 6950 6951 /* 6952 * Function prepare data for hash verification test case. 6953 * Digest is allocated in 4 last bytes in plaintext, pattern. 6954 */ 6955 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6956 6957 if (test_snow3g_decryption(&snow3g_test_case_7)) 6958 return TEST_FAILED; 6959 6960 return test_snow3g_authentication_verify(&snow3g_hash_data); 6961 } 6962 6963 static int 6964 test_snow3g_cipher_auth_test_case_1(void) 6965 { 6966 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6967 } 6968 6969 static int 6970 test_snow3g_auth_cipher_test_case_1(void) 6971 { 6972 return test_snow3g_auth_cipher( 6973 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6974 } 6975 6976 static int 6977 test_snow3g_auth_cipher_test_case_2(void) 6978 { 6979 return test_snow3g_auth_cipher( 6980 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6981 } 6982 6983 static int 6984 test_snow3g_auth_cipher_test_case_2_oop(void) 6985 { 6986 return test_snow3g_auth_cipher( 6987 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6988 } 6989 6990 static int 6991 test_snow3g_auth_cipher_part_digest_enc(void) 6992 { 6993 return test_snow3g_auth_cipher( 6994 &snow3g_auth_cipher_partial_digest_encryption, 6995 IN_PLACE, 0); 6996 } 6997 6998 static int 6999 test_snow3g_auth_cipher_part_digest_enc_oop(void) 7000 { 7001 return test_snow3g_auth_cipher( 7002 &snow3g_auth_cipher_partial_digest_encryption, 7003 OUT_OF_PLACE, 0); 7004 } 7005 7006 static int 7007 test_snow3g_auth_cipher_test_case_3_sgl(void) 7008 { 7009 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 7010 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7011 return TEST_SKIPPED; 7012 return test_snow3g_auth_cipher_sgl( 7013 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 7014 } 7015 7016 static int 7017 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 7018 { 7019 return test_snow3g_auth_cipher_sgl( 7020 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 7021 } 7022 7023 static int 7024 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 7025 { 7026 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 7027 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7028 return TEST_SKIPPED; 7029 return test_snow3g_auth_cipher_sgl( 7030 &snow3g_auth_cipher_partial_digest_encryption, 7031 IN_PLACE, 0); 7032 } 7033 7034 static int 7035 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 7036 { 7037 return test_snow3g_auth_cipher_sgl( 7038 &snow3g_auth_cipher_partial_digest_encryption, 7039 OUT_OF_PLACE, 0); 7040 } 7041 7042 static int 7043 test_snow3g_auth_cipher_total_digest_enc_1(void) 7044 { 7045 return test_snow3g_auth_cipher( 7046 &snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 0); 7047 } 7048 7049 static int 7050 test_snow3g_auth_cipher_total_digest_enc_1_oop(void) 7051 { 7052 return test_snow3g_auth_cipher( 7053 &snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 0); 7054 } 7055 7056 static int 7057 test_snow3g_auth_cipher_total_digest_enc_1_sgl(void) 7058 { 7059 return test_snow3g_auth_cipher_sgl( 7060 &snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 0); 7061 } 7062 7063 static int 7064 test_snow3g_auth_cipher_total_digest_enc_1_oop_sgl(void) 7065 { 7066 return test_snow3g_auth_cipher_sgl( 7067 &snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 0); 7068 } 7069 7070 static int 7071 test_snow3g_auth_cipher_verify_test_case_1(void) 7072 { 7073 return test_snow3g_auth_cipher( 7074 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 7075 } 7076 7077 static int 7078 test_snow3g_auth_cipher_verify_test_case_2(void) 7079 { 7080 return test_snow3g_auth_cipher( 7081 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 7082 } 7083 7084 static int 7085 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 7086 { 7087 return test_snow3g_auth_cipher( 7088 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7089 } 7090 7091 static int 7092 test_snow3g_auth_cipher_verify_part_digest_enc(void) 7093 { 7094 return test_snow3g_auth_cipher( 7095 &snow3g_auth_cipher_partial_digest_encryption, 7096 IN_PLACE, 1); 7097 } 7098 7099 static int 7100 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 7101 { 7102 return test_snow3g_auth_cipher( 7103 &snow3g_auth_cipher_partial_digest_encryption, 7104 OUT_OF_PLACE, 1); 7105 } 7106 7107 static int 7108 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 7109 { 7110 return test_snow3g_auth_cipher_sgl( 7111 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 7112 } 7113 7114 static int 7115 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 7116 { 7117 return test_snow3g_auth_cipher_sgl( 7118 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 7119 } 7120 7121 static int 7122 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 7123 { 7124 return test_snow3g_auth_cipher_sgl( 7125 &snow3g_auth_cipher_partial_digest_encryption, 7126 IN_PLACE, 1); 7127 } 7128 7129 static int 7130 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 7131 { 7132 return test_snow3g_auth_cipher_sgl( 7133 &snow3g_auth_cipher_partial_digest_encryption, 7134 OUT_OF_PLACE, 1); 7135 } 7136 7137 static int 7138 test_snow3g_auth_cipher_verify_total_digest_enc_1(void) 7139 { 7140 return test_snow3g_auth_cipher( 7141 &snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 1); 7142 } 7143 7144 static int 7145 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop(void) 7146 { 7147 return test_snow3g_auth_cipher( 7148 &snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 1); 7149 } 7150 7151 static int 7152 test_snow3g_auth_cipher_verify_total_digest_enc_1_sgl(void) 7153 { 7154 return test_snow3g_auth_cipher_sgl( 7155 &snow3g_auth_cipher_total_digest_encryption_1, IN_PLACE, 1); 7156 } 7157 7158 static int 7159 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop_sgl(void) 7160 { 7161 return test_snow3g_auth_cipher_sgl( 7162 &snow3g_auth_cipher_total_digest_encryption_1, OUT_OF_PLACE, 1); 7163 } 7164 7165 static int 7166 test_snow3g_auth_cipher_with_digest_test_case_1(void) 7167 { 7168 return test_snow3g_auth_cipher( 7169 &snow3g_test_case_7, IN_PLACE, 0); 7170 } 7171 7172 static int 7173 test_kasumi_auth_cipher_test_case_1(void) 7174 { 7175 return test_kasumi_auth_cipher( 7176 &kasumi_test_case_3, IN_PLACE, 0); 7177 } 7178 7179 static int 7180 test_kasumi_auth_cipher_test_case_2(void) 7181 { 7182 return test_kasumi_auth_cipher( 7183 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 7184 } 7185 7186 static int 7187 test_kasumi_auth_cipher_test_case_2_oop(void) 7188 { 7189 return test_kasumi_auth_cipher( 7190 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 7191 } 7192 7193 static int 7194 test_kasumi_auth_cipher_test_case_2_sgl(void) 7195 { 7196 return test_kasumi_auth_cipher_sgl( 7197 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 7198 } 7199 7200 static int 7201 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 7202 { 7203 return test_kasumi_auth_cipher_sgl( 7204 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 7205 } 7206 7207 static int 7208 test_kasumi_auth_cipher_verify_test_case_1(void) 7209 { 7210 return test_kasumi_auth_cipher( 7211 &kasumi_test_case_3, IN_PLACE, 1); 7212 } 7213 7214 static int 7215 test_kasumi_auth_cipher_verify_test_case_2(void) 7216 { 7217 return test_kasumi_auth_cipher( 7218 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 7219 } 7220 7221 static int 7222 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 7223 { 7224 return test_kasumi_auth_cipher( 7225 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7226 } 7227 7228 static int 7229 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 7230 { 7231 return test_kasumi_auth_cipher_sgl( 7232 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 7233 } 7234 7235 static int 7236 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 7237 { 7238 return test_kasumi_auth_cipher_sgl( 7239 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7240 } 7241 7242 static int 7243 test_kasumi_cipher_auth_test_case_1(void) 7244 { 7245 return test_kasumi_cipher_auth(&kasumi_test_case_6); 7246 } 7247 7248 static int 7249 test_zuc_encryption_test_case_1(void) 7250 { 7251 return test_zuc_cipher(&zuc_test_case_cipher_193b, 7252 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7253 } 7254 7255 static int 7256 test_zuc_encryption_test_case_2(void) 7257 { 7258 return test_zuc_cipher(&zuc_test_case_cipher_800b, 7259 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7260 } 7261 7262 static int 7263 test_zuc_encryption_test_case_3(void) 7264 { 7265 return test_zuc_cipher(&zuc_test_case_cipher_1570b, 7266 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7267 } 7268 7269 static int 7270 test_zuc_encryption_test_case_4(void) 7271 { 7272 return test_zuc_cipher(&zuc_test_case_cipher_2798b, 7273 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7274 } 7275 7276 static int 7277 test_zuc_encryption_test_case_5(void) 7278 { 7279 return test_zuc_cipher(&zuc_test_case_cipher_4019b, 7280 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7281 } 7282 7283 static int 7284 test_zuc_encryption_test_case_6_sgl(void) 7285 { 7286 return test_zuc_cipher_sgl(&zuc_test_case_cipher_193b, 7287 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7288 } 7289 7290 static int 7291 test_zuc_decryption_test_case_1(void) 7292 { 7293 return test_zuc_cipher(&zuc_test_case_cipher_193b, 7294 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7295 } 7296 7297 static int 7298 test_zuc_decryption_test_case_2(void) 7299 { 7300 return test_zuc_cipher(&zuc_test_case_cipher_800b, 7301 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7302 } 7303 7304 static int 7305 test_zuc_decryption_test_case_3(void) 7306 { 7307 return test_zuc_cipher(&zuc_test_case_cipher_1570b, 7308 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7309 } 7310 7311 static int 7312 test_zuc_decryption_test_case_4(void) 7313 { 7314 return test_zuc_cipher(&zuc_test_case_cipher_2798b, 7315 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7316 } 7317 7318 static int 7319 test_zuc_decryption_test_case_5(void) 7320 { 7321 return test_zuc_cipher(&zuc_test_case_cipher_4019b, 7322 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7323 } 7324 7325 static int 7326 test_zuc_decryption_test_case_6_sgl(void) 7327 { 7328 return test_zuc_cipher_sgl(&zuc_test_case_cipher_193b, 7329 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7330 } 7331 7332 static int 7333 test_zuc_hash_generate_test_case_1(void) 7334 { 7335 return test_zuc_authentication(&zuc_test_case_auth_1b, 7336 RTE_CRYPTO_AUTH_OP_GENERATE); 7337 } 7338 7339 static int 7340 test_zuc_hash_generate_test_case_2(void) 7341 { 7342 return test_zuc_authentication(&zuc_test_case_auth_90b, 7343 RTE_CRYPTO_AUTH_OP_GENERATE); 7344 } 7345 7346 static int 7347 test_zuc_hash_generate_test_case_3(void) 7348 { 7349 return test_zuc_authentication(&zuc_test_case_auth_577b, 7350 RTE_CRYPTO_AUTH_OP_GENERATE); 7351 } 7352 7353 static int 7354 test_zuc_hash_generate_test_case_4(void) 7355 { 7356 return test_zuc_authentication(&zuc_test_case_auth_2079b, 7357 RTE_CRYPTO_AUTH_OP_GENERATE); 7358 } 7359 7360 static int 7361 test_zuc_hash_generate_test_case_5(void) 7362 { 7363 return test_zuc_authentication(&zuc_test_auth_5670b, 7364 RTE_CRYPTO_AUTH_OP_GENERATE); 7365 } 7366 7367 static int 7368 test_zuc_hash_generate_test_case_6(void) 7369 { 7370 return test_zuc_authentication(&zuc_test_case_auth_128b, 7371 RTE_CRYPTO_AUTH_OP_GENERATE); 7372 } 7373 7374 static int 7375 test_zuc_hash_generate_test_case_7(void) 7376 { 7377 return test_zuc_authentication(&zuc_test_case_auth_2080b, 7378 RTE_CRYPTO_AUTH_OP_GENERATE); 7379 } 7380 7381 static int 7382 test_zuc_hash_generate_test_case_8(void) 7383 { 7384 return test_zuc_authentication(&zuc_test_case_auth_584b, 7385 RTE_CRYPTO_AUTH_OP_GENERATE); 7386 } 7387 7388 static int 7389 test_zuc_hash_generate_test_case_9(void) 7390 { 7391 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b, 7392 RTE_CRYPTO_AUTH_OP_GENERATE); 7393 } 7394 7395 static int 7396 test_zuc_hash_generate_test_case_10(void) 7397 { 7398 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b, 7399 RTE_CRYPTO_AUTH_OP_GENERATE); 7400 } 7401 7402 static int 7403 test_zuc_hash_generate_test_case_11(void) 7404 { 7405 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b, 7406 RTE_CRYPTO_AUTH_OP_GENERATE); 7407 } 7408 7409 static int 7410 test_zuc_hash_verify_test_case_1(void) 7411 { 7412 return test_zuc_authentication(&zuc_test_case_auth_1b, 7413 RTE_CRYPTO_AUTH_OP_VERIFY); 7414 } 7415 7416 static int 7417 test_zuc_hash_verify_test_case_2(void) 7418 { 7419 return test_zuc_authentication(&zuc_test_case_auth_90b, 7420 RTE_CRYPTO_AUTH_OP_VERIFY); 7421 } 7422 7423 static int 7424 test_zuc_hash_verify_test_case_3(void) 7425 { 7426 return test_zuc_authentication(&zuc_test_case_auth_577b, 7427 RTE_CRYPTO_AUTH_OP_VERIFY); 7428 } 7429 7430 static int 7431 test_zuc_hash_verify_test_case_4(void) 7432 { 7433 return test_zuc_authentication(&zuc_test_case_auth_2079b, 7434 RTE_CRYPTO_AUTH_OP_VERIFY); 7435 } 7436 7437 static int 7438 test_zuc_hash_verify_test_case_5(void) 7439 { 7440 return test_zuc_authentication(&zuc_test_auth_5670b, 7441 RTE_CRYPTO_AUTH_OP_VERIFY); 7442 } 7443 7444 static int 7445 test_zuc_hash_verify_test_case_6(void) 7446 { 7447 return test_zuc_authentication(&zuc_test_case_auth_128b, 7448 RTE_CRYPTO_AUTH_OP_VERIFY); 7449 } 7450 7451 static int 7452 test_zuc_hash_verify_test_case_7(void) 7453 { 7454 return test_zuc_authentication(&zuc_test_case_auth_2080b, 7455 RTE_CRYPTO_AUTH_OP_VERIFY); 7456 } 7457 7458 static int 7459 test_zuc_hash_verify_test_case_8(void) 7460 { 7461 return test_zuc_authentication(&zuc_test_case_auth_584b, 7462 RTE_CRYPTO_AUTH_OP_VERIFY); 7463 } 7464 7465 static int 7466 test_zuc_hash_verify_test_case_9(void) 7467 { 7468 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b, 7469 RTE_CRYPTO_AUTH_OP_VERIFY); 7470 } 7471 7472 static int 7473 test_zuc_hash_verify_test_case_10(void) 7474 { 7475 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b, 7476 RTE_CRYPTO_AUTH_OP_VERIFY); 7477 } 7478 7479 static int 7480 test_zuc_hash_verify_test_case_11(void) 7481 { 7482 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b, 7483 RTE_CRYPTO_AUTH_OP_VERIFY); 7484 } 7485 7486 static int 7487 test_zuc_cipher_auth_test_case_1(void) 7488 { 7489 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 7490 } 7491 7492 static int 7493 test_zuc_cipher_auth_test_case_2(void) 7494 { 7495 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 7496 } 7497 7498 static int 7499 test_zuc_auth_cipher_test_case_1(void) 7500 { 7501 return test_zuc_auth_cipher( 7502 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7503 } 7504 7505 static int 7506 test_zuc_auth_cipher_test_case_1_oop(void) 7507 { 7508 return test_zuc_auth_cipher( 7509 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7510 } 7511 7512 static int 7513 test_zuc_auth_cipher_test_case_1_sgl(void) 7514 { 7515 return test_zuc_auth_cipher_sgl( 7516 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7517 } 7518 7519 static int 7520 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 7521 { 7522 return test_zuc_auth_cipher_sgl( 7523 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7524 } 7525 7526 static int 7527 test_zuc_auth_cipher_test_case_2(void) 7528 { 7529 return test_zuc_auth_cipher( 7530 &zuc_auth_cipher_test_case_2, IN_PLACE, 0); 7531 } 7532 7533 static int 7534 test_zuc_auth_cipher_test_case_2_oop(void) 7535 { 7536 return test_zuc_auth_cipher( 7537 &zuc_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 7538 } 7539 7540 static int 7541 test_zuc_auth_cipher_verify_test_case_1(void) 7542 { 7543 return test_zuc_auth_cipher( 7544 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7545 } 7546 7547 static int 7548 test_zuc_auth_cipher_verify_test_case_1_oop(void) 7549 { 7550 return test_zuc_auth_cipher( 7551 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7552 } 7553 7554 static int 7555 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 7556 { 7557 return test_zuc_auth_cipher_sgl( 7558 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7559 } 7560 7561 static int 7562 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 7563 { 7564 return test_zuc_auth_cipher_sgl( 7565 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7566 } 7567 7568 static int 7569 test_zuc_auth_cipher_verify_test_case_2(void) 7570 { 7571 return test_zuc_auth_cipher( 7572 &zuc_auth_cipher_test_case_2, IN_PLACE, 1); 7573 } 7574 7575 static int 7576 test_zuc_auth_cipher_verify_test_case_2_oop(void) 7577 { 7578 return test_zuc_auth_cipher( 7579 &zuc_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7580 } 7581 7582 static int 7583 test_zuc256_encryption_test_case_1(void) 7584 { 7585 return test_zuc_cipher(&zuc256_test_case_cipher_1, 7586 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7587 } 7588 7589 static int 7590 test_zuc256_encryption_test_case_2(void) 7591 { 7592 return test_zuc_cipher(&zuc256_test_case_cipher_2, 7593 RTE_CRYPTO_CIPHER_OP_ENCRYPT); 7594 } 7595 7596 static int 7597 test_zuc256_decryption_test_case_1(void) 7598 { 7599 return test_zuc_cipher(&zuc256_test_case_cipher_1, 7600 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7601 } 7602 7603 static int 7604 test_zuc256_decryption_test_case_2(void) 7605 { 7606 return test_zuc_cipher(&zuc256_test_case_cipher_2, 7607 RTE_CRYPTO_CIPHER_OP_DECRYPT); 7608 } 7609 7610 static int 7611 test_zuc256_authentication_test_case_1(void) 7612 { 7613 return test_zuc_authentication(&zuc256_test_case_auth_1, 0); 7614 } 7615 7616 static int 7617 test_zuc256_authentication_test_case_2(void) 7618 { 7619 return test_zuc_authentication(&zuc256_test_case_auth_2, 0); 7620 } 7621 7622 static int 7623 test_zuc256_authentication_verify_test_case_1(void) 7624 { 7625 return test_zuc_authentication(&zuc256_test_case_auth_1, 1); 7626 } 7627 7628 static int 7629 test_zuc256_authentication_verify_test_case_2(void) 7630 { 7631 return test_zuc_authentication(&zuc256_test_case_auth_2, 1); 7632 } 7633 7634 static int 7635 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 7636 { 7637 uint8_t dev_id = testsuite_params.valid_devs[0]; 7638 7639 struct rte_cryptodev_sym_capability_idx cap_idx; 7640 7641 /* Check if device supports particular cipher algorithm */ 7642 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7643 cap_idx.algo.cipher = tdata->cipher_algo; 7644 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7645 return TEST_SKIPPED; 7646 7647 /* Check if device supports particular hash algorithm */ 7648 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7649 cap_idx.algo.auth = tdata->auth_algo; 7650 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7651 return TEST_SKIPPED; 7652 7653 return 0; 7654 } 7655 7656 static int 7657 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 7658 uint8_t op_mode, uint8_t verify) 7659 { 7660 struct crypto_testsuite_params *ts_params = &testsuite_params; 7661 struct crypto_unittest_params *ut_params = &unittest_params; 7662 7663 int retval; 7664 7665 uint8_t *plaintext = NULL, *ciphertext = NULL; 7666 unsigned int plaintext_pad_len; 7667 unsigned int plaintext_len; 7668 unsigned int ciphertext_pad_len; 7669 unsigned int ciphertext_len; 7670 7671 struct rte_cryptodev_info dev_info; 7672 struct rte_crypto_op *op; 7673 7674 /* Check if device supports particular algorithms separately */ 7675 if (test_mixed_check_if_unsupported(tdata)) 7676 return TEST_SKIPPED; 7677 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7678 return TEST_SKIPPED; 7679 7680 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7681 7682 uint64_t feat_flags = dev_info.feature_flags; 7683 7684 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7685 printf("Device doesn't support digest encrypted.\n"); 7686 return TEST_SKIPPED; 7687 } 7688 7689 /* Create the session */ 7690 if (verify) 7691 retval = create_wireless_algo_cipher_auth_session( 7692 ts_params->valid_devs[0], 7693 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7694 RTE_CRYPTO_AUTH_OP_VERIFY, 7695 tdata->auth_algo, 7696 tdata->cipher_algo, 7697 tdata->auth_key.data, tdata->auth_key.len, 7698 tdata->auth_iv.len, tdata->digest_enc.len, 7699 tdata->cipher_iv.len); 7700 else 7701 retval = create_wireless_algo_auth_cipher_session( 7702 ts_params->valid_devs[0], 7703 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7704 RTE_CRYPTO_AUTH_OP_GENERATE, 7705 tdata->auth_algo, 7706 tdata->cipher_algo, 7707 tdata->auth_key.data, tdata->auth_key.len, 7708 tdata->auth_iv.len, tdata->digest_enc.len, 7709 tdata->cipher_iv.len); 7710 if (retval != 0) 7711 return retval; 7712 7713 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7714 if (op_mode == OUT_OF_PLACE) 7715 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7716 7717 /* clear mbuf payload */ 7718 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7719 rte_pktmbuf_tailroom(ut_params->ibuf)); 7720 if (op_mode == OUT_OF_PLACE) { 7721 7722 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 7723 rte_pktmbuf_tailroom(ut_params->obuf)); 7724 } 7725 7726 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7727 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7728 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7729 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7730 7731 if (verify) { 7732 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7733 ciphertext_pad_len); 7734 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 7735 debug_hexdump(stdout, "ciphertext:", ciphertext, 7736 ciphertext_len); 7737 } else { 7738 /* make sure enough space to cover partial digest verify case */ 7739 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7740 ciphertext_pad_len); 7741 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 7742 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 7743 } 7744 7745 if (op_mode == OUT_OF_PLACE) 7746 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 7747 7748 /* Create the operation */ 7749 retval = create_wireless_algo_auth_cipher_operation( 7750 tdata->digest_enc.data, tdata->digest_enc.len, 7751 tdata->cipher_iv.data, tdata->cipher_iv.len, 7752 tdata->auth_iv.data, tdata->auth_iv.len, 7753 (tdata->digest_enc.offset == 0 ? 7754 plaintext_pad_len 7755 : tdata->digest_enc.offset), 7756 tdata->validCipherLen.len_bits, 7757 tdata->cipher.offset_bits, 7758 tdata->validAuthLen.len_bits, 7759 tdata->auth.offset_bits, 7760 op_mode, 0, verify); 7761 7762 if (retval < 0) 7763 return retval; 7764 7765 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7766 7767 /* Check if the op failed because the device doesn't */ 7768 /* support this particular combination of algorithms */ 7769 if (op == NULL && ut_params->op->status == 7770 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7771 printf("Device doesn't support this mixed combination. " 7772 "Test Skipped.\n"); 7773 return TEST_SKIPPED; 7774 } 7775 ut_params->op = op; 7776 7777 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7778 7779 ut_params->obuf = (op_mode == IN_PLACE ? 7780 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7781 7782 if (verify) { 7783 if (ut_params->obuf) 7784 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 7785 uint8_t *); 7786 else 7787 plaintext = ciphertext + 7788 (tdata->cipher.offset_bits >> 3); 7789 7790 debug_hexdump(stdout, "plaintext:", plaintext, 7791 tdata->plaintext.len_bits >> 3); 7792 debug_hexdump(stdout, "plaintext expected:", 7793 tdata->plaintext.data, 7794 tdata->plaintext.len_bits >> 3); 7795 } else { 7796 if (ut_params->obuf) 7797 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 7798 uint8_t *); 7799 else 7800 ciphertext = plaintext; 7801 7802 debug_hexdump(stdout, "ciphertext:", ciphertext, 7803 ciphertext_len); 7804 debug_hexdump(stdout, "ciphertext expected:", 7805 tdata->ciphertext.data, 7806 tdata->ciphertext.len_bits >> 3); 7807 7808 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 7809 + (tdata->digest_enc.offset == 0 ? 7810 plaintext_pad_len : tdata->digest_enc.offset); 7811 7812 debug_hexdump(stdout, "digest:", ut_params->digest, 7813 tdata->digest_enc.len); 7814 debug_hexdump(stdout, "digest expected:", 7815 tdata->digest_enc.data, 7816 tdata->digest_enc.len); 7817 } 7818 7819 if (!verify) { 7820 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7821 ut_params->digest, 7822 tdata->digest_enc.data, 7823 tdata->digest_enc.len, 7824 "Generated auth tag not as expected"); 7825 } 7826 7827 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) { 7828 if (verify) { 7829 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7830 plaintext, 7831 tdata->plaintext.data, 7832 tdata->plaintext.len_bits >> 3, 7833 "Plaintext data not as expected"); 7834 } else { 7835 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7836 ciphertext, 7837 tdata->ciphertext.data, 7838 tdata->validDataLen.len_bits, 7839 "Ciphertext data not as expected"); 7840 } 7841 } 7842 7843 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7844 "crypto op processing failed"); 7845 7846 return 0; 7847 } 7848 7849 static int 7850 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 7851 uint8_t op_mode, uint8_t verify) 7852 { 7853 struct crypto_testsuite_params *ts_params = &testsuite_params; 7854 struct crypto_unittest_params *ut_params = &unittest_params; 7855 7856 int retval; 7857 7858 const uint8_t *plaintext = NULL; 7859 const uint8_t *ciphertext = NULL; 7860 const uint8_t *digest = NULL; 7861 unsigned int plaintext_pad_len; 7862 unsigned int plaintext_len; 7863 unsigned int ciphertext_pad_len; 7864 unsigned int ciphertext_len; 7865 uint8_t buffer[10000]; 7866 uint8_t digest_buffer[10000]; 7867 7868 struct rte_cryptodev_info dev_info; 7869 struct rte_crypto_op *op; 7870 7871 /* Check if device supports particular algorithms */ 7872 if (test_mixed_check_if_unsupported(tdata)) 7873 return TEST_SKIPPED; 7874 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7875 return TEST_SKIPPED; 7876 7877 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7878 7879 uint64_t feat_flags = dev_info.feature_flags; 7880 7881 if (op_mode == IN_PLACE) { 7882 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 7883 printf("Device doesn't support in-place scatter-gather " 7884 "in both input and output mbufs.\n"); 7885 return TEST_SKIPPED; 7886 } 7887 } else { 7888 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 7889 printf("Device doesn't support out-of-place scatter-gather " 7890 "in both input and output mbufs.\n"); 7891 return TEST_SKIPPED; 7892 } 7893 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7894 printf("Device doesn't support digest encrypted.\n"); 7895 return TEST_SKIPPED; 7896 } 7897 } 7898 7899 /* Create the session */ 7900 if (verify) 7901 retval = create_wireless_algo_cipher_auth_session( 7902 ts_params->valid_devs[0], 7903 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7904 RTE_CRYPTO_AUTH_OP_VERIFY, 7905 tdata->auth_algo, 7906 tdata->cipher_algo, 7907 tdata->auth_key.data, tdata->auth_key.len, 7908 tdata->auth_iv.len, tdata->digest_enc.len, 7909 tdata->cipher_iv.len); 7910 else 7911 retval = create_wireless_algo_auth_cipher_session( 7912 ts_params->valid_devs[0], 7913 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7914 RTE_CRYPTO_AUTH_OP_GENERATE, 7915 tdata->auth_algo, 7916 tdata->cipher_algo, 7917 tdata->auth_key.data, tdata->auth_key.len, 7918 tdata->auth_iv.len, tdata->digest_enc.len, 7919 tdata->cipher_iv.len); 7920 if (retval != 0) 7921 return retval; 7922 7923 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7924 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7925 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7926 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7927 7928 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7929 ciphertext_pad_len, 15, 0); 7930 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7931 "Failed to allocate input buffer in mempool"); 7932 7933 if (op_mode == OUT_OF_PLACE) { 7934 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7935 plaintext_pad_len, 15, 0); 7936 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7937 "Failed to allocate output buffer in mempool"); 7938 } 7939 7940 if (verify) { 7941 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7942 tdata->ciphertext.data); 7943 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7944 ciphertext_len, buffer); 7945 debug_hexdump(stdout, "ciphertext:", ciphertext, 7946 ciphertext_len); 7947 } else { 7948 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7949 tdata->plaintext.data); 7950 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7951 plaintext_len, buffer); 7952 debug_hexdump(stdout, "plaintext:", plaintext, 7953 plaintext_len); 7954 } 7955 memset(buffer, 0, sizeof(buffer)); 7956 7957 /* Create the operation */ 7958 retval = create_wireless_algo_auth_cipher_operation( 7959 tdata->digest_enc.data, tdata->digest_enc.len, 7960 tdata->cipher_iv.data, tdata->cipher_iv.len, 7961 tdata->auth_iv.data, tdata->auth_iv.len, 7962 (tdata->digest_enc.offset == 0 ? 7963 plaintext_pad_len 7964 : tdata->digest_enc.offset), 7965 tdata->validCipherLen.len_bits, 7966 tdata->cipher.offset_bits, 7967 tdata->validAuthLen.len_bits, 7968 tdata->auth.offset_bits, 7969 op_mode, 1, verify); 7970 7971 if (retval < 0) 7972 return retval; 7973 7974 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7975 7976 /* Check if the op failed because the device doesn't */ 7977 /* support this particular combination of algorithms */ 7978 if (op == NULL && ut_params->op->status == 7979 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7980 printf("Device doesn't support this mixed combination. " 7981 "Test Skipped.\n"); 7982 return TEST_SKIPPED; 7983 } 7984 ut_params->op = op; 7985 7986 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7987 7988 ut_params->obuf = (op_mode == IN_PLACE ? 7989 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7990 7991 if (verify) { 7992 if (ut_params->obuf) 7993 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7994 plaintext_len, buffer); 7995 else 7996 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7997 plaintext_len, buffer); 7998 7999 debug_hexdump(stdout, "plaintext:", plaintext, 8000 (tdata->plaintext.len_bits >> 3) - 8001 tdata->digest_enc.len); 8002 debug_hexdump(stdout, "plaintext expected:", 8003 tdata->plaintext.data, 8004 (tdata->plaintext.len_bits >> 3) - 8005 tdata->digest_enc.len); 8006 } else { 8007 if (ut_params->obuf) 8008 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 8009 ciphertext_len, buffer); 8010 else 8011 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 8012 ciphertext_len, buffer); 8013 8014 debug_hexdump(stdout, "ciphertext:", ciphertext, 8015 ciphertext_len); 8016 debug_hexdump(stdout, "ciphertext expected:", 8017 tdata->ciphertext.data, 8018 tdata->ciphertext.len_bits >> 3); 8019 8020 if (ut_params->obuf) 8021 digest = rte_pktmbuf_read(ut_params->obuf, 8022 (tdata->digest_enc.offset == 0 ? 8023 plaintext_pad_len : 8024 tdata->digest_enc.offset), 8025 tdata->digest_enc.len, digest_buffer); 8026 else 8027 digest = rte_pktmbuf_read(ut_params->ibuf, 8028 (tdata->digest_enc.offset == 0 ? 8029 plaintext_pad_len : 8030 tdata->digest_enc.offset), 8031 tdata->digest_enc.len, digest_buffer); 8032 8033 debug_hexdump(stdout, "digest:", digest, 8034 tdata->digest_enc.len); 8035 debug_hexdump(stdout, "digest expected:", 8036 tdata->digest_enc.data, tdata->digest_enc.len); 8037 } 8038 8039 if (!verify) { 8040 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8041 digest, 8042 tdata->digest_enc.data, 8043 tdata->digest_enc.len, 8044 "Generated auth tag not as expected"); 8045 } 8046 8047 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) { 8048 if (verify) { 8049 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 8050 plaintext, 8051 tdata->plaintext.data, 8052 tdata->plaintext.len_bits >> 3, 8053 "Plaintext data not as expected"); 8054 } else { 8055 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 8056 ciphertext, 8057 tdata->ciphertext.data, 8058 tdata->validDataLen.len_bits, 8059 "Ciphertext data not as expected"); 8060 } 8061 } 8062 8063 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8064 "crypto op processing failed"); 8065 8066 return 0; 8067 } 8068 8069 /** AUTH AES CMAC + CIPHER AES CTR */ 8070 8071 static int 8072 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 8073 { 8074 return test_mixed_auth_cipher( 8075 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 8076 } 8077 8078 static int 8079 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 8080 { 8081 return test_mixed_auth_cipher( 8082 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 8083 } 8084 8085 static int 8086 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 8087 { 8088 return test_mixed_auth_cipher_sgl( 8089 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 8090 } 8091 8092 static int 8093 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 8094 { 8095 return test_mixed_auth_cipher_sgl( 8096 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 8097 } 8098 8099 static int 8100 test_aes_cmac_aes_ctr_digest_enc_test_case_2(void) 8101 { 8102 return test_mixed_auth_cipher( 8103 &auth_aes_cmac_cipher_aes_ctr_test_case_2, IN_PLACE, 0); 8104 } 8105 8106 static int 8107 test_aes_cmac_aes_ctr_digest_enc_test_case_2_oop(void) 8108 { 8109 return test_mixed_auth_cipher( 8110 &auth_aes_cmac_cipher_aes_ctr_test_case_2, OUT_OF_PLACE, 0); 8111 } 8112 8113 static int 8114 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 8115 { 8116 return test_mixed_auth_cipher( 8117 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 8118 } 8119 8120 static int 8121 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2(void) 8122 { 8123 return test_mixed_auth_cipher( 8124 &auth_aes_cmac_cipher_aes_ctr_test_case_2, IN_PLACE, 1); 8125 } 8126 8127 static int 8128 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 8129 { 8130 return test_mixed_auth_cipher( 8131 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 8132 } 8133 8134 static int 8135 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 8136 { 8137 return test_mixed_auth_cipher_sgl( 8138 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 8139 } 8140 8141 static int 8142 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 8143 { 8144 return test_mixed_auth_cipher_sgl( 8145 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 8146 } 8147 8148 static int 8149 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2_oop(void) 8150 { 8151 return test_mixed_auth_cipher( 8152 &auth_aes_cmac_cipher_aes_ctr_test_case_2, OUT_OF_PLACE, 1); 8153 } 8154 8155 /** MIXED AUTH + CIPHER */ 8156 8157 static int 8158 test_auth_zuc_cipher_snow_test_case_1(void) 8159 { 8160 return test_mixed_auth_cipher( 8161 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 8162 } 8163 8164 static int 8165 test_verify_auth_zuc_cipher_snow_test_case_1(void) 8166 { 8167 return test_mixed_auth_cipher( 8168 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 8169 } 8170 8171 static int 8172 test_auth_zuc_cipher_snow_test_case_1_inplace(void) 8173 { 8174 return test_mixed_auth_cipher( 8175 &auth_zuc_cipher_snow_test_case_1, IN_PLACE, 0); 8176 } 8177 8178 static int 8179 test_verify_auth_zuc_cipher_snow_test_case_1_inplace(void) 8180 { 8181 return test_mixed_auth_cipher( 8182 &auth_zuc_cipher_snow_test_case_1, IN_PLACE, 1); 8183 } 8184 8185 8186 static int 8187 test_auth_aes_cmac_cipher_snow_test_case_1(void) 8188 { 8189 return test_mixed_auth_cipher( 8190 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 8191 } 8192 8193 static int 8194 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 8195 { 8196 return test_mixed_auth_cipher( 8197 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 8198 } 8199 8200 static int 8201 test_auth_aes_cmac_cipher_snow_test_case_1_inplace(void) 8202 { 8203 return test_mixed_auth_cipher( 8204 &auth_aes_cmac_cipher_snow_test_case_1, IN_PLACE, 0); 8205 } 8206 8207 static int 8208 test_verify_auth_aes_cmac_cipher_snow_test_case_1_inplace(void) 8209 { 8210 return test_mixed_auth_cipher( 8211 &auth_aes_cmac_cipher_snow_test_case_1, IN_PLACE, 1); 8212 } 8213 8214 static int 8215 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 8216 { 8217 return test_mixed_auth_cipher( 8218 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 8219 } 8220 8221 static int 8222 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 8223 { 8224 return test_mixed_auth_cipher( 8225 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 8226 } 8227 8228 static int 8229 test_auth_zuc_cipher_aes_ctr_test_case_1_inplace(void) 8230 { 8231 return test_mixed_auth_cipher( 8232 &auth_zuc_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 8233 } 8234 8235 static int 8236 test_verify_auth_zuc_cipher_aes_ctr_test_case_1_inplace(void) 8237 { 8238 return test_mixed_auth_cipher( 8239 &auth_zuc_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 8240 } 8241 8242 static int 8243 test_auth_snow_cipher_aes_ctr_test_case_1(void) 8244 { 8245 return test_mixed_auth_cipher( 8246 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 8247 } 8248 8249 static int 8250 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 8251 { 8252 return test_mixed_auth_cipher( 8253 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 8254 } 8255 8256 static int 8257 test_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl(void) 8258 { 8259 return test_mixed_auth_cipher_sgl( 8260 &auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 8261 } 8262 8263 static int 8264 test_auth_snow_cipher_aes_ctr_test_case_1_inplace(void) 8265 { 8266 return test_mixed_auth_cipher( 8267 &auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 8268 } 8269 8270 static int 8271 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl(void) 8272 { 8273 return test_mixed_auth_cipher_sgl( 8274 &auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 8275 } 8276 8277 static int 8278 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace(void) 8279 { 8280 return test_mixed_auth_cipher( 8281 &auth_snow_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 8282 } 8283 8284 static int 8285 test_auth_snow_cipher_zuc_test_case_1(void) 8286 { 8287 return test_mixed_auth_cipher( 8288 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 8289 } 8290 8291 static int 8292 test_verify_auth_snow_cipher_zuc_test_case_1(void) 8293 { 8294 return test_mixed_auth_cipher( 8295 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 8296 } 8297 8298 static int 8299 test_auth_snow_cipher_zuc_test_case_1_inplace(void) 8300 { 8301 return test_mixed_auth_cipher( 8302 &auth_snow_cipher_zuc_test_case_1, IN_PLACE, 0); 8303 } 8304 8305 static int 8306 test_verify_auth_snow_cipher_zuc_test_case_1_inplace(void) 8307 { 8308 return test_mixed_auth_cipher( 8309 &auth_snow_cipher_zuc_test_case_1, IN_PLACE, 1); 8310 } 8311 8312 static int 8313 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 8314 { 8315 return test_mixed_auth_cipher( 8316 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 8317 } 8318 8319 static int 8320 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 8321 { 8322 return test_mixed_auth_cipher( 8323 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 8324 } 8325 static int 8326 test_auth_aes_cmac_cipher_zuc_test_case_1_inplace(void) 8327 { 8328 return test_mixed_auth_cipher( 8329 &auth_aes_cmac_cipher_zuc_test_case_1, IN_PLACE, 0); 8330 } 8331 8332 static int 8333 test_verify_auth_aes_cmac_cipher_zuc_test_case_1_inplace(void) 8334 { 8335 return test_mixed_auth_cipher( 8336 &auth_aes_cmac_cipher_zuc_test_case_1, IN_PLACE, 1); 8337 } 8338 8339 static int 8340 test_auth_null_cipher_snow_test_case_1(void) 8341 { 8342 return test_mixed_auth_cipher( 8343 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 8344 } 8345 8346 static int 8347 test_verify_auth_null_cipher_snow_test_case_1(void) 8348 { 8349 return test_mixed_auth_cipher( 8350 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 8351 } 8352 8353 static int 8354 test_auth_null_cipher_zuc_test_case_1(void) 8355 { 8356 return test_mixed_auth_cipher( 8357 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 8358 } 8359 8360 static int 8361 test_verify_auth_null_cipher_zuc_test_case_1(void) 8362 { 8363 return test_mixed_auth_cipher( 8364 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 8365 } 8366 8367 static int 8368 test_auth_snow_cipher_null_test_case_1(void) 8369 { 8370 return test_mixed_auth_cipher( 8371 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 8372 } 8373 8374 static int 8375 test_verify_auth_snow_cipher_null_test_case_1(void) 8376 { 8377 return test_mixed_auth_cipher( 8378 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 8379 } 8380 8381 static int 8382 test_auth_zuc_cipher_null_test_case_1(void) 8383 { 8384 return test_mixed_auth_cipher( 8385 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 8386 } 8387 8388 static int 8389 test_verify_auth_zuc_cipher_null_test_case_1(void) 8390 { 8391 return test_mixed_auth_cipher( 8392 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 8393 } 8394 8395 static int 8396 test_auth_null_cipher_aes_ctr_test_case_1(void) 8397 { 8398 return test_mixed_auth_cipher( 8399 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 8400 } 8401 8402 static int 8403 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 8404 { 8405 return test_mixed_auth_cipher( 8406 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 8407 } 8408 8409 static int 8410 test_auth_aes_cmac_cipher_null_test_case_1(void) 8411 { 8412 return test_mixed_auth_cipher( 8413 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 8414 } 8415 8416 static int 8417 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 8418 { 8419 return test_mixed_auth_cipher( 8420 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 8421 } 8422 8423 /* ***** AEAD algorithm Tests ***** */ 8424 8425 static int 8426 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 8427 enum rte_crypto_aead_operation op, 8428 const uint8_t *key, const uint8_t key_len, 8429 const uint16_t aad_len, const uint8_t auth_len, 8430 uint8_t iv_len) 8431 { 8432 uint8_t aead_key[key_len]; 8433 8434 struct crypto_testsuite_params *ts_params = &testsuite_params; 8435 struct crypto_unittest_params *ut_params = &unittest_params; 8436 8437 memcpy(aead_key, key, key_len); 8438 8439 /* Setup AEAD Parameters */ 8440 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8441 ut_params->aead_xform.next = NULL; 8442 ut_params->aead_xform.aead.algo = algo; 8443 ut_params->aead_xform.aead.op = op; 8444 ut_params->aead_xform.aead.key.data = aead_key; 8445 ut_params->aead_xform.aead.key.length = key_len; 8446 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 8447 ut_params->aead_xform.aead.iv.length = iv_len; 8448 ut_params->aead_xform.aead.digest_length = auth_len; 8449 ut_params->aead_xform.aead.aad_length = aad_len; 8450 8451 debug_hexdump(stdout, "key:", key, key_len); 8452 8453 /* Create Crypto session*/ 8454 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 8455 &ut_params->aead_xform, ts_params->session_mpool); 8456 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 8457 return TEST_SKIPPED; 8458 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 8459 return 0; 8460 } 8461 8462 static int 8463 create_aead_xform(struct rte_crypto_op *op, 8464 enum rte_crypto_aead_algorithm algo, 8465 enum rte_crypto_aead_operation aead_op, 8466 uint8_t *key, const uint8_t key_len, 8467 const uint8_t aad_len, const uint8_t auth_len, 8468 uint8_t iv_len) 8469 { 8470 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 8471 "failed to allocate space for crypto transform"); 8472 8473 struct rte_crypto_sym_op *sym_op = op->sym; 8474 8475 /* Setup AEAD Parameters */ 8476 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 8477 sym_op->xform->next = NULL; 8478 sym_op->xform->aead.algo = algo; 8479 sym_op->xform->aead.op = aead_op; 8480 sym_op->xform->aead.key.data = key; 8481 sym_op->xform->aead.key.length = key_len; 8482 sym_op->xform->aead.iv.offset = IV_OFFSET; 8483 sym_op->xform->aead.iv.length = iv_len; 8484 sym_op->xform->aead.digest_length = auth_len; 8485 sym_op->xform->aead.aad_length = aad_len; 8486 8487 debug_hexdump(stdout, "key:", key, key_len); 8488 8489 return 0; 8490 } 8491 8492 static int 8493 create_aead_operation(enum rte_crypto_aead_operation op, 8494 const struct aead_test_data *tdata) 8495 { 8496 struct crypto_testsuite_params *ts_params = &testsuite_params; 8497 struct crypto_unittest_params *ut_params = &unittest_params; 8498 8499 uint8_t *plaintext, *ciphertext; 8500 unsigned int aad_pad_len, plaintext_pad_len; 8501 8502 /* Generate Crypto op data structure */ 8503 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8504 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8505 TEST_ASSERT_NOT_NULL(ut_params->op, 8506 "Failed to allocate symmetric crypto operation struct"); 8507 8508 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 8509 8510 /* Append aad data */ 8511 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 8512 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 8513 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8514 aad_pad_len); 8515 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 8516 "no room to append aad"); 8517 8518 sym_op->aead.aad.phys_addr = 8519 rte_pktmbuf_iova(ut_params->ibuf); 8520 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 8521 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 8522 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data + 18, 8523 tdata->aad.len); 8524 8525 /* Append IV at the end of the crypto operation*/ 8526 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 8527 uint8_t *, IV_OFFSET); 8528 8529 /* Copy IV 1 byte after the IV pointer, according to the API */ 8530 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 8531 debug_hexdump(stdout, "iv:", iv_ptr + 1, 8532 tdata->iv.len); 8533 } else { 8534 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 8535 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8536 aad_pad_len); 8537 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 8538 "no room to append aad"); 8539 8540 sym_op->aead.aad.phys_addr = 8541 rte_pktmbuf_iova(ut_params->ibuf); 8542 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 8543 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 8544 tdata->aad.len); 8545 8546 /* Append IV at the end of the crypto operation*/ 8547 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 8548 uint8_t *, IV_OFFSET); 8549 8550 if (tdata->iv.len == 0) { 8551 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 8552 debug_hexdump(stdout, "iv:", iv_ptr, 8553 AES_GCM_J0_LENGTH); 8554 } else { 8555 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 8556 debug_hexdump(stdout, "iv:", iv_ptr, 8557 tdata->iv.len); 8558 } 8559 } 8560 8561 /* Append plaintext/ciphertext */ 8562 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 8563 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8564 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8565 plaintext_pad_len); 8566 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 8567 8568 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 8569 debug_hexdump(stdout, "plaintext:", plaintext, 8570 tdata->plaintext.len); 8571 8572 if (ut_params->obuf) { 8573 ciphertext = (uint8_t *)rte_pktmbuf_append( 8574 ut_params->obuf, 8575 plaintext_pad_len + aad_pad_len); 8576 TEST_ASSERT_NOT_NULL(ciphertext, 8577 "no room to append ciphertext"); 8578 8579 memset(ciphertext + aad_pad_len, 0, 8580 tdata->ciphertext.len); 8581 } 8582 } else { 8583 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 8584 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8585 plaintext_pad_len); 8586 TEST_ASSERT_NOT_NULL(ciphertext, 8587 "no room to append ciphertext"); 8588 8589 memcpy(ciphertext, tdata->ciphertext.data, 8590 tdata->ciphertext.len); 8591 debug_hexdump(stdout, "ciphertext:", ciphertext, 8592 tdata->ciphertext.len); 8593 8594 if (ut_params->obuf) { 8595 plaintext = (uint8_t *)rte_pktmbuf_append( 8596 ut_params->obuf, 8597 plaintext_pad_len + aad_pad_len); 8598 TEST_ASSERT_NOT_NULL(plaintext, 8599 "no room to append plaintext"); 8600 8601 memset(plaintext + aad_pad_len, 0, 8602 tdata->plaintext.len); 8603 } 8604 } 8605 8606 /* Append digest data */ 8607 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 8608 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 8609 ut_params->obuf ? ut_params->obuf : 8610 ut_params->ibuf, 8611 tdata->auth_tag.len); 8612 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 8613 "no room to append digest"); 8614 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 8615 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 8616 ut_params->obuf ? ut_params->obuf : 8617 ut_params->ibuf, 8618 plaintext_pad_len + 8619 aad_pad_len); 8620 } else { 8621 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 8622 ut_params->ibuf, tdata->auth_tag.len); 8623 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 8624 "no room to append digest"); 8625 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 8626 ut_params->ibuf, 8627 plaintext_pad_len + aad_pad_len); 8628 8629 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 8630 tdata->auth_tag.len); 8631 debug_hexdump(stdout, "digest:", 8632 sym_op->aead.digest.data, 8633 tdata->auth_tag.len); 8634 } 8635 8636 sym_op->aead.data.length = tdata->plaintext.len; 8637 sym_op->aead.data.offset = aad_pad_len; 8638 8639 return 0; 8640 } 8641 8642 static int 8643 test_authenticated_encryption(const struct aead_test_data *tdata) 8644 { 8645 struct crypto_testsuite_params *ts_params = &testsuite_params; 8646 struct crypto_unittest_params *ut_params = &unittest_params; 8647 8648 int retval; 8649 uint8_t *ciphertext, *auth_tag; 8650 uint16_t plaintext_pad_len; 8651 uint32_t i; 8652 struct rte_cryptodev_info dev_info; 8653 8654 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8655 uint64_t feat_flags = dev_info.feature_flags; 8656 8657 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 8658 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 8659 printf("Device doesn't support RAW data-path APIs.\n"); 8660 return TEST_SKIPPED; 8661 } 8662 8663 /* Verify the capabilities */ 8664 struct rte_cryptodev_sym_capability_idx cap_idx; 8665 const struct rte_cryptodev_symmetric_capability *capability; 8666 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8667 cap_idx.algo.aead = tdata->algo; 8668 capability = rte_cryptodev_sym_capability_get( 8669 ts_params->valid_devs[0], &cap_idx); 8670 if (capability == NULL) 8671 return TEST_SKIPPED; 8672 if (rte_cryptodev_sym_capability_check_aead( 8673 capability, tdata->key.len, tdata->auth_tag.len, 8674 tdata->aad.len, tdata->iv.len)) 8675 return TEST_SKIPPED; 8676 8677 /* Create AEAD session */ 8678 retval = create_aead_session(ts_params->valid_devs[0], 8679 tdata->algo, 8680 RTE_CRYPTO_AEAD_OP_ENCRYPT, 8681 tdata->key.data, tdata->key.len, 8682 tdata->aad.len, tdata->auth_tag.len, 8683 tdata->iv.len); 8684 if (retval < 0) 8685 return retval; 8686 8687 if (tdata->aad.len > MBUF_SIZE) { 8688 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 8689 /* Populate full size of add data */ 8690 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 8691 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 8692 } else 8693 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8694 8695 /* clear mbuf payload */ 8696 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8697 rte_pktmbuf_tailroom(ut_params->ibuf)); 8698 8699 /* Create AEAD operation */ 8700 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8701 if (retval < 0) 8702 return retval; 8703 8704 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8705 8706 ut_params->op->sym->m_src = ut_params->ibuf; 8707 8708 /* Process crypto operation */ 8709 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8710 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 8711 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 8712 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8713 ut_params->op, 0, 0, 0, 0); 8714 else 8715 TEST_ASSERT_NOT_NULL( 8716 process_crypto_request(ts_params->valid_devs[0], 8717 ut_params->op), "failed to process sym crypto op"); 8718 8719 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8720 "crypto op processing failed"); 8721 8722 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8723 8724 if (ut_params->op->sym->m_dst) { 8725 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8726 uint8_t *); 8727 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8728 uint8_t *, plaintext_pad_len); 8729 } else { 8730 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8731 uint8_t *, 8732 ut_params->op->sym->cipher.data.offset); 8733 auth_tag = ciphertext + plaintext_pad_len; 8734 } 8735 8736 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8737 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8738 8739 /* Validate obuf */ 8740 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8741 ciphertext, 8742 tdata->ciphertext.data, 8743 tdata->ciphertext.len, 8744 "Ciphertext data not as expected"); 8745 8746 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8747 auth_tag, 8748 tdata->auth_tag.data, 8749 tdata->auth_tag.len, 8750 "Generated auth tag not as expected"); 8751 8752 return 0; 8753 8754 } 8755 8756 #ifdef RTE_LIB_SECURITY 8757 static int 8758 security_proto_supported(enum rte_security_session_action_type action, 8759 enum rte_security_session_protocol proto) 8760 { 8761 struct crypto_testsuite_params *ts_params = &testsuite_params; 8762 8763 const struct rte_security_capability *capabilities; 8764 const struct rte_security_capability *capability; 8765 uint16_t i = 0; 8766 8767 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8768 rte_cryptodev_get_sec_ctx( 8769 ts_params->valid_devs[0]); 8770 8771 8772 capabilities = rte_security_capabilities_get(ctx); 8773 8774 if (capabilities == NULL) 8775 return -ENOTSUP; 8776 8777 while ((capability = &capabilities[i++])->action != 8778 RTE_SECURITY_ACTION_TYPE_NONE) { 8779 if (capability->action == action && 8780 capability->protocol == proto) 8781 return 0; 8782 } 8783 8784 return -ENOTSUP; 8785 } 8786 8787 /* Basic algorithm run function for async inplace mode. 8788 * Creates a session from input parameters and runs one operation 8789 * on input_vec. Checks the output of the crypto operation against 8790 * output_vec. 8791 */ 8792 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 8793 enum rte_crypto_auth_operation opa, 8794 const uint8_t *input_vec, unsigned int input_vec_len, 8795 const uint8_t *output_vec, 8796 unsigned int output_vec_len, 8797 enum rte_crypto_cipher_algorithm cipher_alg, 8798 const uint8_t *cipher_key, uint32_t cipher_key_len, 8799 enum rte_crypto_auth_algorithm auth_alg, 8800 const uint8_t *auth_key, uint32_t auth_key_len, 8801 uint8_t bearer, enum rte_security_pdcp_domain domain, 8802 uint8_t packet_direction, uint8_t sn_size, 8803 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 8804 { 8805 struct crypto_testsuite_params *ts_params = &testsuite_params; 8806 struct crypto_unittest_params *ut_params = &unittest_params; 8807 uint8_t *plaintext; 8808 int ret = TEST_SUCCESS; 8809 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8810 rte_cryptodev_get_sec_ctx( 8811 ts_params->valid_devs[0]); 8812 struct rte_cryptodev_info dev_info; 8813 uint64_t feat_flags; 8814 8815 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8816 feat_flags = dev_info.feature_flags; 8817 8818 /* Verify the capabilities */ 8819 struct rte_security_capability_idx sec_cap_idx; 8820 8821 sec_cap_idx.action = ut_params->type; 8822 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8823 sec_cap_idx.pdcp.domain = domain; 8824 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8825 return TEST_SKIPPED; 8826 8827 /* Generate test mbuf data */ 8828 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8829 8830 /* clear mbuf payload */ 8831 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8832 rte_pktmbuf_tailroom(ut_params->ibuf)); 8833 8834 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8835 input_vec_len); 8836 memcpy(plaintext, input_vec, input_vec_len); 8837 8838 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 8839 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 8840 printf("Device does not support RAW data-path APIs.\n"); 8841 return TEST_SKIPPED; 8842 } 8843 /* Out of place support */ 8844 if (oop) { 8845 /* 8846 * For out-op-place we need to alloc another mbuf 8847 */ 8848 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8849 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 8850 } 8851 8852 /* Setup Cipher Parameters */ 8853 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8854 ut_params->cipher_xform.cipher.algo = cipher_alg; 8855 ut_params->cipher_xform.cipher.op = opc; 8856 ut_params->cipher_xform.cipher.key.data = cipher_key; 8857 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 8858 ut_params->cipher_xform.cipher.iv.length = 8859 packet_direction ? 4 : 0; 8860 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8861 8862 /* Setup HMAC Parameters if ICV header is required */ 8863 if (auth_alg != 0) { 8864 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8865 ut_params->auth_xform.next = NULL; 8866 ut_params->auth_xform.auth.algo = auth_alg; 8867 ut_params->auth_xform.auth.op = opa; 8868 ut_params->auth_xform.auth.key.data = auth_key; 8869 ut_params->auth_xform.auth.key.length = auth_key_len; 8870 8871 ut_params->cipher_xform.next = &ut_params->auth_xform; 8872 } else { 8873 ut_params->cipher_xform.next = NULL; 8874 } 8875 8876 struct rte_security_session_conf sess_conf = { 8877 .action_type = ut_params->type, 8878 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8879 {.pdcp = { 8880 .bearer = bearer, 8881 .domain = domain, 8882 .pkt_dir = packet_direction, 8883 .sn_size = sn_size, 8884 .hfn = packet_direction ? 0 : hfn, 8885 /** 8886 * hfn can be set as pdcp_test_hfn[i] 8887 * if hfn_ovrd is not set. Here, PDCP 8888 * packet direction is just used to 8889 * run half of the cases with session 8890 * HFN and other half with per packet 8891 * HFN. 8892 */ 8893 .hfn_threshold = hfn_threshold, 8894 .hfn_ovrd = packet_direction ? 1 : 0, 8895 .sdap_enabled = sdap, 8896 } }, 8897 .crypto_xform = &ut_params->cipher_xform 8898 }; 8899 8900 /* Create security session */ 8901 ut_params->sec_session = rte_security_session_create(ctx, 8902 &sess_conf, ts_params->session_mpool); 8903 8904 if (!ut_params->sec_session) { 8905 printf("TestCase %s()-%d line %d failed %s: ", 8906 __func__, i, __LINE__, "Failed to allocate session"); 8907 ret = TEST_FAILED; 8908 goto on_err; 8909 } 8910 8911 /* Generate crypto op data structure */ 8912 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8913 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8914 if (!ut_params->op) { 8915 printf("TestCase %s()-%d line %d failed %s: ", 8916 __func__, i, __LINE__, 8917 "Failed to allocate symmetric crypto operation struct"); 8918 ret = TEST_FAILED; 8919 goto on_err; 8920 } 8921 8922 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 8923 uint32_t *, IV_OFFSET); 8924 *per_pkt_hfn = packet_direction ? hfn : 0; 8925 8926 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8927 8928 /* set crypto operation source mbuf */ 8929 ut_params->op->sym->m_src = ut_params->ibuf; 8930 if (oop) 8931 ut_params->op->sym->m_dst = ut_params->obuf; 8932 8933 /* Process crypto operation */ 8934 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) { 8935 /* filling lengths */ 8936 ut_params->op->sym->cipher.data.length = ut_params->op->sym->m_src->pkt_len; 8937 ut_params->op->sym->auth.data.length = ut_params->op->sym->m_src->pkt_len; 8938 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8939 ut_params->op, 1, 1, 0, 0); 8940 } else { 8941 ut_params->op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 8942 } 8943 if (ut_params->op == NULL) { 8944 printf("TestCase %s()-%d line %d failed %s: ", 8945 __func__, i, __LINE__, 8946 "failed to process sym crypto op"); 8947 ret = TEST_FAILED; 8948 goto on_err; 8949 } 8950 8951 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8952 printf("TestCase %s()-%d line %d failed %s: ", 8953 __func__, i, __LINE__, "crypto op processing failed"); 8954 ret = TEST_FAILED; 8955 goto on_err; 8956 } 8957 8958 /* Validate obuf */ 8959 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8960 uint8_t *); 8961 if (oop) { 8962 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8963 uint8_t *); 8964 } 8965 8966 if (memcmp(ciphertext, output_vec, output_vec_len)) { 8967 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8968 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 8969 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 8970 ret = TEST_FAILED; 8971 goto on_err; 8972 } 8973 8974 on_err: 8975 rte_crypto_op_free(ut_params->op); 8976 ut_params->op = NULL; 8977 8978 if (ut_params->sec_session) 8979 rte_security_session_destroy(ctx, ut_params->sec_session); 8980 ut_params->sec_session = NULL; 8981 8982 rte_pktmbuf_free(ut_params->ibuf); 8983 ut_params->ibuf = NULL; 8984 if (oop) { 8985 rte_pktmbuf_free(ut_params->obuf); 8986 ut_params->obuf = NULL; 8987 } 8988 8989 return ret; 8990 } 8991 8992 static int 8993 test_pdcp_proto_SGL(int i, int oop, 8994 enum rte_crypto_cipher_operation opc, 8995 enum rte_crypto_auth_operation opa, 8996 uint8_t *input_vec, 8997 unsigned int input_vec_len, 8998 uint8_t *output_vec, 8999 unsigned int output_vec_len, 9000 uint32_t fragsz, 9001 uint32_t fragsz_oop) 9002 { 9003 struct crypto_testsuite_params *ts_params = &testsuite_params; 9004 struct crypto_unittest_params *ut_params = &unittest_params; 9005 uint8_t *plaintext; 9006 struct rte_mbuf *buf, *buf_oop = NULL; 9007 int ret = TEST_SUCCESS; 9008 int to_trn = 0; 9009 int to_trn_tbl[16]; 9010 int segs = 1; 9011 unsigned int trn_data = 0; 9012 struct rte_cryptodev_info dev_info; 9013 uint64_t feat_flags; 9014 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9015 rte_cryptodev_get_sec_ctx( 9016 ts_params->valid_devs[0]); 9017 struct rte_mbuf *temp_mbuf; 9018 9019 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9020 feat_flags = dev_info.feature_flags; 9021 9022 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9023 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9024 printf("Device does not support RAW data-path APIs.\n"); 9025 return -ENOTSUP; 9026 } 9027 /* Verify the capabilities */ 9028 struct rte_security_capability_idx sec_cap_idx; 9029 9030 sec_cap_idx.action = ut_params->type; 9031 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 9032 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 9033 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 9034 return TEST_SKIPPED; 9035 9036 if (fragsz > input_vec_len) 9037 fragsz = input_vec_len; 9038 9039 uint16_t plaintext_len = fragsz; 9040 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 9041 9042 if (fragsz_oop > output_vec_len) 9043 frag_size_oop = output_vec_len; 9044 9045 int ecx = 0; 9046 if (input_vec_len % fragsz != 0) { 9047 if (input_vec_len / fragsz + 1 > 16) 9048 return 1; 9049 } else if (input_vec_len / fragsz > 16) 9050 return 1; 9051 9052 /* Out of place support */ 9053 if (oop) { 9054 /* 9055 * For out-op-place we need to alloc another mbuf 9056 */ 9057 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9058 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 9059 buf_oop = ut_params->obuf; 9060 } 9061 9062 /* Generate test mbuf data */ 9063 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9064 9065 /* clear mbuf payload */ 9066 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9067 rte_pktmbuf_tailroom(ut_params->ibuf)); 9068 9069 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9070 plaintext_len); 9071 memcpy(plaintext, input_vec, plaintext_len); 9072 trn_data += plaintext_len; 9073 9074 buf = ut_params->ibuf; 9075 9076 /* 9077 * Loop until no more fragments 9078 */ 9079 9080 while (trn_data < input_vec_len) { 9081 ++segs; 9082 to_trn = (input_vec_len - trn_data < fragsz) ? 9083 (input_vec_len - trn_data) : fragsz; 9084 9085 to_trn_tbl[ecx++] = to_trn; 9086 9087 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9088 buf = buf->next; 9089 9090 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 9091 rte_pktmbuf_tailroom(buf)); 9092 9093 /* OOP */ 9094 if (oop && !fragsz_oop) { 9095 buf_oop->next = 9096 rte_pktmbuf_alloc(ts_params->mbuf_pool); 9097 buf_oop = buf_oop->next; 9098 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 9099 0, rte_pktmbuf_tailroom(buf_oop)); 9100 rte_pktmbuf_append(buf_oop, to_trn); 9101 } 9102 9103 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 9104 to_trn); 9105 9106 memcpy(plaintext, input_vec + trn_data, to_trn); 9107 trn_data += to_trn; 9108 } 9109 9110 ut_params->ibuf->nb_segs = segs; 9111 9112 segs = 1; 9113 if (fragsz_oop && oop) { 9114 to_trn = 0; 9115 ecx = 0; 9116 9117 trn_data = frag_size_oop; 9118 while (trn_data < output_vec_len) { 9119 ++segs; 9120 to_trn = 9121 (output_vec_len - trn_data < 9122 frag_size_oop) ? 9123 (output_vec_len - trn_data) : 9124 frag_size_oop; 9125 9126 to_trn_tbl[ecx++] = to_trn; 9127 9128 buf_oop->next = 9129 rte_pktmbuf_alloc(ts_params->mbuf_pool); 9130 buf_oop = buf_oop->next; 9131 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 9132 0, rte_pktmbuf_tailroom(buf_oop)); 9133 rte_pktmbuf_append(buf_oop, to_trn); 9134 9135 trn_data += to_trn; 9136 } 9137 ut_params->obuf->nb_segs = segs; 9138 } 9139 9140 /* Setup Cipher Parameters */ 9141 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9142 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 9143 ut_params->cipher_xform.cipher.op = opc; 9144 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 9145 ut_params->cipher_xform.cipher.key.length = 9146 pdcp_test_params[i].cipher_key_len; 9147 ut_params->cipher_xform.cipher.iv.length = 0; 9148 9149 /* Setup HMAC Parameters if ICV header is required */ 9150 if (pdcp_test_params[i].auth_alg != 0) { 9151 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9152 ut_params->auth_xform.next = NULL; 9153 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 9154 ut_params->auth_xform.auth.op = opa; 9155 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 9156 ut_params->auth_xform.auth.key.length = 9157 pdcp_test_params[i].auth_key_len; 9158 9159 ut_params->cipher_xform.next = &ut_params->auth_xform; 9160 } else { 9161 ut_params->cipher_xform.next = NULL; 9162 } 9163 9164 struct rte_security_session_conf sess_conf = { 9165 .action_type = ut_params->type, 9166 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 9167 {.pdcp = { 9168 .bearer = pdcp_test_bearer[i], 9169 .domain = pdcp_test_params[i].domain, 9170 .pkt_dir = pdcp_test_packet_direction[i], 9171 .sn_size = pdcp_test_data_sn_size[i], 9172 .hfn = pdcp_test_hfn[i], 9173 .hfn_threshold = pdcp_test_hfn_threshold[i], 9174 .hfn_ovrd = 0, 9175 } }, 9176 .crypto_xform = &ut_params->cipher_xform 9177 }; 9178 9179 /* Create security session */ 9180 ut_params->sec_session = rte_security_session_create(ctx, 9181 &sess_conf, ts_params->session_mpool); 9182 9183 if (!ut_params->sec_session) { 9184 printf("TestCase %s()-%d line %d failed %s: ", 9185 __func__, i, __LINE__, "Failed to allocate session"); 9186 ret = TEST_FAILED; 9187 goto on_err; 9188 } 9189 9190 /* Generate crypto op data structure */ 9191 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9192 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9193 if (!ut_params->op) { 9194 printf("TestCase %s()-%d line %d failed %s: ", 9195 __func__, i, __LINE__, 9196 "Failed to allocate symmetric crypto operation struct"); 9197 ret = TEST_FAILED; 9198 goto on_err; 9199 } 9200 9201 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9202 9203 /* set crypto operation source mbuf */ 9204 ut_params->op->sym->m_src = ut_params->ibuf; 9205 if (oop) 9206 ut_params->op->sym->m_dst = ut_params->obuf; 9207 9208 /* Process crypto operation */ 9209 temp_mbuf = ut_params->op->sym->m_src; 9210 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) { 9211 /* filling lengths */ 9212 while (temp_mbuf) { 9213 ut_params->op->sym->cipher.data.length 9214 += temp_mbuf->pkt_len; 9215 ut_params->op->sym->auth.data.length 9216 += temp_mbuf->pkt_len; 9217 temp_mbuf = temp_mbuf->next; 9218 } 9219 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 9220 ut_params->op, 1, 1, 0, 0); 9221 } else { 9222 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 9223 ut_params->op); 9224 } 9225 if (ut_params->op == NULL) { 9226 printf("TestCase %s()-%d line %d failed %s: ", 9227 __func__, i, __LINE__, 9228 "failed to process sym crypto op"); 9229 ret = TEST_FAILED; 9230 goto on_err; 9231 } 9232 9233 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9234 printf("TestCase %s()-%d line %d failed %s: ", 9235 __func__, i, __LINE__, "crypto op processing failed"); 9236 ret = TEST_FAILED; 9237 goto on_err; 9238 } 9239 9240 /* Validate obuf */ 9241 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 9242 uint8_t *); 9243 if (oop) { 9244 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 9245 uint8_t *); 9246 } 9247 if (fragsz_oop) 9248 fragsz = frag_size_oop; 9249 if (memcmp(ciphertext, output_vec, fragsz)) { 9250 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 9251 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 9252 rte_hexdump(stdout, "reference", output_vec, fragsz); 9253 ret = TEST_FAILED; 9254 goto on_err; 9255 } 9256 9257 buf = ut_params->op->sym->m_src->next; 9258 if (oop) 9259 buf = ut_params->op->sym->m_dst->next; 9260 9261 unsigned int off = fragsz; 9262 9263 ecx = 0; 9264 while (buf) { 9265 ciphertext = rte_pktmbuf_mtod(buf, 9266 uint8_t *); 9267 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 9268 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 9269 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 9270 rte_hexdump(stdout, "reference", output_vec + off, 9271 to_trn_tbl[ecx]); 9272 ret = TEST_FAILED; 9273 goto on_err; 9274 } 9275 off += to_trn_tbl[ecx++]; 9276 buf = buf->next; 9277 } 9278 on_err: 9279 rte_crypto_op_free(ut_params->op); 9280 ut_params->op = NULL; 9281 9282 if (ut_params->sec_session) 9283 rte_security_session_destroy(ctx, ut_params->sec_session); 9284 ut_params->sec_session = NULL; 9285 9286 rte_pktmbuf_free(ut_params->ibuf); 9287 ut_params->ibuf = NULL; 9288 if (oop) { 9289 rte_pktmbuf_free(ut_params->obuf); 9290 ut_params->obuf = NULL; 9291 } 9292 9293 return ret; 9294 } 9295 9296 int 9297 test_pdcp_proto_cplane_encap(int i) 9298 { 9299 return test_pdcp_proto( 9300 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 9301 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9302 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 9303 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9304 pdcp_test_params[i].cipher_key_len, 9305 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9306 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9307 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9308 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9309 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9310 } 9311 9312 int 9313 test_pdcp_proto_uplane_encap(int i) 9314 { 9315 return test_pdcp_proto( 9316 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 9317 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9318 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 9319 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9320 pdcp_test_params[i].cipher_key_len, 9321 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9322 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9323 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9324 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9325 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9326 } 9327 9328 int 9329 test_pdcp_proto_uplane_encap_with_int(int i) 9330 { 9331 return test_pdcp_proto( 9332 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 9333 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9334 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 9335 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9336 pdcp_test_params[i].cipher_key_len, 9337 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9338 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9339 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9340 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9341 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9342 } 9343 9344 int 9345 test_pdcp_proto_cplane_decap(int i) 9346 { 9347 return test_pdcp_proto( 9348 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 9349 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 9350 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9351 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9352 pdcp_test_params[i].cipher_key_len, 9353 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9354 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9355 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9356 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9357 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9358 } 9359 9360 int 9361 test_pdcp_proto_uplane_decap(int i) 9362 { 9363 return test_pdcp_proto( 9364 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 9365 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 9366 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9367 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9368 pdcp_test_params[i].cipher_key_len, 9369 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9370 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9371 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9372 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9373 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9374 } 9375 9376 int 9377 test_pdcp_proto_uplane_decap_with_int(int i) 9378 { 9379 return test_pdcp_proto( 9380 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 9381 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 9382 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 9383 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 9384 pdcp_test_params[i].cipher_key_len, 9385 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 9386 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 9387 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 9388 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 9389 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 9390 } 9391 9392 static int 9393 test_PDCP_PROTO_SGL_in_place_32B(void) 9394 { 9395 /* i can be used for running any PDCP case 9396 * In this case it is uplane 12-bit AES-SNOW DL encap 9397 */ 9398 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 9399 return test_pdcp_proto_SGL(i, IN_PLACE, 9400 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9401 RTE_CRYPTO_AUTH_OP_GENERATE, 9402 pdcp_test_data_in[i], 9403 pdcp_test_data_in_len[i], 9404 pdcp_test_data_out[i], 9405 pdcp_test_data_in_len[i]+4, 9406 32, 0); 9407 } 9408 static int 9409 test_PDCP_PROTO_SGL_oop_32B_128B(void) 9410 { 9411 /* i can be used for running any PDCP case 9412 * In this case it is uplane 18-bit NULL-NULL DL encap 9413 */ 9414 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 9415 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 9416 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9417 RTE_CRYPTO_AUTH_OP_GENERATE, 9418 pdcp_test_data_in[i], 9419 pdcp_test_data_in_len[i], 9420 pdcp_test_data_out[i], 9421 pdcp_test_data_in_len[i]+4, 9422 32, 128); 9423 } 9424 static int 9425 test_PDCP_PROTO_SGL_oop_32B_40B(void) 9426 { 9427 /* i can be used for running any PDCP case 9428 * In this case it is uplane 18-bit AES DL encap 9429 */ 9430 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 9431 + DOWNLINK; 9432 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 9433 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9434 RTE_CRYPTO_AUTH_OP_GENERATE, 9435 pdcp_test_data_in[i], 9436 pdcp_test_data_in_len[i], 9437 pdcp_test_data_out[i], 9438 pdcp_test_data_in_len[i], 9439 32, 40); 9440 } 9441 static int 9442 test_PDCP_PROTO_SGL_oop_128B_32B(void) 9443 { 9444 /* i can be used for running any PDCP case 9445 * In this case it is cplane 12-bit AES-ZUC DL encap 9446 */ 9447 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 9448 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 9449 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9450 RTE_CRYPTO_AUTH_OP_GENERATE, 9451 pdcp_test_data_in[i], 9452 pdcp_test_data_in_len[i], 9453 pdcp_test_data_out[i], 9454 pdcp_test_data_in_len[i]+4, 9455 128, 32); 9456 } 9457 9458 static int 9459 test_PDCP_SDAP_PROTO_encap_all(void) 9460 { 9461 int i = 0, size = 0; 9462 int err, all_err = TEST_SUCCESS; 9463 const struct pdcp_sdap_test *cur_test; 9464 9465 size = RTE_DIM(list_pdcp_sdap_tests); 9466 9467 for (i = 0; i < size; i++) { 9468 cur_test = &list_pdcp_sdap_tests[i]; 9469 err = test_pdcp_proto( 9470 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9471 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 9472 cur_test->in_len, cur_test->data_out, 9473 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9474 cur_test->param.cipher_alg, cur_test->cipher_key, 9475 cur_test->param.cipher_key_len, 9476 cur_test->param.auth_alg, 9477 cur_test->auth_key, cur_test->param.auth_key_len, 9478 cur_test->bearer, cur_test->param.domain, 9479 cur_test->packet_direction, cur_test->sn_size, 9480 cur_test->hfn, 9481 cur_test->hfn_threshold, SDAP_ENABLED); 9482 if (err) { 9483 printf("\t%d) %s: Encapsulation failed\n", 9484 cur_test->test_idx, 9485 cur_test->param.name); 9486 err = TEST_FAILED; 9487 } else { 9488 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 9489 cur_test->param.name); 9490 err = TEST_SUCCESS; 9491 } 9492 all_err += err; 9493 } 9494 9495 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9496 9497 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9498 } 9499 9500 static int 9501 test_PDCP_PROTO_short_mac(void) 9502 { 9503 int i = 0, size = 0; 9504 int err, all_err = TEST_SUCCESS; 9505 const struct pdcp_short_mac_test *cur_test; 9506 9507 size = RTE_DIM(list_pdcp_smac_tests); 9508 9509 for (i = 0; i < size; i++) { 9510 cur_test = &list_pdcp_smac_tests[i]; 9511 err = test_pdcp_proto( 9512 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9513 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 9514 cur_test->in_len, cur_test->data_out, 9515 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9516 RTE_CRYPTO_CIPHER_NULL, NULL, 9517 0, cur_test->param.auth_alg, 9518 cur_test->auth_key, cur_test->param.auth_key_len, 9519 0, cur_test->param.domain, 0, 0, 9520 0, 0, 0); 9521 if (err) { 9522 printf("\t%d) %s: Short MAC test failed\n", 9523 cur_test->test_idx, 9524 cur_test->param.name); 9525 err = TEST_FAILED; 9526 } else { 9527 printf("\t%d) %s: Short MAC test PASS\n", 9528 cur_test->test_idx, 9529 cur_test->param.name); 9530 rte_hexdump(stdout, "MAC I", 9531 cur_test->data_out + cur_test->in_len + 2, 9532 2); 9533 err = TEST_SUCCESS; 9534 } 9535 all_err += err; 9536 } 9537 9538 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9539 9540 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9541 9542 } 9543 9544 static int 9545 test_PDCP_SDAP_PROTO_decap_all(void) 9546 { 9547 int i = 0, size = 0; 9548 int err, all_err = TEST_SUCCESS; 9549 const struct pdcp_sdap_test *cur_test; 9550 9551 size = RTE_DIM(list_pdcp_sdap_tests); 9552 9553 for (i = 0; i < size; i++) { 9554 cur_test = &list_pdcp_sdap_tests[i]; 9555 err = test_pdcp_proto( 9556 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 9557 RTE_CRYPTO_AUTH_OP_VERIFY, 9558 cur_test->data_out, 9559 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9560 cur_test->data_in, cur_test->in_len, 9561 cur_test->param.cipher_alg, 9562 cur_test->cipher_key, cur_test->param.cipher_key_len, 9563 cur_test->param.auth_alg, cur_test->auth_key, 9564 cur_test->param.auth_key_len, cur_test->bearer, 9565 cur_test->param.domain, cur_test->packet_direction, 9566 cur_test->sn_size, cur_test->hfn, 9567 cur_test->hfn_threshold, SDAP_ENABLED); 9568 if (err) { 9569 printf("\t%d) %s: Decapsulation failed\n", 9570 cur_test->test_idx, 9571 cur_test->param.name); 9572 err = TEST_FAILED; 9573 } else { 9574 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 9575 cur_test->param.name); 9576 err = TEST_SUCCESS; 9577 } 9578 all_err += err; 9579 } 9580 9581 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9582 9583 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9584 } 9585 9586 static int 9587 test_ipsec_proto_process(const struct ipsec_test_data td[], 9588 struct ipsec_test_data res_d[], 9589 int nb_td, 9590 bool silent, 9591 const struct ipsec_test_flags *flags) 9592 { 9593 uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000, 9594 0x0000, 0x001a}; 9595 uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174, 9596 0xe82c, 0x4887}; 9597 const struct rte_ipv4_hdr *ipv4 = 9598 (const struct rte_ipv4_hdr *)td[0].output_text.data; 9599 int nb_segs = flags->nb_segs_in_mbuf ? flags->nb_segs_in_mbuf : 1; 9600 struct crypto_testsuite_params *ts_params = &testsuite_params; 9601 struct crypto_unittest_params *ut_params = &unittest_params; 9602 struct rte_security_capability_idx sec_cap_idx; 9603 const struct rte_security_capability *sec_cap; 9604 struct rte_security_ipsec_xform ipsec_xform; 9605 uint8_t dev_id = ts_params->valid_devs[0]; 9606 enum rte_security_ipsec_sa_direction dir; 9607 struct ipsec_test_data *res_d_tmp = NULL; 9608 uint8_t input_text[IPSEC_TEXT_MAX_LEN]; 9609 int salt_len, i, ret = TEST_SUCCESS; 9610 struct rte_security_ctx *ctx; 9611 uint32_t src, dst; 9612 uint32_t verify; 9613 9614 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 9615 gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 9616 9617 /* Use first test data to create session */ 9618 9619 /* Copy IPsec xform */ 9620 memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform)); 9621 9622 dir = ipsec_xform.direction; 9623 verify = flags->tunnel_hdr_verify; 9624 9625 memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr)); 9626 memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr)); 9627 9628 if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) { 9629 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR) 9630 src += 1; 9631 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR) 9632 dst += 1; 9633 } 9634 9635 if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) { 9636 if (td->ipsec_xform.tunnel.type == 9637 RTE_SECURITY_IPSEC_TUNNEL_IPV4) { 9638 memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, 9639 sizeof(src)); 9640 memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, 9641 sizeof(dst)); 9642 9643 if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1) 9644 ipsec_xform.tunnel.ipv4.df = 0; 9645 9646 if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0) 9647 ipsec_xform.tunnel.ipv4.df = 1; 9648 9649 if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1) 9650 ipsec_xform.tunnel.ipv4.dscp = 0; 9651 9652 if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0) 9653 ipsec_xform.tunnel.ipv4.dscp = 9654 TEST_IPSEC_DSCP_VAL; 9655 9656 } else { 9657 if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1) 9658 ipsec_xform.tunnel.ipv6.dscp = 0; 9659 9660 if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0) 9661 ipsec_xform.tunnel.ipv6.dscp = 9662 TEST_IPSEC_DSCP_VAL; 9663 9664 memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src, 9665 sizeof(v6_src)); 9666 memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst, 9667 sizeof(v6_dst)); 9668 } 9669 } 9670 9671 ctx = rte_cryptodev_get_sec_ctx(dev_id); 9672 9673 sec_cap_idx.action = ut_params->type; 9674 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC; 9675 sec_cap_idx.ipsec.proto = ipsec_xform.proto; 9676 sec_cap_idx.ipsec.mode = ipsec_xform.mode; 9677 sec_cap_idx.ipsec.direction = ipsec_xform.direction; 9678 9679 if (flags->udp_encap) 9680 ipsec_xform.options.udp_encap = 1; 9681 9682 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9683 if (sec_cap == NULL) 9684 return TEST_SKIPPED; 9685 9686 /* Copy cipher session parameters */ 9687 if (td[0].aead) { 9688 memcpy(&ut_params->aead_xform, &td[0].xform.aead, 9689 sizeof(ut_params->aead_xform)); 9690 ut_params->aead_xform.aead.key.data = td[0].key.data; 9691 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 9692 9693 /* Verify crypto capabilities */ 9694 if (test_ipsec_crypto_caps_aead_verify( 9695 sec_cap, 9696 &ut_params->aead_xform) != 0) { 9697 if (!silent) 9698 RTE_LOG(INFO, USER1, 9699 "Crypto capabilities not supported\n"); 9700 return TEST_SKIPPED; 9701 } 9702 } else if (td[0].auth_only) { 9703 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth, 9704 sizeof(ut_params->auth_xform)); 9705 ut_params->auth_xform.auth.key.data = td[0].auth_key.data; 9706 9707 if (test_ipsec_crypto_caps_auth_verify( 9708 sec_cap, 9709 &ut_params->auth_xform) != 0) { 9710 if (!silent) 9711 RTE_LOG(INFO, USER1, 9712 "Auth crypto capabilities not supported\n"); 9713 return TEST_SKIPPED; 9714 } 9715 } else { 9716 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher, 9717 sizeof(ut_params->cipher_xform)); 9718 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth, 9719 sizeof(ut_params->auth_xform)); 9720 ut_params->cipher_xform.cipher.key.data = td[0].key.data; 9721 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9722 ut_params->auth_xform.auth.key.data = td[0].auth_key.data; 9723 9724 /* Verify crypto capabilities */ 9725 9726 if (test_ipsec_crypto_caps_cipher_verify( 9727 sec_cap, 9728 &ut_params->cipher_xform) != 0) { 9729 if (!silent) 9730 RTE_LOG(INFO, USER1, 9731 "Cipher crypto capabilities not supported\n"); 9732 return TEST_SKIPPED; 9733 } 9734 9735 if (test_ipsec_crypto_caps_auth_verify( 9736 sec_cap, 9737 &ut_params->auth_xform) != 0) { 9738 if (!silent) 9739 RTE_LOG(INFO, USER1, 9740 "Auth crypto capabilities not supported\n"); 9741 return TEST_SKIPPED; 9742 } 9743 } 9744 9745 if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0) 9746 return TEST_SKIPPED; 9747 9748 struct rte_security_session_conf sess_conf = { 9749 .action_type = ut_params->type, 9750 .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 9751 }; 9752 9753 if (td[0].aead || td[0].aes_gmac) { 9754 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len); 9755 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len); 9756 } 9757 9758 if (td[0].aead) { 9759 sess_conf.ipsec = ipsec_xform; 9760 sess_conf.crypto_xform = &ut_params->aead_xform; 9761 } else if (td[0].auth_only) { 9762 sess_conf.ipsec = ipsec_xform; 9763 sess_conf.crypto_xform = &ut_params->auth_xform; 9764 } else { 9765 sess_conf.ipsec = ipsec_xform; 9766 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) { 9767 sess_conf.crypto_xform = &ut_params->cipher_xform; 9768 ut_params->cipher_xform.next = &ut_params->auth_xform; 9769 } else { 9770 sess_conf.crypto_xform = &ut_params->auth_xform; 9771 ut_params->auth_xform.next = &ut_params->cipher_xform; 9772 } 9773 } 9774 9775 /* Create security session */ 9776 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9777 ts_params->session_mpool); 9778 9779 if (ut_params->sec_session == NULL) 9780 return TEST_SKIPPED; 9781 9782 for (i = 0; i < nb_td; i++) { 9783 if (flags->antireplay && 9784 (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) { 9785 sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value; 9786 ret = rte_security_session_update(ctx, 9787 ut_params->sec_session, &sess_conf); 9788 if (ret) { 9789 printf("Could not update sequence number in " 9790 "session\n"); 9791 return TEST_SKIPPED; 9792 } 9793 } 9794 9795 /* Copy test data before modification */ 9796 memcpy(input_text, td[i].input_text.data, td[i].input_text.len); 9797 if (test_ipsec_pkt_update(input_text, flags)) 9798 return TEST_FAILED; 9799 9800 /* Setup source mbuf payload */ 9801 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, td[i].input_text.len, 9802 nb_segs, 0); 9803 pktmbuf_write(ut_params->ibuf, 0, td[i].input_text.len, input_text); 9804 9805 /* Generate crypto op data structure */ 9806 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9807 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9808 if (!ut_params->op) { 9809 printf("TestCase %s line %d: %s\n", 9810 __func__, __LINE__, 9811 "failed to allocate crypto op"); 9812 ret = TEST_FAILED; 9813 goto crypto_op_free; 9814 } 9815 9816 /* Attach session to operation */ 9817 rte_security_attach_session(ut_params->op, 9818 ut_params->sec_session); 9819 9820 /* Set crypto operation mbufs */ 9821 ut_params->op->sym->m_src = ut_params->ibuf; 9822 ut_params->op->sym->m_dst = NULL; 9823 9824 /* Copy IV in crypto operation when IV generation is disabled */ 9825 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS && 9826 ipsec_xform.options.iv_gen_disable == 1) { 9827 uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op, 9828 uint8_t *, 9829 IV_OFFSET); 9830 int len; 9831 9832 if (td[i].aead) 9833 len = td[i].xform.aead.aead.iv.length; 9834 else if (td[i].aes_gmac) 9835 len = td[i].xform.chain.auth.auth.iv.length; 9836 else 9837 len = td[i].xform.chain.cipher.cipher.iv.length; 9838 9839 memcpy(iv, td[i].iv.data, len); 9840 } 9841 9842 /* Process crypto operation */ 9843 process_crypto_request(dev_id, ut_params->op); 9844 9845 ret = test_ipsec_status_check(&td[i], ut_params->op, flags, dir, 9846 i + 1); 9847 if (ret != TEST_SUCCESS) 9848 goto crypto_op_free; 9849 9850 if (res_d != NULL) 9851 res_d_tmp = &res_d[i]; 9852 9853 ret = test_ipsec_post_process(ut_params->ibuf, &td[i], 9854 res_d_tmp, silent, flags); 9855 if (ret != TEST_SUCCESS) 9856 goto crypto_op_free; 9857 9858 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session, 9859 flags, dir); 9860 if (ret != TEST_SUCCESS) 9861 goto crypto_op_free; 9862 9863 rte_crypto_op_free(ut_params->op); 9864 ut_params->op = NULL; 9865 9866 rte_pktmbuf_free(ut_params->ibuf); 9867 ut_params->ibuf = NULL; 9868 } 9869 9870 crypto_op_free: 9871 rte_crypto_op_free(ut_params->op); 9872 ut_params->op = NULL; 9873 9874 rte_pktmbuf_free(ut_params->ibuf); 9875 ut_params->ibuf = NULL; 9876 9877 if (ut_params->sec_session) 9878 rte_security_session_destroy(ctx, ut_params->sec_session); 9879 ut_params->sec_session = NULL; 9880 9881 return ret; 9882 } 9883 9884 static int 9885 test_ipsec_proto_known_vec(const void *test_data) 9886 { 9887 struct ipsec_test_data td_outb; 9888 struct ipsec_test_flags flags; 9889 9890 memset(&flags, 0, sizeof(flags)); 9891 9892 memcpy(&td_outb, test_data, sizeof(td_outb)); 9893 9894 if (td_outb.aes_gmac || td_outb.aead || 9895 ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) && 9896 (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) { 9897 /* Disable IV gen to be able to test with known vectors */ 9898 td_outb.ipsec_xform.options.iv_gen_disable = 1; 9899 } 9900 9901 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags); 9902 } 9903 9904 static int 9905 test_ipsec_proto_known_vec_inb(const void *test_data) 9906 { 9907 const struct ipsec_test_data *td = test_data; 9908 struct ipsec_test_flags flags; 9909 struct ipsec_test_data td_inb; 9910 9911 memset(&flags, 0, sizeof(flags)); 9912 9913 if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) 9914 test_ipsec_td_in_from_out(td, &td_inb); 9915 else 9916 memcpy(&td_inb, td, sizeof(td_inb)); 9917 9918 return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags); 9919 } 9920 9921 static int 9922 test_ipsec_proto_known_vec_fragmented(const void *test_data) 9923 { 9924 struct ipsec_test_data td_outb; 9925 struct ipsec_test_flags flags; 9926 9927 memset(&flags, 0, sizeof(flags)); 9928 flags.fragment = true; 9929 9930 memcpy(&td_outb, test_data, sizeof(td_outb)); 9931 9932 /* Disable IV gen to be able to test with known vectors */ 9933 td_outb.ipsec_xform.options.iv_gen_disable = 1; 9934 9935 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags); 9936 } 9937 9938 static int 9939 test_ipsec_proto_all(const struct ipsec_test_flags *flags) 9940 { 9941 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX]; 9942 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX]; 9943 unsigned int i, nb_pkts = 1, pass_cnt = 0; 9944 int ret; 9945 9946 if (flags->iv_gen || 9947 flags->sa_expiry_pkts_soft || 9948 flags->sa_expiry_pkts_hard) 9949 nb_pkts = IPSEC_TEST_PACKETS_MAX; 9950 9951 for (i = 0; i < RTE_DIM(alg_list); i++) { 9952 test_ipsec_td_prepare(alg_list[i].param1, 9953 alg_list[i].param2, 9954 flags, 9955 td_outb, 9956 nb_pkts); 9957 9958 if (!td_outb->aead) { 9959 enum rte_crypto_cipher_algorithm cipher_alg; 9960 enum rte_crypto_auth_algorithm auth_alg; 9961 9962 cipher_alg = td_outb->xform.chain.cipher.cipher.algo; 9963 auth_alg = td_outb->xform.chain.auth.auth.algo; 9964 9965 if (td_outb->aes_gmac && cipher_alg != RTE_CRYPTO_CIPHER_NULL) 9966 continue; 9967 9968 /* ICV is not applicable for NULL auth */ 9969 if (flags->icv_corrupt && 9970 auth_alg == RTE_CRYPTO_AUTH_NULL) 9971 continue; 9972 9973 /* IV is not applicable for NULL cipher */ 9974 if (flags->iv_gen && 9975 cipher_alg == RTE_CRYPTO_CIPHER_NULL) 9976 continue; 9977 } 9978 9979 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true, 9980 flags); 9981 if (ret == TEST_SKIPPED) 9982 continue; 9983 9984 if (ret == TEST_FAILED) 9985 return TEST_FAILED; 9986 9987 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags); 9988 9989 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true, 9990 flags); 9991 if (ret == TEST_SKIPPED) 9992 continue; 9993 9994 if (ret == TEST_FAILED) 9995 return TEST_FAILED; 9996 9997 if (flags->display_alg) 9998 test_ipsec_display_alg(alg_list[i].param1, 9999 alg_list[i].param2); 10000 10001 pass_cnt++; 10002 } 10003 10004 if (pass_cnt > 0) 10005 return TEST_SUCCESS; 10006 else 10007 return TEST_SKIPPED; 10008 } 10009 10010 static int 10011 test_ipsec_ah_proto_all(const struct ipsec_test_flags *flags) 10012 { 10013 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX]; 10014 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX]; 10015 unsigned int i, nb_pkts = 1, pass_cnt = 0; 10016 int ret; 10017 10018 for (i = 0; i < RTE_DIM(ah_alg_list); i++) { 10019 test_ipsec_td_prepare(ah_alg_list[i].param1, 10020 ah_alg_list[i].param2, 10021 flags, 10022 td_outb, 10023 nb_pkts); 10024 10025 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true, 10026 flags); 10027 if (ret == TEST_SKIPPED) 10028 continue; 10029 10030 if (ret == TEST_FAILED) 10031 return TEST_FAILED; 10032 10033 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags); 10034 10035 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true, 10036 flags); 10037 if (ret == TEST_SKIPPED) 10038 continue; 10039 10040 if (ret == TEST_FAILED) 10041 return TEST_FAILED; 10042 10043 if (flags->display_alg) 10044 test_ipsec_display_alg(ah_alg_list[i].param1, 10045 ah_alg_list[i].param2); 10046 10047 pass_cnt++; 10048 } 10049 10050 if (pass_cnt > 0) 10051 return TEST_SUCCESS; 10052 else 10053 return TEST_SKIPPED; 10054 } 10055 10056 static int 10057 test_ipsec_proto_display_list(const void *data __rte_unused) 10058 { 10059 struct ipsec_test_flags flags; 10060 10061 memset(&flags, 0, sizeof(flags)); 10062 10063 flags.display_alg = true; 10064 10065 return test_ipsec_proto_all(&flags); 10066 } 10067 10068 static int 10069 test_ipsec_proto_ah_tunnel_ipv4(const void *data __rte_unused) 10070 { 10071 struct ipsec_test_flags flags; 10072 10073 memset(&flags, 0, sizeof(flags)); 10074 10075 flags.ah = true; 10076 flags.display_alg = true; 10077 10078 return test_ipsec_ah_proto_all(&flags); 10079 } 10080 10081 static int 10082 test_ipsec_proto_ah_transport_ipv4(const void *data __rte_unused) 10083 { 10084 struct ipsec_test_flags flags; 10085 10086 memset(&flags, 0, sizeof(flags)); 10087 10088 flags.ah = true; 10089 flags.transport = true; 10090 10091 return test_ipsec_ah_proto_all(&flags); 10092 } 10093 10094 static int 10095 test_ipsec_proto_iv_gen(const void *data __rte_unused) 10096 { 10097 struct ipsec_test_flags flags; 10098 10099 memset(&flags, 0, sizeof(flags)); 10100 10101 flags.iv_gen = true; 10102 10103 return test_ipsec_proto_all(&flags); 10104 } 10105 10106 static int 10107 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused) 10108 { 10109 struct ipsec_test_flags flags; 10110 10111 memset(&flags, 0, sizeof(flags)); 10112 10113 flags.sa_expiry_pkts_soft = true; 10114 10115 return test_ipsec_proto_all(&flags); 10116 } 10117 10118 static int 10119 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused) 10120 { 10121 struct ipsec_test_flags flags; 10122 10123 memset(&flags, 0, sizeof(flags)); 10124 10125 flags.sa_expiry_pkts_hard = true; 10126 10127 return test_ipsec_proto_all(&flags); 10128 } 10129 10130 static int 10131 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused) 10132 { 10133 struct ipsec_test_flags flags; 10134 10135 memset(&flags, 0, sizeof(flags)); 10136 10137 flags.icv_corrupt = true; 10138 10139 return test_ipsec_proto_all(&flags); 10140 } 10141 10142 static int 10143 test_ipsec_proto_udp_encap_custom_ports(const void *data __rte_unused) 10144 { 10145 struct ipsec_test_flags flags; 10146 10147 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10148 RTE_STR(CRYPTODEV_NAME_CN10K_PMD))) 10149 return TEST_SKIPPED; 10150 10151 memset(&flags, 0, sizeof(flags)); 10152 10153 flags.udp_encap = true; 10154 flags.udp_encap_custom_ports = true; 10155 10156 return test_ipsec_proto_all(&flags); 10157 } 10158 10159 static int 10160 test_ipsec_proto_udp_encap(const void *data __rte_unused) 10161 { 10162 struct ipsec_test_flags flags; 10163 10164 memset(&flags, 0, sizeof(flags)); 10165 10166 flags.udp_encap = true; 10167 10168 return test_ipsec_proto_all(&flags); 10169 } 10170 10171 static int 10172 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused) 10173 { 10174 struct ipsec_test_flags flags; 10175 10176 memset(&flags, 0, sizeof(flags)); 10177 10178 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR; 10179 10180 return test_ipsec_proto_all(&flags); 10181 } 10182 10183 static int 10184 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused) 10185 { 10186 struct ipsec_test_flags flags; 10187 10188 memset(&flags, 0, sizeof(flags)); 10189 10190 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR; 10191 10192 return test_ipsec_proto_all(&flags); 10193 } 10194 10195 static int 10196 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused) 10197 { 10198 struct ipsec_test_flags flags; 10199 10200 memset(&flags, 0, sizeof(flags)); 10201 10202 flags.udp_encap = true; 10203 flags.udp_ports_verify = true; 10204 10205 return test_ipsec_proto_all(&flags); 10206 } 10207 10208 static int 10209 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused) 10210 { 10211 struct ipsec_test_flags flags; 10212 10213 memset(&flags, 0, sizeof(flags)); 10214 10215 flags.ip_csum = true; 10216 10217 return test_ipsec_proto_all(&flags); 10218 } 10219 10220 static int 10221 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused) 10222 { 10223 struct ipsec_test_flags flags; 10224 10225 memset(&flags, 0, sizeof(flags)); 10226 10227 flags.l4_csum = true; 10228 10229 return test_ipsec_proto_all(&flags); 10230 } 10231 10232 static int 10233 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused) 10234 { 10235 struct ipsec_test_flags flags; 10236 10237 memset(&flags, 0, sizeof(flags)); 10238 10239 flags.ipv6 = false; 10240 flags.tunnel_ipv6 = false; 10241 10242 return test_ipsec_proto_all(&flags); 10243 } 10244 10245 static int 10246 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused) 10247 { 10248 struct ipsec_test_flags flags; 10249 10250 memset(&flags, 0, sizeof(flags)); 10251 10252 flags.ipv6 = true; 10253 flags.tunnel_ipv6 = true; 10254 10255 return test_ipsec_proto_all(&flags); 10256 } 10257 10258 static int 10259 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused) 10260 { 10261 struct ipsec_test_flags flags; 10262 10263 memset(&flags, 0, sizeof(flags)); 10264 10265 flags.ipv6 = false; 10266 flags.tunnel_ipv6 = true; 10267 10268 return test_ipsec_proto_all(&flags); 10269 } 10270 10271 static int 10272 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused) 10273 { 10274 struct ipsec_test_flags flags; 10275 10276 memset(&flags, 0, sizeof(flags)); 10277 10278 flags.ipv6 = true; 10279 flags.tunnel_ipv6 = false; 10280 10281 return test_ipsec_proto_all(&flags); 10282 } 10283 10284 static int 10285 test_ipsec_proto_transport_v4(const void *data __rte_unused) 10286 { 10287 struct ipsec_test_flags flags; 10288 10289 memset(&flags, 0, sizeof(flags)); 10290 10291 flags.ipv6 = false; 10292 flags.transport = true; 10293 10294 return test_ipsec_proto_all(&flags); 10295 } 10296 10297 static int 10298 test_ipsec_proto_transport_l4_csum(const void *data __rte_unused) 10299 { 10300 struct ipsec_test_flags flags = { 10301 .l4_csum = true, 10302 .transport = true, 10303 }; 10304 10305 return test_ipsec_proto_all(&flags); 10306 } 10307 10308 static int 10309 test_ipsec_proto_stats(const void *data __rte_unused) 10310 { 10311 struct ipsec_test_flags flags; 10312 10313 memset(&flags, 0, sizeof(flags)); 10314 10315 flags.stats_success = true; 10316 10317 return test_ipsec_proto_all(&flags); 10318 } 10319 10320 static int 10321 test_ipsec_proto_pkt_fragment(const void *data __rte_unused) 10322 { 10323 struct ipsec_test_flags flags; 10324 10325 memset(&flags, 0, sizeof(flags)); 10326 10327 flags.fragment = true; 10328 10329 return test_ipsec_proto_all(&flags); 10330 10331 } 10332 10333 static int 10334 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused) 10335 { 10336 struct ipsec_test_flags flags; 10337 10338 memset(&flags, 0, sizeof(flags)); 10339 10340 flags.df = TEST_IPSEC_COPY_DF_INNER_0; 10341 10342 return test_ipsec_proto_all(&flags); 10343 } 10344 10345 static int 10346 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused) 10347 { 10348 struct ipsec_test_flags flags; 10349 10350 memset(&flags, 0, sizeof(flags)); 10351 10352 flags.df = TEST_IPSEC_COPY_DF_INNER_1; 10353 10354 return test_ipsec_proto_all(&flags); 10355 } 10356 10357 static int 10358 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused) 10359 { 10360 struct ipsec_test_flags flags; 10361 10362 memset(&flags, 0, sizeof(flags)); 10363 10364 flags.df = TEST_IPSEC_SET_DF_0_INNER_1; 10365 10366 return test_ipsec_proto_all(&flags); 10367 } 10368 10369 static int 10370 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused) 10371 { 10372 struct ipsec_test_flags flags; 10373 10374 memset(&flags, 0, sizeof(flags)); 10375 10376 flags.df = TEST_IPSEC_SET_DF_1_INNER_0; 10377 10378 return test_ipsec_proto_all(&flags); 10379 } 10380 10381 static int 10382 test_ipsec_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused) 10383 { 10384 struct ipsec_test_flags flags; 10385 10386 memset(&flags, 0, sizeof(flags)); 10387 10388 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0; 10389 10390 return test_ipsec_proto_all(&flags); 10391 } 10392 10393 static int 10394 test_ipsec_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused) 10395 { 10396 struct ipsec_test_flags flags; 10397 10398 memset(&flags, 0, sizeof(flags)); 10399 10400 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1; 10401 10402 return test_ipsec_proto_all(&flags); 10403 } 10404 10405 static int 10406 test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused) 10407 { 10408 struct ipsec_test_flags flags; 10409 10410 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10411 RTE_STR(CRYPTODEV_NAME_CN9K_PMD))) 10412 return TEST_SKIPPED; 10413 10414 memset(&flags, 0, sizeof(flags)); 10415 10416 flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1; 10417 10418 return test_ipsec_proto_all(&flags); 10419 } 10420 10421 static int 10422 test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused) 10423 { 10424 struct ipsec_test_flags flags; 10425 10426 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10427 RTE_STR(CRYPTODEV_NAME_CN9K_PMD))) 10428 return TEST_SKIPPED; 10429 10430 memset(&flags, 0, sizeof(flags)); 10431 10432 flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0; 10433 10434 return test_ipsec_proto_all(&flags); 10435 } 10436 10437 static int 10438 test_ipsec_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused) 10439 { 10440 struct ipsec_test_flags flags; 10441 10442 memset(&flags, 0, sizeof(flags)); 10443 10444 flags.ipv6 = true; 10445 flags.tunnel_ipv6 = true; 10446 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0; 10447 10448 return test_ipsec_proto_all(&flags); 10449 } 10450 10451 static int 10452 test_ipsec_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused) 10453 { 10454 struct ipsec_test_flags flags; 10455 10456 memset(&flags, 0, sizeof(flags)); 10457 10458 flags.ipv6 = true; 10459 flags.tunnel_ipv6 = true; 10460 flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1; 10461 10462 return test_ipsec_proto_all(&flags); 10463 } 10464 10465 static int 10466 test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused) 10467 { 10468 struct ipsec_test_flags flags; 10469 10470 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10471 RTE_STR(CRYPTODEV_NAME_CN9K_PMD))) 10472 return TEST_SKIPPED; 10473 10474 memset(&flags, 0, sizeof(flags)); 10475 10476 flags.ipv6 = true; 10477 flags.tunnel_ipv6 = true; 10478 flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1; 10479 10480 return test_ipsec_proto_all(&flags); 10481 } 10482 10483 static int 10484 test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused) 10485 { 10486 struct ipsec_test_flags flags; 10487 10488 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10489 RTE_STR(CRYPTODEV_NAME_CN9K_PMD))) 10490 return TEST_SKIPPED; 10491 10492 memset(&flags, 0, sizeof(flags)); 10493 10494 flags.ipv6 = true; 10495 flags.tunnel_ipv6 = true; 10496 flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0; 10497 10498 return test_ipsec_proto_all(&flags); 10499 } 10500 10501 static int 10502 test_ipsec_proto_sgl(const void *data __rte_unused) 10503 { 10504 struct crypto_testsuite_params *ts_params = &testsuite_params; 10505 struct rte_cryptodev_info dev_info; 10506 10507 struct ipsec_test_flags flags = { 10508 .nb_segs_in_mbuf = 5 10509 }; 10510 10511 if (gbl_driver_id == rte_cryptodev_driver_id_get( 10512 RTE_STR(CRYPTODEV_NAME_CN10K_PMD))) 10513 return TEST_SKIPPED; 10514 10515 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10516 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 10517 printf("Device doesn't support in-place scatter-gather. " 10518 "Test Skipped.\n"); 10519 return TEST_SKIPPED; 10520 } 10521 10522 return test_ipsec_proto_all(&flags); 10523 } 10524 10525 static int 10526 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[], 10527 bool replayed_pkt[], uint32_t nb_pkts, bool esn_en, 10528 uint64_t winsz) 10529 { 10530 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX]; 10531 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX]; 10532 struct ipsec_test_flags flags; 10533 uint32_t i = 0, ret = 0; 10534 10535 if (nb_pkts == 0) 10536 return TEST_FAILED; 10537 10538 memset(&flags, 0, sizeof(flags)); 10539 flags.antireplay = true; 10540 10541 for (i = 0; i < nb_pkts; i++) { 10542 memcpy(&td_outb[i], test_data, sizeof(td_outb[i])); 10543 td_outb[i].ipsec_xform.options.iv_gen_disable = 1; 10544 td_outb[i].ipsec_xform.replay_win_sz = winsz; 10545 td_outb[i].ipsec_xform.options.esn = esn_en; 10546 } 10547 10548 for (i = 0; i < nb_pkts; i++) 10549 td_outb[i].ipsec_xform.esn.value = esn[i]; 10550 10551 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true, 10552 &flags); 10553 if (ret != TEST_SUCCESS) 10554 return ret; 10555 10556 test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags); 10557 10558 for (i = 0; i < nb_pkts; i++) { 10559 td_inb[i].ipsec_xform.options.esn = esn_en; 10560 /* Set antireplay flag for packets to be dropped */ 10561 td_inb[i].ar_packet = replayed_pkt[i]; 10562 } 10563 10564 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true, 10565 &flags); 10566 10567 return ret; 10568 } 10569 10570 static int 10571 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz) 10572 { 10573 10574 uint32_t nb_pkts = 5; 10575 bool replayed_pkt[5]; 10576 uint64_t esn[5]; 10577 10578 /* 1. Advance the TOP of the window to WS * 2 */ 10579 esn[0] = winsz * 2; 10580 /* 2. Test sequence number within the new window(WS + 1) */ 10581 esn[1] = winsz + 1; 10582 /* 3. Test sequence number less than the window BOTTOM */ 10583 esn[2] = winsz; 10584 /* 4. Test sequence number in the middle of the window */ 10585 esn[3] = winsz + (winsz / 2); 10586 /* 5. Test replay of the packet in the middle of the window */ 10587 esn[4] = winsz + (winsz / 2); 10588 10589 replayed_pkt[0] = false; 10590 replayed_pkt[1] = false; 10591 replayed_pkt[2] = true; 10592 replayed_pkt[3] = false; 10593 replayed_pkt[4] = true; 10594 10595 return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts, 10596 false, winsz); 10597 } 10598 10599 static int 10600 test_ipsec_proto_pkt_antireplay1024(const void *test_data) 10601 { 10602 return test_ipsec_proto_pkt_antireplay(test_data, 1024); 10603 } 10604 10605 static int 10606 test_ipsec_proto_pkt_antireplay2048(const void *test_data) 10607 { 10608 return test_ipsec_proto_pkt_antireplay(test_data, 2048); 10609 } 10610 10611 static int 10612 test_ipsec_proto_pkt_antireplay4096(const void *test_data) 10613 { 10614 return test_ipsec_proto_pkt_antireplay(test_data, 4096); 10615 } 10616 10617 static int 10618 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz) 10619 { 10620 10621 uint32_t nb_pkts = 7; 10622 bool replayed_pkt[7]; 10623 uint64_t esn[7]; 10624 10625 /* Set the initial sequence number */ 10626 esn[0] = (uint64_t)(0xFFFFFFFF - winsz); 10627 /* 1. Advance the TOP of the window to (1<<32 + WS/2) */ 10628 esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2)); 10629 /* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */ 10630 esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1); 10631 /* 3. Test with sequence number within window (1<<32 - 1) */ 10632 esn[3] = (uint64_t)((1ULL << 32) - 1); 10633 /* 4. Test with sequence number within window (1<<32 - 1) */ 10634 esn[4] = (uint64_t)(1ULL << 32); 10635 /* 5. Test with duplicate sequence number within 10636 * new window (1<<32 - 1) 10637 */ 10638 esn[5] = (uint64_t)((1ULL << 32) - 1); 10639 /* 6. Test with duplicate sequence number within new window (1<<32) */ 10640 esn[6] = (uint64_t)(1ULL << 32); 10641 10642 replayed_pkt[0] = false; 10643 replayed_pkt[1] = false; 10644 replayed_pkt[2] = false; 10645 replayed_pkt[3] = false; 10646 replayed_pkt[4] = false; 10647 replayed_pkt[5] = true; 10648 replayed_pkt[6] = true; 10649 10650 return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts, 10651 true, winsz); 10652 } 10653 10654 static int 10655 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data) 10656 { 10657 return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024); 10658 } 10659 10660 static int 10661 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data) 10662 { 10663 return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048); 10664 } 10665 10666 static int 10667 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data) 10668 { 10669 return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096); 10670 } 10671 10672 static int 10673 test_PDCP_PROTO_all(void) 10674 { 10675 struct crypto_testsuite_params *ts_params = &testsuite_params; 10676 struct crypto_unittest_params *ut_params = &unittest_params; 10677 struct rte_cryptodev_info dev_info; 10678 int status; 10679 10680 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10681 uint64_t feat_flags = dev_info.feature_flags; 10682 10683 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 10684 return TEST_SKIPPED; 10685 10686 /* Set action type */ 10687 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 10688 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 10689 gbl_action_type; 10690 10691 if (security_proto_supported(ut_params->type, 10692 RTE_SECURITY_PROTOCOL_PDCP) < 0) 10693 return TEST_SKIPPED; 10694 10695 status = test_PDCP_PROTO_cplane_encap_all(); 10696 status += test_PDCP_PROTO_cplane_decap_all(); 10697 status += test_PDCP_PROTO_uplane_encap_all(); 10698 status += test_PDCP_PROTO_uplane_decap_all(); 10699 status += test_PDCP_PROTO_SGL_in_place_32B(); 10700 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 10701 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 10702 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 10703 status += test_PDCP_SDAP_PROTO_encap_all(); 10704 status += test_PDCP_SDAP_PROTO_decap_all(); 10705 status += test_PDCP_PROTO_short_mac(); 10706 10707 if (status) 10708 return TEST_FAILED; 10709 else 10710 return TEST_SUCCESS; 10711 } 10712 10713 static int 10714 test_ipsec_proto_ipv4_ttl_decrement(const void *data __rte_unused) 10715 { 10716 struct ipsec_test_flags flags = { 10717 .dec_ttl_or_hop_limit = true 10718 }; 10719 10720 return test_ipsec_proto_all(&flags); 10721 } 10722 10723 static int 10724 test_ipsec_proto_ipv6_hop_limit_decrement(const void *data __rte_unused) 10725 { 10726 struct ipsec_test_flags flags = { 10727 .ipv6 = true, 10728 .dec_ttl_or_hop_limit = true 10729 }; 10730 10731 return test_ipsec_proto_all(&flags); 10732 } 10733 10734 static int 10735 test_docsis_proto_uplink(const void *data) 10736 { 10737 const struct docsis_test_data *d_td = data; 10738 struct crypto_testsuite_params *ts_params = &testsuite_params; 10739 struct crypto_unittest_params *ut_params = &unittest_params; 10740 uint8_t *plaintext = NULL; 10741 uint8_t *ciphertext = NULL; 10742 uint8_t *iv_ptr; 10743 int32_t cipher_len, crc_len; 10744 uint32_t crc_data_len; 10745 int ret = TEST_SUCCESS; 10746 10747 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 10748 rte_cryptodev_get_sec_ctx( 10749 ts_params->valid_devs[0]); 10750 10751 /* Verify the capabilities */ 10752 struct rte_security_capability_idx sec_cap_idx; 10753 const struct rte_security_capability *sec_cap; 10754 const struct rte_cryptodev_capabilities *crypto_cap; 10755 const struct rte_cryptodev_symmetric_capability *sym_cap; 10756 int j = 0; 10757 10758 /* Set action type */ 10759 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 10760 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 10761 gbl_action_type; 10762 10763 if (security_proto_supported(ut_params->type, 10764 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 10765 return TEST_SKIPPED; 10766 10767 sec_cap_idx.action = ut_params->type; 10768 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 10769 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 10770 10771 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 10772 if (sec_cap == NULL) 10773 return TEST_SKIPPED; 10774 10775 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 10776 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 10777 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 10778 crypto_cap->sym.xform_type == 10779 RTE_CRYPTO_SYM_XFORM_CIPHER && 10780 crypto_cap->sym.cipher.algo == 10781 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 10782 sym_cap = &crypto_cap->sym; 10783 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 10784 d_td->key.len, 10785 d_td->iv.len) == 0) 10786 break; 10787 } 10788 } 10789 10790 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 10791 return TEST_SKIPPED; 10792 10793 /* Setup source mbuf payload */ 10794 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10795 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10796 rte_pktmbuf_tailroom(ut_params->ibuf)); 10797 10798 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10799 d_td->ciphertext.len); 10800 10801 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 10802 10803 /* Setup cipher session parameters */ 10804 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10805 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 10806 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 10807 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 10808 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 10809 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 10810 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10811 ut_params->cipher_xform.next = NULL; 10812 10813 /* Setup DOCSIS session parameters */ 10814 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 10815 10816 struct rte_security_session_conf sess_conf = { 10817 .action_type = ut_params->type, 10818 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 10819 .docsis = ut_params->docsis_xform, 10820 .crypto_xform = &ut_params->cipher_xform, 10821 }; 10822 10823 /* Create security session */ 10824 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 10825 ts_params->session_mpool); 10826 10827 if (!ut_params->sec_session) { 10828 printf("Test function %s line %u: failed to allocate session\n", 10829 __func__, __LINE__); 10830 ret = TEST_FAILED; 10831 goto on_err; 10832 } 10833 10834 /* Generate crypto op data structure */ 10835 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10836 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10837 if (!ut_params->op) { 10838 printf("Test function %s line %u: failed to allocate symmetric " 10839 "crypto operation\n", __func__, __LINE__); 10840 ret = TEST_FAILED; 10841 goto on_err; 10842 } 10843 10844 /* Setup CRC operation parameters */ 10845 crc_len = d_td->ciphertext.no_crc == false ? 10846 (d_td->ciphertext.len - 10847 d_td->ciphertext.crc_offset - 10848 RTE_ETHER_CRC_LEN) : 10849 0; 10850 crc_len = crc_len > 0 ? crc_len : 0; 10851 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 10852 ut_params->op->sym->auth.data.length = crc_len; 10853 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 10854 10855 /* Setup cipher operation parameters */ 10856 cipher_len = d_td->ciphertext.no_cipher == false ? 10857 (d_td->ciphertext.len - 10858 d_td->ciphertext.cipher_offset) : 10859 0; 10860 cipher_len = cipher_len > 0 ? cipher_len : 0; 10861 ut_params->op->sym->cipher.data.length = cipher_len; 10862 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 10863 10864 /* Setup cipher IV */ 10865 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 10866 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 10867 10868 /* Attach session to operation */ 10869 rte_security_attach_session(ut_params->op, ut_params->sec_session); 10870 10871 /* Set crypto operation mbufs */ 10872 ut_params->op->sym->m_src = ut_params->ibuf; 10873 ut_params->op->sym->m_dst = NULL; 10874 10875 /* Process crypto operation */ 10876 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 10877 NULL) { 10878 printf("Test function %s line %u: failed to process security " 10879 "crypto op\n", __func__, __LINE__); 10880 ret = TEST_FAILED; 10881 goto on_err; 10882 } 10883 10884 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 10885 printf("Test function %s line %u: failed to process crypto op\n", 10886 __func__, __LINE__); 10887 ret = TEST_FAILED; 10888 goto on_err; 10889 } 10890 10891 /* Validate plaintext */ 10892 plaintext = ciphertext; 10893 10894 if (memcmp(plaintext, d_td->plaintext.data, 10895 d_td->plaintext.len - crc_data_len)) { 10896 printf("Test function %s line %u: plaintext not as expected\n", 10897 __func__, __LINE__); 10898 rte_hexdump(stdout, "expected", d_td->plaintext.data, 10899 d_td->plaintext.len); 10900 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 10901 ret = TEST_FAILED; 10902 goto on_err; 10903 } 10904 10905 on_err: 10906 rte_crypto_op_free(ut_params->op); 10907 ut_params->op = NULL; 10908 10909 if (ut_params->sec_session) 10910 rte_security_session_destroy(ctx, ut_params->sec_session); 10911 ut_params->sec_session = NULL; 10912 10913 rte_pktmbuf_free(ut_params->ibuf); 10914 ut_params->ibuf = NULL; 10915 10916 return ret; 10917 } 10918 10919 static int 10920 test_docsis_proto_downlink(const void *data) 10921 { 10922 const struct docsis_test_data *d_td = data; 10923 struct crypto_testsuite_params *ts_params = &testsuite_params; 10924 struct crypto_unittest_params *ut_params = &unittest_params; 10925 uint8_t *plaintext = NULL; 10926 uint8_t *ciphertext = NULL; 10927 uint8_t *iv_ptr; 10928 int32_t cipher_len, crc_len; 10929 int ret = TEST_SUCCESS; 10930 10931 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 10932 rte_cryptodev_get_sec_ctx( 10933 ts_params->valid_devs[0]); 10934 10935 /* Verify the capabilities */ 10936 struct rte_security_capability_idx sec_cap_idx; 10937 const struct rte_security_capability *sec_cap; 10938 const struct rte_cryptodev_capabilities *crypto_cap; 10939 const struct rte_cryptodev_symmetric_capability *sym_cap; 10940 int j = 0; 10941 10942 /* Set action type */ 10943 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 10944 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 10945 gbl_action_type; 10946 10947 if (security_proto_supported(ut_params->type, 10948 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 10949 return TEST_SKIPPED; 10950 10951 sec_cap_idx.action = ut_params->type; 10952 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 10953 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 10954 10955 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 10956 if (sec_cap == NULL) 10957 return TEST_SKIPPED; 10958 10959 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 10960 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 10961 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 10962 crypto_cap->sym.xform_type == 10963 RTE_CRYPTO_SYM_XFORM_CIPHER && 10964 crypto_cap->sym.cipher.algo == 10965 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 10966 sym_cap = &crypto_cap->sym; 10967 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 10968 d_td->key.len, 10969 d_td->iv.len) == 0) 10970 break; 10971 } 10972 } 10973 10974 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 10975 return TEST_SKIPPED; 10976 10977 /* Setup source mbuf payload */ 10978 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10979 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10980 rte_pktmbuf_tailroom(ut_params->ibuf)); 10981 10982 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10983 d_td->plaintext.len); 10984 10985 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 10986 10987 /* Setup cipher session parameters */ 10988 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10989 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 10990 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10991 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 10992 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 10993 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 10994 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10995 ut_params->cipher_xform.next = NULL; 10996 10997 /* Setup DOCSIS session parameters */ 10998 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 10999 11000 struct rte_security_session_conf sess_conf = { 11001 .action_type = ut_params->type, 11002 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 11003 .docsis = ut_params->docsis_xform, 11004 .crypto_xform = &ut_params->cipher_xform, 11005 }; 11006 11007 /* Create security session */ 11008 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 11009 ts_params->session_mpool); 11010 11011 if (!ut_params->sec_session) { 11012 printf("Test function %s line %u: failed to allocate session\n", 11013 __func__, __LINE__); 11014 ret = TEST_FAILED; 11015 goto on_err; 11016 } 11017 11018 /* Generate crypto op data structure */ 11019 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11020 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11021 if (!ut_params->op) { 11022 printf("Test function %s line %u: failed to allocate symmetric " 11023 "crypto operation\n", __func__, __LINE__); 11024 ret = TEST_FAILED; 11025 goto on_err; 11026 } 11027 11028 /* Setup CRC operation parameters */ 11029 crc_len = d_td->plaintext.no_crc == false ? 11030 (d_td->plaintext.len - 11031 d_td->plaintext.crc_offset - 11032 RTE_ETHER_CRC_LEN) : 11033 0; 11034 crc_len = crc_len > 0 ? crc_len : 0; 11035 ut_params->op->sym->auth.data.length = crc_len; 11036 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 11037 11038 /* Setup cipher operation parameters */ 11039 cipher_len = d_td->plaintext.no_cipher == false ? 11040 (d_td->plaintext.len - 11041 d_td->plaintext.cipher_offset) : 11042 0; 11043 cipher_len = cipher_len > 0 ? cipher_len : 0; 11044 ut_params->op->sym->cipher.data.length = cipher_len; 11045 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 11046 11047 /* Setup cipher IV */ 11048 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 11049 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 11050 11051 /* Attach session to operation */ 11052 rte_security_attach_session(ut_params->op, ut_params->sec_session); 11053 11054 /* Set crypto operation mbufs */ 11055 ut_params->op->sym->m_src = ut_params->ibuf; 11056 ut_params->op->sym->m_dst = NULL; 11057 11058 /* Process crypto operation */ 11059 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 11060 NULL) { 11061 printf("Test function %s line %u: failed to process crypto op\n", 11062 __func__, __LINE__); 11063 ret = TEST_FAILED; 11064 goto on_err; 11065 } 11066 11067 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 11068 printf("Test function %s line %u: crypto op processing failed\n", 11069 __func__, __LINE__); 11070 ret = TEST_FAILED; 11071 goto on_err; 11072 } 11073 11074 /* Validate ciphertext */ 11075 ciphertext = plaintext; 11076 11077 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 11078 printf("Test function %s line %u: plaintext not as expected\n", 11079 __func__, __LINE__); 11080 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 11081 d_td->ciphertext.len); 11082 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 11083 ret = TEST_FAILED; 11084 goto on_err; 11085 } 11086 11087 on_err: 11088 rte_crypto_op_free(ut_params->op); 11089 ut_params->op = NULL; 11090 11091 if (ut_params->sec_session) 11092 rte_security_session_destroy(ctx, ut_params->sec_session); 11093 ut_params->sec_session = NULL; 11094 11095 rte_pktmbuf_free(ut_params->ibuf); 11096 ut_params->ibuf = NULL; 11097 11098 return ret; 11099 } 11100 #endif 11101 11102 static int 11103 test_AES_GCM_authenticated_encryption_test_case_1(void) 11104 { 11105 return test_authenticated_encryption(&gcm_test_case_1); 11106 } 11107 11108 static int 11109 test_AES_GCM_authenticated_encryption_test_case_2(void) 11110 { 11111 return test_authenticated_encryption(&gcm_test_case_2); 11112 } 11113 11114 static int 11115 test_AES_GCM_authenticated_encryption_test_case_3(void) 11116 { 11117 return test_authenticated_encryption(&gcm_test_case_3); 11118 } 11119 11120 static int 11121 test_AES_GCM_authenticated_encryption_test_case_4(void) 11122 { 11123 return test_authenticated_encryption(&gcm_test_case_4); 11124 } 11125 11126 static int 11127 test_AES_GCM_authenticated_encryption_test_case_5(void) 11128 { 11129 return test_authenticated_encryption(&gcm_test_case_5); 11130 } 11131 11132 static int 11133 test_AES_GCM_authenticated_encryption_test_case_6(void) 11134 { 11135 return test_authenticated_encryption(&gcm_test_case_6); 11136 } 11137 11138 static int 11139 test_AES_GCM_authenticated_encryption_test_case_7(void) 11140 { 11141 return test_authenticated_encryption(&gcm_test_case_7); 11142 } 11143 11144 static int 11145 test_AES_GCM_authenticated_encryption_test_case_8(void) 11146 { 11147 return test_authenticated_encryption(&gcm_test_case_8); 11148 } 11149 11150 static int 11151 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 11152 { 11153 return test_authenticated_encryption(&gcm_J0_test_case_1); 11154 } 11155 11156 static int 11157 test_AES_GCM_auth_encryption_test_case_192_1(void) 11158 { 11159 return test_authenticated_encryption(&gcm_test_case_192_1); 11160 } 11161 11162 static int 11163 test_AES_GCM_auth_encryption_test_case_192_2(void) 11164 { 11165 return test_authenticated_encryption(&gcm_test_case_192_2); 11166 } 11167 11168 static int 11169 test_AES_GCM_auth_encryption_test_case_192_3(void) 11170 { 11171 return test_authenticated_encryption(&gcm_test_case_192_3); 11172 } 11173 11174 static int 11175 test_AES_GCM_auth_encryption_test_case_192_4(void) 11176 { 11177 return test_authenticated_encryption(&gcm_test_case_192_4); 11178 } 11179 11180 static int 11181 test_AES_GCM_auth_encryption_test_case_192_5(void) 11182 { 11183 return test_authenticated_encryption(&gcm_test_case_192_5); 11184 } 11185 11186 static int 11187 test_AES_GCM_auth_encryption_test_case_192_6(void) 11188 { 11189 return test_authenticated_encryption(&gcm_test_case_192_6); 11190 } 11191 11192 static int 11193 test_AES_GCM_auth_encryption_test_case_192_7(void) 11194 { 11195 return test_authenticated_encryption(&gcm_test_case_192_7); 11196 } 11197 11198 static int 11199 test_AES_GCM_auth_encryption_test_case_256_1(void) 11200 { 11201 return test_authenticated_encryption(&gcm_test_case_256_1); 11202 } 11203 11204 static int 11205 test_AES_GCM_auth_encryption_test_case_256_2(void) 11206 { 11207 return test_authenticated_encryption(&gcm_test_case_256_2); 11208 } 11209 11210 static int 11211 test_AES_GCM_auth_encryption_test_case_256_3(void) 11212 { 11213 return test_authenticated_encryption(&gcm_test_case_256_3); 11214 } 11215 11216 static int 11217 test_AES_GCM_auth_encryption_test_case_256_4(void) 11218 { 11219 return test_authenticated_encryption(&gcm_test_case_256_4); 11220 } 11221 11222 static int 11223 test_AES_GCM_auth_encryption_test_case_256_5(void) 11224 { 11225 return test_authenticated_encryption(&gcm_test_case_256_5); 11226 } 11227 11228 static int 11229 test_AES_GCM_auth_encryption_test_case_256_6(void) 11230 { 11231 return test_authenticated_encryption(&gcm_test_case_256_6); 11232 } 11233 11234 static int 11235 test_AES_GCM_auth_encryption_test_case_256_7(void) 11236 { 11237 return test_authenticated_encryption(&gcm_test_case_256_7); 11238 } 11239 11240 static int 11241 test_AES_GCM_auth_encryption_test_case_aad_1(void) 11242 { 11243 return test_authenticated_encryption(&gcm_test_case_aad_1); 11244 } 11245 11246 static int 11247 test_AES_GCM_auth_encryption_test_case_aad_2(void) 11248 { 11249 return test_authenticated_encryption(&gcm_test_case_aad_2); 11250 } 11251 11252 static int 11253 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 11254 { 11255 struct aead_test_data tdata; 11256 int res; 11257 11258 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11259 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11260 tdata.iv.data[0] += 1; 11261 res = test_authenticated_encryption(&tdata); 11262 if (res == TEST_SKIPPED) 11263 return res; 11264 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11265 return TEST_SUCCESS; 11266 } 11267 11268 static int 11269 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 11270 { 11271 struct aead_test_data tdata; 11272 int res; 11273 11274 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11275 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11276 tdata.plaintext.data[0] += 1; 11277 res = test_authenticated_encryption(&tdata); 11278 if (res == TEST_SKIPPED) 11279 return res; 11280 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11281 return TEST_SUCCESS; 11282 } 11283 11284 static int 11285 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 11286 { 11287 struct aead_test_data tdata; 11288 int res; 11289 11290 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11291 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11292 tdata.ciphertext.data[0] += 1; 11293 res = test_authenticated_encryption(&tdata); 11294 if (res == TEST_SKIPPED) 11295 return res; 11296 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11297 return TEST_SUCCESS; 11298 } 11299 11300 static int 11301 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 11302 { 11303 struct aead_test_data tdata; 11304 int res; 11305 11306 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11307 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11308 tdata.aad.len += 1; 11309 res = test_authenticated_encryption(&tdata); 11310 if (res == TEST_SKIPPED) 11311 return res; 11312 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11313 return TEST_SUCCESS; 11314 } 11315 11316 static int 11317 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 11318 { 11319 struct aead_test_data tdata; 11320 uint8_t aad[gcm_test_case_7.aad.len]; 11321 int res; 11322 11323 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11324 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11325 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 11326 aad[0] += 1; 11327 tdata.aad.data = aad; 11328 res = test_authenticated_encryption(&tdata); 11329 if (res == TEST_SKIPPED) 11330 return res; 11331 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11332 return TEST_SUCCESS; 11333 } 11334 11335 static int 11336 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 11337 { 11338 struct aead_test_data tdata; 11339 int res; 11340 11341 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11342 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11343 tdata.auth_tag.data[0] += 1; 11344 res = test_authenticated_encryption(&tdata); 11345 if (res == TEST_SKIPPED) 11346 return res; 11347 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 11348 return TEST_SUCCESS; 11349 } 11350 11351 static int 11352 test_authenticated_decryption(const struct aead_test_data *tdata) 11353 { 11354 struct crypto_testsuite_params *ts_params = &testsuite_params; 11355 struct crypto_unittest_params *ut_params = &unittest_params; 11356 11357 int retval; 11358 uint8_t *plaintext; 11359 uint32_t i; 11360 struct rte_cryptodev_info dev_info; 11361 11362 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11363 uint64_t feat_flags = dev_info.feature_flags; 11364 11365 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11366 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11367 printf("Device doesn't support RAW data-path APIs.\n"); 11368 return TEST_SKIPPED; 11369 } 11370 11371 /* Verify the capabilities */ 11372 struct rte_cryptodev_sym_capability_idx cap_idx; 11373 const struct rte_cryptodev_symmetric_capability *capability; 11374 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11375 cap_idx.algo.aead = tdata->algo; 11376 capability = rte_cryptodev_sym_capability_get( 11377 ts_params->valid_devs[0], &cap_idx); 11378 if (capability == NULL) 11379 return TEST_SKIPPED; 11380 if (rte_cryptodev_sym_capability_check_aead( 11381 capability, tdata->key.len, tdata->auth_tag.len, 11382 tdata->aad.len, tdata->iv.len)) 11383 return TEST_SKIPPED; 11384 11385 /* Create AEAD session */ 11386 retval = create_aead_session(ts_params->valid_devs[0], 11387 tdata->algo, 11388 RTE_CRYPTO_AEAD_OP_DECRYPT, 11389 tdata->key.data, tdata->key.len, 11390 tdata->aad.len, tdata->auth_tag.len, 11391 tdata->iv.len); 11392 if (retval < 0) 11393 return retval; 11394 11395 /* alloc mbuf and set payload */ 11396 if (tdata->aad.len > MBUF_SIZE) { 11397 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11398 /* Populate full size of add data */ 11399 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 11400 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 11401 } else 11402 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11403 11404 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11405 rte_pktmbuf_tailroom(ut_params->ibuf)); 11406 11407 /* Create AEAD operation */ 11408 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 11409 if (retval < 0) 11410 return retval; 11411 11412 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11413 11414 ut_params->op->sym->m_src = ut_params->ibuf; 11415 11416 /* Process crypto operation */ 11417 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11418 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 11419 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11420 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11421 ut_params->op, 0, 0, 0, 0); 11422 else 11423 TEST_ASSERT_NOT_NULL( 11424 process_crypto_request(ts_params->valid_devs[0], 11425 ut_params->op), "failed to process sym crypto op"); 11426 11427 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11428 "crypto op processing failed"); 11429 11430 if (ut_params->op->sym->m_dst) 11431 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 11432 uint8_t *); 11433 else 11434 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 11435 uint8_t *, 11436 ut_params->op->sym->cipher.data.offset); 11437 11438 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 11439 11440 /* Validate obuf */ 11441 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11442 plaintext, 11443 tdata->plaintext.data, 11444 tdata->plaintext.len, 11445 "Plaintext data not as expected"); 11446 11447 TEST_ASSERT_EQUAL(ut_params->op->status, 11448 RTE_CRYPTO_OP_STATUS_SUCCESS, 11449 "Authentication failed"); 11450 11451 return 0; 11452 } 11453 11454 static int 11455 test_AES_GCM_authenticated_decryption_test_case_1(void) 11456 { 11457 return test_authenticated_decryption(&gcm_test_case_1); 11458 } 11459 11460 static int 11461 test_AES_GCM_authenticated_decryption_test_case_2(void) 11462 { 11463 return test_authenticated_decryption(&gcm_test_case_2); 11464 } 11465 11466 static int 11467 test_AES_GCM_authenticated_decryption_test_case_3(void) 11468 { 11469 return test_authenticated_decryption(&gcm_test_case_3); 11470 } 11471 11472 static int 11473 test_AES_GCM_authenticated_decryption_test_case_4(void) 11474 { 11475 return test_authenticated_decryption(&gcm_test_case_4); 11476 } 11477 11478 static int 11479 test_AES_GCM_authenticated_decryption_test_case_5(void) 11480 { 11481 return test_authenticated_decryption(&gcm_test_case_5); 11482 } 11483 11484 static int 11485 test_AES_GCM_authenticated_decryption_test_case_6(void) 11486 { 11487 return test_authenticated_decryption(&gcm_test_case_6); 11488 } 11489 11490 static int 11491 test_AES_GCM_authenticated_decryption_test_case_7(void) 11492 { 11493 return test_authenticated_decryption(&gcm_test_case_7); 11494 } 11495 11496 static int 11497 test_AES_GCM_authenticated_decryption_test_case_8(void) 11498 { 11499 return test_authenticated_decryption(&gcm_test_case_8); 11500 } 11501 11502 static int 11503 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 11504 { 11505 return test_authenticated_decryption(&gcm_J0_test_case_1); 11506 } 11507 11508 static int 11509 test_AES_GCM_auth_decryption_test_case_192_1(void) 11510 { 11511 return test_authenticated_decryption(&gcm_test_case_192_1); 11512 } 11513 11514 static int 11515 test_AES_GCM_auth_decryption_test_case_192_2(void) 11516 { 11517 return test_authenticated_decryption(&gcm_test_case_192_2); 11518 } 11519 11520 static int 11521 test_AES_GCM_auth_decryption_test_case_192_3(void) 11522 { 11523 return test_authenticated_decryption(&gcm_test_case_192_3); 11524 } 11525 11526 static int 11527 test_AES_GCM_auth_decryption_test_case_192_4(void) 11528 { 11529 return test_authenticated_decryption(&gcm_test_case_192_4); 11530 } 11531 11532 static int 11533 test_AES_GCM_auth_decryption_test_case_192_5(void) 11534 { 11535 return test_authenticated_decryption(&gcm_test_case_192_5); 11536 } 11537 11538 static int 11539 test_AES_GCM_auth_decryption_test_case_192_6(void) 11540 { 11541 return test_authenticated_decryption(&gcm_test_case_192_6); 11542 } 11543 11544 static int 11545 test_AES_GCM_auth_decryption_test_case_192_7(void) 11546 { 11547 return test_authenticated_decryption(&gcm_test_case_192_7); 11548 } 11549 11550 static int 11551 test_AES_GCM_auth_decryption_test_case_256_1(void) 11552 { 11553 return test_authenticated_decryption(&gcm_test_case_256_1); 11554 } 11555 11556 static int 11557 test_AES_GCM_auth_decryption_test_case_256_2(void) 11558 { 11559 return test_authenticated_decryption(&gcm_test_case_256_2); 11560 } 11561 11562 static int 11563 test_AES_GCM_auth_decryption_test_case_256_3(void) 11564 { 11565 return test_authenticated_decryption(&gcm_test_case_256_3); 11566 } 11567 11568 static int 11569 test_AES_GCM_auth_decryption_test_case_256_4(void) 11570 { 11571 return test_authenticated_decryption(&gcm_test_case_256_4); 11572 } 11573 11574 static int 11575 test_AES_GCM_auth_decryption_test_case_256_5(void) 11576 { 11577 return test_authenticated_decryption(&gcm_test_case_256_5); 11578 } 11579 11580 static int 11581 test_AES_GCM_auth_decryption_test_case_256_6(void) 11582 { 11583 return test_authenticated_decryption(&gcm_test_case_256_6); 11584 } 11585 11586 static int 11587 test_AES_GCM_auth_decryption_test_case_256_7(void) 11588 { 11589 return test_authenticated_decryption(&gcm_test_case_256_7); 11590 } 11591 11592 static int 11593 test_AES_GCM_auth_decryption_test_case_aad_1(void) 11594 { 11595 return test_authenticated_decryption(&gcm_test_case_aad_1); 11596 } 11597 11598 static int 11599 test_AES_GCM_auth_decryption_test_case_aad_2(void) 11600 { 11601 return test_authenticated_decryption(&gcm_test_case_aad_2); 11602 } 11603 11604 static int 11605 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 11606 { 11607 struct aead_test_data tdata; 11608 int res; 11609 11610 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11611 tdata.iv.data[0] += 1; 11612 res = test_authenticated_decryption(&tdata); 11613 if (res == TEST_SKIPPED) 11614 return res; 11615 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 11616 return TEST_SUCCESS; 11617 } 11618 11619 static int 11620 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 11621 { 11622 struct aead_test_data tdata; 11623 int res; 11624 11625 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 11626 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11627 tdata.plaintext.data[0] += 1; 11628 res = test_authenticated_decryption(&tdata); 11629 if (res == TEST_SKIPPED) 11630 return res; 11631 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 11632 return TEST_SUCCESS; 11633 } 11634 11635 static int 11636 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 11637 { 11638 struct aead_test_data tdata; 11639 int res; 11640 11641 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11642 tdata.ciphertext.data[0] += 1; 11643 res = test_authenticated_decryption(&tdata); 11644 if (res == TEST_SKIPPED) 11645 return res; 11646 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 11647 return TEST_SUCCESS; 11648 } 11649 11650 static int 11651 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 11652 { 11653 struct aead_test_data tdata; 11654 int res; 11655 11656 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11657 tdata.aad.len += 1; 11658 res = test_authenticated_decryption(&tdata); 11659 if (res == TEST_SKIPPED) 11660 return res; 11661 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 11662 return TEST_SUCCESS; 11663 } 11664 11665 static int 11666 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 11667 { 11668 struct aead_test_data tdata; 11669 uint8_t aad[gcm_test_case_7.aad.len]; 11670 int res; 11671 11672 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11673 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 11674 aad[0] += 1; 11675 tdata.aad.data = aad; 11676 res = test_authenticated_decryption(&tdata); 11677 if (res == TEST_SKIPPED) 11678 return res; 11679 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 11680 return TEST_SUCCESS; 11681 } 11682 11683 static int 11684 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 11685 { 11686 struct aead_test_data tdata; 11687 int res; 11688 11689 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 11690 tdata.auth_tag.data[0] += 1; 11691 res = test_authenticated_decryption(&tdata); 11692 if (res == TEST_SKIPPED) 11693 return res; 11694 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 11695 return TEST_SUCCESS; 11696 } 11697 11698 static int 11699 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 11700 { 11701 struct crypto_testsuite_params *ts_params = &testsuite_params; 11702 struct crypto_unittest_params *ut_params = &unittest_params; 11703 11704 int retval; 11705 uint8_t *ciphertext, *auth_tag; 11706 uint16_t plaintext_pad_len; 11707 struct rte_cryptodev_info dev_info; 11708 11709 /* Verify the capabilities */ 11710 struct rte_cryptodev_sym_capability_idx cap_idx; 11711 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11712 cap_idx.algo.aead = tdata->algo; 11713 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11714 &cap_idx) == NULL) 11715 return TEST_SKIPPED; 11716 11717 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11718 uint64_t feat_flags = dev_info.feature_flags; 11719 11720 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11721 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) 11722 return TEST_SKIPPED; 11723 11724 /* not supported with CPU crypto */ 11725 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11726 return TEST_SKIPPED; 11727 11728 /* Create AEAD session */ 11729 retval = create_aead_session(ts_params->valid_devs[0], 11730 tdata->algo, 11731 RTE_CRYPTO_AEAD_OP_ENCRYPT, 11732 tdata->key.data, tdata->key.len, 11733 tdata->aad.len, tdata->auth_tag.len, 11734 tdata->iv.len); 11735 if (retval < 0) 11736 return retval; 11737 11738 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11739 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11740 11741 /* clear mbuf payload */ 11742 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11743 rte_pktmbuf_tailroom(ut_params->ibuf)); 11744 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 11745 rte_pktmbuf_tailroom(ut_params->obuf)); 11746 11747 /* Create AEAD operation */ 11748 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 11749 if (retval < 0) 11750 return retval; 11751 11752 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11753 11754 ut_params->op->sym->m_src = ut_params->ibuf; 11755 ut_params->op->sym->m_dst = ut_params->obuf; 11756 11757 /* Process crypto operation */ 11758 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11759 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11760 ut_params->op, 0, 0, 0, 0); 11761 else 11762 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 11763 ut_params->op), "failed to process sym crypto op"); 11764 11765 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11766 "crypto op processing failed"); 11767 11768 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11769 11770 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 11771 ut_params->op->sym->cipher.data.offset); 11772 auth_tag = ciphertext + plaintext_pad_len; 11773 11774 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 11775 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 11776 11777 /* Validate obuf */ 11778 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11779 ciphertext, 11780 tdata->ciphertext.data, 11781 tdata->ciphertext.len, 11782 "Ciphertext data not as expected"); 11783 11784 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11785 auth_tag, 11786 tdata->auth_tag.data, 11787 tdata->auth_tag.len, 11788 "Generated auth tag not as expected"); 11789 11790 return 0; 11791 11792 } 11793 11794 static int 11795 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 11796 { 11797 return test_authenticated_encryption_oop(&gcm_test_case_5); 11798 } 11799 11800 static int 11801 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 11802 { 11803 struct crypto_testsuite_params *ts_params = &testsuite_params; 11804 struct crypto_unittest_params *ut_params = &unittest_params; 11805 11806 int retval; 11807 uint8_t *plaintext; 11808 struct rte_cryptodev_info dev_info; 11809 11810 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11811 uint64_t feat_flags = dev_info.feature_flags; 11812 11813 /* Verify the capabilities */ 11814 struct rte_cryptodev_sym_capability_idx cap_idx; 11815 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11816 cap_idx.algo.aead = tdata->algo; 11817 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11818 &cap_idx) == NULL) 11819 return TEST_SKIPPED; 11820 11821 /* not supported with CPU crypto and raw data-path APIs*/ 11822 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 11823 global_api_test_type == CRYPTODEV_RAW_API_TEST) 11824 return TEST_SKIPPED; 11825 11826 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11827 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11828 printf("Device does not support RAW data-path APIs.\n"); 11829 return TEST_SKIPPED; 11830 } 11831 11832 /* Create AEAD session */ 11833 retval = create_aead_session(ts_params->valid_devs[0], 11834 tdata->algo, 11835 RTE_CRYPTO_AEAD_OP_DECRYPT, 11836 tdata->key.data, tdata->key.len, 11837 tdata->aad.len, tdata->auth_tag.len, 11838 tdata->iv.len); 11839 if (retval < 0) 11840 return retval; 11841 11842 /* alloc mbuf and set payload */ 11843 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11844 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11845 11846 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11847 rte_pktmbuf_tailroom(ut_params->ibuf)); 11848 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 11849 rte_pktmbuf_tailroom(ut_params->obuf)); 11850 11851 /* Create AEAD operation */ 11852 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 11853 if (retval < 0) 11854 return retval; 11855 11856 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11857 11858 ut_params->op->sym->m_src = ut_params->ibuf; 11859 ut_params->op->sym->m_dst = ut_params->obuf; 11860 11861 /* Process crypto operation */ 11862 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11863 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11864 ut_params->op, 0, 0, 0, 0); 11865 else 11866 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 11867 ut_params->op), "failed to process sym crypto op"); 11868 11869 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11870 "crypto op processing failed"); 11871 11872 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 11873 ut_params->op->sym->cipher.data.offset); 11874 11875 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 11876 11877 /* Validate obuf */ 11878 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11879 plaintext, 11880 tdata->plaintext.data, 11881 tdata->plaintext.len, 11882 "Plaintext data not as expected"); 11883 11884 TEST_ASSERT_EQUAL(ut_params->op->status, 11885 RTE_CRYPTO_OP_STATUS_SUCCESS, 11886 "Authentication failed"); 11887 return 0; 11888 } 11889 11890 static int 11891 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 11892 { 11893 return test_authenticated_decryption_oop(&gcm_test_case_5); 11894 } 11895 11896 static int 11897 test_authenticated_encryption_sessionless( 11898 const struct aead_test_data *tdata) 11899 { 11900 struct crypto_testsuite_params *ts_params = &testsuite_params; 11901 struct crypto_unittest_params *ut_params = &unittest_params; 11902 11903 int retval; 11904 uint8_t *ciphertext, *auth_tag; 11905 uint16_t plaintext_pad_len; 11906 uint8_t key[tdata->key.len + 1]; 11907 struct rte_cryptodev_info dev_info; 11908 11909 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11910 uint64_t feat_flags = dev_info.feature_flags; 11911 11912 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 11913 printf("Device doesn't support Sessionless ops.\n"); 11914 return TEST_SKIPPED; 11915 } 11916 11917 /* not supported with CPU crypto */ 11918 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11919 return TEST_SKIPPED; 11920 11921 /* Verify the capabilities */ 11922 struct rte_cryptodev_sym_capability_idx cap_idx; 11923 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11924 cap_idx.algo.aead = tdata->algo; 11925 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11926 &cap_idx) == NULL) 11927 return TEST_SKIPPED; 11928 11929 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11930 11931 /* clear mbuf payload */ 11932 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11933 rte_pktmbuf_tailroom(ut_params->ibuf)); 11934 11935 /* Create AEAD operation */ 11936 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 11937 if (retval < 0) 11938 return retval; 11939 11940 /* Create GCM xform */ 11941 memcpy(key, tdata->key.data, tdata->key.len); 11942 retval = create_aead_xform(ut_params->op, 11943 tdata->algo, 11944 RTE_CRYPTO_AEAD_OP_ENCRYPT, 11945 key, tdata->key.len, 11946 tdata->aad.len, tdata->auth_tag.len, 11947 tdata->iv.len); 11948 if (retval < 0) 11949 return retval; 11950 11951 ut_params->op->sym->m_src = ut_params->ibuf; 11952 11953 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 11954 RTE_CRYPTO_OP_SESSIONLESS, 11955 "crypto op session type not sessionless"); 11956 11957 /* Process crypto operation */ 11958 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 11959 ut_params->op), "failed to process sym crypto op"); 11960 11961 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 11962 11963 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11964 "crypto op status not success"); 11965 11966 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11967 11968 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 11969 ut_params->op->sym->cipher.data.offset); 11970 auth_tag = ciphertext + plaintext_pad_len; 11971 11972 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 11973 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 11974 11975 /* Validate obuf */ 11976 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11977 ciphertext, 11978 tdata->ciphertext.data, 11979 tdata->ciphertext.len, 11980 "Ciphertext data not as expected"); 11981 11982 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11983 auth_tag, 11984 tdata->auth_tag.data, 11985 tdata->auth_tag.len, 11986 "Generated auth tag not as expected"); 11987 11988 return 0; 11989 11990 } 11991 11992 static int 11993 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 11994 { 11995 return test_authenticated_encryption_sessionless( 11996 &gcm_test_case_5); 11997 } 11998 11999 static int 12000 test_authenticated_decryption_sessionless( 12001 const struct aead_test_data *tdata) 12002 { 12003 struct crypto_testsuite_params *ts_params = &testsuite_params; 12004 struct crypto_unittest_params *ut_params = &unittest_params; 12005 12006 int retval; 12007 uint8_t *plaintext; 12008 uint8_t key[tdata->key.len + 1]; 12009 struct rte_cryptodev_info dev_info; 12010 12011 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12012 uint64_t feat_flags = dev_info.feature_flags; 12013 12014 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 12015 printf("Device doesn't support Sessionless ops.\n"); 12016 return TEST_SKIPPED; 12017 } 12018 12019 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12020 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12021 printf("Device doesn't support RAW data-path APIs.\n"); 12022 return TEST_SKIPPED; 12023 } 12024 12025 /* not supported with CPU crypto */ 12026 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12027 return TEST_SKIPPED; 12028 12029 /* Verify the capabilities */ 12030 struct rte_cryptodev_sym_capability_idx cap_idx; 12031 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 12032 cap_idx.algo.aead = tdata->algo; 12033 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12034 &cap_idx) == NULL) 12035 return TEST_SKIPPED; 12036 12037 /* alloc mbuf and set payload */ 12038 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12039 12040 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12041 rte_pktmbuf_tailroom(ut_params->ibuf)); 12042 12043 /* Create AEAD operation */ 12044 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 12045 if (retval < 0) 12046 return retval; 12047 12048 /* Create AEAD xform */ 12049 memcpy(key, tdata->key.data, tdata->key.len); 12050 retval = create_aead_xform(ut_params->op, 12051 tdata->algo, 12052 RTE_CRYPTO_AEAD_OP_DECRYPT, 12053 key, tdata->key.len, 12054 tdata->aad.len, tdata->auth_tag.len, 12055 tdata->iv.len); 12056 if (retval < 0) 12057 return retval; 12058 12059 ut_params->op->sym->m_src = ut_params->ibuf; 12060 12061 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 12062 RTE_CRYPTO_OP_SESSIONLESS, 12063 "crypto op session type not sessionless"); 12064 12065 /* Process crypto operation */ 12066 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12067 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12068 ut_params->op, 0, 0, 0, 0); 12069 else 12070 TEST_ASSERT_NOT_NULL(process_crypto_request( 12071 ts_params->valid_devs[0], ut_params->op), 12072 "failed to process sym crypto op"); 12073 12074 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 12075 12076 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12077 "crypto op status not success"); 12078 12079 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 12080 ut_params->op->sym->cipher.data.offset); 12081 12082 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 12083 12084 /* Validate obuf */ 12085 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12086 plaintext, 12087 tdata->plaintext.data, 12088 tdata->plaintext.len, 12089 "Plaintext data not as expected"); 12090 12091 TEST_ASSERT_EQUAL(ut_params->op->status, 12092 RTE_CRYPTO_OP_STATUS_SUCCESS, 12093 "Authentication failed"); 12094 return 0; 12095 } 12096 12097 static int 12098 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 12099 { 12100 return test_authenticated_decryption_sessionless( 12101 &gcm_test_case_5); 12102 } 12103 12104 static int 12105 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 12106 { 12107 return test_authenticated_encryption(&ccm_test_case_128_1); 12108 } 12109 12110 static int 12111 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 12112 { 12113 return test_authenticated_encryption(&ccm_test_case_128_2); 12114 } 12115 12116 static int 12117 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 12118 { 12119 return test_authenticated_encryption(&ccm_test_case_128_3); 12120 } 12121 12122 static int 12123 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 12124 { 12125 return test_authenticated_decryption(&ccm_test_case_128_1); 12126 } 12127 12128 static int 12129 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 12130 { 12131 return test_authenticated_decryption(&ccm_test_case_128_2); 12132 } 12133 12134 static int 12135 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 12136 { 12137 return test_authenticated_decryption(&ccm_test_case_128_3); 12138 } 12139 12140 static int 12141 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 12142 { 12143 return test_authenticated_encryption(&ccm_test_case_192_1); 12144 } 12145 12146 static int 12147 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 12148 { 12149 return test_authenticated_encryption(&ccm_test_case_192_2); 12150 } 12151 12152 static int 12153 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 12154 { 12155 return test_authenticated_encryption(&ccm_test_case_192_3); 12156 } 12157 12158 static int 12159 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 12160 { 12161 return test_authenticated_decryption(&ccm_test_case_192_1); 12162 } 12163 12164 static int 12165 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 12166 { 12167 return test_authenticated_decryption(&ccm_test_case_192_2); 12168 } 12169 12170 static int 12171 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 12172 { 12173 return test_authenticated_decryption(&ccm_test_case_192_3); 12174 } 12175 12176 static int 12177 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 12178 { 12179 return test_authenticated_encryption(&ccm_test_case_256_1); 12180 } 12181 12182 static int 12183 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 12184 { 12185 return test_authenticated_encryption(&ccm_test_case_256_2); 12186 } 12187 12188 static int 12189 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 12190 { 12191 return test_authenticated_encryption(&ccm_test_case_256_3); 12192 } 12193 12194 static int 12195 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 12196 { 12197 return test_authenticated_decryption(&ccm_test_case_256_1); 12198 } 12199 12200 static int 12201 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 12202 { 12203 return test_authenticated_decryption(&ccm_test_case_256_2); 12204 } 12205 12206 static int 12207 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 12208 { 12209 return test_authenticated_decryption(&ccm_test_case_256_3); 12210 } 12211 12212 static int 12213 test_stats(void) 12214 { 12215 struct crypto_testsuite_params *ts_params = &testsuite_params; 12216 struct rte_cryptodev_stats stats; 12217 12218 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12219 return TEST_SKIPPED; 12220 12221 /* Verify the capabilities */ 12222 struct rte_cryptodev_sym_capability_idx cap_idx; 12223 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12224 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 12225 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12226 &cap_idx) == NULL) 12227 return TEST_SKIPPED; 12228 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12229 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 12230 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12231 &cap_idx) == NULL) 12232 return TEST_SKIPPED; 12233 12234 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 12235 == -ENOTSUP) 12236 return TEST_SKIPPED; 12237 12238 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 12239 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 12240 &stats) == -ENODEV), 12241 "rte_cryptodev_stats_get invalid dev failed"); 12242 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 12243 "rte_cryptodev_stats_get invalid Param failed"); 12244 12245 /* Test expected values */ 12246 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 12247 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 12248 &stats), 12249 "rte_cryptodev_stats_get failed"); 12250 TEST_ASSERT((stats.enqueued_count == 1), 12251 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12252 TEST_ASSERT((stats.dequeued_count == 1), 12253 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12254 TEST_ASSERT((stats.enqueue_err_count == 0), 12255 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12256 TEST_ASSERT((stats.dequeue_err_count == 0), 12257 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12258 12259 /* invalid device but should ignore and not reset device stats*/ 12260 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 12261 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 12262 &stats), 12263 "rte_cryptodev_stats_get failed"); 12264 TEST_ASSERT((stats.enqueued_count == 1), 12265 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12266 12267 /* check that a valid reset clears stats */ 12268 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 12269 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 12270 &stats), 12271 "rte_cryptodev_stats_get failed"); 12272 TEST_ASSERT((stats.enqueued_count == 0), 12273 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12274 TEST_ASSERT((stats.dequeued_count == 0), 12275 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 12276 12277 return TEST_SUCCESS; 12278 } 12279 12280 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 12281 struct crypto_unittest_params *ut_params, 12282 enum rte_crypto_auth_operation op, 12283 const struct HMAC_MD5_vector *test_case) 12284 { 12285 uint8_t key[64]; 12286 12287 memcpy(key, test_case->key.data, test_case->key.len); 12288 12289 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12290 ut_params->auth_xform.next = NULL; 12291 ut_params->auth_xform.auth.op = op; 12292 12293 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 12294 12295 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 12296 ut_params->auth_xform.auth.key.length = test_case->key.len; 12297 ut_params->auth_xform.auth.key.data = key; 12298 12299 ut_params->sess = rte_cryptodev_sym_session_create( 12300 ts_params->valid_devs[0], &ut_params->auth_xform, 12301 ts_params->session_mpool); 12302 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 12303 return TEST_SKIPPED; 12304 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12305 12306 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12307 12308 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12309 rte_pktmbuf_tailroom(ut_params->ibuf)); 12310 12311 return 0; 12312 } 12313 12314 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 12315 const struct HMAC_MD5_vector *test_case, 12316 uint8_t **plaintext) 12317 { 12318 uint16_t plaintext_pad_len; 12319 12320 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12321 12322 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 12323 16); 12324 12325 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12326 plaintext_pad_len); 12327 memcpy(*plaintext, test_case->plaintext.data, 12328 test_case->plaintext.len); 12329 12330 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12331 ut_params->ibuf, MD5_DIGEST_LEN); 12332 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12333 "no room to append digest"); 12334 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12335 ut_params->ibuf, plaintext_pad_len); 12336 12337 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 12338 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 12339 test_case->auth_tag.len); 12340 } 12341 12342 sym_op->auth.data.offset = 0; 12343 sym_op->auth.data.length = test_case->plaintext.len; 12344 12345 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12346 ut_params->op->sym->m_src = ut_params->ibuf; 12347 12348 return 0; 12349 } 12350 12351 static int 12352 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 12353 { 12354 uint16_t plaintext_pad_len; 12355 uint8_t *plaintext, *auth_tag; 12356 12357 struct crypto_testsuite_params *ts_params = &testsuite_params; 12358 struct crypto_unittest_params *ut_params = &unittest_params; 12359 struct rte_cryptodev_info dev_info; 12360 12361 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12362 uint64_t feat_flags = dev_info.feature_flags; 12363 12364 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12365 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12366 printf("Device doesn't support RAW data-path APIs.\n"); 12367 return TEST_SKIPPED; 12368 } 12369 12370 /* Verify the capabilities */ 12371 struct rte_cryptodev_sym_capability_idx cap_idx; 12372 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12373 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 12374 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12375 &cap_idx) == NULL) 12376 return TEST_SKIPPED; 12377 12378 if (MD5_HMAC_create_session(ts_params, ut_params, 12379 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 12380 return TEST_FAILED; 12381 12382 /* Generate Crypto op data structure */ 12383 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12384 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12385 TEST_ASSERT_NOT_NULL(ut_params->op, 12386 "Failed to allocate symmetric crypto operation struct"); 12387 12388 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 12389 16); 12390 12391 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 12392 return TEST_FAILED; 12393 12394 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12395 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12396 ut_params->op); 12397 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12398 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12399 ut_params->op, 0, 1, 0, 0); 12400 else 12401 TEST_ASSERT_NOT_NULL( 12402 process_crypto_request(ts_params->valid_devs[0], 12403 ut_params->op), 12404 "failed to process sym crypto op"); 12405 12406 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12407 "crypto op processing failed"); 12408 12409 if (ut_params->op->sym->m_dst) { 12410 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 12411 uint8_t *, plaintext_pad_len); 12412 } else { 12413 auth_tag = plaintext + plaintext_pad_len; 12414 } 12415 12416 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12417 auth_tag, 12418 test_case->auth_tag.data, 12419 test_case->auth_tag.len, 12420 "HMAC_MD5 generated tag not as expected"); 12421 12422 return TEST_SUCCESS; 12423 } 12424 12425 static int 12426 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 12427 { 12428 uint8_t *plaintext; 12429 12430 struct crypto_testsuite_params *ts_params = &testsuite_params; 12431 struct crypto_unittest_params *ut_params = &unittest_params; 12432 struct rte_cryptodev_info dev_info; 12433 12434 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12435 uint64_t feat_flags = dev_info.feature_flags; 12436 12437 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12438 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12439 printf("Device doesn't support RAW data-path APIs.\n"); 12440 return TEST_SKIPPED; 12441 } 12442 12443 /* Verify the capabilities */ 12444 struct rte_cryptodev_sym_capability_idx cap_idx; 12445 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12446 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 12447 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12448 &cap_idx) == NULL) 12449 return TEST_SKIPPED; 12450 12451 if (MD5_HMAC_create_session(ts_params, ut_params, 12452 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 12453 return TEST_FAILED; 12454 } 12455 12456 /* Generate Crypto op data structure */ 12457 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12458 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12459 TEST_ASSERT_NOT_NULL(ut_params->op, 12460 "Failed to allocate symmetric crypto operation struct"); 12461 12462 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 12463 return TEST_FAILED; 12464 12465 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12466 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12467 ut_params->op); 12468 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12469 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12470 ut_params->op, 0, 1, 0, 0); 12471 else 12472 TEST_ASSERT_NOT_NULL( 12473 process_crypto_request(ts_params->valid_devs[0], 12474 ut_params->op), 12475 "failed to process sym crypto op"); 12476 12477 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12478 "HMAC_MD5 crypto op processing failed"); 12479 12480 return TEST_SUCCESS; 12481 } 12482 12483 static int 12484 test_MD5_HMAC_generate_case_1(void) 12485 { 12486 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 12487 } 12488 12489 static int 12490 test_MD5_HMAC_verify_case_1(void) 12491 { 12492 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 12493 } 12494 12495 static int 12496 test_MD5_HMAC_generate_case_2(void) 12497 { 12498 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 12499 } 12500 12501 static int 12502 test_MD5_HMAC_verify_case_2(void) 12503 { 12504 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 12505 } 12506 12507 static int 12508 test_multi_session(void) 12509 { 12510 struct crypto_testsuite_params *ts_params = &testsuite_params; 12511 struct crypto_unittest_params *ut_params = &unittest_params; 12512 struct rte_cryptodev_info dev_info; 12513 void **sessions; 12514 uint16_t i; 12515 12516 /* Verify the capabilities */ 12517 struct rte_cryptodev_sym_capability_idx cap_idx; 12518 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12519 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 12520 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12521 &cap_idx) == NULL) 12522 return TEST_SKIPPED; 12523 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12524 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 12525 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12526 &cap_idx) == NULL) 12527 return TEST_SKIPPED; 12528 12529 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 12530 aes_cbc_key, hmac_sha512_key); 12531 12532 12533 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12534 12535 sessions = rte_malloc(NULL, 12536 sizeof(void *) * 12537 (MAX_NB_SESSIONS + 1), 0); 12538 12539 /* Create multiple crypto sessions*/ 12540 for (i = 0; i < MAX_NB_SESSIONS; i++) { 12541 sessions[i] = rte_cryptodev_sym_session_create( 12542 ts_params->valid_devs[0], &ut_params->auth_xform, 12543 ts_params->session_mpool); 12544 if (sessions[i] == NULL && rte_errno == ENOTSUP) 12545 return TEST_SKIPPED; 12546 12547 TEST_ASSERT_NOT_NULL(sessions[i], 12548 "Session creation failed at session number %u", 12549 i); 12550 /* Attempt to send a request on each session */ 12551 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 12552 sessions[i], 12553 ut_params, 12554 ts_params, 12555 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 12556 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 12557 aes_cbc_iv), 12558 "Failed to perform decrypt on request number %u.", i); 12559 /* free crypto operation structure */ 12560 rte_crypto_op_free(ut_params->op); 12561 12562 /* 12563 * free mbuf - both obuf and ibuf are usually the same, 12564 * so check if they point at the same address is necessary, 12565 * to avoid freeing the mbuf twice. 12566 */ 12567 if (ut_params->obuf) { 12568 rte_pktmbuf_free(ut_params->obuf); 12569 if (ut_params->ibuf == ut_params->obuf) 12570 ut_params->ibuf = 0; 12571 ut_params->obuf = 0; 12572 } 12573 if (ut_params->ibuf) { 12574 rte_pktmbuf_free(ut_params->ibuf); 12575 ut_params->ibuf = 0; 12576 } 12577 } 12578 12579 for (i = 0; i < MAX_NB_SESSIONS; i++) { 12580 rte_cryptodev_sym_session_free(ts_params->valid_devs[0], 12581 sessions[i]); 12582 } 12583 12584 rte_free(sessions); 12585 12586 return TEST_SUCCESS; 12587 } 12588 12589 struct multi_session_params { 12590 struct crypto_unittest_params ut_params; 12591 uint8_t *cipher_key; 12592 uint8_t *hmac_key; 12593 const uint8_t *cipher; 12594 const uint8_t *digest; 12595 uint8_t *iv; 12596 }; 12597 12598 #define MB_SESSION_NUMBER 3 12599 12600 static int 12601 test_multi_session_random_usage(void) 12602 { 12603 struct crypto_testsuite_params *ts_params = &testsuite_params; 12604 struct rte_cryptodev_info dev_info; 12605 void **sessions; 12606 uint32_t i, j; 12607 struct multi_session_params ut_paramz[] = { 12608 12609 { 12610 .cipher_key = ms_aes_cbc_key0, 12611 .hmac_key = ms_hmac_key0, 12612 .cipher = ms_aes_cbc_cipher0, 12613 .digest = ms_hmac_digest0, 12614 .iv = ms_aes_cbc_iv0 12615 }, 12616 { 12617 .cipher_key = ms_aes_cbc_key1, 12618 .hmac_key = ms_hmac_key1, 12619 .cipher = ms_aes_cbc_cipher1, 12620 .digest = ms_hmac_digest1, 12621 .iv = ms_aes_cbc_iv1 12622 }, 12623 { 12624 .cipher_key = ms_aes_cbc_key2, 12625 .hmac_key = ms_hmac_key2, 12626 .cipher = ms_aes_cbc_cipher2, 12627 .digest = ms_hmac_digest2, 12628 .iv = ms_aes_cbc_iv2 12629 }, 12630 12631 }; 12632 12633 /* Verify the capabilities */ 12634 struct rte_cryptodev_sym_capability_idx cap_idx; 12635 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12636 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 12637 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12638 &cap_idx) == NULL) 12639 return TEST_SKIPPED; 12640 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12641 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 12642 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12643 &cap_idx) == NULL) 12644 return TEST_SKIPPED; 12645 12646 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12647 12648 sessions = rte_malloc(NULL, (sizeof(void *) 12649 * MAX_NB_SESSIONS) + 1, 0); 12650 12651 for (i = 0; i < MB_SESSION_NUMBER; i++) { 12652 12653 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 12654 sizeof(struct crypto_unittest_params)); 12655 12656 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 12657 &ut_paramz[i].ut_params, 12658 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 12659 12660 /* Create multiple crypto sessions*/ 12661 sessions[i] = rte_cryptodev_sym_session_create( 12662 ts_params->valid_devs[0], 12663 &ut_paramz[i].ut_params.auth_xform, 12664 ts_params->session_mpool); 12665 if (sessions[i] == NULL && rte_errno == ENOTSUP) 12666 return TEST_SKIPPED; 12667 12668 TEST_ASSERT_NOT_NULL(sessions[i], 12669 "Session creation failed at session number %u", 12670 i); 12671 } 12672 12673 srand(time(NULL)); 12674 for (i = 0; i < 40000; i++) { 12675 12676 j = rand() % MB_SESSION_NUMBER; 12677 12678 TEST_ASSERT_SUCCESS( 12679 test_AES_CBC_HMAC_SHA512_decrypt_perform( 12680 sessions[j], 12681 &ut_paramz[j].ut_params, 12682 ts_params, ut_paramz[j].cipher, 12683 ut_paramz[j].digest, 12684 ut_paramz[j].iv), 12685 "Failed to perform decrypt on request number %u.", i); 12686 12687 rte_crypto_op_free(ut_paramz[j].ut_params.op); 12688 12689 /* 12690 * free mbuf - both obuf and ibuf are usually the same, 12691 * so check if they point at the same address is necessary, 12692 * to avoid freeing the mbuf twice. 12693 */ 12694 if (ut_paramz[j].ut_params.obuf) { 12695 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 12696 if (ut_paramz[j].ut_params.ibuf 12697 == ut_paramz[j].ut_params.obuf) 12698 ut_paramz[j].ut_params.ibuf = 0; 12699 ut_paramz[j].ut_params.obuf = 0; 12700 } 12701 if (ut_paramz[j].ut_params.ibuf) { 12702 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 12703 ut_paramz[j].ut_params.ibuf = 0; 12704 } 12705 } 12706 12707 for (i = 0; i < MB_SESSION_NUMBER; i++) { 12708 rte_cryptodev_sym_session_free(ts_params->valid_devs[0], 12709 sessions[i]); 12710 } 12711 12712 rte_free(sessions); 12713 12714 return TEST_SUCCESS; 12715 } 12716 12717 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 12718 0xab, 0xab, 0xab, 0xab, 12719 0xab, 0xab, 0xab, 0xab, 12720 0xab, 0xab, 0xab, 0xab}; 12721 12722 static int 12723 test_null_invalid_operation(void) 12724 { 12725 struct crypto_testsuite_params *ts_params = &testsuite_params; 12726 struct crypto_unittest_params *ut_params = &unittest_params; 12727 12728 /* This test is for NULL PMD only */ 12729 if (gbl_driver_id != rte_cryptodev_driver_id_get( 12730 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 12731 return TEST_SKIPPED; 12732 12733 /* Setup Cipher Parameters */ 12734 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12735 ut_params->cipher_xform.next = NULL; 12736 12737 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 12738 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 12739 12740 /* Create Crypto session*/ 12741 ut_params->sess = rte_cryptodev_sym_session_create( 12742 ts_params->valid_devs[0], &ut_params->cipher_xform, 12743 ts_params->session_mpool); 12744 TEST_ASSERT(ut_params->sess == NULL, 12745 "Session creation succeeded unexpectedly"); 12746 12747 /* Setup HMAC Parameters */ 12748 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12749 ut_params->auth_xform.next = NULL; 12750 12751 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 12752 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 12753 12754 /* Create Crypto session*/ 12755 ut_params->sess = rte_cryptodev_sym_session_create( 12756 ts_params->valid_devs[0], &ut_params->auth_xform, 12757 ts_params->session_mpool); 12758 TEST_ASSERT(ut_params->sess == NULL, 12759 "Session creation succeeded unexpectedly"); 12760 12761 return TEST_SUCCESS; 12762 } 12763 12764 12765 #define NULL_BURST_LENGTH (32) 12766 12767 static int 12768 test_null_burst_operation(void) 12769 { 12770 struct crypto_testsuite_params *ts_params = &testsuite_params; 12771 struct crypto_unittest_params *ut_params = &unittest_params; 12772 12773 unsigned i, burst_len = NULL_BURST_LENGTH; 12774 12775 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 12776 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 12777 12778 /* This test is for NULL PMD only */ 12779 if (gbl_driver_id != rte_cryptodev_driver_id_get( 12780 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 12781 return TEST_SKIPPED; 12782 12783 /* Setup Cipher Parameters */ 12784 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12785 ut_params->cipher_xform.next = &ut_params->auth_xform; 12786 12787 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 12788 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 12789 12790 /* Setup HMAC Parameters */ 12791 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12792 ut_params->auth_xform.next = NULL; 12793 12794 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 12795 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 12796 12797 /* Create Crypto session*/ 12798 ut_params->sess = rte_cryptodev_sym_session_create( 12799 ts_params->valid_devs[0], 12800 &ut_params->auth_xform, 12801 ts_params->session_mpool); 12802 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 12803 return TEST_SKIPPED; 12804 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12805 12806 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 12807 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 12808 burst_len, "failed to generate burst of crypto ops"); 12809 12810 /* Generate an operation for each mbuf in burst */ 12811 for (i = 0; i < burst_len; i++) { 12812 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12813 12814 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 12815 12816 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 12817 sizeof(unsigned)); 12818 *data = i; 12819 12820 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 12821 12822 burst[i]->sym->m_src = m; 12823 } 12824 12825 /* Process crypto operation */ 12826 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 12827 0, burst, burst_len), 12828 burst_len, 12829 "Error enqueuing burst"); 12830 12831 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 12832 0, burst_dequeued, burst_len), 12833 burst_len, 12834 "Error dequeuing burst"); 12835 12836 12837 for (i = 0; i < burst_len; i++) { 12838 TEST_ASSERT_EQUAL( 12839 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 12840 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 12841 uint32_t *), 12842 "data not as expected"); 12843 12844 rte_pktmbuf_free(burst[i]->sym->m_src); 12845 rte_crypto_op_free(burst[i]); 12846 } 12847 12848 return TEST_SUCCESS; 12849 } 12850 12851 static uint16_t 12852 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 12853 uint16_t nb_ops, void *user_param) 12854 { 12855 RTE_SET_USED(dev_id); 12856 RTE_SET_USED(qp_id); 12857 RTE_SET_USED(ops); 12858 RTE_SET_USED(user_param); 12859 12860 printf("crypto enqueue callback called\n"); 12861 return nb_ops; 12862 } 12863 12864 static uint16_t 12865 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 12866 uint16_t nb_ops, void *user_param) 12867 { 12868 RTE_SET_USED(dev_id); 12869 RTE_SET_USED(qp_id); 12870 RTE_SET_USED(ops); 12871 RTE_SET_USED(user_param); 12872 12873 printf("crypto dequeue callback called\n"); 12874 return nb_ops; 12875 } 12876 12877 /* 12878 * Thread using enqueue/dequeue callback with RCU. 12879 */ 12880 static int 12881 test_enqdeq_callback_thread(void *arg) 12882 { 12883 RTE_SET_USED(arg); 12884 /* DP thread calls rte_cryptodev_enqueue_burst()/ 12885 * rte_cryptodev_dequeue_burst() and invokes callback. 12886 */ 12887 test_null_burst_operation(); 12888 return 0; 12889 } 12890 12891 static int 12892 test_enq_callback_setup(void) 12893 { 12894 struct crypto_testsuite_params *ts_params = &testsuite_params; 12895 struct rte_cryptodev_info dev_info; 12896 struct rte_cryptodev_qp_conf qp_conf = { 12897 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 12898 }; 12899 12900 struct rte_cryptodev_cb *cb; 12901 uint16_t qp_id = 0; 12902 12903 /* Stop the device in case it's started so it can be configured */ 12904 rte_cryptodev_stop(ts_params->valid_devs[0]); 12905 12906 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12907 12908 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 12909 &ts_params->conf), 12910 "Failed to configure cryptodev %u", 12911 ts_params->valid_devs[0]); 12912 12913 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 12914 qp_conf.mp_session = ts_params->session_mpool; 12915 12916 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 12917 ts_params->valid_devs[0], qp_id, &qp_conf, 12918 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 12919 "Failed test for " 12920 "rte_cryptodev_queue_pair_setup: num_inflights " 12921 "%u on qp %u on cryptodev %u", 12922 qp_conf.nb_descriptors, qp_id, 12923 ts_params->valid_devs[0]); 12924 12925 /* Test with invalid crypto device */ 12926 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS, 12927 qp_id, test_enq_callback, NULL); 12928 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12929 "cryptodev %u did not fail", 12930 qp_id, RTE_CRYPTO_MAX_DEVS); 12931 12932 /* Test with invalid queue pair */ 12933 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12934 dev_info.max_nb_queue_pairs + 1, 12935 test_enq_callback, NULL); 12936 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12937 "cryptodev %u did not fail", 12938 dev_info.max_nb_queue_pairs + 1, 12939 ts_params->valid_devs[0]); 12940 12941 /* Test with NULL callback */ 12942 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12943 qp_id, NULL, NULL); 12944 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12945 "cryptodev %u did not fail", 12946 qp_id, ts_params->valid_devs[0]); 12947 12948 /* Test with valid configuration */ 12949 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12950 qp_id, test_enq_callback, NULL); 12951 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 12952 "qp %u on cryptodev %u", 12953 qp_id, ts_params->valid_devs[0]); 12954 12955 rte_cryptodev_start(ts_params->valid_devs[0]); 12956 12957 /* Launch a thread */ 12958 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 12959 rte_get_next_lcore(-1, 1, 0)); 12960 12961 /* Wait until reader exited. */ 12962 rte_eal_mp_wait_lcore(); 12963 12964 /* Test with invalid crypto device */ 12965 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12966 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 12967 "Expected call to fail as crypto device is invalid"); 12968 12969 /* Test with invalid queue pair */ 12970 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12971 ts_params->valid_devs[0], 12972 dev_info.max_nb_queue_pairs + 1, cb), 12973 "Expected call to fail as queue pair is invalid"); 12974 12975 /* Test with NULL callback */ 12976 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12977 ts_params->valid_devs[0], qp_id, NULL), 12978 "Expected call to fail as callback is NULL"); 12979 12980 /* Test with valid configuration */ 12981 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback( 12982 ts_params->valid_devs[0], qp_id, cb), 12983 "Failed test to remove callback on " 12984 "qp %u on cryptodev %u", 12985 qp_id, ts_params->valid_devs[0]); 12986 12987 return TEST_SUCCESS; 12988 } 12989 12990 static int 12991 test_deq_callback_setup(void) 12992 { 12993 struct crypto_testsuite_params *ts_params = &testsuite_params; 12994 struct rte_cryptodev_info dev_info; 12995 struct rte_cryptodev_qp_conf qp_conf = { 12996 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 12997 }; 12998 12999 struct rte_cryptodev_cb *cb; 13000 uint16_t qp_id = 0; 13001 13002 /* Stop the device in case it's started so it can be configured */ 13003 rte_cryptodev_stop(ts_params->valid_devs[0]); 13004 13005 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13006 13007 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 13008 &ts_params->conf), 13009 "Failed to configure cryptodev %u", 13010 ts_params->valid_devs[0]); 13011 13012 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 13013 qp_conf.mp_session = ts_params->session_mpool; 13014 13015 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 13016 ts_params->valid_devs[0], qp_id, &qp_conf, 13017 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 13018 "Failed test for " 13019 "rte_cryptodev_queue_pair_setup: num_inflights " 13020 "%u on qp %u on cryptodev %u", 13021 qp_conf.nb_descriptors, qp_id, 13022 ts_params->valid_devs[0]); 13023 13024 /* Test with invalid crypto device */ 13025 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS, 13026 qp_id, test_deq_callback, NULL); 13027 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 13028 "cryptodev %u did not fail", 13029 qp_id, RTE_CRYPTO_MAX_DEVS); 13030 13031 /* Test with invalid queue pair */ 13032 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 13033 dev_info.max_nb_queue_pairs + 1, 13034 test_deq_callback, NULL); 13035 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 13036 "cryptodev %u did not fail", 13037 dev_info.max_nb_queue_pairs + 1, 13038 ts_params->valid_devs[0]); 13039 13040 /* Test with NULL callback */ 13041 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 13042 qp_id, NULL, NULL); 13043 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 13044 "cryptodev %u did not fail", 13045 qp_id, ts_params->valid_devs[0]); 13046 13047 /* Test with valid configuration */ 13048 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 13049 qp_id, test_deq_callback, NULL); 13050 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 13051 "qp %u on cryptodev %u", 13052 qp_id, ts_params->valid_devs[0]); 13053 13054 rte_cryptodev_start(ts_params->valid_devs[0]); 13055 13056 /* Launch a thread */ 13057 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 13058 rte_get_next_lcore(-1, 1, 0)); 13059 13060 /* Wait until reader exited. */ 13061 rte_eal_mp_wait_lcore(); 13062 13063 /* Test with invalid crypto device */ 13064 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 13065 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 13066 "Expected call to fail as crypto device is invalid"); 13067 13068 /* Test with invalid queue pair */ 13069 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 13070 ts_params->valid_devs[0], 13071 dev_info.max_nb_queue_pairs + 1, cb), 13072 "Expected call to fail as queue pair is invalid"); 13073 13074 /* Test with NULL callback */ 13075 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 13076 ts_params->valid_devs[0], qp_id, NULL), 13077 "Expected call to fail as callback is NULL"); 13078 13079 /* Test with valid configuration */ 13080 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback( 13081 ts_params->valid_devs[0], qp_id, cb), 13082 "Failed test to remove callback on " 13083 "qp %u on cryptodev %u", 13084 qp_id, ts_params->valid_devs[0]); 13085 13086 return TEST_SUCCESS; 13087 } 13088 13089 static void 13090 generate_gmac_large_plaintext(uint8_t *data) 13091 { 13092 uint16_t i; 13093 13094 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 13095 memcpy(&data[i], &data[0], 32); 13096 } 13097 13098 static int 13099 create_gmac_operation(enum rte_crypto_auth_operation op, 13100 const struct gmac_test_data *tdata) 13101 { 13102 struct crypto_testsuite_params *ts_params = &testsuite_params; 13103 struct crypto_unittest_params *ut_params = &unittest_params; 13104 struct rte_crypto_sym_op *sym_op; 13105 13106 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 13107 13108 /* Generate Crypto op data structure */ 13109 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13110 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13111 TEST_ASSERT_NOT_NULL(ut_params->op, 13112 "Failed to allocate symmetric crypto operation struct"); 13113 13114 sym_op = ut_params->op->sym; 13115 13116 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13117 ut_params->ibuf, tdata->gmac_tag.len); 13118 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13119 "no room to append digest"); 13120 13121 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 13122 ut_params->ibuf, plaintext_pad_len); 13123 13124 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 13125 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 13126 tdata->gmac_tag.len); 13127 debug_hexdump(stdout, "digest:", 13128 sym_op->auth.digest.data, 13129 tdata->gmac_tag.len); 13130 } 13131 13132 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13133 uint8_t *, IV_OFFSET); 13134 13135 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 13136 13137 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 13138 13139 sym_op->cipher.data.length = 0; 13140 sym_op->cipher.data.offset = 0; 13141 13142 sym_op->auth.data.offset = 0; 13143 sym_op->auth.data.length = tdata->plaintext.len; 13144 13145 return 0; 13146 } 13147 13148 static int 13149 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 13150 const struct gmac_test_data *tdata, 13151 void *digest_mem, uint64_t digest_phys) 13152 { 13153 struct crypto_testsuite_params *ts_params = &testsuite_params; 13154 struct crypto_unittest_params *ut_params = &unittest_params; 13155 struct rte_crypto_sym_op *sym_op; 13156 13157 /* Generate Crypto op data structure */ 13158 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13159 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13160 TEST_ASSERT_NOT_NULL(ut_params->op, 13161 "Failed to allocate symmetric crypto operation struct"); 13162 13163 sym_op = ut_params->op->sym; 13164 13165 sym_op->auth.digest.data = digest_mem; 13166 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13167 "no room to append digest"); 13168 13169 sym_op->auth.digest.phys_addr = digest_phys; 13170 13171 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 13172 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 13173 tdata->gmac_tag.len); 13174 debug_hexdump(stdout, "digest:", 13175 sym_op->auth.digest.data, 13176 tdata->gmac_tag.len); 13177 } 13178 13179 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13180 uint8_t *, IV_OFFSET); 13181 13182 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 13183 13184 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 13185 13186 sym_op->cipher.data.length = 0; 13187 sym_op->cipher.data.offset = 0; 13188 13189 sym_op->auth.data.offset = 0; 13190 sym_op->auth.data.length = tdata->plaintext.len; 13191 13192 return 0; 13193 } 13194 13195 static int create_gmac_session(uint8_t dev_id, 13196 const struct gmac_test_data *tdata, 13197 enum rte_crypto_auth_operation auth_op) 13198 { 13199 uint8_t auth_key[tdata->key.len]; 13200 13201 struct crypto_testsuite_params *ts_params = &testsuite_params; 13202 struct crypto_unittest_params *ut_params = &unittest_params; 13203 13204 memcpy(auth_key, tdata->key.data, tdata->key.len); 13205 13206 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13207 ut_params->auth_xform.next = NULL; 13208 13209 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 13210 ut_params->auth_xform.auth.op = auth_op; 13211 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 13212 ut_params->auth_xform.auth.key.length = tdata->key.len; 13213 ut_params->auth_xform.auth.key.data = auth_key; 13214 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 13215 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 13216 13217 13218 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 13219 &ut_params->auth_xform, ts_params->session_mpool); 13220 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 13221 return TEST_SKIPPED; 13222 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13223 13224 return 0; 13225 } 13226 13227 static int 13228 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 13229 { 13230 struct crypto_testsuite_params *ts_params = &testsuite_params; 13231 struct crypto_unittest_params *ut_params = &unittest_params; 13232 struct rte_cryptodev_info dev_info; 13233 13234 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13235 uint64_t feat_flags = dev_info.feature_flags; 13236 13237 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13238 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13239 printf("Device doesn't support RAW data-path APIs.\n"); 13240 return TEST_SKIPPED; 13241 } 13242 13243 int retval; 13244 13245 uint8_t *auth_tag, *plaintext; 13246 uint16_t plaintext_pad_len; 13247 13248 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 13249 "No GMAC length in the source data"); 13250 13251 /* Verify the capabilities */ 13252 struct rte_cryptodev_sym_capability_idx cap_idx; 13253 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13254 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 13255 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13256 &cap_idx) == NULL) 13257 return TEST_SKIPPED; 13258 13259 retval = create_gmac_session(ts_params->valid_devs[0], 13260 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 13261 13262 if (retval == -ENOTSUP) 13263 return TEST_SKIPPED; 13264 if (retval < 0) 13265 return retval; 13266 13267 if (tdata->plaintext.len > MBUF_SIZE) 13268 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 13269 else 13270 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13271 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13272 "Failed to allocate input buffer in mempool"); 13273 13274 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13275 rte_pktmbuf_tailroom(ut_params->ibuf)); 13276 13277 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 13278 /* 13279 * Runtime generate the large plain text instead of use hard code 13280 * plain text vector. It is done to avoid create huge source file 13281 * with the test vector. 13282 */ 13283 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 13284 generate_gmac_large_plaintext(tdata->plaintext.data); 13285 13286 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13287 plaintext_pad_len); 13288 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13289 13290 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 13291 debug_hexdump(stdout, "plaintext:", plaintext, 13292 tdata->plaintext.len); 13293 13294 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 13295 tdata); 13296 13297 if (retval < 0) 13298 return retval; 13299 13300 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13301 13302 ut_params->op->sym->m_src = ut_params->ibuf; 13303 13304 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13305 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13306 ut_params->op); 13307 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13308 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13309 ut_params->op, 0, 1, 0, 0); 13310 else 13311 TEST_ASSERT_NOT_NULL( 13312 process_crypto_request(ts_params->valid_devs[0], 13313 ut_params->op), "failed to process sym crypto op"); 13314 13315 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13316 "crypto op processing failed"); 13317 13318 if (ut_params->op->sym->m_dst) { 13319 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 13320 uint8_t *, plaintext_pad_len); 13321 } else { 13322 auth_tag = plaintext + plaintext_pad_len; 13323 } 13324 13325 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 13326 13327 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13328 auth_tag, 13329 tdata->gmac_tag.data, 13330 tdata->gmac_tag.len, 13331 "GMAC Generated auth tag not as expected"); 13332 13333 return 0; 13334 } 13335 13336 static int 13337 test_AES_GMAC_authentication_test_case_1(void) 13338 { 13339 return test_AES_GMAC_authentication(&gmac_test_case_1); 13340 } 13341 13342 static int 13343 test_AES_GMAC_authentication_test_case_2(void) 13344 { 13345 return test_AES_GMAC_authentication(&gmac_test_case_2); 13346 } 13347 13348 static int 13349 test_AES_GMAC_authentication_test_case_3(void) 13350 { 13351 return test_AES_GMAC_authentication(&gmac_test_case_3); 13352 } 13353 13354 static int 13355 test_AES_GMAC_authentication_test_case_4(void) 13356 { 13357 return test_AES_GMAC_authentication(&gmac_test_case_4); 13358 } 13359 13360 static int 13361 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 13362 { 13363 struct crypto_testsuite_params *ts_params = &testsuite_params; 13364 struct crypto_unittest_params *ut_params = &unittest_params; 13365 int retval; 13366 uint32_t plaintext_pad_len; 13367 uint8_t *plaintext; 13368 struct rte_cryptodev_info dev_info; 13369 13370 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13371 uint64_t feat_flags = dev_info.feature_flags; 13372 13373 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13374 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13375 printf("Device doesn't support RAW data-path APIs.\n"); 13376 return TEST_SKIPPED; 13377 } 13378 13379 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 13380 "No GMAC length in the source data"); 13381 13382 /* Verify the capabilities */ 13383 struct rte_cryptodev_sym_capability_idx cap_idx; 13384 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13385 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 13386 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13387 &cap_idx) == NULL) 13388 return TEST_SKIPPED; 13389 13390 retval = create_gmac_session(ts_params->valid_devs[0], 13391 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 13392 13393 if (retval == -ENOTSUP) 13394 return TEST_SKIPPED; 13395 if (retval < 0) 13396 return retval; 13397 13398 if (tdata->plaintext.len > MBUF_SIZE) 13399 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 13400 else 13401 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13402 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13403 "Failed to allocate input buffer in mempool"); 13404 13405 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13406 rte_pktmbuf_tailroom(ut_params->ibuf)); 13407 13408 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 13409 13410 /* 13411 * Runtime generate the large plain text instead of use hard code 13412 * plain text vector. It is done to avoid create huge source file 13413 * with the test vector. 13414 */ 13415 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 13416 generate_gmac_large_plaintext(tdata->plaintext.data); 13417 13418 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13419 plaintext_pad_len); 13420 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13421 13422 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 13423 debug_hexdump(stdout, "plaintext:", plaintext, 13424 tdata->plaintext.len); 13425 13426 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 13427 tdata); 13428 13429 if (retval < 0) 13430 return retval; 13431 13432 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13433 13434 ut_params->op->sym->m_src = ut_params->ibuf; 13435 13436 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13437 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13438 ut_params->op); 13439 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13440 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13441 ut_params->op, 0, 1, 0, 0); 13442 else 13443 TEST_ASSERT_NOT_NULL( 13444 process_crypto_request(ts_params->valid_devs[0], 13445 ut_params->op), "failed to process sym crypto op"); 13446 13447 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13448 "crypto op processing failed"); 13449 13450 return 0; 13451 13452 } 13453 13454 static int 13455 test_AES_GMAC_authentication_verify_test_case_1(void) 13456 { 13457 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 13458 } 13459 13460 static int 13461 test_AES_GMAC_authentication_verify_test_case_2(void) 13462 { 13463 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 13464 } 13465 13466 static int 13467 test_AES_GMAC_authentication_verify_test_case_3(void) 13468 { 13469 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 13470 } 13471 13472 static int 13473 test_AES_GMAC_authentication_verify_test_case_4(void) 13474 { 13475 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 13476 } 13477 13478 static int 13479 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 13480 uint32_t fragsz) 13481 { 13482 struct crypto_testsuite_params *ts_params = &testsuite_params; 13483 struct crypto_unittest_params *ut_params = &unittest_params; 13484 struct rte_cryptodev_info dev_info; 13485 uint64_t feature_flags; 13486 unsigned int trn_data = 0; 13487 void *digest_mem = NULL; 13488 uint32_t segs = 1; 13489 unsigned int to_trn = 0; 13490 struct rte_mbuf *buf = NULL; 13491 uint8_t *auth_tag, *plaintext; 13492 int retval; 13493 13494 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 13495 "No GMAC length in the source data"); 13496 13497 /* Verify the capabilities */ 13498 struct rte_cryptodev_sym_capability_idx cap_idx; 13499 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13500 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 13501 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13502 &cap_idx) == NULL) 13503 return TEST_SKIPPED; 13504 13505 /* Check for any input SGL support */ 13506 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13507 feature_flags = dev_info.feature_flags; 13508 13509 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 13510 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 13511 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 13512 return TEST_SKIPPED; 13513 13514 if (fragsz > tdata->plaintext.len) 13515 fragsz = tdata->plaintext.len; 13516 13517 uint16_t plaintext_len = fragsz; 13518 13519 retval = create_gmac_session(ts_params->valid_devs[0], 13520 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 13521 13522 if (retval == -ENOTSUP) 13523 return TEST_SKIPPED; 13524 if (retval < 0) 13525 return retval; 13526 13527 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13528 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13529 "Failed to allocate input buffer in mempool"); 13530 13531 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13532 rte_pktmbuf_tailroom(ut_params->ibuf)); 13533 13534 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13535 plaintext_len); 13536 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13537 13538 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 13539 13540 trn_data += plaintext_len; 13541 13542 buf = ut_params->ibuf; 13543 13544 /* 13545 * Loop until no more fragments 13546 */ 13547 13548 while (trn_data < tdata->plaintext.len) { 13549 ++segs; 13550 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 13551 (tdata->plaintext.len - trn_data) : fragsz; 13552 13553 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13554 buf = buf->next; 13555 13556 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 13557 rte_pktmbuf_tailroom(buf)); 13558 13559 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 13560 to_trn); 13561 13562 memcpy(plaintext, tdata->plaintext.data + trn_data, 13563 to_trn); 13564 trn_data += to_trn; 13565 if (trn_data == tdata->plaintext.len) 13566 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 13567 tdata->gmac_tag.len); 13568 } 13569 ut_params->ibuf->nb_segs = segs; 13570 13571 /* 13572 * Place digest at the end of the last buffer 13573 */ 13574 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 13575 13576 if (!digest_mem) { 13577 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13578 + tdata->gmac_tag.len); 13579 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 13580 tdata->plaintext.len); 13581 } 13582 13583 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 13584 tdata, digest_mem, digest_phys); 13585 13586 if (retval < 0) 13587 return retval; 13588 13589 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13590 13591 ut_params->op->sym->m_src = ut_params->ibuf; 13592 13593 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13594 return TEST_SKIPPED; 13595 13596 TEST_ASSERT_NOT_NULL( 13597 process_crypto_request(ts_params->valid_devs[0], 13598 ut_params->op), "failed to process sym crypto op"); 13599 13600 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13601 "crypto op processing failed"); 13602 13603 auth_tag = digest_mem; 13604 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 13605 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13606 auth_tag, 13607 tdata->gmac_tag.data, 13608 tdata->gmac_tag.len, 13609 "GMAC Generated auth tag not as expected"); 13610 13611 return 0; 13612 } 13613 13614 /* Segment size not multiple of block size (16B) */ 13615 static int 13616 test_AES_GMAC_authentication_SGL_40B(void) 13617 { 13618 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 13619 } 13620 13621 static int 13622 test_AES_GMAC_authentication_SGL_80B(void) 13623 { 13624 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 13625 } 13626 13627 static int 13628 test_AES_GMAC_authentication_SGL_2048B(void) 13629 { 13630 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 13631 } 13632 13633 /* Segment size not multiple of block size (16B) */ 13634 static int 13635 test_AES_GMAC_authentication_SGL_2047B(void) 13636 { 13637 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 13638 } 13639 13640 struct test_crypto_vector { 13641 enum rte_crypto_cipher_algorithm crypto_algo; 13642 unsigned int cipher_offset; 13643 unsigned int cipher_len; 13644 13645 struct { 13646 uint8_t data[64]; 13647 unsigned int len; 13648 } cipher_key; 13649 13650 struct { 13651 uint8_t data[64]; 13652 unsigned int len; 13653 } iv; 13654 13655 struct { 13656 const uint8_t *data; 13657 unsigned int len; 13658 } plaintext; 13659 13660 struct { 13661 const uint8_t *data; 13662 unsigned int len; 13663 } ciphertext; 13664 13665 enum rte_crypto_auth_algorithm auth_algo; 13666 unsigned int auth_offset; 13667 13668 struct { 13669 uint8_t data[128]; 13670 unsigned int len; 13671 } auth_key; 13672 13673 struct { 13674 const uint8_t *data; 13675 unsigned int len; 13676 } aad; 13677 13678 struct { 13679 uint8_t data[128]; 13680 unsigned int len; 13681 } digest; 13682 }; 13683 13684 static const struct test_crypto_vector 13685 hmac_sha1_test_crypto_vector = { 13686 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 13687 .plaintext = { 13688 .data = plaintext_hash, 13689 .len = 512 13690 }, 13691 .auth_key = { 13692 .data = { 13693 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 13694 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 13695 0xDE, 0xF4, 0xDE, 0xAD 13696 }, 13697 .len = 20 13698 }, 13699 .digest = { 13700 .data = { 13701 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 13702 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 13703 0x3F, 0x91, 0x64, 0x59 13704 }, 13705 .len = 20 13706 } 13707 }; 13708 13709 static const struct test_crypto_vector 13710 aes128_gmac_test_vector = { 13711 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 13712 .plaintext = { 13713 .data = plaintext_hash, 13714 .len = 512 13715 }, 13716 .iv = { 13717 .data = { 13718 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 13719 0x08, 0x09, 0x0A, 0x0B 13720 }, 13721 .len = 12 13722 }, 13723 .auth_key = { 13724 .data = { 13725 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 13726 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 13727 }, 13728 .len = 16 13729 }, 13730 .digest = { 13731 .data = { 13732 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 13733 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 13734 }, 13735 .len = 16 13736 } 13737 }; 13738 13739 static const struct test_crypto_vector 13740 aes128cbc_hmac_sha1_test_vector = { 13741 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 13742 .cipher_offset = 0, 13743 .cipher_len = 512, 13744 .cipher_key = { 13745 .data = { 13746 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 13747 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 13748 }, 13749 .len = 16 13750 }, 13751 .iv = { 13752 .data = { 13753 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 13754 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 13755 }, 13756 .len = 16 13757 }, 13758 .plaintext = { 13759 .data = plaintext_hash, 13760 .len = 512 13761 }, 13762 .ciphertext = { 13763 .data = ciphertext512_aes128cbc, 13764 .len = 512 13765 }, 13766 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 13767 .auth_offset = 0, 13768 .auth_key = { 13769 .data = { 13770 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 13771 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 13772 0xDE, 0xF4, 0xDE, 0xAD 13773 }, 13774 .len = 20 13775 }, 13776 .digest = { 13777 .data = { 13778 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 13779 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 13780 0x18, 0x8C, 0x1D, 0x32 13781 }, 13782 .len = 20 13783 } 13784 }; 13785 13786 static const struct test_crypto_vector 13787 aes128cbc_hmac_sha1_aad_test_vector = { 13788 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 13789 .cipher_offset = 8, 13790 .cipher_len = 496, 13791 .cipher_key = { 13792 .data = { 13793 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 13794 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 13795 }, 13796 .len = 16 13797 }, 13798 .iv = { 13799 .data = { 13800 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 13801 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 13802 }, 13803 .len = 16 13804 }, 13805 .plaintext = { 13806 .data = plaintext_hash, 13807 .len = 512 13808 }, 13809 .ciphertext = { 13810 .data = ciphertext512_aes128cbc_aad, 13811 .len = 512 13812 }, 13813 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 13814 .auth_offset = 0, 13815 .auth_key = { 13816 .data = { 13817 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 13818 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 13819 0xDE, 0xF4, 0xDE, 0xAD 13820 }, 13821 .len = 20 13822 }, 13823 .digest = { 13824 .data = { 13825 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 13826 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 13827 0x62, 0x0F, 0xFB, 0x10 13828 }, 13829 .len = 20 13830 } 13831 }; 13832 13833 static void 13834 data_corruption(uint8_t *data) 13835 { 13836 data[0] += 1; 13837 } 13838 13839 static void 13840 tag_corruption(uint8_t *data, unsigned int tag_offset) 13841 { 13842 data[tag_offset] += 1; 13843 } 13844 13845 static int 13846 create_auth_session(struct crypto_unittest_params *ut_params, 13847 uint8_t dev_id, 13848 const struct test_crypto_vector *reference, 13849 enum rte_crypto_auth_operation auth_op) 13850 { 13851 struct crypto_testsuite_params *ts_params = &testsuite_params; 13852 uint8_t auth_key[reference->auth_key.len + 1]; 13853 13854 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13855 13856 /* Setup Authentication Parameters */ 13857 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13858 ut_params->auth_xform.auth.op = auth_op; 13859 ut_params->auth_xform.next = NULL; 13860 ut_params->auth_xform.auth.algo = reference->auth_algo; 13861 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13862 ut_params->auth_xform.auth.key.data = auth_key; 13863 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13864 13865 /* Create Crypto session*/ 13866 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 13867 &ut_params->auth_xform, 13868 ts_params->session_mpool); 13869 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 13870 return TEST_SKIPPED; 13871 13872 return 0; 13873 } 13874 13875 static int 13876 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 13877 uint8_t dev_id, 13878 const struct test_crypto_vector *reference, 13879 enum rte_crypto_auth_operation auth_op, 13880 enum rte_crypto_cipher_operation cipher_op) 13881 { 13882 struct crypto_testsuite_params *ts_params = &testsuite_params; 13883 uint8_t cipher_key[reference->cipher_key.len + 1]; 13884 uint8_t auth_key[reference->auth_key.len + 1]; 13885 13886 memcpy(cipher_key, reference->cipher_key.data, 13887 reference->cipher_key.len); 13888 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13889 13890 /* Setup Authentication Parameters */ 13891 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13892 ut_params->auth_xform.auth.op = auth_op; 13893 ut_params->auth_xform.auth.algo = reference->auth_algo; 13894 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13895 ut_params->auth_xform.auth.key.data = auth_key; 13896 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13897 13898 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 13899 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 13900 ut_params->auth_xform.auth.iv.length = reference->iv.len; 13901 } else { 13902 ut_params->auth_xform.next = &ut_params->cipher_xform; 13903 13904 /* Setup Cipher Parameters */ 13905 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13906 ut_params->cipher_xform.next = NULL; 13907 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13908 ut_params->cipher_xform.cipher.op = cipher_op; 13909 ut_params->cipher_xform.cipher.key.data = cipher_key; 13910 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13911 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13912 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13913 } 13914 13915 /* Create Crypto session*/ 13916 ut_params->sess = rte_cryptodev_sym_session_create(dev_id, 13917 &ut_params->auth_xform, 13918 ts_params->session_mpool); 13919 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 13920 return TEST_SKIPPED; 13921 13922 return 0; 13923 } 13924 13925 static int 13926 create_auth_operation(struct crypto_testsuite_params *ts_params, 13927 struct crypto_unittest_params *ut_params, 13928 const struct test_crypto_vector *reference, 13929 unsigned int auth_generate) 13930 { 13931 /* Generate Crypto op data structure */ 13932 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13933 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13934 TEST_ASSERT_NOT_NULL(ut_params->op, 13935 "Failed to allocate pktmbuf offload"); 13936 13937 /* Set crypto operation data parameters */ 13938 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13939 13940 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13941 13942 /* set crypto operation source mbuf */ 13943 sym_op->m_src = ut_params->ibuf; 13944 13945 /* digest */ 13946 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13947 ut_params->ibuf, reference->digest.len); 13948 13949 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13950 "no room to append auth tag"); 13951 13952 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 13953 ut_params->ibuf, reference->plaintext.len); 13954 13955 if (auth_generate) 13956 memset(sym_op->auth.digest.data, 0, reference->digest.len); 13957 else 13958 memcpy(sym_op->auth.digest.data, 13959 reference->digest.data, 13960 reference->digest.len); 13961 13962 debug_hexdump(stdout, "digest:", 13963 sym_op->auth.digest.data, 13964 reference->digest.len); 13965 13966 sym_op->auth.data.length = reference->plaintext.len; 13967 sym_op->auth.data.offset = 0; 13968 13969 return 0; 13970 } 13971 13972 static int 13973 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 13974 struct crypto_unittest_params *ut_params, 13975 const struct test_crypto_vector *reference, 13976 unsigned int auth_generate) 13977 { 13978 /* Generate Crypto op data structure */ 13979 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13980 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13981 TEST_ASSERT_NOT_NULL(ut_params->op, 13982 "Failed to allocate pktmbuf offload"); 13983 13984 /* Set crypto operation data parameters */ 13985 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13986 13987 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13988 13989 /* set crypto operation source mbuf */ 13990 sym_op->m_src = ut_params->ibuf; 13991 13992 /* digest */ 13993 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13994 ut_params->ibuf, reference->digest.len); 13995 13996 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13997 "no room to append auth tag"); 13998 13999 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 14000 ut_params->ibuf, reference->ciphertext.len); 14001 14002 if (auth_generate) 14003 memset(sym_op->auth.digest.data, 0, reference->digest.len); 14004 else 14005 memcpy(sym_op->auth.digest.data, 14006 reference->digest.data, 14007 reference->digest.len); 14008 14009 debug_hexdump(stdout, "digest:", 14010 sym_op->auth.digest.data, 14011 reference->digest.len); 14012 14013 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 14014 reference->iv.data, reference->iv.len); 14015 14016 sym_op->cipher.data.length = 0; 14017 sym_op->cipher.data.offset = 0; 14018 14019 sym_op->auth.data.length = reference->plaintext.len; 14020 sym_op->auth.data.offset = 0; 14021 14022 return 0; 14023 } 14024 14025 static int 14026 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 14027 struct crypto_unittest_params *ut_params, 14028 const struct test_crypto_vector *reference, 14029 unsigned int auth_generate) 14030 { 14031 /* Generate Crypto op data structure */ 14032 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 14033 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 14034 TEST_ASSERT_NOT_NULL(ut_params->op, 14035 "Failed to allocate pktmbuf offload"); 14036 14037 /* Set crypto operation data parameters */ 14038 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 14039 14040 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 14041 14042 /* set crypto operation source mbuf */ 14043 sym_op->m_src = ut_params->ibuf; 14044 14045 /* digest */ 14046 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 14047 ut_params->ibuf, reference->digest.len); 14048 14049 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 14050 "no room to append auth tag"); 14051 14052 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 14053 ut_params->ibuf, reference->ciphertext.len); 14054 14055 if (auth_generate) 14056 memset(sym_op->auth.digest.data, 0, reference->digest.len); 14057 else 14058 memcpy(sym_op->auth.digest.data, 14059 reference->digest.data, 14060 reference->digest.len); 14061 14062 debug_hexdump(stdout, "digest:", 14063 sym_op->auth.digest.data, 14064 reference->digest.len); 14065 14066 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 14067 reference->iv.data, reference->iv.len); 14068 14069 sym_op->cipher.data.length = reference->cipher_len; 14070 sym_op->cipher.data.offset = reference->cipher_offset; 14071 14072 sym_op->auth.data.length = reference->plaintext.len; 14073 sym_op->auth.data.offset = reference->auth_offset; 14074 14075 return 0; 14076 } 14077 14078 static int 14079 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 14080 struct crypto_unittest_params *ut_params, 14081 const struct test_crypto_vector *reference) 14082 { 14083 return create_auth_operation(ts_params, ut_params, reference, 0); 14084 } 14085 14086 static int 14087 create_auth_verify_GMAC_operation( 14088 struct crypto_testsuite_params *ts_params, 14089 struct crypto_unittest_params *ut_params, 14090 const struct test_crypto_vector *reference) 14091 { 14092 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 14093 } 14094 14095 static int 14096 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 14097 struct crypto_unittest_params *ut_params, 14098 const struct test_crypto_vector *reference) 14099 { 14100 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 14101 } 14102 14103 static int 14104 test_authentication_verify_fail_when_data_corruption( 14105 struct crypto_testsuite_params *ts_params, 14106 struct crypto_unittest_params *ut_params, 14107 const struct test_crypto_vector *reference, 14108 unsigned int data_corrupted) 14109 { 14110 int retval; 14111 14112 uint8_t *plaintext; 14113 struct rte_cryptodev_info dev_info; 14114 14115 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14116 uint64_t feat_flags = dev_info.feature_flags; 14117 14118 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14119 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14120 printf("Device doesn't support RAW data-path APIs.\n"); 14121 return TEST_SKIPPED; 14122 } 14123 14124 /* Verify the capabilities */ 14125 struct rte_cryptodev_sym_capability_idx cap_idx; 14126 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14127 cap_idx.algo.auth = reference->auth_algo; 14128 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14129 &cap_idx) == NULL) 14130 return TEST_SKIPPED; 14131 14132 14133 /* Create session */ 14134 retval = create_auth_session(ut_params, 14135 ts_params->valid_devs[0], 14136 reference, 14137 RTE_CRYPTO_AUTH_OP_VERIFY); 14138 14139 if (retval == -ENOTSUP) 14140 return TEST_SKIPPED; 14141 if (retval < 0) 14142 return retval; 14143 14144 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14145 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 14146 "Failed to allocate input buffer in mempool"); 14147 14148 /* clear mbuf payload */ 14149 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14150 rte_pktmbuf_tailroom(ut_params->ibuf)); 14151 14152 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14153 reference->plaintext.len); 14154 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 14155 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 14156 14157 debug_hexdump(stdout, "plaintext:", plaintext, 14158 reference->plaintext.len); 14159 14160 /* Create operation */ 14161 retval = create_auth_verify_operation(ts_params, ut_params, reference); 14162 14163 if (retval < 0) 14164 return retval; 14165 14166 if (data_corrupted) 14167 data_corruption(plaintext); 14168 else 14169 tag_corruption(plaintext, reference->plaintext.len); 14170 14171 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 14172 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 14173 ut_params->op); 14174 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 14175 RTE_CRYPTO_OP_STATUS_SUCCESS, 14176 "authentication not failed"); 14177 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14178 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14179 ut_params->op, 0, 1, 0, 0); 14180 else { 14181 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 14182 ut_params->op); 14183 } 14184 if (ut_params->op == NULL) 14185 return 0; 14186 else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) 14187 return 0; 14188 14189 return -1; 14190 } 14191 14192 static int 14193 test_authentication_verify_GMAC_fail_when_corruption( 14194 struct crypto_testsuite_params *ts_params, 14195 struct crypto_unittest_params *ut_params, 14196 const struct test_crypto_vector *reference, 14197 unsigned int data_corrupted) 14198 { 14199 int retval; 14200 uint8_t *plaintext; 14201 struct rte_cryptodev_info dev_info; 14202 14203 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14204 uint64_t feat_flags = dev_info.feature_flags; 14205 14206 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14207 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14208 printf("Device doesn't support RAW data-path APIs.\n"); 14209 return TEST_SKIPPED; 14210 } 14211 14212 /* Verify the capabilities */ 14213 struct rte_cryptodev_sym_capability_idx cap_idx; 14214 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14215 cap_idx.algo.auth = reference->auth_algo; 14216 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14217 &cap_idx) == NULL) 14218 return TEST_SKIPPED; 14219 14220 /* Create session */ 14221 retval = create_auth_cipher_session(ut_params, 14222 ts_params->valid_devs[0], 14223 reference, 14224 RTE_CRYPTO_AUTH_OP_VERIFY, 14225 RTE_CRYPTO_CIPHER_OP_DECRYPT); 14226 if (retval < 0) 14227 return retval; 14228 14229 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14230 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 14231 "Failed to allocate input buffer in mempool"); 14232 14233 /* clear mbuf payload */ 14234 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14235 rte_pktmbuf_tailroom(ut_params->ibuf)); 14236 14237 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14238 reference->plaintext.len); 14239 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 14240 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 14241 14242 debug_hexdump(stdout, "plaintext:", plaintext, 14243 reference->plaintext.len); 14244 14245 /* Create operation */ 14246 retval = create_auth_verify_GMAC_operation(ts_params, 14247 ut_params, 14248 reference); 14249 14250 if (retval < 0) 14251 return retval; 14252 14253 if (data_corrupted) 14254 data_corruption(plaintext); 14255 else 14256 tag_corruption(plaintext, reference->aad.len); 14257 14258 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 14259 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 14260 ut_params->op); 14261 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 14262 RTE_CRYPTO_OP_STATUS_SUCCESS, 14263 "authentication not failed"); 14264 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14265 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14266 ut_params->op, 0, 1, 0, 0); 14267 else { 14268 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 14269 ut_params->op); 14270 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 14271 } 14272 14273 return 0; 14274 } 14275 14276 static int 14277 test_authenticated_decryption_fail_when_corruption( 14278 struct crypto_testsuite_params *ts_params, 14279 struct crypto_unittest_params *ut_params, 14280 const struct test_crypto_vector *reference, 14281 unsigned int data_corrupted) 14282 { 14283 int retval; 14284 14285 uint8_t *ciphertext; 14286 struct rte_cryptodev_info dev_info; 14287 14288 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14289 uint64_t feat_flags = dev_info.feature_flags; 14290 14291 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14292 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14293 printf("Device doesn't support RAW data-path APIs.\n"); 14294 return TEST_SKIPPED; 14295 } 14296 14297 /* Verify the capabilities */ 14298 struct rte_cryptodev_sym_capability_idx cap_idx; 14299 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14300 cap_idx.algo.auth = reference->auth_algo; 14301 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14302 &cap_idx) == NULL) 14303 return TEST_SKIPPED; 14304 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 14305 cap_idx.algo.cipher = reference->crypto_algo; 14306 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14307 &cap_idx) == NULL) 14308 return TEST_SKIPPED; 14309 14310 /* Create session */ 14311 retval = create_auth_cipher_session(ut_params, 14312 ts_params->valid_devs[0], 14313 reference, 14314 RTE_CRYPTO_AUTH_OP_VERIFY, 14315 RTE_CRYPTO_CIPHER_OP_DECRYPT); 14316 14317 if (retval == -ENOTSUP) 14318 return TEST_SKIPPED; 14319 if (retval < 0) 14320 return retval; 14321 14322 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14323 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 14324 "Failed to allocate input buffer in mempool"); 14325 14326 /* clear mbuf payload */ 14327 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14328 rte_pktmbuf_tailroom(ut_params->ibuf)); 14329 14330 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14331 reference->ciphertext.len); 14332 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 14333 memcpy(ciphertext, reference->ciphertext.data, 14334 reference->ciphertext.len); 14335 14336 /* Create operation */ 14337 retval = create_cipher_auth_verify_operation(ts_params, 14338 ut_params, 14339 reference); 14340 14341 if (retval < 0) 14342 return retval; 14343 14344 if (data_corrupted) 14345 data_corruption(ciphertext); 14346 else 14347 tag_corruption(ciphertext, reference->ciphertext.len); 14348 14349 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 14350 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 14351 ut_params->op); 14352 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 14353 RTE_CRYPTO_OP_STATUS_SUCCESS, 14354 "authentication not failed"); 14355 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14356 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14357 ut_params->op, 1, 1, 0, 0); 14358 else { 14359 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 14360 ut_params->op); 14361 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 14362 } 14363 14364 return 0; 14365 } 14366 14367 static int 14368 test_authenticated_encrypt_with_esn( 14369 struct crypto_testsuite_params *ts_params, 14370 struct crypto_unittest_params *ut_params, 14371 const struct test_crypto_vector *reference) 14372 { 14373 int retval; 14374 14375 uint8_t *authciphertext, *plaintext, *auth_tag; 14376 uint16_t plaintext_pad_len; 14377 uint8_t cipher_key[reference->cipher_key.len + 1]; 14378 uint8_t auth_key[reference->auth_key.len + 1]; 14379 struct rte_cryptodev_info dev_info; 14380 14381 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14382 uint64_t feat_flags = dev_info.feature_flags; 14383 14384 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14385 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14386 printf("Device doesn't support RAW data-path APIs.\n"); 14387 return TEST_SKIPPED; 14388 } 14389 14390 /* Verify the capabilities */ 14391 struct rte_cryptodev_sym_capability_idx cap_idx; 14392 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14393 cap_idx.algo.auth = reference->auth_algo; 14394 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14395 &cap_idx) == NULL) 14396 return TEST_SKIPPED; 14397 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 14398 cap_idx.algo.cipher = reference->crypto_algo; 14399 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14400 &cap_idx) == NULL) 14401 return TEST_SKIPPED; 14402 14403 /* Create session */ 14404 memcpy(cipher_key, reference->cipher_key.data, 14405 reference->cipher_key.len); 14406 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 14407 14408 /* Setup Cipher Parameters */ 14409 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 14410 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 14411 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 14412 ut_params->cipher_xform.cipher.key.data = cipher_key; 14413 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 14414 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 14415 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 14416 14417 ut_params->cipher_xform.next = &ut_params->auth_xform; 14418 14419 /* Setup Authentication Parameters */ 14420 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14421 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 14422 ut_params->auth_xform.auth.algo = reference->auth_algo; 14423 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 14424 ut_params->auth_xform.auth.key.data = auth_key; 14425 ut_params->auth_xform.auth.digest_length = reference->digest.len; 14426 ut_params->auth_xform.next = NULL; 14427 14428 /* Create Crypto session*/ 14429 ut_params->sess = rte_cryptodev_sym_session_create( 14430 ts_params->valid_devs[0], &ut_params->cipher_xform, 14431 ts_params->session_mpool); 14432 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 14433 return TEST_SKIPPED; 14434 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 14435 14436 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14437 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 14438 "Failed to allocate input buffer in mempool"); 14439 14440 /* clear mbuf payload */ 14441 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14442 rte_pktmbuf_tailroom(ut_params->ibuf)); 14443 14444 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14445 reference->plaintext.len); 14446 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 14447 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 14448 14449 /* Create operation */ 14450 retval = create_cipher_auth_operation(ts_params, 14451 ut_params, 14452 reference, 0); 14453 14454 if (retval < 0) 14455 return retval; 14456 14457 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 14458 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 14459 ut_params->op); 14460 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14461 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14462 ut_params->op, 1, 1, 0, 0); 14463 else 14464 ut_params->op = process_crypto_request( 14465 ts_params->valid_devs[0], ut_params->op); 14466 14467 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 14468 14469 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 14470 "crypto op processing failed"); 14471 14472 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 14473 14474 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 14475 ut_params->op->sym->auth.data.offset); 14476 auth_tag = authciphertext + plaintext_pad_len; 14477 debug_hexdump(stdout, "ciphertext:", authciphertext, 14478 reference->ciphertext.len); 14479 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 14480 14481 /* Validate obuf */ 14482 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14483 authciphertext, 14484 reference->ciphertext.data, 14485 reference->ciphertext.len, 14486 "Ciphertext data not as expected"); 14487 14488 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14489 auth_tag, 14490 reference->digest.data, 14491 reference->digest.len, 14492 "Generated digest not as expected"); 14493 14494 return TEST_SUCCESS; 14495 14496 } 14497 14498 static int 14499 test_authenticated_decrypt_with_esn( 14500 struct crypto_testsuite_params *ts_params, 14501 struct crypto_unittest_params *ut_params, 14502 const struct test_crypto_vector *reference) 14503 { 14504 int retval; 14505 14506 uint8_t *ciphertext; 14507 uint8_t cipher_key[reference->cipher_key.len + 1]; 14508 uint8_t auth_key[reference->auth_key.len + 1]; 14509 struct rte_cryptodev_info dev_info; 14510 14511 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14512 uint64_t feat_flags = dev_info.feature_flags; 14513 14514 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14515 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14516 printf("Device doesn't support RAW data-path APIs.\n"); 14517 return TEST_SKIPPED; 14518 } 14519 14520 /* Verify the capabilities */ 14521 struct rte_cryptodev_sym_capability_idx cap_idx; 14522 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14523 cap_idx.algo.auth = reference->auth_algo; 14524 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14525 &cap_idx) == NULL) 14526 return TEST_SKIPPED; 14527 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 14528 cap_idx.algo.cipher = reference->crypto_algo; 14529 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14530 &cap_idx) == NULL) 14531 return TEST_SKIPPED; 14532 14533 /* Create session */ 14534 memcpy(cipher_key, reference->cipher_key.data, 14535 reference->cipher_key.len); 14536 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 14537 14538 /* Setup Authentication Parameters */ 14539 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 14540 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 14541 ut_params->auth_xform.auth.algo = reference->auth_algo; 14542 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 14543 ut_params->auth_xform.auth.key.data = auth_key; 14544 ut_params->auth_xform.auth.digest_length = reference->digest.len; 14545 ut_params->auth_xform.next = &ut_params->cipher_xform; 14546 14547 /* Setup Cipher Parameters */ 14548 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 14549 ut_params->cipher_xform.next = NULL; 14550 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 14551 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 14552 ut_params->cipher_xform.cipher.key.data = cipher_key; 14553 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 14554 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 14555 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 14556 14557 /* Create Crypto session*/ 14558 ut_params->sess = rte_cryptodev_sym_session_create( 14559 ts_params->valid_devs[0], &ut_params->auth_xform, 14560 ts_params->session_mpool); 14561 if (ut_params->sess == NULL && rte_errno == ENOTSUP) 14562 return TEST_SKIPPED; 14563 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 14564 14565 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14566 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 14567 "Failed to allocate input buffer in mempool"); 14568 14569 /* clear mbuf payload */ 14570 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14571 rte_pktmbuf_tailroom(ut_params->ibuf)); 14572 14573 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14574 reference->ciphertext.len); 14575 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 14576 memcpy(ciphertext, reference->ciphertext.data, 14577 reference->ciphertext.len); 14578 14579 /* Create operation */ 14580 retval = create_cipher_auth_verify_operation(ts_params, 14581 ut_params, 14582 reference); 14583 14584 if (retval < 0) 14585 return retval; 14586 14587 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 14588 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 14589 ut_params->op); 14590 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14591 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14592 ut_params->op, 1, 1, 0, 0); 14593 else 14594 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 14595 ut_params->op); 14596 14597 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 14598 TEST_ASSERT_EQUAL(ut_params->op->status, 14599 RTE_CRYPTO_OP_STATUS_SUCCESS, 14600 "crypto op processing passed"); 14601 14602 ut_params->obuf = ut_params->op->sym->m_src; 14603 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 14604 14605 return 0; 14606 } 14607 14608 static int 14609 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 14610 const struct aead_test_data *tdata, 14611 void *digest_mem, uint64_t digest_phys) 14612 { 14613 struct crypto_testsuite_params *ts_params = &testsuite_params; 14614 struct crypto_unittest_params *ut_params = &unittest_params; 14615 14616 const unsigned int auth_tag_len = tdata->auth_tag.len; 14617 const unsigned int iv_len = tdata->iv.len; 14618 unsigned int aad_len = tdata->aad.len; 14619 unsigned int aad_len_pad = 0; 14620 14621 /* Generate Crypto op data structure */ 14622 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 14623 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 14624 TEST_ASSERT_NOT_NULL(ut_params->op, 14625 "Failed to allocate symmetric crypto operation struct"); 14626 14627 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 14628 14629 sym_op->aead.digest.data = digest_mem; 14630 14631 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 14632 "no room to append digest"); 14633 14634 sym_op->aead.digest.phys_addr = digest_phys; 14635 14636 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 14637 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 14638 auth_tag_len); 14639 debug_hexdump(stdout, "digest:", 14640 sym_op->aead.digest.data, 14641 auth_tag_len); 14642 } 14643 14644 /* Append aad data */ 14645 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 14646 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 14647 uint8_t *, IV_OFFSET); 14648 14649 /* Copy IV 1 byte after the IV pointer, according to the API */ 14650 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 14651 14652 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 14653 14654 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 14655 ut_params->ibuf, aad_len); 14656 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 14657 "no room to prepend aad"); 14658 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 14659 ut_params->ibuf); 14660 14661 memset(sym_op->aead.aad.data, 0, aad_len); 14662 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 14663 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 14664 14665 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 14666 debug_hexdump(stdout, "aad:", 14667 sym_op->aead.aad.data, aad_len); 14668 } else { 14669 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 14670 uint8_t *, IV_OFFSET); 14671 14672 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 14673 14674 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 14675 14676 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 14677 ut_params->ibuf, aad_len_pad); 14678 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 14679 "no room to prepend aad"); 14680 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 14681 ut_params->ibuf); 14682 14683 memset(sym_op->aead.aad.data, 0, aad_len); 14684 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 14685 14686 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 14687 debug_hexdump(stdout, "aad:", 14688 sym_op->aead.aad.data, aad_len); 14689 } 14690 14691 sym_op->aead.data.length = tdata->plaintext.len; 14692 sym_op->aead.data.offset = aad_len_pad; 14693 14694 return 0; 14695 } 14696 14697 #define SGL_MAX_NO 16 14698 14699 static int 14700 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 14701 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 14702 { 14703 struct crypto_testsuite_params *ts_params = &testsuite_params; 14704 struct crypto_unittest_params *ut_params = &unittest_params; 14705 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 14706 int retval; 14707 int to_trn = 0; 14708 int to_trn_tbl[SGL_MAX_NO]; 14709 int segs = 1; 14710 unsigned int trn_data = 0; 14711 uint8_t *plaintext, *ciphertext, *auth_tag; 14712 struct rte_cryptodev_info dev_info; 14713 14714 /* Verify the capabilities */ 14715 struct rte_cryptodev_sym_capability_idx cap_idx; 14716 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 14717 cap_idx.algo.aead = tdata->algo; 14718 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 14719 &cap_idx) == NULL) 14720 return TEST_SKIPPED; 14721 14722 /* OOP not supported with CPU crypto */ 14723 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 14724 return TEST_SKIPPED; 14725 14726 /* Detailed check for the particular SGL support flag */ 14727 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 14728 if (!oop) { 14729 unsigned int sgl_in = fragsz < tdata->plaintext.len; 14730 if (sgl_in && (!(dev_info.feature_flags & 14731 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 14732 return TEST_SKIPPED; 14733 14734 uint64_t feat_flags = dev_info.feature_flags; 14735 14736 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 14737 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 14738 printf("Device doesn't support RAW data-path APIs.\n"); 14739 return TEST_SKIPPED; 14740 } 14741 } else { 14742 unsigned int sgl_in = fragsz < tdata->plaintext.len; 14743 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 14744 tdata->plaintext.len; 14745 /* Raw data path API does not support OOP */ 14746 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14747 return TEST_SKIPPED; 14748 if (sgl_in && !sgl_out) { 14749 if (!(dev_info.feature_flags & 14750 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 14751 return TEST_SKIPPED; 14752 } else if (!sgl_in && sgl_out) { 14753 if (!(dev_info.feature_flags & 14754 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 14755 return TEST_SKIPPED; 14756 } else if (sgl_in && sgl_out) { 14757 if (!(dev_info.feature_flags & 14758 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 14759 return TEST_SKIPPED; 14760 } 14761 } 14762 14763 if (fragsz > tdata->plaintext.len) 14764 fragsz = tdata->plaintext.len; 14765 14766 uint16_t plaintext_len = fragsz; 14767 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 14768 14769 if (fragsz_oop > tdata->plaintext.len) 14770 frag_size_oop = tdata->plaintext.len; 14771 14772 int ecx = 0; 14773 void *digest_mem = NULL; 14774 14775 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 14776 14777 if (tdata->plaintext.len % fragsz != 0) { 14778 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 14779 return 1; 14780 } else { 14781 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 14782 return 1; 14783 } 14784 14785 /* 14786 * For out-op-place we need to alloc another mbuf 14787 */ 14788 if (oop) { 14789 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14790 rte_pktmbuf_append(ut_params->obuf, 14791 frag_size_oop + prepend_len); 14792 buf_oop = ut_params->obuf; 14793 } 14794 14795 /* Create AEAD session */ 14796 retval = create_aead_session(ts_params->valid_devs[0], 14797 tdata->algo, 14798 RTE_CRYPTO_AEAD_OP_ENCRYPT, 14799 tdata->key.data, tdata->key.len, 14800 tdata->aad.len, tdata->auth_tag.len, 14801 tdata->iv.len); 14802 if (retval < 0) 14803 return retval; 14804 14805 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14806 14807 /* clear mbuf payload */ 14808 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 14809 rte_pktmbuf_tailroom(ut_params->ibuf)); 14810 14811 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14812 plaintext_len); 14813 14814 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 14815 14816 trn_data += plaintext_len; 14817 14818 buf = ut_params->ibuf; 14819 14820 /* 14821 * Loop until no more fragments 14822 */ 14823 14824 while (trn_data < tdata->plaintext.len) { 14825 ++segs; 14826 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 14827 (tdata->plaintext.len - trn_data) : fragsz; 14828 14829 to_trn_tbl[ecx++] = to_trn; 14830 14831 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 14832 buf = buf->next; 14833 14834 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 14835 rte_pktmbuf_tailroom(buf)); 14836 14837 /* OOP */ 14838 if (oop && !fragsz_oop) { 14839 buf_last_oop = buf_oop->next = 14840 rte_pktmbuf_alloc(ts_params->mbuf_pool); 14841 buf_oop = buf_oop->next; 14842 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 14843 0, rte_pktmbuf_tailroom(buf_oop)); 14844 rte_pktmbuf_append(buf_oop, to_trn); 14845 } 14846 14847 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 14848 to_trn); 14849 14850 memcpy(plaintext, tdata->plaintext.data + trn_data, 14851 to_trn); 14852 trn_data += to_trn; 14853 if (trn_data == tdata->plaintext.len) { 14854 if (oop) { 14855 if (!fragsz_oop) 14856 digest_mem = rte_pktmbuf_append(buf_oop, 14857 tdata->auth_tag.len); 14858 } else 14859 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 14860 tdata->auth_tag.len); 14861 } 14862 } 14863 14864 uint64_t digest_phys = 0; 14865 14866 ut_params->ibuf->nb_segs = segs; 14867 14868 segs = 1; 14869 if (fragsz_oop && oop) { 14870 to_trn = 0; 14871 ecx = 0; 14872 14873 if (frag_size_oop == tdata->plaintext.len) { 14874 digest_mem = rte_pktmbuf_append(ut_params->obuf, 14875 tdata->auth_tag.len); 14876 14877 digest_phys = rte_pktmbuf_iova_offset( 14878 ut_params->obuf, 14879 tdata->plaintext.len + prepend_len); 14880 } 14881 14882 trn_data = frag_size_oop; 14883 while (trn_data < tdata->plaintext.len) { 14884 ++segs; 14885 to_trn = 14886 (tdata->plaintext.len - trn_data < 14887 frag_size_oop) ? 14888 (tdata->plaintext.len - trn_data) : 14889 frag_size_oop; 14890 14891 to_trn_tbl[ecx++] = to_trn; 14892 14893 buf_last_oop = buf_oop->next = 14894 rte_pktmbuf_alloc(ts_params->mbuf_pool); 14895 buf_oop = buf_oop->next; 14896 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 14897 0, rte_pktmbuf_tailroom(buf_oop)); 14898 rte_pktmbuf_append(buf_oop, to_trn); 14899 14900 trn_data += to_trn; 14901 14902 if (trn_data == tdata->plaintext.len) { 14903 digest_mem = rte_pktmbuf_append(buf_oop, 14904 tdata->auth_tag.len); 14905 } 14906 } 14907 14908 ut_params->obuf->nb_segs = segs; 14909 } 14910 14911 /* 14912 * Place digest at the end of the last buffer 14913 */ 14914 if (!digest_phys) 14915 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 14916 if (oop && buf_last_oop) 14917 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 14918 14919 if (!digest_mem && !oop) { 14920 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14921 + tdata->auth_tag.len); 14922 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 14923 tdata->plaintext.len); 14924 } 14925 14926 /* Create AEAD operation */ 14927 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 14928 tdata, digest_mem, digest_phys); 14929 14930 if (retval < 0) 14931 return retval; 14932 14933 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 14934 14935 ut_params->op->sym->m_src = ut_params->ibuf; 14936 if (oop) 14937 ut_params->op->sym->m_dst = ut_params->obuf; 14938 14939 /* Process crypto operation */ 14940 if (oop == IN_PLACE && 14941 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 14942 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 14943 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14944 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14945 ut_params->op, 0, 0, 0, 0); 14946 else 14947 TEST_ASSERT_NOT_NULL( 14948 process_crypto_request(ts_params->valid_devs[0], 14949 ut_params->op), "failed to process sym crypto op"); 14950 14951 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 14952 "crypto op processing failed"); 14953 14954 14955 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 14956 uint8_t *, prepend_len); 14957 if (oop) { 14958 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 14959 uint8_t *, prepend_len); 14960 } 14961 14962 if (fragsz_oop) 14963 fragsz = fragsz_oop; 14964 14965 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14966 ciphertext, 14967 tdata->ciphertext.data, 14968 fragsz, 14969 "Ciphertext data not as expected"); 14970 14971 buf = ut_params->op->sym->m_src->next; 14972 if (oop) 14973 buf = ut_params->op->sym->m_dst->next; 14974 14975 unsigned int off = fragsz; 14976 14977 ecx = 0; 14978 while (buf) { 14979 ciphertext = rte_pktmbuf_mtod(buf, 14980 uint8_t *); 14981 14982 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14983 ciphertext, 14984 tdata->ciphertext.data + off, 14985 to_trn_tbl[ecx], 14986 "Ciphertext data not as expected"); 14987 14988 off += to_trn_tbl[ecx++]; 14989 buf = buf->next; 14990 } 14991 14992 auth_tag = digest_mem; 14993 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14994 auth_tag, 14995 tdata->auth_tag.data, 14996 tdata->auth_tag.len, 14997 "Generated auth tag not as expected"); 14998 14999 return 0; 15000 } 15001 15002 static int 15003 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 15004 { 15005 return test_authenticated_encryption_SGL( 15006 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 15007 } 15008 15009 static int 15010 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 15011 { 15012 return test_authenticated_encryption_SGL( 15013 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 15014 } 15015 15016 static int 15017 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 15018 { 15019 return test_authenticated_encryption_SGL( 15020 &gcm_test_case_8, OUT_OF_PLACE, 400, 15021 gcm_test_case_8.plaintext.len); 15022 } 15023 15024 static int 15025 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 15026 { 15027 /* This test is not for OPENSSL PMD */ 15028 if (gbl_driver_id == rte_cryptodev_driver_id_get( 15029 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 15030 return TEST_SKIPPED; 15031 15032 return test_authenticated_encryption_SGL( 15033 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 15034 } 15035 15036 static int 15037 test_authentication_verify_fail_when_data_corrupted( 15038 struct crypto_testsuite_params *ts_params, 15039 struct crypto_unittest_params *ut_params, 15040 const struct test_crypto_vector *reference) 15041 { 15042 return test_authentication_verify_fail_when_data_corruption( 15043 ts_params, ut_params, reference, 1); 15044 } 15045 15046 static int 15047 test_authentication_verify_fail_when_tag_corrupted( 15048 struct crypto_testsuite_params *ts_params, 15049 struct crypto_unittest_params *ut_params, 15050 const struct test_crypto_vector *reference) 15051 { 15052 return test_authentication_verify_fail_when_data_corruption( 15053 ts_params, ut_params, reference, 0); 15054 } 15055 15056 static int 15057 test_authentication_verify_GMAC_fail_when_data_corrupted( 15058 struct crypto_testsuite_params *ts_params, 15059 struct crypto_unittest_params *ut_params, 15060 const struct test_crypto_vector *reference) 15061 { 15062 return test_authentication_verify_GMAC_fail_when_corruption( 15063 ts_params, ut_params, reference, 1); 15064 } 15065 15066 static int 15067 test_authentication_verify_GMAC_fail_when_tag_corrupted( 15068 struct crypto_testsuite_params *ts_params, 15069 struct crypto_unittest_params *ut_params, 15070 const struct test_crypto_vector *reference) 15071 { 15072 return test_authentication_verify_GMAC_fail_when_corruption( 15073 ts_params, ut_params, reference, 0); 15074 } 15075 15076 static int 15077 test_authenticated_decryption_fail_when_data_corrupted( 15078 struct crypto_testsuite_params *ts_params, 15079 struct crypto_unittest_params *ut_params, 15080 const struct test_crypto_vector *reference) 15081 { 15082 return test_authenticated_decryption_fail_when_corruption( 15083 ts_params, ut_params, reference, 1); 15084 } 15085 15086 static int 15087 test_authenticated_decryption_fail_when_tag_corrupted( 15088 struct crypto_testsuite_params *ts_params, 15089 struct crypto_unittest_params *ut_params, 15090 const struct test_crypto_vector *reference) 15091 { 15092 return test_authenticated_decryption_fail_when_corruption( 15093 ts_params, ut_params, reference, 0); 15094 } 15095 15096 static int 15097 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 15098 { 15099 return test_authentication_verify_fail_when_data_corrupted( 15100 &testsuite_params, &unittest_params, 15101 &hmac_sha1_test_crypto_vector); 15102 } 15103 15104 static int 15105 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 15106 { 15107 return test_authentication_verify_fail_when_tag_corrupted( 15108 &testsuite_params, &unittest_params, 15109 &hmac_sha1_test_crypto_vector); 15110 } 15111 15112 static int 15113 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 15114 { 15115 return test_authentication_verify_GMAC_fail_when_data_corrupted( 15116 &testsuite_params, &unittest_params, 15117 &aes128_gmac_test_vector); 15118 } 15119 15120 static int 15121 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 15122 { 15123 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 15124 &testsuite_params, &unittest_params, 15125 &aes128_gmac_test_vector); 15126 } 15127 15128 static int 15129 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 15130 { 15131 return test_authenticated_decryption_fail_when_data_corrupted( 15132 &testsuite_params, 15133 &unittest_params, 15134 &aes128cbc_hmac_sha1_test_vector); 15135 } 15136 15137 static int 15138 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 15139 { 15140 return test_authenticated_decryption_fail_when_tag_corrupted( 15141 &testsuite_params, 15142 &unittest_params, 15143 &aes128cbc_hmac_sha1_test_vector); 15144 } 15145 15146 static int 15147 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 15148 { 15149 return test_authenticated_encrypt_with_esn( 15150 &testsuite_params, 15151 &unittest_params, 15152 &aes128cbc_hmac_sha1_aad_test_vector); 15153 } 15154 15155 static int 15156 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 15157 { 15158 return test_authenticated_decrypt_with_esn( 15159 &testsuite_params, 15160 &unittest_params, 15161 &aes128cbc_hmac_sha1_aad_test_vector); 15162 } 15163 15164 static int 15165 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 15166 { 15167 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 15168 } 15169 15170 static int 15171 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 15172 { 15173 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 15174 } 15175 15176 static int 15177 test_chacha20_poly1305_encrypt_SGL_out_of_place(void) 15178 { 15179 return test_authenticated_encryption_SGL( 15180 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32, 15181 chacha20_poly1305_case_2.plaintext.len); 15182 } 15183 15184 #ifdef RTE_CRYPTO_SCHEDULER 15185 15186 /* global AESNI worker IDs for the scheduler test */ 15187 uint8_t aesni_ids[2]; 15188 15189 static int 15190 scheduler_testsuite_setup(void) 15191 { 15192 uint32_t i = 0; 15193 int32_t nb_devs, ret; 15194 char vdev_args[VDEV_ARGS_SIZE] = {""}; 15195 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 15196 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 15197 uint16_t worker_core_count = 0; 15198 uint16_t socket_id = 0; 15199 15200 if (gbl_driver_id == rte_cryptodev_driver_id_get( 15201 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 15202 15203 /* Identify the Worker Cores 15204 * Use 2 worker cores for the device args 15205 */ 15206 RTE_LCORE_FOREACH_WORKER(i) { 15207 if (worker_core_count > 1) 15208 break; 15209 snprintf(vdev_args, sizeof(vdev_args), 15210 "%s%d", temp_str, i); 15211 strcpy(temp_str, vdev_args); 15212 strlcat(temp_str, ";", sizeof(temp_str)); 15213 worker_core_count++; 15214 socket_id = rte_lcore_to_socket_id(i); 15215 } 15216 if (worker_core_count != 2) { 15217 RTE_LOG(ERR, USER1, 15218 "Cryptodev scheduler test require at least " 15219 "two worker cores to run. " 15220 "Please use the correct coremask.\n"); 15221 return TEST_FAILED; 15222 } 15223 strcpy(temp_str, vdev_args); 15224 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 15225 temp_str, socket_id); 15226 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 15227 nb_devs = rte_cryptodev_device_count_by_driver( 15228 rte_cryptodev_driver_id_get( 15229 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 15230 if (nb_devs < 1) { 15231 ret = rte_vdev_init( 15232 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 15233 vdev_args); 15234 TEST_ASSERT(ret == 0, 15235 "Failed to create instance %u of pmd : %s", 15236 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 15237 } 15238 } 15239 return testsuite_setup(); 15240 } 15241 15242 static int 15243 test_scheduler_attach_worker_op(void) 15244 { 15245 struct crypto_testsuite_params *ts_params = &testsuite_params; 15246 uint8_t sched_id = ts_params->valid_devs[0]; 15247 uint32_t i, nb_devs_attached = 0; 15248 int ret; 15249 char vdev_name[32]; 15250 unsigned int count = rte_cryptodev_count(); 15251 15252 /* create 2 AESNI_MB vdevs on top of existing devices */ 15253 for (i = count; i < count + 2; i++) { 15254 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 15255 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 15256 i); 15257 ret = rte_vdev_init(vdev_name, NULL); 15258 15259 TEST_ASSERT(ret == 0, 15260 "Failed to create instance %u of" 15261 " pmd : %s", 15262 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15263 15264 if (ret < 0) { 15265 RTE_LOG(ERR, USER1, 15266 "Failed to create 2 AESNI MB PMDs.\n"); 15267 return TEST_SKIPPED; 15268 } 15269 } 15270 15271 /* attach 2 AESNI_MB cdevs */ 15272 for (i = count; i < count + 2; i++) { 15273 struct rte_cryptodev_info info; 15274 unsigned int session_size; 15275 15276 rte_cryptodev_info_get(i, &info); 15277 if (info.driver_id != rte_cryptodev_driver_id_get( 15278 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 15279 continue; 15280 15281 session_size = rte_cryptodev_sym_get_private_session_size(i); 15282 /* 15283 * Create the session mempool again, since now there are new devices 15284 * to use the mempool. 15285 */ 15286 if (ts_params->session_mpool) { 15287 rte_mempool_free(ts_params->session_mpool); 15288 ts_params->session_mpool = NULL; 15289 } 15290 15291 if (info.sym.max_nb_sessions != 0 && 15292 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 15293 RTE_LOG(ERR, USER1, 15294 "Device does not support " 15295 "at least %u sessions\n", 15296 MAX_NB_SESSIONS); 15297 return TEST_FAILED; 15298 } 15299 /* 15300 * Create mempool with maximum number of sessions, 15301 * to include the session headers 15302 */ 15303 if (ts_params->session_mpool == NULL) { 15304 ts_params->session_mpool = 15305 rte_cryptodev_sym_session_pool_create( 15306 "test_sess_mp", 15307 MAX_NB_SESSIONS, session_size, 15308 0, 0, SOCKET_ID_ANY); 15309 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 15310 "session mempool allocation failed"); 15311 } 15312 15313 ts_params->qp_conf.mp_session = ts_params->session_mpool; 15314 15315 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 15316 (uint8_t)i); 15317 15318 TEST_ASSERT(ret == 0, 15319 "Failed to attach device %u of pmd : %s", i, 15320 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15321 15322 aesni_ids[nb_devs_attached] = (uint8_t)i; 15323 15324 nb_devs_attached++; 15325 } 15326 15327 return 0; 15328 } 15329 15330 static int 15331 test_scheduler_detach_worker_op(void) 15332 { 15333 struct crypto_testsuite_params *ts_params = &testsuite_params; 15334 uint8_t sched_id = ts_params->valid_devs[0]; 15335 uint32_t i; 15336 int ret; 15337 15338 for (i = 0; i < 2; i++) { 15339 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 15340 aesni_ids[i]); 15341 TEST_ASSERT(ret == 0, 15342 "Failed to detach device %u", aesni_ids[i]); 15343 } 15344 15345 return 0; 15346 } 15347 15348 static int 15349 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 15350 { 15351 struct crypto_testsuite_params *ts_params = &testsuite_params; 15352 uint8_t sched_id = ts_params->valid_devs[0]; 15353 /* set mode */ 15354 return rte_cryptodev_scheduler_mode_set(sched_id, 15355 scheduler_mode); 15356 } 15357 15358 static int 15359 test_scheduler_mode_roundrobin_op(void) 15360 { 15361 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 15362 0, "Failed to set roundrobin mode"); 15363 return 0; 15364 15365 } 15366 15367 static int 15368 test_scheduler_mode_multicore_op(void) 15369 { 15370 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 15371 0, "Failed to set multicore mode"); 15372 15373 return 0; 15374 } 15375 15376 static int 15377 test_scheduler_mode_failover_op(void) 15378 { 15379 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 15380 0, "Failed to set failover mode"); 15381 15382 return 0; 15383 } 15384 15385 static int 15386 test_scheduler_mode_pkt_size_distr_op(void) 15387 { 15388 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 15389 0, "Failed to set pktsize mode"); 15390 15391 return 0; 15392 } 15393 15394 static int 15395 scheduler_multicore_testsuite_setup(void) 15396 { 15397 if (test_scheduler_attach_worker_op() < 0) 15398 return TEST_SKIPPED; 15399 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0) 15400 return TEST_SKIPPED; 15401 return 0; 15402 } 15403 15404 static int 15405 scheduler_roundrobin_testsuite_setup(void) 15406 { 15407 if (test_scheduler_attach_worker_op() < 0) 15408 return TEST_SKIPPED; 15409 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0) 15410 return TEST_SKIPPED; 15411 return 0; 15412 } 15413 15414 static int 15415 scheduler_failover_testsuite_setup(void) 15416 { 15417 if (test_scheduler_attach_worker_op() < 0) 15418 return TEST_SKIPPED; 15419 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0) 15420 return TEST_SKIPPED; 15421 return 0; 15422 } 15423 15424 static int 15425 scheduler_pkt_size_distr_testsuite_setup(void) 15426 { 15427 if (test_scheduler_attach_worker_op() < 0) 15428 return TEST_SKIPPED; 15429 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0) 15430 return TEST_SKIPPED; 15431 return 0; 15432 } 15433 15434 static void 15435 scheduler_mode_testsuite_teardown(void) 15436 { 15437 test_scheduler_detach_worker_op(); 15438 } 15439 15440 #endif /* RTE_CRYPTO_SCHEDULER */ 15441 15442 static struct unit_test_suite end_testsuite = { 15443 .suite_name = NULL, 15444 .setup = NULL, 15445 .teardown = NULL, 15446 .unit_test_suites = NULL 15447 }; 15448 15449 #ifdef RTE_LIB_SECURITY 15450 static struct unit_test_suite ipsec_proto_testsuite = { 15451 .suite_name = "IPsec Proto Unit Test Suite", 15452 .setup = ipsec_proto_testsuite_setup, 15453 .unit_test_cases = { 15454 TEST_CASE_NAMED_WITH_DATA( 15455 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 15456 ut_setup_security, ut_teardown, 15457 test_ipsec_proto_known_vec, &pkt_aes_128_gcm), 15458 TEST_CASE_NAMED_WITH_DATA( 15459 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 15460 ut_setup_security, ut_teardown, 15461 test_ipsec_proto_known_vec, &pkt_aes_192_gcm), 15462 TEST_CASE_NAMED_WITH_DATA( 15463 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 15464 ut_setup_security, ut_teardown, 15465 test_ipsec_proto_known_vec, &pkt_aes_256_gcm), 15466 TEST_CASE_NAMED_WITH_DATA( 15467 "Outbound known vector (ESP tunnel mode IPv4 AES-CCM 256)", 15468 ut_setup_security, ut_teardown, 15469 test_ipsec_proto_known_vec, &pkt_aes_256_ccm), 15470 TEST_CASE_NAMED_WITH_DATA( 15471 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC MD5 [12B ICV])", 15472 ut_setup_security, ut_teardown, 15473 test_ipsec_proto_known_vec, 15474 &pkt_aes_128_cbc_md5), 15475 TEST_CASE_NAMED_WITH_DATA( 15476 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])", 15477 ut_setup_security, ut_teardown, 15478 test_ipsec_proto_known_vec, 15479 &pkt_aes_128_cbc_hmac_sha256), 15480 TEST_CASE_NAMED_WITH_DATA( 15481 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])", 15482 ut_setup_security, ut_teardown, 15483 test_ipsec_proto_known_vec, 15484 &pkt_aes_128_cbc_hmac_sha384), 15485 TEST_CASE_NAMED_WITH_DATA( 15486 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])", 15487 ut_setup_security, ut_teardown, 15488 test_ipsec_proto_known_vec, 15489 &pkt_aes_128_cbc_hmac_sha512), 15490 TEST_CASE_NAMED_WITH_DATA( 15491 "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)", 15492 ut_setup_security, ut_teardown, 15493 test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6), 15494 TEST_CASE_NAMED_WITH_DATA( 15495 "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])", 15496 ut_setup_security, ut_teardown, 15497 test_ipsec_proto_known_vec, 15498 &pkt_aes_128_cbc_hmac_sha256_v6), 15499 TEST_CASE_NAMED_WITH_DATA( 15500 "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])", 15501 ut_setup_security, ut_teardown, 15502 test_ipsec_proto_known_vec, 15503 &pkt_null_aes_xcbc), 15504 TEST_CASE_NAMED_WITH_DATA( 15505 "Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA256 [16B ICV])", 15506 ut_setup_security, ut_teardown, 15507 test_ipsec_proto_known_vec, 15508 &pkt_des_cbc_hmac_sha256), 15509 TEST_CASE_NAMED_WITH_DATA( 15510 "Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA384 [24B ICV])", 15511 ut_setup_security, ut_teardown, 15512 test_ipsec_proto_known_vec, 15513 &pkt_des_cbc_hmac_sha384), 15514 TEST_CASE_NAMED_WITH_DATA( 15515 "Outbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA512 [32B ICV])", 15516 ut_setup_security, ut_teardown, 15517 test_ipsec_proto_known_vec, 15518 &pkt_des_cbc_hmac_sha512), 15519 TEST_CASE_NAMED_WITH_DATA( 15520 "Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA256 [16B ICV])", 15521 ut_setup_security, ut_teardown, 15522 test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha256), 15523 TEST_CASE_NAMED_WITH_DATA( 15524 "Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA384 [24B ICV])", 15525 ut_setup_security, ut_teardown, 15526 test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha384), 15527 TEST_CASE_NAMED_WITH_DATA( 15528 "Outbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA512 [32B ICV])", 15529 ut_setup_security, ut_teardown, 15530 test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha512), 15531 TEST_CASE_NAMED_WITH_DATA( 15532 "Outbound known vector (ESP tunnel mode IPv6 DES-CBC HMAC-SHA256 [16B ICV])", 15533 ut_setup_security, ut_teardown, 15534 test_ipsec_proto_known_vec, 15535 &pkt_des_cbc_hmac_sha256_v6), 15536 TEST_CASE_NAMED_WITH_DATA( 15537 "Outbound known vector (ESP tunnel mode IPv6 3DES-CBC HMAC-SHA256 [16B ICV])", 15538 ut_setup_security, ut_teardown, 15539 test_ipsec_proto_known_vec, &pkt_3des_cbc_hmac_sha256_v6), 15540 TEST_CASE_NAMED_WITH_DATA( 15541 "Outbound known vector (AH tunnel mode IPv4 HMAC-SHA256)", 15542 ut_setup_security, ut_teardown, 15543 test_ipsec_proto_known_vec, 15544 &pkt_ah_tunnel_sha256), 15545 TEST_CASE_NAMED_WITH_DATA( 15546 "Outbound known vector (AH transport mode IPv4 HMAC-SHA256)", 15547 ut_setup_security, ut_teardown, 15548 test_ipsec_proto_known_vec, 15549 &pkt_ah_transport_sha256), 15550 TEST_CASE_NAMED_WITH_DATA( 15551 "Outbound known vector (AH transport mode IPv4 AES-GMAC 128)", 15552 ut_setup_security, ut_teardown, 15553 test_ipsec_proto_known_vec, 15554 &pkt_ah_ipv4_aes_gmac_128), 15555 TEST_CASE_NAMED_WITH_DATA( 15556 "Outbound fragmented packet", 15557 ut_setup_security, ut_teardown, 15558 test_ipsec_proto_known_vec_fragmented, 15559 &pkt_aes_128_gcm_frag), 15560 TEST_CASE_NAMED_WITH_DATA( 15561 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 15562 ut_setup_security, ut_teardown, 15563 test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm), 15564 TEST_CASE_NAMED_WITH_DATA( 15565 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 15566 ut_setup_security, ut_teardown, 15567 test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm), 15568 TEST_CASE_NAMED_WITH_DATA( 15569 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 15570 ut_setup_security, ut_teardown, 15571 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm), 15572 TEST_CASE_NAMED_WITH_DATA( 15573 "Inbound known vector (ESP tunnel mode IPv4 AES-CCM 256)", 15574 ut_setup_security, ut_teardown, 15575 test_ipsec_proto_known_vec_inb, &pkt_aes_256_ccm), 15576 TEST_CASE_NAMED_WITH_DATA( 15577 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)", 15578 ut_setup_security, ut_teardown, 15579 test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null), 15580 TEST_CASE_NAMED_WITH_DATA( 15581 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC MD5 [12B ICV])", 15582 ut_setup_security, ut_teardown, 15583 test_ipsec_proto_known_vec_inb, 15584 &pkt_aes_128_cbc_md5), 15585 TEST_CASE_NAMED_WITH_DATA( 15586 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])", 15587 ut_setup_security, ut_teardown, 15588 test_ipsec_proto_known_vec_inb, 15589 &pkt_aes_128_cbc_hmac_sha256), 15590 TEST_CASE_NAMED_WITH_DATA( 15591 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])", 15592 ut_setup_security, ut_teardown, 15593 test_ipsec_proto_known_vec_inb, 15594 &pkt_aes_128_cbc_hmac_sha384), 15595 TEST_CASE_NAMED_WITH_DATA( 15596 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])", 15597 ut_setup_security, ut_teardown, 15598 test_ipsec_proto_known_vec_inb, 15599 &pkt_aes_128_cbc_hmac_sha512), 15600 TEST_CASE_NAMED_WITH_DATA( 15601 "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)", 15602 ut_setup_security, ut_teardown, 15603 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6), 15604 TEST_CASE_NAMED_WITH_DATA( 15605 "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])", 15606 ut_setup_security, ut_teardown, 15607 test_ipsec_proto_known_vec_inb, 15608 &pkt_aes_128_cbc_hmac_sha256_v6), 15609 TEST_CASE_NAMED_WITH_DATA( 15610 "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])", 15611 ut_setup_security, ut_teardown, 15612 test_ipsec_proto_known_vec_inb, 15613 &pkt_null_aes_xcbc), 15614 TEST_CASE_NAMED_WITH_DATA( 15615 "Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA256 [16B ICV])", 15616 ut_setup_security, ut_teardown, 15617 test_ipsec_proto_known_vec_inb, 15618 &pkt_des_cbc_hmac_sha256), 15619 TEST_CASE_NAMED_WITH_DATA( 15620 "Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA384 [24B ICV])", 15621 ut_setup_security, ut_teardown, 15622 test_ipsec_proto_known_vec_inb, 15623 &pkt_des_cbc_hmac_sha384), 15624 TEST_CASE_NAMED_WITH_DATA( 15625 "Inbound known vector (ESP tunnel mode IPv4 DES-CBC HMAC-SHA512 [32B ICV])", 15626 ut_setup_security, ut_teardown, 15627 test_ipsec_proto_known_vec_inb, 15628 &pkt_des_cbc_hmac_sha512), 15629 TEST_CASE_NAMED_WITH_DATA( 15630 "Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA256 [16B ICV])", 15631 ut_setup_security, ut_teardown, 15632 test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha256), 15633 TEST_CASE_NAMED_WITH_DATA( 15634 "Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA384 [24B ICV])", 15635 ut_setup_security, ut_teardown, 15636 test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha384), 15637 TEST_CASE_NAMED_WITH_DATA( 15638 "Inbound known vector (ESP tunnel mode IPv4 3DES-CBC HMAC-SHA512 [32B ICV])", 15639 ut_setup_security, ut_teardown, 15640 test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha512), 15641 TEST_CASE_NAMED_WITH_DATA( 15642 "Inbound known vector (ESP tunnel mode IPv6 DES-CBC HMAC-SHA256 [16B ICV])", 15643 ut_setup_security, ut_teardown, 15644 test_ipsec_proto_known_vec_inb, 15645 &pkt_des_cbc_hmac_sha256_v6), 15646 TEST_CASE_NAMED_WITH_DATA( 15647 "Inbound known vector (ESP tunnel mode IPv6 3DES-CBC HMAC-SHA256 [16B ICV])", 15648 ut_setup_security, ut_teardown, 15649 test_ipsec_proto_known_vec_inb, &pkt_3des_cbc_hmac_sha256_v6), 15650 TEST_CASE_NAMED_WITH_DATA( 15651 "Inbound known vector (AH tunnel mode IPv4 HMAC-SHA256)", 15652 ut_setup_security, ut_teardown, 15653 test_ipsec_proto_known_vec_inb, 15654 &pkt_ah_tunnel_sha256), 15655 TEST_CASE_NAMED_WITH_DATA( 15656 "Inbound known vector (AH transport mode IPv4 HMAC-SHA256)", 15657 ut_setup_security, ut_teardown, 15658 test_ipsec_proto_known_vec_inb, 15659 &pkt_ah_transport_sha256), 15660 TEST_CASE_NAMED_WITH_DATA( 15661 "Inbound known vector (AH transport mode IPv4 AES-GMAC 128)", 15662 ut_setup_security, ut_teardown, 15663 test_ipsec_proto_known_vec_inb, 15664 &pkt_ah_ipv4_aes_gmac_128), 15665 TEST_CASE_NAMED_ST( 15666 "Combined test alg list", 15667 ut_setup_security, ut_teardown, 15668 test_ipsec_proto_display_list), 15669 TEST_CASE_NAMED_ST( 15670 "Combined test alg list (AH)", 15671 ut_setup_security, ut_teardown, 15672 test_ipsec_proto_ah_tunnel_ipv4), 15673 TEST_CASE_NAMED_ST( 15674 "IV generation", 15675 ut_setup_security, ut_teardown, 15676 test_ipsec_proto_iv_gen), 15677 TEST_CASE_NAMED_ST( 15678 "UDP encapsulation", 15679 ut_setup_security, ut_teardown, 15680 test_ipsec_proto_udp_encap), 15681 TEST_CASE_NAMED_ST( 15682 "UDP encapsulation with custom ports", 15683 ut_setup_security, ut_teardown, 15684 test_ipsec_proto_udp_encap_custom_ports), 15685 TEST_CASE_NAMED_ST( 15686 "UDP encapsulation ports verification test", 15687 ut_setup_security, ut_teardown, 15688 test_ipsec_proto_udp_ports_verify), 15689 TEST_CASE_NAMED_ST( 15690 "SA expiry packets soft", 15691 ut_setup_security, ut_teardown, 15692 test_ipsec_proto_sa_exp_pkts_soft), 15693 TEST_CASE_NAMED_ST( 15694 "SA expiry packets hard", 15695 ut_setup_security, ut_teardown, 15696 test_ipsec_proto_sa_exp_pkts_hard), 15697 TEST_CASE_NAMED_ST( 15698 "Negative test: ICV corruption", 15699 ut_setup_security, ut_teardown, 15700 test_ipsec_proto_err_icv_corrupt), 15701 TEST_CASE_NAMED_ST( 15702 "Tunnel dst addr verification", 15703 ut_setup_security, ut_teardown, 15704 test_ipsec_proto_tunnel_dst_addr_verify), 15705 TEST_CASE_NAMED_ST( 15706 "Tunnel src and dst addr verification", 15707 ut_setup_security, ut_teardown, 15708 test_ipsec_proto_tunnel_src_dst_addr_verify), 15709 TEST_CASE_NAMED_ST( 15710 "Inner IP checksum", 15711 ut_setup_security, ut_teardown, 15712 test_ipsec_proto_inner_ip_csum), 15713 TEST_CASE_NAMED_ST( 15714 "Inner L4 checksum", 15715 ut_setup_security, ut_teardown, 15716 test_ipsec_proto_inner_l4_csum), 15717 TEST_CASE_NAMED_ST( 15718 "Tunnel IPv4 in IPv4", 15719 ut_setup_security, ut_teardown, 15720 test_ipsec_proto_tunnel_v4_in_v4), 15721 TEST_CASE_NAMED_ST( 15722 "Tunnel IPv6 in IPv6", 15723 ut_setup_security, ut_teardown, 15724 test_ipsec_proto_tunnel_v6_in_v6), 15725 TEST_CASE_NAMED_ST( 15726 "Tunnel IPv4 in IPv6", 15727 ut_setup_security, ut_teardown, 15728 test_ipsec_proto_tunnel_v4_in_v6), 15729 TEST_CASE_NAMED_ST( 15730 "Tunnel IPv6 in IPv4", 15731 ut_setup_security, ut_teardown, 15732 test_ipsec_proto_tunnel_v6_in_v4), 15733 TEST_CASE_NAMED_ST( 15734 "Transport IPv4", 15735 ut_setup_security, ut_teardown, 15736 test_ipsec_proto_transport_v4), 15737 TEST_CASE_NAMED_ST( 15738 "AH transport IPv4", 15739 ut_setup_security, ut_teardown, 15740 test_ipsec_proto_ah_transport_ipv4), 15741 TEST_CASE_NAMED_ST( 15742 "Transport l4 checksum", 15743 ut_setup_security, ut_teardown, 15744 test_ipsec_proto_transport_l4_csum), 15745 TEST_CASE_NAMED_ST( 15746 "Statistics: success", 15747 ut_setup_security, ut_teardown, 15748 test_ipsec_proto_stats), 15749 TEST_CASE_NAMED_ST( 15750 "Fragmented packet", 15751 ut_setup_security, ut_teardown, 15752 test_ipsec_proto_pkt_fragment), 15753 TEST_CASE_NAMED_ST( 15754 "Tunnel header copy DF (inner 0)", 15755 ut_setup_security, ut_teardown, 15756 test_ipsec_proto_copy_df_inner_0), 15757 TEST_CASE_NAMED_ST( 15758 "Tunnel header copy DF (inner 1)", 15759 ut_setup_security, ut_teardown, 15760 test_ipsec_proto_copy_df_inner_1), 15761 TEST_CASE_NAMED_ST( 15762 "Tunnel header set DF 0 (inner 1)", 15763 ut_setup_security, ut_teardown, 15764 test_ipsec_proto_set_df_0_inner_1), 15765 TEST_CASE_NAMED_ST( 15766 "Tunnel header set DF 1 (inner 0)", 15767 ut_setup_security, ut_teardown, 15768 test_ipsec_proto_set_df_1_inner_0), 15769 TEST_CASE_NAMED_ST( 15770 "Tunnel header IPv4 copy DSCP (inner 0)", 15771 ut_setup_security, ut_teardown, 15772 test_ipsec_proto_ipv4_copy_dscp_inner_0), 15773 TEST_CASE_NAMED_ST( 15774 "Tunnel header IPv4 copy DSCP (inner 1)", 15775 ut_setup_security, ut_teardown, 15776 test_ipsec_proto_ipv4_copy_dscp_inner_1), 15777 TEST_CASE_NAMED_ST( 15778 "Tunnel header IPv4 set DSCP 0 (inner 1)", 15779 ut_setup_security, ut_teardown, 15780 test_ipsec_proto_ipv4_set_dscp_0_inner_1), 15781 TEST_CASE_NAMED_ST( 15782 "Tunnel header IPv4 set DSCP 1 (inner 0)", 15783 ut_setup_security, ut_teardown, 15784 test_ipsec_proto_ipv4_set_dscp_1_inner_0), 15785 TEST_CASE_NAMED_ST( 15786 "Tunnel header IPv6 copy DSCP (inner 0)", 15787 ut_setup_security, ut_teardown, 15788 test_ipsec_proto_ipv6_copy_dscp_inner_0), 15789 TEST_CASE_NAMED_ST( 15790 "Tunnel header IPv6 copy DSCP (inner 1)", 15791 ut_setup_security, ut_teardown, 15792 test_ipsec_proto_ipv6_copy_dscp_inner_1), 15793 TEST_CASE_NAMED_ST( 15794 "Tunnel header IPv6 set DSCP 0 (inner 1)", 15795 ut_setup_security, ut_teardown, 15796 test_ipsec_proto_ipv6_set_dscp_0_inner_1), 15797 TEST_CASE_NAMED_ST( 15798 "Tunnel header IPv6 set DSCP 1 (inner 0)", 15799 ut_setup_security, ut_teardown, 15800 test_ipsec_proto_ipv6_set_dscp_1_inner_0), 15801 TEST_CASE_NAMED_WITH_DATA( 15802 "Antireplay with window size 1024", 15803 ut_setup_security, ut_teardown, 15804 test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm), 15805 TEST_CASE_NAMED_WITH_DATA( 15806 "Antireplay with window size 2048", 15807 ut_setup_security, ut_teardown, 15808 test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm), 15809 TEST_CASE_NAMED_WITH_DATA( 15810 "Antireplay with window size 4096", 15811 ut_setup_security, ut_teardown, 15812 test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm), 15813 TEST_CASE_NAMED_WITH_DATA( 15814 "ESN and Antireplay with window size 1024", 15815 ut_setup_security, ut_teardown, 15816 test_ipsec_proto_pkt_esn_antireplay1024, 15817 &pkt_aes_128_gcm), 15818 TEST_CASE_NAMED_WITH_DATA( 15819 "ESN and Antireplay with window size 2048", 15820 ut_setup_security, ut_teardown, 15821 test_ipsec_proto_pkt_esn_antireplay2048, 15822 &pkt_aes_128_gcm), 15823 TEST_CASE_NAMED_WITH_DATA( 15824 "ESN and Antireplay with window size 4096", 15825 ut_setup_security, ut_teardown, 15826 test_ipsec_proto_pkt_esn_antireplay4096, 15827 &pkt_aes_128_gcm), 15828 TEST_CASE_NAMED_ST( 15829 "Tunnel header IPv4 decrement inner TTL", 15830 ut_setup_security, ut_teardown, 15831 test_ipsec_proto_ipv4_ttl_decrement), 15832 TEST_CASE_NAMED_ST( 15833 "Tunnel header IPv6 decrement inner hop limit", 15834 ut_setup_security, ut_teardown, 15835 test_ipsec_proto_ipv6_hop_limit_decrement), 15836 TEST_CASE_NAMED_ST( 15837 "Multi-segmented mode", 15838 ut_setup_security, ut_teardown, 15839 test_ipsec_proto_sgl), 15840 TEST_CASES_END() /**< NULL terminate unit test array */ 15841 } 15842 }; 15843 15844 static struct unit_test_suite pdcp_proto_testsuite = { 15845 .suite_name = "PDCP Proto Unit Test Suite", 15846 .setup = pdcp_proto_testsuite_setup, 15847 .unit_test_cases = { 15848 TEST_CASE_ST(ut_setup_security, ut_teardown, 15849 test_PDCP_PROTO_all), 15850 TEST_CASES_END() /**< NULL terminate unit test array */ 15851 } 15852 }; 15853 15854 #define ADD_UPLINK_TESTCASE(data) \ 15855 TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security, \ 15856 ut_teardown, test_docsis_proto_uplink, (const void *) &data), \ 15857 15858 #define ADD_DOWNLINK_TESTCASE(data) \ 15859 TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security, \ 15860 ut_teardown, test_docsis_proto_downlink, (const void *) &data), \ 15861 15862 static struct unit_test_suite docsis_proto_testsuite = { 15863 .suite_name = "DOCSIS Proto Unit Test Suite", 15864 .setup = docsis_proto_testsuite_setup, 15865 .unit_test_cases = { 15866 /* Uplink */ 15867 ADD_UPLINK_TESTCASE(docsis_test_case_1) 15868 ADD_UPLINK_TESTCASE(docsis_test_case_2) 15869 ADD_UPLINK_TESTCASE(docsis_test_case_3) 15870 ADD_UPLINK_TESTCASE(docsis_test_case_4) 15871 ADD_UPLINK_TESTCASE(docsis_test_case_5) 15872 ADD_UPLINK_TESTCASE(docsis_test_case_6) 15873 ADD_UPLINK_TESTCASE(docsis_test_case_7) 15874 ADD_UPLINK_TESTCASE(docsis_test_case_8) 15875 ADD_UPLINK_TESTCASE(docsis_test_case_9) 15876 ADD_UPLINK_TESTCASE(docsis_test_case_10) 15877 ADD_UPLINK_TESTCASE(docsis_test_case_11) 15878 ADD_UPLINK_TESTCASE(docsis_test_case_12) 15879 ADD_UPLINK_TESTCASE(docsis_test_case_13) 15880 ADD_UPLINK_TESTCASE(docsis_test_case_14) 15881 ADD_UPLINK_TESTCASE(docsis_test_case_15) 15882 ADD_UPLINK_TESTCASE(docsis_test_case_16) 15883 ADD_UPLINK_TESTCASE(docsis_test_case_17) 15884 ADD_UPLINK_TESTCASE(docsis_test_case_18) 15885 ADD_UPLINK_TESTCASE(docsis_test_case_19) 15886 ADD_UPLINK_TESTCASE(docsis_test_case_20) 15887 ADD_UPLINK_TESTCASE(docsis_test_case_21) 15888 ADD_UPLINK_TESTCASE(docsis_test_case_22) 15889 ADD_UPLINK_TESTCASE(docsis_test_case_23) 15890 ADD_UPLINK_TESTCASE(docsis_test_case_24) 15891 ADD_UPLINK_TESTCASE(docsis_test_case_25) 15892 ADD_UPLINK_TESTCASE(docsis_test_case_26) 15893 /* Downlink */ 15894 ADD_DOWNLINK_TESTCASE(docsis_test_case_1) 15895 ADD_DOWNLINK_TESTCASE(docsis_test_case_2) 15896 ADD_DOWNLINK_TESTCASE(docsis_test_case_3) 15897 ADD_DOWNLINK_TESTCASE(docsis_test_case_4) 15898 ADD_DOWNLINK_TESTCASE(docsis_test_case_5) 15899 ADD_DOWNLINK_TESTCASE(docsis_test_case_6) 15900 ADD_DOWNLINK_TESTCASE(docsis_test_case_7) 15901 ADD_DOWNLINK_TESTCASE(docsis_test_case_8) 15902 ADD_DOWNLINK_TESTCASE(docsis_test_case_9) 15903 ADD_DOWNLINK_TESTCASE(docsis_test_case_10) 15904 ADD_DOWNLINK_TESTCASE(docsis_test_case_11) 15905 ADD_DOWNLINK_TESTCASE(docsis_test_case_12) 15906 ADD_DOWNLINK_TESTCASE(docsis_test_case_13) 15907 ADD_DOWNLINK_TESTCASE(docsis_test_case_14) 15908 ADD_DOWNLINK_TESTCASE(docsis_test_case_15) 15909 ADD_DOWNLINK_TESTCASE(docsis_test_case_16) 15910 ADD_DOWNLINK_TESTCASE(docsis_test_case_17) 15911 ADD_DOWNLINK_TESTCASE(docsis_test_case_18) 15912 ADD_DOWNLINK_TESTCASE(docsis_test_case_19) 15913 ADD_DOWNLINK_TESTCASE(docsis_test_case_20) 15914 ADD_DOWNLINK_TESTCASE(docsis_test_case_21) 15915 ADD_DOWNLINK_TESTCASE(docsis_test_case_22) 15916 ADD_DOWNLINK_TESTCASE(docsis_test_case_23) 15917 ADD_DOWNLINK_TESTCASE(docsis_test_case_24) 15918 ADD_DOWNLINK_TESTCASE(docsis_test_case_25) 15919 ADD_DOWNLINK_TESTCASE(docsis_test_case_26) 15920 TEST_CASES_END() /**< NULL terminate unit test array */ 15921 } 15922 }; 15923 #endif 15924 15925 static struct unit_test_suite cryptodev_gen_testsuite = { 15926 .suite_name = "Crypto General Unit Test Suite", 15927 .setup = crypto_gen_testsuite_setup, 15928 .unit_test_cases = { 15929 TEST_CASE_ST(ut_setup, ut_teardown, 15930 test_device_configure_invalid_dev_id), 15931 TEST_CASE_ST(ut_setup, ut_teardown, 15932 test_queue_pair_descriptor_setup), 15933 TEST_CASE_ST(ut_setup, ut_teardown, 15934 test_device_configure_invalid_queue_pair_ids), 15935 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 15936 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup), 15937 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup), 15938 TEST_CASES_END() /**< NULL terminate unit test array */ 15939 } 15940 }; 15941 15942 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = { 15943 .suite_name = "Negative HMAC SHA1 Unit Test Suite", 15944 .setup = negative_hmac_sha1_testsuite_setup, 15945 .unit_test_cases = { 15946 /** Negative tests */ 15947 TEST_CASE_ST(ut_setup, ut_teardown, 15948 authentication_verify_HMAC_SHA1_fail_data_corrupt), 15949 TEST_CASE_ST(ut_setup, ut_teardown, 15950 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 15951 TEST_CASE_ST(ut_setup, ut_teardown, 15952 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 15953 TEST_CASE_ST(ut_setup, ut_teardown, 15954 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 15955 15956 TEST_CASES_END() /**< NULL terminate unit test array */ 15957 } 15958 }; 15959 15960 static struct unit_test_suite cryptodev_multi_session_testsuite = { 15961 .suite_name = "Multi Session Unit Test Suite", 15962 .setup = multi_session_testsuite_setup, 15963 .unit_test_cases = { 15964 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 15965 TEST_CASE_ST(ut_setup, ut_teardown, 15966 test_multi_session_random_usage), 15967 15968 TEST_CASES_END() /**< NULL terminate unit test array */ 15969 } 15970 }; 15971 15972 static struct unit_test_suite cryptodev_null_testsuite = { 15973 .suite_name = "NULL Test Suite", 15974 .setup = null_testsuite_setup, 15975 .unit_test_cases = { 15976 TEST_CASE_ST(ut_setup, ut_teardown, 15977 test_null_invalid_operation), 15978 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 15979 TEST_CASES_END() 15980 } 15981 }; 15982 15983 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = { 15984 .suite_name = "AES CCM Authenticated Test Suite", 15985 .setup = aes_ccm_auth_testsuite_setup, 15986 .unit_test_cases = { 15987 /** AES CCM Authenticated Encryption 128 bits key*/ 15988 TEST_CASE_ST(ut_setup, ut_teardown, 15989 test_AES_CCM_authenticated_encryption_test_case_128_1), 15990 TEST_CASE_ST(ut_setup, ut_teardown, 15991 test_AES_CCM_authenticated_encryption_test_case_128_2), 15992 TEST_CASE_ST(ut_setup, ut_teardown, 15993 test_AES_CCM_authenticated_encryption_test_case_128_3), 15994 15995 /** AES CCM Authenticated Decryption 128 bits key*/ 15996 TEST_CASE_ST(ut_setup, ut_teardown, 15997 test_AES_CCM_authenticated_decryption_test_case_128_1), 15998 TEST_CASE_ST(ut_setup, ut_teardown, 15999 test_AES_CCM_authenticated_decryption_test_case_128_2), 16000 TEST_CASE_ST(ut_setup, ut_teardown, 16001 test_AES_CCM_authenticated_decryption_test_case_128_3), 16002 16003 /** AES CCM Authenticated Encryption 192 bits key */ 16004 TEST_CASE_ST(ut_setup, ut_teardown, 16005 test_AES_CCM_authenticated_encryption_test_case_192_1), 16006 TEST_CASE_ST(ut_setup, ut_teardown, 16007 test_AES_CCM_authenticated_encryption_test_case_192_2), 16008 TEST_CASE_ST(ut_setup, ut_teardown, 16009 test_AES_CCM_authenticated_encryption_test_case_192_3), 16010 16011 /** AES CCM Authenticated Decryption 192 bits key*/ 16012 TEST_CASE_ST(ut_setup, ut_teardown, 16013 test_AES_CCM_authenticated_decryption_test_case_192_1), 16014 TEST_CASE_ST(ut_setup, ut_teardown, 16015 test_AES_CCM_authenticated_decryption_test_case_192_2), 16016 TEST_CASE_ST(ut_setup, ut_teardown, 16017 test_AES_CCM_authenticated_decryption_test_case_192_3), 16018 16019 /** AES CCM Authenticated Encryption 256 bits key */ 16020 TEST_CASE_ST(ut_setup, ut_teardown, 16021 test_AES_CCM_authenticated_encryption_test_case_256_1), 16022 TEST_CASE_ST(ut_setup, ut_teardown, 16023 test_AES_CCM_authenticated_encryption_test_case_256_2), 16024 TEST_CASE_ST(ut_setup, ut_teardown, 16025 test_AES_CCM_authenticated_encryption_test_case_256_3), 16026 16027 /** AES CCM Authenticated Decryption 256 bits key*/ 16028 TEST_CASE_ST(ut_setup, ut_teardown, 16029 test_AES_CCM_authenticated_decryption_test_case_256_1), 16030 TEST_CASE_ST(ut_setup, ut_teardown, 16031 test_AES_CCM_authenticated_decryption_test_case_256_2), 16032 TEST_CASE_ST(ut_setup, ut_teardown, 16033 test_AES_CCM_authenticated_decryption_test_case_256_3), 16034 TEST_CASES_END() 16035 } 16036 }; 16037 16038 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = { 16039 .suite_name = "AES GCM Authenticated Test Suite", 16040 .setup = aes_gcm_auth_testsuite_setup, 16041 .unit_test_cases = { 16042 /** AES GCM Authenticated Encryption */ 16043 TEST_CASE_ST(ut_setup, ut_teardown, 16044 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 16045 TEST_CASE_ST(ut_setup, ut_teardown, 16046 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 16047 TEST_CASE_ST(ut_setup, ut_teardown, 16048 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 16049 TEST_CASE_ST(ut_setup, ut_teardown, 16050 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 16051 TEST_CASE_ST(ut_setup, ut_teardown, 16052 test_AES_GCM_authenticated_encryption_test_case_1), 16053 TEST_CASE_ST(ut_setup, ut_teardown, 16054 test_AES_GCM_authenticated_encryption_test_case_2), 16055 TEST_CASE_ST(ut_setup, ut_teardown, 16056 test_AES_GCM_authenticated_encryption_test_case_3), 16057 TEST_CASE_ST(ut_setup, ut_teardown, 16058 test_AES_GCM_authenticated_encryption_test_case_4), 16059 TEST_CASE_ST(ut_setup, ut_teardown, 16060 test_AES_GCM_authenticated_encryption_test_case_5), 16061 TEST_CASE_ST(ut_setup, ut_teardown, 16062 test_AES_GCM_authenticated_encryption_test_case_6), 16063 TEST_CASE_ST(ut_setup, ut_teardown, 16064 test_AES_GCM_authenticated_encryption_test_case_7), 16065 TEST_CASE_ST(ut_setup, ut_teardown, 16066 test_AES_GCM_authenticated_encryption_test_case_8), 16067 TEST_CASE_ST(ut_setup, ut_teardown, 16068 test_AES_GCM_J0_authenticated_encryption_test_case_1), 16069 16070 /** AES GCM Authenticated Decryption */ 16071 TEST_CASE_ST(ut_setup, ut_teardown, 16072 test_AES_GCM_authenticated_decryption_test_case_1), 16073 TEST_CASE_ST(ut_setup, ut_teardown, 16074 test_AES_GCM_authenticated_decryption_test_case_2), 16075 TEST_CASE_ST(ut_setup, ut_teardown, 16076 test_AES_GCM_authenticated_decryption_test_case_3), 16077 TEST_CASE_ST(ut_setup, ut_teardown, 16078 test_AES_GCM_authenticated_decryption_test_case_4), 16079 TEST_CASE_ST(ut_setup, ut_teardown, 16080 test_AES_GCM_authenticated_decryption_test_case_5), 16081 TEST_CASE_ST(ut_setup, ut_teardown, 16082 test_AES_GCM_authenticated_decryption_test_case_6), 16083 TEST_CASE_ST(ut_setup, ut_teardown, 16084 test_AES_GCM_authenticated_decryption_test_case_7), 16085 TEST_CASE_ST(ut_setup, ut_teardown, 16086 test_AES_GCM_authenticated_decryption_test_case_8), 16087 TEST_CASE_ST(ut_setup, ut_teardown, 16088 test_AES_GCM_J0_authenticated_decryption_test_case_1), 16089 16090 /** AES GCM Authenticated Encryption 192 bits key */ 16091 TEST_CASE_ST(ut_setup, ut_teardown, 16092 test_AES_GCM_auth_encryption_test_case_192_1), 16093 TEST_CASE_ST(ut_setup, ut_teardown, 16094 test_AES_GCM_auth_encryption_test_case_192_2), 16095 TEST_CASE_ST(ut_setup, ut_teardown, 16096 test_AES_GCM_auth_encryption_test_case_192_3), 16097 TEST_CASE_ST(ut_setup, ut_teardown, 16098 test_AES_GCM_auth_encryption_test_case_192_4), 16099 TEST_CASE_ST(ut_setup, ut_teardown, 16100 test_AES_GCM_auth_encryption_test_case_192_5), 16101 TEST_CASE_ST(ut_setup, ut_teardown, 16102 test_AES_GCM_auth_encryption_test_case_192_6), 16103 TEST_CASE_ST(ut_setup, ut_teardown, 16104 test_AES_GCM_auth_encryption_test_case_192_7), 16105 16106 /** AES GCM Authenticated Decryption 192 bits key */ 16107 TEST_CASE_ST(ut_setup, ut_teardown, 16108 test_AES_GCM_auth_decryption_test_case_192_1), 16109 TEST_CASE_ST(ut_setup, ut_teardown, 16110 test_AES_GCM_auth_decryption_test_case_192_2), 16111 TEST_CASE_ST(ut_setup, ut_teardown, 16112 test_AES_GCM_auth_decryption_test_case_192_3), 16113 TEST_CASE_ST(ut_setup, ut_teardown, 16114 test_AES_GCM_auth_decryption_test_case_192_4), 16115 TEST_CASE_ST(ut_setup, ut_teardown, 16116 test_AES_GCM_auth_decryption_test_case_192_5), 16117 TEST_CASE_ST(ut_setup, ut_teardown, 16118 test_AES_GCM_auth_decryption_test_case_192_6), 16119 TEST_CASE_ST(ut_setup, ut_teardown, 16120 test_AES_GCM_auth_decryption_test_case_192_7), 16121 16122 /** AES GCM Authenticated Encryption 256 bits key */ 16123 TEST_CASE_ST(ut_setup, ut_teardown, 16124 test_AES_GCM_auth_encryption_test_case_256_1), 16125 TEST_CASE_ST(ut_setup, ut_teardown, 16126 test_AES_GCM_auth_encryption_test_case_256_2), 16127 TEST_CASE_ST(ut_setup, ut_teardown, 16128 test_AES_GCM_auth_encryption_test_case_256_3), 16129 TEST_CASE_ST(ut_setup, ut_teardown, 16130 test_AES_GCM_auth_encryption_test_case_256_4), 16131 TEST_CASE_ST(ut_setup, ut_teardown, 16132 test_AES_GCM_auth_encryption_test_case_256_5), 16133 TEST_CASE_ST(ut_setup, ut_teardown, 16134 test_AES_GCM_auth_encryption_test_case_256_6), 16135 TEST_CASE_ST(ut_setup, ut_teardown, 16136 test_AES_GCM_auth_encryption_test_case_256_7), 16137 16138 /** AES GCM Authenticated Decryption 256 bits key */ 16139 TEST_CASE_ST(ut_setup, ut_teardown, 16140 test_AES_GCM_auth_decryption_test_case_256_1), 16141 TEST_CASE_ST(ut_setup, ut_teardown, 16142 test_AES_GCM_auth_decryption_test_case_256_2), 16143 TEST_CASE_ST(ut_setup, ut_teardown, 16144 test_AES_GCM_auth_decryption_test_case_256_3), 16145 TEST_CASE_ST(ut_setup, ut_teardown, 16146 test_AES_GCM_auth_decryption_test_case_256_4), 16147 TEST_CASE_ST(ut_setup, ut_teardown, 16148 test_AES_GCM_auth_decryption_test_case_256_5), 16149 TEST_CASE_ST(ut_setup, ut_teardown, 16150 test_AES_GCM_auth_decryption_test_case_256_6), 16151 TEST_CASE_ST(ut_setup, ut_teardown, 16152 test_AES_GCM_auth_decryption_test_case_256_7), 16153 16154 /** AES GCM Authenticated Encryption big aad size */ 16155 TEST_CASE_ST(ut_setup, ut_teardown, 16156 test_AES_GCM_auth_encryption_test_case_aad_1), 16157 TEST_CASE_ST(ut_setup, ut_teardown, 16158 test_AES_GCM_auth_encryption_test_case_aad_2), 16159 16160 /** AES GCM Authenticated Decryption big aad size */ 16161 TEST_CASE_ST(ut_setup, ut_teardown, 16162 test_AES_GCM_auth_decryption_test_case_aad_1), 16163 TEST_CASE_ST(ut_setup, ut_teardown, 16164 test_AES_GCM_auth_decryption_test_case_aad_2), 16165 16166 /** Out of place tests */ 16167 TEST_CASE_ST(ut_setup, ut_teardown, 16168 test_AES_GCM_authenticated_encryption_oop_test_case_1), 16169 TEST_CASE_ST(ut_setup, ut_teardown, 16170 test_AES_GCM_authenticated_decryption_oop_test_case_1), 16171 16172 /** Session-less tests */ 16173 TEST_CASE_ST(ut_setup, ut_teardown, 16174 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 16175 TEST_CASE_ST(ut_setup, ut_teardown, 16176 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 16177 16178 TEST_CASES_END() 16179 } 16180 }; 16181 16182 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = { 16183 .suite_name = "AES GMAC Authentication Test Suite", 16184 .setup = aes_gmac_auth_testsuite_setup, 16185 .unit_test_cases = { 16186 TEST_CASE_ST(ut_setup, ut_teardown, 16187 test_AES_GMAC_authentication_test_case_1), 16188 TEST_CASE_ST(ut_setup, ut_teardown, 16189 test_AES_GMAC_authentication_verify_test_case_1), 16190 TEST_CASE_ST(ut_setup, ut_teardown, 16191 test_AES_GMAC_authentication_test_case_2), 16192 TEST_CASE_ST(ut_setup, ut_teardown, 16193 test_AES_GMAC_authentication_verify_test_case_2), 16194 TEST_CASE_ST(ut_setup, ut_teardown, 16195 test_AES_GMAC_authentication_test_case_3), 16196 TEST_CASE_ST(ut_setup, ut_teardown, 16197 test_AES_GMAC_authentication_verify_test_case_3), 16198 TEST_CASE_ST(ut_setup, ut_teardown, 16199 test_AES_GMAC_authentication_test_case_4), 16200 TEST_CASE_ST(ut_setup, ut_teardown, 16201 test_AES_GMAC_authentication_verify_test_case_4), 16202 TEST_CASE_ST(ut_setup, ut_teardown, 16203 test_AES_GMAC_authentication_SGL_40B), 16204 TEST_CASE_ST(ut_setup, ut_teardown, 16205 test_AES_GMAC_authentication_SGL_80B), 16206 TEST_CASE_ST(ut_setup, ut_teardown, 16207 test_AES_GMAC_authentication_SGL_2048B), 16208 TEST_CASE_ST(ut_setup, ut_teardown, 16209 test_AES_GMAC_authentication_SGL_2047B), 16210 16211 TEST_CASES_END() 16212 } 16213 }; 16214 16215 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = { 16216 .suite_name = "Chacha20-Poly1305 Test Suite", 16217 .setup = chacha20_poly1305_testsuite_setup, 16218 .unit_test_cases = { 16219 TEST_CASE_ST(ut_setup, ut_teardown, 16220 test_chacha20_poly1305_encrypt_test_case_rfc8439), 16221 TEST_CASE_ST(ut_setup, ut_teardown, 16222 test_chacha20_poly1305_decrypt_test_case_rfc8439), 16223 TEST_CASE_ST(ut_setup, ut_teardown, 16224 test_chacha20_poly1305_encrypt_SGL_out_of_place), 16225 TEST_CASES_END() 16226 } 16227 }; 16228 16229 static struct unit_test_suite cryptodev_snow3g_testsuite = { 16230 .suite_name = "SNOW 3G Test Suite", 16231 .setup = snow3g_testsuite_setup, 16232 .unit_test_cases = { 16233 /** SNOW 3G encrypt only (UEA2) */ 16234 TEST_CASE_ST(ut_setup, ut_teardown, 16235 test_snow3g_encryption_test_case_1), 16236 TEST_CASE_ST(ut_setup, ut_teardown, 16237 test_snow3g_encryption_test_case_2), 16238 TEST_CASE_ST(ut_setup, ut_teardown, 16239 test_snow3g_encryption_test_case_3), 16240 TEST_CASE_ST(ut_setup, ut_teardown, 16241 test_snow3g_encryption_test_case_4), 16242 TEST_CASE_ST(ut_setup, ut_teardown, 16243 test_snow3g_encryption_test_case_5), 16244 16245 TEST_CASE_ST(ut_setup, ut_teardown, 16246 test_snow3g_encryption_test_case_1_oop), 16247 TEST_CASE_ST(ut_setup, ut_teardown, 16248 test_snow3g_encryption_test_case_1_oop_sgl), 16249 TEST_CASE_ST(ut_setup, ut_teardown, 16250 test_snow3g_encryption_test_case_1_oop_lb_in_sgl_out), 16251 TEST_CASE_ST(ut_setup, ut_teardown, 16252 test_snow3g_encryption_test_case_1_oop_sgl_in_lb_out), 16253 TEST_CASE_ST(ut_setup, ut_teardown, 16254 test_snow3g_encryption_test_case_1_offset_oop), 16255 TEST_CASE_ST(ut_setup, ut_teardown, 16256 test_snow3g_decryption_test_case_1_oop), 16257 16258 /** SNOW 3G generate auth, then encrypt (UEA2) */ 16259 TEST_CASE_ST(ut_setup, ut_teardown, 16260 test_snow3g_auth_cipher_test_case_1), 16261 TEST_CASE_ST(ut_setup, ut_teardown, 16262 test_snow3g_auth_cipher_test_case_2), 16263 TEST_CASE_ST(ut_setup, ut_teardown, 16264 test_snow3g_auth_cipher_test_case_2_oop), 16265 TEST_CASE_ST(ut_setup, ut_teardown, 16266 test_snow3g_auth_cipher_part_digest_enc), 16267 TEST_CASE_ST(ut_setup, ut_teardown, 16268 test_snow3g_auth_cipher_part_digest_enc_oop), 16269 TEST_CASE_ST(ut_setup, ut_teardown, 16270 test_snow3g_auth_cipher_test_case_3_sgl), 16271 TEST_CASE_ST(ut_setup, ut_teardown, 16272 test_snow3g_auth_cipher_test_case_3_oop_sgl), 16273 TEST_CASE_ST(ut_setup, ut_teardown, 16274 test_snow3g_auth_cipher_part_digest_enc_sgl), 16275 TEST_CASE_ST(ut_setup, ut_teardown, 16276 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 16277 TEST_CASE_ST(ut_setup, ut_teardown, 16278 test_snow3g_auth_cipher_total_digest_enc_1), 16279 TEST_CASE_ST(ut_setup, ut_teardown, 16280 test_snow3g_auth_cipher_total_digest_enc_1_oop), 16281 TEST_CASE_ST(ut_setup, ut_teardown, 16282 test_snow3g_auth_cipher_total_digest_enc_1_sgl), 16283 TEST_CASE_ST(ut_setup, ut_teardown, 16284 test_snow3g_auth_cipher_total_digest_enc_1_oop_sgl), 16285 16286 /** SNOW 3G decrypt (UEA2), then verify auth */ 16287 TEST_CASE_ST(ut_setup, ut_teardown, 16288 test_snow3g_auth_cipher_verify_test_case_1), 16289 TEST_CASE_ST(ut_setup, ut_teardown, 16290 test_snow3g_auth_cipher_verify_test_case_2), 16291 TEST_CASE_ST(ut_setup, ut_teardown, 16292 test_snow3g_auth_cipher_verify_test_case_2_oop), 16293 TEST_CASE_ST(ut_setup, ut_teardown, 16294 test_snow3g_auth_cipher_verify_part_digest_enc), 16295 TEST_CASE_ST(ut_setup, ut_teardown, 16296 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 16297 TEST_CASE_ST(ut_setup, ut_teardown, 16298 test_snow3g_auth_cipher_verify_test_case_3_sgl), 16299 TEST_CASE_ST(ut_setup, ut_teardown, 16300 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 16301 TEST_CASE_ST(ut_setup, ut_teardown, 16302 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 16303 TEST_CASE_ST(ut_setup, ut_teardown, 16304 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 16305 TEST_CASE_ST(ut_setup, ut_teardown, 16306 test_snow3g_auth_cipher_verify_total_digest_enc_1), 16307 TEST_CASE_ST(ut_setup, ut_teardown, 16308 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop), 16309 TEST_CASE_ST(ut_setup, ut_teardown, 16310 test_snow3g_auth_cipher_verify_total_digest_enc_1_sgl), 16311 TEST_CASE_ST(ut_setup, ut_teardown, 16312 test_snow3g_auth_cipher_verify_total_digest_enc_1_oop_sgl), 16313 16314 /** SNOW 3G decrypt only (UEA2) */ 16315 TEST_CASE_ST(ut_setup, ut_teardown, 16316 test_snow3g_decryption_test_case_1), 16317 TEST_CASE_ST(ut_setup, ut_teardown, 16318 test_snow3g_decryption_test_case_2), 16319 TEST_CASE_ST(ut_setup, ut_teardown, 16320 test_snow3g_decryption_test_case_3), 16321 TEST_CASE_ST(ut_setup, ut_teardown, 16322 test_snow3g_decryption_test_case_4), 16323 TEST_CASE_ST(ut_setup, ut_teardown, 16324 test_snow3g_decryption_test_case_5), 16325 TEST_CASE_ST(ut_setup, ut_teardown, 16326 test_snow3g_decryption_with_digest_test_case_1), 16327 TEST_CASE_ST(ut_setup, ut_teardown, 16328 test_snow3g_hash_generate_test_case_1), 16329 TEST_CASE_ST(ut_setup, ut_teardown, 16330 test_snow3g_hash_generate_test_case_2), 16331 TEST_CASE_ST(ut_setup, ut_teardown, 16332 test_snow3g_hash_generate_test_case_3), 16333 16334 /* Tests with buffers which length is not byte-aligned */ 16335 TEST_CASE_ST(ut_setup, ut_teardown, 16336 test_snow3g_hash_generate_test_case_4), 16337 TEST_CASE_ST(ut_setup, ut_teardown, 16338 test_snow3g_hash_generate_test_case_5), 16339 TEST_CASE_ST(ut_setup, ut_teardown, 16340 test_snow3g_hash_generate_test_case_6), 16341 TEST_CASE_ST(ut_setup, ut_teardown, 16342 test_snow3g_hash_verify_test_case_1), 16343 TEST_CASE_ST(ut_setup, ut_teardown, 16344 test_snow3g_hash_verify_test_case_2), 16345 TEST_CASE_ST(ut_setup, ut_teardown, 16346 test_snow3g_hash_verify_test_case_3), 16347 16348 /* Tests with buffers which length is not byte-aligned */ 16349 TEST_CASE_ST(ut_setup, ut_teardown, 16350 test_snow3g_hash_verify_test_case_4), 16351 TEST_CASE_ST(ut_setup, ut_teardown, 16352 test_snow3g_hash_verify_test_case_5), 16353 TEST_CASE_ST(ut_setup, ut_teardown, 16354 test_snow3g_hash_verify_test_case_6), 16355 TEST_CASE_ST(ut_setup, ut_teardown, 16356 test_snow3g_cipher_auth_test_case_1), 16357 TEST_CASE_ST(ut_setup, ut_teardown, 16358 test_snow3g_auth_cipher_with_digest_test_case_1), 16359 TEST_CASES_END() 16360 } 16361 }; 16362 16363 static struct unit_test_suite cryptodev_zuc_testsuite = { 16364 .suite_name = "ZUC Test Suite", 16365 .setup = zuc_testsuite_setup, 16366 .unit_test_cases = { 16367 /** ZUC encrypt only (EEA3) */ 16368 TEST_CASE_ST(ut_setup, ut_teardown, 16369 test_zuc_encryption_test_case_1), 16370 TEST_CASE_ST(ut_setup, ut_teardown, 16371 test_zuc_encryption_test_case_2), 16372 TEST_CASE_ST(ut_setup, ut_teardown, 16373 test_zuc_encryption_test_case_3), 16374 TEST_CASE_ST(ut_setup, ut_teardown, 16375 test_zuc_encryption_test_case_4), 16376 TEST_CASE_ST(ut_setup, ut_teardown, 16377 test_zuc_encryption_test_case_5), 16378 TEST_CASE_ST(ut_setup, ut_teardown, 16379 test_zuc_encryption_test_case_6_sgl), 16380 16381 /** ZUC decrypt only (EEA3) */ 16382 TEST_CASE_ST(ut_setup, ut_teardown, 16383 test_zuc_decryption_test_case_1), 16384 TEST_CASE_ST(ut_setup, ut_teardown, 16385 test_zuc_decryption_test_case_2), 16386 TEST_CASE_ST(ut_setup, ut_teardown, 16387 test_zuc_decryption_test_case_3), 16388 TEST_CASE_ST(ut_setup, ut_teardown, 16389 test_zuc_decryption_test_case_4), 16390 TEST_CASE_ST(ut_setup, ut_teardown, 16391 test_zuc_decryption_test_case_5), 16392 TEST_CASE_ST(ut_setup, ut_teardown, 16393 test_zuc_decryption_test_case_6_sgl), 16394 16395 /** ZUC authenticate (EIA3) */ 16396 TEST_CASE_ST(ut_setup, ut_teardown, 16397 test_zuc_hash_generate_test_case_1), 16398 TEST_CASE_ST(ut_setup, ut_teardown, 16399 test_zuc_hash_generate_test_case_2), 16400 TEST_CASE_ST(ut_setup, ut_teardown, 16401 test_zuc_hash_generate_test_case_3), 16402 TEST_CASE_ST(ut_setup, ut_teardown, 16403 test_zuc_hash_generate_test_case_4), 16404 TEST_CASE_ST(ut_setup, ut_teardown, 16405 test_zuc_hash_generate_test_case_5), 16406 TEST_CASE_ST(ut_setup, ut_teardown, 16407 test_zuc_hash_generate_test_case_6), 16408 TEST_CASE_ST(ut_setup, ut_teardown, 16409 test_zuc_hash_generate_test_case_7), 16410 TEST_CASE_ST(ut_setup, ut_teardown, 16411 test_zuc_hash_generate_test_case_8), 16412 TEST_CASE_ST(ut_setup, ut_teardown, 16413 test_zuc_hash_generate_test_case_9), 16414 TEST_CASE_ST(ut_setup, ut_teardown, 16415 test_zuc_hash_generate_test_case_10), 16416 TEST_CASE_ST(ut_setup, ut_teardown, 16417 test_zuc_hash_generate_test_case_11), 16418 16419 /** ZUC verify (EIA3) */ 16420 TEST_CASE_ST(ut_setup, ut_teardown, 16421 test_zuc_hash_verify_test_case_1), 16422 TEST_CASE_ST(ut_setup, ut_teardown, 16423 test_zuc_hash_verify_test_case_2), 16424 TEST_CASE_ST(ut_setup, ut_teardown, 16425 test_zuc_hash_verify_test_case_3), 16426 TEST_CASE_ST(ut_setup, ut_teardown, 16427 test_zuc_hash_verify_test_case_4), 16428 TEST_CASE_ST(ut_setup, ut_teardown, 16429 test_zuc_hash_verify_test_case_5), 16430 TEST_CASE_ST(ut_setup, ut_teardown, 16431 test_zuc_hash_verify_test_case_6), 16432 TEST_CASE_ST(ut_setup, ut_teardown, 16433 test_zuc_hash_verify_test_case_7), 16434 TEST_CASE_ST(ut_setup, ut_teardown, 16435 test_zuc_hash_verify_test_case_8), 16436 TEST_CASE_ST(ut_setup, ut_teardown, 16437 test_zuc_hash_verify_test_case_9), 16438 TEST_CASE_ST(ut_setup, ut_teardown, 16439 test_zuc_hash_verify_test_case_10), 16440 TEST_CASE_ST(ut_setup, ut_teardown, 16441 test_zuc_hash_verify_test_case_11), 16442 16443 16444 /** ZUC alg-chain (EEA3/EIA3) */ 16445 TEST_CASE_ST(ut_setup, ut_teardown, 16446 test_zuc_cipher_auth_test_case_1), 16447 TEST_CASE_ST(ut_setup, ut_teardown, 16448 test_zuc_cipher_auth_test_case_2), 16449 16450 /** ZUC generate auth, then encrypt (EEA3) */ 16451 TEST_CASE_ST(ut_setup, ut_teardown, 16452 test_zuc_auth_cipher_test_case_1), 16453 TEST_CASE_ST(ut_setup, ut_teardown, 16454 test_zuc_auth_cipher_test_case_1_oop), 16455 TEST_CASE_ST(ut_setup, ut_teardown, 16456 test_zuc_auth_cipher_test_case_1_sgl), 16457 TEST_CASE_ST(ut_setup, ut_teardown, 16458 test_zuc_auth_cipher_test_case_1_oop_sgl), 16459 TEST_CASE_ST(ut_setup, ut_teardown, 16460 test_zuc_auth_cipher_test_case_2), 16461 TEST_CASE_ST(ut_setup, ut_teardown, 16462 test_zuc_auth_cipher_test_case_2_oop), 16463 16464 /** ZUC decrypt (EEA3), then verify auth */ 16465 TEST_CASE_ST(ut_setup, ut_teardown, 16466 test_zuc_auth_cipher_verify_test_case_1), 16467 TEST_CASE_ST(ut_setup, ut_teardown, 16468 test_zuc_auth_cipher_verify_test_case_1_oop), 16469 TEST_CASE_ST(ut_setup, ut_teardown, 16470 test_zuc_auth_cipher_verify_test_case_1_sgl), 16471 TEST_CASE_ST(ut_setup, ut_teardown, 16472 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 16473 TEST_CASE_ST(ut_setup, ut_teardown, 16474 test_zuc_auth_cipher_verify_test_case_2), 16475 TEST_CASE_ST(ut_setup, ut_teardown, 16476 test_zuc_auth_cipher_verify_test_case_2_oop), 16477 16478 /** ZUC-256 encrypt only **/ 16479 TEST_CASE_ST(ut_setup, ut_teardown, 16480 test_zuc256_encryption_test_case_1), 16481 TEST_CASE_ST(ut_setup, ut_teardown, 16482 test_zuc256_encryption_test_case_2), 16483 16484 /** ZUC-256 decrypt only **/ 16485 TEST_CASE_ST(ut_setup, ut_teardown, 16486 test_zuc256_decryption_test_case_1), 16487 TEST_CASE_ST(ut_setup, ut_teardown, 16488 test_zuc256_decryption_test_case_2), 16489 16490 /** ZUC-256 authentication only **/ 16491 TEST_CASE_ST(ut_setup, ut_teardown, 16492 test_zuc256_authentication_test_case_1), 16493 TEST_CASE_ST(ut_setup, ut_teardown, 16494 test_zuc256_authentication_test_case_2), 16495 16496 /** ZUC-256 authentication verify only **/ 16497 TEST_CASE_ST(ut_setup, ut_teardown, 16498 test_zuc256_authentication_verify_test_case_1), 16499 TEST_CASE_ST(ut_setup, ut_teardown, 16500 test_zuc256_authentication_verify_test_case_2), 16501 16502 TEST_CASES_END() 16503 } 16504 }; 16505 16506 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = { 16507 .suite_name = "HMAC_MD5 Authentication Test Suite", 16508 .setup = hmac_md5_auth_testsuite_setup, 16509 .unit_test_cases = { 16510 TEST_CASE_ST(ut_setup, ut_teardown, 16511 test_MD5_HMAC_generate_case_1), 16512 TEST_CASE_ST(ut_setup, ut_teardown, 16513 test_MD5_HMAC_verify_case_1), 16514 TEST_CASE_ST(ut_setup, ut_teardown, 16515 test_MD5_HMAC_generate_case_2), 16516 TEST_CASE_ST(ut_setup, ut_teardown, 16517 test_MD5_HMAC_verify_case_2), 16518 TEST_CASES_END() 16519 } 16520 }; 16521 16522 static struct unit_test_suite cryptodev_kasumi_testsuite = { 16523 .suite_name = "Kasumi Test Suite", 16524 .setup = kasumi_testsuite_setup, 16525 .unit_test_cases = { 16526 /** KASUMI hash only (UIA1) */ 16527 TEST_CASE_ST(ut_setup, ut_teardown, 16528 test_kasumi_hash_generate_test_case_1), 16529 TEST_CASE_ST(ut_setup, ut_teardown, 16530 test_kasumi_hash_generate_test_case_2), 16531 TEST_CASE_ST(ut_setup, ut_teardown, 16532 test_kasumi_hash_generate_test_case_3), 16533 TEST_CASE_ST(ut_setup, ut_teardown, 16534 test_kasumi_hash_generate_test_case_4), 16535 TEST_CASE_ST(ut_setup, ut_teardown, 16536 test_kasumi_hash_generate_test_case_5), 16537 TEST_CASE_ST(ut_setup, ut_teardown, 16538 test_kasumi_hash_generate_test_case_6), 16539 16540 TEST_CASE_ST(ut_setup, ut_teardown, 16541 test_kasumi_hash_verify_test_case_1), 16542 TEST_CASE_ST(ut_setup, ut_teardown, 16543 test_kasumi_hash_verify_test_case_2), 16544 TEST_CASE_ST(ut_setup, ut_teardown, 16545 test_kasumi_hash_verify_test_case_3), 16546 TEST_CASE_ST(ut_setup, ut_teardown, 16547 test_kasumi_hash_verify_test_case_4), 16548 TEST_CASE_ST(ut_setup, ut_teardown, 16549 test_kasumi_hash_verify_test_case_5), 16550 16551 /** KASUMI encrypt only (UEA1) */ 16552 TEST_CASE_ST(ut_setup, ut_teardown, 16553 test_kasumi_encryption_test_case_1), 16554 TEST_CASE_ST(ut_setup, ut_teardown, 16555 test_kasumi_encryption_test_case_1_sgl), 16556 TEST_CASE_ST(ut_setup, ut_teardown, 16557 test_kasumi_encryption_test_case_1_oop), 16558 TEST_CASE_ST(ut_setup, ut_teardown, 16559 test_kasumi_encryption_test_case_1_oop_sgl), 16560 TEST_CASE_ST(ut_setup, ut_teardown, 16561 test_kasumi_encryption_test_case_2), 16562 TEST_CASE_ST(ut_setup, ut_teardown, 16563 test_kasumi_encryption_test_case_3), 16564 TEST_CASE_ST(ut_setup, ut_teardown, 16565 test_kasumi_encryption_test_case_4), 16566 TEST_CASE_ST(ut_setup, ut_teardown, 16567 test_kasumi_encryption_test_case_5), 16568 16569 /** KASUMI decrypt only (UEA1) */ 16570 TEST_CASE_ST(ut_setup, ut_teardown, 16571 test_kasumi_decryption_test_case_1), 16572 TEST_CASE_ST(ut_setup, ut_teardown, 16573 test_kasumi_decryption_test_case_2), 16574 TEST_CASE_ST(ut_setup, ut_teardown, 16575 test_kasumi_decryption_test_case_3), 16576 TEST_CASE_ST(ut_setup, ut_teardown, 16577 test_kasumi_decryption_test_case_4), 16578 TEST_CASE_ST(ut_setup, ut_teardown, 16579 test_kasumi_decryption_test_case_5), 16580 TEST_CASE_ST(ut_setup, ut_teardown, 16581 test_kasumi_decryption_test_case_1_oop), 16582 TEST_CASE_ST(ut_setup, ut_teardown, 16583 test_kasumi_cipher_auth_test_case_1), 16584 16585 /** KASUMI generate auth, then encrypt (F8) */ 16586 TEST_CASE_ST(ut_setup, ut_teardown, 16587 test_kasumi_auth_cipher_test_case_1), 16588 TEST_CASE_ST(ut_setup, ut_teardown, 16589 test_kasumi_auth_cipher_test_case_2), 16590 TEST_CASE_ST(ut_setup, ut_teardown, 16591 test_kasumi_auth_cipher_test_case_2_oop), 16592 TEST_CASE_ST(ut_setup, ut_teardown, 16593 test_kasumi_auth_cipher_test_case_2_sgl), 16594 TEST_CASE_ST(ut_setup, ut_teardown, 16595 test_kasumi_auth_cipher_test_case_2_oop_sgl), 16596 16597 /** KASUMI decrypt (F8), then verify auth */ 16598 TEST_CASE_ST(ut_setup, ut_teardown, 16599 test_kasumi_auth_cipher_verify_test_case_1), 16600 TEST_CASE_ST(ut_setup, ut_teardown, 16601 test_kasumi_auth_cipher_verify_test_case_2), 16602 TEST_CASE_ST(ut_setup, ut_teardown, 16603 test_kasumi_auth_cipher_verify_test_case_2_oop), 16604 TEST_CASE_ST(ut_setup, ut_teardown, 16605 test_kasumi_auth_cipher_verify_test_case_2_sgl), 16606 TEST_CASE_ST(ut_setup, ut_teardown, 16607 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 16608 16609 TEST_CASES_END() 16610 } 16611 }; 16612 16613 static struct unit_test_suite cryptodev_esn_testsuite = { 16614 .suite_name = "ESN Test Suite", 16615 .setup = esn_testsuite_setup, 16616 .unit_test_cases = { 16617 TEST_CASE_ST(ut_setup, ut_teardown, 16618 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 16619 TEST_CASE_ST(ut_setup, ut_teardown, 16620 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 16621 TEST_CASES_END() 16622 } 16623 }; 16624 16625 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = { 16626 .suite_name = "Negative AES GCM Test Suite", 16627 .setup = negative_aes_gcm_testsuite_setup, 16628 .unit_test_cases = { 16629 TEST_CASE_ST(ut_setup, ut_teardown, 16630 test_AES_GCM_auth_encryption_fail_iv_corrupt), 16631 TEST_CASE_ST(ut_setup, ut_teardown, 16632 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 16633 TEST_CASE_ST(ut_setup, ut_teardown, 16634 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 16635 TEST_CASE_ST(ut_setup, ut_teardown, 16636 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 16637 TEST_CASE_ST(ut_setup, ut_teardown, 16638 test_AES_GCM_auth_encryption_fail_aad_corrupt), 16639 TEST_CASE_ST(ut_setup, ut_teardown, 16640 test_AES_GCM_auth_encryption_fail_tag_corrupt), 16641 TEST_CASE_ST(ut_setup, ut_teardown, 16642 test_AES_GCM_auth_decryption_fail_iv_corrupt), 16643 TEST_CASE_ST(ut_setup, ut_teardown, 16644 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 16645 TEST_CASE_ST(ut_setup, ut_teardown, 16646 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 16647 TEST_CASE_ST(ut_setup, ut_teardown, 16648 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 16649 TEST_CASE_ST(ut_setup, ut_teardown, 16650 test_AES_GCM_auth_decryption_fail_aad_corrupt), 16651 TEST_CASE_ST(ut_setup, ut_teardown, 16652 test_AES_GCM_auth_decryption_fail_tag_corrupt), 16653 16654 TEST_CASES_END() 16655 } 16656 }; 16657 16658 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = { 16659 .suite_name = "Negative AES GMAC Test Suite", 16660 .setup = negative_aes_gmac_testsuite_setup, 16661 .unit_test_cases = { 16662 TEST_CASE_ST(ut_setup, ut_teardown, 16663 authentication_verify_AES128_GMAC_fail_data_corrupt), 16664 TEST_CASE_ST(ut_setup, ut_teardown, 16665 authentication_verify_AES128_GMAC_fail_tag_corrupt), 16666 16667 TEST_CASES_END() 16668 } 16669 }; 16670 16671 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = { 16672 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite", 16673 .setup = mixed_cipher_hash_testsuite_setup, 16674 .unit_test_cases = { 16675 /** AUTH AES CMAC + CIPHER AES CTR */ 16676 TEST_CASE_ST(ut_setup, ut_teardown, 16677 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 16678 TEST_CASE_ST(ut_setup, ut_teardown, 16679 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 16680 TEST_CASE_ST(ut_setup, ut_teardown, 16681 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 16682 TEST_CASE_ST(ut_setup, ut_teardown, 16683 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 16684 TEST_CASE_ST(ut_setup, ut_teardown, 16685 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 16686 TEST_CASE_ST(ut_setup, ut_teardown, 16687 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 16688 TEST_CASE_ST(ut_setup, ut_teardown, 16689 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 16690 TEST_CASE_ST(ut_setup, ut_teardown, 16691 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 16692 TEST_CASE_ST(ut_setup, ut_teardown, 16693 test_aes_cmac_aes_ctr_digest_enc_test_case_2), 16694 TEST_CASE_ST(ut_setup, ut_teardown, 16695 test_aes_cmac_aes_ctr_digest_enc_test_case_2_oop), 16696 TEST_CASE_ST(ut_setup, ut_teardown, 16697 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2), 16698 TEST_CASE_ST(ut_setup, ut_teardown, 16699 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_2_oop), 16700 16701 /** AUTH ZUC + CIPHER SNOW3G */ 16702 TEST_CASE_ST(ut_setup, ut_teardown, 16703 test_auth_zuc_cipher_snow_test_case_1), 16704 TEST_CASE_ST(ut_setup, ut_teardown, 16705 test_verify_auth_zuc_cipher_snow_test_case_1), 16706 TEST_CASE_ST(ut_setup, ut_teardown, 16707 test_auth_zuc_cipher_snow_test_case_1_inplace), 16708 TEST_CASE_ST(ut_setup, ut_teardown, 16709 test_verify_auth_zuc_cipher_snow_test_case_1_inplace), 16710 /** AUTH AES CMAC + CIPHER SNOW3G */ 16711 TEST_CASE_ST(ut_setup, ut_teardown, 16712 test_auth_aes_cmac_cipher_snow_test_case_1), 16713 TEST_CASE_ST(ut_setup, ut_teardown, 16714 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 16715 TEST_CASE_ST(ut_setup, ut_teardown, 16716 test_auth_aes_cmac_cipher_snow_test_case_1_inplace), 16717 TEST_CASE_ST(ut_setup, ut_teardown, 16718 test_verify_auth_aes_cmac_cipher_snow_test_case_1_inplace), 16719 /** AUTH ZUC + CIPHER AES CTR */ 16720 TEST_CASE_ST(ut_setup, ut_teardown, 16721 test_auth_zuc_cipher_aes_ctr_test_case_1), 16722 TEST_CASE_ST(ut_setup, ut_teardown, 16723 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 16724 TEST_CASE_ST(ut_setup, ut_teardown, 16725 test_auth_zuc_cipher_aes_ctr_test_case_1_inplace), 16726 TEST_CASE_ST(ut_setup, ut_teardown, 16727 test_verify_auth_zuc_cipher_aes_ctr_test_case_1_inplace), 16728 /** AUTH SNOW3G + CIPHER AES CTR */ 16729 TEST_CASE_ST(ut_setup, ut_teardown, 16730 test_auth_snow_cipher_aes_ctr_test_case_1), 16731 TEST_CASE_ST(ut_setup, ut_teardown, 16732 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 16733 TEST_CASE_ST(ut_setup, ut_teardown, 16734 test_auth_snow_cipher_aes_ctr_test_case_1_inplace), 16735 TEST_CASE_ST(ut_setup, ut_teardown, 16736 test_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl), 16737 TEST_CASE_ST(ut_setup, ut_teardown, 16738 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace), 16739 TEST_CASE_ST(ut_setup, ut_teardown, 16740 test_verify_auth_snow_cipher_aes_ctr_test_case_1_inplace_sgl), 16741 /** AUTH SNOW3G + CIPHER ZUC */ 16742 TEST_CASE_ST(ut_setup, ut_teardown, 16743 test_auth_snow_cipher_zuc_test_case_1), 16744 TEST_CASE_ST(ut_setup, ut_teardown, 16745 test_verify_auth_snow_cipher_zuc_test_case_1), 16746 TEST_CASE_ST(ut_setup, ut_teardown, 16747 test_auth_snow_cipher_zuc_test_case_1_inplace), 16748 TEST_CASE_ST(ut_setup, ut_teardown, 16749 test_verify_auth_snow_cipher_zuc_test_case_1_inplace), 16750 /** AUTH AES CMAC + CIPHER ZUC */ 16751 TEST_CASE_ST(ut_setup, ut_teardown, 16752 test_auth_aes_cmac_cipher_zuc_test_case_1), 16753 TEST_CASE_ST(ut_setup, ut_teardown, 16754 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 16755 TEST_CASE_ST(ut_setup, ut_teardown, 16756 test_auth_aes_cmac_cipher_zuc_test_case_1_inplace), 16757 TEST_CASE_ST(ut_setup, ut_teardown, 16758 test_verify_auth_aes_cmac_cipher_zuc_test_case_1_inplace), 16759 16760 /** AUTH NULL + CIPHER SNOW3G */ 16761 TEST_CASE_ST(ut_setup, ut_teardown, 16762 test_auth_null_cipher_snow_test_case_1), 16763 TEST_CASE_ST(ut_setup, ut_teardown, 16764 test_verify_auth_null_cipher_snow_test_case_1), 16765 /** AUTH NULL + CIPHER ZUC */ 16766 TEST_CASE_ST(ut_setup, ut_teardown, 16767 test_auth_null_cipher_zuc_test_case_1), 16768 TEST_CASE_ST(ut_setup, ut_teardown, 16769 test_verify_auth_null_cipher_zuc_test_case_1), 16770 /** AUTH SNOW3G + CIPHER NULL */ 16771 TEST_CASE_ST(ut_setup, ut_teardown, 16772 test_auth_snow_cipher_null_test_case_1), 16773 TEST_CASE_ST(ut_setup, ut_teardown, 16774 test_verify_auth_snow_cipher_null_test_case_1), 16775 /** AUTH ZUC + CIPHER NULL */ 16776 TEST_CASE_ST(ut_setup, ut_teardown, 16777 test_auth_zuc_cipher_null_test_case_1), 16778 TEST_CASE_ST(ut_setup, ut_teardown, 16779 test_verify_auth_zuc_cipher_null_test_case_1), 16780 /** AUTH NULL + CIPHER AES CTR */ 16781 TEST_CASE_ST(ut_setup, ut_teardown, 16782 test_auth_null_cipher_aes_ctr_test_case_1), 16783 TEST_CASE_ST(ut_setup, ut_teardown, 16784 test_verify_auth_null_cipher_aes_ctr_test_case_1), 16785 /** AUTH AES CMAC + CIPHER NULL */ 16786 TEST_CASE_ST(ut_setup, ut_teardown, 16787 test_auth_aes_cmac_cipher_null_test_case_1), 16788 TEST_CASE_ST(ut_setup, ut_teardown, 16789 test_verify_auth_aes_cmac_cipher_null_test_case_1), 16790 TEST_CASES_END() 16791 } 16792 }; 16793 16794 static int 16795 run_cryptodev_testsuite(const char *pmd_name) 16796 { 16797 uint8_t ret, j, i = 0, blk_start_idx = 0; 16798 const enum blockcipher_test_type blk_suites[] = { 16799 BLKCIPHER_AES_CHAIN_TYPE, 16800 BLKCIPHER_AES_CIPHERONLY_TYPE, 16801 BLKCIPHER_AES_DOCSIS_TYPE, 16802 BLKCIPHER_3DES_CHAIN_TYPE, 16803 BLKCIPHER_3DES_CIPHERONLY_TYPE, 16804 BLKCIPHER_DES_CIPHERONLY_TYPE, 16805 BLKCIPHER_DES_DOCSIS_TYPE, 16806 BLKCIPHER_AUTHONLY_TYPE}; 16807 struct unit_test_suite *static_suites[] = { 16808 &cryptodev_multi_session_testsuite, 16809 &cryptodev_null_testsuite, 16810 &cryptodev_aes_ccm_auth_testsuite, 16811 &cryptodev_aes_gcm_auth_testsuite, 16812 &cryptodev_aes_gmac_auth_testsuite, 16813 &cryptodev_snow3g_testsuite, 16814 &cryptodev_chacha20_poly1305_testsuite, 16815 &cryptodev_zuc_testsuite, 16816 &cryptodev_hmac_md5_auth_testsuite, 16817 &cryptodev_kasumi_testsuite, 16818 &cryptodev_esn_testsuite, 16819 &cryptodev_negative_aes_gcm_testsuite, 16820 &cryptodev_negative_aes_gmac_testsuite, 16821 &cryptodev_mixed_cipher_hash_testsuite, 16822 &cryptodev_negative_hmac_sha1_testsuite, 16823 &cryptodev_gen_testsuite, 16824 #ifdef RTE_LIB_SECURITY 16825 &ipsec_proto_testsuite, 16826 &pdcp_proto_testsuite, 16827 &docsis_proto_testsuite, 16828 #endif 16829 &end_testsuite 16830 }; 16831 static struct unit_test_suite ts = { 16832 .suite_name = "Cryptodev Unit Test Suite", 16833 .setup = testsuite_setup, 16834 .teardown = testsuite_teardown, 16835 .unit_test_cases = {TEST_CASES_END()} 16836 }; 16837 16838 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name); 16839 16840 if (gbl_driver_id == -1) { 16841 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name); 16842 return TEST_SKIPPED; 16843 } 16844 16845 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 16846 (RTE_DIM(blk_suites) + RTE_DIM(static_suites))); 16847 16848 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites)); 16849 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 16850 ret = unit_test_suite_runner(&ts); 16851 16852 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites)); 16853 free(ts.unit_test_suites); 16854 return ret; 16855 } 16856 16857 static int 16858 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name) 16859 { 16860 struct rte_cryptodev_info dev_info; 16861 uint8_t i, nb_devs; 16862 int driver_id; 16863 16864 driver_id = rte_cryptodev_driver_id_get(pmd_name); 16865 if (driver_id == -1) { 16866 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name); 16867 return TEST_SKIPPED; 16868 } 16869 16870 nb_devs = rte_cryptodev_count(); 16871 if (nb_devs < 1) { 16872 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 16873 return TEST_SKIPPED; 16874 } 16875 16876 for (i = 0; i < nb_devs; i++) { 16877 rte_cryptodev_info_get(i, &dev_info); 16878 if (dev_info.driver_id == driver_id) { 16879 if (!(dev_info.feature_flags & flag)) { 16880 RTE_LOG(INFO, USER1, "%s not supported\n", 16881 flag_name); 16882 return TEST_SKIPPED; 16883 } 16884 return 0; /* found */ 16885 } 16886 } 16887 16888 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name); 16889 return TEST_SKIPPED; 16890 } 16891 16892 static int 16893 test_cryptodev_qat(void) 16894 { 16895 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 16896 } 16897 16898 static int 16899 test_cryptodev_uadk(void) 16900 { 16901 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_UADK_PMD)); 16902 } 16903 16904 static int 16905 test_cryptodev_virtio(void) 16906 { 16907 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 16908 } 16909 16910 static int 16911 test_cryptodev_aesni_mb(void) 16912 { 16913 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 16914 } 16915 16916 static int 16917 test_cryptodev_cpu_aesni_mb(void) 16918 { 16919 int32_t rc; 16920 enum rte_security_session_action_type at = gbl_action_type; 16921 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 16922 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 16923 gbl_action_type = at; 16924 return rc; 16925 } 16926 16927 static int 16928 test_cryptodev_chacha_poly_mb(void) 16929 { 16930 int32_t rc; 16931 enum rte_security_session_action_type at = gbl_action_type; 16932 rc = run_cryptodev_testsuite( 16933 RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD)); 16934 gbl_action_type = at; 16935 return rc; 16936 } 16937 16938 static int 16939 test_cryptodev_openssl(void) 16940 { 16941 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 16942 } 16943 16944 static int 16945 test_cryptodev_aesni_gcm(void) 16946 { 16947 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 16948 } 16949 16950 static int 16951 test_cryptodev_cpu_aesni_gcm(void) 16952 { 16953 int32_t rc; 16954 enum rte_security_session_action_type at = gbl_action_type; 16955 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 16956 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 16957 gbl_action_type = at; 16958 return rc; 16959 } 16960 16961 static int 16962 test_cryptodev_mlx5(void) 16963 { 16964 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD)); 16965 } 16966 16967 static int 16968 test_cryptodev_null(void) 16969 { 16970 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 16971 } 16972 16973 static int 16974 test_cryptodev_sw_snow3g(void) 16975 { 16976 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 16977 } 16978 16979 static int 16980 test_cryptodev_sw_kasumi(void) 16981 { 16982 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 16983 } 16984 16985 static int 16986 test_cryptodev_sw_zuc(void) 16987 { 16988 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 16989 } 16990 16991 static int 16992 test_cryptodev_armv8(void) 16993 { 16994 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 16995 } 16996 16997 static int 16998 test_cryptodev_mrvl(void) 16999 { 17000 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 17001 } 17002 17003 #ifdef RTE_CRYPTO_SCHEDULER 17004 17005 static int 17006 test_cryptodev_scheduler(void) 17007 { 17008 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0; 17009 const enum blockcipher_test_type blk_suites[] = { 17010 BLKCIPHER_AES_CHAIN_TYPE, 17011 BLKCIPHER_AES_CIPHERONLY_TYPE, 17012 BLKCIPHER_AUTHONLY_TYPE 17013 }; 17014 static struct unit_test_suite scheduler_multicore = { 17015 .suite_name = "Scheduler Multicore Unit Test Suite", 17016 .setup = scheduler_multicore_testsuite_setup, 17017 .teardown = scheduler_mode_testsuite_teardown, 17018 .unit_test_cases = {TEST_CASES_END()} 17019 }; 17020 static struct unit_test_suite scheduler_round_robin = { 17021 .suite_name = "Scheduler Round Robin Unit Test Suite", 17022 .setup = scheduler_roundrobin_testsuite_setup, 17023 .teardown = scheduler_mode_testsuite_teardown, 17024 .unit_test_cases = {TEST_CASES_END()} 17025 }; 17026 static struct unit_test_suite scheduler_failover = { 17027 .suite_name = "Scheduler Failover Unit Test Suite", 17028 .setup = scheduler_failover_testsuite_setup, 17029 .teardown = scheduler_mode_testsuite_teardown, 17030 .unit_test_cases = {TEST_CASES_END()} 17031 }; 17032 static struct unit_test_suite scheduler_pkt_size_distr = { 17033 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite", 17034 .setup = scheduler_pkt_size_distr_testsuite_setup, 17035 .teardown = scheduler_mode_testsuite_teardown, 17036 .unit_test_cases = {TEST_CASES_END()} 17037 }; 17038 struct unit_test_suite *sched_mode_suites[] = { 17039 &scheduler_multicore, 17040 &scheduler_round_robin, 17041 &scheduler_failover, 17042 &scheduler_pkt_size_distr 17043 }; 17044 static struct unit_test_suite scheduler_config = { 17045 .suite_name = "Crypto Device Scheduler Config Unit Test Suite", 17046 .unit_test_cases = { 17047 TEST_CASE(test_scheduler_attach_worker_op), 17048 TEST_CASE(test_scheduler_mode_multicore_op), 17049 TEST_CASE(test_scheduler_mode_roundrobin_op), 17050 TEST_CASE(test_scheduler_mode_failover_op), 17051 TEST_CASE(test_scheduler_mode_pkt_size_distr_op), 17052 TEST_CASE(test_scheduler_detach_worker_op), 17053 17054 TEST_CASES_END() /**< NULL terminate array */ 17055 } 17056 }; 17057 struct unit_test_suite *static_suites[] = { 17058 &scheduler_config, 17059 &end_testsuite 17060 }; 17061 static struct unit_test_suite ts = { 17062 .suite_name = "Scheduler Unit Test Suite", 17063 .setup = scheduler_testsuite_setup, 17064 .teardown = testsuite_teardown, 17065 .unit_test_cases = {TEST_CASES_END()} 17066 }; 17067 17068 gbl_driver_id = rte_cryptodev_driver_id_get( 17069 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 17070 17071 if (gbl_driver_id == -1) { 17072 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 17073 return TEST_SKIPPED; 17074 } 17075 17076 if (rte_cryptodev_driver_id_get( 17077 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 17078 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 17079 return TEST_SKIPPED; 17080 } 17081 17082 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 17083 uint8_t blk_i = 0; 17084 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof 17085 (struct unit_test_suite *) * 17086 (RTE_DIM(blk_suites) + 1)); 17087 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]), 17088 blk_suites, RTE_DIM(blk_suites)); 17089 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite; 17090 } 17091 17092 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 17093 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites))); 17094 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites, 17095 RTE_DIM(sched_mode_suites)); 17096 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 17097 ret = unit_test_suite_runner(&ts); 17098 17099 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 17100 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, 17101 (*sched_mode_suites[sched_i]), 17102 RTE_DIM(blk_suites)); 17103 free(sched_mode_suites[sched_i]->unit_test_suites); 17104 } 17105 free(ts.unit_test_suites); 17106 return ret; 17107 } 17108 17109 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 17110 17111 #endif 17112 17113 static int 17114 test_cryptodev_dpaa2_sec(void) 17115 { 17116 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 17117 } 17118 17119 static int 17120 test_cryptodev_dpaa_sec(void) 17121 { 17122 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 17123 } 17124 17125 static int 17126 test_cryptodev_ccp(void) 17127 { 17128 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 17129 } 17130 17131 static int 17132 test_cryptodev_octeontx(void) 17133 { 17134 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 17135 } 17136 17137 static int 17138 test_cryptodev_caam_jr(void) 17139 { 17140 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 17141 } 17142 17143 static int 17144 test_cryptodev_nitrox(void) 17145 { 17146 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 17147 } 17148 17149 static int 17150 test_cryptodev_bcmfs(void) 17151 { 17152 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 17153 } 17154 17155 static int 17156 test_cryptodev_qat_raw_api(void) 17157 { 17158 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD); 17159 int ret; 17160 17161 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 17162 "RAW API"); 17163 if (ret) 17164 return ret; 17165 17166 global_api_test_type = CRYPTODEV_RAW_API_TEST; 17167 ret = run_cryptodev_testsuite(pmd_name); 17168 global_api_test_type = CRYPTODEV_API_TEST; 17169 17170 return ret; 17171 } 17172 17173 static int 17174 test_cryptodev_cn9k(void) 17175 { 17176 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD)); 17177 } 17178 17179 static int 17180 test_cryptodev_cn10k(void) 17181 { 17182 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD)); 17183 } 17184 17185 static int 17186 test_cryptodev_dpaa2_sec_raw_api(void) 17187 { 17188 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD); 17189 int ret; 17190 17191 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 17192 "RAW API"); 17193 if (ret) 17194 return ret; 17195 17196 global_api_test_type = CRYPTODEV_RAW_API_TEST; 17197 ret = run_cryptodev_testsuite(pmd_name); 17198 global_api_test_type = CRYPTODEV_API_TEST; 17199 17200 return ret; 17201 } 17202 17203 static int 17204 test_cryptodev_dpaa_sec_raw_api(void) 17205 { 17206 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD); 17207 int ret; 17208 17209 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 17210 "RAW API"); 17211 if (ret) 17212 return ret; 17213 17214 global_api_test_type = CRYPTODEV_RAW_API_TEST; 17215 ret = run_cryptodev_testsuite(pmd_name); 17216 global_api_test_type = CRYPTODEV_API_TEST; 17217 17218 return ret; 17219 } 17220 17221 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest, 17222 test_cryptodev_dpaa2_sec_raw_api); 17223 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest, 17224 test_cryptodev_dpaa_sec_raw_api); 17225 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 17226 test_cryptodev_qat_raw_api); 17227 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 17228 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 17229 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 17230 test_cryptodev_cpu_aesni_mb); 17231 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest, 17232 test_cryptodev_chacha_poly_mb); 17233 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 17234 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 17235 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 17236 test_cryptodev_cpu_aesni_gcm); 17237 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5); 17238 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 17239 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 17240 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 17241 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 17242 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 17243 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 17244 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 17245 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 17246 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 17247 REGISTER_TEST_COMMAND(cryptodev_uadk_autotest, test_cryptodev_uadk); 17248 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 17249 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 17250 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 17251 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 17252 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 17253 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k); 17254 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k); 17255