1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2020 Intel Corporation 3 * Copyright 2020 NXP 4 */ 5 6 #ifndef RTE_EXEC_ENV_WINDOWS 7 8 #include <time.h> 9 10 #include <rte_common.h> 11 #include <rte_hexdump.h> 12 #include <rte_mbuf.h> 13 #include <rte_malloc.h> 14 #include <rte_memcpy.h> 15 #include <rte_pause.h> 16 #include <rte_bus_vdev.h> 17 #include <rte_ether.h> 18 19 #include <rte_crypto.h> 20 #include <rte_cryptodev.h> 21 #include <rte_ip.h> 22 #include <rte_string_fns.h> 23 #include <rte_tcp.h> 24 #include <rte_udp.h> 25 26 #ifdef RTE_CRYPTO_SCHEDULER 27 #include <rte_cryptodev_scheduler.h> 28 #include <rte_cryptodev_scheduler_operations.h> 29 #endif 30 31 #include <rte_lcore.h> 32 33 #include "test.h" 34 #include "test_cryptodev.h" 35 36 #include "test_cryptodev_blockcipher.h" 37 #include "test_cryptodev_aes_test_vectors.h" 38 #include "test_cryptodev_des_test_vectors.h" 39 #include "test_cryptodev_hash_test_vectors.h" 40 #include "test_cryptodev_kasumi_test_vectors.h" 41 #include "test_cryptodev_kasumi_hash_test_vectors.h" 42 #include "test_cryptodev_snow3g_test_vectors.h" 43 #include "test_cryptodev_snow3g_hash_test_vectors.h" 44 #include "test_cryptodev_zuc_test_vectors.h" 45 #include "test_cryptodev_aead_test_vectors.h" 46 #include "test_cryptodev_hmac_test_vectors.h" 47 #include "test_cryptodev_mixed_test_vectors.h" 48 #ifdef RTE_LIB_SECURITY 49 #include "test_cryptodev_security_ipsec.h" 50 #include "test_cryptodev_security_ipsec_test_vectors.h" 51 #include "test_cryptodev_security_pdcp_test_vectors.h" 52 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 53 #include "test_cryptodev_security_pdcp_test_func.h" 54 #include "test_cryptodev_security_docsis_test_vectors.h" 55 56 #define SDAP_DISABLED 0 57 #define SDAP_ENABLED 1 58 #endif 59 60 #define VDEV_ARGS_SIZE 100 61 #define MAX_NB_SESSIONS 4 62 63 #define MAX_DRV_SERVICE_CTX_SIZE 256 64 65 #define MAX_RAW_DEQUEUE_COUNT 65535 66 67 #define IN_PLACE 0 68 #define OUT_OF_PLACE 1 69 70 static int gbl_driver_id; 71 72 static enum rte_security_session_action_type gbl_action_type = 73 RTE_SECURITY_ACTION_TYPE_NONE; 74 75 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 76 77 struct crypto_unittest_params { 78 struct rte_crypto_sym_xform cipher_xform; 79 struct rte_crypto_sym_xform auth_xform; 80 struct rte_crypto_sym_xform aead_xform; 81 #ifdef RTE_LIB_SECURITY 82 struct rte_security_docsis_xform docsis_xform; 83 #endif 84 85 union { 86 struct rte_cryptodev_sym_session *sess; 87 #ifdef RTE_LIB_SECURITY 88 struct rte_security_session *sec_session; 89 #endif 90 }; 91 #ifdef RTE_LIB_SECURITY 92 enum rte_security_session_action_type type; 93 #endif 94 struct rte_crypto_op *op; 95 96 struct rte_mbuf *obuf, *ibuf; 97 98 uint8_t *digest; 99 }; 100 101 #define ALIGN_POW2_ROUNDUP(num, align) \ 102 (((num) + (align) - 1) & ~((align) - 1)) 103 104 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \ 105 for (j = 0; j < num_child_ts; index++, j++) \ 106 parent_ts.unit_test_suites[index] = child_ts[j] 107 108 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \ 109 for (j = 0; j < num_blk_types; index++, j++) \ 110 parent_ts.unit_test_suites[index] = \ 111 build_blockcipher_test_suite(blk_types[j]) 112 113 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \ 114 for (j = index; j < index + num_blk_types; j++) \ 115 free_blockcipher_test_suite(parent_ts.unit_test_suites[j]) 116 117 /* 118 * Forward declarations. 119 */ 120 static int 121 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 122 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 123 uint8_t *hmac_key); 124 125 static int 126 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 127 struct crypto_unittest_params *ut_params, 128 struct crypto_testsuite_params *ts_param, 129 const uint8_t *cipher, 130 const uint8_t *digest, 131 const uint8_t *iv); 132 133 static int 134 security_proto_supported(enum rte_security_session_action_type action, 135 enum rte_security_session_protocol proto); 136 137 static int 138 dev_configure_and_start(uint64_t ff_disable); 139 140 static struct rte_mbuf * 141 setup_test_string(struct rte_mempool *mpool, 142 const char *string, size_t len, uint8_t blocksize) 143 { 144 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 145 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 146 147 if (m) { 148 char *dst; 149 150 memset(m->buf_addr, 0, m->buf_len); 151 dst = rte_pktmbuf_append(m, t_len); 152 if (!dst) { 153 rte_pktmbuf_free(m); 154 return NULL; 155 } 156 if (string != NULL) 157 rte_memcpy(dst, string, t_len); 158 else 159 memset(dst, 0, t_len); 160 } 161 162 return m; 163 } 164 165 /* Get number of bytes in X bits (rounding up) */ 166 static uint32_t 167 ceil_byte_length(uint32_t num_bits) 168 { 169 if (num_bits % 8) 170 return ((num_bits >> 3) + 1); 171 else 172 return (num_bits >> 3); 173 } 174 175 static void 176 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 177 uint8_t is_op_success) 178 { 179 struct rte_crypto_op *op = user_data; 180 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 181 RTE_CRYPTO_OP_STATUS_ERROR; 182 } 183 184 static struct crypto_testsuite_params testsuite_params = { NULL }; 185 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; 186 static struct crypto_unittest_params unittest_params; 187 188 void 189 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 190 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 191 uint8_t len_in_bits, uint8_t cipher_iv_len) 192 { 193 struct rte_crypto_sym_op *sop = op->sym; 194 struct rte_crypto_op *ret_op = NULL; 195 struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX]; 196 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 197 union rte_crypto_sym_ofs ofs; 198 struct rte_crypto_sym_vec vec; 199 struct rte_crypto_sgl sgl, dest_sgl; 200 uint32_t max_len; 201 union rte_cryptodev_session_ctx sess; 202 uint64_t auth_end_iova; 203 uint32_t count = 0; 204 struct rte_crypto_raw_dp_ctx *ctx; 205 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 206 auth_len = 0; 207 int32_t n; 208 uint32_t n_success; 209 int ctx_service_size; 210 int32_t status = 0; 211 int enqueue_status, dequeue_status; 212 struct crypto_unittest_params *ut_params = &unittest_params; 213 int is_sgl = sop->m_src->nb_segs > 1; 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 (is_cipher && is_auth) { 253 cipher_offset = sop->cipher.data.offset; 254 cipher_len = sop->cipher.data.length; 255 auth_offset = sop->auth.data.offset; 256 auth_len = sop->auth.data.length; 257 max_len = RTE_MAX(cipher_offset + cipher_len, 258 auth_offset + auth_len); 259 if (len_in_bits) { 260 max_len = max_len >> 3; 261 cipher_offset = cipher_offset >> 3; 262 auth_offset = auth_offset >> 3; 263 cipher_len = cipher_len >> 3; 264 auth_len = auth_len >> 3; 265 } 266 ofs.ofs.cipher.head = cipher_offset; 267 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 268 ofs.ofs.auth.head = auth_offset; 269 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 270 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 271 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 272 aad_auth_iv.va = rte_crypto_op_ctod_offset( 273 op, void *, IV_OFFSET + cipher_iv_len); 274 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 275 cipher_iv_len); 276 digest.va = (void *)sop->auth.digest.data; 277 digest.iova = sop->auth.digest.phys_addr; 278 279 if (is_sgl) { 280 uint32_t remaining_off = auth_offset + auth_len; 281 struct rte_mbuf *sgl_buf = sop->m_src; 282 283 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf) 284 && sgl_buf->next != NULL) { 285 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 286 sgl_buf = sgl_buf->next; 287 } 288 289 auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset( 290 sgl_buf, remaining_off); 291 } else { 292 auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) + 293 auth_offset + auth_len; 294 } 295 /* Then check if digest-encrypted conditions are met */ 296 if ((auth_offset + auth_len < cipher_offset + cipher_len) && 297 (digest.iova == auth_end_iova) && is_sgl) 298 max_len = RTE_MAX(max_len, auth_offset + auth_len + 299 ut_params->auth_xform.auth.digest_length); 300 301 } else if (is_cipher) { 302 cipher_offset = sop->cipher.data.offset; 303 cipher_len = sop->cipher.data.length; 304 max_len = cipher_len + cipher_offset; 305 if (len_in_bits) { 306 max_len = max_len >> 3; 307 cipher_offset = cipher_offset >> 3; 308 cipher_len = cipher_len >> 3; 309 } 310 ofs.ofs.cipher.head = cipher_offset; 311 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 312 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 313 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 314 315 } else if (is_auth) { 316 auth_offset = sop->auth.data.offset; 317 auth_len = sop->auth.data.length; 318 max_len = auth_len + auth_offset; 319 if (len_in_bits) { 320 max_len = max_len >> 3; 321 auth_offset = auth_offset >> 3; 322 auth_len = auth_len >> 3; 323 } 324 ofs.ofs.auth.head = auth_offset; 325 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 326 aad_auth_iv.va = rte_crypto_op_ctod_offset( 327 op, void *, IV_OFFSET + cipher_iv_len); 328 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 329 cipher_iv_len); 330 digest.va = (void *)sop->auth.digest.data; 331 digest.iova = sop->auth.digest.phys_addr; 332 333 } else { /* aead */ 334 cipher_offset = sop->aead.data.offset; 335 cipher_len = sop->aead.data.length; 336 max_len = cipher_len + cipher_offset; 337 if (len_in_bits) { 338 max_len = max_len >> 3; 339 cipher_offset = cipher_offset >> 3; 340 cipher_len = cipher_len >> 3; 341 } 342 ofs.ofs.cipher.head = cipher_offset; 343 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 344 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 345 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 346 aad_auth_iv.va = (void *)sop->aead.aad.data; 347 aad_auth_iv.iova = sop->aead.aad.phys_addr; 348 digest.va = (void *)sop->aead.digest.data; 349 digest.iova = sop->aead.digest.phys_addr; 350 } 351 352 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 353 data_vec, RTE_DIM(data_vec)); 354 if (n < 0 || n > sop->m_src->nb_segs) { 355 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 356 goto exit; 357 } 358 359 sgl.num = n; 360 /* Out of place */ 361 if (sop->m_dst != NULL) { 362 dest_sgl.vec = dest_data_vec; 363 vec.dest_sgl = &dest_sgl; 364 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len, 365 dest_data_vec, RTE_DIM(dest_data_vec)); 366 if (n < 0 || n > sop->m_dst->nb_segs) { 367 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 368 goto exit; 369 } 370 dest_sgl.num = n; 371 } else 372 vec.dest_sgl = NULL; 373 374 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 375 &enqueue_status) < 1) { 376 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 377 goto exit; 378 } 379 380 if (enqueue_status == 0) { 381 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 382 if (status < 0) { 383 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 384 goto exit; 385 } 386 } else if (enqueue_status < 0) { 387 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 388 goto exit; 389 } 390 391 n = n_success = 0; 392 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 393 n = rte_cryptodev_raw_dequeue_burst(ctx, 394 NULL, 1, post_process_raw_dp_op, 395 (void **)&ret_op, 0, &n_success, 396 &dequeue_status); 397 if (dequeue_status < 0) { 398 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 399 goto exit; 400 } 401 if (n == 0) 402 rte_pause(); 403 } 404 405 if (n == 1 && dequeue_status == 0) { 406 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 407 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 408 goto exit; 409 } 410 } 411 412 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 413 ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR || 414 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 415 RTE_CRYPTO_OP_STATUS_SUCCESS; 416 417 exit: 418 free(ctx); 419 } 420 421 static void 422 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 423 { 424 int32_t n, st; 425 struct rte_crypto_sym_op *sop; 426 union rte_crypto_sym_ofs ofs; 427 struct rte_crypto_sgl sgl; 428 struct rte_crypto_sym_vec symvec; 429 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 430 struct rte_crypto_vec vec[UINT8_MAX]; 431 432 sop = op->sym; 433 434 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 435 sop->aead.data.length, vec, RTE_DIM(vec)); 436 437 if (n < 0 || n != sop->m_src->nb_segs) { 438 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 439 return; 440 } 441 442 sgl.vec = vec; 443 sgl.num = n; 444 symvec.src_sgl = &sgl; 445 symvec.iv = &iv_ptr; 446 symvec.digest = &digest_ptr; 447 symvec.aad = &aad_ptr; 448 symvec.status = &st; 449 symvec.num = 1; 450 451 /* for CPU crypto the IOVA address is not required */ 452 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 453 digest_ptr.va = (void *)sop->aead.digest.data; 454 aad_ptr.va = (void *)sop->aead.aad.data; 455 456 ofs.raw = 0; 457 458 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 459 &symvec); 460 461 if (n != 1) 462 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 463 else 464 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 465 } 466 467 static void 468 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 469 { 470 int32_t n, st; 471 struct rte_crypto_sym_op *sop; 472 union rte_crypto_sym_ofs ofs; 473 struct rte_crypto_sgl sgl; 474 struct rte_crypto_sym_vec symvec; 475 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 476 struct rte_crypto_vec vec[UINT8_MAX]; 477 478 sop = op->sym; 479 480 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 481 sop->auth.data.length, vec, RTE_DIM(vec)); 482 483 if (n < 0 || n != sop->m_src->nb_segs) { 484 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 485 return; 486 } 487 488 sgl.vec = vec; 489 sgl.num = n; 490 symvec.src_sgl = &sgl; 491 symvec.iv = &iv_ptr; 492 symvec.digest = &digest_ptr; 493 symvec.status = &st; 494 symvec.num = 1; 495 496 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 497 digest_ptr.va = (void *)sop->auth.digest.data; 498 499 ofs.raw = 0; 500 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 501 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 502 (sop->cipher.data.offset + sop->cipher.data.length); 503 504 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 505 &symvec); 506 507 if (n != 1) 508 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 509 else 510 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 511 } 512 513 static struct rte_crypto_op * 514 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 515 { 516 517 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 518 519 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 520 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 521 return NULL; 522 } 523 524 op = NULL; 525 526 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 527 rte_pause(); 528 529 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 530 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 531 return NULL; 532 } 533 534 return op; 535 } 536 537 static int 538 testsuite_setup(void) 539 { 540 struct crypto_testsuite_params *ts_params = &testsuite_params; 541 struct rte_cryptodev_info info; 542 uint32_t i = 0, nb_devs, dev_id; 543 uint16_t qp_id; 544 545 memset(ts_params, 0, sizeof(*ts_params)); 546 547 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 548 if (ts_params->mbuf_pool == NULL) { 549 /* Not already created so create */ 550 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 551 "CRYPTO_MBUFPOOL", 552 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 553 rte_socket_id()); 554 if (ts_params->mbuf_pool == NULL) { 555 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 556 return TEST_FAILED; 557 } 558 } 559 560 ts_params->large_mbuf_pool = rte_mempool_lookup( 561 "CRYPTO_LARGE_MBUFPOOL"); 562 if (ts_params->large_mbuf_pool == NULL) { 563 /* Not already created so create */ 564 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 565 "CRYPTO_LARGE_MBUFPOOL", 566 1, 0, 0, UINT16_MAX, 567 rte_socket_id()); 568 if (ts_params->large_mbuf_pool == NULL) { 569 RTE_LOG(ERR, USER1, 570 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 571 return TEST_FAILED; 572 } 573 } 574 575 ts_params->op_mpool = rte_crypto_op_pool_create( 576 "MBUF_CRYPTO_SYM_OP_POOL", 577 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 578 NUM_MBUFS, MBUF_CACHE_SIZE, 579 DEFAULT_NUM_XFORMS * 580 sizeof(struct rte_crypto_sym_xform) + 581 MAXIMUM_IV_LENGTH, 582 rte_socket_id()); 583 if (ts_params->op_mpool == NULL) { 584 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 585 return TEST_FAILED; 586 } 587 588 nb_devs = rte_cryptodev_count(); 589 if (nb_devs < 1) { 590 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 591 return TEST_SKIPPED; 592 } 593 594 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) { 595 RTE_LOG(WARNING, USER1, "No %s devices found?\n", 596 rte_cryptodev_driver_name_get(gbl_driver_id)); 597 return TEST_SKIPPED; 598 } 599 600 /* Create list of valid crypto devs */ 601 for (i = 0; i < nb_devs; i++) { 602 rte_cryptodev_info_get(i, &info); 603 if (info.driver_id == gbl_driver_id) 604 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 605 } 606 607 if (ts_params->valid_dev_count < 1) 608 return TEST_FAILED; 609 610 /* Set up all the qps on the first of the valid devices found */ 611 612 dev_id = ts_params->valid_devs[0]; 613 614 rte_cryptodev_info_get(dev_id, &info); 615 616 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 617 ts_params->conf.socket_id = SOCKET_ID_ANY; 618 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 619 620 unsigned int session_size = 621 rte_cryptodev_sym_get_private_session_size(dev_id); 622 623 #ifdef RTE_LIB_SECURITY 624 unsigned int security_session_size = rte_security_session_get_size( 625 rte_cryptodev_get_sec_ctx(dev_id)); 626 627 if (session_size < security_session_size) 628 session_size = security_session_size; 629 #endif 630 /* 631 * Create mempool with maximum number of sessions. 632 */ 633 if (info.sym.max_nb_sessions != 0 && 634 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 635 RTE_LOG(ERR, USER1, "Device does not support " 636 "at least %u sessions\n", 637 MAX_NB_SESSIONS); 638 return TEST_FAILED; 639 } 640 641 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 642 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 643 SOCKET_ID_ANY); 644 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 645 "session mempool allocation failed"); 646 647 ts_params->session_priv_mpool = rte_mempool_create( 648 "test_sess_mp_priv", 649 MAX_NB_SESSIONS, 650 session_size, 651 0, 0, NULL, NULL, NULL, 652 NULL, SOCKET_ID_ANY, 653 0); 654 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 655 "session mempool allocation failed"); 656 657 658 659 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 660 &ts_params->conf), 661 "Failed to configure cryptodev %u with %u qps", 662 dev_id, ts_params->conf.nb_queue_pairs); 663 664 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 665 ts_params->qp_conf.mp_session = ts_params->session_mpool; 666 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 667 668 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 669 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 670 dev_id, qp_id, &ts_params->qp_conf, 671 rte_cryptodev_socket_id(dev_id)), 672 "Failed to setup queue pair %u on cryptodev %u", 673 qp_id, dev_id); 674 } 675 676 return TEST_SUCCESS; 677 } 678 679 static void 680 testsuite_teardown(void) 681 { 682 struct crypto_testsuite_params *ts_params = &testsuite_params; 683 int res; 684 685 if (ts_params->mbuf_pool != NULL) { 686 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 687 rte_mempool_avail_count(ts_params->mbuf_pool)); 688 } 689 690 if (ts_params->op_mpool != NULL) { 691 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 692 rte_mempool_avail_count(ts_params->op_mpool)); 693 } 694 695 /* Free session mempools */ 696 if (ts_params->session_priv_mpool != NULL) { 697 rte_mempool_free(ts_params->session_priv_mpool); 698 ts_params->session_priv_mpool = NULL; 699 } 700 701 if (ts_params->session_mpool != NULL) { 702 rte_mempool_free(ts_params->session_mpool); 703 ts_params->session_mpool = NULL; 704 } 705 706 res = rte_cryptodev_close(ts_params->valid_devs[0]); 707 if (res) 708 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res); 709 } 710 711 static int 712 check_capabilities_supported(enum rte_crypto_sym_xform_type type, 713 const int *algs, uint16_t num_algs) 714 { 715 uint8_t dev_id = testsuite_params.valid_devs[0]; 716 bool some_alg_supported = FALSE; 717 uint16_t i; 718 719 for (i = 0; i < num_algs && !some_alg_supported; i++) { 720 struct rte_cryptodev_sym_capability_idx alg = { 721 type, {algs[i]} 722 }; 723 if (rte_cryptodev_sym_capability_get(dev_id, 724 &alg) != NULL) 725 some_alg_supported = TRUE; 726 } 727 if (!some_alg_supported) 728 return TEST_SKIPPED; 729 730 return 0; 731 } 732 733 int 734 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 735 uint16_t num_ciphers) 736 { 737 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, 738 (const int *) ciphers, num_ciphers); 739 } 740 741 int 742 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 743 uint16_t num_auths) 744 { 745 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, 746 (const int *) auths, num_auths); 747 } 748 749 int 750 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 751 uint16_t num_aeads) 752 { 753 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, 754 (const int *) aeads, num_aeads); 755 } 756 757 static int 758 null_testsuite_setup(void) 759 { 760 struct crypto_testsuite_params *ts_params = &testsuite_params; 761 uint8_t dev_id = ts_params->valid_devs[0]; 762 struct rte_cryptodev_info dev_info; 763 const enum rte_crypto_cipher_algorithm ciphers[] = { 764 RTE_CRYPTO_CIPHER_NULL 765 }; 766 const enum rte_crypto_auth_algorithm auths[] = { 767 RTE_CRYPTO_AUTH_NULL 768 }; 769 770 rte_cryptodev_info_get(dev_id, &dev_info); 771 772 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 773 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL " 774 "testsuite not met\n"); 775 return TEST_SKIPPED; 776 } 777 778 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 779 && check_auth_capabilities_supported(auths, 780 RTE_DIM(auths)) != 0) { 781 RTE_LOG(INFO, USER1, "Capability requirements for NULL " 782 "testsuite not met\n"); 783 return TEST_SKIPPED; 784 } 785 786 return 0; 787 } 788 789 static int 790 crypto_gen_testsuite_setup(void) 791 { 792 struct crypto_testsuite_params *ts_params = &testsuite_params; 793 uint8_t dev_id = ts_params->valid_devs[0]; 794 struct rte_cryptodev_info dev_info; 795 796 rte_cryptodev_info_get(dev_id, &dev_info); 797 798 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 799 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen " 800 "testsuite not met\n"); 801 return TEST_SKIPPED; 802 } 803 804 return 0; 805 } 806 807 #ifdef RTE_LIB_SECURITY 808 static int 809 ipsec_proto_testsuite_setup(void) 810 { 811 struct crypto_testsuite_params *ts_params = &testsuite_params; 812 struct crypto_unittest_params *ut_params = &unittest_params; 813 struct rte_cryptodev_info dev_info; 814 int ret = 0; 815 816 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 817 818 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) { 819 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto " 820 "testsuite not met\n"); 821 return TEST_SKIPPED; 822 } 823 824 /* Reconfigure to enable security */ 825 ret = dev_configure_and_start(0); 826 if (ret != TEST_SUCCESS) 827 return ret; 828 829 /* Set action type */ 830 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 831 832 if (security_proto_supported( 833 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 834 RTE_SECURITY_PROTOCOL_IPSEC) < 0) { 835 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto " 836 "test not met\n"); 837 ret = TEST_SKIPPED; 838 } 839 840 test_ipsec_alg_list_populate(); 841 842 /* 843 * Stop the device. Device would be started again by individual test 844 * case setup routine. 845 */ 846 rte_cryptodev_stop(ts_params->valid_devs[0]); 847 848 return ret; 849 } 850 851 static int 852 pdcp_proto_testsuite_setup(void) 853 { 854 struct crypto_testsuite_params *ts_params = &testsuite_params; 855 uint8_t dev_id = ts_params->valid_devs[0]; 856 struct rte_cryptodev_info dev_info; 857 const enum rte_crypto_cipher_algorithm ciphers[] = { 858 RTE_CRYPTO_CIPHER_NULL, 859 RTE_CRYPTO_CIPHER_AES_CTR, 860 RTE_CRYPTO_CIPHER_ZUC_EEA3, 861 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 862 }; 863 const enum rte_crypto_auth_algorithm auths[] = { 864 RTE_CRYPTO_AUTH_NULL, 865 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 866 RTE_CRYPTO_AUTH_AES_CMAC, 867 RTE_CRYPTO_AUTH_ZUC_EIA3 868 }; 869 870 rte_cryptodev_info_get(dev_id, &dev_info); 871 872 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 873 !(dev_info.feature_flags & 874 RTE_CRYPTODEV_FF_SECURITY)) { 875 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto " 876 "testsuite not met\n"); 877 return TEST_SKIPPED; 878 } 879 880 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 881 && check_auth_capabilities_supported(auths, 882 RTE_DIM(auths)) != 0) { 883 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto " 884 "testsuite not met\n"); 885 return TEST_SKIPPED; 886 } 887 888 return 0; 889 } 890 891 static int 892 docsis_proto_testsuite_setup(void) 893 { 894 struct crypto_testsuite_params *ts_params = &testsuite_params; 895 uint8_t dev_id = ts_params->valid_devs[0]; 896 struct rte_cryptodev_info dev_info; 897 const enum rte_crypto_cipher_algorithm ciphers[] = { 898 RTE_CRYPTO_CIPHER_AES_DOCSISBPI 899 }; 900 901 rte_cryptodev_info_get(dev_id, &dev_info); 902 903 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 904 !(dev_info.feature_flags & 905 RTE_CRYPTODEV_FF_SECURITY)) { 906 RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS " 907 "Proto testsuite not met\n"); 908 return TEST_SKIPPED; 909 } 910 911 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 912 RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto " 913 "testsuite not met\n"); 914 return TEST_SKIPPED; 915 } 916 917 return 0; 918 } 919 #endif 920 921 static int 922 aes_ccm_auth_testsuite_setup(void) 923 { 924 struct crypto_testsuite_params *ts_params = &testsuite_params; 925 uint8_t dev_id = ts_params->valid_devs[0]; 926 struct rte_cryptodev_info dev_info; 927 const enum rte_crypto_aead_algorithm aeads[] = { 928 RTE_CRYPTO_AEAD_AES_CCM 929 }; 930 931 rte_cryptodev_info_get(dev_id, &dev_info); 932 933 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 934 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 935 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 936 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM " 937 "testsuite not met\n"); 938 return TEST_SKIPPED; 939 } 940 941 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 942 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM " 943 "testsuite not met\n"); 944 return TEST_SKIPPED; 945 } 946 947 return 0; 948 } 949 950 static int 951 aes_gcm_auth_testsuite_setup(void) 952 { 953 struct crypto_testsuite_params *ts_params = &testsuite_params; 954 uint8_t dev_id = ts_params->valid_devs[0]; 955 struct rte_cryptodev_info dev_info; 956 const enum rte_crypto_aead_algorithm aeads[] = { 957 RTE_CRYPTO_AEAD_AES_GCM 958 }; 959 960 rte_cryptodev_info_get(dev_id, &dev_info); 961 962 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 963 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM " 964 "testsuite not met\n"); 965 return TEST_SKIPPED; 966 } 967 968 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 969 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM " 970 "testsuite not met\n"); 971 return TEST_SKIPPED; 972 } 973 974 return 0; 975 } 976 977 static int 978 aes_gmac_auth_testsuite_setup(void) 979 { 980 struct crypto_testsuite_params *ts_params = &testsuite_params; 981 uint8_t dev_id = ts_params->valid_devs[0]; 982 struct rte_cryptodev_info dev_info; 983 const enum rte_crypto_auth_algorithm auths[] = { 984 RTE_CRYPTO_AUTH_AES_GMAC 985 }; 986 987 rte_cryptodev_info_get(dev_id, &dev_info); 988 989 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 990 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 991 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 992 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC " 993 "testsuite not met\n"); 994 return TEST_SKIPPED; 995 } 996 997 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 998 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC " 999 "testsuite not met\n"); 1000 return TEST_SKIPPED; 1001 } 1002 1003 return 0; 1004 } 1005 1006 static int 1007 chacha20_poly1305_testsuite_setup(void) 1008 { 1009 struct crypto_testsuite_params *ts_params = &testsuite_params; 1010 uint8_t dev_id = ts_params->valid_devs[0]; 1011 struct rte_cryptodev_info dev_info; 1012 const enum rte_crypto_aead_algorithm aeads[] = { 1013 RTE_CRYPTO_AEAD_CHACHA20_POLY1305 1014 }; 1015 1016 rte_cryptodev_info_get(dev_id, &dev_info); 1017 1018 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1019 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1020 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1021 RTE_LOG(INFO, USER1, "Feature flag requirements for " 1022 "Chacha20-Poly1305 testsuite not met\n"); 1023 return TEST_SKIPPED; 1024 } 1025 1026 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1027 RTE_LOG(INFO, USER1, "Capability requirements for " 1028 "Chacha20-Poly1305 testsuite not met\n"); 1029 return TEST_SKIPPED; 1030 } 1031 1032 return 0; 1033 } 1034 1035 static int 1036 snow3g_testsuite_setup(void) 1037 { 1038 struct crypto_testsuite_params *ts_params = &testsuite_params; 1039 uint8_t dev_id = ts_params->valid_devs[0]; 1040 struct rte_cryptodev_info dev_info; 1041 const enum rte_crypto_cipher_algorithm ciphers[] = { 1042 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1043 1044 }; 1045 const enum rte_crypto_auth_algorithm auths[] = { 1046 RTE_CRYPTO_AUTH_SNOW3G_UIA2 1047 }; 1048 1049 rte_cryptodev_info_get(dev_id, &dev_info); 1050 1051 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1052 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G " 1053 "testsuite not met\n"); 1054 return TEST_SKIPPED; 1055 } 1056 1057 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1058 && check_auth_capabilities_supported(auths, 1059 RTE_DIM(auths)) != 0) { 1060 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G " 1061 "testsuite not met\n"); 1062 return TEST_SKIPPED; 1063 } 1064 1065 return 0; 1066 } 1067 1068 static int 1069 zuc_testsuite_setup(void) 1070 { 1071 struct crypto_testsuite_params *ts_params = &testsuite_params; 1072 uint8_t dev_id = ts_params->valid_devs[0]; 1073 struct rte_cryptodev_info dev_info; 1074 const enum rte_crypto_cipher_algorithm ciphers[] = { 1075 RTE_CRYPTO_CIPHER_ZUC_EEA3 1076 }; 1077 const enum rte_crypto_auth_algorithm auths[] = { 1078 RTE_CRYPTO_AUTH_ZUC_EIA3 1079 }; 1080 1081 rte_cryptodev_info_get(dev_id, &dev_info); 1082 1083 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1084 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " 1085 "testsuite not met\n"); 1086 return TEST_SKIPPED; 1087 } 1088 1089 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1090 && check_auth_capabilities_supported(auths, 1091 RTE_DIM(auths)) != 0) { 1092 RTE_LOG(INFO, USER1, "Capability requirements for ZUC " 1093 "testsuite not met\n"); 1094 return TEST_SKIPPED; 1095 } 1096 1097 return 0; 1098 } 1099 1100 static int 1101 hmac_md5_auth_testsuite_setup(void) 1102 { 1103 struct crypto_testsuite_params *ts_params = &testsuite_params; 1104 uint8_t dev_id = ts_params->valid_devs[0]; 1105 struct rte_cryptodev_info dev_info; 1106 const enum rte_crypto_auth_algorithm auths[] = { 1107 RTE_CRYPTO_AUTH_MD5_HMAC 1108 }; 1109 1110 rte_cryptodev_info_get(dev_id, &dev_info); 1111 1112 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1113 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1114 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1115 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 " 1116 "Auth testsuite not met\n"); 1117 return TEST_SKIPPED; 1118 } 1119 1120 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1121 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 " 1122 "testsuite not met\n"); 1123 return TEST_SKIPPED; 1124 } 1125 1126 return 0; 1127 } 1128 1129 static int 1130 kasumi_testsuite_setup(void) 1131 { 1132 struct crypto_testsuite_params *ts_params = &testsuite_params; 1133 uint8_t dev_id = ts_params->valid_devs[0]; 1134 struct rte_cryptodev_info dev_info; 1135 const enum rte_crypto_cipher_algorithm ciphers[] = { 1136 RTE_CRYPTO_CIPHER_KASUMI_F8 1137 }; 1138 const enum rte_crypto_auth_algorithm auths[] = { 1139 RTE_CRYPTO_AUTH_KASUMI_F9 1140 }; 1141 1142 rte_cryptodev_info_get(dev_id, &dev_info); 1143 1144 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1145 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1146 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1147 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi " 1148 "testsuite not met\n"); 1149 return TEST_SKIPPED; 1150 } 1151 1152 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1153 && check_auth_capabilities_supported(auths, 1154 RTE_DIM(auths)) != 0) { 1155 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi " 1156 "testsuite not met\n"); 1157 return TEST_SKIPPED; 1158 } 1159 1160 return 0; 1161 } 1162 1163 static int 1164 negative_aes_gcm_testsuite_setup(void) 1165 { 1166 struct crypto_testsuite_params *ts_params = &testsuite_params; 1167 uint8_t dev_id = ts_params->valid_devs[0]; 1168 struct rte_cryptodev_info dev_info; 1169 const enum rte_crypto_aead_algorithm aeads[] = { 1170 RTE_CRYPTO_AEAD_AES_GCM 1171 }; 1172 1173 rte_cryptodev_info_get(dev_id, &dev_info); 1174 1175 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1176 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1177 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1178 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1179 "AES GCM testsuite not met\n"); 1180 return TEST_SKIPPED; 1181 } 1182 1183 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1184 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1185 "AES GCM testsuite not met\n"); 1186 return TEST_SKIPPED; 1187 } 1188 1189 return 0; 1190 } 1191 1192 static int 1193 negative_aes_gmac_testsuite_setup(void) 1194 { 1195 struct crypto_testsuite_params *ts_params = &testsuite_params; 1196 uint8_t dev_id = ts_params->valid_devs[0]; 1197 struct rte_cryptodev_info dev_info; 1198 const enum rte_crypto_auth_algorithm auths[] = { 1199 RTE_CRYPTO_AUTH_AES_GMAC 1200 }; 1201 1202 rte_cryptodev_info_get(dev_id, &dev_info); 1203 1204 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1205 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1206 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1207 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1208 "AES GMAC testsuite not met\n"); 1209 return TEST_SKIPPED; 1210 } 1211 1212 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1213 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1214 "AES GMAC testsuite not met\n"); 1215 return TEST_SKIPPED; 1216 } 1217 1218 return 0; 1219 } 1220 1221 static int 1222 mixed_cipher_hash_testsuite_setup(void) 1223 { 1224 struct crypto_testsuite_params *ts_params = &testsuite_params; 1225 uint8_t dev_id = ts_params->valid_devs[0]; 1226 struct rte_cryptodev_info dev_info; 1227 uint64_t feat_flags; 1228 const enum rte_crypto_cipher_algorithm ciphers[] = { 1229 RTE_CRYPTO_CIPHER_NULL, 1230 RTE_CRYPTO_CIPHER_AES_CTR, 1231 RTE_CRYPTO_CIPHER_ZUC_EEA3, 1232 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1233 }; 1234 const enum rte_crypto_auth_algorithm auths[] = { 1235 RTE_CRYPTO_AUTH_NULL, 1236 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 1237 RTE_CRYPTO_AUTH_AES_CMAC, 1238 RTE_CRYPTO_AUTH_ZUC_EIA3 1239 }; 1240 1241 rte_cryptodev_info_get(dev_id, &dev_info); 1242 feat_flags = dev_info.feature_flags; 1243 1244 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1245 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1246 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed " 1247 "Cipher Hash testsuite not met\n"); 1248 return TEST_SKIPPED; 1249 } 1250 1251 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1252 && check_auth_capabilities_supported(auths, 1253 RTE_DIM(auths)) != 0) { 1254 RTE_LOG(INFO, USER1, "Capability requirements for Mixed " 1255 "Cipher Hash testsuite not met\n"); 1256 return TEST_SKIPPED; 1257 } 1258 1259 return 0; 1260 } 1261 1262 static int 1263 esn_testsuite_setup(void) 1264 { 1265 struct crypto_testsuite_params *ts_params = &testsuite_params; 1266 uint8_t dev_id = ts_params->valid_devs[0]; 1267 struct rte_cryptodev_info dev_info; 1268 const enum rte_crypto_cipher_algorithm ciphers[] = { 1269 RTE_CRYPTO_CIPHER_AES_CBC 1270 }; 1271 const enum rte_crypto_auth_algorithm auths[] = { 1272 RTE_CRYPTO_AUTH_SHA1_HMAC 1273 }; 1274 1275 rte_cryptodev_info_get(dev_id, &dev_info); 1276 1277 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1278 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1279 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1280 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " 1281 "testsuite not met\n"); 1282 return TEST_SKIPPED; 1283 } 1284 1285 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1286 && check_auth_capabilities_supported(auths, 1287 RTE_DIM(auths)) != 0) { 1288 RTE_LOG(INFO, USER1, "Capability requirements for ESN " 1289 "testsuite not met\n"); 1290 return TEST_SKIPPED; 1291 } 1292 1293 return 0; 1294 } 1295 1296 static int 1297 multi_session_testsuite_setup(void) 1298 { 1299 struct crypto_testsuite_params *ts_params = &testsuite_params; 1300 uint8_t dev_id = ts_params->valid_devs[0]; 1301 struct rte_cryptodev_info dev_info; 1302 const enum rte_crypto_cipher_algorithm ciphers[] = { 1303 RTE_CRYPTO_CIPHER_AES_CBC 1304 }; 1305 const enum rte_crypto_auth_algorithm auths[] = { 1306 RTE_CRYPTO_AUTH_SHA512_HMAC 1307 }; 1308 1309 rte_cryptodev_info_get(dev_id, &dev_info); 1310 1311 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1312 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi " 1313 "Session testsuite not met\n"); 1314 return TEST_SKIPPED; 1315 } 1316 1317 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1318 && check_auth_capabilities_supported(auths, 1319 RTE_DIM(auths)) != 0) { 1320 RTE_LOG(INFO, USER1, "Capability requirements for Multi " 1321 "Session testsuite not met\n"); 1322 return TEST_SKIPPED; 1323 } 1324 1325 return 0; 1326 } 1327 1328 static int 1329 negative_hmac_sha1_testsuite_setup(void) 1330 { 1331 struct crypto_testsuite_params *ts_params = &testsuite_params; 1332 uint8_t dev_id = ts_params->valid_devs[0]; 1333 struct rte_cryptodev_info dev_info; 1334 const enum rte_crypto_cipher_algorithm ciphers[] = { 1335 RTE_CRYPTO_CIPHER_AES_CBC 1336 }; 1337 const enum rte_crypto_auth_algorithm auths[] = { 1338 RTE_CRYPTO_AUTH_SHA1_HMAC 1339 }; 1340 1341 rte_cryptodev_info_get(dev_id, &dev_info); 1342 1343 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1344 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1345 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1346 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1347 "HMAC SHA1 testsuite not met\n"); 1348 return TEST_SKIPPED; 1349 } 1350 1351 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1352 && check_auth_capabilities_supported(auths, 1353 RTE_DIM(auths)) != 0) { 1354 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1355 "HMAC SHA1 testsuite not met\n"); 1356 return TEST_SKIPPED; 1357 } 1358 1359 return 0; 1360 } 1361 1362 static int 1363 dev_configure_and_start(uint64_t ff_disable) 1364 { 1365 struct crypto_testsuite_params *ts_params = &testsuite_params; 1366 struct crypto_unittest_params *ut_params = &unittest_params; 1367 1368 uint16_t qp_id; 1369 1370 /* Clear unit test parameters before running test */ 1371 memset(ut_params, 0, sizeof(*ut_params)); 1372 1373 /* Reconfigure device to default parameters */ 1374 ts_params->conf.socket_id = SOCKET_ID_ANY; 1375 ts_params->conf.ff_disable = ff_disable; 1376 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 1377 ts_params->qp_conf.mp_session = ts_params->session_mpool; 1378 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 1379 1380 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1381 &ts_params->conf), 1382 "Failed to configure cryptodev %u", 1383 ts_params->valid_devs[0]); 1384 1385 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 1386 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1387 ts_params->valid_devs[0], qp_id, 1388 &ts_params->qp_conf, 1389 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1390 "Failed to setup queue pair %u on cryptodev %u", 1391 qp_id, ts_params->valid_devs[0]); 1392 } 1393 1394 1395 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 1396 1397 /* Start the device */ 1398 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 1399 "Failed to start cryptodev %u", 1400 ts_params->valid_devs[0]); 1401 1402 return TEST_SUCCESS; 1403 } 1404 1405 int 1406 ut_setup(void) 1407 { 1408 /* Configure and start the device with security feature disabled */ 1409 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 1410 } 1411 1412 static int 1413 ut_setup_security(void) 1414 { 1415 /* Configure and start the device with no features disabled */ 1416 return dev_configure_and_start(0); 1417 } 1418 1419 void 1420 ut_teardown(void) 1421 { 1422 struct crypto_testsuite_params *ts_params = &testsuite_params; 1423 struct crypto_unittest_params *ut_params = &unittest_params; 1424 1425 /* free crypto session structure */ 1426 #ifdef RTE_LIB_SECURITY 1427 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 1428 if (ut_params->sec_session) { 1429 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 1430 (ts_params->valid_devs[0]), 1431 ut_params->sec_session); 1432 ut_params->sec_session = NULL; 1433 } 1434 } else 1435 #endif 1436 { 1437 if (ut_params->sess) { 1438 rte_cryptodev_sym_session_clear( 1439 ts_params->valid_devs[0], 1440 ut_params->sess); 1441 rte_cryptodev_sym_session_free(ut_params->sess); 1442 ut_params->sess = NULL; 1443 } 1444 } 1445 1446 /* free crypto operation structure */ 1447 if (ut_params->op) 1448 rte_crypto_op_free(ut_params->op); 1449 1450 /* 1451 * free mbuf - both obuf and ibuf are usually the same, 1452 * so check if they point at the same address is necessary, 1453 * to avoid freeing the mbuf twice. 1454 */ 1455 if (ut_params->obuf) { 1456 rte_pktmbuf_free(ut_params->obuf); 1457 if (ut_params->ibuf == ut_params->obuf) 1458 ut_params->ibuf = 0; 1459 ut_params->obuf = 0; 1460 } 1461 if (ut_params->ibuf) { 1462 rte_pktmbuf_free(ut_params->ibuf); 1463 ut_params->ibuf = 0; 1464 } 1465 1466 if (ts_params->mbuf_pool != NULL) 1467 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 1468 rte_mempool_avail_count(ts_params->mbuf_pool)); 1469 1470 /* Stop the device */ 1471 rte_cryptodev_stop(ts_params->valid_devs[0]); 1472 } 1473 1474 static int 1475 test_device_configure_invalid_dev_id(void) 1476 { 1477 struct crypto_testsuite_params *ts_params = &testsuite_params; 1478 uint16_t dev_id, num_devs = 0; 1479 1480 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 1481 "Need at least %d devices for test", 1); 1482 1483 /* valid dev_id values */ 1484 dev_id = ts_params->valid_devs[0]; 1485 1486 /* Stop the device in case it's started so it can be configured */ 1487 rte_cryptodev_stop(dev_id); 1488 1489 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 1490 "Failed test for rte_cryptodev_configure: " 1491 "invalid dev_num %u", dev_id); 1492 1493 /* invalid dev_id values */ 1494 dev_id = num_devs; 1495 1496 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1497 "Failed test for rte_cryptodev_configure: " 1498 "invalid dev_num %u", dev_id); 1499 1500 dev_id = 0xff; 1501 1502 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1503 "Failed test for rte_cryptodev_configure:" 1504 "invalid dev_num %u", dev_id); 1505 1506 return TEST_SUCCESS; 1507 } 1508 1509 static int 1510 test_device_configure_invalid_queue_pair_ids(void) 1511 { 1512 struct crypto_testsuite_params *ts_params = &testsuite_params; 1513 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1514 1515 /* Stop the device in case it's started so it can be configured */ 1516 rte_cryptodev_stop(ts_params->valid_devs[0]); 1517 1518 /* valid - max value queue pairs */ 1519 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1520 1521 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1522 &ts_params->conf), 1523 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1524 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1525 1526 /* valid - one queue pairs */ 1527 ts_params->conf.nb_queue_pairs = 1; 1528 1529 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1530 &ts_params->conf), 1531 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1532 ts_params->valid_devs[0], 1533 ts_params->conf.nb_queue_pairs); 1534 1535 1536 /* invalid - zero queue pairs */ 1537 ts_params->conf.nb_queue_pairs = 0; 1538 1539 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1540 &ts_params->conf), 1541 "Failed test for rte_cryptodev_configure, dev_id %u," 1542 " invalid qps: %u", 1543 ts_params->valid_devs[0], 1544 ts_params->conf.nb_queue_pairs); 1545 1546 1547 /* invalid - max value supported by field queue pairs */ 1548 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1549 1550 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1551 &ts_params->conf), 1552 "Failed test for rte_cryptodev_configure, dev_id %u," 1553 " invalid qps: %u", 1554 ts_params->valid_devs[0], 1555 ts_params->conf.nb_queue_pairs); 1556 1557 1558 /* invalid - max value + 1 queue pairs */ 1559 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1560 1561 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1562 &ts_params->conf), 1563 "Failed test for rte_cryptodev_configure, dev_id %u," 1564 " invalid qps: %u", 1565 ts_params->valid_devs[0], 1566 ts_params->conf.nb_queue_pairs); 1567 1568 /* revert to original testsuite value */ 1569 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1570 1571 return TEST_SUCCESS; 1572 } 1573 1574 static int 1575 test_queue_pair_descriptor_setup(void) 1576 { 1577 struct crypto_testsuite_params *ts_params = &testsuite_params; 1578 struct rte_cryptodev_qp_conf qp_conf = { 1579 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1580 }; 1581 uint16_t qp_id; 1582 1583 /* Stop the device in case it's started so it can be configured */ 1584 rte_cryptodev_stop(ts_params->valid_devs[0]); 1585 1586 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1587 &ts_params->conf), 1588 "Failed to configure cryptodev %u", 1589 ts_params->valid_devs[0]); 1590 1591 /* 1592 * Test various ring sizes on this device. memzones can't be 1593 * freed so are re-used if ring is released and re-created. 1594 */ 1595 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1596 qp_conf.mp_session = ts_params->session_mpool; 1597 qp_conf.mp_session_private = ts_params->session_priv_mpool; 1598 1599 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1600 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1601 ts_params->valid_devs[0], qp_id, &qp_conf, 1602 rte_cryptodev_socket_id( 1603 ts_params->valid_devs[0])), 1604 "Failed test for " 1605 "rte_cryptodev_queue_pair_setup: num_inflights " 1606 "%u on qp %u on cryptodev %u", 1607 qp_conf.nb_descriptors, qp_id, 1608 ts_params->valid_devs[0]); 1609 } 1610 1611 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1612 1613 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1614 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1615 ts_params->valid_devs[0], qp_id, &qp_conf, 1616 rte_cryptodev_socket_id( 1617 ts_params->valid_devs[0])), 1618 "Failed test for" 1619 " rte_cryptodev_queue_pair_setup: num_inflights" 1620 " %u on qp %u on cryptodev %u", 1621 qp_conf.nb_descriptors, qp_id, 1622 ts_params->valid_devs[0]); 1623 } 1624 1625 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1626 1627 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1628 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1629 ts_params->valid_devs[0], qp_id, &qp_conf, 1630 rte_cryptodev_socket_id( 1631 ts_params->valid_devs[0])), 1632 "Failed test for " 1633 "rte_cryptodev_queue_pair_setup: num_inflights" 1634 " %u on qp %u on cryptodev %u", 1635 qp_conf.nb_descriptors, qp_id, 1636 ts_params->valid_devs[0]); 1637 } 1638 1639 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1640 1641 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1642 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1643 ts_params->valid_devs[0], qp_id, &qp_conf, 1644 rte_cryptodev_socket_id( 1645 ts_params->valid_devs[0])), 1646 "Failed test for" 1647 " rte_cryptodev_queue_pair_setup:" 1648 "num_inflights %u on qp %u on cryptodev %u", 1649 qp_conf.nb_descriptors, qp_id, 1650 ts_params->valid_devs[0]); 1651 } 1652 1653 /* test invalid queue pair id */ 1654 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1655 1656 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1657 1658 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1659 ts_params->valid_devs[0], 1660 qp_id, &qp_conf, 1661 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1662 "Failed test for rte_cryptodev_queue_pair_setup:" 1663 "invalid qp %u on cryptodev %u", 1664 qp_id, ts_params->valid_devs[0]); 1665 1666 qp_id = 0xffff; /*invalid*/ 1667 1668 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1669 ts_params->valid_devs[0], 1670 qp_id, &qp_conf, 1671 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1672 "Failed test for rte_cryptodev_queue_pair_setup:" 1673 "invalid qp %u on cryptodev %u", 1674 qp_id, ts_params->valid_devs[0]); 1675 1676 return TEST_SUCCESS; 1677 } 1678 1679 /* ***** Plaintext data for tests ***** */ 1680 1681 const char catch_22_quote_1[] = 1682 "There was only one catch and that was Catch-22, which " 1683 "specified that a concern for one's safety in the face of " 1684 "dangers that were real and immediate was the process of a " 1685 "rational mind. Orr was crazy and could be grounded. All he " 1686 "had to do was ask; and as soon as he did, he would no longer " 1687 "be crazy and would have to fly more missions. Orr would be " 1688 "crazy to fly more missions and sane if he didn't, but if he " 1689 "was sane he had to fly them. If he flew them he was crazy " 1690 "and didn't have to; but if he didn't want to he was sane and " 1691 "had to. Yossarian was moved very deeply by the absolute " 1692 "simplicity of this clause of Catch-22 and let out a " 1693 "respectful whistle. \"That's some catch, that Catch-22\", he " 1694 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1695 1696 const char catch_22_quote[] = 1697 "What a lousy earth! He wondered how many people were " 1698 "destitute that same night even in his own prosperous country, " 1699 "how many homes were shanties, how many husbands were drunk " 1700 "and wives socked, and how many children were bullied, abused, " 1701 "or abandoned. How many families hungered for food they could " 1702 "not afford to buy? How many hearts were broken? How many " 1703 "suicides would take place that same night, how many people " 1704 "would go insane? How many cockroaches and landlords would " 1705 "triumph? How many winners were losers, successes failures, " 1706 "and rich men poor men? How many wise guys were stupid? How " 1707 "many happy endings were unhappy endings? How many honest men " 1708 "were liars, brave men cowards, loyal men traitors, how many " 1709 "sainted men were corrupt, how many people in positions of " 1710 "trust had sold their souls to bodyguards, how many had never " 1711 "had souls? How many straight-and-narrow paths were crooked " 1712 "paths? How many best families were worst families and how " 1713 "many good people were bad people? When you added them all up " 1714 "and then subtracted, you might be left with only the children, " 1715 "and perhaps with Albert Einstein and an old violinist or " 1716 "sculptor somewhere."; 1717 1718 #define QUOTE_480_BYTES (480) 1719 #define QUOTE_512_BYTES (512) 1720 #define QUOTE_768_BYTES (768) 1721 #define QUOTE_1024_BYTES (1024) 1722 1723 1724 1725 /* ***** SHA1 Hash Tests ***** */ 1726 1727 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1728 1729 static uint8_t hmac_sha1_key[] = { 1730 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1731 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1732 0xDE, 0xF4, 0xDE, 0xAD }; 1733 1734 /* ***** SHA224 Hash Tests ***** */ 1735 1736 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1737 1738 1739 /* ***** AES-CBC Cipher Tests ***** */ 1740 1741 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1742 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1743 1744 static uint8_t aes_cbc_key[] = { 1745 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1746 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1747 1748 static uint8_t aes_cbc_iv[] = { 1749 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1750 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1751 1752 1753 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1754 1755 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1756 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1757 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1758 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1759 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1760 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1761 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1762 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1763 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1764 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1765 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1766 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1767 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1768 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1769 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1770 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1771 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1772 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1773 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1774 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1775 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1776 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1777 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1778 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1779 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1780 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1781 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1782 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1783 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1784 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1785 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1786 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1787 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1788 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1789 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1790 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1791 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1792 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1793 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1794 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1795 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1796 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1797 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1798 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1799 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1800 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1801 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1802 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1803 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1804 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1805 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1806 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1807 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1808 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1809 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1810 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1811 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1812 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1813 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1814 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1815 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1816 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1817 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1818 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1819 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1820 }; 1821 1822 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1823 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1824 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1825 0x18, 0x8c, 0x1d, 0x32 1826 }; 1827 1828 1829 /* Multisession Vector context Test */ 1830 /*Begin Session 0 */ 1831 static uint8_t ms_aes_cbc_key0[] = { 1832 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1833 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1834 }; 1835 1836 static uint8_t ms_aes_cbc_iv0[] = { 1837 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1838 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1839 }; 1840 1841 static const uint8_t ms_aes_cbc_cipher0[] = { 1842 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1843 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1844 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1845 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1846 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1847 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1848 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1849 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1850 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1851 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1852 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1853 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1854 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1855 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1856 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1857 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1858 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1859 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1860 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1861 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1862 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1863 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1864 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1865 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1866 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1867 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1868 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1869 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1870 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1871 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1872 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1873 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1874 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1875 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1876 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1877 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1878 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1879 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1880 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1881 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1882 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1883 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1884 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1885 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1886 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1887 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1888 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1889 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1890 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1891 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1892 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1893 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1894 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1895 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1896 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1897 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1898 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1899 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1900 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1901 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1902 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1903 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1904 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1905 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1906 }; 1907 1908 1909 static uint8_t ms_hmac_key0[] = { 1910 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1911 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1912 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1913 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1914 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1915 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1916 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1917 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1918 }; 1919 1920 static const uint8_t ms_hmac_digest0[] = { 1921 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1922 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1923 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1924 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1925 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1926 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1927 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1928 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1929 }; 1930 1931 /* End Session 0 */ 1932 /* Begin session 1 */ 1933 1934 static uint8_t ms_aes_cbc_key1[] = { 1935 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1936 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1937 }; 1938 1939 static uint8_t ms_aes_cbc_iv1[] = { 1940 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1941 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1942 }; 1943 1944 static const uint8_t ms_aes_cbc_cipher1[] = { 1945 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1946 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1947 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1948 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1949 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1950 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1951 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1952 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1953 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1954 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1955 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1956 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1957 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1958 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1959 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1960 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1961 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1962 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1963 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1964 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1965 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1966 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1967 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1968 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1969 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1970 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1971 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1972 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1973 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1974 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1975 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1976 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1977 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1978 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1979 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1980 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1981 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1982 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1983 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1984 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1985 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1986 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1987 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1988 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1989 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1990 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1991 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1992 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1993 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1994 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1995 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1996 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1997 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1998 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1999 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 2000 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 2001 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 2002 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 2003 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 2004 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 2005 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 2006 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 2007 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 2008 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 2009 2010 }; 2011 2012 static uint8_t ms_hmac_key1[] = { 2013 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2014 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2015 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2016 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2017 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2018 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2019 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2020 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2021 }; 2022 2023 static const uint8_t ms_hmac_digest1[] = { 2024 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 2025 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 2026 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 2027 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 2028 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 2029 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 2030 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 2031 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 2032 }; 2033 /* End Session 1 */ 2034 /* Begin Session 2 */ 2035 static uint8_t ms_aes_cbc_key2[] = { 2036 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 2037 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 2038 }; 2039 2040 static uint8_t ms_aes_cbc_iv2[] = { 2041 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 2042 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 2043 }; 2044 2045 static const uint8_t ms_aes_cbc_cipher2[] = { 2046 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 2047 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 2048 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 2049 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 2050 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 2051 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 2052 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 2053 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 2054 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 2055 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 2056 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 2057 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 2058 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 2059 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 2060 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 2061 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 2062 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 2063 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 2064 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 2065 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 2066 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 2067 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 2068 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 2069 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 2070 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 2071 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 2072 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 2073 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 2074 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 2075 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 2076 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 2077 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 2078 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 2079 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 2080 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 2081 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 2082 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 2083 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 2084 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 2085 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 2086 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 2087 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 2088 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 2089 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 2090 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 2091 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 2092 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 2093 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 2094 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 2095 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 2096 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 2097 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 2098 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 2099 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 2100 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 2101 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 2102 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 2103 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 2104 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 2105 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 2106 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 2107 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 2108 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 2109 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 2110 }; 2111 2112 static uint8_t ms_hmac_key2[] = { 2113 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2114 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2115 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2116 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2117 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2118 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2119 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2120 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2121 }; 2122 2123 static const uint8_t ms_hmac_digest2[] = { 2124 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 2125 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 2126 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 2127 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 2128 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 2129 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 2130 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 2131 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 2132 }; 2133 2134 /* End Session 2 */ 2135 2136 2137 static int 2138 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 2139 { 2140 struct crypto_testsuite_params *ts_params = &testsuite_params; 2141 struct crypto_unittest_params *ut_params = &unittest_params; 2142 int status; 2143 2144 /* Verify the capabilities */ 2145 struct rte_cryptodev_sym_capability_idx cap_idx; 2146 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2147 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 2148 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2149 &cap_idx) == NULL) 2150 return TEST_SKIPPED; 2151 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2152 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 2153 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2154 &cap_idx) == NULL) 2155 return TEST_SKIPPED; 2156 2157 /* Generate test mbuf data and space for digest */ 2158 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2159 catch_22_quote, QUOTE_512_BYTES, 0); 2160 2161 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2162 DIGEST_BYTE_LENGTH_SHA1); 2163 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2164 2165 /* Setup Cipher Parameters */ 2166 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2167 ut_params->cipher_xform.next = &ut_params->auth_xform; 2168 2169 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2170 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 2171 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 2172 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2173 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2174 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2175 2176 /* Setup HMAC Parameters */ 2177 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2178 2179 ut_params->auth_xform.next = NULL; 2180 2181 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 2182 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 2183 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 2184 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 2185 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 2186 2187 ut_params->sess = rte_cryptodev_sym_session_create( 2188 ts_params->session_mpool); 2189 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2190 2191 /* Create crypto session*/ 2192 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 2193 ut_params->sess, &ut_params->cipher_xform, 2194 ts_params->session_priv_mpool); 2195 2196 if (status == -ENOTSUP) 2197 return TEST_SKIPPED; 2198 2199 TEST_ASSERT_EQUAL(status, 0, "Session init failed"); 2200 2201 /* Generate crypto op data structure */ 2202 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2203 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2204 TEST_ASSERT_NOT_NULL(ut_params->op, 2205 "Failed to allocate symmetric crypto operation struct"); 2206 2207 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2208 2209 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2210 2211 /* set crypto operation source mbuf */ 2212 sym_op->m_src = ut_params->ibuf; 2213 2214 /* Set crypto operation authentication parameters */ 2215 sym_op->auth.digest.data = ut_params->digest; 2216 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2217 ut_params->ibuf, QUOTE_512_BYTES); 2218 2219 sym_op->auth.data.offset = 0; 2220 sym_op->auth.data.length = QUOTE_512_BYTES; 2221 2222 /* Copy IV at the end of the crypto operation */ 2223 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2224 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 2225 2226 /* Set crypto operation cipher parameters */ 2227 sym_op->cipher.data.offset = 0; 2228 sym_op->cipher.data.length = QUOTE_512_BYTES; 2229 2230 /* Process crypto operation */ 2231 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2232 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2233 ut_params->op); 2234 else 2235 TEST_ASSERT_NOT_NULL( 2236 process_crypto_request(ts_params->valid_devs[0], 2237 ut_params->op), 2238 "failed to process sym crypto op"); 2239 2240 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2241 "crypto op processing failed"); 2242 2243 /* Validate obuf */ 2244 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 2245 uint8_t *); 2246 2247 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 2248 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 2249 QUOTE_512_BYTES, 2250 "ciphertext data not as expected"); 2251 2252 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 2253 2254 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 2255 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 2256 gbl_driver_id == rte_cryptodev_driver_id_get( 2257 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 2258 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 2259 DIGEST_BYTE_LENGTH_SHA1, 2260 "Generated digest data not as expected"); 2261 2262 return TEST_SUCCESS; 2263 } 2264 2265 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 2266 2267 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 2268 2269 static uint8_t hmac_sha512_key[] = { 2270 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 2271 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2272 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2273 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 2274 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 2275 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2276 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 2277 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 2278 2279 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 2280 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 2281 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 2282 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 2283 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 2284 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 2285 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 2286 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 2287 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 2288 2289 2290 2291 static int 2292 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2293 struct crypto_unittest_params *ut_params, 2294 uint8_t *cipher_key, 2295 uint8_t *hmac_key); 2296 2297 static int 2298 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2299 struct crypto_unittest_params *ut_params, 2300 struct crypto_testsuite_params *ts_params, 2301 const uint8_t *cipher, 2302 const uint8_t *digest, 2303 const uint8_t *iv); 2304 2305 2306 static int 2307 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2308 struct crypto_unittest_params *ut_params, 2309 uint8_t *cipher_key, 2310 uint8_t *hmac_key) 2311 { 2312 2313 /* Setup Cipher Parameters */ 2314 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2315 ut_params->cipher_xform.next = NULL; 2316 2317 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2318 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 2319 ut_params->cipher_xform.cipher.key.data = cipher_key; 2320 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2321 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2322 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2323 2324 /* Setup HMAC Parameters */ 2325 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2326 ut_params->auth_xform.next = &ut_params->cipher_xform; 2327 2328 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 2329 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 2330 ut_params->auth_xform.auth.key.data = hmac_key; 2331 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 2332 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 2333 2334 return TEST_SUCCESS; 2335 } 2336 2337 2338 static int 2339 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2340 struct crypto_unittest_params *ut_params, 2341 struct crypto_testsuite_params *ts_params, 2342 const uint8_t *cipher, 2343 const uint8_t *digest, 2344 const uint8_t *iv) 2345 { 2346 /* Generate test mbuf data and digest */ 2347 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2348 (const char *) 2349 cipher, 2350 QUOTE_512_BYTES, 0); 2351 2352 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2353 DIGEST_BYTE_LENGTH_SHA512); 2354 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2355 2356 rte_memcpy(ut_params->digest, 2357 digest, 2358 DIGEST_BYTE_LENGTH_SHA512); 2359 2360 /* Generate Crypto op data structure */ 2361 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2362 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2363 TEST_ASSERT_NOT_NULL(ut_params->op, 2364 "Failed to allocate symmetric crypto operation struct"); 2365 2366 rte_crypto_op_attach_sym_session(ut_params->op, sess); 2367 2368 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2369 2370 /* set crypto operation source mbuf */ 2371 sym_op->m_src = ut_params->ibuf; 2372 2373 sym_op->auth.digest.data = ut_params->digest; 2374 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2375 ut_params->ibuf, QUOTE_512_BYTES); 2376 2377 sym_op->auth.data.offset = 0; 2378 sym_op->auth.data.length = QUOTE_512_BYTES; 2379 2380 /* Copy IV at the end of the crypto operation */ 2381 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2382 iv, CIPHER_IV_LENGTH_AES_CBC); 2383 2384 sym_op->cipher.data.offset = 0; 2385 sym_op->cipher.data.length = QUOTE_512_BYTES; 2386 2387 /* Process crypto operation */ 2388 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2389 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2390 ut_params->op); 2391 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2392 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2393 ut_params->op, 1, 1, 0, 0); 2394 else 2395 TEST_ASSERT_NOT_NULL( 2396 process_crypto_request(ts_params->valid_devs[0], 2397 ut_params->op), 2398 "failed to process sym crypto op"); 2399 2400 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2401 "crypto op processing failed"); 2402 2403 ut_params->obuf = ut_params->op->sym->m_src; 2404 2405 /* Validate obuf */ 2406 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2407 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 2408 catch_22_quote, 2409 QUOTE_512_BYTES, 2410 "Plaintext data not as expected"); 2411 2412 /* Validate obuf */ 2413 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2414 "Digest verification failed"); 2415 2416 return TEST_SUCCESS; 2417 } 2418 2419 /* ***** SNOW 3G Tests ***** */ 2420 static int 2421 create_wireless_algo_hash_session(uint8_t dev_id, 2422 const uint8_t *key, const uint8_t key_len, 2423 const uint8_t iv_len, const uint8_t auth_len, 2424 enum rte_crypto_auth_operation op, 2425 enum rte_crypto_auth_algorithm algo) 2426 { 2427 uint8_t hash_key[key_len]; 2428 int status; 2429 2430 struct crypto_testsuite_params *ts_params = &testsuite_params; 2431 struct crypto_unittest_params *ut_params = &unittest_params; 2432 2433 memcpy(hash_key, key, key_len); 2434 2435 debug_hexdump(stdout, "key:", key, key_len); 2436 2437 /* Setup Authentication Parameters */ 2438 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2439 ut_params->auth_xform.next = NULL; 2440 2441 ut_params->auth_xform.auth.op = op; 2442 ut_params->auth_xform.auth.algo = algo; 2443 ut_params->auth_xform.auth.key.length = key_len; 2444 ut_params->auth_xform.auth.key.data = hash_key; 2445 ut_params->auth_xform.auth.digest_length = auth_len; 2446 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2447 ut_params->auth_xform.auth.iv.length = iv_len; 2448 ut_params->sess = rte_cryptodev_sym_session_create( 2449 ts_params->session_mpool); 2450 2451 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2452 &ut_params->auth_xform, 2453 ts_params->session_priv_mpool); 2454 if (status == -ENOTSUP) 2455 return TEST_SKIPPED; 2456 2457 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2458 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2459 return 0; 2460 } 2461 2462 static int 2463 create_wireless_algo_cipher_session(uint8_t dev_id, 2464 enum rte_crypto_cipher_operation op, 2465 enum rte_crypto_cipher_algorithm algo, 2466 const uint8_t *key, const uint8_t key_len, 2467 uint8_t iv_len) 2468 { 2469 uint8_t cipher_key[key_len]; 2470 int status; 2471 struct crypto_testsuite_params *ts_params = &testsuite_params; 2472 struct crypto_unittest_params *ut_params = &unittest_params; 2473 2474 memcpy(cipher_key, key, key_len); 2475 2476 /* Setup Cipher Parameters */ 2477 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2478 ut_params->cipher_xform.next = NULL; 2479 2480 ut_params->cipher_xform.cipher.algo = algo; 2481 ut_params->cipher_xform.cipher.op = op; 2482 ut_params->cipher_xform.cipher.key.data = cipher_key; 2483 ut_params->cipher_xform.cipher.key.length = key_len; 2484 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2485 ut_params->cipher_xform.cipher.iv.length = iv_len; 2486 2487 debug_hexdump(stdout, "key:", key, key_len); 2488 2489 /* Create Crypto session */ 2490 ut_params->sess = rte_cryptodev_sym_session_create( 2491 ts_params->session_mpool); 2492 2493 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2494 &ut_params->cipher_xform, 2495 ts_params->session_priv_mpool); 2496 if (status == -ENOTSUP) 2497 return TEST_SKIPPED; 2498 2499 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2500 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2501 return 0; 2502 } 2503 2504 static int 2505 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2506 unsigned int cipher_len, 2507 unsigned int cipher_offset) 2508 { 2509 struct crypto_testsuite_params *ts_params = &testsuite_params; 2510 struct crypto_unittest_params *ut_params = &unittest_params; 2511 2512 /* Generate Crypto op data structure */ 2513 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2514 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2515 TEST_ASSERT_NOT_NULL(ut_params->op, 2516 "Failed to allocate pktmbuf offload"); 2517 2518 /* Set crypto operation data parameters */ 2519 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2520 2521 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2522 2523 /* set crypto operation source mbuf */ 2524 sym_op->m_src = ut_params->ibuf; 2525 2526 /* iv */ 2527 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2528 iv, iv_len); 2529 sym_op->cipher.data.length = cipher_len; 2530 sym_op->cipher.data.offset = cipher_offset; 2531 return 0; 2532 } 2533 2534 static int 2535 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2536 unsigned int cipher_len, 2537 unsigned int cipher_offset) 2538 { 2539 struct crypto_testsuite_params *ts_params = &testsuite_params; 2540 struct crypto_unittest_params *ut_params = &unittest_params; 2541 2542 /* Generate Crypto op data structure */ 2543 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2544 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2545 TEST_ASSERT_NOT_NULL(ut_params->op, 2546 "Failed to allocate pktmbuf offload"); 2547 2548 /* Set crypto operation data parameters */ 2549 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2550 2551 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2552 2553 /* set crypto operation source mbuf */ 2554 sym_op->m_src = ut_params->ibuf; 2555 sym_op->m_dst = ut_params->obuf; 2556 2557 /* iv */ 2558 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2559 iv, iv_len); 2560 sym_op->cipher.data.length = cipher_len; 2561 sym_op->cipher.data.offset = cipher_offset; 2562 return 0; 2563 } 2564 2565 static int 2566 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2567 enum rte_crypto_cipher_operation cipher_op, 2568 enum rte_crypto_auth_operation auth_op, 2569 enum rte_crypto_auth_algorithm auth_algo, 2570 enum rte_crypto_cipher_algorithm cipher_algo, 2571 const uint8_t *key, uint8_t key_len, 2572 uint8_t auth_iv_len, uint8_t auth_len, 2573 uint8_t cipher_iv_len) 2574 2575 { 2576 uint8_t cipher_auth_key[key_len]; 2577 int status; 2578 2579 struct crypto_testsuite_params *ts_params = &testsuite_params; 2580 struct crypto_unittest_params *ut_params = &unittest_params; 2581 2582 memcpy(cipher_auth_key, key, key_len); 2583 2584 /* Setup Authentication Parameters */ 2585 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2586 ut_params->auth_xform.next = NULL; 2587 2588 ut_params->auth_xform.auth.op = auth_op; 2589 ut_params->auth_xform.auth.algo = auth_algo; 2590 ut_params->auth_xform.auth.key.length = key_len; 2591 /* Hash key = cipher key */ 2592 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2593 ut_params->auth_xform.auth.digest_length = auth_len; 2594 /* Auth IV will be after cipher IV */ 2595 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2596 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2597 2598 /* Setup Cipher Parameters */ 2599 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2600 ut_params->cipher_xform.next = &ut_params->auth_xform; 2601 2602 ut_params->cipher_xform.cipher.algo = cipher_algo; 2603 ut_params->cipher_xform.cipher.op = cipher_op; 2604 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2605 ut_params->cipher_xform.cipher.key.length = key_len; 2606 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2607 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2608 2609 debug_hexdump(stdout, "key:", key, key_len); 2610 2611 /* Create Crypto session*/ 2612 ut_params->sess = rte_cryptodev_sym_session_create( 2613 ts_params->session_mpool); 2614 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2615 2616 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2617 &ut_params->cipher_xform, 2618 ts_params->session_priv_mpool); 2619 if (status == -ENOTSUP) 2620 return TEST_SKIPPED; 2621 2622 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2623 return 0; 2624 } 2625 2626 static int 2627 create_wireless_cipher_auth_session(uint8_t dev_id, 2628 enum rte_crypto_cipher_operation cipher_op, 2629 enum rte_crypto_auth_operation auth_op, 2630 enum rte_crypto_auth_algorithm auth_algo, 2631 enum rte_crypto_cipher_algorithm cipher_algo, 2632 const struct wireless_test_data *tdata) 2633 { 2634 const uint8_t key_len = tdata->key.len; 2635 uint8_t cipher_auth_key[key_len]; 2636 int status; 2637 2638 struct crypto_testsuite_params *ts_params = &testsuite_params; 2639 struct crypto_unittest_params *ut_params = &unittest_params; 2640 const uint8_t *key = tdata->key.data; 2641 const uint8_t auth_len = tdata->digest.len; 2642 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2643 uint8_t auth_iv_len = tdata->auth_iv.len; 2644 2645 memcpy(cipher_auth_key, key, key_len); 2646 2647 /* Setup Authentication Parameters */ 2648 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2649 ut_params->auth_xform.next = NULL; 2650 2651 ut_params->auth_xform.auth.op = auth_op; 2652 ut_params->auth_xform.auth.algo = auth_algo; 2653 ut_params->auth_xform.auth.key.length = key_len; 2654 /* Hash key = cipher key */ 2655 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2656 ut_params->auth_xform.auth.digest_length = auth_len; 2657 /* Auth IV will be after cipher IV */ 2658 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2659 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2660 2661 /* Setup Cipher Parameters */ 2662 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2663 ut_params->cipher_xform.next = &ut_params->auth_xform; 2664 2665 ut_params->cipher_xform.cipher.algo = cipher_algo; 2666 ut_params->cipher_xform.cipher.op = cipher_op; 2667 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2668 ut_params->cipher_xform.cipher.key.length = key_len; 2669 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2670 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2671 2672 2673 debug_hexdump(stdout, "key:", key, key_len); 2674 2675 /* Create Crypto session*/ 2676 ut_params->sess = rte_cryptodev_sym_session_create( 2677 ts_params->session_mpool); 2678 2679 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2680 &ut_params->cipher_xform, 2681 ts_params->session_priv_mpool); 2682 if (status == -ENOTSUP) 2683 return TEST_SKIPPED; 2684 2685 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2686 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2687 return 0; 2688 } 2689 2690 static int 2691 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2692 const struct wireless_test_data *tdata) 2693 { 2694 return create_wireless_cipher_auth_session(dev_id, 2695 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2696 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2697 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2698 } 2699 2700 static int 2701 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2702 enum rte_crypto_cipher_operation cipher_op, 2703 enum rte_crypto_auth_operation auth_op, 2704 enum rte_crypto_auth_algorithm auth_algo, 2705 enum rte_crypto_cipher_algorithm cipher_algo, 2706 const uint8_t *key, const uint8_t key_len, 2707 uint8_t auth_iv_len, uint8_t auth_len, 2708 uint8_t cipher_iv_len) 2709 { 2710 uint8_t auth_cipher_key[key_len]; 2711 int status; 2712 struct crypto_testsuite_params *ts_params = &testsuite_params; 2713 struct crypto_unittest_params *ut_params = &unittest_params; 2714 2715 memcpy(auth_cipher_key, key, key_len); 2716 2717 /* Setup Authentication Parameters */ 2718 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2719 ut_params->auth_xform.auth.op = auth_op; 2720 ut_params->auth_xform.next = &ut_params->cipher_xform; 2721 ut_params->auth_xform.auth.algo = auth_algo; 2722 ut_params->auth_xform.auth.key.length = key_len; 2723 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2724 ut_params->auth_xform.auth.digest_length = auth_len; 2725 /* Auth IV will be after cipher IV */ 2726 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2727 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2728 2729 /* Setup Cipher Parameters */ 2730 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2731 ut_params->cipher_xform.next = NULL; 2732 ut_params->cipher_xform.cipher.algo = cipher_algo; 2733 ut_params->cipher_xform.cipher.op = cipher_op; 2734 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2735 ut_params->cipher_xform.cipher.key.length = key_len; 2736 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2737 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2738 2739 debug_hexdump(stdout, "key:", key, key_len); 2740 2741 /* Create Crypto session*/ 2742 ut_params->sess = rte_cryptodev_sym_session_create( 2743 ts_params->session_mpool); 2744 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2745 2746 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2747 ut_params->auth_xform.next = NULL; 2748 ut_params->cipher_xform.next = &ut_params->auth_xform; 2749 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2750 &ut_params->cipher_xform, 2751 ts_params->session_priv_mpool); 2752 2753 } else 2754 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2755 &ut_params->auth_xform, 2756 ts_params->session_priv_mpool); 2757 2758 if (status == -ENOTSUP) 2759 return TEST_SKIPPED; 2760 2761 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2762 2763 return 0; 2764 } 2765 2766 static int 2767 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2768 unsigned int auth_tag_len, 2769 const uint8_t *iv, unsigned int iv_len, 2770 unsigned int data_pad_len, 2771 enum rte_crypto_auth_operation op, 2772 unsigned int auth_len, unsigned int auth_offset) 2773 { 2774 struct crypto_testsuite_params *ts_params = &testsuite_params; 2775 2776 struct crypto_unittest_params *ut_params = &unittest_params; 2777 2778 /* Generate Crypto op data structure */ 2779 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2780 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2781 TEST_ASSERT_NOT_NULL(ut_params->op, 2782 "Failed to allocate pktmbuf offload"); 2783 2784 /* Set crypto operation data parameters */ 2785 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2786 2787 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2788 2789 /* set crypto operation source mbuf */ 2790 sym_op->m_src = ut_params->ibuf; 2791 2792 /* iv */ 2793 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2794 iv, iv_len); 2795 /* digest */ 2796 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2797 ut_params->ibuf, auth_tag_len); 2798 2799 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2800 "no room to append auth tag"); 2801 ut_params->digest = sym_op->auth.digest.data; 2802 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2803 ut_params->ibuf, data_pad_len); 2804 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2805 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2806 else 2807 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2808 2809 debug_hexdump(stdout, "digest:", 2810 sym_op->auth.digest.data, 2811 auth_tag_len); 2812 2813 sym_op->auth.data.length = auth_len; 2814 sym_op->auth.data.offset = auth_offset; 2815 2816 return 0; 2817 } 2818 2819 static int 2820 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2821 enum rte_crypto_auth_operation op) 2822 { 2823 struct crypto_testsuite_params *ts_params = &testsuite_params; 2824 struct crypto_unittest_params *ut_params = &unittest_params; 2825 2826 const uint8_t *auth_tag = tdata->digest.data; 2827 const unsigned int auth_tag_len = tdata->digest.len; 2828 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2829 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2830 2831 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2832 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2833 const uint8_t *auth_iv = tdata->auth_iv.data; 2834 const uint8_t auth_iv_len = tdata->auth_iv.len; 2835 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2836 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2837 2838 /* Generate Crypto op data structure */ 2839 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2840 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2841 TEST_ASSERT_NOT_NULL(ut_params->op, 2842 "Failed to allocate pktmbuf offload"); 2843 /* Set crypto operation data parameters */ 2844 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2845 2846 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2847 2848 /* set crypto operation source mbuf */ 2849 sym_op->m_src = ut_params->ibuf; 2850 2851 /* digest */ 2852 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2853 ut_params->ibuf, auth_tag_len); 2854 2855 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2856 "no room to append auth tag"); 2857 ut_params->digest = sym_op->auth.digest.data; 2858 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2859 ut_params->ibuf, data_pad_len); 2860 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2861 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2862 else 2863 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2864 2865 debug_hexdump(stdout, "digest:", 2866 sym_op->auth.digest.data, 2867 auth_tag_len); 2868 2869 /* Copy cipher and auth IVs at the end of the crypto operation */ 2870 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2871 IV_OFFSET); 2872 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2873 iv_ptr += cipher_iv_len; 2874 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2875 2876 sym_op->cipher.data.length = cipher_len; 2877 sym_op->cipher.data.offset = 0; 2878 sym_op->auth.data.length = auth_len; 2879 sym_op->auth.data.offset = 0; 2880 2881 return 0; 2882 } 2883 2884 static int 2885 create_zuc_cipher_hash_generate_operation( 2886 const struct wireless_test_data *tdata) 2887 { 2888 return create_wireless_cipher_hash_operation(tdata, 2889 RTE_CRYPTO_AUTH_OP_GENERATE); 2890 } 2891 2892 static int 2893 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2894 const unsigned auth_tag_len, 2895 const uint8_t *auth_iv, uint8_t auth_iv_len, 2896 unsigned data_pad_len, 2897 enum rte_crypto_auth_operation op, 2898 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2899 const unsigned cipher_len, const unsigned cipher_offset, 2900 const unsigned auth_len, const unsigned auth_offset) 2901 { 2902 struct crypto_testsuite_params *ts_params = &testsuite_params; 2903 struct crypto_unittest_params *ut_params = &unittest_params; 2904 2905 enum rte_crypto_cipher_algorithm cipher_algo = 2906 ut_params->cipher_xform.cipher.algo; 2907 enum rte_crypto_auth_algorithm auth_algo = 2908 ut_params->auth_xform.auth.algo; 2909 2910 /* Generate Crypto op data structure */ 2911 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2912 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2913 TEST_ASSERT_NOT_NULL(ut_params->op, 2914 "Failed to allocate pktmbuf offload"); 2915 /* Set crypto operation data parameters */ 2916 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2917 2918 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2919 2920 /* set crypto operation source mbuf */ 2921 sym_op->m_src = ut_params->ibuf; 2922 2923 /* digest */ 2924 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2925 ut_params->ibuf, auth_tag_len); 2926 2927 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2928 "no room to append auth tag"); 2929 ut_params->digest = sym_op->auth.digest.data; 2930 2931 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2932 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2933 ut_params->ibuf, data_pad_len); 2934 } else { 2935 struct rte_mbuf *m = ut_params->ibuf; 2936 unsigned int offset = data_pad_len; 2937 2938 while (offset > m->data_len && m->next != NULL) { 2939 offset -= m->data_len; 2940 m = m->next; 2941 } 2942 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2943 m, offset); 2944 } 2945 2946 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2947 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2948 else 2949 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2950 2951 debug_hexdump(stdout, "digest:", 2952 sym_op->auth.digest.data, 2953 auth_tag_len); 2954 2955 /* Copy cipher and auth IVs at the end of the crypto operation */ 2956 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2957 IV_OFFSET); 2958 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2959 iv_ptr += cipher_iv_len; 2960 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2961 2962 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2963 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2964 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2965 sym_op->cipher.data.length = cipher_len; 2966 sym_op->cipher.data.offset = cipher_offset; 2967 } else { 2968 sym_op->cipher.data.length = cipher_len >> 3; 2969 sym_op->cipher.data.offset = cipher_offset >> 3; 2970 } 2971 2972 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2973 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2974 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2975 sym_op->auth.data.length = auth_len; 2976 sym_op->auth.data.offset = auth_offset; 2977 } else { 2978 sym_op->auth.data.length = auth_len >> 3; 2979 sym_op->auth.data.offset = auth_offset >> 3; 2980 } 2981 2982 return 0; 2983 } 2984 2985 static int 2986 create_wireless_algo_auth_cipher_operation( 2987 const uint8_t *auth_tag, unsigned int auth_tag_len, 2988 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2989 const uint8_t *auth_iv, uint8_t auth_iv_len, 2990 unsigned int data_pad_len, 2991 unsigned int cipher_len, unsigned int cipher_offset, 2992 unsigned int auth_len, unsigned int auth_offset, 2993 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2994 { 2995 struct crypto_testsuite_params *ts_params = &testsuite_params; 2996 struct crypto_unittest_params *ut_params = &unittest_params; 2997 2998 enum rte_crypto_cipher_algorithm cipher_algo = 2999 ut_params->cipher_xform.cipher.algo; 3000 enum rte_crypto_auth_algorithm auth_algo = 3001 ut_params->auth_xform.auth.algo; 3002 3003 /* Generate Crypto op data structure */ 3004 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 3005 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 3006 TEST_ASSERT_NOT_NULL(ut_params->op, 3007 "Failed to allocate pktmbuf offload"); 3008 3009 /* Set crypto operation data parameters */ 3010 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 3011 3012 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 3013 3014 /* set crypto operation mbufs */ 3015 sym_op->m_src = ut_params->ibuf; 3016 if (op_mode == OUT_OF_PLACE) 3017 sym_op->m_dst = ut_params->obuf; 3018 3019 /* digest */ 3020 if (!do_sgl) { 3021 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 3022 (op_mode == IN_PLACE ? 3023 ut_params->ibuf : ut_params->obuf), 3024 uint8_t *, data_pad_len); 3025 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 3026 (op_mode == IN_PLACE ? 3027 ut_params->ibuf : ut_params->obuf), 3028 data_pad_len); 3029 memset(sym_op->auth.digest.data, 0, auth_tag_len); 3030 } else { 3031 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 3032 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 3033 sym_op->m_src : sym_op->m_dst); 3034 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 3035 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 3036 sgl_buf = sgl_buf->next; 3037 } 3038 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 3039 uint8_t *, remaining_off); 3040 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 3041 remaining_off); 3042 memset(sym_op->auth.digest.data, 0, remaining_off); 3043 while (sgl_buf->next != NULL) { 3044 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 3045 0, rte_pktmbuf_data_len(sgl_buf)); 3046 sgl_buf = sgl_buf->next; 3047 } 3048 } 3049 3050 /* Copy digest for the verification */ 3051 if (verify) 3052 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 3053 3054 /* Copy cipher and auth IVs at the end of the crypto operation */ 3055 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 3056 ut_params->op, uint8_t *, IV_OFFSET); 3057 3058 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 3059 iv_ptr += cipher_iv_len; 3060 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 3061 3062 /* Only copy over the offset data needed from src to dst in OOP, 3063 * if the auth and cipher offsets are not aligned 3064 */ 3065 if (op_mode == OUT_OF_PLACE) { 3066 if (cipher_offset > auth_offset) 3067 rte_memcpy( 3068 rte_pktmbuf_mtod_offset( 3069 sym_op->m_dst, 3070 uint8_t *, auth_offset >> 3), 3071 rte_pktmbuf_mtod_offset( 3072 sym_op->m_src, 3073 uint8_t *, auth_offset >> 3), 3074 ((cipher_offset >> 3) - (auth_offset >> 3))); 3075 } 3076 3077 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 3078 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 3079 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 3080 sym_op->cipher.data.length = cipher_len; 3081 sym_op->cipher.data.offset = cipher_offset; 3082 } else { 3083 sym_op->cipher.data.length = cipher_len >> 3; 3084 sym_op->cipher.data.offset = cipher_offset >> 3; 3085 } 3086 3087 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 3088 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 3089 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 3090 sym_op->auth.data.length = auth_len; 3091 sym_op->auth.data.offset = auth_offset; 3092 } else { 3093 sym_op->auth.data.length = auth_len >> 3; 3094 sym_op->auth.data.offset = auth_offset >> 3; 3095 } 3096 3097 return 0; 3098 } 3099 3100 static int 3101 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 3102 { 3103 struct crypto_testsuite_params *ts_params = &testsuite_params; 3104 struct crypto_unittest_params *ut_params = &unittest_params; 3105 3106 int retval; 3107 unsigned plaintext_pad_len; 3108 unsigned plaintext_len; 3109 uint8_t *plaintext; 3110 struct rte_cryptodev_info dev_info; 3111 3112 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3113 uint64_t feat_flags = dev_info.feature_flags; 3114 3115 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3116 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3117 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3118 return TEST_SKIPPED; 3119 } 3120 3121 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3122 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3123 printf("Device doesn't support RAW data-path APIs.\n"); 3124 return TEST_SKIPPED; 3125 } 3126 3127 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3128 return TEST_SKIPPED; 3129 3130 /* Verify the capabilities */ 3131 struct rte_cryptodev_sym_capability_idx cap_idx; 3132 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3133 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3134 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3135 &cap_idx) == NULL) 3136 return TEST_SKIPPED; 3137 3138 /* Create SNOW 3G session */ 3139 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3140 tdata->key.data, tdata->key.len, 3141 tdata->auth_iv.len, tdata->digest.len, 3142 RTE_CRYPTO_AUTH_OP_GENERATE, 3143 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3144 if (retval < 0) 3145 return retval; 3146 3147 /* alloc mbuf and set payload */ 3148 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3149 3150 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3151 rte_pktmbuf_tailroom(ut_params->ibuf)); 3152 3153 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3154 /* Append data which is padded to a multiple of */ 3155 /* the algorithms block size */ 3156 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3157 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3158 plaintext_pad_len); 3159 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3160 3161 /* Create SNOW 3G operation */ 3162 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3163 tdata->auth_iv.data, tdata->auth_iv.len, 3164 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3165 tdata->validAuthLenInBits.len, 3166 0); 3167 if (retval < 0) 3168 return retval; 3169 3170 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3171 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3172 ut_params->op, 0, 1, 1, 0); 3173 else 3174 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3175 ut_params->op); 3176 ut_params->obuf = ut_params->op->sym->m_src; 3177 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3178 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3179 + plaintext_pad_len; 3180 3181 /* Validate obuf */ 3182 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3183 ut_params->digest, 3184 tdata->digest.data, 3185 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 3186 "SNOW 3G Generated auth tag not as expected"); 3187 3188 return 0; 3189 } 3190 3191 static int 3192 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 3193 { 3194 struct crypto_testsuite_params *ts_params = &testsuite_params; 3195 struct crypto_unittest_params *ut_params = &unittest_params; 3196 3197 int retval; 3198 unsigned plaintext_pad_len; 3199 unsigned plaintext_len; 3200 uint8_t *plaintext; 3201 struct rte_cryptodev_info dev_info; 3202 3203 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3204 uint64_t feat_flags = dev_info.feature_flags; 3205 3206 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3207 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3208 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3209 return TEST_SKIPPED; 3210 } 3211 3212 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3213 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3214 printf("Device doesn't support RAW data-path APIs.\n"); 3215 return TEST_SKIPPED; 3216 } 3217 3218 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3219 return TEST_SKIPPED; 3220 3221 /* Verify the capabilities */ 3222 struct rte_cryptodev_sym_capability_idx cap_idx; 3223 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3224 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3225 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3226 &cap_idx) == NULL) 3227 return TEST_SKIPPED; 3228 3229 /* Create SNOW 3G session */ 3230 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3231 tdata->key.data, tdata->key.len, 3232 tdata->auth_iv.len, tdata->digest.len, 3233 RTE_CRYPTO_AUTH_OP_VERIFY, 3234 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3235 if (retval < 0) 3236 return retval; 3237 /* alloc mbuf and set payload */ 3238 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3239 3240 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3241 rte_pktmbuf_tailroom(ut_params->ibuf)); 3242 3243 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3244 /* Append data which is padded to a multiple of */ 3245 /* the algorithms block size */ 3246 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3247 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3248 plaintext_pad_len); 3249 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3250 3251 /* Create SNOW 3G operation */ 3252 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3253 tdata->digest.len, 3254 tdata->auth_iv.data, tdata->auth_iv.len, 3255 plaintext_pad_len, 3256 RTE_CRYPTO_AUTH_OP_VERIFY, 3257 tdata->validAuthLenInBits.len, 3258 0); 3259 if (retval < 0) 3260 return retval; 3261 3262 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3263 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3264 ut_params->op, 0, 1, 1, 0); 3265 else 3266 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3267 ut_params->op); 3268 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3269 ut_params->obuf = ut_params->op->sym->m_src; 3270 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3271 + plaintext_pad_len; 3272 3273 /* Validate obuf */ 3274 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3275 return 0; 3276 else 3277 return -1; 3278 3279 return 0; 3280 } 3281 3282 static int 3283 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 3284 { 3285 struct crypto_testsuite_params *ts_params = &testsuite_params; 3286 struct crypto_unittest_params *ut_params = &unittest_params; 3287 3288 int retval; 3289 unsigned plaintext_pad_len; 3290 unsigned plaintext_len; 3291 uint8_t *plaintext; 3292 struct rte_cryptodev_info dev_info; 3293 3294 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3295 uint64_t feat_flags = dev_info.feature_flags; 3296 3297 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3298 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3299 printf("Device doesn't support RAW data-path APIs.\n"); 3300 return TEST_SKIPPED; 3301 } 3302 3303 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3304 return TEST_SKIPPED; 3305 3306 /* Verify the capabilities */ 3307 struct rte_cryptodev_sym_capability_idx cap_idx; 3308 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3309 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3310 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3311 &cap_idx) == NULL) 3312 return TEST_SKIPPED; 3313 3314 /* Create KASUMI session */ 3315 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3316 tdata->key.data, tdata->key.len, 3317 0, tdata->digest.len, 3318 RTE_CRYPTO_AUTH_OP_GENERATE, 3319 RTE_CRYPTO_AUTH_KASUMI_F9); 3320 if (retval < 0) 3321 return retval; 3322 3323 /* alloc mbuf and set payload */ 3324 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3325 3326 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3327 rte_pktmbuf_tailroom(ut_params->ibuf)); 3328 3329 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3330 /* Append data which is padded to a multiple of */ 3331 /* the algorithms block size */ 3332 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3333 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3334 plaintext_pad_len); 3335 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3336 3337 /* Create KASUMI operation */ 3338 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3339 NULL, 0, 3340 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3341 tdata->plaintext.len, 3342 0); 3343 if (retval < 0) 3344 return retval; 3345 3346 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3347 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 3348 ut_params->op); 3349 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3350 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3351 ut_params->op, 0, 1, 1, 0); 3352 else 3353 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3354 ut_params->op); 3355 3356 ut_params->obuf = ut_params->op->sym->m_src; 3357 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3358 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3359 + plaintext_pad_len; 3360 3361 /* Validate obuf */ 3362 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3363 ut_params->digest, 3364 tdata->digest.data, 3365 DIGEST_BYTE_LENGTH_KASUMI_F9, 3366 "KASUMI Generated auth tag not as expected"); 3367 3368 return 0; 3369 } 3370 3371 static int 3372 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 3373 { 3374 struct crypto_testsuite_params *ts_params = &testsuite_params; 3375 struct crypto_unittest_params *ut_params = &unittest_params; 3376 3377 int retval; 3378 unsigned plaintext_pad_len; 3379 unsigned plaintext_len; 3380 uint8_t *plaintext; 3381 struct rte_cryptodev_info dev_info; 3382 3383 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3384 uint64_t feat_flags = dev_info.feature_flags; 3385 3386 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3387 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3388 printf("Device doesn't support RAW data-path APIs.\n"); 3389 return TEST_SKIPPED; 3390 } 3391 3392 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3393 return TEST_SKIPPED; 3394 3395 /* Verify the capabilities */ 3396 struct rte_cryptodev_sym_capability_idx cap_idx; 3397 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3398 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3399 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3400 &cap_idx) == NULL) 3401 return TEST_SKIPPED; 3402 3403 /* Create KASUMI session */ 3404 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3405 tdata->key.data, tdata->key.len, 3406 0, tdata->digest.len, 3407 RTE_CRYPTO_AUTH_OP_VERIFY, 3408 RTE_CRYPTO_AUTH_KASUMI_F9); 3409 if (retval < 0) 3410 return retval; 3411 /* alloc mbuf and set payload */ 3412 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3413 3414 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3415 rte_pktmbuf_tailroom(ut_params->ibuf)); 3416 3417 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3418 /* Append data which is padded to a multiple */ 3419 /* of the algorithms block size */ 3420 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3421 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3422 plaintext_pad_len); 3423 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3424 3425 /* Create KASUMI operation */ 3426 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3427 tdata->digest.len, 3428 NULL, 0, 3429 plaintext_pad_len, 3430 RTE_CRYPTO_AUTH_OP_VERIFY, 3431 tdata->plaintext.len, 3432 0); 3433 if (retval < 0) 3434 return retval; 3435 3436 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3437 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3438 ut_params->op, 0, 1, 1, 0); 3439 else 3440 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3441 ut_params->op); 3442 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3443 ut_params->obuf = ut_params->op->sym->m_src; 3444 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3445 + plaintext_pad_len; 3446 3447 /* Validate obuf */ 3448 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3449 return 0; 3450 else 3451 return -1; 3452 3453 return 0; 3454 } 3455 3456 static int 3457 test_snow3g_hash_generate_test_case_1(void) 3458 { 3459 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3460 } 3461 3462 static int 3463 test_snow3g_hash_generate_test_case_2(void) 3464 { 3465 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3466 } 3467 3468 static int 3469 test_snow3g_hash_generate_test_case_3(void) 3470 { 3471 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3472 } 3473 3474 static int 3475 test_snow3g_hash_generate_test_case_4(void) 3476 { 3477 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3478 } 3479 3480 static int 3481 test_snow3g_hash_generate_test_case_5(void) 3482 { 3483 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3484 } 3485 3486 static int 3487 test_snow3g_hash_generate_test_case_6(void) 3488 { 3489 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3490 } 3491 3492 static int 3493 test_snow3g_hash_verify_test_case_1(void) 3494 { 3495 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3496 3497 } 3498 3499 static int 3500 test_snow3g_hash_verify_test_case_2(void) 3501 { 3502 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3503 } 3504 3505 static int 3506 test_snow3g_hash_verify_test_case_3(void) 3507 { 3508 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3509 } 3510 3511 static int 3512 test_snow3g_hash_verify_test_case_4(void) 3513 { 3514 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3515 } 3516 3517 static int 3518 test_snow3g_hash_verify_test_case_5(void) 3519 { 3520 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3521 } 3522 3523 static int 3524 test_snow3g_hash_verify_test_case_6(void) 3525 { 3526 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3527 } 3528 3529 static int 3530 test_kasumi_hash_generate_test_case_1(void) 3531 { 3532 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3533 } 3534 3535 static int 3536 test_kasumi_hash_generate_test_case_2(void) 3537 { 3538 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3539 } 3540 3541 static int 3542 test_kasumi_hash_generate_test_case_3(void) 3543 { 3544 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3545 } 3546 3547 static int 3548 test_kasumi_hash_generate_test_case_4(void) 3549 { 3550 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3551 } 3552 3553 static int 3554 test_kasumi_hash_generate_test_case_5(void) 3555 { 3556 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3557 } 3558 3559 static int 3560 test_kasumi_hash_generate_test_case_6(void) 3561 { 3562 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3563 } 3564 3565 static int 3566 test_kasumi_hash_verify_test_case_1(void) 3567 { 3568 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3569 } 3570 3571 static int 3572 test_kasumi_hash_verify_test_case_2(void) 3573 { 3574 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3575 } 3576 3577 static int 3578 test_kasumi_hash_verify_test_case_3(void) 3579 { 3580 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3581 } 3582 3583 static int 3584 test_kasumi_hash_verify_test_case_4(void) 3585 { 3586 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3587 } 3588 3589 static int 3590 test_kasumi_hash_verify_test_case_5(void) 3591 { 3592 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3593 } 3594 3595 static int 3596 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3597 { 3598 struct crypto_testsuite_params *ts_params = &testsuite_params; 3599 struct crypto_unittest_params *ut_params = &unittest_params; 3600 3601 int retval; 3602 uint8_t *plaintext, *ciphertext; 3603 unsigned plaintext_pad_len; 3604 unsigned plaintext_len; 3605 struct rte_cryptodev_info dev_info; 3606 3607 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3608 uint64_t feat_flags = dev_info.feature_flags; 3609 3610 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3611 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3612 printf("Device doesn't support RAW data-path APIs.\n"); 3613 return TEST_SKIPPED; 3614 } 3615 3616 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3617 return TEST_SKIPPED; 3618 3619 /* Verify the capabilities */ 3620 struct rte_cryptodev_sym_capability_idx cap_idx; 3621 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3622 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3623 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3624 &cap_idx) == NULL) 3625 return TEST_SKIPPED; 3626 3627 /* Create KASUMI session */ 3628 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3629 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3630 RTE_CRYPTO_CIPHER_KASUMI_F8, 3631 tdata->key.data, tdata->key.len, 3632 tdata->cipher_iv.len); 3633 if (retval < 0) 3634 return retval; 3635 3636 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3637 3638 /* Clear mbuf payload */ 3639 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3640 rte_pktmbuf_tailroom(ut_params->ibuf)); 3641 3642 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3643 /* Append data which is padded to a multiple */ 3644 /* of the algorithms block size */ 3645 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3646 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3647 plaintext_pad_len); 3648 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3649 3650 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3651 3652 /* Create KASUMI operation */ 3653 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3654 tdata->cipher_iv.len, 3655 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3656 tdata->validCipherOffsetInBits.len); 3657 if (retval < 0) 3658 return retval; 3659 3660 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3661 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3662 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3663 else 3664 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3665 ut_params->op); 3666 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3667 3668 ut_params->obuf = ut_params->op->sym->m_dst; 3669 if (ut_params->obuf) 3670 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3671 else 3672 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3673 3674 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3675 3676 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3677 (tdata->validCipherOffsetInBits.len >> 3); 3678 /* Validate obuf */ 3679 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3680 ciphertext, 3681 reference_ciphertext, 3682 tdata->validCipherLenInBits.len, 3683 "KASUMI Ciphertext data not as expected"); 3684 return 0; 3685 } 3686 3687 static int 3688 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3689 { 3690 struct crypto_testsuite_params *ts_params = &testsuite_params; 3691 struct crypto_unittest_params *ut_params = &unittest_params; 3692 3693 int retval; 3694 3695 unsigned int plaintext_pad_len; 3696 unsigned int plaintext_len; 3697 3698 uint8_t buffer[10000]; 3699 const uint8_t *ciphertext; 3700 3701 struct rte_cryptodev_info dev_info; 3702 3703 /* Verify the capabilities */ 3704 struct rte_cryptodev_sym_capability_idx cap_idx; 3705 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3706 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3707 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3708 &cap_idx) == NULL) 3709 return TEST_SKIPPED; 3710 3711 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3712 3713 uint64_t feat_flags = dev_info.feature_flags; 3714 3715 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3716 printf("Device doesn't support in-place scatter-gather. " 3717 "Test Skipped.\n"); 3718 return TEST_SKIPPED; 3719 } 3720 3721 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3722 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3723 printf("Device doesn't support RAW data-path APIs.\n"); 3724 return TEST_SKIPPED; 3725 } 3726 3727 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3728 return TEST_SKIPPED; 3729 3730 /* Create KASUMI session */ 3731 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3732 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3733 RTE_CRYPTO_CIPHER_KASUMI_F8, 3734 tdata->key.data, tdata->key.len, 3735 tdata->cipher_iv.len); 3736 if (retval < 0) 3737 return retval; 3738 3739 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3740 3741 3742 /* Append data which is padded to a multiple */ 3743 /* of the algorithms block size */ 3744 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3745 3746 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3747 plaintext_pad_len, 10, 0); 3748 3749 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3750 3751 /* Create KASUMI operation */ 3752 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3753 tdata->cipher_iv.len, 3754 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3755 tdata->validCipherOffsetInBits.len); 3756 if (retval < 0) 3757 return retval; 3758 3759 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3760 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3761 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3762 else 3763 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3764 ut_params->op); 3765 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3766 3767 ut_params->obuf = ut_params->op->sym->m_dst; 3768 3769 if (ut_params->obuf) 3770 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3771 plaintext_len, buffer); 3772 else 3773 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3774 tdata->validCipherOffsetInBits.len >> 3, 3775 plaintext_len, buffer); 3776 3777 /* Validate obuf */ 3778 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3779 3780 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3781 (tdata->validCipherOffsetInBits.len >> 3); 3782 /* Validate obuf */ 3783 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3784 ciphertext, 3785 reference_ciphertext, 3786 tdata->validCipherLenInBits.len, 3787 "KASUMI Ciphertext data not as expected"); 3788 return 0; 3789 } 3790 3791 static int 3792 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3793 { 3794 struct crypto_testsuite_params *ts_params = &testsuite_params; 3795 struct crypto_unittest_params *ut_params = &unittest_params; 3796 3797 int retval; 3798 uint8_t *plaintext, *ciphertext; 3799 unsigned plaintext_pad_len; 3800 unsigned plaintext_len; 3801 3802 /* Verify the capabilities */ 3803 struct rte_cryptodev_sym_capability_idx cap_idx; 3804 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3805 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3806 /* Data-path service does not support OOP */ 3807 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3808 &cap_idx) == NULL) 3809 return TEST_SKIPPED; 3810 3811 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3812 return TEST_SKIPPED; 3813 3814 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3815 return TEST_SKIPPED; 3816 3817 /* Create KASUMI session */ 3818 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3819 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3820 RTE_CRYPTO_CIPHER_KASUMI_F8, 3821 tdata->key.data, tdata->key.len, 3822 tdata->cipher_iv.len); 3823 if (retval < 0) 3824 return retval; 3825 3826 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3827 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3828 3829 /* Clear mbuf payload */ 3830 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3831 rte_pktmbuf_tailroom(ut_params->ibuf)); 3832 3833 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3834 /* Append data which is padded to a multiple */ 3835 /* of the algorithms block size */ 3836 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3837 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3838 plaintext_pad_len); 3839 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3840 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3841 3842 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3843 3844 /* Create KASUMI operation */ 3845 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3846 tdata->cipher_iv.len, 3847 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3848 tdata->validCipherOffsetInBits.len); 3849 if (retval < 0) 3850 return retval; 3851 3852 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3853 ut_params->op); 3854 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3855 3856 ut_params->obuf = ut_params->op->sym->m_dst; 3857 if (ut_params->obuf) 3858 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3859 else 3860 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3861 3862 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3863 3864 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3865 (tdata->validCipherOffsetInBits.len >> 3); 3866 /* Validate obuf */ 3867 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3868 ciphertext, 3869 reference_ciphertext, 3870 tdata->validCipherLenInBits.len, 3871 "KASUMI Ciphertext data not as expected"); 3872 return 0; 3873 } 3874 3875 static int 3876 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3877 { 3878 struct crypto_testsuite_params *ts_params = &testsuite_params; 3879 struct crypto_unittest_params *ut_params = &unittest_params; 3880 3881 int retval; 3882 unsigned int plaintext_pad_len; 3883 unsigned int plaintext_len; 3884 3885 const uint8_t *ciphertext; 3886 uint8_t buffer[2048]; 3887 3888 struct rte_cryptodev_info dev_info; 3889 3890 /* Verify the capabilities */ 3891 struct rte_cryptodev_sym_capability_idx cap_idx; 3892 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3893 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3894 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3895 &cap_idx) == NULL) 3896 return TEST_SKIPPED; 3897 3898 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3899 return TEST_SKIPPED; 3900 3901 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3902 return TEST_SKIPPED; 3903 3904 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3905 3906 uint64_t feat_flags = dev_info.feature_flags; 3907 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3908 printf("Device doesn't support out-of-place scatter-gather " 3909 "in both input and output mbufs. " 3910 "Test Skipped.\n"); 3911 return TEST_SKIPPED; 3912 } 3913 3914 /* Create KASUMI session */ 3915 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3916 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3917 RTE_CRYPTO_CIPHER_KASUMI_F8, 3918 tdata->key.data, tdata->key.len, 3919 tdata->cipher_iv.len); 3920 if (retval < 0) 3921 return retval; 3922 3923 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3924 /* Append data which is padded to a multiple */ 3925 /* of the algorithms block size */ 3926 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3927 3928 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3929 plaintext_pad_len, 10, 0); 3930 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3931 plaintext_pad_len, 3, 0); 3932 3933 /* Append data which is padded to a multiple */ 3934 /* of the algorithms block size */ 3935 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3936 3937 /* Create KASUMI operation */ 3938 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3939 tdata->cipher_iv.len, 3940 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3941 tdata->validCipherOffsetInBits.len); 3942 if (retval < 0) 3943 return retval; 3944 3945 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3946 ut_params->op); 3947 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3948 3949 ut_params->obuf = ut_params->op->sym->m_dst; 3950 if (ut_params->obuf) 3951 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3952 plaintext_pad_len, buffer); 3953 else 3954 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3955 tdata->validCipherOffsetInBits.len >> 3, 3956 plaintext_pad_len, buffer); 3957 3958 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3959 (tdata->validCipherOffsetInBits.len >> 3); 3960 /* Validate obuf */ 3961 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3962 ciphertext, 3963 reference_ciphertext, 3964 tdata->validCipherLenInBits.len, 3965 "KASUMI Ciphertext data not as expected"); 3966 return 0; 3967 } 3968 3969 3970 static int 3971 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3972 { 3973 struct crypto_testsuite_params *ts_params = &testsuite_params; 3974 struct crypto_unittest_params *ut_params = &unittest_params; 3975 3976 int retval; 3977 uint8_t *ciphertext, *plaintext; 3978 unsigned ciphertext_pad_len; 3979 unsigned ciphertext_len; 3980 3981 /* Verify the capabilities */ 3982 struct rte_cryptodev_sym_capability_idx cap_idx; 3983 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3984 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3985 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3986 &cap_idx) == NULL) 3987 return TEST_SKIPPED; 3988 3989 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3990 return TEST_SKIPPED; 3991 3992 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3993 return TEST_SKIPPED; 3994 3995 /* Create KASUMI session */ 3996 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3997 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3998 RTE_CRYPTO_CIPHER_KASUMI_F8, 3999 tdata->key.data, tdata->key.len, 4000 tdata->cipher_iv.len); 4001 if (retval < 0) 4002 return retval; 4003 4004 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4005 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4006 4007 /* Clear mbuf payload */ 4008 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4009 rte_pktmbuf_tailroom(ut_params->ibuf)); 4010 4011 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4012 /* Append data which is padded to a multiple */ 4013 /* of the algorithms block size */ 4014 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 4015 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4016 ciphertext_pad_len); 4017 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4018 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4019 4020 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4021 4022 /* Create KASUMI operation */ 4023 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4024 tdata->cipher_iv.len, 4025 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 4026 tdata->validCipherOffsetInBits.len); 4027 if (retval < 0) 4028 return retval; 4029 4030 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4031 ut_params->op); 4032 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4033 4034 ut_params->obuf = ut_params->op->sym->m_dst; 4035 if (ut_params->obuf) 4036 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4037 else 4038 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4039 4040 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4041 4042 const uint8_t *reference_plaintext = tdata->plaintext.data + 4043 (tdata->validCipherOffsetInBits.len >> 3); 4044 /* Validate obuf */ 4045 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4046 plaintext, 4047 reference_plaintext, 4048 tdata->validCipherLenInBits.len, 4049 "KASUMI Plaintext data not as expected"); 4050 return 0; 4051 } 4052 4053 static int 4054 test_kasumi_decryption(const struct kasumi_test_data *tdata) 4055 { 4056 struct crypto_testsuite_params *ts_params = &testsuite_params; 4057 struct crypto_unittest_params *ut_params = &unittest_params; 4058 4059 int retval; 4060 uint8_t *ciphertext, *plaintext; 4061 unsigned ciphertext_pad_len; 4062 unsigned ciphertext_len; 4063 struct rte_cryptodev_info dev_info; 4064 4065 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4066 uint64_t feat_flags = dev_info.feature_flags; 4067 4068 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4069 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4070 printf("Device doesn't support RAW data-path APIs.\n"); 4071 return TEST_SKIPPED; 4072 } 4073 4074 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4075 return TEST_SKIPPED; 4076 4077 /* Verify the capabilities */ 4078 struct rte_cryptodev_sym_capability_idx cap_idx; 4079 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4080 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4081 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4082 &cap_idx) == NULL) 4083 return TEST_SKIPPED; 4084 4085 /* Create KASUMI session */ 4086 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4087 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4088 RTE_CRYPTO_CIPHER_KASUMI_F8, 4089 tdata->key.data, tdata->key.len, 4090 tdata->cipher_iv.len); 4091 if (retval < 0) 4092 return retval; 4093 4094 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4095 4096 /* Clear mbuf payload */ 4097 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4098 rte_pktmbuf_tailroom(ut_params->ibuf)); 4099 4100 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4101 /* Append data which is padded to a multiple */ 4102 /* of the algorithms block size */ 4103 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 4104 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4105 ciphertext_pad_len); 4106 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4107 4108 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4109 4110 /* Create KASUMI operation */ 4111 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4112 tdata->cipher_iv.len, 4113 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 4114 tdata->validCipherOffsetInBits.len); 4115 if (retval < 0) 4116 return retval; 4117 4118 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4119 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4120 ut_params->op, 1, 0, 1, 0); 4121 else 4122 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4123 ut_params->op); 4124 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4125 4126 ut_params->obuf = ut_params->op->sym->m_dst; 4127 if (ut_params->obuf) 4128 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4129 else 4130 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4131 4132 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4133 4134 const uint8_t *reference_plaintext = tdata->plaintext.data + 4135 (tdata->validCipherOffsetInBits.len >> 3); 4136 /* Validate obuf */ 4137 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4138 plaintext, 4139 reference_plaintext, 4140 tdata->validCipherLenInBits.len, 4141 "KASUMI Plaintext data not as expected"); 4142 return 0; 4143 } 4144 4145 static int 4146 test_snow3g_encryption(const struct snow3g_test_data *tdata) 4147 { 4148 struct crypto_testsuite_params *ts_params = &testsuite_params; 4149 struct crypto_unittest_params *ut_params = &unittest_params; 4150 4151 int retval; 4152 uint8_t *plaintext, *ciphertext; 4153 unsigned plaintext_pad_len; 4154 unsigned plaintext_len; 4155 struct rte_cryptodev_info dev_info; 4156 4157 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4158 uint64_t feat_flags = dev_info.feature_flags; 4159 4160 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4161 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4162 printf("Device doesn't support RAW data-path APIs.\n"); 4163 return TEST_SKIPPED; 4164 } 4165 4166 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4167 return TEST_SKIPPED; 4168 4169 /* Verify the capabilities */ 4170 struct rte_cryptodev_sym_capability_idx cap_idx; 4171 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4172 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4173 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4174 &cap_idx) == NULL) 4175 return TEST_SKIPPED; 4176 4177 /* Create SNOW 3G session */ 4178 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4179 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4180 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4181 tdata->key.data, tdata->key.len, 4182 tdata->cipher_iv.len); 4183 if (retval < 0) 4184 return retval; 4185 4186 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4187 4188 /* Clear mbuf payload */ 4189 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4190 rte_pktmbuf_tailroom(ut_params->ibuf)); 4191 4192 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4193 /* Append data which is padded to a multiple of */ 4194 /* the algorithms block size */ 4195 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4196 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4197 plaintext_pad_len); 4198 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4199 4200 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4201 4202 /* Create SNOW 3G operation */ 4203 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4204 tdata->cipher_iv.len, 4205 tdata->validCipherLenInBits.len, 4206 0); 4207 if (retval < 0) 4208 return retval; 4209 4210 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4211 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4212 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4213 else 4214 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4215 ut_params->op); 4216 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4217 4218 ut_params->obuf = ut_params->op->sym->m_dst; 4219 if (ut_params->obuf) 4220 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4221 else 4222 ciphertext = plaintext; 4223 4224 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4225 4226 /* Validate obuf */ 4227 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4228 ciphertext, 4229 tdata->ciphertext.data, 4230 tdata->validDataLenInBits.len, 4231 "SNOW 3G Ciphertext data not as expected"); 4232 return 0; 4233 } 4234 4235 4236 static int 4237 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 4238 { 4239 struct crypto_testsuite_params *ts_params = &testsuite_params; 4240 struct crypto_unittest_params *ut_params = &unittest_params; 4241 uint8_t *plaintext, *ciphertext; 4242 4243 int retval; 4244 unsigned plaintext_pad_len; 4245 unsigned plaintext_len; 4246 struct rte_cryptodev_info dev_info; 4247 4248 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4249 uint64_t feat_flags = dev_info.feature_flags; 4250 4251 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4252 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4253 printf("Device does not support RAW data-path APIs.\n"); 4254 return -ENOTSUP; 4255 } 4256 4257 /* Verify the capabilities */ 4258 struct rte_cryptodev_sym_capability_idx cap_idx; 4259 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4260 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4261 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4262 &cap_idx) == NULL) 4263 return TEST_SKIPPED; 4264 4265 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4266 return TEST_SKIPPED; 4267 4268 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4269 return TEST_SKIPPED; 4270 4271 /* Create SNOW 3G session */ 4272 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4273 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4274 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4275 tdata->key.data, tdata->key.len, 4276 tdata->cipher_iv.len); 4277 if (retval < 0) 4278 return retval; 4279 4280 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4281 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4282 4283 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4284 "Failed to allocate input buffer in mempool"); 4285 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4286 "Failed to allocate output buffer in mempool"); 4287 4288 /* Clear mbuf payload */ 4289 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4290 rte_pktmbuf_tailroom(ut_params->ibuf)); 4291 4292 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4293 /* Append data which is padded to a multiple of */ 4294 /* the algorithms block size */ 4295 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4296 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4297 plaintext_pad_len); 4298 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4299 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4300 4301 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4302 4303 /* Create SNOW 3G operation */ 4304 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4305 tdata->cipher_iv.len, 4306 tdata->validCipherLenInBits.len, 4307 0); 4308 if (retval < 0) 4309 return retval; 4310 4311 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4312 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4313 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4314 else 4315 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4316 ut_params->op); 4317 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4318 4319 ut_params->obuf = ut_params->op->sym->m_dst; 4320 if (ut_params->obuf) 4321 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4322 else 4323 ciphertext = plaintext; 4324 4325 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4326 4327 /* Validate obuf */ 4328 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4329 ciphertext, 4330 tdata->ciphertext.data, 4331 tdata->validDataLenInBits.len, 4332 "SNOW 3G Ciphertext data not as expected"); 4333 return 0; 4334 } 4335 4336 static int 4337 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 4338 { 4339 struct crypto_testsuite_params *ts_params = &testsuite_params; 4340 struct crypto_unittest_params *ut_params = &unittest_params; 4341 4342 int retval; 4343 unsigned int plaintext_pad_len; 4344 unsigned int plaintext_len; 4345 uint8_t buffer[10000]; 4346 const uint8_t *ciphertext; 4347 4348 struct rte_cryptodev_info dev_info; 4349 4350 /* Verify the capabilities */ 4351 struct rte_cryptodev_sym_capability_idx cap_idx; 4352 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4353 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4354 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4355 &cap_idx) == NULL) 4356 return TEST_SKIPPED; 4357 4358 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4359 return TEST_SKIPPED; 4360 4361 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4362 return TEST_SKIPPED; 4363 4364 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4365 4366 uint64_t feat_flags = dev_info.feature_flags; 4367 4368 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4369 printf("Device doesn't support out-of-place scatter-gather " 4370 "in both input and output mbufs. " 4371 "Test Skipped.\n"); 4372 return TEST_SKIPPED; 4373 } 4374 4375 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4376 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4377 printf("Device does not support RAW data-path APIs.\n"); 4378 return -ENOTSUP; 4379 } 4380 4381 /* Create SNOW 3G session */ 4382 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4383 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4384 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4385 tdata->key.data, tdata->key.len, 4386 tdata->cipher_iv.len); 4387 if (retval < 0) 4388 return retval; 4389 4390 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4391 /* Append data which is padded to a multiple of */ 4392 /* the algorithms block size */ 4393 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4394 4395 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4396 plaintext_pad_len, 10, 0); 4397 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4398 plaintext_pad_len, 3, 0); 4399 4400 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4401 "Failed to allocate input buffer in mempool"); 4402 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4403 "Failed to allocate output buffer in mempool"); 4404 4405 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 4406 4407 /* Create SNOW 3G operation */ 4408 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4409 tdata->cipher_iv.len, 4410 tdata->validCipherLenInBits.len, 4411 0); 4412 if (retval < 0) 4413 return retval; 4414 4415 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4416 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4417 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4418 else 4419 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4420 ut_params->op); 4421 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4422 4423 ut_params->obuf = ut_params->op->sym->m_dst; 4424 if (ut_params->obuf) 4425 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4426 plaintext_len, buffer); 4427 else 4428 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4429 plaintext_len, buffer); 4430 4431 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4432 4433 /* Validate obuf */ 4434 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4435 ciphertext, 4436 tdata->ciphertext.data, 4437 tdata->validDataLenInBits.len, 4438 "SNOW 3G Ciphertext data not as expected"); 4439 4440 return 0; 4441 } 4442 4443 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 4444 static void 4445 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 4446 { 4447 uint8_t curr_byte, prev_byte; 4448 uint32_t length_in_bytes = ceil_byte_length(length + offset); 4449 uint8_t lower_byte_mask = (1 << offset) - 1; 4450 unsigned i; 4451 4452 prev_byte = buffer[0]; 4453 buffer[0] >>= offset; 4454 4455 for (i = 1; i < length_in_bytes; i++) { 4456 curr_byte = buffer[i]; 4457 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 4458 (curr_byte >> offset); 4459 prev_byte = curr_byte; 4460 } 4461 } 4462 4463 static int 4464 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 4465 { 4466 struct crypto_testsuite_params *ts_params = &testsuite_params; 4467 struct crypto_unittest_params *ut_params = &unittest_params; 4468 uint8_t *plaintext, *ciphertext; 4469 int retval; 4470 uint32_t plaintext_len; 4471 uint32_t plaintext_pad_len; 4472 uint8_t extra_offset = 4; 4473 uint8_t *expected_ciphertext_shifted; 4474 struct rte_cryptodev_info dev_info; 4475 4476 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4477 uint64_t feat_flags = dev_info.feature_flags; 4478 4479 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4480 ((tdata->validDataLenInBits.len % 8) != 0)) { 4481 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4482 return TEST_SKIPPED; 4483 } 4484 4485 /* Verify the capabilities */ 4486 struct rte_cryptodev_sym_capability_idx cap_idx; 4487 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4488 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4489 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4490 &cap_idx) == NULL) 4491 return TEST_SKIPPED; 4492 4493 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4494 return TEST_SKIPPED; 4495 4496 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4497 return TEST_SKIPPED; 4498 4499 /* Create SNOW 3G session */ 4500 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4501 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4502 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4503 tdata->key.data, tdata->key.len, 4504 tdata->cipher_iv.len); 4505 if (retval < 0) 4506 return retval; 4507 4508 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4509 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4510 4511 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4512 "Failed to allocate input buffer in mempool"); 4513 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4514 "Failed to allocate output buffer in mempool"); 4515 4516 /* Clear mbuf payload */ 4517 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4518 rte_pktmbuf_tailroom(ut_params->ibuf)); 4519 4520 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4521 /* 4522 * Append data which is padded to a 4523 * multiple of the algorithms block size 4524 */ 4525 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4526 4527 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4528 plaintext_pad_len); 4529 4530 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4531 4532 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4533 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4534 4535 #ifdef RTE_APP_TEST_DEBUG 4536 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4537 #endif 4538 /* Create SNOW 3G operation */ 4539 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4540 tdata->cipher_iv.len, 4541 tdata->validCipherLenInBits.len, 4542 extra_offset); 4543 if (retval < 0) 4544 return retval; 4545 4546 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4547 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4548 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4549 else 4550 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4551 ut_params->op); 4552 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4553 4554 ut_params->obuf = ut_params->op->sym->m_dst; 4555 if (ut_params->obuf) 4556 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4557 else 4558 ciphertext = plaintext; 4559 4560 #ifdef RTE_APP_TEST_DEBUG 4561 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4562 #endif 4563 4564 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4565 4566 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4567 "failed to reserve memory for ciphertext shifted\n"); 4568 4569 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4570 ceil_byte_length(tdata->ciphertext.len)); 4571 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4572 extra_offset); 4573 /* Validate obuf */ 4574 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4575 ciphertext, 4576 expected_ciphertext_shifted, 4577 tdata->validDataLenInBits.len, 4578 extra_offset, 4579 "SNOW 3G Ciphertext data not as expected"); 4580 return 0; 4581 } 4582 4583 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4584 { 4585 struct crypto_testsuite_params *ts_params = &testsuite_params; 4586 struct crypto_unittest_params *ut_params = &unittest_params; 4587 4588 int retval; 4589 4590 uint8_t *plaintext, *ciphertext; 4591 unsigned ciphertext_pad_len; 4592 unsigned ciphertext_len; 4593 struct rte_cryptodev_info dev_info; 4594 4595 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4596 uint64_t feat_flags = dev_info.feature_flags; 4597 4598 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4599 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4600 printf("Device doesn't support RAW data-path APIs.\n"); 4601 return TEST_SKIPPED; 4602 } 4603 4604 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4605 return TEST_SKIPPED; 4606 4607 /* Verify the capabilities */ 4608 struct rte_cryptodev_sym_capability_idx cap_idx; 4609 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4610 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4611 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4612 &cap_idx) == NULL) 4613 return TEST_SKIPPED; 4614 4615 /* Create SNOW 3G session */ 4616 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4617 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4618 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4619 tdata->key.data, tdata->key.len, 4620 tdata->cipher_iv.len); 4621 if (retval < 0) 4622 return retval; 4623 4624 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4625 4626 /* Clear mbuf payload */ 4627 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4628 rte_pktmbuf_tailroom(ut_params->ibuf)); 4629 4630 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4631 /* Append data which is padded to a multiple of */ 4632 /* the algorithms block size */ 4633 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4634 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4635 ciphertext_pad_len); 4636 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4637 4638 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4639 4640 /* Create SNOW 3G operation */ 4641 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4642 tdata->cipher_iv.len, 4643 tdata->validCipherLenInBits.len, 4644 tdata->cipher.offset_bits); 4645 if (retval < 0) 4646 return retval; 4647 4648 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4649 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4650 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4651 else 4652 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4653 ut_params->op); 4654 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4655 ut_params->obuf = ut_params->op->sym->m_dst; 4656 if (ut_params->obuf) 4657 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4658 else 4659 plaintext = ciphertext; 4660 4661 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4662 4663 /* Validate obuf */ 4664 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4665 tdata->plaintext.data, 4666 tdata->validDataLenInBits.len, 4667 "SNOW 3G Plaintext data not as expected"); 4668 return 0; 4669 } 4670 4671 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4672 { 4673 struct crypto_testsuite_params *ts_params = &testsuite_params; 4674 struct crypto_unittest_params *ut_params = &unittest_params; 4675 4676 int retval; 4677 4678 uint8_t *plaintext, *ciphertext; 4679 unsigned ciphertext_pad_len; 4680 unsigned ciphertext_len; 4681 struct rte_cryptodev_info dev_info; 4682 4683 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4684 uint64_t feat_flags = dev_info.feature_flags; 4685 4686 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4687 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4688 printf("Device does not support RAW data-path APIs.\n"); 4689 return -ENOTSUP; 4690 } 4691 /* Verify the capabilities */ 4692 struct rte_cryptodev_sym_capability_idx cap_idx; 4693 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4694 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4695 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4696 &cap_idx) == NULL) 4697 return TEST_SKIPPED; 4698 4699 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4700 return TEST_SKIPPED; 4701 4702 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4703 return TEST_SKIPPED; 4704 4705 /* Create SNOW 3G session */ 4706 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4707 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4708 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4709 tdata->key.data, tdata->key.len, 4710 tdata->cipher_iv.len); 4711 if (retval < 0) 4712 return retval; 4713 4714 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4715 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4716 4717 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4718 "Failed to allocate input buffer"); 4719 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4720 "Failed to allocate output buffer"); 4721 4722 /* Clear mbuf payload */ 4723 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4724 rte_pktmbuf_tailroom(ut_params->ibuf)); 4725 4726 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4727 rte_pktmbuf_tailroom(ut_params->obuf)); 4728 4729 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4730 /* Append data which is padded to a multiple of */ 4731 /* the algorithms block size */ 4732 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4733 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4734 ciphertext_pad_len); 4735 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4736 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4737 4738 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4739 4740 /* Create SNOW 3G operation */ 4741 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4742 tdata->cipher_iv.len, 4743 tdata->validCipherLenInBits.len, 4744 0); 4745 if (retval < 0) 4746 return retval; 4747 4748 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4749 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4750 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4751 else 4752 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4753 ut_params->op); 4754 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4755 ut_params->obuf = ut_params->op->sym->m_dst; 4756 if (ut_params->obuf) 4757 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4758 else 4759 plaintext = ciphertext; 4760 4761 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4762 4763 /* Validate obuf */ 4764 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4765 tdata->plaintext.data, 4766 tdata->validDataLenInBits.len, 4767 "SNOW 3G Plaintext data not as expected"); 4768 return 0; 4769 } 4770 4771 static int 4772 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4773 { 4774 struct crypto_testsuite_params *ts_params = &testsuite_params; 4775 struct crypto_unittest_params *ut_params = &unittest_params; 4776 4777 int retval; 4778 4779 uint8_t *plaintext, *ciphertext; 4780 unsigned int plaintext_pad_len; 4781 unsigned int plaintext_len; 4782 4783 struct rte_cryptodev_info dev_info; 4784 struct rte_cryptodev_sym_capability_idx cap_idx; 4785 4786 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4787 uint64_t feat_flags = dev_info.feature_flags; 4788 4789 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4790 ((tdata->validAuthLenInBits.len % 8 != 0) || 4791 (tdata->validDataLenInBits.len % 8 != 0))) { 4792 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4793 return TEST_SKIPPED; 4794 } 4795 4796 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4797 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4798 printf("Device doesn't support RAW data-path APIs.\n"); 4799 return TEST_SKIPPED; 4800 } 4801 4802 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4803 return TEST_SKIPPED; 4804 4805 /* Check if device supports ZUC EEA3 */ 4806 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4807 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4808 4809 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4810 &cap_idx) == NULL) 4811 return TEST_SKIPPED; 4812 4813 /* Check if device supports ZUC EIA3 */ 4814 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4815 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4816 4817 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4818 &cap_idx) == NULL) 4819 return TEST_SKIPPED; 4820 4821 /* Create ZUC session */ 4822 retval = create_zuc_cipher_auth_encrypt_generate_session( 4823 ts_params->valid_devs[0], 4824 tdata); 4825 if (retval != 0) 4826 return retval; 4827 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4828 4829 /* clear mbuf payload */ 4830 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4831 rte_pktmbuf_tailroom(ut_params->ibuf)); 4832 4833 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4834 /* Append data which is padded to a multiple of */ 4835 /* the algorithms block size */ 4836 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4837 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4838 plaintext_pad_len); 4839 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4840 4841 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4842 4843 /* Create ZUC operation */ 4844 retval = create_zuc_cipher_hash_generate_operation(tdata); 4845 if (retval < 0) 4846 return retval; 4847 4848 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4849 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4850 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4851 else 4852 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4853 ut_params->op); 4854 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4855 ut_params->obuf = ut_params->op->sym->m_src; 4856 if (ut_params->obuf) 4857 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4858 else 4859 ciphertext = plaintext; 4860 4861 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4862 /* Validate obuf */ 4863 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4864 ciphertext, 4865 tdata->ciphertext.data, 4866 tdata->validDataLenInBits.len, 4867 "ZUC Ciphertext data not as expected"); 4868 4869 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4870 + plaintext_pad_len; 4871 4872 /* Validate obuf */ 4873 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4874 ut_params->digest, 4875 tdata->digest.data, 4876 4, 4877 "ZUC Generated auth tag not as expected"); 4878 return 0; 4879 } 4880 4881 static int 4882 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4883 { 4884 struct crypto_testsuite_params *ts_params = &testsuite_params; 4885 struct crypto_unittest_params *ut_params = &unittest_params; 4886 4887 int retval; 4888 4889 uint8_t *plaintext, *ciphertext; 4890 unsigned plaintext_pad_len; 4891 unsigned plaintext_len; 4892 struct rte_cryptodev_info dev_info; 4893 4894 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4895 uint64_t feat_flags = dev_info.feature_flags; 4896 4897 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4898 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4899 printf("Device doesn't support RAW data-path APIs.\n"); 4900 return TEST_SKIPPED; 4901 } 4902 4903 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4904 return TEST_SKIPPED; 4905 4906 /* Verify the capabilities */ 4907 struct rte_cryptodev_sym_capability_idx cap_idx; 4908 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4909 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4910 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4911 &cap_idx) == NULL) 4912 return TEST_SKIPPED; 4913 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4914 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4915 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4916 &cap_idx) == NULL) 4917 return TEST_SKIPPED; 4918 4919 /* Create SNOW 3G session */ 4920 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4921 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4922 RTE_CRYPTO_AUTH_OP_GENERATE, 4923 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4924 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4925 tdata->key.data, tdata->key.len, 4926 tdata->auth_iv.len, tdata->digest.len, 4927 tdata->cipher_iv.len); 4928 if (retval != 0) 4929 return retval; 4930 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4931 4932 /* clear mbuf payload */ 4933 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4934 rte_pktmbuf_tailroom(ut_params->ibuf)); 4935 4936 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4937 /* Append data which is padded to a multiple of */ 4938 /* the algorithms block size */ 4939 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4940 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4941 plaintext_pad_len); 4942 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4943 4944 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4945 4946 /* Create SNOW 3G operation */ 4947 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4948 tdata->digest.len, tdata->auth_iv.data, 4949 tdata->auth_iv.len, 4950 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4951 tdata->cipher_iv.data, tdata->cipher_iv.len, 4952 tdata->validCipherLenInBits.len, 4953 0, 4954 tdata->validAuthLenInBits.len, 4955 0 4956 ); 4957 if (retval < 0) 4958 return retval; 4959 4960 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4961 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4962 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4963 else 4964 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4965 ut_params->op); 4966 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4967 ut_params->obuf = ut_params->op->sym->m_src; 4968 if (ut_params->obuf) 4969 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4970 else 4971 ciphertext = plaintext; 4972 4973 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4974 /* Validate obuf */ 4975 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4976 ciphertext, 4977 tdata->ciphertext.data, 4978 tdata->validDataLenInBits.len, 4979 "SNOW 3G Ciphertext data not as expected"); 4980 4981 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4982 + plaintext_pad_len; 4983 4984 /* Validate obuf */ 4985 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4986 ut_params->digest, 4987 tdata->digest.data, 4988 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4989 "SNOW 3G Generated auth tag not as expected"); 4990 return 0; 4991 } 4992 4993 static int 4994 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4995 uint8_t op_mode, uint8_t verify) 4996 { 4997 struct crypto_testsuite_params *ts_params = &testsuite_params; 4998 struct crypto_unittest_params *ut_params = &unittest_params; 4999 5000 int retval; 5001 5002 uint8_t *plaintext = NULL, *ciphertext = NULL; 5003 unsigned int plaintext_pad_len; 5004 unsigned int plaintext_len; 5005 unsigned int ciphertext_pad_len; 5006 unsigned int ciphertext_len; 5007 5008 struct rte_cryptodev_info dev_info; 5009 5010 /* Verify the capabilities */ 5011 struct rte_cryptodev_sym_capability_idx cap_idx; 5012 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5013 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5014 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5015 &cap_idx) == NULL) 5016 return TEST_SKIPPED; 5017 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5018 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5019 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5020 &cap_idx) == NULL) 5021 return TEST_SKIPPED; 5022 5023 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5024 return TEST_SKIPPED; 5025 5026 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5027 5028 uint64_t feat_flags = dev_info.feature_flags; 5029 5030 if (op_mode == OUT_OF_PLACE) { 5031 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5032 printf("Device doesn't support digest encrypted.\n"); 5033 return TEST_SKIPPED; 5034 } 5035 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5036 return TEST_SKIPPED; 5037 } 5038 5039 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5040 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5041 printf("Device doesn't support RAW data-path APIs.\n"); 5042 return TEST_SKIPPED; 5043 } 5044 5045 /* Create SNOW 3G session */ 5046 retval = create_wireless_algo_auth_cipher_session( 5047 ts_params->valid_devs[0], 5048 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5049 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5050 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5051 : RTE_CRYPTO_AUTH_OP_GENERATE), 5052 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5053 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5054 tdata->key.data, tdata->key.len, 5055 tdata->auth_iv.len, tdata->digest.len, 5056 tdata->cipher_iv.len); 5057 if (retval != 0) 5058 return retval; 5059 5060 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5061 if (op_mode == OUT_OF_PLACE) 5062 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5063 5064 /* clear mbuf payload */ 5065 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5066 rte_pktmbuf_tailroom(ut_params->ibuf)); 5067 if (op_mode == OUT_OF_PLACE) 5068 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5069 rte_pktmbuf_tailroom(ut_params->obuf)); 5070 5071 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5072 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5073 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5074 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5075 5076 if (verify) { 5077 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5078 ciphertext_pad_len); 5079 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5080 if (op_mode == OUT_OF_PLACE) 5081 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5082 debug_hexdump(stdout, "ciphertext:", ciphertext, 5083 ciphertext_len); 5084 } else { 5085 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5086 plaintext_pad_len); 5087 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5088 if (op_mode == OUT_OF_PLACE) 5089 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5090 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5091 } 5092 5093 /* Create SNOW 3G operation */ 5094 retval = create_wireless_algo_auth_cipher_operation( 5095 tdata->digest.data, tdata->digest.len, 5096 tdata->cipher_iv.data, tdata->cipher_iv.len, 5097 tdata->auth_iv.data, tdata->auth_iv.len, 5098 (tdata->digest.offset_bytes == 0 ? 5099 (verify ? ciphertext_pad_len : plaintext_pad_len) 5100 : tdata->digest.offset_bytes), 5101 tdata->validCipherLenInBits.len, 5102 tdata->cipher.offset_bits, 5103 tdata->validAuthLenInBits.len, 5104 tdata->auth.offset_bits, 5105 op_mode, 0, verify); 5106 5107 if (retval < 0) 5108 return retval; 5109 5110 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5111 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5112 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5113 else 5114 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5115 ut_params->op); 5116 5117 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5118 5119 ut_params->obuf = (op_mode == IN_PLACE ? 5120 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5121 5122 if (verify) { 5123 if (ut_params->obuf) 5124 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5125 uint8_t *); 5126 else 5127 plaintext = ciphertext + 5128 (tdata->cipher.offset_bits >> 3); 5129 5130 debug_hexdump(stdout, "plaintext:", plaintext, 5131 (tdata->plaintext.len >> 3) - tdata->digest.len); 5132 debug_hexdump(stdout, "plaintext expected:", 5133 tdata->plaintext.data, 5134 (tdata->plaintext.len >> 3) - tdata->digest.len); 5135 } else { 5136 if (ut_params->obuf) 5137 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5138 uint8_t *); 5139 else 5140 ciphertext = plaintext; 5141 5142 debug_hexdump(stdout, "ciphertext:", ciphertext, 5143 ciphertext_len); 5144 debug_hexdump(stdout, "ciphertext expected:", 5145 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5146 5147 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5148 + (tdata->digest.offset_bytes == 0 ? 5149 plaintext_pad_len : tdata->digest.offset_bytes); 5150 5151 debug_hexdump(stdout, "digest:", ut_params->digest, 5152 tdata->digest.len); 5153 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 5154 tdata->digest.len); 5155 } 5156 5157 /* Validate obuf */ 5158 if (verify) { 5159 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5160 plaintext, 5161 tdata->plaintext.data, 5162 (tdata->plaintext.len - tdata->cipher.offset_bits - 5163 (tdata->digest.len << 3)), 5164 tdata->cipher.offset_bits, 5165 "SNOW 3G Plaintext data not as expected"); 5166 } else { 5167 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5168 ciphertext, 5169 tdata->ciphertext.data, 5170 (tdata->validDataLenInBits.len - 5171 tdata->cipher.offset_bits), 5172 tdata->cipher.offset_bits, 5173 "SNOW 3G Ciphertext data not as expected"); 5174 5175 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5176 ut_params->digest, 5177 tdata->digest.data, 5178 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5179 "SNOW 3G Generated auth tag not as expected"); 5180 } 5181 return 0; 5182 } 5183 5184 static int 5185 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 5186 uint8_t op_mode, uint8_t verify) 5187 { 5188 struct crypto_testsuite_params *ts_params = &testsuite_params; 5189 struct crypto_unittest_params *ut_params = &unittest_params; 5190 5191 int retval; 5192 5193 const uint8_t *plaintext = NULL; 5194 const uint8_t *ciphertext = NULL; 5195 const uint8_t *digest = NULL; 5196 unsigned int plaintext_pad_len; 5197 unsigned int plaintext_len; 5198 unsigned int ciphertext_pad_len; 5199 unsigned int ciphertext_len; 5200 uint8_t buffer[10000]; 5201 uint8_t digest_buffer[10000]; 5202 5203 struct rte_cryptodev_info dev_info; 5204 5205 /* Verify the capabilities */ 5206 struct rte_cryptodev_sym_capability_idx cap_idx; 5207 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5208 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5209 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5210 &cap_idx) == NULL) 5211 return TEST_SKIPPED; 5212 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5213 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5214 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5215 &cap_idx) == NULL) 5216 return TEST_SKIPPED; 5217 5218 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5219 return TEST_SKIPPED; 5220 5221 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5222 5223 uint64_t feat_flags = dev_info.feature_flags; 5224 5225 if (op_mode == IN_PLACE) { 5226 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5227 printf("Device doesn't support in-place scatter-gather " 5228 "in both input and output mbufs.\n"); 5229 return TEST_SKIPPED; 5230 } 5231 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5232 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5233 printf("Device doesn't support RAW data-path APIs.\n"); 5234 return TEST_SKIPPED; 5235 } 5236 } else { 5237 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5238 return TEST_SKIPPED; 5239 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5240 printf("Device doesn't support out-of-place scatter-gather " 5241 "in both input and output mbufs.\n"); 5242 return TEST_SKIPPED; 5243 } 5244 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5245 printf("Device doesn't support digest encrypted.\n"); 5246 return TEST_SKIPPED; 5247 } 5248 } 5249 5250 /* Create SNOW 3G session */ 5251 retval = create_wireless_algo_auth_cipher_session( 5252 ts_params->valid_devs[0], 5253 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5254 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5255 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5256 : RTE_CRYPTO_AUTH_OP_GENERATE), 5257 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5258 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5259 tdata->key.data, tdata->key.len, 5260 tdata->auth_iv.len, tdata->digest.len, 5261 tdata->cipher_iv.len); 5262 5263 if (retval != 0) 5264 return retval; 5265 5266 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5267 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5268 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5269 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5270 5271 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5272 plaintext_pad_len, 15, 0); 5273 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5274 "Failed to allocate input buffer in mempool"); 5275 5276 if (op_mode == OUT_OF_PLACE) { 5277 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5278 plaintext_pad_len, 15, 0); 5279 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5280 "Failed to allocate output buffer in mempool"); 5281 } 5282 5283 if (verify) { 5284 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5285 tdata->ciphertext.data); 5286 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5287 ciphertext_len, buffer); 5288 debug_hexdump(stdout, "ciphertext:", ciphertext, 5289 ciphertext_len); 5290 } else { 5291 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5292 tdata->plaintext.data); 5293 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5294 plaintext_len, buffer); 5295 debug_hexdump(stdout, "plaintext:", plaintext, 5296 plaintext_len); 5297 } 5298 memset(buffer, 0, sizeof(buffer)); 5299 5300 /* Create SNOW 3G operation */ 5301 retval = create_wireless_algo_auth_cipher_operation( 5302 tdata->digest.data, tdata->digest.len, 5303 tdata->cipher_iv.data, tdata->cipher_iv.len, 5304 tdata->auth_iv.data, tdata->auth_iv.len, 5305 (tdata->digest.offset_bytes == 0 ? 5306 (verify ? ciphertext_pad_len : plaintext_pad_len) 5307 : tdata->digest.offset_bytes), 5308 tdata->validCipherLenInBits.len, 5309 tdata->cipher.offset_bits, 5310 tdata->validAuthLenInBits.len, 5311 tdata->auth.offset_bits, 5312 op_mode, 1, verify); 5313 5314 if (retval < 0) 5315 return retval; 5316 5317 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5318 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5319 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5320 else 5321 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5322 ut_params->op); 5323 5324 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5325 5326 ut_params->obuf = (op_mode == IN_PLACE ? 5327 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5328 5329 if (verify) { 5330 if (ut_params->obuf) 5331 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5332 plaintext_len, buffer); 5333 else 5334 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5335 plaintext_len, buffer); 5336 5337 debug_hexdump(stdout, "plaintext:", plaintext, 5338 (tdata->plaintext.len >> 3) - tdata->digest.len); 5339 debug_hexdump(stdout, "plaintext expected:", 5340 tdata->plaintext.data, 5341 (tdata->plaintext.len >> 3) - tdata->digest.len); 5342 } else { 5343 if (ut_params->obuf) 5344 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5345 ciphertext_len, buffer); 5346 else 5347 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5348 ciphertext_len, buffer); 5349 5350 debug_hexdump(stdout, "ciphertext:", ciphertext, 5351 ciphertext_len); 5352 debug_hexdump(stdout, "ciphertext expected:", 5353 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5354 5355 if (ut_params->obuf) 5356 digest = rte_pktmbuf_read(ut_params->obuf, 5357 (tdata->digest.offset_bytes == 0 ? 5358 plaintext_pad_len : tdata->digest.offset_bytes), 5359 tdata->digest.len, digest_buffer); 5360 else 5361 digest = rte_pktmbuf_read(ut_params->ibuf, 5362 (tdata->digest.offset_bytes == 0 ? 5363 plaintext_pad_len : tdata->digest.offset_bytes), 5364 tdata->digest.len, digest_buffer); 5365 5366 debug_hexdump(stdout, "digest:", digest, 5367 tdata->digest.len); 5368 debug_hexdump(stdout, "digest expected:", 5369 tdata->digest.data, tdata->digest.len); 5370 } 5371 5372 /* Validate obuf */ 5373 if (verify) { 5374 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5375 plaintext, 5376 tdata->plaintext.data, 5377 (tdata->plaintext.len - tdata->cipher.offset_bits - 5378 (tdata->digest.len << 3)), 5379 tdata->cipher.offset_bits, 5380 "SNOW 3G Plaintext data not as expected"); 5381 } else { 5382 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5383 ciphertext, 5384 tdata->ciphertext.data, 5385 (tdata->validDataLenInBits.len - 5386 tdata->cipher.offset_bits), 5387 tdata->cipher.offset_bits, 5388 "SNOW 3G Ciphertext data not as expected"); 5389 5390 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5391 digest, 5392 tdata->digest.data, 5393 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5394 "SNOW 3G Generated auth tag not as expected"); 5395 } 5396 return 0; 5397 } 5398 5399 static int 5400 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 5401 uint8_t op_mode, uint8_t verify) 5402 { 5403 struct crypto_testsuite_params *ts_params = &testsuite_params; 5404 struct crypto_unittest_params *ut_params = &unittest_params; 5405 5406 int retval; 5407 5408 uint8_t *plaintext = NULL, *ciphertext = NULL; 5409 unsigned int plaintext_pad_len; 5410 unsigned int plaintext_len; 5411 unsigned int ciphertext_pad_len; 5412 unsigned int ciphertext_len; 5413 5414 struct rte_cryptodev_info dev_info; 5415 5416 /* Verify the capabilities */ 5417 struct rte_cryptodev_sym_capability_idx cap_idx; 5418 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5419 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5420 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5421 &cap_idx) == NULL) 5422 return TEST_SKIPPED; 5423 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5424 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5425 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5426 &cap_idx) == NULL) 5427 return TEST_SKIPPED; 5428 5429 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5430 5431 uint64_t feat_flags = dev_info.feature_flags; 5432 5433 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5434 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5435 printf("Device doesn't support RAW data-path APIs.\n"); 5436 return TEST_SKIPPED; 5437 } 5438 5439 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5440 return TEST_SKIPPED; 5441 5442 if (op_mode == OUT_OF_PLACE) { 5443 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5444 return TEST_SKIPPED; 5445 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5446 printf("Device doesn't support digest encrypted.\n"); 5447 return TEST_SKIPPED; 5448 } 5449 } 5450 5451 /* Create KASUMI session */ 5452 retval = create_wireless_algo_auth_cipher_session( 5453 ts_params->valid_devs[0], 5454 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5455 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5456 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5457 : RTE_CRYPTO_AUTH_OP_GENERATE), 5458 RTE_CRYPTO_AUTH_KASUMI_F9, 5459 RTE_CRYPTO_CIPHER_KASUMI_F8, 5460 tdata->key.data, tdata->key.len, 5461 0, tdata->digest.len, 5462 tdata->cipher_iv.len); 5463 5464 if (retval != 0) 5465 return retval; 5466 5467 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5468 if (op_mode == OUT_OF_PLACE) 5469 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5470 5471 /* clear mbuf payload */ 5472 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5473 rte_pktmbuf_tailroom(ut_params->ibuf)); 5474 if (op_mode == OUT_OF_PLACE) 5475 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5476 rte_pktmbuf_tailroom(ut_params->obuf)); 5477 5478 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5479 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5480 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5481 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5482 5483 if (verify) { 5484 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5485 ciphertext_pad_len); 5486 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5487 if (op_mode == OUT_OF_PLACE) 5488 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5489 debug_hexdump(stdout, "ciphertext:", ciphertext, 5490 ciphertext_len); 5491 } else { 5492 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5493 plaintext_pad_len); 5494 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5495 if (op_mode == OUT_OF_PLACE) 5496 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5497 debug_hexdump(stdout, "plaintext:", plaintext, 5498 plaintext_len); 5499 } 5500 5501 /* Create KASUMI operation */ 5502 retval = create_wireless_algo_auth_cipher_operation( 5503 tdata->digest.data, tdata->digest.len, 5504 tdata->cipher_iv.data, tdata->cipher_iv.len, 5505 NULL, 0, 5506 (tdata->digest.offset_bytes == 0 ? 5507 (verify ? ciphertext_pad_len : plaintext_pad_len) 5508 : tdata->digest.offset_bytes), 5509 tdata->validCipherLenInBits.len, 5510 tdata->validCipherOffsetInBits.len, 5511 tdata->validAuthLenInBits.len, 5512 0, 5513 op_mode, 0, verify); 5514 5515 if (retval < 0) 5516 return retval; 5517 5518 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5519 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5520 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5521 else 5522 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5523 ut_params->op); 5524 5525 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5526 5527 ut_params->obuf = (op_mode == IN_PLACE ? 5528 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5529 5530 5531 if (verify) { 5532 if (ut_params->obuf) 5533 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5534 uint8_t *); 5535 else 5536 plaintext = ciphertext; 5537 5538 debug_hexdump(stdout, "plaintext:", plaintext, 5539 (tdata->plaintext.len >> 3) - tdata->digest.len); 5540 debug_hexdump(stdout, "plaintext expected:", 5541 tdata->plaintext.data, 5542 (tdata->plaintext.len >> 3) - tdata->digest.len); 5543 } else { 5544 if (ut_params->obuf) 5545 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5546 uint8_t *); 5547 else 5548 ciphertext = plaintext; 5549 5550 debug_hexdump(stdout, "ciphertext:", ciphertext, 5551 ciphertext_len); 5552 debug_hexdump(stdout, "ciphertext expected:", 5553 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5554 5555 ut_params->digest = rte_pktmbuf_mtod( 5556 ut_params->obuf, uint8_t *) + 5557 (tdata->digest.offset_bytes == 0 ? 5558 plaintext_pad_len : tdata->digest.offset_bytes); 5559 5560 debug_hexdump(stdout, "digest:", ut_params->digest, 5561 tdata->digest.len); 5562 debug_hexdump(stdout, "digest expected:", 5563 tdata->digest.data, tdata->digest.len); 5564 } 5565 5566 /* Validate obuf */ 5567 if (verify) { 5568 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5569 plaintext, 5570 tdata->plaintext.data, 5571 tdata->plaintext.len >> 3, 5572 "KASUMI Plaintext data not as expected"); 5573 } else { 5574 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5575 ciphertext, 5576 tdata->ciphertext.data, 5577 tdata->ciphertext.len >> 3, 5578 "KASUMI Ciphertext data not as expected"); 5579 5580 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5581 ut_params->digest, 5582 tdata->digest.data, 5583 DIGEST_BYTE_LENGTH_KASUMI_F9, 5584 "KASUMI Generated auth tag not as expected"); 5585 } 5586 return 0; 5587 } 5588 5589 static int 5590 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5591 uint8_t op_mode, uint8_t verify) 5592 { 5593 struct crypto_testsuite_params *ts_params = &testsuite_params; 5594 struct crypto_unittest_params *ut_params = &unittest_params; 5595 5596 int retval; 5597 5598 const uint8_t *plaintext = NULL; 5599 const uint8_t *ciphertext = NULL; 5600 const uint8_t *digest = NULL; 5601 unsigned int plaintext_pad_len; 5602 unsigned int plaintext_len; 5603 unsigned int ciphertext_pad_len; 5604 unsigned int ciphertext_len; 5605 uint8_t buffer[10000]; 5606 uint8_t digest_buffer[10000]; 5607 5608 struct rte_cryptodev_info dev_info; 5609 5610 /* Verify the capabilities */ 5611 struct rte_cryptodev_sym_capability_idx cap_idx; 5612 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5613 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5614 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5615 &cap_idx) == NULL) 5616 return TEST_SKIPPED; 5617 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5618 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5619 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5620 &cap_idx) == NULL) 5621 return TEST_SKIPPED; 5622 5623 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5624 return TEST_SKIPPED; 5625 5626 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5627 5628 uint64_t feat_flags = dev_info.feature_flags; 5629 5630 if (op_mode == IN_PLACE) { 5631 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5632 printf("Device doesn't support in-place scatter-gather " 5633 "in both input and output mbufs.\n"); 5634 return TEST_SKIPPED; 5635 } 5636 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5637 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5638 printf("Device doesn't support RAW data-path APIs.\n"); 5639 return TEST_SKIPPED; 5640 } 5641 } else { 5642 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5643 return TEST_SKIPPED; 5644 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5645 printf("Device doesn't support out-of-place scatter-gather " 5646 "in both input and output mbufs.\n"); 5647 return TEST_SKIPPED; 5648 } 5649 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5650 printf("Device doesn't support digest encrypted.\n"); 5651 return TEST_SKIPPED; 5652 } 5653 } 5654 5655 /* Create KASUMI session */ 5656 retval = create_wireless_algo_auth_cipher_session( 5657 ts_params->valid_devs[0], 5658 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5659 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5660 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5661 : RTE_CRYPTO_AUTH_OP_GENERATE), 5662 RTE_CRYPTO_AUTH_KASUMI_F9, 5663 RTE_CRYPTO_CIPHER_KASUMI_F8, 5664 tdata->key.data, tdata->key.len, 5665 0, tdata->digest.len, 5666 tdata->cipher_iv.len); 5667 5668 if (retval != 0) 5669 return retval; 5670 5671 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5672 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5673 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5674 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5675 5676 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5677 plaintext_pad_len, 15, 0); 5678 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5679 "Failed to allocate input buffer in mempool"); 5680 5681 if (op_mode == OUT_OF_PLACE) { 5682 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5683 plaintext_pad_len, 15, 0); 5684 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5685 "Failed to allocate output buffer in mempool"); 5686 } 5687 5688 if (verify) { 5689 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5690 tdata->ciphertext.data); 5691 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5692 ciphertext_len, buffer); 5693 debug_hexdump(stdout, "ciphertext:", ciphertext, 5694 ciphertext_len); 5695 } else { 5696 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5697 tdata->plaintext.data); 5698 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5699 plaintext_len, buffer); 5700 debug_hexdump(stdout, "plaintext:", plaintext, 5701 plaintext_len); 5702 } 5703 memset(buffer, 0, sizeof(buffer)); 5704 5705 /* Create KASUMI operation */ 5706 retval = create_wireless_algo_auth_cipher_operation( 5707 tdata->digest.data, tdata->digest.len, 5708 tdata->cipher_iv.data, tdata->cipher_iv.len, 5709 NULL, 0, 5710 (tdata->digest.offset_bytes == 0 ? 5711 (verify ? ciphertext_pad_len : plaintext_pad_len) 5712 : tdata->digest.offset_bytes), 5713 tdata->validCipherLenInBits.len, 5714 tdata->validCipherOffsetInBits.len, 5715 tdata->validAuthLenInBits.len, 5716 0, 5717 op_mode, 1, verify); 5718 5719 if (retval < 0) 5720 return retval; 5721 5722 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5723 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5724 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5725 else 5726 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5727 ut_params->op); 5728 5729 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5730 5731 ut_params->obuf = (op_mode == IN_PLACE ? 5732 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5733 5734 if (verify) { 5735 if (ut_params->obuf) 5736 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5737 plaintext_len, buffer); 5738 else 5739 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5740 plaintext_len, buffer); 5741 5742 debug_hexdump(stdout, "plaintext:", plaintext, 5743 (tdata->plaintext.len >> 3) - tdata->digest.len); 5744 debug_hexdump(stdout, "plaintext expected:", 5745 tdata->plaintext.data, 5746 (tdata->plaintext.len >> 3) - tdata->digest.len); 5747 } else { 5748 if (ut_params->obuf) 5749 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5750 ciphertext_len, buffer); 5751 else 5752 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5753 ciphertext_len, buffer); 5754 5755 debug_hexdump(stdout, "ciphertext:", ciphertext, 5756 ciphertext_len); 5757 debug_hexdump(stdout, "ciphertext expected:", 5758 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5759 5760 if (ut_params->obuf) 5761 digest = rte_pktmbuf_read(ut_params->obuf, 5762 (tdata->digest.offset_bytes == 0 ? 5763 plaintext_pad_len : tdata->digest.offset_bytes), 5764 tdata->digest.len, digest_buffer); 5765 else 5766 digest = rte_pktmbuf_read(ut_params->ibuf, 5767 (tdata->digest.offset_bytes == 0 ? 5768 plaintext_pad_len : tdata->digest.offset_bytes), 5769 tdata->digest.len, digest_buffer); 5770 5771 debug_hexdump(stdout, "digest:", digest, 5772 tdata->digest.len); 5773 debug_hexdump(stdout, "digest expected:", 5774 tdata->digest.data, tdata->digest.len); 5775 } 5776 5777 /* Validate obuf */ 5778 if (verify) { 5779 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5780 plaintext, 5781 tdata->plaintext.data, 5782 tdata->plaintext.len >> 3, 5783 "KASUMI Plaintext data not as expected"); 5784 } else { 5785 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5786 ciphertext, 5787 tdata->ciphertext.data, 5788 tdata->validDataLenInBits.len, 5789 "KASUMI Ciphertext data not as expected"); 5790 5791 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5792 digest, 5793 tdata->digest.data, 5794 DIGEST_BYTE_LENGTH_KASUMI_F9, 5795 "KASUMI Generated auth tag not as expected"); 5796 } 5797 return 0; 5798 } 5799 5800 static int 5801 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5802 { 5803 struct crypto_testsuite_params *ts_params = &testsuite_params; 5804 struct crypto_unittest_params *ut_params = &unittest_params; 5805 5806 int retval; 5807 5808 uint8_t *plaintext, *ciphertext; 5809 unsigned plaintext_pad_len; 5810 unsigned plaintext_len; 5811 struct rte_cryptodev_info dev_info; 5812 5813 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5814 uint64_t feat_flags = dev_info.feature_flags; 5815 5816 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5817 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5818 printf("Device doesn't support RAW data-path APIs.\n"); 5819 return TEST_SKIPPED; 5820 } 5821 5822 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5823 return TEST_SKIPPED; 5824 5825 /* Verify the capabilities */ 5826 struct rte_cryptodev_sym_capability_idx cap_idx; 5827 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5828 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5829 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5830 &cap_idx) == NULL) 5831 return TEST_SKIPPED; 5832 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5833 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5834 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5835 &cap_idx) == NULL) 5836 return TEST_SKIPPED; 5837 5838 /* Create KASUMI session */ 5839 retval = create_wireless_algo_cipher_auth_session( 5840 ts_params->valid_devs[0], 5841 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5842 RTE_CRYPTO_AUTH_OP_GENERATE, 5843 RTE_CRYPTO_AUTH_KASUMI_F9, 5844 RTE_CRYPTO_CIPHER_KASUMI_F8, 5845 tdata->key.data, tdata->key.len, 5846 0, tdata->digest.len, 5847 tdata->cipher_iv.len); 5848 if (retval != 0) 5849 return retval; 5850 5851 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5852 5853 /* clear mbuf payload */ 5854 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5855 rte_pktmbuf_tailroom(ut_params->ibuf)); 5856 5857 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5858 /* Append data which is padded to a multiple of */ 5859 /* the algorithms block size */ 5860 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5861 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5862 plaintext_pad_len); 5863 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5864 5865 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5866 5867 /* Create KASUMI operation */ 5868 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5869 tdata->digest.len, NULL, 0, 5870 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5871 tdata->cipher_iv.data, tdata->cipher_iv.len, 5872 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5873 tdata->validCipherOffsetInBits.len, 5874 tdata->validAuthLenInBits.len, 5875 0 5876 ); 5877 if (retval < 0) 5878 return retval; 5879 5880 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5881 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5882 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5883 else 5884 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5885 ut_params->op); 5886 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5887 5888 if (ut_params->op->sym->m_dst) 5889 ut_params->obuf = ut_params->op->sym->m_dst; 5890 else 5891 ut_params->obuf = ut_params->op->sym->m_src; 5892 5893 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5894 tdata->validCipherOffsetInBits.len >> 3); 5895 5896 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5897 + plaintext_pad_len; 5898 5899 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5900 (tdata->validCipherOffsetInBits.len >> 3); 5901 /* Validate obuf */ 5902 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5903 ciphertext, 5904 reference_ciphertext, 5905 tdata->validCipherLenInBits.len, 5906 "KASUMI Ciphertext data not as expected"); 5907 5908 /* Validate obuf */ 5909 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5910 ut_params->digest, 5911 tdata->digest.data, 5912 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5913 "KASUMI Generated auth tag not as expected"); 5914 return 0; 5915 } 5916 5917 static int 5918 check_cipher_capability(const struct crypto_testsuite_params *ts_params, 5919 const enum rte_crypto_cipher_algorithm cipher_algo, 5920 const uint16_t key_size, const uint16_t iv_size) 5921 { 5922 struct rte_cryptodev_sym_capability_idx cap_idx; 5923 const struct rte_cryptodev_symmetric_capability *cap; 5924 5925 /* Check if device supports the algorithm */ 5926 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5927 cap_idx.algo.cipher = cipher_algo; 5928 5929 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5930 &cap_idx); 5931 5932 if (cap == NULL) 5933 return -1; 5934 5935 /* Check if device supports key size and IV size */ 5936 if (rte_cryptodev_sym_capability_check_cipher(cap, key_size, 5937 iv_size) < 0) { 5938 return -1; 5939 } 5940 5941 return 0; 5942 } 5943 5944 static int 5945 check_auth_capability(const struct crypto_testsuite_params *ts_params, 5946 const enum rte_crypto_auth_algorithm auth_algo, 5947 const uint16_t key_size, const uint16_t iv_size, 5948 const uint16_t tag_size) 5949 { 5950 struct rte_cryptodev_sym_capability_idx cap_idx; 5951 const struct rte_cryptodev_symmetric_capability *cap; 5952 5953 /* Check if device supports the algorithm */ 5954 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5955 cap_idx.algo.auth = auth_algo; 5956 5957 cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5958 &cap_idx); 5959 5960 if (cap == NULL) 5961 return -1; 5962 5963 /* Check if device supports key size and IV size */ 5964 if (rte_cryptodev_sym_capability_check_auth(cap, key_size, 5965 tag_size, iv_size) < 0) { 5966 return -1; 5967 } 5968 5969 return 0; 5970 } 5971 5972 static int 5973 test_zuc_encryption(const struct wireless_test_data *tdata) 5974 { 5975 struct crypto_testsuite_params *ts_params = &testsuite_params; 5976 struct crypto_unittest_params *ut_params = &unittest_params; 5977 5978 int retval; 5979 uint8_t *plaintext, *ciphertext; 5980 unsigned plaintext_pad_len; 5981 unsigned plaintext_len; 5982 struct rte_cryptodev_info dev_info; 5983 5984 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5985 uint64_t feat_flags = dev_info.feature_flags; 5986 5987 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5988 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5989 printf("Device doesn't support RAW data-path APIs.\n"); 5990 return TEST_SKIPPED; 5991 } 5992 5993 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5994 return TEST_SKIPPED; 5995 5996 /* Check if device supports ZUC EEA3 */ 5997 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 5998 tdata->key.len, tdata->cipher_iv.len) < 0) 5999 return TEST_SKIPPED; 6000 6001 /* Create ZUC session */ 6002 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 6003 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6004 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6005 tdata->key.data, tdata->key.len, 6006 tdata->cipher_iv.len); 6007 if (retval != 0) 6008 return retval; 6009 6010 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6011 6012 /* Clear mbuf payload */ 6013 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6014 rte_pktmbuf_tailroom(ut_params->ibuf)); 6015 6016 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6017 /* Append data which is padded to a multiple */ 6018 /* of the algorithms block size */ 6019 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6020 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6021 plaintext_pad_len); 6022 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6023 6024 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 6025 6026 /* Create ZUC operation */ 6027 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 6028 tdata->cipher_iv.len, 6029 tdata->plaintext.len, 6030 0); 6031 if (retval < 0) 6032 return retval; 6033 6034 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6035 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6036 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 6037 else 6038 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6039 ut_params->op); 6040 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6041 6042 ut_params->obuf = ut_params->op->sym->m_dst; 6043 if (ut_params->obuf) 6044 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 6045 else 6046 ciphertext = plaintext; 6047 6048 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 6049 6050 /* Validate obuf */ 6051 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6052 ciphertext, 6053 tdata->ciphertext.data, 6054 tdata->validCipherLenInBits.len, 6055 "ZUC Ciphertext data not as expected"); 6056 return 0; 6057 } 6058 6059 static int 6060 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 6061 { 6062 struct crypto_testsuite_params *ts_params = &testsuite_params; 6063 struct crypto_unittest_params *ut_params = &unittest_params; 6064 6065 int retval; 6066 6067 unsigned int plaintext_pad_len; 6068 unsigned int plaintext_len; 6069 const uint8_t *ciphertext; 6070 uint8_t ciphertext_buffer[2048]; 6071 struct rte_cryptodev_info dev_info; 6072 6073 /* Check if device supports ZUC EEA3 */ 6074 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6075 tdata->key.len, tdata->cipher_iv.len) < 0) 6076 return TEST_SKIPPED; 6077 6078 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6079 return TEST_SKIPPED; 6080 6081 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6082 6083 uint64_t feat_flags = dev_info.feature_flags; 6084 6085 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6086 printf("Device doesn't support in-place scatter-gather. " 6087 "Test Skipped.\n"); 6088 return TEST_SKIPPED; 6089 } 6090 6091 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6092 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6093 printf("Device doesn't support RAW data-path APIs.\n"); 6094 return TEST_SKIPPED; 6095 } 6096 6097 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6098 6099 /* Append data which is padded to a multiple */ 6100 /* of the algorithms block size */ 6101 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6102 6103 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6104 plaintext_pad_len, 10, 0); 6105 6106 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6107 tdata->plaintext.data); 6108 6109 /* Create ZUC session */ 6110 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 6111 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6112 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6113 tdata->key.data, tdata->key.len, 6114 tdata->cipher_iv.len); 6115 if (retval < 0) 6116 return retval; 6117 6118 /* Clear mbuf payload */ 6119 6120 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 6121 6122 /* Create ZUC operation */ 6123 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 6124 tdata->cipher_iv.len, tdata->plaintext.len, 6125 0); 6126 if (retval < 0) 6127 return retval; 6128 6129 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6130 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6131 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 6132 else 6133 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6134 ut_params->op); 6135 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6136 6137 ut_params->obuf = ut_params->op->sym->m_dst; 6138 if (ut_params->obuf) 6139 ciphertext = rte_pktmbuf_read(ut_params->obuf, 6140 0, plaintext_len, ciphertext_buffer); 6141 else 6142 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 6143 0, plaintext_len, ciphertext_buffer); 6144 6145 /* Validate obuf */ 6146 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 6147 6148 /* Validate obuf */ 6149 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6150 ciphertext, 6151 tdata->ciphertext.data, 6152 tdata->validCipherLenInBits.len, 6153 "ZUC Ciphertext data not as expected"); 6154 6155 return 0; 6156 } 6157 6158 static int 6159 test_zuc_authentication(const struct wireless_test_data *tdata) 6160 { 6161 struct crypto_testsuite_params *ts_params = &testsuite_params; 6162 struct crypto_unittest_params *ut_params = &unittest_params; 6163 6164 int retval; 6165 unsigned plaintext_pad_len; 6166 unsigned plaintext_len; 6167 uint8_t *plaintext; 6168 6169 struct rte_cryptodev_info dev_info; 6170 6171 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6172 uint64_t feat_flags = dev_info.feature_flags; 6173 6174 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 6175 (tdata->validAuthLenInBits.len % 8 != 0)) { 6176 printf("Device doesn't support NON-Byte Aligned Data.\n"); 6177 return TEST_SKIPPED; 6178 } 6179 6180 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6181 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6182 printf("Device doesn't support RAW data-path APIs.\n"); 6183 return TEST_SKIPPED; 6184 } 6185 6186 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6187 return TEST_SKIPPED; 6188 6189 /* Check if device supports ZUC EIA3 */ 6190 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6191 tdata->key.len, tdata->auth_iv.len, 6192 tdata->digest.len) < 0) 6193 return TEST_SKIPPED; 6194 6195 /* Create ZUC session */ 6196 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 6197 tdata->key.data, tdata->key.len, 6198 tdata->auth_iv.len, tdata->digest.len, 6199 RTE_CRYPTO_AUTH_OP_GENERATE, 6200 RTE_CRYPTO_AUTH_ZUC_EIA3); 6201 if (retval != 0) 6202 return retval; 6203 6204 /* alloc mbuf and set payload */ 6205 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6206 6207 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6208 rte_pktmbuf_tailroom(ut_params->ibuf)); 6209 6210 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6211 /* Append data which is padded to a multiple of */ 6212 /* the algorithms block size */ 6213 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6214 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6215 plaintext_pad_len); 6216 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6217 6218 /* Create ZUC operation */ 6219 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 6220 tdata->auth_iv.data, tdata->auth_iv.len, 6221 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 6222 tdata->validAuthLenInBits.len, 6223 0); 6224 if (retval < 0) 6225 return retval; 6226 6227 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6228 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6229 ut_params->op, 0, 1, 1, 0); 6230 else 6231 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6232 ut_params->op); 6233 ut_params->obuf = ut_params->op->sym->m_src; 6234 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6235 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6236 + plaintext_pad_len; 6237 6238 /* Validate obuf */ 6239 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6240 ut_params->digest, 6241 tdata->digest.data, 6242 tdata->digest.len, 6243 "ZUC Generated auth tag not as expected"); 6244 6245 return 0; 6246 } 6247 6248 static int 6249 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 6250 uint8_t op_mode, uint8_t verify) 6251 { 6252 struct crypto_testsuite_params *ts_params = &testsuite_params; 6253 struct crypto_unittest_params *ut_params = &unittest_params; 6254 6255 int retval; 6256 6257 uint8_t *plaintext = NULL, *ciphertext = NULL; 6258 unsigned int plaintext_pad_len; 6259 unsigned int plaintext_len; 6260 unsigned int ciphertext_pad_len; 6261 unsigned int ciphertext_len; 6262 6263 struct rte_cryptodev_info dev_info; 6264 6265 /* Check if device supports ZUC EEA3 */ 6266 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6267 tdata->key.len, tdata->cipher_iv.len) < 0) 6268 return TEST_SKIPPED; 6269 6270 /* Check if device supports ZUC EIA3 */ 6271 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6272 tdata->key.len, tdata->auth_iv.len, 6273 tdata->digest.len) < 0) 6274 return TEST_SKIPPED; 6275 6276 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6277 6278 uint64_t feat_flags = dev_info.feature_flags; 6279 6280 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6281 printf("Device doesn't support digest encrypted.\n"); 6282 return TEST_SKIPPED; 6283 } 6284 if (op_mode == IN_PLACE) { 6285 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6286 printf("Device doesn't support in-place scatter-gather " 6287 "in both input and output mbufs.\n"); 6288 return TEST_SKIPPED; 6289 } 6290 6291 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6292 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6293 printf("Device doesn't support RAW data-path APIs.\n"); 6294 return TEST_SKIPPED; 6295 } 6296 } else { 6297 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6298 return TEST_SKIPPED; 6299 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6300 printf("Device doesn't support out-of-place scatter-gather " 6301 "in both input and output mbufs.\n"); 6302 return TEST_SKIPPED; 6303 } 6304 } 6305 6306 /* Create ZUC session */ 6307 retval = create_wireless_algo_auth_cipher_session( 6308 ts_params->valid_devs[0], 6309 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6310 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6311 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6312 : RTE_CRYPTO_AUTH_OP_GENERATE), 6313 RTE_CRYPTO_AUTH_ZUC_EIA3, 6314 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6315 tdata->key.data, tdata->key.len, 6316 tdata->auth_iv.len, tdata->digest.len, 6317 tdata->cipher_iv.len); 6318 6319 if (retval != 0) 6320 return retval; 6321 6322 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6323 if (op_mode == OUT_OF_PLACE) 6324 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6325 6326 /* clear mbuf payload */ 6327 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6328 rte_pktmbuf_tailroom(ut_params->ibuf)); 6329 if (op_mode == OUT_OF_PLACE) 6330 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6331 rte_pktmbuf_tailroom(ut_params->obuf)); 6332 6333 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6334 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6335 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6336 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6337 6338 if (verify) { 6339 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6340 ciphertext_pad_len); 6341 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6342 debug_hexdump(stdout, "ciphertext:", ciphertext, 6343 ciphertext_len); 6344 } else { 6345 /* make sure enough space to cover partial digest verify case */ 6346 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6347 ciphertext_pad_len); 6348 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6349 debug_hexdump(stdout, "plaintext:", plaintext, 6350 plaintext_len); 6351 } 6352 6353 if (op_mode == OUT_OF_PLACE) 6354 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6355 6356 /* Create ZUC operation */ 6357 retval = create_wireless_algo_auth_cipher_operation( 6358 tdata->digest.data, tdata->digest.len, 6359 tdata->cipher_iv.data, tdata->cipher_iv.len, 6360 tdata->auth_iv.data, tdata->auth_iv.len, 6361 (tdata->digest.offset_bytes == 0 ? 6362 (verify ? ciphertext_pad_len : plaintext_pad_len) 6363 : tdata->digest.offset_bytes), 6364 tdata->validCipherLenInBits.len, 6365 tdata->validCipherOffsetInBits.len, 6366 tdata->validAuthLenInBits.len, 6367 0, 6368 op_mode, 0, verify); 6369 6370 if (retval < 0) 6371 return retval; 6372 6373 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6374 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6375 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6376 else 6377 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6378 ut_params->op); 6379 6380 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6381 6382 ut_params->obuf = (op_mode == IN_PLACE ? 6383 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6384 6385 6386 if (verify) { 6387 if (ut_params->obuf) 6388 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6389 uint8_t *); 6390 else 6391 plaintext = ciphertext; 6392 6393 debug_hexdump(stdout, "plaintext:", plaintext, 6394 (tdata->plaintext.len >> 3) - tdata->digest.len); 6395 debug_hexdump(stdout, "plaintext expected:", 6396 tdata->plaintext.data, 6397 (tdata->plaintext.len >> 3) - tdata->digest.len); 6398 } else { 6399 if (ut_params->obuf) 6400 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6401 uint8_t *); 6402 else 6403 ciphertext = plaintext; 6404 6405 debug_hexdump(stdout, "ciphertext:", ciphertext, 6406 ciphertext_len); 6407 debug_hexdump(stdout, "ciphertext expected:", 6408 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6409 6410 ut_params->digest = rte_pktmbuf_mtod( 6411 ut_params->obuf, uint8_t *) + 6412 (tdata->digest.offset_bytes == 0 ? 6413 plaintext_pad_len : tdata->digest.offset_bytes); 6414 6415 debug_hexdump(stdout, "digest:", ut_params->digest, 6416 tdata->digest.len); 6417 debug_hexdump(stdout, "digest expected:", 6418 tdata->digest.data, tdata->digest.len); 6419 } 6420 6421 /* Validate obuf */ 6422 if (verify) { 6423 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6424 plaintext, 6425 tdata->plaintext.data, 6426 tdata->plaintext.len >> 3, 6427 "ZUC Plaintext data not as expected"); 6428 } else { 6429 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6430 ciphertext, 6431 tdata->ciphertext.data, 6432 tdata->ciphertext.len >> 3, 6433 "ZUC Ciphertext data not as expected"); 6434 6435 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6436 ut_params->digest, 6437 tdata->digest.data, 6438 DIGEST_BYTE_LENGTH_KASUMI_F9, 6439 "ZUC Generated auth tag not as expected"); 6440 } 6441 return 0; 6442 } 6443 6444 static int 6445 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 6446 uint8_t op_mode, uint8_t verify) 6447 { 6448 struct crypto_testsuite_params *ts_params = &testsuite_params; 6449 struct crypto_unittest_params *ut_params = &unittest_params; 6450 6451 int retval; 6452 6453 const uint8_t *plaintext = NULL; 6454 const uint8_t *ciphertext = NULL; 6455 const uint8_t *digest = NULL; 6456 unsigned int plaintext_pad_len; 6457 unsigned int plaintext_len; 6458 unsigned int ciphertext_pad_len; 6459 unsigned int ciphertext_len; 6460 uint8_t buffer[10000]; 6461 uint8_t digest_buffer[10000]; 6462 6463 struct rte_cryptodev_info dev_info; 6464 6465 /* Check if device supports ZUC EEA3 */ 6466 if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3, 6467 tdata->key.len, tdata->cipher_iv.len) < 0) 6468 return TEST_SKIPPED; 6469 6470 /* Check if device supports ZUC EIA3 */ 6471 if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3, 6472 tdata->key.len, tdata->auth_iv.len, 6473 tdata->digest.len) < 0) 6474 return TEST_SKIPPED; 6475 6476 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6477 6478 uint64_t feat_flags = dev_info.feature_flags; 6479 6480 if (op_mode == IN_PLACE) { 6481 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6482 printf("Device doesn't support in-place scatter-gather " 6483 "in both input and output mbufs.\n"); 6484 return TEST_SKIPPED; 6485 } 6486 6487 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6488 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6489 printf("Device doesn't support RAW data-path APIs.\n"); 6490 return TEST_SKIPPED; 6491 } 6492 } else { 6493 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6494 return TEST_SKIPPED; 6495 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6496 printf("Device doesn't support out-of-place scatter-gather " 6497 "in both input and output mbufs.\n"); 6498 return TEST_SKIPPED; 6499 } 6500 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6501 printf("Device doesn't support digest encrypted.\n"); 6502 return TEST_SKIPPED; 6503 } 6504 } 6505 6506 /* Create ZUC session */ 6507 retval = create_wireless_algo_auth_cipher_session( 6508 ts_params->valid_devs[0], 6509 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6510 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6511 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6512 : RTE_CRYPTO_AUTH_OP_GENERATE), 6513 RTE_CRYPTO_AUTH_ZUC_EIA3, 6514 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6515 tdata->key.data, tdata->key.len, 6516 tdata->auth_iv.len, tdata->digest.len, 6517 tdata->cipher_iv.len); 6518 6519 if (retval != 0) 6520 return retval; 6521 6522 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6523 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6524 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6525 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6526 6527 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6528 plaintext_pad_len, 15, 0); 6529 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6530 "Failed to allocate input buffer in mempool"); 6531 6532 if (op_mode == OUT_OF_PLACE) { 6533 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6534 plaintext_pad_len, 15, 0); 6535 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6536 "Failed to allocate output buffer in mempool"); 6537 } 6538 6539 if (verify) { 6540 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6541 tdata->ciphertext.data); 6542 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6543 ciphertext_len, buffer); 6544 debug_hexdump(stdout, "ciphertext:", ciphertext, 6545 ciphertext_len); 6546 } else { 6547 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6548 tdata->plaintext.data); 6549 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6550 plaintext_len, buffer); 6551 debug_hexdump(stdout, "plaintext:", plaintext, 6552 plaintext_len); 6553 } 6554 memset(buffer, 0, sizeof(buffer)); 6555 6556 /* Create ZUC operation */ 6557 retval = create_wireless_algo_auth_cipher_operation( 6558 tdata->digest.data, tdata->digest.len, 6559 tdata->cipher_iv.data, tdata->cipher_iv.len, 6560 NULL, 0, 6561 (tdata->digest.offset_bytes == 0 ? 6562 (verify ? ciphertext_pad_len : plaintext_pad_len) 6563 : tdata->digest.offset_bytes), 6564 tdata->validCipherLenInBits.len, 6565 tdata->validCipherOffsetInBits.len, 6566 tdata->validAuthLenInBits.len, 6567 0, 6568 op_mode, 1, verify); 6569 6570 if (retval < 0) 6571 return retval; 6572 6573 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6574 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6575 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6576 else 6577 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6578 ut_params->op); 6579 6580 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6581 6582 ut_params->obuf = (op_mode == IN_PLACE ? 6583 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6584 6585 if (verify) { 6586 if (ut_params->obuf) 6587 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6588 plaintext_len, buffer); 6589 else 6590 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6591 plaintext_len, buffer); 6592 6593 debug_hexdump(stdout, "plaintext:", plaintext, 6594 (tdata->plaintext.len >> 3) - tdata->digest.len); 6595 debug_hexdump(stdout, "plaintext expected:", 6596 tdata->plaintext.data, 6597 (tdata->plaintext.len >> 3) - tdata->digest.len); 6598 } else { 6599 if (ut_params->obuf) 6600 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6601 ciphertext_len, buffer); 6602 else 6603 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6604 ciphertext_len, buffer); 6605 6606 debug_hexdump(stdout, "ciphertext:", ciphertext, 6607 ciphertext_len); 6608 debug_hexdump(stdout, "ciphertext expected:", 6609 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6610 6611 if (ut_params->obuf) 6612 digest = rte_pktmbuf_read(ut_params->obuf, 6613 (tdata->digest.offset_bytes == 0 ? 6614 plaintext_pad_len : tdata->digest.offset_bytes), 6615 tdata->digest.len, digest_buffer); 6616 else 6617 digest = rte_pktmbuf_read(ut_params->ibuf, 6618 (tdata->digest.offset_bytes == 0 ? 6619 plaintext_pad_len : tdata->digest.offset_bytes), 6620 tdata->digest.len, digest_buffer); 6621 6622 debug_hexdump(stdout, "digest:", digest, 6623 tdata->digest.len); 6624 debug_hexdump(stdout, "digest expected:", 6625 tdata->digest.data, tdata->digest.len); 6626 } 6627 6628 /* Validate obuf */ 6629 if (verify) { 6630 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6631 plaintext, 6632 tdata->plaintext.data, 6633 tdata->plaintext.len >> 3, 6634 "ZUC Plaintext data not as expected"); 6635 } else { 6636 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6637 ciphertext, 6638 tdata->ciphertext.data, 6639 tdata->validDataLenInBits.len, 6640 "ZUC Ciphertext data not as expected"); 6641 6642 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6643 digest, 6644 tdata->digest.data, 6645 DIGEST_BYTE_LENGTH_KASUMI_F9, 6646 "ZUC Generated auth tag not as expected"); 6647 } 6648 return 0; 6649 } 6650 6651 static int 6652 test_kasumi_encryption_test_case_1(void) 6653 { 6654 return test_kasumi_encryption(&kasumi_test_case_1); 6655 } 6656 6657 static int 6658 test_kasumi_encryption_test_case_1_sgl(void) 6659 { 6660 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6661 } 6662 6663 static int 6664 test_kasumi_encryption_test_case_1_oop(void) 6665 { 6666 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6667 } 6668 6669 static int 6670 test_kasumi_encryption_test_case_1_oop_sgl(void) 6671 { 6672 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6673 } 6674 6675 static int 6676 test_kasumi_encryption_test_case_2(void) 6677 { 6678 return test_kasumi_encryption(&kasumi_test_case_2); 6679 } 6680 6681 static int 6682 test_kasumi_encryption_test_case_3(void) 6683 { 6684 return test_kasumi_encryption(&kasumi_test_case_3); 6685 } 6686 6687 static int 6688 test_kasumi_encryption_test_case_4(void) 6689 { 6690 return test_kasumi_encryption(&kasumi_test_case_4); 6691 } 6692 6693 static int 6694 test_kasumi_encryption_test_case_5(void) 6695 { 6696 return test_kasumi_encryption(&kasumi_test_case_5); 6697 } 6698 6699 static int 6700 test_kasumi_decryption_test_case_1(void) 6701 { 6702 return test_kasumi_decryption(&kasumi_test_case_1); 6703 } 6704 6705 static int 6706 test_kasumi_decryption_test_case_1_oop(void) 6707 { 6708 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6709 } 6710 6711 static int 6712 test_kasumi_decryption_test_case_2(void) 6713 { 6714 return test_kasumi_decryption(&kasumi_test_case_2); 6715 } 6716 6717 static int 6718 test_kasumi_decryption_test_case_3(void) 6719 { 6720 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6721 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6722 return TEST_SKIPPED; 6723 return test_kasumi_decryption(&kasumi_test_case_3); 6724 } 6725 6726 static int 6727 test_kasumi_decryption_test_case_4(void) 6728 { 6729 return test_kasumi_decryption(&kasumi_test_case_4); 6730 } 6731 6732 static int 6733 test_kasumi_decryption_test_case_5(void) 6734 { 6735 return test_kasumi_decryption(&kasumi_test_case_5); 6736 } 6737 static int 6738 test_snow3g_encryption_test_case_1(void) 6739 { 6740 return test_snow3g_encryption(&snow3g_test_case_1); 6741 } 6742 6743 static int 6744 test_snow3g_encryption_test_case_1_oop(void) 6745 { 6746 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6747 } 6748 6749 static int 6750 test_snow3g_encryption_test_case_1_oop_sgl(void) 6751 { 6752 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 6753 } 6754 6755 6756 static int 6757 test_snow3g_encryption_test_case_1_offset_oop(void) 6758 { 6759 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6760 } 6761 6762 static int 6763 test_snow3g_encryption_test_case_2(void) 6764 { 6765 return test_snow3g_encryption(&snow3g_test_case_2); 6766 } 6767 6768 static int 6769 test_snow3g_encryption_test_case_3(void) 6770 { 6771 return test_snow3g_encryption(&snow3g_test_case_3); 6772 } 6773 6774 static int 6775 test_snow3g_encryption_test_case_4(void) 6776 { 6777 return test_snow3g_encryption(&snow3g_test_case_4); 6778 } 6779 6780 static int 6781 test_snow3g_encryption_test_case_5(void) 6782 { 6783 return test_snow3g_encryption(&snow3g_test_case_5); 6784 } 6785 6786 static int 6787 test_snow3g_decryption_test_case_1(void) 6788 { 6789 return test_snow3g_decryption(&snow3g_test_case_1); 6790 } 6791 6792 static int 6793 test_snow3g_decryption_test_case_1_oop(void) 6794 { 6795 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6796 } 6797 6798 static int 6799 test_snow3g_decryption_test_case_2(void) 6800 { 6801 return test_snow3g_decryption(&snow3g_test_case_2); 6802 } 6803 6804 static int 6805 test_snow3g_decryption_test_case_3(void) 6806 { 6807 return test_snow3g_decryption(&snow3g_test_case_3); 6808 } 6809 6810 static int 6811 test_snow3g_decryption_test_case_4(void) 6812 { 6813 return test_snow3g_decryption(&snow3g_test_case_4); 6814 } 6815 6816 static int 6817 test_snow3g_decryption_test_case_5(void) 6818 { 6819 return test_snow3g_decryption(&snow3g_test_case_5); 6820 } 6821 6822 /* 6823 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6824 * Pattern digest from snow3g_test_data must be allocated as 6825 * 4 last bytes in plaintext. 6826 */ 6827 static void 6828 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6829 struct snow3g_hash_test_data *output) 6830 { 6831 if ((pattern != NULL) && (output != NULL)) { 6832 output->key.len = pattern->key.len; 6833 6834 memcpy(output->key.data, 6835 pattern->key.data, pattern->key.len); 6836 6837 output->auth_iv.len = pattern->auth_iv.len; 6838 6839 memcpy(output->auth_iv.data, 6840 pattern->auth_iv.data, pattern->auth_iv.len); 6841 6842 output->plaintext.len = pattern->plaintext.len; 6843 6844 memcpy(output->plaintext.data, 6845 pattern->plaintext.data, pattern->plaintext.len >> 3); 6846 6847 output->digest.len = pattern->digest.len; 6848 6849 memcpy(output->digest.data, 6850 &pattern->plaintext.data[pattern->digest.offset_bytes], 6851 pattern->digest.len); 6852 6853 output->validAuthLenInBits.len = 6854 pattern->validAuthLenInBits.len; 6855 } 6856 } 6857 6858 /* 6859 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6860 */ 6861 static int 6862 test_snow3g_decryption_with_digest_test_case_1(void) 6863 { 6864 struct snow3g_hash_test_data snow3g_hash_data; 6865 struct rte_cryptodev_info dev_info; 6866 struct crypto_testsuite_params *ts_params = &testsuite_params; 6867 6868 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6869 uint64_t feat_flags = dev_info.feature_flags; 6870 6871 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6872 printf("Device doesn't support encrypted digest operations.\n"); 6873 return TEST_SKIPPED; 6874 } 6875 6876 /* 6877 * Function prepare data for hash verification test case. 6878 * Digest is allocated in 4 last bytes in plaintext, pattern. 6879 */ 6880 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6881 6882 return test_snow3g_decryption(&snow3g_test_case_7) & 6883 test_snow3g_authentication_verify(&snow3g_hash_data); 6884 } 6885 6886 static int 6887 test_snow3g_cipher_auth_test_case_1(void) 6888 { 6889 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6890 } 6891 6892 static int 6893 test_snow3g_auth_cipher_test_case_1(void) 6894 { 6895 return test_snow3g_auth_cipher( 6896 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6897 } 6898 6899 static int 6900 test_snow3g_auth_cipher_test_case_2(void) 6901 { 6902 return test_snow3g_auth_cipher( 6903 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6904 } 6905 6906 static int 6907 test_snow3g_auth_cipher_test_case_2_oop(void) 6908 { 6909 return test_snow3g_auth_cipher( 6910 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6911 } 6912 6913 static int 6914 test_snow3g_auth_cipher_part_digest_enc(void) 6915 { 6916 return test_snow3g_auth_cipher( 6917 &snow3g_auth_cipher_partial_digest_encryption, 6918 IN_PLACE, 0); 6919 } 6920 6921 static int 6922 test_snow3g_auth_cipher_part_digest_enc_oop(void) 6923 { 6924 return test_snow3g_auth_cipher( 6925 &snow3g_auth_cipher_partial_digest_encryption, 6926 OUT_OF_PLACE, 0); 6927 } 6928 6929 static int 6930 test_snow3g_auth_cipher_test_case_3_sgl(void) 6931 { 6932 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6933 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6934 return TEST_SKIPPED; 6935 return test_snow3g_auth_cipher_sgl( 6936 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 6937 } 6938 6939 static int 6940 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 6941 { 6942 return test_snow3g_auth_cipher_sgl( 6943 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 6944 } 6945 6946 static int 6947 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 6948 { 6949 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6950 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6951 return TEST_SKIPPED; 6952 return test_snow3g_auth_cipher_sgl( 6953 &snow3g_auth_cipher_partial_digest_encryption, 6954 IN_PLACE, 0); 6955 } 6956 6957 static int 6958 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 6959 { 6960 return test_snow3g_auth_cipher_sgl( 6961 &snow3g_auth_cipher_partial_digest_encryption, 6962 OUT_OF_PLACE, 0); 6963 } 6964 6965 static int 6966 test_snow3g_auth_cipher_verify_test_case_1(void) 6967 { 6968 return test_snow3g_auth_cipher( 6969 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 6970 } 6971 6972 static int 6973 test_snow3g_auth_cipher_verify_test_case_2(void) 6974 { 6975 return test_snow3g_auth_cipher( 6976 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 6977 } 6978 6979 static int 6980 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 6981 { 6982 return test_snow3g_auth_cipher( 6983 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6984 } 6985 6986 static int 6987 test_snow3g_auth_cipher_verify_part_digest_enc(void) 6988 { 6989 return test_snow3g_auth_cipher( 6990 &snow3g_auth_cipher_partial_digest_encryption, 6991 IN_PLACE, 1); 6992 } 6993 6994 static int 6995 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 6996 { 6997 return test_snow3g_auth_cipher( 6998 &snow3g_auth_cipher_partial_digest_encryption, 6999 OUT_OF_PLACE, 1); 7000 } 7001 7002 static int 7003 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 7004 { 7005 return test_snow3g_auth_cipher_sgl( 7006 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 7007 } 7008 7009 static int 7010 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 7011 { 7012 return test_snow3g_auth_cipher_sgl( 7013 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 7014 } 7015 7016 static int 7017 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 7018 { 7019 return test_snow3g_auth_cipher_sgl( 7020 &snow3g_auth_cipher_partial_digest_encryption, 7021 IN_PLACE, 1); 7022 } 7023 7024 static int 7025 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 7026 { 7027 return test_snow3g_auth_cipher_sgl( 7028 &snow3g_auth_cipher_partial_digest_encryption, 7029 OUT_OF_PLACE, 1); 7030 } 7031 7032 static int 7033 test_snow3g_auth_cipher_with_digest_test_case_1(void) 7034 { 7035 return test_snow3g_auth_cipher( 7036 &snow3g_test_case_7, IN_PLACE, 0); 7037 } 7038 7039 static int 7040 test_kasumi_auth_cipher_test_case_1(void) 7041 { 7042 return test_kasumi_auth_cipher( 7043 &kasumi_test_case_3, IN_PLACE, 0); 7044 } 7045 7046 static int 7047 test_kasumi_auth_cipher_test_case_2(void) 7048 { 7049 return test_kasumi_auth_cipher( 7050 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 7051 } 7052 7053 static int 7054 test_kasumi_auth_cipher_test_case_2_oop(void) 7055 { 7056 return test_kasumi_auth_cipher( 7057 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 7058 } 7059 7060 static int 7061 test_kasumi_auth_cipher_test_case_2_sgl(void) 7062 { 7063 return test_kasumi_auth_cipher_sgl( 7064 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 7065 } 7066 7067 static int 7068 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 7069 { 7070 return test_kasumi_auth_cipher_sgl( 7071 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 7072 } 7073 7074 static int 7075 test_kasumi_auth_cipher_verify_test_case_1(void) 7076 { 7077 return test_kasumi_auth_cipher( 7078 &kasumi_test_case_3, IN_PLACE, 1); 7079 } 7080 7081 static int 7082 test_kasumi_auth_cipher_verify_test_case_2(void) 7083 { 7084 return test_kasumi_auth_cipher( 7085 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 7086 } 7087 7088 static int 7089 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 7090 { 7091 return test_kasumi_auth_cipher( 7092 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7093 } 7094 7095 static int 7096 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 7097 { 7098 return test_kasumi_auth_cipher_sgl( 7099 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 7100 } 7101 7102 static int 7103 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 7104 { 7105 return test_kasumi_auth_cipher_sgl( 7106 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 7107 } 7108 7109 static int 7110 test_kasumi_cipher_auth_test_case_1(void) 7111 { 7112 return test_kasumi_cipher_auth(&kasumi_test_case_6); 7113 } 7114 7115 static int 7116 test_zuc_encryption_test_case_1(void) 7117 { 7118 return test_zuc_encryption(&zuc_test_case_cipher_193b); 7119 } 7120 7121 static int 7122 test_zuc_encryption_test_case_2(void) 7123 { 7124 return test_zuc_encryption(&zuc_test_case_cipher_800b); 7125 } 7126 7127 static int 7128 test_zuc_encryption_test_case_3(void) 7129 { 7130 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 7131 } 7132 7133 static int 7134 test_zuc_encryption_test_case_4(void) 7135 { 7136 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 7137 } 7138 7139 static int 7140 test_zuc_encryption_test_case_5(void) 7141 { 7142 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 7143 } 7144 7145 static int 7146 test_zuc_encryption_test_case_6_sgl(void) 7147 { 7148 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 7149 } 7150 7151 static int 7152 test_zuc_hash_generate_test_case_1(void) 7153 { 7154 return test_zuc_authentication(&zuc_test_case_auth_1b); 7155 } 7156 7157 static int 7158 test_zuc_hash_generate_test_case_2(void) 7159 { 7160 return test_zuc_authentication(&zuc_test_case_auth_90b); 7161 } 7162 7163 static int 7164 test_zuc_hash_generate_test_case_3(void) 7165 { 7166 return test_zuc_authentication(&zuc_test_case_auth_577b); 7167 } 7168 7169 static int 7170 test_zuc_hash_generate_test_case_4(void) 7171 { 7172 return test_zuc_authentication(&zuc_test_case_auth_2079b); 7173 } 7174 7175 static int 7176 test_zuc_hash_generate_test_case_5(void) 7177 { 7178 return test_zuc_authentication(&zuc_test_auth_5670b); 7179 } 7180 7181 static int 7182 test_zuc_hash_generate_test_case_6(void) 7183 { 7184 return test_zuc_authentication(&zuc_test_case_auth_128b); 7185 } 7186 7187 static int 7188 test_zuc_hash_generate_test_case_7(void) 7189 { 7190 return test_zuc_authentication(&zuc_test_case_auth_2080b); 7191 } 7192 7193 static int 7194 test_zuc_hash_generate_test_case_8(void) 7195 { 7196 return test_zuc_authentication(&zuc_test_case_auth_584b); 7197 } 7198 7199 static int 7200 test_zuc_hash_generate_test_case_9(void) 7201 { 7202 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b); 7203 } 7204 7205 static int 7206 test_zuc_hash_generate_test_case_10(void) 7207 { 7208 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b); 7209 } 7210 7211 static int 7212 test_zuc_hash_generate_test_case_11(void) 7213 { 7214 return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b); 7215 } 7216 7217 static int 7218 test_zuc_cipher_auth_test_case_1(void) 7219 { 7220 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 7221 } 7222 7223 static int 7224 test_zuc_cipher_auth_test_case_2(void) 7225 { 7226 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 7227 } 7228 7229 static int 7230 test_zuc_auth_cipher_test_case_1(void) 7231 { 7232 return test_zuc_auth_cipher( 7233 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7234 } 7235 7236 static int 7237 test_zuc_auth_cipher_test_case_1_oop(void) 7238 { 7239 return test_zuc_auth_cipher( 7240 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7241 } 7242 7243 static int 7244 test_zuc_auth_cipher_test_case_1_sgl(void) 7245 { 7246 return test_zuc_auth_cipher_sgl( 7247 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7248 } 7249 7250 static int 7251 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 7252 { 7253 return test_zuc_auth_cipher_sgl( 7254 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7255 } 7256 7257 static int 7258 test_zuc_auth_cipher_verify_test_case_1(void) 7259 { 7260 return test_zuc_auth_cipher( 7261 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7262 } 7263 7264 static int 7265 test_zuc_auth_cipher_verify_test_case_1_oop(void) 7266 { 7267 return test_zuc_auth_cipher( 7268 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7269 } 7270 7271 static int 7272 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 7273 { 7274 return test_zuc_auth_cipher_sgl( 7275 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7276 } 7277 7278 static int 7279 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 7280 { 7281 return test_zuc_auth_cipher_sgl( 7282 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7283 } 7284 7285 static int 7286 test_zuc256_encryption_test_case_1(void) 7287 { 7288 return test_zuc_encryption(&zuc256_test_case_cipher_1); 7289 } 7290 7291 static int 7292 test_zuc256_encryption_test_case_2(void) 7293 { 7294 return test_zuc_encryption(&zuc256_test_case_cipher_2); 7295 } 7296 7297 static int 7298 test_zuc256_authentication_test_case_1(void) 7299 { 7300 return test_zuc_authentication(&zuc256_test_case_auth_1); 7301 } 7302 7303 static int 7304 test_zuc256_authentication_test_case_2(void) 7305 { 7306 return test_zuc_authentication(&zuc256_test_case_auth_2); 7307 } 7308 7309 static int 7310 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 7311 { 7312 uint8_t dev_id = testsuite_params.valid_devs[0]; 7313 7314 struct rte_cryptodev_sym_capability_idx cap_idx; 7315 7316 /* Check if device supports particular cipher algorithm */ 7317 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7318 cap_idx.algo.cipher = tdata->cipher_algo; 7319 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7320 return TEST_SKIPPED; 7321 7322 /* Check if device supports particular hash algorithm */ 7323 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7324 cap_idx.algo.auth = tdata->auth_algo; 7325 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7326 return TEST_SKIPPED; 7327 7328 return 0; 7329 } 7330 7331 static int 7332 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 7333 uint8_t op_mode, uint8_t verify) 7334 { 7335 struct crypto_testsuite_params *ts_params = &testsuite_params; 7336 struct crypto_unittest_params *ut_params = &unittest_params; 7337 7338 int retval; 7339 7340 uint8_t *plaintext = NULL, *ciphertext = NULL; 7341 unsigned int plaintext_pad_len; 7342 unsigned int plaintext_len; 7343 unsigned int ciphertext_pad_len; 7344 unsigned int ciphertext_len; 7345 7346 struct rte_cryptodev_info dev_info; 7347 struct rte_crypto_op *op; 7348 7349 /* Check if device supports particular algorithms separately */ 7350 if (test_mixed_check_if_unsupported(tdata)) 7351 return TEST_SKIPPED; 7352 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7353 return TEST_SKIPPED; 7354 7355 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7356 7357 uint64_t feat_flags = dev_info.feature_flags; 7358 7359 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7360 printf("Device doesn't support digest encrypted.\n"); 7361 return TEST_SKIPPED; 7362 } 7363 7364 /* Create the session */ 7365 if (verify) 7366 retval = create_wireless_algo_cipher_auth_session( 7367 ts_params->valid_devs[0], 7368 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7369 RTE_CRYPTO_AUTH_OP_VERIFY, 7370 tdata->auth_algo, 7371 tdata->cipher_algo, 7372 tdata->auth_key.data, tdata->auth_key.len, 7373 tdata->auth_iv.len, tdata->digest_enc.len, 7374 tdata->cipher_iv.len); 7375 else 7376 retval = create_wireless_algo_auth_cipher_session( 7377 ts_params->valid_devs[0], 7378 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7379 RTE_CRYPTO_AUTH_OP_GENERATE, 7380 tdata->auth_algo, 7381 tdata->cipher_algo, 7382 tdata->auth_key.data, tdata->auth_key.len, 7383 tdata->auth_iv.len, tdata->digest_enc.len, 7384 tdata->cipher_iv.len); 7385 if (retval != 0) 7386 return retval; 7387 7388 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7389 if (op_mode == OUT_OF_PLACE) 7390 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7391 7392 /* clear mbuf payload */ 7393 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7394 rte_pktmbuf_tailroom(ut_params->ibuf)); 7395 if (op_mode == OUT_OF_PLACE) { 7396 7397 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 7398 rte_pktmbuf_tailroom(ut_params->obuf)); 7399 } 7400 7401 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7402 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7403 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7404 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7405 7406 if (verify) { 7407 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7408 ciphertext_pad_len); 7409 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 7410 debug_hexdump(stdout, "ciphertext:", ciphertext, 7411 ciphertext_len); 7412 } else { 7413 /* make sure enough space to cover partial digest verify case */ 7414 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7415 ciphertext_pad_len); 7416 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 7417 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 7418 } 7419 7420 if (op_mode == OUT_OF_PLACE) 7421 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 7422 7423 /* Create the operation */ 7424 retval = create_wireless_algo_auth_cipher_operation( 7425 tdata->digest_enc.data, tdata->digest_enc.len, 7426 tdata->cipher_iv.data, tdata->cipher_iv.len, 7427 tdata->auth_iv.data, tdata->auth_iv.len, 7428 (tdata->digest_enc.offset == 0 ? 7429 plaintext_pad_len 7430 : tdata->digest_enc.offset), 7431 tdata->validCipherLen.len_bits, 7432 tdata->cipher.offset_bits, 7433 tdata->validAuthLen.len_bits, 7434 tdata->auth.offset_bits, 7435 op_mode, 0, verify); 7436 7437 if (retval < 0) 7438 return retval; 7439 7440 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7441 7442 /* Check if the op failed because the device doesn't */ 7443 /* support this particular combination of algorithms */ 7444 if (op == NULL && ut_params->op->status == 7445 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7446 printf("Device doesn't support this mixed combination. " 7447 "Test Skipped.\n"); 7448 return TEST_SKIPPED; 7449 } 7450 ut_params->op = op; 7451 7452 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7453 7454 ut_params->obuf = (op_mode == IN_PLACE ? 7455 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7456 7457 if (verify) { 7458 if (ut_params->obuf) 7459 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 7460 uint8_t *); 7461 else 7462 plaintext = ciphertext + 7463 (tdata->cipher.offset_bits >> 3); 7464 7465 debug_hexdump(stdout, "plaintext:", plaintext, 7466 tdata->plaintext.len_bits >> 3); 7467 debug_hexdump(stdout, "plaintext expected:", 7468 tdata->plaintext.data, 7469 tdata->plaintext.len_bits >> 3); 7470 } else { 7471 if (ut_params->obuf) 7472 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 7473 uint8_t *); 7474 else 7475 ciphertext = plaintext; 7476 7477 debug_hexdump(stdout, "ciphertext:", ciphertext, 7478 ciphertext_len); 7479 debug_hexdump(stdout, "ciphertext expected:", 7480 tdata->ciphertext.data, 7481 tdata->ciphertext.len_bits >> 3); 7482 7483 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 7484 + (tdata->digest_enc.offset == 0 ? 7485 plaintext_pad_len : tdata->digest_enc.offset); 7486 7487 debug_hexdump(stdout, "digest:", ut_params->digest, 7488 tdata->digest_enc.len); 7489 debug_hexdump(stdout, "digest expected:", 7490 tdata->digest_enc.data, 7491 tdata->digest_enc.len); 7492 } 7493 7494 if (!verify) { 7495 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7496 ut_params->digest, 7497 tdata->digest_enc.data, 7498 tdata->digest_enc.len, 7499 "Generated auth tag not as expected"); 7500 } 7501 7502 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) { 7503 if (verify) { 7504 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7505 plaintext, 7506 tdata->plaintext.data, 7507 tdata->plaintext.len_bits >> 3, 7508 "Plaintext data not as expected"); 7509 } else { 7510 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7511 ciphertext, 7512 tdata->ciphertext.data, 7513 tdata->validDataLen.len_bits, 7514 "Ciphertext data not as expected"); 7515 } 7516 } 7517 7518 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7519 "crypto op processing failed"); 7520 7521 return 0; 7522 } 7523 7524 static int 7525 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 7526 uint8_t op_mode, uint8_t verify) 7527 { 7528 struct crypto_testsuite_params *ts_params = &testsuite_params; 7529 struct crypto_unittest_params *ut_params = &unittest_params; 7530 7531 int retval; 7532 7533 const uint8_t *plaintext = NULL; 7534 const uint8_t *ciphertext = NULL; 7535 const uint8_t *digest = NULL; 7536 unsigned int plaintext_pad_len; 7537 unsigned int plaintext_len; 7538 unsigned int ciphertext_pad_len; 7539 unsigned int ciphertext_len; 7540 uint8_t buffer[10000]; 7541 uint8_t digest_buffer[10000]; 7542 7543 struct rte_cryptodev_info dev_info; 7544 struct rte_crypto_op *op; 7545 7546 /* Check if device supports particular algorithms */ 7547 if (test_mixed_check_if_unsupported(tdata)) 7548 return TEST_SKIPPED; 7549 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7550 return TEST_SKIPPED; 7551 7552 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7553 7554 uint64_t feat_flags = dev_info.feature_flags; 7555 7556 if (op_mode == IN_PLACE) { 7557 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 7558 printf("Device doesn't support in-place scatter-gather " 7559 "in both input and output mbufs.\n"); 7560 return TEST_SKIPPED; 7561 } 7562 } else { 7563 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 7564 printf("Device doesn't support out-of-place scatter-gather " 7565 "in both input and output mbufs.\n"); 7566 return TEST_SKIPPED; 7567 } 7568 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7569 printf("Device doesn't support digest encrypted.\n"); 7570 return TEST_SKIPPED; 7571 } 7572 } 7573 7574 /* Create the session */ 7575 if (verify) 7576 retval = create_wireless_algo_cipher_auth_session( 7577 ts_params->valid_devs[0], 7578 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7579 RTE_CRYPTO_AUTH_OP_VERIFY, 7580 tdata->auth_algo, 7581 tdata->cipher_algo, 7582 tdata->auth_key.data, tdata->auth_key.len, 7583 tdata->auth_iv.len, tdata->digest_enc.len, 7584 tdata->cipher_iv.len); 7585 else 7586 retval = create_wireless_algo_auth_cipher_session( 7587 ts_params->valid_devs[0], 7588 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7589 RTE_CRYPTO_AUTH_OP_GENERATE, 7590 tdata->auth_algo, 7591 tdata->cipher_algo, 7592 tdata->auth_key.data, tdata->auth_key.len, 7593 tdata->auth_iv.len, tdata->digest_enc.len, 7594 tdata->cipher_iv.len); 7595 if (retval != 0) 7596 return retval; 7597 7598 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7599 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7600 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7601 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7602 7603 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7604 ciphertext_pad_len, 15, 0); 7605 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7606 "Failed to allocate input buffer in mempool"); 7607 7608 if (op_mode == OUT_OF_PLACE) { 7609 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7610 plaintext_pad_len, 15, 0); 7611 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7612 "Failed to allocate output buffer in mempool"); 7613 } 7614 7615 if (verify) { 7616 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7617 tdata->ciphertext.data); 7618 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7619 ciphertext_len, buffer); 7620 debug_hexdump(stdout, "ciphertext:", ciphertext, 7621 ciphertext_len); 7622 } else { 7623 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7624 tdata->plaintext.data); 7625 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7626 plaintext_len, buffer); 7627 debug_hexdump(stdout, "plaintext:", plaintext, 7628 plaintext_len); 7629 } 7630 memset(buffer, 0, sizeof(buffer)); 7631 7632 /* Create the operation */ 7633 retval = create_wireless_algo_auth_cipher_operation( 7634 tdata->digest_enc.data, tdata->digest_enc.len, 7635 tdata->cipher_iv.data, tdata->cipher_iv.len, 7636 tdata->auth_iv.data, tdata->auth_iv.len, 7637 (tdata->digest_enc.offset == 0 ? 7638 plaintext_pad_len 7639 : tdata->digest_enc.offset), 7640 tdata->validCipherLen.len_bits, 7641 tdata->cipher.offset_bits, 7642 tdata->validAuthLen.len_bits, 7643 tdata->auth.offset_bits, 7644 op_mode, 1, verify); 7645 7646 if (retval < 0) 7647 return retval; 7648 7649 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7650 7651 /* Check if the op failed because the device doesn't */ 7652 /* support this particular combination of algorithms */ 7653 if (op == NULL && ut_params->op->status == 7654 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7655 printf("Device doesn't support this mixed combination. " 7656 "Test Skipped.\n"); 7657 return TEST_SKIPPED; 7658 } 7659 ut_params->op = op; 7660 7661 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7662 7663 ut_params->obuf = (op_mode == IN_PLACE ? 7664 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7665 7666 if (verify) { 7667 if (ut_params->obuf) 7668 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7669 plaintext_len, buffer); 7670 else 7671 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7672 plaintext_len, buffer); 7673 7674 debug_hexdump(stdout, "plaintext:", plaintext, 7675 (tdata->plaintext.len_bits >> 3) - 7676 tdata->digest_enc.len); 7677 debug_hexdump(stdout, "plaintext expected:", 7678 tdata->plaintext.data, 7679 (tdata->plaintext.len_bits >> 3) - 7680 tdata->digest_enc.len); 7681 } else { 7682 if (ut_params->obuf) 7683 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 7684 ciphertext_len, buffer); 7685 else 7686 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7687 ciphertext_len, buffer); 7688 7689 debug_hexdump(stdout, "ciphertext:", ciphertext, 7690 ciphertext_len); 7691 debug_hexdump(stdout, "ciphertext expected:", 7692 tdata->ciphertext.data, 7693 tdata->ciphertext.len_bits >> 3); 7694 7695 if (ut_params->obuf) 7696 digest = rte_pktmbuf_read(ut_params->obuf, 7697 (tdata->digest_enc.offset == 0 ? 7698 plaintext_pad_len : 7699 tdata->digest_enc.offset), 7700 tdata->digest_enc.len, digest_buffer); 7701 else 7702 digest = rte_pktmbuf_read(ut_params->ibuf, 7703 (tdata->digest_enc.offset == 0 ? 7704 plaintext_pad_len : 7705 tdata->digest_enc.offset), 7706 tdata->digest_enc.len, digest_buffer); 7707 7708 debug_hexdump(stdout, "digest:", digest, 7709 tdata->digest_enc.len); 7710 debug_hexdump(stdout, "digest expected:", 7711 tdata->digest_enc.data, tdata->digest_enc.len); 7712 } 7713 7714 if (!verify) { 7715 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7716 digest, 7717 tdata->digest_enc.data, 7718 tdata->digest_enc.len, 7719 "Generated auth tag not as expected"); 7720 } 7721 7722 if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) { 7723 if (verify) { 7724 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7725 plaintext, 7726 tdata->plaintext.data, 7727 tdata->plaintext.len_bits >> 3, 7728 "Plaintext data not as expected"); 7729 } else { 7730 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7731 ciphertext, 7732 tdata->ciphertext.data, 7733 tdata->validDataLen.len_bits, 7734 "Ciphertext data not as expected"); 7735 } 7736 } 7737 7738 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7739 "crypto op processing failed"); 7740 7741 return 0; 7742 } 7743 7744 /** AUTH AES CMAC + CIPHER AES CTR */ 7745 7746 static int 7747 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7748 { 7749 return test_mixed_auth_cipher( 7750 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7751 } 7752 7753 static int 7754 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7755 { 7756 return test_mixed_auth_cipher( 7757 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7758 } 7759 7760 static int 7761 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7762 { 7763 return test_mixed_auth_cipher_sgl( 7764 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7765 } 7766 7767 static int 7768 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7769 { 7770 return test_mixed_auth_cipher_sgl( 7771 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7772 } 7773 7774 static int 7775 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7776 { 7777 return test_mixed_auth_cipher( 7778 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7779 } 7780 7781 static int 7782 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7783 { 7784 return test_mixed_auth_cipher( 7785 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7786 } 7787 7788 static int 7789 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7790 { 7791 return test_mixed_auth_cipher_sgl( 7792 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7793 } 7794 7795 static int 7796 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7797 { 7798 return test_mixed_auth_cipher_sgl( 7799 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7800 } 7801 7802 /** MIXED AUTH + CIPHER */ 7803 7804 static int 7805 test_auth_zuc_cipher_snow_test_case_1(void) 7806 { 7807 return test_mixed_auth_cipher( 7808 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7809 } 7810 7811 static int 7812 test_verify_auth_zuc_cipher_snow_test_case_1(void) 7813 { 7814 return test_mixed_auth_cipher( 7815 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7816 } 7817 7818 static int 7819 test_auth_aes_cmac_cipher_snow_test_case_1(void) 7820 { 7821 return test_mixed_auth_cipher( 7822 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7823 } 7824 7825 static int 7826 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 7827 { 7828 return test_mixed_auth_cipher( 7829 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7830 } 7831 7832 static int 7833 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 7834 { 7835 return test_mixed_auth_cipher( 7836 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7837 } 7838 7839 static int 7840 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 7841 { 7842 return test_mixed_auth_cipher( 7843 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7844 } 7845 7846 static int 7847 test_auth_snow_cipher_aes_ctr_test_case_1(void) 7848 { 7849 return test_mixed_auth_cipher( 7850 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7851 } 7852 7853 static int 7854 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 7855 { 7856 return test_mixed_auth_cipher( 7857 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7858 } 7859 7860 static int 7861 test_auth_snow_cipher_zuc_test_case_1(void) 7862 { 7863 return test_mixed_auth_cipher( 7864 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7865 } 7866 7867 static int 7868 test_verify_auth_snow_cipher_zuc_test_case_1(void) 7869 { 7870 return test_mixed_auth_cipher( 7871 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7872 } 7873 7874 static int 7875 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 7876 { 7877 return test_mixed_auth_cipher( 7878 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7879 } 7880 7881 static int 7882 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 7883 { 7884 return test_mixed_auth_cipher( 7885 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7886 } 7887 7888 static int 7889 test_auth_null_cipher_snow_test_case_1(void) 7890 { 7891 return test_mixed_auth_cipher( 7892 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7893 } 7894 7895 static int 7896 test_verify_auth_null_cipher_snow_test_case_1(void) 7897 { 7898 return test_mixed_auth_cipher( 7899 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7900 } 7901 7902 static int 7903 test_auth_null_cipher_zuc_test_case_1(void) 7904 { 7905 return test_mixed_auth_cipher( 7906 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7907 } 7908 7909 static int 7910 test_verify_auth_null_cipher_zuc_test_case_1(void) 7911 { 7912 return test_mixed_auth_cipher( 7913 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7914 } 7915 7916 static int 7917 test_auth_snow_cipher_null_test_case_1(void) 7918 { 7919 return test_mixed_auth_cipher( 7920 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7921 } 7922 7923 static int 7924 test_verify_auth_snow_cipher_null_test_case_1(void) 7925 { 7926 return test_mixed_auth_cipher( 7927 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7928 } 7929 7930 static int 7931 test_auth_zuc_cipher_null_test_case_1(void) 7932 { 7933 return test_mixed_auth_cipher( 7934 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7935 } 7936 7937 static int 7938 test_verify_auth_zuc_cipher_null_test_case_1(void) 7939 { 7940 return test_mixed_auth_cipher( 7941 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7942 } 7943 7944 static int 7945 test_auth_null_cipher_aes_ctr_test_case_1(void) 7946 { 7947 return test_mixed_auth_cipher( 7948 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7949 } 7950 7951 static int 7952 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 7953 { 7954 return test_mixed_auth_cipher( 7955 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7956 } 7957 7958 static int 7959 test_auth_aes_cmac_cipher_null_test_case_1(void) 7960 { 7961 return test_mixed_auth_cipher( 7962 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7963 } 7964 7965 static int 7966 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 7967 { 7968 return test_mixed_auth_cipher( 7969 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7970 } 7971 7972 /* ***** AEAD algorithm Tests ***** */ 7973 7974 static int 7975 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 7976 enum rte_crypto_aead_operation op, 7977 const uint8_t *key, const uint8_t key_len, 7978 const uint16_t aad_len, const uint8_t auth_len, 7979 uint8_t iv_len) 7980 { 7981 uint8_t aead_key[key_len]; 7982 int status; 7983 7984 struct crypto_testsuite_params *ts_params = &testsuite_params; 7985 struct crypto_unittest_params *ut_params = &unittest_params; 7986 7987 memcpy(aead_key, key, key_len); 7988 7989 /* Setup AEAD Parameters */ 7990 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7991 ut_params->aead_xform.next = NULL; 7992 ut_params->aead_xform.aead.algo = algo; 7993 ut_params->aead_xform.aead.op = op; 7994 ut_params->aead_xform.aead.key.data = aead_key; 7995 ut_params->aead_xform.aead.key.length = key_len; 7996 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 7997 ut_params->aead_xform.aead.iv.length = iv_len; 7998 ut_params->aead_xform.aead.digest_length = auth_len; 7999 ut_params->aead_xform.aead.aad_length = aad_len; 8000 8001 debug_hexdump(stdout, "key:", key, key_len); 8002 8003 /* Create Crypto session*/ 8004 ut_params->sess = rte_cryptodev_sym_session_create( 8005 ts_params->session_mpool); 8006 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 8007 8008 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 8009 &ut_params->aead_xform, 8010 ts_params->session_priv_mpool); 8011 8012 return status; 8013 } 8014 8015 static int 8016 create_aead_xform(struct rte_crypto_op *op, 8017 enum rte_crypto_aead_algorithm algo, 8018 enum rte_crypto_aead_operation aead_op, 8019 uint8_t *key, const uint8_t key_len, 8020 const uint8_t aad_len, const uint8_t auth_len, 8021 uint8_t iv_len) 8022 { 8023 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 8024 "failed to allocate space for crypto transform"); 8025 8026 struct rte_crypto_sym_op *sym_op = op->sym; 8027 8028 /* Setup AEAD Parameters */ 8029 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 8030 sym_op->xform->next = NULL; 8031 sym_op->xform->aead.algo = algo; 8032 sym_op->xform->aead.op = aead_op; 8033 sym_op->xform->aead.key.data = key; 8034 sym_op->xform->aead.key.length = key_len; 8035 sym_op->xform->aead.iv.offset = IV_OFFSET; 8036 sym_op->xform->aead.iv.length = iv_len; 8037 sym_op->xform->aead.digest_length = auth_len; 8038 sym_op->xform->aead.aad_length = aad_len; 8039 8040 debug_hexdump(stdout, "key:", key, key_len); 8041 8042 return 0; 8043 } 8044 8045 static int 8046 create_aead_operation(enum rte_crypto_aead_operation op, 8047 const struct aead_test_data *tdata) 8048 { 8049 struct crypto_testsuite_params *ts_params = &testsuite_params; 8050 struct crypto_unittest_params *ut_params = &unittest_params; 8051 8052 uint8_t *plaintext, *ciphertext; 8053 unsigned int aad_pad_len, plaintext_pad_len; 8054 8055 /* Generate Crypto op data structure */ 8056 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8057 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8058 TEST_ASSERT_NOT_NULL(ut_params->op, 8059 "Failed to allocate symmetric crypto operation struct"); 8060 8061 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 8062 8063 /* Append aad data */ 8064 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 8065 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 8066 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8067 aad_pad_len); 8068 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 8069 "no room to append aad"); 8070 8071 sym_op->aead.aad.phys_addr = 8072 rte_pktmbuf_iova(ut_params->ibuf); 8073 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 8074 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 8075 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 8076 tdata->aad.len); 8077 8078 /* Append IV at the end of the crypto operation*/ 8079 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 8080 uint8_t *, IV_OFFSET); 8081 8082 /* Copy IV 1 byte after the IV pointer, according to the API */ 8083 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 8084 debug_hexdump(stdout, "iv:", iv_ptr, 8085 tdata->iv.len); 8086 } else { 8087 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 8088 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8089 aad_pad_len); 8090 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 8091 "no room to append aad"); 8092 8093 sym_op->aead.aad.phys_addr = 8094 rte_pktmbuf_iova(ut_params->ibuf); 8095 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 8096 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 8097 tdata->aad.len); 8098 8099 /* Append IV at the end of the crypto operation*/ 8100 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 8101 uint8_t *, IV_OFFSET); 8102 8103 if (tdata->iv.len == 0) { 8104 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 8105 debug_hexdump(stdout, "iv:", iv_ptr, 8106 AES_GCM_J0_LENGTH); 8107 } else { 8108 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 8109 debug_hexdump(stdout, "iv:", iv_ptr, 8110 tdata->iv.len); 8111 } 8112 } 8113 8114 /* Append plaintext/ciphertext */ 8115 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 8116 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8117 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8118 plaintext_pad_len); 8119 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 8120 8121 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 8122 debug_hexdump(stdout, "plaintext:", plaintext, 8123 tdata->plaintext.len); 8124 8125 if (ut_params->obuf) { 8126 ciphertext = (uint8_t *)rte_pktmbuf_append( 8127 ut_params->obuf, 8128 plaintext_pad_len + aad_pad_len); 8129 TEST_ASSERT_NOT_NULL(ciphertext, 8130 "no room to append ciphertext"); 8131 8132 memset(ciphertext + aad_pad_len, 0, 8133 tdata->ciphertext.len); 8134 } 8135 } else { 8136 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 8137 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8138 plaintext_pad_len); 8139 TEST_ASSERT_NOT_NULL(ciphertext, 8140 "no room to append ciphertext"); 8141 8142 memcpy(ciphertext, tdata->ciphertext.data, 8143 tdata->ciphertext.len); 8144 debug_hexdump(stdout, "ciphertext:", ciphertext, 8145 tdata->ciphertext.len); 8146 8147 if (ut_params->obuf) { 8148 plaintext = (uint8_t *)rte_pktmbuf_append( 8149 ut_params->obuf, 8150 plaintext_pad_len + aad_pad_len); 8151 TEST_ASSERT_NOT_NULL(plaintext, 8152 "no room to append plaintext"); 8153 8154 memset(plaintext + aad_pad_len, 0, 8155 tdata->plaintext.len); 8156 } 8157 } 8158 8159 /* Append digest data */ 8160 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 8161 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 8162 ut_params->obuf ? ut_params->obuf : 8163 ut_params->ibuf, 8164 tdata->auth_tag.len); 8165 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 8166 "no room to append digest"); 8167 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 8168 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 8169 ut_params->obuf ? ut_params->obuf : 8170 ut_params->ibuf, 8171 plaintext_pad_len + 8172 aad_pad_len); 8173 } else { 8174 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 8175 ut_params->ibuf, tdata->auth_tag.len); 8176 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 8177 "no room to append digest"); 8178 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 8179 ut_params->ibuf, 8180 plaintext_pad_len + aad_pad_len); 8181 8182 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 8183 tdata->auth_tag.len); 8184 debug_hexdump(stdout, "digest:", 8185 sym_op->aead.digest.data, 8186 tdata->auth_tag.len); 8187 } 8188 8189 sym_op->aead.data.length = tdata->plaintext.len; 8190 sym_op->aead.data.offset = aad_pad_len; 8191 8192 return 0; 8193 } 8194 8195 static int 8196 test_authenticated_encryption(const struct aead_test_data *tdata) 8197 { 8198 struct crypto_testsuite_params *ts_params = &testsuite_params; 8199 struct crypto_unittest_params *ut_params = &unittest_params; 8200 8201 int retval; 8202 uint8_t *ciphertext, *auth_tag; 8203 uint16_t plaintext_pad_len; 8204 uint32_t i; 8205 struct rte_cryptodev_info dev_info; 8206 8207 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8208 uint64_t feat_flags = dev_info.feature_flags; 8209 8210 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 8211 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 8212 printf("Device doesn't support RAW data-path APIs.\n"); 8213 return TEST_SKIPPED; 8214 } 8215 8216 /* Verify the capabilities */ 8217 struct rte_cryptodev_sym_capability_idx cap_idx; 8218 const struct rte_cryptodev_symmetric_capability *capability; 8219 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8220 cap_idx.algo.aead = tdata->algo; 8221 capability = rte_cryptodev_sym_capability_get( 8222 ts_params->valid_devs[0], &cap_idx); 8223 if (capability == NULL) 8224 return TEST_SKIPPED; 8225 if (rte_cryptodev_sym_capability_check_aead( 8226 capability, tdata->key.len, tdata->auth_tag.len, 8227 tdata->aad.len, tdata->iv.len)) 8228 return TEST_SKIPPED; 8229 8230 /* Create AEAD session */ 8231 retval = create_aead_session(ts_params->valid_devs[0], 8232 tdata->algo, 8233 RTE_CRYPTO_AEAD_OP_ENCRYPT, 8234 tdata->key.data, tdata->key.len, 8235 tdata->aad.len, tdata->auth_tag.len, 8236 tdata->iv.len); 8237 if (retval < 0) 8238 return retval; 8239 8240 if (tdata->aad.len > MBUF_SIZE) { 8241 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 8242 /* Populate full size of add data */ 8243 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 8244 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 8245 } else 8246 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8247 8248 /* clear mbuf payload */ 8249 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8250 rte_pktmbuf_tailroom(ut_params->ibuf)); 8251 8252 /* Create AEAD operation */ 8253 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8254 if (retval < 0) 8255 return retval; 8256 8257 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8258 8259 ut_params->op->sym->m_src = ut_params->ibuf; 8260 8261 /* Process crypto operation */ 8262 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8263 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 8264 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 8265 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8266 ut_params->op, 0, 0, 0, 0); 8267 else 8268 TEST_ASSERT_NOT_NULL( 8269 process_crypto_request(ts_params->valid_devs[0], 8270 ut_params->op), "failed to process sym crypto op"); 8271 8272 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8273 "crypto op processing failed"); 8274 8275 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8276 8277 if (ut_params->op->sym->m_dst) { 8278 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8279 uint8_t *); 8280 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8281 uint8_t *, plaintext_pad_len); 8282 } else { 8283 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8284 uint8_t *, 8285 ut_params->op->sym->cipher.data.offset); 8286 auth_tag = ciphertext + plaintext_pad_len; 8287 } 8288 8289 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8290 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8291 8292 /* Validate obuf */ 8293 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8294 ciphertext, 8295 tdata->ciphertext.data, 8296 tdata->ciphertext.len, 8297 "Ciphertext data not as expected"); 8298 8299 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8300 auth_tag, 8301 tdata->auth_tag.data, 8302 tdata->auth_tag.len, 8303 "Generated auth tag not as expected"); 8304 8305 return 0; 8306 8307 } 8308 8309 #ifdef RTE_LIB_SECURITY 8310 static int 8311 security_proto_supported(enum rte_security_session_action_type action, 8312 enum rte_security_session_protocol proto) 8313 { 8314 struct crypto_testsuite_params *ts_params = &testsuite_params; 8315 8316 const struct rte_security_capability *capabilities; 8317 const struct rte_security_capability *capability; 8318 uint16_t i = 0; 8319 8320 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8321 rte_cryptodev_get_sec_ctx( 8322 ts_params->valid_devs[0]); 8323 8324 8325 capabilities = rte_security_capabilities_get(ctx); 8326 8327 if (capabilities == NULL) 8328 return -ENOTSUP; 8329 8330 while ((capability = &capabilities[i++])->action != 8331 RTE_SECURITY_ACTION_TYPE_NONE) { 8332 if (capability->action == action && 8333 capability->protocol == proto) 8334 return 0; 8335 } 8336 8337 return -ENOTSUP; 8338 } 8339 8340 /* Basic algorithm run function for async inplace mode. 8341 * Creates a session from input parameters and runs one operation 8342 * on input_vec. Checks the output of the crypto operation against 8343 * output_vec. 8344 */ 8345 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 8346 enum rte_crypto_auth_operation opa, 8347 const uint8_t *input_vec, unsigned int input_vec_len, 8348 const uint8_t *output_vec, 8349 unsigned int output_vec_len, 8350 enum rte_crypto_cipher_algorithm cipher_alg, 8351 const uint8_t *cipher_key, uint32_t cipher_key_len, 8352 enum rte_crypto_auth_algorithm auth_alg, 8353 const uint8_t *auth_key, uint32_t auth_key_len, 8354 uint8_t bearer, enum rte_security_pdcp_domain domain, 8355 uint8_t packet_direction, uint8_t sn_size, 8356 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 8357 { 8358 struct crypto_testsuite_params *ts_params = &testsuite_params; 8359 struct crypto_unittest_params *ut_params = &unittest_params; 8360 uint8_t *plaintext; 8361 int ret = TEST_SUCCESS; 8362 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8363 rte_cryptodev_get_sec_ctx( 8364 ts_params->valid_devs[0]); 8365 8366 /* Verify the capabilities */ 8367 struct rte_security_capability_idx sec_cap_idx; 8368 8369 sec_cap_idx.action = ut_params->type; 8370 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8371 sec_cap_idx.pdcp.domain = domain; 8372 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8373 return TEST_SKIPPED; 8374 8375 /* Generate test mbuf data */ 8376 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8377 8378 /* clear mbuf payload */ 8379 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8380 rte_pktmbuf_tailroom(ut_params->ibuf)); 8381 8382 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8383 input_vec_len); 8384 memcpy(plaintext, input_vec, input_vec_len); 8385 8386 /* Out of place support */ 8387 if (oop) { 8388 /* 8389 * For out-op-place we need to alloc another mbuf 8390 */ 8391 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8392 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 8393 } 8394 8395 /* Setup Cipher Parameters */ 8396 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8397 ut_params->cipher_xform.cipher.algo = cipher_alg; 8398 ut_params->cipher_xform.cipher.op = opc; 8399 ut_params->cipher_xform.cipher.key.data = cipher_key; 8400 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 8401 ut_params->cipher_xform.cipher.iv.length = 8402 packet_direction ? 4 : 0; 8403 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8404 8405 /* Setup HMAC Parameters if ICV header is required */ 8406 if (auth_alg != 0) { 8407 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8408 ut_params->auth_xform.next = NULL; 8409 ut_params->auth_xform.auth.algo = auth_alg; 8410 ut_params->auth_xform.auth.op = opa; 8411 ut_params->auth_xform.auth.key.data = auth_key; 8412 ut_params->auth_xform.auth.key.length = auth_key_len; 8413 8414 ut_params->cipher_xform.next = &ut_params->auth_xform; 8415 } else { 8416 ut_params->cipher_xform.next = NULL; 8417 } 8418 8419 struct rte_security_session_conf sess_conf = { 8420 .action_type = ut_params->type, 8421 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8422 {.pdcp = { 8423 .bearer = bearer, 8424 .domain = domain, 8425 .pkt_dir = packet_direction, 8426 .sn_size = sn_size, 8427 .hfn = packet_direction ? 0 : hfn, 8428 /** 8429 * hfn can be set as pdcp_test_hfn[i] 8430 * if hfn_ovrd is not set. Here, PDCP 8431 * packet direction is just used to 8432 * run half of the cases with session 8433 * HFN and other half with per packet 8434 * HFN. 8435 */ 8436 .hfn_threshold = hfn_threshold, 8437 .hfn_ovrd = packet_direction ? 1 : 0, 8438 .sdap_enabled = sdap, 8439 } }, 8440 .crypto_xform = &ut_params->cipher_xform 8441 }; 8442 8443 /* Create security session */ 8444 ut_params->sec_session = rte_security_session_create(ctx, 8445 &sess_conf, ts_params->session_mpool, 8446 ts_params->session_priv_mpool); 8447 8448 if (!ut_params->sec_session) { 8449 printf("TestCase %s()-%d line %d failed %s: ", 8450 __func__, i, __LINE__, "Failed to allocate session"); 8451 ret = TEST_FAILED; 8452 goto on_err; 8453 } 8454 8455 /* Generate crypto op data structure */ 8456 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8457 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8458 if (!ut_params->op) { 8459 printf("TestCase %s()-%d line %d failed %s: ", 8460 __func__, i, __LINE__, 8461 "Failed to allocate symmetric crypto operation struct"); 8462 ret = TEST_FAILED; 8463 goto on_err; 8464 } 8465 8466 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 8467 uint32_t *, IV_OFFSET); 8468 *per_pkt_hfn = packet_direction ? hfn : 0; 8469 8470 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8471 8472 /* set crypto operation source mbuf */ 8473 ut_params->op->sym->m_src = ut_params->ibuf; 8474 if (oop) 8475 ut_params->op->sym->m_dst = ut_params->obuf; 8476 8477 /* Process crypto operation */ 8478 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8479 == NULL) { 8480 printf("TestCase %s()-%d line %d failed %s: ", 8481 __func__, i, __LINE__, 8482 "failed to process sym crypto op"); 8483 ret = TEST_FAILED; 8484 goto on_err; 8485 } 8486 8487 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8488 printf("TestCase %s()-%d line %d failed %s: ", 8489 __func__, i, __LINE__, "crypto op processing failed"); 8490 ret = TEST_FAILED; 8491 goto on_err; 8492 } 8493 8494 /* Validate obuf */ 8495 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8496 uint8_t *); 8497 if (oop) { 8498 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8499 uint8_t *); 8500 } 8501 8502 if (memcmp(ciphertext, output_vec, output_vec_len)) { 8503 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8504 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 8505 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 8506 ret = TEST_FAILED; 8507 goto on_err; 8508 } 8509 8510 on_err: 8511 rte_crypto_op_free(ut_params->op); 8512 ut_params->op = NULL; 8513 8514 if (ut_params->sec_session) 8515 rte_security_session_destroy(ctx, ut_params->sec_session); 8516 ut_params->sec_session = NULL; 8517 8518 rte_pktmbuf_free(ut_params->ibuf); 8519 ut_params->ibuf = NULL; 8520 if (oop) { 8521 rte_pktmbuf_free(ut_params->obuf); 8522 ut_params->obuf = NULL; 8523 } 8524 8525 return ret; 8526 } 8527 8528 static int 8529 test_pdcp_proto_SGL(int i, int oop, 8530 enum rte_crypto_cipher_operation opc, 8531 enum rte_crypto_auth_operation opa, 8532 uint8_t *input_vec, 8533 unsigned int input_vec_len, 8534 uint8_t *output_vec, 8535 unsigned int output_vec_len, 8536 uint32_t fragsz, 8537 uint32_t fragsz_oop) 8538 { 8539 struct crypto_testsuite_params *ts_params = &testsuite_params; 8540 struct crypto_unittest_params *ut_params = &unittest_params; 8541 uint8_t *plaintext; 8542 struct rte_mbuf *buf, *buf_oop = NULL; 8543 int ret = TEST_SUCCESS; 8544 int to_trn = 0; 8545 int to_trn_tbl[16]; 8546 int segs = 1; 8547 unsigned int trn_data = 0; 8548 struct rte_cryptodev_info dev_info; 8549 uint64_t feat_flags; 8550 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8551 rte_cryptodev_get_sec_ctx( 8552 ts_params->valid_devs[0]); 8553 struct rte_mbuf *temp_mbuf; 8554 8555 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8556 feat_flags = dev_info.feature_flags; 8557 8558 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 8559 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 8560 printf("Device does not support RAW data-path APIs.\n"); 8561 return -ENOTSUP; 8562 } 8563 /* Verify the capabilities */ 8564 struct rte_security_capability_idx sec_cap_idx; 8565 8566 sec_cap_idx.action = ut_params->type; 8567 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8568 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 8569 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8570 return TEST_SKIPPED; 8571 8572 if (fragsz > input_vec_len) 8573 fragsz = input_vec_len; 8574 8575 uint16_t plaintext_len = fragsz; 8576 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 8577 8578 if (fragsz_oop > output_vec_len) 8579 frag_size_oop = output_vec_len; 8580 8581 int ecx = 0; 8582 if (input_vec_len % fragsz != 0) { 8583 if (input_vec_len / fragsz + 1 > 16) 8584 return 1; 8585 } else if (input_vec_len / fragsz > 16) 8586 return 1; 8587 8588 /* Out of place support */ 8589 if (oop) { 8590 /* 8591 * For out-op-place we need to alloc another mbuf 8592 */ 8593 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8594 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 8595 buf_oop = ut_params->obuf; 8596 } 8597 8598 /* Generate test mbuf data */ 8599 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8600 8601 /* clear mbuf payload */ 8602 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8603 rte_pktmbuf_tailroom(ut_params->ibuf)); 8604 8605 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8606 plaintext_len); 8607 memcpy(plaintext, input_vec, plaintext_len); 8608 trn_data += plaintext_len; 8609 8610 buf = ut_params->ibuf; 8611 8612 /* 8613 * Loop until no more fragments 8614 */ 8615 8616 while (trn_data < input_vec_len) { 8617 ++segs; 8618 to_trn = (input_vec_len - trn_data < fragsz) ? 8619 (input_vec_len - trn_data) : fragsz; 8620 8621 to_trn_tbl[ecx++] = to_trn; 8622 8623 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8624 buf = buf->next; 8625 8626 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 8627 rte_pktmbuf_tailroom(buf)); 8628 8629 /* OOP */ 8630 if (oop && !fragsz_oop) { 8631 buf_oop->next = 8632 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8633 buf_oop = buf_oop->next; 8634 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8635 0, rte_pktmbuf_tailroom(buf_oop)); 8636 rte_pktmbuf_append(buf_oop, to_trn); 8637 } 8638 8639 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 8640 to_trn); 8641 8642 memcpy(plaintext, input_vec + trn_data, to_trn); 8643 trn_data += to_trn; 8644 } 8645 8646 ut_params->ibuf->nb_segs = segs; 8647 8648 segs = 1; 8649 if (fragsz_oop && oop) { 8650 to_trn = 0; 8651 ecx = 0; 8652 8653 trn_data = frag_size_oop; 8654 while (trn_data < output_vec_len) { 8655 ++segs; 8656 to_trn = 8657 (output_vec_len - trn_data < 8658 frag_size_oop) ? 8659 (output_vec_len - trn_data) : 8660 frag_size_oop; 8661 8662 to_trn_tbl[ecx++] = to_trn; 8663 8664 buf_oop->next = 8665 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8666 buf_oop = buf_oop->next; 8667 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8668 0, rte_pktmbuf_tailroom(buf_oop)); 8669 rte_pktmbuf_append(buf_oop, to_trn); 8670 8671 trn_data += to_trn; 8672 } 8673 ut_params->obuf->nb_segs = segs; 8674 } 8675 8676 /* Setup Cipher Parameters */ 8677 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8678 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 8679 ut_params->cipher_xform.cipher.op = opc; 8680 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 8681 ut_params->cipher_xform.cipher.key.length = 8682 pdcp_test_params[i].cipher_key_len; 8683 ut_params->cipher_xform.cipher.iv.length = 0; 8684 8685 /* Setup HMAC Parameters if ICV header is required */ 8686 if (pdcp_test_params[i].auth_alg != 0) { 8687 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8688 ut_params->auth_xform.next = NULL; 8689 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 8690 ut_params->auth_xform.auth.op = opa; 8691 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 8692 ut_params->auth_xform.auth.key.length = 8693 pdcp_test_params[i].auth_key_len; 8694 8695 ut_params->cipher_xform.next = &ut_params->auth_xform; 8696 } else { 8697 ut_params->cipher_xform.next = NULL; 8698 } 8699 8700 struct rte_security_session_conf sess_conf = { 8701 .action_type = ut_params->type, 8702 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8703 {.pdcp = { 8704 .bearer = pdcp_test_bearer[i], 8705 .domain = pdcp_test_params[i].domain, 8706 .pkt_dir = pdcp_test_packet_direction[i], 8707 .sn_size = pdcp_test_data_sn_size[i], 8708 .hfn = pdcp_test_hfn[i], 8709 .hfn_threshold = pdcp_test_hfn_threshold[i], 8710 .hfn_ovrd = 0, 8711 } }, 8712 .crypto_xform = &ut_params->cipher_xform 8713 }; 8714 8715 /* Create security session */ 8716 ut_params->sec_session = rte_security_session_create(ctx, 8717 &sess_conf, ts_params->session_mpool, 8718 ts_params->session_priv_mpool); 8719 8720 if (!ut_params->sec_session) { 8721 printf("TestCase %s()-%d line %d failed %s: ", 8722 __func__, i, __LINE__, "Failed to allocate session"); 8723 ret = TEST_FAILED; 8724 goto on_err; 8725 } 8726 8727 /* Generate crypto op data structure */ 8728 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8729 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8730 if (!ut_params->op) { 8731 printf("TestCase %s()-%d line %d failed %s: ", 8732 __func__, i, __LINE__, 8733 "Failed to allocate symmetric crypto operation struct"); 8734 ret = TEST_FAILED; 8735 goto on_err; 8736 } 8737 8738 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8739 8740 /* set crypto operation source mbuf */ 8741 ut_params->op->sym->m_src = ut_params->ibuf; 8742 if (oop) 8743 ut_params->op->sym->m_dst = ut_params->obuf; 8744 8745 /* Process crypto operation */ 8746 temp_mbuf = ut_params->op->sym->m_src; 8747 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) { 8748 /* filling lengths */ 8749 while (temp_mbuf) { 8750 ut_params->op->sym->cipher.data.length 8751 += temp_mbuf->pkt_len; 8752 ut_params->op->sym->auth.data.length 8753 += temp_mbuf->pkt_len; 8754 temp_mbuf = temp_mbuf->next; 8755 } 8756 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8757 ut_params->op, 1, 1, 0, 0); 8758 } else { 8759 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 8760 ut_params->op); 8761 } 8762 if (ut_params->op == NULL) { 8763 printf("TestCase %s()-%d line %d failed %s: ", 8764 __func__, i, __LINE__, 8765 "failed to process sym crypto op"); 8766 ret = TEST_FAILED; 8767 goto on_err; 8768 } 8769 8770 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8771 printf("TestCase %s()-%d line %d failed %s: ", 8772 __func__, i, __LINE__, "crypto op processing failed"); 8773 ret = TEST_FAILED; 8774 goto on_err; 8775 } 8776 8777 /* Validate obuf */ 8778 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8779 uint8_t *); 8780 if (oop) { 8781 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8782 uint8_t *); 8783 } 8784 if (fragsz_oop) 8785 fragsz = frag_size_oop; 8786 if (memcmp(ciphertext, output_vec, fragsz)) { 8787 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8788 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 8789 rte_hexdump(stdout, "reference", output_vec, fragsz); 8790 ret = TEST_FAILED; 8791 goto on_err; 8792 } 8793 8794 buf = ut_params->op->sym->m_src->next; 8795 if (oop) 8796 buf = ut_params->op->sym->m_dst->next; 8797 8798 unsigned int off = fragsz; 8799 8800 ecx = 0; 8801 while (buf) { 8802 ciphertext = rte_pktmbuf_mtod(buf, 8803 uint8_t *); 8804 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 8805 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8806 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 8807 rte_hexdump(stdout, "reference", output_vec + off, 8808 to_trn_tbl[ecx]); 8809 ret = TEST_FAILED; 8810 goto on_err; 8811 } 8812 off += to_trn_tbl[ecx++]; 8813 buf = buf->next; 8814 } 8815 on_err: 8816 rte_crypto_op_free(ut_params->op); 8817 ut_params->op = NULL; 8818 8819 if (ut_params->sec_session) 8820 rte_security_session_destroy(ctx, ut_params->sec_session); 8821 ut_params->sec_session = NULL; 8822 8823 rte_pktmbuf_free(ut_params->ibuf); 8824 ut_params->ibuf = NULL; 8825 if (oop) { 8826 rte_pktmbuf_free(ut_params->obuf); 8827 ut_params->obuf = NULL; 8828 } 8829 8830 return ret; 8831 } 8832 8833 int 8834 test_pdcp_proto_cplane_encap(int i) 8835 { 8836 return test_pdcp_proto( 8837 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8838 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8839 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8840 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8841 pdcp_test_params[i].cipher_key_len, 8842 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8843 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8844 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8845 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8846 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8847 } 8848 8849 int 8850 test_pdcp_proto_uplane_encap(int i) 8851 { 8852 return test_pdcp_proto( 8853 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8854 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8855 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8856 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8857 pdcp_test_params[i].cipher_key_len, 8858 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8859 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8860 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8861 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8862 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8863 } 8864 8865 int 8866 test_pdcp_proto_uplane_encap_with_int(int i) 8867 { 8868 return test_pdcp_proto( 8869 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8870 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8871 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8872 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8873 pdcp_test_params[i].cipher_key_len, 8874 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8875 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8876 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8877 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8878 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8879 } 8880 8881 int 8882 test_pdcp_proto_cplane_decap(int i) 8883 { 8884 return test_pdcp_proto( 8885 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8886 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8887 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8888 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8889 pdcp_test_params[i].cipher_key_len, 8890 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8891 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8892 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8893 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8894 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8895 } 8896 8897 int 8898 test_pdcp_proto_uplane_decap(int i) 8899 { 8900 return test_pdcp_proto( 8901 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8902 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8903 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8904 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8905 pdcp_test_params[i].cipher_key_len, 8906 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8907 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8908 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8909 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8910 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8911 } 8912 8913 int 8914 test_pdcp_proto_uplane_decap_with_int(int i) 8915 { 8916 return test_pdcp_proto( 8917 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8918 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8919 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8920 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8921 pdcp_test_params[i].cipher_key_len, 8922 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8923 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8924 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8925 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8926 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8927 } 8928 8929 static int 8930 test_PDCP_PROTO_SGL_in_place_32B(void) 8931 { 8932 /* i can be used for running any PDCP case 8933 * In this case it is uplane 12-bit AES-SNOW DL encap 8934 */ 8935 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 8936 return test_pdcp_proto_SGL(i, IN_PLACE, 8937 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8938 RTE_CRYPTO_AUTH_OP_GENERATE, 8939 pdcp_test_data_in[i], 8940 pdcp_test_data_in_len[i], 8941 pdcp_test_data_out[i], 8942 pdcp_test_data_in_len[i]+4, 8943 32, 0); 8944 } 8945 static int 8946 test_PDCP_PROTO_SGL_oop_32B_128B(void) 8947 { 8948 /* i can be used for running any PDCP case 8949 * In this case it is uplane 18-bit NULL-NULL DL encap 8950 */ 8951 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 8952 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8953 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8954 RTE_CRYPTO_AUTH_OP_GENERATE, 8955 pdcp_test_data_in[i], 8956 pdcp_test_data_in_len[i], 8957 pdcp_test_data_out[i], 8958 pdcp_test_data_in_len[i]+4, 8959 32, 128); 8960 } 8961 static int 8962 test_PDCP_PROTO_SGL_oop_32B_40B(void) 8963 { 8964 /* i can be used for running any PDCP case 8965 * In this case it is uplane 18-bit AES DL encap 8966 */ 8967 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 8968 + DOWNLINK; 8969 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8970 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8971 RTE_CRYPTO_AUTH_OP_GENERATE, 8972 pdcp_test_data_in[i], 8973 pdcp_test_data_in_len[i], 8974 pdcp_test_data_out[i], 8975 pdcp_test_data_in_len[i], 8976 32, 40); 8977 } 8978 static int 8979 test_PDCP_PROTO_SGL_oop_128B_32B(void) 8980 { 8981 /* i can be used for running any PDCP case 8982 * In this case it is cplane 12-bit AES-ZUC DL encap 8983 */ 8984 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 8985 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8986 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8987 RTE_CRYPTO_AUTH_OP_GENERATE, 8988 pdcp_test_data_in[i], 8989 pdcp_test_data_in_len[i], 8990 pdcp_test_data_out[i], 8991 pdcp_test_data_in_len[i]+4, 8992 128, 32); 8993 } 8994 8995 static int 8996 test_PDCP_SDAP_PROTO_encap_all(void) 8997 { 8998 int i = 0, size = 0; 8999 int err, all_err = TEST_SUCCESS; 9000 const struct pdcp_sdap_test *cur_test; 9001 9002 size = RTE_DIM(list_pdcp_sdap_tests); 9003 9004 for (i = 0; i < size; i++) { 9005 cur_test = &list_pdcp_sdap_tests[i]; 9006 err = test_pdcp_proto( 9007 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9008 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 9009 cur_test->in_len, cur_test->data_out, 9010 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9011 cur_test->param.cipher_alg, cur_test->cipher_key, 9012 cur_test->param.cipher_key_len, 9013 cur_test->param.auth_alg, 9014 cur_test->auth_key, cur_test->param.auth_key_len, 9015 cur_test->bearer, cur_test->param.domain, 9016 cur_test->packet_direction, cur_test->sn_size, 9017 cur_test->hfn, 9018 cur_test->hfn_threshold, SDAP_ENABLED); 9019 if (err) { 9020 printf("\t%d) %s: Encapsulation failed\n", 9021 cur_test->test_idx, 9022 cur_test->param.name); 9023 err = TEST_FAILED; 9024 } else { 9025 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 9026 cur_test->param.name); 9027 err = TEST_SUCCESS; 9028 } 9029 all_err += err; 9030 } 9031 9032 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9033 9034 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9035 } 9036 9037 static int 9038 test_PDCP_PROTO_short_mac(void) 9039 { 9040 int i = 0, size = 0; 9041 int err, all_err = TEST_SUCCESS; 9042 const struct pdcp_short_mac_test *cur_test; 9043 9044 size = RTE_DIM(list_pdcp_smac_tests); 9045 9046 for (i = 0; i < size; i++) { 9047 cur_test = &list_pdcp_smac_tests[i]; 9048 err = test_pdcp_proto( 9049 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 9050 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 9051 cur_test->in_len, cur_test->data_out, 9052 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9053 RTE_CRYPTO_CIPHER_NULL, NULL, 9054 0, cur_test->param.auth_alg, 9055 cur_test->auth_key, cur_test->param.auth_key_len, 9056 0, cur_test->param.domain, 0, 0, 9057 0, 0, 0); 9058 if (err) { 9059 printf("\t%d) %s: Short MAC test failed\n", 9060 cur_test->test_idx, 9061 cur_test->param.name); 9062 err = TEST_FAILED; 9063 } else { 9064 printf("\t%d) %s: Short MAC test PASS\n", 9065 cur_test->test_idx, 9066 cur_test->param.name); 9067 rte_hexdump(stdout, "MAC I", 9068 cur_test->data_out + cur_test->in_len + 2, 9069 2); 9070 err = TEST_SUCCESS; 9071 } 9072 all_err += err; 9073 } 9074 9075 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9076 9077 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9078 9079 } 9080 9081 static int 9082 test_PDCP_SDAP_PROTO_decap_all(void) 9083 { 9084 int i = 0, size = 0; 9085 int err, all_err = TEST_SUCCESS; 9086 const struct pdcp_sdap_test *cur_test; 9087 9088 size = RTE_DIM(list_pdcp_sdap_tests); 9089 9090 for (i = 0; i < size; i++) { 9091 cur_test = &list_pdcp_sdap_tests[i]; 9092 err = test_pdcp_proto( 9093 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 9094 RTE_CRYPTO_AUTH_OP_VERIFY, 9095 cur_test->data_out, 9096 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 9097 cur_test->data_in, cur_test->in_len, 9098 cur_test->param.cipher_alg, 9099 cur_test->cipher_key, cur_test->param.cipher_key_len, 9100 cur_test->param.auth_alg, cur_test->auth_key, 9101 cur_test->param.auth_key_len, cur_test->bearer, 9102 cur_test->param.domain, cur_test->packet_direction, 9103 cur_test->sn_size, cur_test->hfn, 9104 cur_test->hfn_threshold, SDAP_ENABLED); 9105 if (err) { 9106 printf("\t%d) %s: Decapsulation failed\n", 9107 cur_test->test_idx, 9108 cur_test->param.name); 9109 err = TEST_FAILED; 9110 } else { 9111 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 9112 cur_test->param.name); 9113 err = TEST_SUCCESS; 9114 } 9115 all_err += err; 9116 } 9117 9118 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 9119 9120 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 9121 } 9122 9123 static int 9124 test_ipsec_proto_process(const struct ipsec_test_data td[], 9125 struct ipsec_test_data res_d[], 9126 int nb_td, 9127 bool silent, 9128 const struct ipsec_test_flags *flags) 9129 { 9130 uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000, 9131 0x0000, 0x001a}; 9132 uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174, 9133 0xe82c, 0x4887}; 9134 struct crypto_testsuite_params *ts_params = &testsuite_params; 9135 struct crypto_unittest_params *ut_params = &unittest_params; 9136 struct rte_security_capability_idx sec_cap_idx; 9137 const struct rte_security_capability *sec_cap; 9138 struct rte_security_ipsec_xform ipsec_xform; 9139 uint8_t dev_id = ts_params->valid_devs[0]; 9140 enum rte_security_ipsec_sa_direction dir; 9141 struct ipsec_test_data *res_d_tmp = NULL; 9142 uint32_t src = RTE_IPV4(192, 168, 1, 0); 9143 uint32_t dst = RTE_IPV4(192, 168, 1, 1); 9144 int salt_len, i, ret = TEST_SUCCESS; 9145 struct rte_security_ctx *ctx; 9146 uint8_t *input_text; 9147 uint32_t verify; 9148 9149 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 9150 gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 9151 9152 /* Use first test data to create session */ 9153 9154 /* Copy IPsec xform */ 9155 memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform)); 9156 9157 dir = ipsec_xform.direction; 9158 verify = flags->tunnel_hdr_verify; 9159 9160 if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) { 9161 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR) 9162 src += 1; 9163 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR) 9164 dst += 1; 9165 } 9166 9167 if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) { 9168 if (td->ipsec_xform.tunnel.type == 9169 RTE_SECURITY_IPSEC_TUNNEL_IPV4) { 9170 memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, 9171 sizeof(src)); 9172 memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, 9173 sizeof(dst)); 9174 9175 if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1) 9176 ipsec_xform.tunnel.ipv4.df = 0; 9177 9178 if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0) 9179 ipsec_xform.tunnel.ipv4.df = 1; 9180 9181 } else { 9182 memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src, 9183 sizeof(v6_src)); 9184 memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst, 9185 sizeof(v6_dst)); 9186 } 9187 } 9188 9189 ctx = rte_cryptodev_get_sec_ctx(dev_id); 9190 9191 sec_cap_idx.action = ut_params->type; 9192 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC; 9193 sec_cap_idx.ipsec.proto = ipsec_xform.proto; 9194 sec_cap_idx.ipsec.mode = ipsec_xform.mode; 9195 sec_cap_idx.ipsec.direction = ipsec_xform.direction; 9196 9197 if (flags->udp_encap) 9198 ipsec_xform.options.udp_encap = 1; 9199 9200 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9201 if (sec_cap == NULL) 9202 return TEST_SKIPPED; 9203 9204 /* Copy cipher session parameters */ 9205 if (td[0].aead) { 9206 memcpy(&ut_params->aead_xform, &td[0].xform.aead, 9207 sizeof(ut_params->aead_xform)); 9208 ut_params->aead_xform.aead.key.data = td[0].key.data; 9209 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 9210 9211 /* Verify crypto capabilities */ 9212 if (test_ipsec_crypto_caps_aead_verify( 9213 sec_cap, 9214 &ut_params->aead_xform) != 0) { 9215 if (!silent) 9216 RTE_LOG(INFO, USER1, 9217 "Crypto capabilities not supported\n"); 9218 return TEST_SKIPPED; 9219 } 9220 } else { 9221 memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher, 9222 sizeof(ut_params->cipher_xform)); 9223 memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth, 9224 sizeof(ut_params->auth_xform)); 9225 ut_params->cipher_xform.cipher.key.data = td[0].key.data; 9226 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9227 ut_params->auth_xform.auth.key.data = td[0].auth_key.data; 9228 9229 /* Verify crypto capabilities */ 9230 9231 if (test_ipsec_crypto_caps_cipher_verify( 9232 sec_cap, 9233 &ut_params->cipher_xform) != 0) { 9234 if (!silent) 9235 RTE_LOG(INFO, USER1, 9236 "Cipher crypto capabilities not supported\n"); 9237 return TEST_SKIPPED; 9238 } 9239 9240 if (test_ipsec_crypto_caps_auth_verify( 9241 sec_cap, 9242 &ut_params->auth_xform) != 0) { 9243 if (!silent) 9244 RTE_LOG(INFO, USER1, 9245 "Auth crypto capabilities not supported\n"); 9246 return TEST_SKIPPED; 9247 } 9248 } 9249 9250 if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0) 9251 return TEST_SKIPPED; 9252 9253 struct rte_security_session_conf sess_conf = { 9254 .action_type = ut_params->type, 9255 .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 9256 }; 9257 9258 if (td[0].aead) { 9259 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len); 9260 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len); 9261 sess_conf.ipsec = ipsec_xform; 9262 sess_conf.crypto_xform = &ut_params->aead_xform; 9263 } else { 9264 sess_conf.ipsec = ipsec_xform; 9265 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) { 9266 sess_conf.crypto_xform = &ut_params->cipher_xform; 9267 ut_params->cipher_xform.next = &ut_params->auth_xform; 9268 } else { 9269 sess_conf.crypto_xform = &ut_params->auth_xform; 9270 ut_params->auth_xform.next = &ut_params->cipher_xform; 9271 } 9272 } 9273 9274 /* Create security session */ 9275 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9276 ts_params->session_mpool, 9277 ts_params->session_priv_mpool); 9278 9279 if (ut_params->sec_session == NULL) 9280 return TEST_SKIPPED; 9281 9282 for (i = 0; i < nb_td; i++) { 9283 /* Setup source mbuf payload */ 9284 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9285 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9286 rte_pktmbuf_tailroom(ut_params->ibuf)); 9287 9288 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9289 td[i].input_text.len); 9290 9291 memcpy(input_text, td[i].input_text.data, 9292 td[i].input_text.len); 9293 9294 if (test_ipsec_pkt_update(input_text, flags)) 9295 return TEST_FAILED; 9296 9297 /* Generate crypto op data structure */ 9298 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9299 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9300 if (!ut_params->op) { 9301 printf("TestCase %s line %d: %s\n", 9302 __func__, __LINE__, 9303 "failed to allocate crypto op"); 9304 ret = TEST_FAILED; 9305 goto crypto_op_free; 9306 } 9307 9308 /* Attach session to operation */ 9309 rte_security_attach_session(ut_params->op, 9310 ut_params->sec_session); 9311 9312 /* Set crypto operation mbufs */ 9313 ut_params->op->sym->m_src = ut_params->ibuf; 9314 ut_params->op->sym->m_dst = NULL; 9315 9316 /* Copy IV in crypto operation when IV generation is disabled */ 9317 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS && 9318 ipsec_xform.options.iv_gen_disable == 1) { 9319 uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op, 9320 uint8_t *, 9321 IV_OFFSET); 9322 int len; 9323 9324 if (td[i].aead) 9325 len = td[i].xform.aead.aead.iv.length; 9326 else 9327 len = td[i].xform.chain.cipher.cipher.iv.length; 9328 9329 memcpy(iv, td[i].iv.data, len); 9330 } 9331 9332 /* Process crypto operation */ 9333 process_crypto_request(dev_id, ut_params->op); 9334 9335 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1); 9336 if (ret != TEST_SUCCESS) 9337 goto crypto_op_free; 9338 9339 if (res_d != NULL) 9340 res_d_tmp = &res_d[i]; 9341 9342 ret = test_ipsec_post_process(ut_params->ibuf, &td[i], 9343 res_d_tmp, silent, flags); 9344 if (ret != TEST_SUCCESS) 9345 goto crypto_op_free; 9346 9347 ret = test_ipsec_stats_verify(ctx, ut_params->sec_session, 9348 flags, dir); 9349 if (ret != TEST_SUCCESS) 9350 goto crypto_op_free; 9351 9352 rte_crypto_op_free(ut_params->op); 9353 ut_params->op = NULL; 9354 9355 rte_pktmbuf_free(ut_params->ibuf); 9356 ut_params->ibuf = NULL; 9357 } 9358 9359 crypto_op_free: 9360 rte_crypto_op_free(ut_params->op); 9361 ut_params->op = NULL; 9362 9363 rte_pktmbuf_free(ut_params->ibuf); 9364 ut_params->ibuf = NULL; 9365 9366 if (ut_params->sec_session) 9367 rte_security_session_destroy(ctx, ut_params->sec_session); 9368 ut_params->sec_session = NULL; 9369 9370 return ret; 9371 } 9372 9373 static int 9374 test_ipsec_proto_known_vec(const void *test_data) 9375 { 9376 struct ipsec_test_data td_outb; 9377 struct ipsec_test_flags flags; 9378 9379 memset(&flags, 0, sizeof(flags)); 9380 9381 memcpy(&td_outb, test_data, sizeof(td_outb)); 9382 9383 if (td_outb.aead || 9384 td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL) { 9385 /* Disable IV gen to be able to test with known vectors */ 9386 td_outb.ipsec_xform.options.iv_gen_disable = 1; 9387 } 9388 9389 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags); 9390 } 9391 9392 static int 9393 test_ipsec_proto_known_vec_inb(const void *test_data) 9394 { 9395 const struct ipsec_test_data *td = test_data; 9396 struct ipsec_test_flags flags; 9397 struct ipsec_test_data td_inb; 9398 9399 memset(&flags, 0, sizeof(flags)); 9400 9401 if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) 9402 test_ipsec_td_in_from_out(td, &td_inb); 9403 else 9404 memcpy(&td_inb, td, sizeof(td_inb)); 9405 9406 return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags); 9407 } 9408 9409 static int 9410 test_ipsec_proto_known_vec_fragmented(const void *test_data) 9411 { 9412 struct ipsec_test_data td_outb; 9413 struct ipsec_test_flags flags; 9414 9415 memset(&flags, 0, sizeof(flags)); 9416 flags.fragment = true; 9417 9418 memcpy(&td_outb, test_data, sizeof(td_outb)); 9419 9420 /* Disable IV gen to be able to test with known vectors */ 9421 td_outb.ipsec_xform.options.iv_gen_disable = 1; 9422 9423 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags); 9424 } 9425 9426 static int 9427 test_ipsec_proto_all(const struct ipsec_test_flags *flags) 9428 { 9429 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX]; 9430 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX]; 9431 unsigned int i, nb_pkts = 1, pass_cnt = 0; 9432 int ret; 9433 9434 if (flags->iv_gen || 9435 flags->sa_expiry_pkts_soft || 9436 flags->sa_expiry_pkts_hard) 9437 nb_pkts = IPSEC_TEST_PACKETS_MAX; 9438 9439 for (i = 0; i < RTE_DIM(alg_list); i++) { 9440 test_ipsec_td_prepare(alg_list[i].param1, 9441 alg_list[i].param2, 9442 flags, 9443 td_outb, 9444 nb_pkts); 9445 9446 if (!td_outb->aead) { 9447 enum rte_crypto_cipher_algorithm cipher_alg; 9448 enum rte_crypto_auth_algorithm auth_alg; 9449 9450 cipher_alg = td_outb->xform.chain.cipher.cipher.algo; 9451 auth_alg = td_outb->xform.chain.auth.auth.algo; 9452 9453 /* ICV is not applicable for NULL auth */ 9454 if (flags->icv_corrupt && 9455 auth_alg == RTE_CRYPTO_AUTH_NULL) 9456 continue; 9457 9458 /* IV is not applicable for NULL cipher */ 9459 if (flags->iv_gen && 9460 cipher_alg == RTE_CRYPTO_CIPHER_NULL) 9461 continue; 9462 } 9463 9464 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true, 9465 flags); 9466 if (ret == TEST_SKIPPED) 9467 continue; 9468 9469 if (ret == TEST_FAILED) 9470 return TEST_FAILED; 9471 9472 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags); 9473 9474 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true, 9475 flags); 9476 if (ret == TEST_SKIPPED) 9477 continue; 9478 9479 if (ret == TEST_FAILED) 9480 return TEST_FAILED; 9481 9482 if (flags->display_alg) 9483 test_ipsec_display_alg(alg_list[i].param1, 9484 alg_list[i].param2); 9485 9486 pass_cnt++; 9487 } 9488 9489 if (pass_cnt > 0) 9490 return TEST_SUCCESS; 9491 else 9492 return TEST_SKIPPED; 9493 } 9494 9495 static int 9496 test_ipsec_proto_display_list(const void *data __rte_unused) 9497 { 9498 struct ipsec_test_flags flags; 9499 9500 memset(&flags, 0, sizeof(flags)); 9501 9502 flags.display_alg = true; 9503 9504 return test_ipsec_proto_all(&flags); 9505 } 9506 9507 static int 9508 test_ipsec_proto_iv_gen(const void *data __rte_unused) 9509 { 9510 struct ipsec_test_flags flags; 9511 9512 memset(&flags, 0, sizeof(flags)); 9513 9514 flags.iv_gen = true; 9515 9516 return test_ipsec_proto_all(&flags); 9517 } 9518 9519 static int 9520 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused) 9521 { 9522 struct ipsec_test_flags flags; 9523 9524 memset(&flags, 0, sizeof(flags)); 9525 9526 flags.sa_expiry_pkts_soft = true; 9527 9528 return test_ipsec_proto_all(&flags); 9529 } 9530 9531 static int 9532 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused) 9533 { 9534 struct ipsec_test_flags flags; 9535 9536 memset(&flags, 0, sizeof(flags)); 9537 9538 flags.sa_expiry_pkts_hard = true; 9539 9540 return test_ipsec_proto_all(&flags); 9541 } 9542 9543 static int 9544 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused) 9545 { 9546 struct ipsec_test_flags flags; 9547 9548 memset(&flags, 0, sizeof(flags)); 9549 9550 flags.icv_corrupt = true; 9551 9552 return test_ipsec_proto_all(&flags); 9553 } 9554 9555 static int 9556 test_ipsec_proto_udp_encap(const void *data __rte_unused) 9557 { 9558 struct ipsec_test_flags flags; 9559 9560 memset(&flags, 0, sizeof(flags)); 9561 9562 flags.udp_encap = true; 9563 9564 return test_ipsec_proto_all(&flags); 9565 } 9566 9567 static int 9568 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused) 9569 { 9570 struct ipsec_test_flags flags; 9571 9572 memset(&flags, 0, sizeof(flags)); 9573 9574 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR; 9575 9576 return test_ipsec_proto_all(&flags); 9577 } 9578 9579 static int 9580 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused) 9581 { 9582 struct ipsec_test_flags flags; 9583 9584 memset(&flags, 0, sizeof(flags)); 9585 9586 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR; 9587 9588 return test_ipsec_proto_all(&flags); 9589 } 9590 9591 static int 9592 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused) 9593 { 9594 struct ipsec_test_flags flags; 9595 9596 memset(&flags, 0, sizeof(flags)); 9597 9598 flags.udp_encap = true; 9599 flags.udp_ports_verify = true; 9600 9601 return test_ipsec_proto_all(&flags); 9602 } 9603 9604 static int 9605 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused) 9606 { 9607 struct ipsec_test_flags flags; 9608 9609 memset(&flags, 0, sizeof(flags)); 9610 9611 flags.ip_csum = true; 9612 9613 return test_ipsec_proto_all(&flags); 9614 } 9615 9616 static int 9617 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused) 9618 { 9619 struct ipsec_test_flags flags; 9620 9621 memset(&flags, 0, sizeof(flags)); 9622 9623 flags.l4_csum = true; 9624 9625 return test_ipsec_proto_all(&flags); 9626 } 9627 9628 static int 9629 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused) 9630 { 9631 struct ipsec_test_flags flags; 9632 9633 memset(&flags, 0, sizeof(flags)); 9634 9635 flags.ipv6 = false; 9636 flags.tunnel_ipv6 = false; 9637 9638 return test_ipsec_proto_all(&flags); 9639 } 9640 9641 static int 9642 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused) 9643 { 9644 struct ipsec_test_flags flags; 9645 9646 memset(&flags, 0, sizeof(flags)); 9647 9648 flags.ipv6 = true; 9649 flags.tunnel_ipv6 = true; 9650 9651 return test_ipsec_proto_all(&flags); 9652 } 9653 9654 static int 9655 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused) 9656 { 9657 struct ipsec_test_flags flags; 9658 9659 memset(&flags, 0, sizeof(flags)); 9660 9661 flags.ipv6 = false; 9662 flags.tunnel_ipv6 = true; 9663 9664 return test_ipsec_proto_all(&flags); 9665 } 9666 9667 static int 9668 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused) 9669 { 9670 struct ipsec_test_flags flags; 9671 9672 memset(&flags, 0, sizeof(flags)); 9673 9674 flags.ipv6 = true; 9675 flags.tunnel_ipv6 = false; 9676 9677 return test_ipsec_proto_all(&flags); 9678 } 9679 9680 static int 9681 test_ipsec_proto_transport_v4(const void *data __rte_unused) 9682 { 9683 struct ipsec_test_flags flags; 9684 9685 memset(&flags, 0, sizeof(flags)); 9686 9687 flags.ipv6 = false; 9688 flags.transport = true; 9689 9690 return test_ipsec_proto_all(&flags); 9691 } 9692 9693 static int 9694 test_ipsec_proto_stats(const void *data __rte_unused) 9695 { 9696 struct ipsec_test_flags flags; 9697 9698 memset(&flags, 0, sizeof(flags)); 9699 9700 flags.stats_success = true; 9701 9702 return test_ipsec_proto_all(&flags); 9703 } 9704 9705 static int 9706 test_ipsec_proto_pkt_fragment(const void *data __rte_unused) 9707 { 9708 struct ipsec_test_flags flags; 9709 9710 memset(&flags, 0, sizeof(flags)); 9711 9712 flags.fragment = true; 9713 9714 return test_ipsec_proto_all(&flags); 9715 9716 } 9717 9718 static int 9719 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused) 9720 { 9721 struct ipsec_test_flags flags; 9722 9723 memset(&flags, 0, sizeof(flags)); 9724 9725 flags.df = TEST_IPSEC_COPY_DF_INNER_0; 9726 9727 return test_ipsec_proto_all(&flags); 9728 } 9729 9730 static int 9731 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused) 9732 { 9733 struct ipsec_test_flags flags; 9734 9735 memset(&flags, 0, sizeof(flags)); 9736 9737 flags.df = TEST_IPSEC_COPY_DF_INNER_1; 9738 9739 return test_ipsec_proto_all(&flags); 9740 } 9741 9742 static int 9743 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused) 9744 { 9745 struct ipsec_test_flags flags; 9746 9747 memset(&flags, 0, sizeof(flags)); 9748 9749 flags.df = TEST_IPSEC_SET_DF_0_INNER_1; 9750 9751 return test_ipsec_proto_all(&flags); 9752 } 9753 9754 static int 9755 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused) 9756 { 9757 struct ipsec_test_flags flags; 9758 9759 memset(&flags, 0, sizeof(flags)); 9760 9761 flags.df = TEST_IPSEC_SET_DF_1_INNER_0; 9762 9763 return test_ipsec_proto_all(&flags); 9764 } 9765 9766 static int 9767 test_PDCP_PROTO_all(void) 9768 { 9769 struct crypto_testsuite_params *ts_params = &testsuite_params; 9770 struct crypto_unittest_params *ut_params = &unittest_params; 9771 struct rte_cryptodev_info dev_info; 9772 int status; 9773 9774 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9775 uint64_t feat_flags = dev_info.feature_flags; 9776 9777 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 9778 return TEST_SKIPPED; 9779 9780 /* Set action type */ 9781 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9782 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9783 gbl_action_type; 9784 9785 if (security_proto_supported(ut_params->type, 9786 RTE_SECURITY_PROTOCOL_PDCP) < 0) 9787 return TEST_SKIPPED; 9788 9789 status = test_PDCP_PROTO_cplane_encap_all(); 9790 status += test_PDCP_PROTO_cplane_decap_all(); 9791 status += test_PDCP_PROTO_uplane_encap_all(); 9792 status += test_PDCP_PROTO_uplane_decap_all(); 9793 status += test_PDCP_PROTO_SGL_in_place_32B(); 9794 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 9795 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 9796 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 9797 status += test_PDCP_SDAP_PROTO_encap_all(); 9798 status += test_PDCP_SDAP_PROTO_decap_all(); 9799 status += test_PDCP_PROTO_short_mac(); 9800 9801 if (status) 9802 return TEST_FAILED; 9803 else 9804 return TEST_SUCCESS; 9805 } 9806 9807 static int 9808 test_docsis_proto_uplink(const void *data) 9809 { 9810 const struct docsis_test_data *d_td = data; 9811 struct crypto_testsuite_params *ts_params = &testsuite_params; 9812 struct crypto_unittest_params *ut_params = &unittest_params; 9813 uint8_t *plaintext = NULL; 9814 uint8_t *ciphertext = NULL; 9815 uint8_t *iv_ptr; 9816 int32_t cipher_len, crc_len; 9817 uint32_t crc_data_len; 9818 int ret = TEST_SUCCESS; 9819 9820 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9821 rte_cryptodev_get_sec_ctx( 9822 ts_params->valid_devs[0]); 9823 9824 /* Verify the capabilities */ 9825 struct rte_security_capability_idx sec_cap_idx; 9826 const struct rte_security_capability *sec_cap; 9827 const struct rte_cryptodev_capabilities *crypto_cap; 9828 const struct rte_cryptodev_symmetric_capability *sym_cap; 9829 int j = 0; 9830 9831 /* Set action type */ 9832 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9833 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9834 gbl_action_type; 9835 9836 if (security_proto_supported(ut_params->type, 9837 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 9838 return TEST_SKIPPED; 9839 9840 sec_cap_idx.action = ut_params->type; 9841 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 9842 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 9843 9844 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9845 if (sec_cap == NULL) 9846 return TEST_SKIPPED; 9847 9848 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 9849 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 9850 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 9851 crypto_cap->sym.xform_type == 9852 RTE_CRYPTO_SYM_XFORM_CIPHER && 9853 crypto_cap->sym.cipher.algo == 9854 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 9855 sym_cap = &crypto_cap->sym; 9856 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 9857 d_td->key.len, 9858 d_td->iv.len) == 0) 9859 break; 9860 } 9861 } 9862 9863 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 9864 return TEST_SKIPPED; 9865 9866 /* Setup source mbuf payload */ 9867 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9868 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9869 rte_pktmbuf_tailroom(ut_params->ibuf)); 9870 9871 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9872 d_td->ciphertext.len); 9873 9874 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 9875 9876 /* Setup cipher session parameters */ 9877 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9878 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 9879 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 9880 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 9881 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 9882 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 9883 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9884 ut_params->cipher_xform.next = NULL; 9885 9886 /* Setup DOCSIS session parameters */ 9887 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 9888 9889 struct rte_security_session_conf sess_conf = { 9890 .action_type = ut_params->type, 9891 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 9892 .docsis = ut_params->docsis_xform, 9893 .crypto_xform = &ut_params->cipher_xform, 9894 }; 9895 9896 /* Create security session */ 9897 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9898 ts_params->session_mpool, 9899 ts_params->session_priv_mpool); 9900 9901 if (!ut_params->sec_session) { 9902 printf("Test function %s line %u: failed to allocate session\n", 9903 __func__, __LINE__); 9904 ret = TEST_FAILED; 9905 goto on_err; 9906 } 9907 9908 /* Generate crypto op data structure */ 9909 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9910 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9911 if (!ut_params->op) { 9912 printf("Test function %s line %u: failed to allocate symmetric " 9913 "crypto operation\n", __func__, __LINE__); 9914 ret = TEST_FAILED; 9915 goto on_err; 9916 } 9917 9918 /* Setup CRC operation parameters */ 9919 crc_len = d_td->ciphertext.no_crc == false ? 9920 (d_td->ciphertext.len - 9921 d_td->ciphertext.crc_offset - 9922 RTE_ETHER_CRC_LEN) : 9923 0; 9924 crc_len = crc_len > 0 ? crc_len : 0; 9925 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 9926 ut_params->op->sym->auth.data.length = crc_len; 9927 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 9928 9929 /* Setup cipher operation parameters */ 9930 cipher_len = d_td->ciphertext.no_cipher == false ? 9931 (d_td->ciphertext.len - 9932 d_td->ciphertext.cipher_offset) : 9933 0; 9934 cipher_len = cipher_len > 0 ? cipher_len : 0; 9935 ut_params->op->sym->cipher.data.length = cipher_len; 9936 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 9937 9938 /* Setup cipher IV */ 9939 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9940 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9941 9942 /* Attach session to operation */ 9943 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9944 9945 /* Set crypto operation mbufs */ 9946 ut_params->op->sym->m_src = ut_params->ibuf; 9947 ut_params->op->sym->m_dst = NULL; 9948 9949 /* Process crypto operation */ 9950 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9951 NULL) { 9952 printf("Test function %s line %u: failed to process security " 9953 "crypto op\n", __func__, __LINE__); 9954 ret = TEST_FAILED; 9955 goto on_err; 9956 } 9957 9958 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9959 printf("Test function %s line %u: failed to process crypto op\n", 9960 __func__, __LINE__); 9961 ret = TEST_FAILED; 9962 goto on_err; 9963 } 9964 9965 /* Validate plaintext */ 9966 plaintext = ciphertext; 9967 9968 if (memcmp(plaintext, d_td->plaintext.data, 9969 d_td->plaintext.len - crc_data_len)) { 9970 printf("Test function %s line %u: plaintext not as expected\n", 9971 __func__, __LINE__); 9972 rte_hexdump(stdout, "expected", d_td->plaintext.data, 9973 d_td->plaintext.len); 9974 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 9975 ret = TEST_FAILED; 9976 goto on_err; 9977 } 9978 9979 on_err: 9980 rte_crypto_op_free(ut_params->op); 9981 ut_params->op = NULL; 9982 9983 if (ut_params->sec_session) 9984 rte_security_session_destroy(ctx, ut_params->sec_session); 9985 ut_params->sec_session = NULL; 9986 9987 rte_pktmbuf_free(ut_params->ibuf); 9988 ut_params->ibuf = NULL; 9989 9990 return ret; 9991 } 9992 9993 static int 9994 test_docsis_proto_downlink(const void *data) 9995 { 9996 const struct docsis_test_data *d_td = data; 9997 struct crypto_testsuite_params *ts_params = &testsuite_params; 9998 struct crypto_unittest_params *ut_params = &unittest_params; 9999 uint8_t *plaintext = NULL; 10000 uint8_t *ciphertext = NULL; 10001 uint8_t *iv_ptr; 10002 int32_t cipher_len, crc_len; 10003 int ret = TEST_SUCCESS; 10004 10005 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 10006 rte_cryptodev_get_sec_ctx( 10007 ts_params->valid_devs[0]); 10008 10009 /* Verify the capabilities */ 10010 struct rte_security_capability_idx sec_cap_idx; 10011 const struct rte_security_capability *sec_cap; 10012 const struct rte_cryptodev_capabilities *crypto_cap; 10013 const struct rte_cryptodev_symmetric_capability *sym_cap; 10014 int j = 0; 10015 10016 /* Set action type */ 10017 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 10018 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 10019 gbl_action_type; 10020 10021 if (security_proto_supported(ut_params->type, 10022 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 10023 return TEST_SKIPPED; 10024 10025 sec_cap_idx.action = ut_params->type; 10026 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 10027 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 10028 10029 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 10030 if (sec_cap == NULL) 10031 return TEST_SKIPPED; 10032 10033 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 10034 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 10035 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 10036 crypto_cap->sym.xform_type == 10037 RTE_CRYPTO_SYM_XFORM_CIPHER && 10038 crypto_cap->sym.cipher.algo == 10039 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 10040 sym_cap = &crypto_cap->sym; 10041 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 10042 d_td->key.len, 10043 d_td->iv.len) == 0) 10044 break; 10045 } 10046 } 10047 10048 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 10049 return TEST_SKIPPED; 10050 10051 /* Setup source mbuf payload */ 10052 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10053 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10054 rte_pktmbuf_tailroom(ut_params->ibuf)); 10055 10056 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10057 d_td->plaintext.len); 10058 10059 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 10060 10061 /* Setup cipher session parameters */ 10062 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10063 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 10064 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10065 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 10066 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 10067 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 10068 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10069 ut_params->cipher_xform.next = NULL; 10070 10071 /* Setup DOCSIS session parameters */ 10072 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 10073 10074 struct rte_security_session_conf sess_conf = { 10075 .action_type = ut_params->type, 10076 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 10077 .docsis = ut_params->docsis_xform, 10078 .crypto_xform = &ut_params->cipher_xform, 10079 }; 10080 10081 /* Create security session */ 10082 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 10083 ts_params->session_mpool, 10084 ts_params->session_priv_mpool); 10085 10086 if (!ut_params->sec_session) { 10087 printf("Test function %s line %u: failed to allocate session\n", 10088 __func__, __LINE__); 10089 ret = TEST_FAILED; 10090 goto on_err; 10091 } 10092 10093 /* Generate crypto op data structure */ 10094 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10095 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10096 if (!ut_params->op) { 10097 printf("Test function %s line %u: failed to allocate symmetric " 10098 "crypto operation\n", __func__, __LINE__); 10099 ret = TEST_FAILED; 10100 goto on_err; 10101 } 10102 10103 /* Setup CRC operation parameters */ 10104 crc_len = d_td->plaintext.no_crc == false ? 10105 (d_td->plaintext.len - 10106 d_td->plaintext.crc_offset - 10107 RTE_ETHER_CRC_LEN) : 10108 0; 10109 crc_len = crc_len > 0 ? crc_len : 0; 10110 ut_params->op->sym->auth.data.length = crc_len; 10111 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 10112 10113 /* Setup cipher operation parameters */ 10114 cipher_len = d_td->plaintext.no_cipher == false ? 10115 (d_td->plaintext.len - 10116 d_td->plaintext.cipher_offset) : 10117 0; 10118 cipher_len = cipher_len > 0 ? cipher_len : 0; 10119 ut_params->op->sym->cipher.data.length = cipher_len; 10120 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 10121 10122 /* Setup cipher IV */ 10123 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 10124 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 10125 10126 /* Attach session to operation */ 10127 rte_security_attach_session(ut_params->op, ut_params->sec_session); 10128 10129 /* Set crypto operation mbufs */ 10130 ut_params->op->sym->m_src = ut_params->ibuf; 10131 ut_params->op->sym->m_dst = NULL; 10132 10133 /* Process crypto operation */ 10134 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 10135 NULL) { 10136 printf("Test function %s line %u: failed to process crypto op\n", 10137 __func__, __LINE__); 10138 ret = TEST_FAILED; 10139 goto on_err; 10140 } 10141 10142 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 10143 printf("Test function %s line %u: crypto op processing failed\n", 10144 __func__, __LINE__); 10145 ret = TEST_FAILED; 10146 goto on_err; 10147 } 10148 10149 /* Validate ciphertext */ 10150 ciphertext = plaintext; 10151 10152 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 10153 printf("Test function %s line %u: plaintext not as expected\n", 10154 __func__, __LINE__); 10155 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 10156 d_td->ciphertext.len); 10157 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 10158 ret = TEST_FAILED; 10159 goto on_err; 10160 } 10161 10162 on_err: 10163 rte_crypto_op_free(ut_params->op); 10164 ut_params->op = NULL; 10165 10166 if (ut_params->sec_session) 10167 rte_security_session_destroy(ctx, ut_params->sec_session); 10168 ut_params->sec_session = NULL; 10169 10170 rte_pktmbuf_free(ut_params->ibuf); 10171 ut_params->ibuf = NULL; 10172 10173 return ret; 10174 } 10175 #endif 10176 10177 static int 10178 test_AES_GCM_authenticated_encryption_test_case_1(void) 10179 { 10180 return test_authenticated_encryption(&gcm_test_case_1); 10181 } 10182 10183 static int 10184 test_AES_GCM_authenticated_encryption_test_case_2(void) 10185 { 10186 return test_authenticated_encryption(&gcm_test_case_2); 10187 } 10188 10189 static int 10190 test_AES_GCM_authenticated_encryption_test_case_3(void) 10191 { 10192 return test_authenticated_encryption(&gcm_test_case_3); 10193 } 10194 10195 static int 10196 test_AES_GCM_authenticated_encryption_test_case_4(void) 10197 { 10198 return test_authenticated_encryption(&gcm_test_case_4); 10199 } 10200 10201 static int 10202 test_AES_GCM_authenticated_encryption_test_case_5(void) 10203 { 10204 return test_authenticated_encryption(&gcm_test_case_5); 10205 } 10206 10207 static int 10208 test_AES_GCM_authenticated_encryption_test_case_6(void) 10209 { 10210 return test_authenticated_encryption(&gcm_test_case_6); 10211 } 10212 10213 static int 10214 test_AES_GCM_authenticated_encryption_test_case_7(void) 10215 { 10216 return test_authenticated_encryption(&gcm_test_case_7); 10217 } 10218 10219 static int 10220 test_AES_GCM_authenticated_encryption_test_case_8(void) 10221 { 10222 return test_authenticated_encryption(&gcm_test_case_8); 10223 } 10224 10225 static int 10226 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 10227 { 10228 return test_authenticated_encryption(&gcm_J0_test_case_1); 10229 } 10230 10231 static int 10232 test_AES_GCM_auth_encryption_test_case_192_1(void) 10233 { 10234 return test_authenticated_encryption(&gcm_test_case_192_1); 10235 } 10236 10237 static int 10238 test_AES_GCM_auth_encryption_test_case_192_2(void) 10239 { 10240 return test_authenticated_encryption(&gcm_test_case_192_2); 10241 } 10242 10243 static int 10244 test_AES_GCM_auth_encryption_test_case_192_3(void) 10245 { 10246 return test_authenticated_encryption(&gcm_test_case_192_3); 10247 } 10248 10249 static int 10250 test_AES_GCM_auth_encryption_test_case_192_4(void) 10251 { 10252 return test_authenticated_encryption(&gcm_test_case_192_4); 10253 } 10254 10255 static int 10256 test_AES_GCM_auth_encryption_test_case_192_5(void) 10257 { 10258 return test_authenticated_encryption(&gcm_test_case_192_5); 10259 } 10260 10261 static int 10262 test_AES_GCM_auth_encryption_test_case_192_6(void) 10263 { 10264 return test_authenticated_encryption(&gcm_test_case_192_6); 10265 } 10266 10267 static int 10268 test_AES_GCM_auth_encryption_test_case_192_7(void) 10269 { 10270 return test_authenticated_encryption(&gcm_test_case_192_7); 10271 } 10272 10273 static int 10274 test_AES_GCM_auth_encryption_test_case_256_1(void) 10275 { 10276 return test_authenticated_encryption(&gcm_test_case_256_1); 10277 } 10278 10279 static int 10280 test_AES_GCM_auth_encryption_test_case_256_2(void) 10281 { 10282 return test_authenticated_encryption(&gcm_test_case_256_2); 10283 } 10284 10285 static int 10286 test_AES_GCM_auth_encryption_test_case_256_3(void) 10287 { 10288 return test_authenticated_encryption(&gcm_test_case_256_3); 10289 } 10290 10291 static int 10292 test_AES_GCM_auth_encryption_test_case_256_4(void) 10293 { 10294 return test_authenticated_encryption(&gcm_test_case_256_4); 10295 } 10296 10297 static int 10298 test_AES_GCM_auth_encryption_test_case_256_5(void) 10299 { 10300 return test_authenticated_encryption(&gcm_test_case_256_5); 10301 } 10302 10303 static int 10304 test_AES_GCM_auth_encryption_test_case_256_6(void) 10305 { 10306 return test_authenticated_encryption(&gcm_test_case_256_6); 10307 } 10308 10309 static int 10310 test_AES_GCM_auth_encryption_test_case_256_7(void) 10311 { 10312 return test_authenticated_encryption(&gcm_test_case_256_7); 10313 } 10314 10315 static int 10316 test_AES_GCM_auth_encryption_test_case_aad_1(void) 10317 { 10318 return test_authenticated_encryption(&gcm_test_case_aad_1); 10319 } 10320 10321 static int 10322 test_AES_GCM_auth_encryption_test_case_aad_2(void) 10323 { 10324 return test_authenticated_encryption(&gcm_test_case_aad_2); 10325 } 10326 10327 static int 10328 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 10329 { 10330 struct aead_test_data tdata; 10331 int res; 10332 10333 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10334 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10335 tdata.iv.data[0] += 1; 10336 res = test_authenticated_encryption(&tdata); 10337 if (res == TEST_SKIPPED) 10338 return res; 10339 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10340 return TEST_SUCCESS; 10341 } 10342 10343 static int 10344 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 10345 { 10346 struct aead_test_data tdata; 10347 int res; 10348 10349 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10350 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10351 tdata.plaintext.data[0] += 1; 10352 res = test_authenticated_encryption(&tdata); 10353 if (res == TEST_SKIPPED) 10354 return res; 10355 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10356 return TEST_SUCCESS; 10357 } 10358 10359 static int 10360 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 10361 { 10362 struct aead_test_data tdata; 10363 int res; 10364 10365 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10366 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10367 tdata.ciphertext.data[0] += 1; 10368 res = test_authenticated_encryption(&tdata); 10369 if (res == TEST_SKIPPED) 10370 return res; 10371 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10372 return TEST_SUCCESS; 10373 } 10374 10375 static int 10376 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 10377 { 10378 struct aead_test_data tdata; 10379 int res; 10380 10381 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10382 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10383 tdata.aad.len += 1; 10384 res = test_authenticated_encryption(&tdata); 10385 if (res == TEST_SKIPPED) 10386 return res; 10387 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10388 return TEST_SUCCESS; 10389 } 10390 10391 static int 10392 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 10393 { 10394 struct aead_test_data tdata; 10395 uint8_t aad[gcm_test_case_7.aad.len]; 10396 int res; 10397 10398 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10399 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10400 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 10401 aad[0] += 1; 10402 tdata.aad.data = aad; 10403 res = test_authenticated_encryption(&tdata); 10404 if (res == TEST_SKIPPED) 10405 return res; 10406 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10407 return TEST_SUCCESS; 10408 } 10409 10410 static int 10411 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 10412 { 10413 struct aead_test_data tdata; 10414 int res; 10415 10416 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10417 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10418 tdata.auth_tag.data[0] += 1; 10419 res = test_authenticated_encryption(&tdata); 10420 if (res == TEST_SKIPPED) 10421 return res; 10422 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 10423 return TEST_SUCCESS; 10424 } 10425 10426 static int 10427 test_authenticated_decryption(const struct aead_test_data *tdata) 10428 { 10429 struct crypto_testsuite_params *ts_params = &testsuite_params; 10430 struct crypto_unittest_params *ut_params = &unittest_params; 10431 10432 int retval; 10433 uint8_t *plaintext; 10434 uint32_t i; 10435 struct rte_cryptodev_info dev_info; 10436 10437 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10438 uint64_t feat_flags = dev_info.feature_flags; 10439 10440 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10441 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10442 printf("Device doesn't support RAW data-path APIs.\n"); 10443 return TEST_SKIPPED; 10444 } 10445 10446 /* Verify the capabilities */ 10447 struct rte_cryptodev_sym_capability_idx cap_idx; 10448 const struct rte_cryptodev_symmetric_capability *capability; 10449 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10450 cap_idx.algo.aead = tdata->algo; 10451 capability = rte_cryptodev_sym_capability_get( 10452 ts_params->valid_devs[0], &cap_idx); 10453 if (capability == NULL) 10454 return TEST_SKIPPED; 10455 if (rte_cryptodev_sym_capability_check_aead( 10456 capability, tdata->key.len, tdata->auth_tag.len, 10457 tdata->aad.len, tdata->iv.len)) 10458 return TEST_SKIPPED; 10459 10460 /* Create AEAD session */ 10461 retval = create_aead_session(ts_params->valid_devs[0], 10462 tdata->algo, 10463 RTE_CRYPTO_AEAD_OP_DECRYPT, 10464 tdata->key.data, tdata->key.len, 10465 tdata->aad.len, tdata->auth_tag.len, 10466 tdata->iv.len); 10467 if (retval < 0) 10468 return retval; 10469 10470 /* alloc mbuf and set payload */ 10471 if (tdata->aad.len > MBUF_SIZE) { 10472 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 10473 /* Populate full size of add data */ 10474 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 10475 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 10476 } else 10477 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10478 10479 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10480 rte_pktmbuf_tailroom(ut_params->ibuf)); 10481 10482 /* Create AEAD operation */ 10483 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10484 if (retval < 0) 10485 return retval; 10486 10487 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10488 10489 ut_params->op->sym->m_src = ut_params->ibuf; 10490 10491 /* Process crypto operation */ 10492 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10493 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 10494 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10495 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10496 ut_params->op, 0, 0, 0, 0); 10497 else 10498 TEST_ASSERT_NOT_NULL( 10499 process_crypto_request(ts_params->valid_devs[0], 10500 ut_params->op), "failed to process sym crypto op"); 10501 10502 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10503 "crypto op processing failed"); 10504 10505 if (ut_params->op->sym->m_dst) 10506 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 10507 uint8_t *); 10508 else 10509 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 10510 uint8_t *, 10511 ut_params->op->sym->cipher.data.offset); 10512 10513 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10514 10515 /* Validate obuf */ 10516 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10517 plaintext, 10518 tdata->plaintext.data, 10519 tdata->plaintext.len, 10520 "Plaintext data not as expected"); 10521 10522 TEST_ASSERT_EQUAL(ut_params->op->status, 10523 RTE_CRYPTO_OP_STATUS_SUCCESS, 10524 "Authentication failed"); 10525 10526 return 0; 10527 } 10528 10529 static int 10530 test_AES_GCM_authenticated_decryption_test_case_1(void) 10531 { 10532 return test_authenticated_decryption(&gcm_test_case_1); 10533 } 10534 10535 static int 10536 test_AES_GCM_authenticated_decryption_test_case_2(void) 10537 { 10538 return test_authenticated_decryption(&gcm_test_case_2); 10539 } 10540 10541 static int 10542 test_AES_GCM_authenticated_decryption_test_case_3(void) 10543 { 10544 return test_authenticated_decryption(&gcm_test_case_3); 10545 } 10546 10547 static int 10548 test_AES_GCM_authenticated_decryption_test_case_4(void) 10549 { 10550 return test_authenticated_decryption(&gcm_test_case_4); 10551 } 10552 10553 static int 10554 test_AES_GCM_authenticated_decryption_test_case_5(void) 10555 { 10556 return test_authenticated_decryption(&gcm_test_case_5); 10557 } 10558 10559 static int 10560 test_AES_GCM_authenticated_decryption_test_case_6(void) 10561 { 10562 return test_authenticated_decryption(&gcm_test_case_6); 10563 } 10564 10565 static int 10566 test_AES_GCM_authenticated_decryption_test_case_7(void) 10567 { 10568 return test_authenticated_decryption(&gcm_test_case_7); 10569 } 10570 10571 static int 10572 test_AES_GCM_authenticated_decryption_test_case_8(void) 10573 { 10574 return test_authenticated_decryption(&gcm_test_case_8); 10575 } 10576 10577 static int 10578 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 10579 { 10580 return test_authenticated_decryption(&gcm_J0_test_case_1); 10581 } 10582 10583 static int 10584 test_AES_GCM_auth_decryption_test_case_192_1(void) 10585 { 10586 return test_authenticated_decryption(&gcm_test_case_192_1); 10587 } 10588 10589 static int 10590 test_AES_GCM_auth_decryption_test_case_192_2(void) 10591 { 10592 return test_authenticated_decryption(&gcm_test_case_192_2); 10593 } 10594 10595 static int 10596 test_AES_GCM_auth_decryption_test_case_192_3(void) 10597 { 10598 return test_authenticated_decryption(&gcm_test_case_192_3); 10599 } 10600 10601 static int 10602 test_AES_GCM_auth_decryption_test_case_192_4(void) 10603 { 10604 return test_authenticated_decryption(&gcm_test_case_192_4); 10605 } 10606 10607 static int 10608 test_AES_GCM_auth_decryption_test_case_192_5(void) 10609 { 10610 return test_authenticated_decryption(&gcm_test_case_192_5); 10611 } 10612 10613 static int 10614 test_AES_GCM_auth_decryption_test_case_192_6(void) 10615 { 10616 return test_authenticated_decryption(&gcm_test_case_192_6); 10617 } 10618 10619 static int 10620 test_AES_GCM_auth_decryption_test_case_192_7(void) 10621 { 10622 return test_authenticated_decryption(&gcm_test_case_192_7); 10623 } 10624 10625 static int 10626 test_AES_GCM_auth_decryption_test_case_256_1(void) 10627 { 10628 return test_authenticated_decryption(&gcm_test_case_256_1); 10629 } 10630 10631 static int 10632 test_AES_GCM_auth_decryption_test_case_256_2(void) 10633 { 10634 return test_authenticated_decryption(&gcm_test_case_256_2); 10635 } 10636 10637 static int 10638 test_AES_GCM_auth_decryption_test_case_256_3(void) 10639 { 10640 return test_authenticated_decryption(&gcm_test_case_256_3); 10641 } 10642 10643 static int 10644 test_AES_GCM_auth_decryption_test_case_256_4(void) 10645 { 10646 return test_authenticated_decryption(&gcm_test_case_256_4); 10647 } 10648 10649 static int 10650 test_AES_GCM_auth_decryption_test_case_256_5(void) 10651 { 10652 return test_authenticated_decryption(&gcm_test_case_256_5); 10653 } 10654 10655 static int 10656 test_AES_GCM_auth_decryption_test_case_256_6(void) 10657 { 10658 return test_authenticated_decryption(&gcm_test_case_256_6); 10659 } 10660 10661 static int 10662 test_AES_GCM_auth_decryption_test_case_256_7(void) 10663 { 10664 return test_authenticated_decryption(&gcm_test_case_256_7); 10665 } 10666 10667 static int 10668 test_AES_GCM_auth_decryption_test_case_aad_1(void) 10669 { 10670 return test_authenticated_decryption(&gcm_test_case_aad_1); 10671 } 10672 10673 static int 10674 test_AES_GCM_auth_decryption_test_case_aad_2(void) 10675 { 10676 return test_authenticated_decryption(&gcm_test_case_aad_2); 10677 } 10678 10679 static int 10680 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 10681 { 10682 struct aead_test_data tdata; 10683 int res; 10684 10685 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10686 tdata.iv.data[0] += 1; 10687 res = test_authenticated_decryption(&tdata); 10688 if (res == TEST_SKIPPED) 10689 return res; 10690 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10691 return TEST_SUCCESS; 10692 } 10693 10694 static int 10695 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 10696 { 10697 struct aead_test_data tdata; 10698 int res; 10699 10700 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10701 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10702 tdata.plaintext.data[0] += 1; 10703 res = test_authenticated_decryption(&tdata); 10704 if (res == TEST_SKIPPED) 10705 return res; 10706 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10707 return TEST_SUCCESS; 10708 } 10709 10710 static int 10711 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 10712 { 10713 struct aead_test_data tdata; 10714 int res; 10715 10716 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10717 tdata.ciphertext.data[0] += 1; 10718 res = test_authenticated_decryption(&tdata); 10719 if (res == TEST_SKIPPED) 10720 return res; 10721 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10722 return TEST_SUCCESS; 10723 } 10724 10725 static int 10726 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 10727 { 10728 struct aead_test_data tdata; 10729 int res; 10730 10731 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10732 tdata.aad.len += 1; 10733 res = test_authenticated_decryption(&tdata); 10734 if (res == TEST_SKIPPED) 10735 return res; 10736 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10737 return TEST_SUCCESS; 10738 } 10739 10740 static int 10741 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 10742 { 10743 struct aead_test_data tdata; 10744 uint8_t aad[gcm_test_case_7.aad.len]; 10745 int res; 10746 10747 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10748 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 10749 aad[0] += 1; 10750 tdata.aad.data = aad; 10751 res = test_authenticated_decryption(&tdata); 10752 if (res == TEST_SKIPPED) 10753 return res; 10754 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10755 return TEST_SUCCESS; 10756 } 10757 10758 static int 10759 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 10760 { 10761 struct aead_test_data tdata; 10762 int res; 10763 10764 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10765 tdata.auth_tag.data[0] += 1; 10766 res = test_authenticated_decryption(&tdata); 10767 if (res == TEST_SKIPPED) 10768 return res; 10769 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 10770 return TEST_SUCCESS; 10771 } 10772 10773 static int 10774 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 10775 { 10776 struct crypto_testsuite_params *ts_params = &testsuite_params; 10777 struct crypto_unittest_params *ut_params = &unittest_params; 10778 10779 int retval; 10780 uint8_t *ciphertext, *auth_tag; 10781 uint16_t plaintext_pad_len; 10782 struct rte_cryptodev_info dev_info; 10783 10784 /* Verify the capabilities */ 10785 struct rte_cryptodev_sym_capability_idx cap_idx; 10786 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10787 cap_idx.algo.aead = tdata->algo; 10788 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10789 &cap_idx) == NULL) 10790 return TEST_SKIPPED; 10791 10792 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10793 uint64_t feat_flags = dev_info.feature_flags; 10794 10795 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10796 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) 10797 return TEST_SKIPPED; 10798 10799 /* not supported with CPU crypto */ 10800 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10801 return TEST_SKIPPED; 10802 10803 /* Create AEAD session */ 10804 retval = create_aead_session(ts_params->valid_devs[0], 10805 tdata->algo, 10806 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10807 tdata->key.data, tdata->key.len, 10808 tdata->aad.len, tdata->auth_tag.len, 10809 tdata->iv.len); 10810 if (retval < 0) 10811 return retval; 10812 10813 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10814 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10815 10816 /* clear mbuf payload */ 10817 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10818 rte_pktmbuf_tailroom(ut_params->ibuf)); 10819 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10820 rte_pktmbuf_tailroom(ut_params->obuf)); 10821 10822 /* Create AEAD operation */ 10823 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10824 if (retval < 0) 10825 return retval; 10826 10827 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10828 10829 ut_params->op->sym->m_src = ut_params->ibuf; 10830 ut_params->op->sym->m_dst = ut_params->obuf; 10831 10832 /* Process crypto operation */ 10833 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10834 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10835 ut_params->op, 0, 0, 0, 0); 10836 else 10837 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10838 ut_params->op), "failed to process sym crypto op"); 10839 10840 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10841 "crypto op processing failed"); 10842 10843 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10844 10845 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10846 ut_params->op->sym->cipher.data.offset); 10847 auth_tag = ciphertext + plaintext_pad_len; 10848 10849 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10850 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10851 10852 /* Validate obuf */ 10853 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10854 ciphertext, 10855 tdata->ciphertext.data, 10856 tdata->ciphertext.len, 10857 "Ciphertext data not as expected"); 10858 10859 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10860 auth_tag, 10861 tdata->auth_tag.data, 10862 tdata->auth_tag.len, 10863 "Generated auth tag not as expected"); 10864 10865 return 0; 10866 10867 } 10868 10869 static int 10870 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 10871 { 10872 return test_authenticated_encryption_oop(&gcm_test_case_5); 10873 } 10874 10875 static int 10876 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 10877 { 10878 struct crypto_testsuite_params *ts_params = &testsuite_params; 10879 struct crypto_unittest_params *ut_params = &unittest_params; 10880 10881 int retval; 10882 uint8_t *plaintext; 10883 struct rte_cryptodev_info dev_info; 10884 10885 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10886 uint64_t feat_flags = dev_info.feature_flags; 10887 10888 /* Verify the capabilities */ 10889 struct rte_cryptodev_sym_capability_idx cap_idx; 10890 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10891 cap_idx.algo.aead = tdata->algo; 10892 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10893 &cap_idx) == NULL) 10894 return TEST_SKIPPED; 10895 10896 /* not supported with CPU crypto and raw data-path APIs*/ 10897 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 10898 global_api_test_type == CRYPTODEV_RAW_API_TEST) 10899 return TEST_SKIPPED; 10900 10901 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10902 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10903 printf("Device does not support RAW data-path APIs.\n"); 10904 return TEST_SKIPPED; 10905 } 10906 10907 /* Create AEAD session */ 10908 retval = create_aead_session(ts_params->valid_devs[0], 10909 tdata->algo, 10910 RTE_CRYPTO_AEAD_OP_DECRYPT, 10911 tdata->key.data, tdata->key.len, 10912 tdata->aad.len, tdata->auth_tag.len, 10913 tdata->iv.len); 10914 if (retval < 0) 10915 return retval; 10916 10917 /* alloc mbuf and set payload */ 10918 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10919 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10920 10921 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10922 rte_pktmbuf_tailroom(ut_params->ibuf)); 10923 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10924 rte_pktmbuf_tailroom(ut_params->obuf)); 10925 10926 /* Create AEAD operation */ 10927 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10928 if (retval < 0) 10929 return retval; 10930 10931 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10932 10933 ut_params->op->sym->m_src = ut_params->ibuf; 10934 ut_params->op->sym->m_dst = ut_params->obuf; 10935 10936 /* Process crypto operation */ 10937 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10938 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10939 ut_params->op, 0, 0, 0, 0); 10940 else 10941 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10942 ut_params->op), "failed to process sym crypto op"); 10943 10944 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10945 "crypto op processing failed"); 10946 10947 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10948 ut_params->op->sym->cipher.data.offset); 10949 10950 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10951 10952 /* Validate obuf */ 10953 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10954 plaintext, 10955 tdata->plaintext.data, 10956 tdata->plaintext.len, 10957 "Plaintext data not as expected"); 10958 10959 TEST_ASSERT_EQUAL(ut_params->op->status, 10960 RTE_CRYPTO_OP_STATUS_SUCCESS, 10961 "Authentication failed"); 10962 return 0; 10963 } 10964 10965 static int 10966 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 10967 { 10968 return test_authenticated_decryption_oop(&gcm_test_case_5); 10969 } 10970 10971 static int 10972 test_authenticated_encryption_sessionless( 10973 const struct aead_test_data *tdata) 10974 { 10975 struct crypto_testsuite_params *ts_params = &testsuite_params; 10976 struct crypto_unittest_params *ut_params = &unittest_params; 10977 10978 int retval; 10979 uint8_t *ciphertext, *auth_tag; 10980 uint16_t plaintext_pad_len; 10981 uint8_t key[tdata->key.len + 1]; 10982 struct rte_cryptodev_info dev_info; 10983 10984 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10985 uint64_t feat_flags = dev_info.feature_flags; 10986 10987 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10988 printf("Device doesn't support Sessionless ops.\n"); 10989 return TEST_SKIPPED; 10990 } 10991 10992 /* not supported with CPU crypto */ 10993 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10994 return TEST_SKIPPED; 10995 10996 /* Verify the capabilities */ 10997 struct rte_cryptodev_sym_capability_idx cap_idx; 10998 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10999 cap_idx.algo.aead = tdata->algo; 11000 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11001 &cap_idx) == NULL) 11002 return TEST_SKIPPED; 11003 11004 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11005 11006 /* clear mbuf payload */ 11007 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11008 rte_pktmbuf_tailroom(ut_params->ibuf)); 11009 11010 /* Create AEAD operation */ 11011 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 11012 if (retval < 0) 11013 return retval; 11014 11015 /* Create GCM xform */ 11016 memcpy(key, tdata->key.data, tdata->key.len); 11017 retval = create_aead_xform(ut_params->op, 11018 tdata->algo, 11019 RTE_CRYPTO_AEAD_OP_ENCRYPT, 11020 key, tdata->key.len, 11021 tdata->aad.len, tdata->auth_tag.len, 11022 tdata->iv.len); 11023 if (retval < 0) 11024 return retval; 11025 11026 ut_params->op->sym->m_src = ut_params->ibuf; 11027 11028 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 11029 RTE_CRYPTO_OP_SESSIONLESS, 11030 "crypto op session type not sessionless"); 11031 11032 /* Process crypto operation */ 11033 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 11034 ut_params->op), "failed to process sym crypto op"); 11035 11036 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 11037 11038 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11039 "crypto op status not success"); 11040 11041 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11042 11043 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 11044 ut_params->op->sym->cipher.data.offset); 11045 auth_tag = ciphertext + plaintext_pad_len; 11046 11047 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 11048 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 11049 11050 /* Validate obuf */ 11051 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11052 ciphertext, 11053 tdata->ciphertext.data, 11054 tdata->ciphertext.len, 11055 "Ciphertext data not as expected"); 11056 11057 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11058 auth_tag, 11059 tdata->auth_tag.data, 11060 tdata->auth_tag.len, 11061 "Generated auth tag not as expected"); 11062 11063 return 0; 11064 11065 } 11066 11067 static int 11068 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 11069 { 11070 return test_authenticated_encryption_sessionless( 11071 &gcm_test_case_5); 11072 } 11073 11074 static int 11075 test_authenticated_decryption_sessionless( 11076 const struct aead_test_data *tdata) 11077 { 11078 struct crypto_testsuite_params *ts_params = &testsuite_params; 11079 struct crypto_unittest_params *ut_params = &unittest_params; 11080 11081 int retval; 11082 uint8_t *plaintext; 11083 uint8_t key[tdata->key.len + 1]; 11084 struct rte_cryptodev_info dev_info; 11085 11086 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11087 uint64_t feat_flags = dev_info.feature_flags; 11088 11089 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 11090 printf("Device doesn't support Sessionless ops.\n"); 11091 return TEST_SKIPPED; 11092 } 11093 11094 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11095 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11096 printf("Device doesn't support RAW data-path APIs.\n"); 11097 return TEST_SKIPPED; 11098 } 11099 11100 /* not supported with CPU crypto */ 11101 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11102 return TEST_SKIPPED; 11103 11104 /* Verify the capabilities */ 11105 struct rte_cryptodev_sym_capability_idx cap_idx; 11106 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11107 cap_idx.algo.aead = tdata->algo; 11108 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11109 &cap_idx) == NULL) 11110 return TEST_SKIPPED; 11111 11112 /* alloc mbuf and set payload */ 11113 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11114 11115 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11116 rte_pktmbuf_tailroom(ut_params->ibuf)); 11117 11118 /* Create AEAD operation */ 11119 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 11120 if (retval < 0) 11121 return retval; 11122 11123 /* Create AEAD xform */ 11124 memcpy(key, tdata->key.data, tdata->key.len); 11125 retval = create_aead_xform(ut_params->op, 11126 tdata->algo, 11127 RTE_CRYPTO_AEAD_OP_DECRYPT, 11128 key, tdata->key.len, 11129 tdata->aad.len, tdata->auth_tag.len, 11130 tdata->iv.len); 11131 if (retval < 0) 11132 return retval; 11133 11134 ut_params->op->sym->m_src = ut_params->ibuf; 11135 11136 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 11137 RTE_CRYPTO_OP_SESSIONLESS, 11138 "crypto op session type not sessionless"); 11139 11140 /* Process crypto operation */ 11141 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11142 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11143 ut_params->op, 0, 0, 0, 0); 11144 else 11145 TEST_ASSERT_NOT_NULL(process_crypto_request( 11146 ts_params->valid_devs[0], ut_params->op), 11147 "failed to process sym crypto op"); 11148 11149 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 11150 11151 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11152 "crypto op status not success"); 11153 11154 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 11155 ut_params->op->sym->cipher.data.offset); 11156 11157 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 11158 11159 /* Validate obuf */ 11160 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11161 plaintext, 11162 tdata->plaintext.data, 11163 tdata->plaintext.len, 11164 "Plaintext data not as expected"); 11165 11166 TEST_ASSERT_EQUAL(ut_params->op->status, 11167 RTE_CRYPTO_OP_STATUS_SUCCESS, 11168 "Authentication failed"); 11169 return 0; 11170 } 11171 11172 static int 11173 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 11174 { 11175 return test_authenticated_decryption_sessionless( 11176 &gcm_test_case_5); 11177 } 11178 11179 static int 11180 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 11181 { 11182 return test_authenticated_encryption(&ccm_test_case_128_1); 11183 } 11184 11185 static int 11186 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 11187 { 11188 return test_authenticated_encryption(&ccm_test_case_128_2); 11189 } 11190 11191 static int 11192 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 11193 { 11194 return test_authenticated_encryption(&ccm_test_case_128_3); 11195 } 11196 11197 static int 11198 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 11199 { 11200 return test_authenticated_decryption(&ccm_test_case_128_1); 11201 } 11202 11203 static int 11204 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 11205 { 11206 return test_authenticated_decryption(&ccm_test_case_128_2); 11207 } 11208 11209 static int 11210 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 11211 { 11212 return test_authenticated_decryption(&ccm_test_case_128_3); 11213 } 11214 11215 static int 11216 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 11217 { 11218 return test_authenticated_encryption(&ccm_test_case_192_1); 11219 } 11220 11221 static int 11222 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 11223 { 11224 return test_authenticated_encryption(&ccm_test_case_192_2); 11225 } 11226 11227 static int 11228 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 11229 { 11230 return test_authenticated_encryption(&ccm_test_case_192_3); 11231 } 11232 11233 static int 11234 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 11235 { 11236 return test_authenticated_decryption(&ccm_test_case_192_1); 11237 } 11238 11239 static int 11240 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 11241 { 11242 return test_authenticated_decryption(&ccm_test_case_192_2); 11243 } 11244 11245 static int 11246 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 11247 { 11248 return test_authenticated_decryption(&ccm_test_case_192_3); 11249 } 11250 11251 static int 11252 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 11253 { 11254 return test_authenticated_encryption(&ccm_test_case_256_1); 11255 } 11256 11257 static int 11258 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 11259 { 11260 return test_authenticated_encryption(&ccm_test_case_256_2); 11261 } 11262 11263 static int 11264 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 11265 { 11266 return test_authenticated_encryption(&ccm_test_case_256_3); 11267 } 11268 11269 static int 11270 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 11271 { 11272 return test_authenticated_decryption(&ccm_test_case_256_1); 11273 } 11274 11275 static int 11276 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 11277 { 11278 return test_authenticated_decryption(&ccm_test_case_256_2); 11279 } 11280 11281 static int 11282 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 11283 { 11284 return test_authenticated_decryption(&ccm_test_case_256_3); 11285 } 11286 11287 static int 11288 test_stats(void) 11289 { 11290 struct crypto_testsuite_params *ts_params = &testsuite_params; 11291 struct rte_cryptodev_stats stats; 11292 11293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11294 return TEST_SKIPPED; 11295 11296 /* Verify the capabilities */ 11297 struct rte_cryptodev_sym_capability_idx cap_idx; 11298 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11299 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 11300 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11301 &cap_idx) == NULL) 11302 return TEST_SKIPPED; 11303 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11304 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 11305 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11306 &cap_idx) == NULL) 11307 return TEST_SKIPPED; 11308 11309 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 11310 == -ENOTSUP) 11311 return TEST_SKIPPED; 11312 11313 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 11314 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 11315 &stats) == -ENODEV), 11316 "rte_cryptodev_stats_get invalid dev failed"); 11317 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 11318 "rte_cryptodev_stats_get invalid Param failed"); 11319 11320 /* Test expected values */ 11321 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 11322 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 11323 &stats), 11324 "rte_cryptodev_stats_get failed"); 11325 TEST_ASSERT((stats.enqueued_count == 1), 11326 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11327 TEST_ASSERT((stats.dequeued_count == 1), 11328 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11329 TEST_ASSERT((stats.enqueue_err_count == 0), 11330 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11331 TEST_ASSERT((stats.dequeue_err_count == 0), 11332 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11333 11334 /* invalid device but should ignore and not reset device stats*/ 11335 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 11336 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 11337 &stats), 11338 "rte_cryptodev_stats_get failed"); 11339 TEST_ASSERT((stats.enqueued_count == 1), 11340 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11341 11342 /* check that a valid reset clears stats */ 11343 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 11344 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 11345 &stats), 11346 "rte_cryptodev_stats_get failed"); 11347 TEST_ASSERT((stats.enqueued_count == 0), 11348 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11349 TEST_ASSERT((stats.dequeued_count == 0), 11350 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 11351 11352 return TEST_SUCCESS; 11353 } 11354 11355 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 11356 struct crypto_unittest_params *ut_params, 11357 enum rte_crypto_auth_operation op, 11358 const struct HMAC_MD5_vector *test_case) 11359 { 11360 uint8_t key[64]; 11361 int status; 11362 11363 memcpy(key, test_case->key.data, test_case->key.len); 11364 11365 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11366 ut_params->auth_xform.next = NULL; 11367 ut_params->auth_xform.auth.op = op; 11368 11369 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 11370 11371 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 11372 ut_params->auth_xform.auth.key.length = test_case->key.len; 11373 ut_params->auth_xform.auth.key.data = key; 11374 11375 ut_params->sess = rte_cryptodev_sym_session_create( 11376 ts_params->session_mpool); 11377 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11378 if (ut_params->sess == NULL) 11379 return TEST_FAILED; 11380 11381 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11382 ut_params->sess, &ut_params->auth_xform, 11383 ts_params->session_priv_mpool); 11384 if (status == -ENOTSUP) 11385 return TEST_SKIPPED; 11386 11387 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11388 11389 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11390 rte_pktmbuf_tailroom(ut_params->ibuf)); 11391 11392 return 0; 11393 } 11394 11395 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 11396 const struct HMAC_MD5_vector *test_case, 11397 uint8_t **plaintext) 11398 { 11399 uint16_t plaintext_pad_len; 11400 11401 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 11402 11403 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 11404 16); 11405 11406 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11407 plaintext_pad_len); 11408 memcpy(*plaintext, test_case->plaintext.data, 11409 test_case->plaintext.len); 11410 11411 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11412 ut_params->ibuf, MD5_DIGEST_LEN); 11413 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11414 "no room to append digest"); 11415 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11416 ut_params->ibuf, plaintext_pad_len); 11417 11418 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11419 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 11420 test_case->auth_tag.len); 11421 } 11422 11423 sym_op->auth.data.offset = 0; 11424 sym_op->auth.data.length = test_case->plaintext.len; 11425 11426 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11427 ut_params->op->sym->m_src = ut_params->ibuf; 11428 11429 return 0; 11430 } 11431 11432 static int 11433 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 11434 { 11435 uint16_t plaintext_pad_len; 11436 uint8_t *plaintext, *auth_tag; 11437 11438 struct crypto_testsuite_params *ts_params = &testsuite_params; 11439 struct crypto_unittest_params *ut_params = &unittest_params; 11440 struct rte_cryptodev_info dev_info; 11441 11442 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11443 uint64_t feat_flags = dev_info.feature_flags; 11444 11445 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11446 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11447 printf("Device doesn't support RAW data-path APIs.\n"); 11448 return TEST_SKIPPED; 11449 } 11450 11451 /* Verify the capabilities */ 11452 struct rte_cryptodev_sym_capability_idx cap_idx; 11453 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11454 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 11455 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11456 &cap_idx) == NULL) 11457 return TEST_SKIPPED; 11458 11459 if (MD5_HMAC_create_session(ts_params, ut_params, 11460 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 11461 return TEST_FAILED; 11462 11463 /* Generate Crypto op data structure */ 11464 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11465 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11466 TEST_ASSERT_NOT_NULL(ut_params->op, 11467 "Failed to allocate symmetric crypto operation struct"); 11468 11469 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 11470 16); 11471 11472 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 11473 return TEST_FAILED; 11474 11475 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11476 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11477 ut_params->op); 11478 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11479 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11480 ut_params->op, 0, 1, 0, 0); 11481 else 11482 TEST_ASSERT_NOT_NULL( 11483 process_crypto_request(ts_params->valid_devs[0], 11484 ut_params->op), 11485 "failed to process sym crypto op"); 11486 11487 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11488 "crypto op processing failed"); 11489 11490 if (ut_params->op->sym->m_dst) { 11491 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11492 uint8_t *, plaintext_pad_len); 11493 } else { 11494 auth_tag = plaintext + plaintext_pad_len; 11495 } 11496 11497 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11498 auth_tag, 11499 test_case->auth_tag.data, 11500 test_case->auth_tag.len, 11501 "HMAC_MD5 generated tag not as expected"); 11502 11503 return TEST_SUCCESS; 11504 } 11505 11506 static int 11507 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 11508 { 11509 uint8_t *plaintext; 11510 11511 struct crypto_testsuite_params *ts_params = &testsuite_params; 11512 struct crypto_unittest_params *ut_params = &unittest_params; 11513 struct rte_cryptodev_info dev_info; 11514 11515 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11516 uint64_t feat_flags = dev_info.feature_flags; 11517 11518 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11519 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11520 printf("Device doesn't support RAW data-path APIs.\n"); 11521 return TEST_SKIPPED; 11522 } 11523 11524 /* Verify the capabilities */ 11525 struct rte_cryptodev_sym_capability_idx cap_idx; 11526 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11527 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 11528 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11529 &cap_idx) == NULL) 11530 return TEST_SKIPPED; 11531 11532 if (MD5_HMAC_create_session(ts_params, ut_params, 11533 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 11534 return TEST_FAILED; 11535 } 11536 11537 /* Generate Crypto op data structure */ 11538 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11539 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11540 TEST_ASSERT_NOT_NULL(ut_params->op, 11541 "Failed to allocate symmetric crypto operation struct"); 11542 11543 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 11544 return TEST_FAILED; 11545 11546 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11547 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11548 ut_params->op); 11549 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11550 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11551 ut_params->op, 0, 1, 0, 0); 11552 else 11553 TEST_ASSERT_NOT_NULL( 11554 process_crypto_request(ts_params->valid_devs[0], 11555 ut_params->op), 11556 "failed to process sym crypto op"); 11557 11558 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11559 "HMAC_MD5 crypto op processing failed"); 11560 11561 return TEST_SUCCESS; 11562 } 11563 11564 static int 11565 test_MD5_HMAC_generate_case_1(void) 11566 { 11567 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 11568 } 11569 11570 static int 11571 test_MD5_HMAC_verify_case_1(void) 11572 { 11573 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 11574 } 11575 11576 static int 11577 test_MD5_HMAC_generate_case_2(void) 11578 { 11579 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 11580 } 11581 11582 static int 11583 test_MD5_HMAC_verify_case_2(void) 11584 { 11585 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 11586 } 11587 11588 static int 11589 test_multi_session(void) 11590 { 11591 struct crypto_testsuite_params *ts_params = &testsuite_params; 11592 struct crypto_unittest_params *ut_params = &unittest_params; 11593 11594 struct rte_cryptodev_info dev_info; 11595 struct rte_cryptodev_sym_session **sessions; 11596 11597 uint16_t i; 11598 int status; 11599 11600 /* Verify the capabilities */ 11601 struct rte_cryptodev_sym_capability_idx cap_idx; 11602 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11603 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 11604 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11605 &cap_idx) == NULL) 11606 return TEST_SKIPPED; 11607 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11608 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 11609 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11610 &cap_idx) == NULL) 11611 return TEST_SKIPPED; 11612 11613 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 11614 aes_cbc_key, hmac_sha512_key); 11615 11616 11617 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11618 11619 sessions = rte_malloc(NULL, 11620 sizeof(struct rte_cryptodev_sym_session *) * 11621 (MAX_NB_SESSIONS + 1), 0); 11622 11623 /* Create multiple crypto sessions*/ 11624 for (i = 0; i < MAX_NB_SESSIONS; i++) { 11625 11626 sessions[i] = rte_cryptodev_sym_session_create( 11627 ts_params->session_mpool); 11628 TEST_ASSERT_NOT_NULL(sessions[i], 11629 "Session creation failed at session number %u", 11630 i); 11631 11632 status = rte_cryptodev_sym_session_init( 11633 ts_params->valid_devs[0], 11634 sessions[i], &ut_params->auth_xform, 11635 ts_params->session_priv_mpool); 11636 if (status == -ENOTSUP) 11637 return TEST_SKIPPED; 11638 11639 /* Attempt to send a request on each session */ 11640 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 11641 sessions[i], 11642 ut_params, 11643 ts_params, 11644 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 11645 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 11646 aes_cbc_iv), 11647 "Failed to perform decrypt on request number %u.", i); 11648 /* free crypto operation structure */ 11649 if (ut_params->op) 11650 rte_crypto_op_free(ut_params->op); 11651 11652 /* 11653 * free mbuf - both obuf and ibuf are usually the same, 11654 * so check if they point at the same address is necessary, 11655 * to avoid freeing the mbuf twice. 11656 */ 11657 if (ut_params->obuf) { 11658 rte_pktmbuf_free(ut_params->obuf); 11659 if (ut_params->ibuf == ut_params->obuf) 11660 ut_params->ibuf = 0; 11661 ut_params->obuf = 0; 11662 } 11663 if (ut_params->ibuf) { 11664 rte_pktmbuf_free(ut_params->ibuf); 11665 ut_params->ibuf = 0; 11666 } 11667 } 11668 11669 sessions[i] = NULL; 11670 /* Next session create should fail */ 11671 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11672 sessions[i], &ut_params->auth_xform, 11673 ts_params->session_priv_mpool); 11674 TEST_ASSERT_NULL(sessions[i], 11675 "Session creation succeeded unexpectedly!"); 11676 11677 for (i = 0; i < MAX_NB_SESSIONS; i++) { 11678 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 11679 sessions[i]); 11680 rte_cryptodev_sym_session_free(sessions[i]); 11681 } 11682 11683 rte_free(sessions); 11684 11685 return TEST_SUCCESS; 11686 } 11687 11688 struct multi_session_params { 11689 struct crypto_unittest_params ut_params; 11690 uint8_t *cipher_key; 11691 uint8_t *hmac_key; 11692 const uint8_t *cipher; 11693 const uint8_t *digest; 11694 uint8_t *iv; 11695 }; 11696 11697 #define MB_SESSION_NUMBER 3 11698 11699 static int 11700 test_multi_session_random_usage(void) 11701 { 11702 struct crypto_testsuite_params *ts_params = &testsuite_params; 11703 struct rte_cryptodev_info dev_info; 11704 struct rte_cryptodev_sym_session **sessions; 11705 uint32_t i, j; 11706 struct multi_session_params ut_paramz[] = { 11707 11708 { 11709 .cipher_key = ms_aes_cbc_key0, 11710 .hmac_key = ms_hmac_key0, 11711 .cipher = ms_aes_cbc_cipher0, 11712 .digest = ms_hmac_digest0, 11713 .iv = ms_aes_cbc_iv0 11714 }, 11715 { 11716 .cipher_key = ms_aes_cbc_key1, 11717 .hmac_key = ms_hmac_key1, 11718 .cipher = ms_aes_cbc_cipher1, 11719 .digest = ms_hmac_digest1, 11720 .iv = ms_aes_cbc_iv1 11721 }, 11722 { 11723 .cipher_key = ms_aes_cbc_key2, 11724 .hmac_key = ms_hmac_key2, 11725 .cipher = ms_aes_cbc_cipher2, 11726 .digest = ms_hmac_digest2, 11727 .iv = ms_aes_cbc_iv2 11728 }, 11729 11730 }; 11731 int status; 11732 11733 /* Verify the capabilities */ 11734 struct rte_cryptodev_sym_capability_idx cap_idx; 11735 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11736 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 11737 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11738 &cap_idx) == NULL) 11739 return TEST_SKIPPED; 11740 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11741 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 11742 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11743 &cap_idx) == NULL) 11744 return TEST_SKIPPED; 11745 11746 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11747 11748 sessions = rte_malloc(NULL, 11749 (sizeof(struct rte_cryptodev_sym_session *) 11750 * MAX_NB_SESSIONS) + 1, 0); 11751 11752 for (i = 0; i < MB_SESSION_NUMBER; i++) { 11753 sessions[i] = rte_cryptodev_sym_session_create( 11754 ts_params->session_mpool); 11755 TEST_ASSERT_NOT_NULL(sessions[i], 11756 "Session creation failed at session number %u", 11757 i); 11758 11759 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 11760 sizeof(struct crypto_unittest_params)); 11761 11762 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 11763 &ut_paramz[i].ut_params, 11764 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 11765 11766 /* Create multiple crypto sessions*/ 11767 status = rte_cryptodev_sym_session_init( 11768 ts_params->valid_devs[0], 11769 sessions[i], 11770 &ut_paramz[i].ut_params.auth_xform, 11771 ts_params->session_priv_mpool); 11772 11773 if (status == -ENOTSUP) 11774 return TEST_SKIPPED; 11775 11776 TEST_ASSERT_EQUAL(status, 0, "Session init failed"); 11777 } 11778 11779 srand(time(NULL)); 11780 for (i = 0; i < 40000; i++) { 11781 11782 j = rand() % MB_SESSION_NUMBER; 11783 11784 TEST_ASSERT_SUCCESS( 11785 test_AES_CBC_HMAC_SHA512_decrypt_perform( 11786 sessions[j], 11787 &ut_paramz[j].ut_params, 11788 ts_params, ut_paramz[j].cipher, 11789 ut_paramz[j].digest, 11790 ut_paramz[j].iv), 11791 "Failed to perform decrypt on request number %u.", i); 11792 11793 if (ut_paramz[j].ut_params.op) 11794 rte_crypto_op_free(ut_paramz[j].ut_params.op); 11795 11796 /* 11797 * free mbuf - both obuf and ibuf are usually the same, 11798 * so check if they point at the same address is necessary, 11799 * to avoid freeing the mbuf twice. 11800 */ 11801 if (ut_paramz[j].ut_params.obuf) { 11802 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 11803 if (ut_paramz[j].ut_params.ibuf 11804 == ut_paramz[j].ut_params.obuf) 11805 ut_paramz[j].ut_params.ibuf = 0; 11806 ut_paramz[j].ut_params.obuf = 0; 11807 } 11808 if (ut_paramz[j].ut_params.ibuf) { 11809 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 11810 ut_paramz[j].ut_params.ibuf = 0; 11811 } 11812 } 11813 11814 for (i = 0; i < MB_SESSION_NUMBER; i++) { 11815 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 11816 sessions[i]); 11817 rte_cryptodev_sym_session_free(sessions[i]); 11818 } 11819 11820 rte_free(sessions); 11821 11822 return TEST_SUCCESS; 11823 } 11824 11825 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 11826 0xab, 0xab, 0xab, 0xab, 11827 0xab, 0xab, 0xab, 0xab, 11828 0xab, 0xab, 0xab, 0xab}; 11829 11830 static int 11831 test_null_invalid_operation(void) 11832 { 11833 struct crypto_testsuite_params *ts_params = &testsuite_params; 11834 struct crypto_unittest_params *ut_params = &unittest_params; 11835 int ret; 11836 11837 /* This test is for NULL PMD only */ 11838 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11839 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11840 return TEST_SKIPPED; 11841 11842 /* Setup Cipher Parameters */ 11843 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11844 ut_params->cipher_xform.next = NULL; 11845 11846 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 11847 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11848 11849 ut_params->sess = rte_cryptodev_sym_session_create( 11850 ts_params->session_mpool); 11851 11852 /* Create Crypto session*/ 11853 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11854 ut_params->sess, &ut_params->cipher_xform, 11855 ts_params->session_priv_mpool); 11856 TEST_ASSERT(ret < 0, 11857 "Session creation succeeded unexpectedly"); 11858 11859 11860 /* Setup HMAC Parameters */ 11861 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11862 ut_params->auth_xform.next = NULL; 11863 11864 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 11865 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11866 11867 ut_params->sess = rte_cryptodev_sym_session_create( 11868 ts_params->session_mpool); 11869 11870 /* Create Crypto session*/ 11871 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11872 ut_params->sess, &ut_params->auth_xform, 11873 ts_params->session_priv_mpool); 11874 TEST_ASSERT(ret < 0, 11875 "Session creation succeeded unexpectedly"); 11876 11877 return TEST_SUCCESS; 11878 } 11879 11880 11881 #define NULL_BURST_LENGTH (32) 11882 11883 static int 11884 test_null_burst_operation(void) 11885 { 11886 struct crypto_testsuite_params *ts_params = &testsuite_params; 11887 struct crypto_unittest_params *ut_params = &unittest_params; 11888 int status; 11889 11890 unsigned i, burst_len = NULL_BURST_LENGTH; 11891 11892 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 11893 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 11894 11895 /* This test is for NULL PMD only */ 11896 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11897 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11898 return TEST_SKIPPED; 11899 11900 /* Setup Cipher Parameters */ 11901 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11902 ut_params->cipher_xform.next = &ut_params->auth_xform; 11903 11904 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 11905 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11906 11907 /* Setup HMAC Parameters */ 11908 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11909 ut_params->auth_xform.next = NULL; 11910 11911 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 11912 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11913 11914 ut_params->sess = rte_cryptodev_sym_session_create( 11915 ts_params->session_mpool); 11916 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11917 11918 /* Create Crypto session*/ 11919 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11920 ut_params->sess, &ut_params->cipher_xform, 11921 ts_params->session_priv_mpool); 11922 11923 if (status == -ENOTSUP) 11924 return TEST_SKIPPED; 11925 11926 TEST_ASSERT_EQUAL(status, 0, "Session init failed"); 11927 11928 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 11929 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 11930 burst_len, "failed to generate burst of crypto ops"); 11931 11932 /* Generate an operation for each mbuf in burst */ 11933 for (i = 0; i < burst_len; i++) { 11934 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11935 11936 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 11937 11938 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 11939 sizeof(unsigned)); 11940 *data = i; 11941 11942 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 11943 11944 burst[i]->sym->m_src = m; 11945 } 11946 11947 /* Process crypto operation */ 11948 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 11949 0, burst, burst_len), 11950 burst_len, 11951 "Error enqueuing burst"); 11952 11953 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 11954 0, burst_dequeued, burst_len), 11955 burst_len, 11956 "Error dequeuing burst"); 11957 11958 11959 for (i = 0; i < burst_len; i++) { 11960 TEST_ASSERT_EQUAL( 11961 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 11962 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 11963 uint32_t *), 11964 "data not as expected"); 11965 11966 rte_pktmbuf_free(burst[i]->sym->m_src); 11967 rte_crypto_op_free(burst[i]); 11968 } 11969 11970 return TEST_SUCCESS; 11971 } 11972 11973 static uint16_t 11974 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11975 uint16_t nb_ops, void *user_param) 11976 { 11977 RTE_SET_USED(dev_id); 11978 RTE_SET_USED(qp_id); 11979 RTE_SET_USED(ops); 11980 RTE_SET_USED(user_param); 11981 11982 printf("crypto enqueue callback called\n"); 11983 return nb_ops; 11984 } 11985 11986 static uint16_t 11987 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11988 uint16_t nb_ops, void *user_param) 11989 { 11990 RTE_SET_USED(dev_id); 11991 RTE_SET_USED(qp_id); 11992 RTE_SET_USED(ops); 11993 RTE_SET_USED(user_param); 11994 11995 printf("crypto dequeue callback called\n"); 11996 return nb_ops; 11997 } 11998 11999 /* 12000 * Thread using enqueue/dequeue callback with RCU. 12001 */ 12002 static int 12003 test_enqdeq_callback_thread(void *arg) 12004 { 12005 RTE_SET_USED(arg); 12006 /* DP thread calls rte_cryptodev_enqueue_burst()/ 12007 * rte_cryptodev_dequeue_burst() and invokes callback. 12008 */ 12009 test_null_burst_operation(); 12010 return 0; 12011 } 12012 12013 static int 12014 test_enq_callback_setup(void) 12015 { 12016 struct crypto_testsuite_params *ts_params = &testsuite_params; 12017 struct rte_cryptodev_info dev_info; 12018 struct rte_cryptodev_qp_conf qp_conf = { 12019 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 12020 }; 12021 12022 struct rte_cryptodev_cb *cb; 12023 uint16_t qp_id = 0; 12024 12025 /* Stop the device in case it's started so it can be configured */ 12026 rte_cryptodev_stop(ts_params->valid_devs[0]); 12027 12028 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12029 12030 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 12031 &ts_params->conf), 12032 "Failed to configure cryptodev %u", 12033 ts_params->valid_devs[0]); 12034 12035 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 12036 qp_conf.mp_session = ts_params->session_mpool; 12037 qp_conf.mp_session_private = ts_params->session_priv_mpool; 12038 12039 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 12040 ts_params->valid_devs[0], qp_id, &qp_conf, 12041 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 12042 "Failed test for " 12043 "rte_cryptodev_queue_pair_setup: num_inflights " 12044 "%u on qp %u on cryptodev %u", 12045 qp_conf.nb_descriptors, qp_id, 12046 ts_params->valid_devs[0]); 12047 12048 /* Test with invalid crypto device */ 12049 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS, 12050 qp_id, test_enq_callback, NULL); 12051 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12052 "cryptodev %u did not fail", 12053 qp_id, RTE_CRYPTO_MAX_DEVS); 12054 12055 /* Test with invalid queue pair */ 12056 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12057 dev_info.max_nb_queue_pairs + 1, 12058 test_enq_callback, NULL); 12059 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12060 "cryptodev %u did not fail", 12061 dev_info.max_nb_queue_pairs + 1, 12062 ts_params->valid_devs[0]); 12063 12064 /* Test with NULL callback */ 12065 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12066 qp_id, NULL, NULL); 12067 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12068 "cryptodev %u did not fail", 12069 qp_id, ts_params->valid_devs[0]); 12070 12071 /* Test with valid configuration */ 12072 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 12073 qp_id, test_enq_callback, NULL); 12074 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 12075 "qp %u on cryptodev %u", 12076 qp_id, ts_params->valid_devs[0]); 12077 12078 rte_cryptodev_start(ts_params->valid_devs[0]); 12079 12080 /* Launch a thread */ 12081 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 12082 rte_get_next_lcore(-1, 1, 0)); 12083 12084 /* Wait until reader exited. */ 12085 rte_eal_mp_wait_lcore(); 12086 12087 /* Test with invalid crypto device */ 12088 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12089 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 12090 "Expected call to fail as crypto device is invalid"); 12091 12092 /* Test with invalid queue pair */ 12093 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12094 ts_params->valid_devs[0], 12095 dev_info.max_nb_queue_pairs + 1, cb), 12096 "Expected call to fail as queue pair is invalid"); 12097 12098 /* Test with NULL callback */ 12099 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 12100 ts_params->valid_devs[0], qp_id, NULL), 12101 "Expected call to fail as callback is NULL"); 12102 12103 /* Test with valid configuration */ 12104 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback( 12105 ts_params->valid_devs[0], qp_id, cb), 12106 "Failed test to remove callback on " 12107 "qp %u on cryptodev %u", 12108 qp_id, ts_params->valid_devs[0]); 12109 12110 return TEST_SUCCESS; 12111 } 12112 12113 static int 12114 test_deq_callback_setup(void) 12115 { 12116 struct crypto_testsuite_params *ts_params = &testsuite_params; 12117 struct rte_cryptodev_info dev_info; 12118 struct rte_cryptodev_qp_conf qp_conf = { 12119 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 12120 }; 12121 12122 struct rte_cryptodev_cb *cb; 12123 uint16_t qp_id = 0; 12124 12125 /* Stop the device in case it's started so it can be configured */ 12126 rte_cryptodev_stop(ts_params->valid_devs[0]); 12127 12128 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12129 12130 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 12131 &ts_params->conf), 12132 "Failed to configure cryptodev %u", 12133 ts_params->valid_devs[0]); 12134 12135 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 12136 qp_conf.mp_session = ts_params->session_mpool; 12137 qp_conf.mp_session_private = ts_params->session_priv_mpool; 12138 12139 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 12140 ts_params->valid_devs[0], qp_id, &qp_conf, 12141 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 12142 "Failed test for " 12143 "rte_cryptodev_queue_pair_setup: num_inflights " 12144 "%u on qp %u on cryptodev %u", 12145 qp_conf.nb_descriptors, qp_id, 12146 ts_params->valid_devs[0]); 12147 12148 /* Test with invalid crypto device */ 12149 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS, 12150 qp_id, test_deq_callback, NULL); 12151 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12152 "cryptodev %u did not fail", 12153 qp_id, RTE_CRYPTO_MAX_DEVS); 12154 12155 /* Test with invalid queue pair */ 12156 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 12157 dev_info.max_nb_queue_pairs + 1, 12158 test_deq_callback, NULL); 12159 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12160 "cryptodev %u did not fail", 12161 dev_info.max_nb_queue_pairs + 1, 12162 ts_params->valid_devs[0]); 12163 12164 /* Test with NULL callback */ 12165 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 12166 qp_id, NULL, NULL); 12167 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 12168 "cryptodev %u did not fail", 12169 qp_id, ts_params->valid_devs[0]); 12170 12171 /* Test with valid configuration */ 12172 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 12173 qp_id, test_deq_callback, NULL); 12174 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 12175 "qp %u on cryptodev %u", 12176 qp_id, ts_params->valid_devs[0]); 12177 12178 rte_cryptodev_start(ts_params->valid_devs[0]); 12179 12180 /* Launch a thread */ 12181 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 12182 rte_get_next_lcore(-1, 1, 0)); 12183 12184 /* Wait until reader exited. */ 12185 rte_eal_mp_wait_lcore(); 12186 12187 /* Test with invalid crypto device */ 12188 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 12189 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 12190 "Expected call to fail as crypto device is invalid"); 12191 12192 /* Test with invalid queue pair */ 12193 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 12194 ts_params->valid_devs[0], 12195 dev_info.max_nb_queue_pairs + 1, cb), 12196 "Expected call to fail as queue pair is invalid"); 12197 12198 /* Test with NULL callback */ 12199 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 12200 ts_params->valid_devs[0], qp_id, NULL), 12201 "Expected call to fail as callback is NULL"); 12202 12203 /* Test with valid configuration */ 12204 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback( 12205 ts_params->valid_devs[0], qp_id, cb), 12206 "Failed test to remove callback on " 12207 "qp %u on cryptodev %u", 12208 qp_id, ts_params->valid_devs[0]); 12209 12210 return TEST_SUCCESS; 12211 } 12212 12213 static void 12214 generate_gmac_large_plaintext(uint8_t *data) 12215 { 12216 uint16_t i; 12217 12218 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 12219 memcpy(&data[i], &data[0], 32); 12220 } 12221 12222 static int 12223 create_gmac_operation(enum rte_crypto_auth_operation op, 12224 const struct gmac_test_data *tdata) 12225 { 12226 struct crypto_testsuite_params *ts_params = &testsuite_params; 12227 struct crypto_unittest_params *ut_params = &unittest_params; 12228 struct rte_crypto_sym_op *sym_op; 12229 12230 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 12231 12232 /* Generate Crypto op data structure */ 12233 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12234 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12235 TEST_ASSERT_NOT_NULL(ut_params->op, 12236 "Failed to allocate symmetric crypto operation struct"); 12237 12238 sym_op = ut_params->op->sym; 12239 12240 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12241 ut_params->ibuf, tdata->gmac_tag.len); 12242 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12243 "no room to append digest"); 12244 12245 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12246 ut_params->ibuf, plaintext_pad_len); 12247 12248 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 12249 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 12250 tdata->gmac_tag.len); 12251 debug_hexdump(stdout, "digest:", 12252 sym_op->auth.digest.data, 12253 tdata->gmac_tag.len); 12254 } 12255 12256 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12257 uint8_t *, IV_OFFSET); 12258 12259 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 12260 12261 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 12262 12263 sym_op->cipher.data.length = 0; 12264 sym_op->cipher.data.offset = 0; 12265 12266 sym_op->auth.data.offset = 0; 12267 sym_op->auth.data.length = tdata->plaintext.len; 12268 12269 return 0; 12270 } 12271 12272 static int 12273 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 12274 const struct gmac_test_data *tdata, 12275 void *digest_mem, uint64_t digest_phys) 12276 { 12277 struct crypto_testsuite_params *ts_params = &testsuite_params; 12278 struct crypto_unittest_params *ut_params = &unittest_params; 12279 struct rte_crypto_sym_op *sym_op; 12280 12281 /* Generate Crypto op data structure */ 12282 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12283 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12284 TEST_ASSERT_NOT_NULL(ut_params->op, 12285 "Failed to allocate symmetric crypto operation struct"); 12286 12287 sym_op = ut_params->op->sym; 12288 12289 sym_op->auth.digest.data = digest_mem; 12290 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12291 "no room to append digest"); 12292 12293 sym_op->auth.digest.phys_addr = digest_phys; 12294 12295 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 12296 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 12297 tdata->gmac_tag.len); 12298 debug_hexdump(stdout, "digest:", 12299 sym_op->auth.digest.data, 12300 tdata->gmac_tag.len); 12301 } 12302 12303 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12304 uint8_t *, IV_OFFSET); 12305 12306 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 12307 12308 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 12309 12310 sym_op->cipher.data.length = 0; 12311 sym_op->cipher.data.offset = 0; 12312 12313 sym_op->auth.data.offset = 0; 12314 sym_op->auth.data.length = tdata->plaintext.len; 12315 12316 return 0; 12317 } 12318 12319 static int create_gmac_session(uint8_t dev_id, 12320 const struct gmac_test_data *tdata, 12321 enum rte_crypto_auth_operation auth_op) 12322 { 12323 uint8_t auth_key[tdata->key.len]; 12324 int status; 12325 12326 struct crypto_testsuite_params *ts_params = &testsuite_params; 12327 struct crypto_unittest_params *ut_params = &unittest_params; 12328 12329 memcpy(auth_key, tdata->key.data, tdata->key.len); 12330 12331 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12332 ut_params->auth_xform.next = NULL; 12333 12334 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 12335 ut_params->auth_xform.auth.op = auth_op; 12336 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 12337 ut_params->auth_xform.auth.key.length = tdata->key.len; 12338 ut_params->auth_xform.auth.key.data = auth_key; 12339 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 12340 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 12341 12342 12343 ut_params->sess = rte_cryptodev_sym_session_create( 12344 ts_params->session_mpool); 12345 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12346 12347 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12348 &ut_params->auth_xform, 12349 ts_params->session_priv_mpool); 12350 12351 return status; 12352 } 12353 12354 static int 12355 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 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 int retval; 12371 12372 uint8_t *auth_tag, *plaintext; 12373 uint16_t plaintext_pad_len; 12374 12375 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 12376 "No GMAC length in the source data"); 12377 12378 /* Verify the capabilities */ 12379 struct rte_cryptodev_sym_capability_idx cap_idx; 12380 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12381 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 12382 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12383 &cap_idx) == NULL) 12384 return TEST_SKIPPED; 12385 12386 retval = create_gmac_session(ts_params->valid_devs[0], 12387 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 12388 12389 if (retval == -ENOTSUP) 12390 return TEST_SKIPPED; 12391 if (retval < 0) 12392 return retval; 12393 12394 if (tdata->plaintext.len > MBUF_SIZE) 12395 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 12396 else 12397 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12398 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12399 "Failed to allocate input buffer in mempool"); 12400 12401 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12402 rte_pktmbuf_tailroom(ut_params->ibuf)); 12403 12404 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 12405 /* 12406 * Runtime generate the large plain text instead of use hard code 12407 * plain text vector. It is done to avoid create huge source file 12408 * with the test vector. 12409 */ 12410 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 12411 generate_gmac_large_plaintext(tdata->plaintext.data); 12412 12413 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12414 plaintext_pad_len); 12415 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12416 12417 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 12418 debug_hexdump(stdout, "plaintext:", plaintext, 12419 tdata->plaintext.len); 12420 12421 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 12422 tdata); 12423 12424 if (retval < 0) 12425 return retval; 12426 12427 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12428 12429 ut_params->op->sym->m_src = ut_params->ibuf; 12430 12431 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12432 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12433 ut_params->op); 12434 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12435 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12436 ut_params->op, 0, 1, 0, 0); 12437 else 12438 TEST_ASSERT_NOT_NULL( 12439 process_crypto_request(ts_params->valid_devs[0], 12440 ut_params->op), "failed to process sym crypto op"); 12441 12442 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12443 "crypto op processing failed"); 12444 12445 if (ut_params->op->sym->m_dst) { 12446 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 12447 uint8_t *, plaintext_pad_len); 12448 } else { 12449 auth_tag = plaintext + plaintext_pad_len; 12450 } 12451 12452 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 12453 12454 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12455 auth_tag, 12456 tdata->gmac_tag.data, 12457 tdata->gmac_tag.len, 12458 "GMAC Generated auth tag not as expected"); 12459 12460 return 0; 12461 } 12462 12463 static int 12464 test_AES_GMAC_authentication_test_case_1(void) 12465 { 12466 return test_AES_GMAC_authentication(&gmac_test_case_1); 12467 } 12468 12469 static int 12470 test_AES_GMAC_authentication_test_case_2(void) 12471 { 12472 return test_AES_GMAC_authentication(&gmac_test_case_2); 12473 } 12474 12475 static int 12476 test_AES_GMAC_authentication_test_case_3(void) 12477 { 12478 return test_AES_GMAC_authentication(&gmac_test_case_3); 12479 } 12480 12481 static int 12482 test_AES_GMAC_authentication_test_case_4(void) 12483 { 12484 return test_AES_GMAC_authentication(&gmac_test_case_4); 12485 } 12486 12487 static int 12488 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 12489 { 12490 struct crypto_testsuite_params *ts_params = &testsuite_params; 12491 struct crypto_unittest_params *ut_params = &unittest_params; 12492 int retval; 12493 uint32_t plaintext_pad_len; 12494 uint8_t *plaintext; 12495 struct rte_cryptodev_info dev_info; 12496 12497 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12498 uint64_t feat_flags = dev_info.feature_flags; 12499 12500 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12501 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12502 printf("Device doesn't support RAW data-path APIs.\n"); 12503 return TEST_SKIPPED; 12504 } 12505 12506 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 12507 "No GMAC length in the source data"); 12508 12509 /* Verify the capabilities */ 12510 struct rte_cryptodev_sym_capability_idx cap_idx; 12511 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12512 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 12513 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12514 &cap_idx) == NULL) 12515 return TEST_SKIPPED; 12516 12517 retval = create_gmac_session(ts_params->valid_devs[0], 12518 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 12519 12520 if (retval == -ENOTSUP) 12521 return TEST_SKIPPED; 12522 if (retval < 0) 12523 return retval; 12524 12525 if (tdata->plaintext.len > MBUF_SIZE) 12526 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 12527 else 12528 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12529 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12530 "Failed to allocate input buffer in mempool"); 12531 12532 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12533 rte_pktmbuf_tailroom(ut_params->ibuf)); 12534 12535 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 12536 12537 /* 12538 * Runtime generate the large plain text instead of use hard code 12539 * plain text vector. It is done to avoid create huge source file 12540 * with the test vector. 12541 */ 12542 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 12543 generate_gmac_large_plaintext(tdata->plaintext.data); 12544 12545 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12546 plaintext_pad_len); 12547 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12548 12549 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 12550 debug_hexdump(stdout, "plaintext:", plaintext, 12551 tdata->plaintext.len); 12552 12553 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 12554 tdata); 12555 12556 if (retval < 0) 12557 return retval; 12558 12559 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12560 12561 ut_params->op->sym->m_src = ut_params->ibuf; 12562 12563 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12564 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12565 ut_params->op); 12566 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12567 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12568 ut_params->op, 0, 1, 0, 0); 12569 else 12570 TEST_ASSERT_NOT_NULL( 12571 process_crypto_request(ts_params->valid_devs[0], 12572 ut_params->op), "failed to process sym crypto op"); 12573 12574 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12575 "crypto op processing failed"); 12576 12577 return 0; 12578 12579 } 12580 12581 static int 12582 test_AES_GMAC_authentication_verify_test_case_1(void) 12583 { 12584 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 12585 } 12586 12587 static int 12588 test_AES_GMAC_authentication_verify_test_case_2(void) 12589 { 12590 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 12591 } 12592 12593 static int 12594 test_AES_GMAC_authentication_verify_test_case_3(void) 12595 { 12596 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 12597 } 12598 12599 static int 12600 test_AES_GMAC_authentication_verify_test_case_4(void) 12601 { 12602 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 12603 } 12604 12605 static int 12606 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 12607 uint32_t fragsz) 12608 { 12609 struct crypto_testsuite_params *ts_params = &testsuite_params; 12610 struct crypto_unittest_params *ut_params = &unittest_params; 12611 struct rte_cryptodev_info dev_info; 12612 uint64_t feature_flags; 12613 unsigned int trn_data = 0; 12614 void *digest_mem = NULL; 12615 uint32_t segs = 1; 12616 unsigned int to_trn = 0; 12617 struct rte_mbuf *buf = NULL; 12618 uint8_t *auth_tag, *plaintext; 12619 int retval; 12620 12621 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 12622 "No GMAC length in the source data"); 12623 12624 /* Verify the capabilities */ 12625 struct rte_cryptodev_sym_capability_idx cap_idx; 12626 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12627 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 12628 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12629 &cap_idx) == NULL) 12630 return TEST_SKIPPED; 12631 12632 /* Check for any input SGL support */ 12633 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12634 feature_flags = dev_info.feature_flags; 12635 12636 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 12637 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 12638 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 12639 return TEST_SKIPPED; 12640 12641 if (fragsz > tdata->plaintext.len) 12642 fragsz = tdata->plaintext.len; 12643 12644 uint16_t plaintext_len = fragsz; 12645 12646 retval = create_gmac_session(ts_params->valid_devs[0], 12647 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 12648 12649 if (retval == -ENOTSUP) 12650 return TEST_SKIPPED; 12651 if (retval < 0) 12652 return retval; 12653 12654 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12655 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12656 "Failed to allocate input buffer in mempool"); 12657 12658 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12659 rte_pktmbuf_tailroom(ut_params->ibuf)); 12660 12661 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12662 plaintext_len); 12663 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12664 12665 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 12666 12667 trn_data += plaintext_len; 12668 12669 buf = ut_params->ibuf; 12670 12671 /* 12672 * Loop until no more fragments 12673 */ 12674 12675 while (trn_data < tdata->plaintext.len) { 12676 ++segs; 12677 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 12678 (tdata->plaintext.len - trn_data) : fragsz; 12679 12680 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12681 buf = buf->next; 12682 12683 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 12684 rte_pktmbuf_tailroom(buf)); 12685 12686 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 12687 to_trn); 12688 12689 memcpy(plaintext, tdata->plaintext.data + trn_data, 12690 to_trn); 12691 trn_data += to_trn; 12692 if (trn_data == tdata->plaintext.len) 12693 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 12694 tdata->gmac_tag.len); 12695 } 12696 ut_params->ibuf->nb_segs = segs; 12697 12698 /* 12699 * Place digest at the end of the last buffer 12700 */ 12701 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 12702 12703 if (!digest_mem) { 12704 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12705 + tdata->gmac_tag.len); 12706 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 12707 tdata->plaintext.len); 12708 } 12709 12710 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 12711 tdata, digest_mem, digest_phys); 12712 12713 if (retval < 0) 12714 return retval; 12715 12716 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12717 12718 ut_params->op->sym->m_src = ut_params->ibuf; 12719 12720 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12721 return TEST_SKIPPED; 12722 12723 TEST_ASSERT_NOT_NULL( 12724 process_crypto_request(ts_params->valid_devs[0], 12725 ut_params->op), "failed to process sym crypto op"); 12726 12727 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12728 "crypto op processing failed"); 12729 12730 auth_tag = digest_mem; 12731 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 12732 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12733 auth_tag, 12734 tdata->gmac_tag.data, 12735 tdata->gmac_tag.len, 12736 "GMAC Generated auth tag not as expected"); 12737 12738 return 0; 12739 } 12740 12741 /* Segment size not multiple of block size (16B) */ 12742 static int 12743 test_AES_GMAC_authentication_SGL_40B(void) 12744 { 12745 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 12746 } 12747 12748 static int 12749 test_AES_GMAC_authentication_SGL_80B(void) 12750 { 12751 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 12752 } 12753 12754 static int 12755 test_AES_GMAC_authentication_SGL_2048B(void) 12756 { 12757 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 12758 } 12759 12760 /* Segment size not multiple of block size (16B) */ 12761 static int 12762 test_AES_GMAC_authentication_SGL_2047B(void) 12763 { 12764 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 12765 } 12766 12767 struct test_crypto_vector { 12768 enum rte_crypto_cipher_algorithm crypto_algo; 12769 unsigned int cipher_offset; 12770 unsigned int cipher_len; 12771 12772 struct { 12773 uint8_t data[64]; 12774 unsigned int len; 12775 } cipher_key; 12776 12777 struct { 12778 uint8_t data[64]; 12779 unsigned int len; 12780 } iv; 12781 12782 struct { 12783 const uint8_t *data; 12784 unsigned int len; 12785 } plaintext; 12786 12787 struct { 12788 const uint8_t *data; 12789 unsigned int len; 12790 } ciphertext; 12791 12792 enum rte_crypto_auth_algorithm auth_algo; 12793 unsigned int auth_offset; 12794 12795 struct { 12796 uint8_t data[128]; 12797 unsigned int len; 12798 } auth_key; 12799 12800 struct { 12801 const uint8_t *data; 12802 unsigned int len; 12803 } aad; 12804 12805 struct { 12806 uint8_t data[128]; 12807 unsigned int len; 12808 } digest; 12809 }; 12810 12811 static const struct test_crypto_vector 12812 hmac_sha1_test_crypto_vector = { 12813 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12814 .plaintext = { 12815 .data = plaintext_hash, 12816 .len = 512 12817 }, 12818 .auth_key = { 12819 .data = { 12820 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12821 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12822 0xDE, 0xF4, 0xDE, 0xAD 12823 }, 12824 .len = 20 12825 }, 12826 .digest = { 12827 .data = { 12828 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 12829 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 12830 0x3F, 0x91, 0x64, 0x59 12831 }, 12832 .len = 20 12833 } 12834 }; 12835 12836 static const struct test_crypto_vector 12837 aes128_gmac_test_vector = { 12838 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 12839 .plaintext = { 12840 .data = plaintext_hash, 12841 .len = 512 12842 }, 12843 .iv = { 12844 .data = { 12845 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12846 0x08, 0x09, 0x0A, 0x0B 12847 }, 12848 .len = 12 12849 }, 12850 .auth_key = { 12851 .data = { 12852 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12853 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 12854 }, 12855 .len = 16 12856 }, 12857 .digest = { 12858 .data = { 12859 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 12860 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 12861 }, 12862 .len = 16 12863 } 12864 }; 12865 12866 static const struct test_crypto_vector 12867 aes128cbc_hmac_sha1_test_vector = { 12868 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12869 .cipher_offset = 0, 12870 .cipher_len = 512, 12871 .cipher_key = { 12872 .data = { 12873 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12874 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12875 }, 12876 .len = 16 12877 }, 12878 .iv = { 12879 .data = { 12880 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12881 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12882 }, 12883 .len = 16 12884 }, 12885 .plaintext = { 12886 .data = plaintext_hash, 12887 .len = 512 12888 }, 12889 .ciphertext = { 12890 .data = ciphertext512_aes128cbc, 12891 .len = 512 12892 }, 12893 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12894 .auth_offset = 0, 12895 .auth_key = { 12896 .data = { 12897 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12898 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12899 0xDE, 0xF4, 0xDE, 0xAD 12900 }, 12901 .len = 20 12902 }, 12903 .digest = { 12904 .data = { 12905 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 12906 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12907 0x18, 0x8C, 0x1D, 0x32 12908 }, 12909 .len = 20 12910 } 12911 }; 12912 12913 static const struct test_crypto_vector 12914 aes128cbc_hmac_sha1_aad_test_vector = { 12915 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12916 .cipher_offset = 8, 12917 .cipher_len = 496, 12918 .cipher_key = { 12919 .data = { 12920 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12921 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12922 }, 12923 .len = 16 12924 }, 12925 .iv = { 12926 .data = { 12927 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12928 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12929 }, 12930 .len = 16 12931 }, 12932 .plaintext = { 12933 .data = plaintext_hash, 12934 .len = 512 12935 }, 12936 .ciphertext = { 12937 .data = ciphertext512_aes128cbc_aad, 12938 .len = 512 12939 }, 12940 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12941 .auth_offset = 0, 12942 .auth_key = { 12943 .data = { 12944 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12945 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12946 0xDE, 0xF4, 0xDE, 0xAD 12947 }, 12948 .len = 20 12949 }, 12950 .digest = { 12951 .data = { 12952 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 12953 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 12954 0x62, 0x0F, 0xFB, 0x10 12955 }, 12956 .len = 20 12957 } 12958 }; 12959 12960 static void 12961 data_corruption(uint8_t *data) 12962 { 12963 data[0] += 1; 12964 } 12965 12966 static void 12967 tag_corruption(uint8_t *data, unsigned int tag_offset) 12968 { 12969 data[tag_offset] += 1; 12970 } 12971 12972 static int 12973 create_auth_session(struct crypto_unittest_params *ut_params, 12974 uint8_t dev_id, 12975 const struct test_crypto_vector *reference, 12976 enum rte_crypto_auth_operation auth_op) 12977 { 12978 struct crypto_testsuite_params *ts_params = &testsuite_params; 12979 uint8_t auth_key[reference->auth_key.len + 1]; 12980 int status; 12981 12982 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12983 12984 /* Setup Authentication Parameters */ 12985 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12986 ut_params->auth_xform.auth.op = auth_op; 12987 ut_params->auth_xform.next = NULL; 12988 ut_params->auth_xform.auth.algo = reference->auth_algo; 12989 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12990 ut_params->auth_xform.auth.key.data = auth_key; 12991 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12992 12993 /* Create Crypto session*/ 12994 ut_params->sess = rte_cryptodev_sym_session_create( 12995 ts_params->session_mpool); 12996 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12997 12998 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12999 &ut_params->auth_xform, 13000 ts_params->session_priv_mpool); 13001 13002 return status; 13003 } 13004 13005 static int 13006 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 13007 uint8_t dev_id, 13008 const struct test_crypto_vector *reference, 13009 enum rte_crypto_auth_operation auth_op, 13010 enum rte_crypto_cipher_operation cipher_op) 13011 { 13012 struct crypto_testsuite_params *ts_params = &testsuite_params; 13013 uint8_t cipher_key[reference->cipher_key.len + 1]; 13014 uint8_t auth_key[reference->auth_key.len + 1]; 13015 int status; 13016 13017 memcpy(cipher_key, reference->cipher_key.data, 13018 reference->cipher_key.len); 13019 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13020 13021 /* Setup Authentication Parameters */ 13022 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13023 ut_params->auth_xform.auth.op = auth_op; 13024 ut_params->auth_xform.auth.algo = reference->auth_algo; 13025 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13026 ut_params->auth_xform.auth.key.data = auth_key; 13027 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13028 13029 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 13030 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 13031 ut_params->auth_xform.auth.iv.length = reference->iv.len; 13032 } else { 13033 ut_params->auth_xform.next = &ut_params->cipher_xform; 13034 13035 /* Setup Cipher Parameters */ 13036 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13037 ut_params->cipher_xform.next = NULL; 13038 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13039 ut_params->cipher_xform.cipher.op = cipher_op; 13040 ut_params->cipher_xform.cipher.key.data = cipher_key; 13041 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13042 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13043 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13044 } 13045 13046 /* Create Crypto session*/ 13047 ut_params->sess = rte_cryptodev_sym_session_create( 13048 ts_params->session_mpool); 13049 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13050 13051 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 13052 &ut_params->auth_xform, 13053 ts_params->session_priv_mpool); 13054 13055 return status; 13056 } 13057 13058 static int 13059 create_auth_operation(struct crypto_testsuite_params *ts_params, 13060 struct crypto_unittest_params *ut_params, 13061 const struct test_crypto_vector *reference, 13062 unsigned int auth_generate) 13063 { 13064 /* Generate Crypto op data structure */ 13065 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13066 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13067 TEST_ASSERT_NOT_NULL(ut_params->op, 13068 "Failed to allocate pktmbuf offload"); 13069 13070 /* Set crypto operation data parameters */ 13071 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13072 13073 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13074 13075 /* set crypto operation source mbuf */ 13076 sym_op->m_src = ut_params->ibuf; 13077 13078 /* digest */ 13079 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13080 ut_params->ibuf, reference->digest.len); 13081 13082 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13083 "no room to append auth tag"); 13084 13085 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 13086 ut_params->ibuf, reference->plaintext.len); 13087 13088 if (auth_generate) 13089 memset(sym_op->auth.digest.data, 0, reference->digest.len); 13090 else 13091 memcpy(sym_op->auth.digest.data, 13092 reference->digest.data, 13093 reference->digest.len); 13094 13095 debug_hexdump(stdout, "digest:", 13096 sym_op->auth.digest.data, 13097 reference->digest.len); 13098 13099 sym_op->auth.data.length = reference->plaintext.len; 13100 sym_op->auth.data.offset = 0; 13101 13102 return 0; 13103 } 13104 13105 static int 13106 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 13107 struct crypto_unittest_params *ut_params, 13108 const struct test_crypto_vector *reference, 13109 unsigned int auth_generate) 13110 { 13111 /* Generate Crypto op data structure */ 13112 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13113 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13114 TEST_ASSERT_NOT_NULL(ut_params->op, 13115 "Failed to allocate pktmbuf offload"); 13116 13117 /* Set crypto operation data parameters */ 13118 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13119 13120 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13121 13122 /* set crypto operation source mbuf */ 13123 sym_op->m_src = ut_params->ibuf; 13124 13125 /* digest */ 13126 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13127 ut_params->ibuf, reference->digest.len); 13128 13129 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13130 "no room to append auth tag"); 13131 13132 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 13133 ut_params->ibuf, reference->ciphertext.len); 13134 13135 if (auth_generate) 13136 memset(sym_op->auth.digest.data, 0, reference->digest.len); 13137 else 13138 memcpy(sym_op->auth.digest.data, 13139 reference->digest.data, 13140 reference->digest.len); 13141 13142 debug_hexdump(stdout, "digest:", 13143 sym_op->auth.digest.data, 13144 reference->digest.len); 13145 13146 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 13147 reference->iv.data, reference->iv.len); 13148 13149 sym_op->cipher.data.length = 0; 13150 sym_op->cipher.data.offset = 0; 13151 13152 sym_op->auth.data.length = reference->plaintext.len; 13153 sym_op->auth.data.offset = 0; 13154 13155 return 0; 13156 } 13157 13158 static int 13159 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 13160 struct crypto_unittest_params *ut_params, 13161 const struct test_crypto_vector *reference, 13162 unsigned int auth_generate) 13163 { 13164 /* Generate Crypto op data structure */ 13165 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13166 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13167 TEST_ASSERT_NOT_NULL(ut_params->op, 13168 "Failed to allocate pktmbuf offload"); 13169 13170 /* Set crypto operation data parameters */ 13171 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13172 13173 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13174 13175 /* set crypto operation source mbuf */ 13176 sym_op->m_src = ut_params->ibuf; 13177 13178 /* digest */ 13179 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 13180 ut_params->ibuf, reference->digest.len); 13181 13182 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 13183 "no room to append auth tag"); 13184 13185 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 13186 ut_params->ibuf, reference->ciphertext.len); 13187 13188 if (auth_generate) 13189 memset(sym_op->auth.digest.data, 0, reference->digest.len); 13190 else 13191 memcpy(sym_op->auth.digest.data, 13192 reference->digest.data, 13193 reference->digest.len); 13194 13195 debug_hexdump(stdout, "digest:", 13196 sym_op->auth.digest.data, 13197 reference->digest.len); 13198 13199 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 13200 reference->iv.data, reference->iv.len); 13201 13202 sym_op->cipher.data.length = reference->cipher_len; 13203 sym_op->cipher.data.offset = reference->cipher_offset; 13204 13205 sym_op->auth.data.length = reference->plaintext.len; 13206 sym_op->auth.data.offset = reference->auth_offset; 13207 13208 return 0; 13209 } 13210 13211 static int 13212 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 13213 struct crypto_unittest_params *ut_params, 13214 const struct test_crypto_vector *reference) 13215 { 13216 return create_auth_operation(ts_params, ut_params, reference, 0); 13217 } 13218 13219 static int 13220 create_auth_verify_GMAC_operation( 13221 struct crypto_testsuite_params *ts_params, 13222 struct crypto_unittest_params *ut_params, 13223 const struct test_crypto_vector *reference) 13224 { 13225 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 13226 } 13227 13228 static int 13229 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 13230 struct crypto_unittest_params *ut_params, 13231 const struct test_crypto_vector *reference) 13232 { 13233 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 13234 } 13235 13236 static int 13237 test_authentication_verify_fail_when_data_corruption( 13238 struct crypto_testsuite_params *ts_params, 13239 struct crypto_unittest_params *ut_params, 13240 const struct test_crypto_vector *reference, 13241 unsigned int data_corrupted) 13242 { 13243 int retval; 13244 13245 uint8_t *plaintext; 13246 struct rte_cryptodev_info dev_info; 13247 13248 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13249 uint64_t feat_flags = dev_info.feature_flags; 13250 13251 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13252 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13253 printf("Device doesn't support RAW data-path APIs.\n"); 13254 return TEST_SKIPPED; 13255 } 13256 13257 /* Verify the capabilities */ 13258 struct rte_cryptodev_sym_capability_idx cap_idx; 13259 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13260 cap_idx.algo.auth = reference->auth_algo; 13261 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13262 &cap_idx) == NULL) 13263 return TEST_SKIPPED; 13264 13265 13266 /* Create session */ 13267 retval = create_auth_session(ut_params, 13268 ts_params->valid_devs[0], 13269 reference, 13270 RTE_CRYPTO_AUTH_OP_VERIFY); 13271 13272 if (retval == -ENOTSUP) 13273 return TEST_SKIPPED; 13274 if (retval < 0) 13275 return retval; 13276 13277 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13278 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13279 "Failed to allocate input buffer in mempool"); 13280 13281 /* clear mbuf payload */ 13282 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13283 rte_pktmbuf_tailroom(ut_params->ibuf)); 13284 13285 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13286 reference->plaintext.len); 13287 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13288 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 13289 13290 debug_hexdump(stdout, "plaintext:", plaintext, 13291 reference->plaintext.len); 13292 13293 /* Create operation */ 13294 retval = create_auth_verify_operation(ts_params, ut_params, reference); 13295 13296 if (retval < 0) 13297 return retval; 13298 13299 if (data_corrupted) 13300 data_corruption(plaintext); 13301 else 13302 tag_corruption(plaintext, reference->plaintext.len); 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 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 13308 RTE_CRYPTO_OP_STATUS_SUCCESS, 13309 "authentication not failed"); 13310 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13311 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13312 ut_params->op, 0, 1, 0, 0); 13313 else { 13314 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 13315 ut_params->op); 13316 } 13317 if (ut_params->op == NULL) 13318 return 0; 13319 else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) 13320 return 0; 13321 13322 return -1; 13323 } 13324 13325 static int 13326 test_authentication_verify_GMAC_fail_when_corruption( 13327 struct crypto_testsuite_params *ts_params, 13328 struct crypto_unittest_params *ut_params, 13329 const struct test_crypto_vector *reference, 13330 unsigned int data_corrupted) 13331 { 13332 int retval; 13333 uint8_t *plaintext; 13334 struct rte_cryptodev_info dev_info; 13335 13336 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13337 uint64_t feat_flags = dev_info.feature_flags; 13338 13339 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13340 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13341 printf("Device doesn't support RAW data-path APIs.\n"); 13342 return TEST_SKIPPED; 13343 } 13344 13345 /* Verify the capabilities */ 13346 struct rte_cryptodev_sym_capability_idx cap_idx; 13347 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13348 cap_idx.algo.auth = reference->auth_algo; 13349 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13350 &cap_idx) == NULL) 13351 return TEST_SKIPPED; 13352 13353 /* Create session */ 13354 retval = create_auth_cipher_session(ut_params, 13355 ts_params->valid_devs[0], 13356 reference, 13357 RTE_CRYPTO_AUTH_OP_VERIFY, 13358 RTE_CRYPTO_CIPHER_OP_DECRYPT); 13359 if (retval < 0) 13360 return retval; 13361 13362 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13363 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13364 "Failed to allocate input buffer in mempool"); 13365 13366 /* clear mbuf payload */ 13367 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13368 rte_pktmbuf_tailroom(ut_params->ibuf)); 13369 13370 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13371 reference->plaintext.len); 13372 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13373 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 13374 13375 debug_hexdump(stdout, "plaintext:", plaintext, 13376 reference->plaintext.len); 13377 13378 /* Create operation */ 13379 retval = create_auth_verify_GMAC_operation(ts_params, 13380 ut_params, 13381 reference); 13382 13383 if (retval < 0) 13384 return retval; 13385 13386 if (data_corrupted) 13387 data_corruption(plaintext); 13388 else 13389 tag_corruption(plaintext, reference->aad.len); 13390 13391 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 13392 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13393 ut_params->op); 13394 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 13395 RTE_CRYPTO_OP_STATUS_SUCCESS, 13396 "authentication not failed"); 13397 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13398 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13399 ut_params->op, 0, 1, 0, 0); 13400 else { 13401 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 13402 ut_params->op); 13403 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 13404 } 13405 13406 return 0; 13407 } 13408 13409 static int 13410 test_authenticated_decryption_fail_when_corruption( 13411 struct crypto_testsuite_params *ts_params, 13412 struct crypto_unittest_params *ut_params, 13413 const struct test_crypto_vector *reference, 13414 unsigned int data_corrupted) 13415 { 13416 int retval; 13417 13418 uint8_t *ciphertext; 13419 struct rte_cryptodev_info dev_info; 13420 13421 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13422 uint64_t feat_flags = dev_info.feature_flags; 13423 13424 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13425 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13426 printf("Device doesn't support RAW data-path APIs.\n"); 13427 return TEST_SKIPPED; 13428 } 13429 13430 /* Verify the capabilities */ 13431 struct rte_cryptodev_sym_capability_idx cap_idx; 13432 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13433 cap_idx.algo.auth = reference->auth_algo; 13434 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13435 &cap_idx) == NULL) 13436 return TEST_SKIPPED; 13437 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13438 cap_idx.algo.cipher = reference->crypto_algo; 13439 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13440 &cap_idx) == NULL) 13441 return TEST_SKIPPED; 13442 13443 /* Create session */ 13444 retval = create_auth_cipher_session(ut_params, 13445 ts_params->valid_devs[0], 13446 reference, 13447 RTE_CRYPTO_AUTH_OP_VERIFY, 13448 RTE_CRYPTO_CIPHER_OP_DECRYPT); 13449 13450 if (retval == -ENOTSUP) 13451 return TEST_SKIPPED; 13452 if (retval < 0) 13453 return retval; 13454 13455 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13456 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13457 "Failed to allocate input buffer in mempool"); 13458 13459 /* clear mbuf payload */ 13460 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13461 rte_pktmbuf_tailroom(ut_params->ibuf)); 13462 13463 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13464 reference->ciphertext.len); 13465 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 13466 memcpy(ciphertext, reference->ciphertext.data, 13467 reference->ciphertext.len); 13468 13469 /* Create operation */ 13470 retval = create_cipher_auth_verify_operation(ts_params, 13471 ut_params, 13472 reference); 13473 13474 if (retval < 0) 13475 return retval; 13476 13477 if (data_corrupted) 13478 data_corruption(ciphertext); 13479 else 13480 tag_corruption(ciphertext, reference->ciphertext.len); 13481 13482 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 13483 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13484 ut_params->op); 13485 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 13486 RTE_CRYPTO_OP_STATUS_SUCCESS, 13487 "authentication not failed"); 13488 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13489 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13490 ut_params->op, 1, 1, 0, 0); 13491 else { 13492 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 13493 ut_params->op); 13494 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 13495 } 13496 13497 return 0; 13498 } 13499 13500 static int 13501 test_authenticated_encrypt_with_esn( 13502 struct crypto_testsuite_params *ts_params, 13503 struct crypto_unittest_params *ut_params, 13504 const struct test_crypto_vector *reference) 13505 { 13506 int retval; 13507 13508 uint8_t *authciphertext, *plaintext, *auth_tag; 13509 uint16_t plaintext_pad_len; 13510 uint8_t cipher_key[reference->cipher_key.len + 1]; 13511 uint8_t auth_key[reference->auth_key.len + 1]; 13512 struct rte_cryptodev_info dev_info; 13513 int status; 13514 13515 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13516 uint64_t feat_flags = dev_info.feature_flags; 13517 13518 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13519 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13520 printf("Device doesn't support RAW data-path APIs.\n"); 13521 return TEST_SKIPPED; 13522 } 13523 13524 /* Verify the capabilities */ 13525 struct rte_cryptodev_sym_capability_idx cap_idx; 13526 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13527 cap_idx.algo.auth = reference->auth_algo; 13528 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13529 &cap_idx) == NULL) 13530 return TEST_SKIPPED; 13531 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13532 cap_idx.algo.cipher = reference->crypto_algo; 13533 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13534 &cap_idx) == NULL) 13535 return TEST_SKIPPED; 13536 13537 /* Create session */ 13538 memcpy(cipher_key, reference->cipher_key.data, 13539 reference->cipher_key.len); 13540 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13541 13542 /* Setup Cipher Parameters */ 13543 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13544 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13545 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 13546 ut_params->cipher_xform.cipher.key.data = cipher_key; 13547 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13548 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13549 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13550 13551 ut_params->cipher_xform.next = &ut_params->auth_xform; 13552 13553 /* Setup Authentication Parameters */ 13554 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13555 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 13556 ut_params->auth_xform.auth.algo = reference->auth_algo; 13557 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13558 ut_params->auth_xform.auth.key.data = auth_key; 13559 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13560 ut_params->auth_xform.next = NULL; 13561 13562 /* Create Crypto session*/ 13563 ut_params->sess = rte_cryptodev_sym_session_create( 13564 ts_params->session_mpool); 13565 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13566 13567 status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 13568 ut_params->sess, 13569 &ut_params->cipher_xform, 13570 ts_params->session_priv_mpool); 13571 13572 if (status == -ENOTSUP) 13573 return TEST_SKIPPED; 13574 13575 TEST_ASSERT_EQUAL(status, 0, "Session init failed"); 13576 13577 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13578 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13579 "Failed to allocate input buffer in mempool"); 13580 13581 /* clear mbuf payload */ 13582 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13583 rte_pktmbuf_tailroom(ut_params->ibuf)); 13584 13585 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13586 reference->plaintext.len); 13587 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13588 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 13589 13590 /* Create operation */ 13591 retval = create_cipher_auth_operation(ts_params, 13592 ut_params, 13593 reference, 0); 13594 13595 if (retval < 0) 13596 return retval; 13597 13598 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13599 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13600 ut_params->op); 13601 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13602 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13603 ut_params->op, 1, 1, 0, 0); 13604 else 13605 ut_params->op = process_crypto_request( 13606 ts_params->valid_devs[0], ut_params->op); 13607 13608 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 13609 13610 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13611 "crypto op processing failed"); 13612 13613 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 13614 13615 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 13616 ut_params->op->sym->auth.data.offset); 13617 auth_tag = authciphertext + plaintext_pad_len; 13618 debug_hexdump(stdout, "ciphertext:", authciphertext, 13619 reference->ciphertext.len); 13620 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 13621 13622 /* Validate obuf */ 13623 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13624 authciphertext, 13625 reference->ciphertext.data, 13626 reference->ciphertext.len, 13627 "Ciphertext data not as expected"); 13628 13629 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13630 auth_tag, 13631 reference->digest.data, 13632 reference->digest.len, 13633 "Generated digest not as expected"); 13634 13635 return TEST_SUCCESS; 13636 13637 } 13638 13639 static int 13640 test_authenticated_decrypt_with_esn( 13641 struct crypto_testsuite_params *ts_params, 13642 struct crypto_unittest_params *ut_params, 13643 const struct test_crypto_vector *reference) 13644 { 13645 int retval; 13646 13647 uint8_t *ciphertext; 13648 uint8_t cipher_key[reference->cipher_key.len + 1]; 13649 uint8_t auth_key[reference->auth_key.len + 1]; 13650 struct rte_cryptodev_info dev_info; 13651 13652 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13653 uint64_t feat_flags = dev_info.feature_flags; 13654 13655 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13656 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13657 printf("Device doesn't support RAW data-path APIs.\n"); 13658 return TEST_SKIPPED; 13659 } 13660 13661 /* Verify the capabilities */ 13662 struct rte_cryptodev_sym_capability_idx cap_idx; 13663 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13664 cap_idx.algo.auth = reference->auth_algo; 13665 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13666 &cap_idx) == NULL) 13667 return TEST_SKIPPED; 13668 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13669 cap_idx.algo.cipher = reference->crypto_algo; 13670 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13671 &cap_idx) == NULL) 13672 return TEST_SKIPPED; 13673 13674 /* Create session */ 13675 memcpy(cipher_key, reference->cipher_key.data, 13676 reference->cipher_key.len); 13677 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13678 13679 /* Setup Authentication Parameters */ 13680 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13681 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 13682 ut_params->auth_xform.auth.algo = reference->auth_algo; 13683 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13684 ut_params->auth_xform.auth.key.data = auth_key; 13685 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13686 ut_params->auth_xform.next = &ut_params->cipher_xform; 13687 13688 /* Setup Cipher Parameters */ 13689 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13690 ut_params->cipher_xform.next = NULL; 13691 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13692 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 13693 ut_params->cipher_xform.cipher.key.data = cipher_key; 13694 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13695 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13696 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13697 13698 /* Create Crypto session*/ 13699 ut_params->sess = rte_cryptodev_sym_session_create( 13700 ts_params->session_mpool); 13701 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13702 13703 retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 13704 ut_params->sess, 13705 &ut_params->auth_xform, 13706 ts_params->session_priv_mpool); 13707 13708 if (retval == -ENOTSUP) 13709 return TEST_SKIPPED; 13710 13711 TEST_ASSERT_EQUAL(retval, 0, "Session init failed"); 13712 13713 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13714 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13715 "Failed to allocate input buffer in mempool"); 13716 13717 /* clear mbuf payload */ 13718 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13719 rte_pktmbuf_tailroom(ut_params->ibuf)); 13720 13721 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13722 reference->ciphertext.len); 13723 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 13724 memcpy(ciphertext, reference->ciphertext.data, 13725 reference->ciphertext.len); 13726 13727 /* Create operation */ 13728 retval = create_cipher_auth_verify_operation(ts_params, 13729 ut_params, 13730 reference); 13731 13732 if (retval < 0) 13733 return retval; 13734 13735 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13736 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13737 ut_params->op); 13738 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13739 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13740 ut_params->op, 1, 1, 0, 0); 13741 else 13742 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 13743 ut_params->op); 13744 13745 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 13746 TEST_ASSERT_EQUAL(ut_params->op->status, 13747 RTE_CRYPTO_OP_STATUS_SUCCESS, 13748 "crypto op processing passed"); 13749 13750 ut_params->obuf = ut_params->op->sym->m_src; 13751 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 13752 13753 return 0; 13754 } 13755 13756 static int 13757 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 13758 const struct aead_test_data *tdata, 13759 void *digest_mem, uint64_t digest_phys) 13760 { 13761 struct crypto_testsuite_params *ts_params = &testsuite_params; 13762 struct crypto_unittest_params *ut_params = &unittest_params; 13763 13764 const unsigned int auth_tag_len = tdata->auth_tag.len; 13765 const unsigned int iv_len = tdata->iv.len; 13766 unsigned int aad_len = tdata->aad.len; 13767 unsigned int aad_len_pad = 0; 13768 13769 /* Generate Crypto op data structure */ 13770 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13771 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13772 TEST_ASSERT_NOT_NULL(ut_params->op, 13773 "Failed to allocate symmetric crypto operation struct"); 13774 13775 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13776 13777 sym_op->aead.digest.data = digest_mem; 13778 13779 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 13780 "no room to append digest"); 13781 13782 sym_op->aead.digest.phys_addr = digest_phys; 13783 13784 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 13785 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 13786 auth_tag_len); 13787 debug_hexdump(stdout, "digest:", 13788 sym_op->aead.digest.data, 13789 auth_tag_len); 13790 } 13791 13792 /* Append aad data */ 13793 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 13794 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13795 uint8_t *, IV_OFFSET); 13796 13797 /* Copy IV 1 byte after the IV pointer, according to the API */ 13798 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 13799 13800 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 13801 13802 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 13803 ut_params->ibuf, aad_len); 13804 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 13805 "no room to prepend aad"); 13806 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 13807 ut_params->ibuf); 13808 13809 memset(sym_op->aead.aad.data, 0, aad_len); 13810 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 13811 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 13812 13813 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 13814 debug_hexdump(stdout, "aad:", 13815 sym_op->aead.aad.data, aad_len); 13816 } else { 13817 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13818 uint8_t *, IV_OFFSET); 13819 13820 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 13821 13822 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 13823 13824 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 13825 ut_params->ibuf, aad_len_pad); 13826 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 13827 "no room to prepend aad"); 13828 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 13829 ut_params->ibuf); 13830 13831 memset(sym_op->aead.aad.data, 0, aad_len); 13832 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 13833 13834 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 13835 debug_hexdump(stdout, "aad:", 13836 sym_op->aead.aad.data, aad_len); 13837 } 13838 13839 sym_op->aead.data.length = tdata->plaintext.len; 13840 sym_op->aead.data.offset = aad_len_pad; 13841 13842 return 0; 13843 } 13844 13845 #define SGL_MAX_NO 16 13846 13847 static int 13848 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 13849 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 13850 { 13851 struct crypto_testsuite_params *ts_params = &testsuite_params; 13852 struct crypto_unittest_params *ut_params = &unittest_params; 13853 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 13854 int retval; 13855 int to_trn = 0; 13856 int to_trn_tbl[SGL_MAX_NO]; 13857 int segs = 1; 13858 unsigned int trn_data = 0; 13859 uint8_t *plaintext, *ciphertext, *auth_tag; 13860 struct rte_cryptodev_info dev_info; 13861 13862 /* Verify the capabilities */ 13863 struct rte_cryptodev_sym_capability_idx cap_idx; 13864 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 13865 cap_idx.algo.aead = tdata->algo; 13866 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13867 &cap_idx) == NULL) 13868 return TEST_SKIPPED; 13869 13870 /* OOP not supported with CPU crypto */ 13871 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13872 return TEST_SKIPPED; 13873 13874 /* Detailed check for the particular SGL support flag */ 13875 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13876 if (!oop) { 13877 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13878 if (sgl_in && (!(dev_info.feature_flags & 13879 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 13880 return TEST_SKIPPED; 13881 13882 uint64_t feat_flags = dev_info.feature_flags; 13883 13884 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13885 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13886 printf("Device doesn't support RAW data-path APIs.\n"); 13887 return TEST_SKIPPED; 13888 } 13889 } else { 13890 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13891 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 13892 tdata->plaintext.len; 13893 /* Raw data path API does not support OOP */ 13894 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13895 return TEST_SKIPPED; 13896 if (sgl_in && !sgl_out) { 13897 if (!(dev_info.feature_flags & 13898 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 13899 return TEST_SKIPPED; 13900 } else if (!sgl_in && sgl_out) { 13901 if (!(dev_info.feature_flags & 13902 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 13903 return TEST_SKIPPED; 13904 } else if (sgl_in && sgl_out) { 13905 if (!(dev_info.feature_flags & 13906 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 13907 return TEST_SKIPPED; 13908 } 13909 } 13910 13911 if (fragsz > tdata->plaintext.len) 13912 fragsz = tdata->plaintext.len; 13913 13914 uint16_t plaintext_len = fragsz; 13915 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 13916 13917 if (fragsz_oop > tdata->plaintext.len) 13918 frag_size_oop = tdata->plaintext.len; 13919 13920 int ecx = 0; 13921 void *digest_mem = NULL; 13922 13923 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 13924 13925 if (tdata->plaintext.len % fragsz != 0) { 13926 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 13927 return 1; 13928 } else { 13929 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 13930 return 1; 13931 } 13932 13933 /* 13934 * For out-op-place we need to alloc another mbuf 13935 */ 13936 if (oop) { 13937 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13938 rte_pktmbuf_append(ut_params->obuf, 13939 frag_size_oop + prepend_len); 13940 buf_oop = ut_params->obuf; 13941 } 13942 13943 /* Create AEAD session */ 13944 retval = create_aead_session(ts_params->valid_devs[0], 13945 tdata->algo, 13946 RTE_CRYPTO_AEAD_OP_ENCRYPT, 13947 tdata->key.data, tdata->key.len, 13948 tdata->aad.len, tdata->auth_tag.len, 13949 tdata->iv.len); 13950 if (retval < 0) 13951 return retval; 13952 13953 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13954 13955 /* clear mbuf payload */ 13956 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13957 rte_pktmbuf_tailroom(ut_params->ibuf)); 13958 13959 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13960 plaintext_len); 13961 13962 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 13963 13964 trn_data += plaintext_len; 13965 13966 buf = ut_params->ibuf; 13967 13968 /* 13969 * Loop until no more fragments 13970 */ 13971 13972 while (trn_data < tdata->plaintext.len) { 13973 ++segs; 13974 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 13975 (tdata->plaintext.len - trn_data) : fragsz; 13976 13977 to_trn_tbl[ecx++] = to_trn; 13978 13979 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13980 buf = buf->next; 13981 13982 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 13983 rte_pktmbuf_tailroom(buf)); 13984 13985 /* OOP */ 13986 if (oop && !fragsz_oop) { 13987 buf_last_oop = buf_oop->next = 13988 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13989 buf_oop = buf_oop->next; 13990 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13991 0, rte_pktmbuf_tailroom(buf_oop)); 13992 rte_pktmbuf_append(buf_oop, to_trn); 13993 } 13994 13995 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 13996 to_trn); 13997 13998 memcpy(plaintext, tdata->plaintext.data + trn_data, 13999 to_trn); 14000 trn_data += to_trn; 14001 if (trn_data == tdata->plaintext.len) { 14002 if (oop) { 14003 if (!fragsz_oop) 14004 digest_mem = rte_pktmbuf_append(buf_oop, 14005 tdata->auth_tag.len); 14006 } else 14007 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 14008 tdata->auth_tag.len); 14009 } 14010 } 14011 14012 uint64_t digest_phys = 0; 14013 14014 ut_params->ibuf->nb_segs = segs; 14015 14016 segs = 1; 14017 if (fragsz_oop && oop) { 14018 to_trn = 0; 14019 ecx = 0; 14020 14021 if (frag_size_oop == tdata->plaintext.len) { 14022 digest_mem = rte_pktmbuf_append(ut_params->obuf, 14023 tdata->auth_tag.len); 14024 14025 digest_phys = rte_pktmbuf_iova_offset( 14026 ut_params->obuf, 14027 tdata->plaintext.len + prepend_len); 14028 } 14029 14030 trn_data = frag_size_oop; 14031 while (trn_data < tdata->plaintext.len) { 14032 ++segs; 14033 to_trn = 14034 (tdata->plaintext.len - trn_data < 14035 frag_size_oop) ? 14036 (tdata->plaintext.len - trn_data) : 14037 frag_size_oop; 14038 14039 to_trn_tbl[ecx++] = to_trn; 14040 14041 buf_last_oop = buf_oop->next = 14042 rte_pktmbuf_alloc(ts_params->mbuf_pool); 14043 buf_oop = buf_oop->next; 14044 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 14045 0, rte_pktmbuf_tailroom(buf_oop)); 14046 rte_pktmbuf_append(buf_oop, to_trn); 14047 14048 trn_data += to_trn; 14049 14050 if (trn_data == tdata->plaintext.len) { 14051 digest_mem = rte_pktmbuf_append(buf_oop, 14052 tdata->auth_tag.len); 14053 } 14054 } 14055 14056 ut_params->obuf->nb_segs = segs; 14057 } 14058 14059 /* 14060 * Place digest at the end of the last buffer 14061 */ 14062 if (!digest_phys) 14063 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 14064 if (oop && buf_last_oop) 14065 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 14066 14067 if (!digest_mem && !oop) { 14068 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 14069 + tdata->auth_tag.len); 14070 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 14071 tdata->plaintext.len); 14072 } 14073 14074 /* Create AEAD operation */ 14075 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 14076 tdata, digest_mem, digest_phys); 14077 14078 if (retval < 0) 14079 return retval; 14080 14081 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 14082 14083 ut_params->op->sym->m_src = ut_params->ibuf; 14084 if (oop) 14085 ut_params->op->sym->m_dst = ut_params->obuf; 14086 14087 /* Process crypto operation */ 14088 if (oop == IN_PLACE && 14089 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 14090 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 14091 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 14092 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 14093 ut_params->op, 0, 0, 0, 0); 14094 else 14095 TEST_ASSERT_NOT_NULL( 14096 process_crypto_request(ts_params->valid_devs[0], 14097 ut_params->op), "failed to process sym crypto op"); 14098 14099 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 14100 "crypto op processing failed"); 14101 14102 14103 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 14104 uint8_t *, prepend_len); 14105 if (oop) { 14106 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 14107 uint8_t *, prepend_len); 14108 } 14109 14110 if (fragsz_oop) 14111 fragsz = fragsz_oop; 14112 14113 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14114 ciphertext, 14115 tdata->ciphertext.data, 14116 fragsz, 14117 "Ciphertext data not as expected"); 14118 14119 buf = ut_params->op->sym->m_src->next; 14120 if (oop) 14121 buf = ut_params->op->sym->m_dst->next; 14122 14123 unsigned int off = fragsz; 14124 14125 ecx = 0; 14126 while (buf) { 14127 ciphertext = rte_pktmbuf_mtod(buf, 14128 uint8_t *); 14129 14130 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14131 ciphertext, 14132 tdata->ciphertext.data + off, 14133 to_trn_tbl[ecx], 14134 "Ciphertext data not as expected"); 14135 14136 off += to_trn_tbl[ecx++]; 14137 buf = buf->next; 14138 } 14139 14140 auth_tag = digest_mem; 14141 TEST_ASSERT_BUFFERS_ARE_EQUAL( 14142 auth_tag, 14143 tdata->auth_tag.data, 14144 tdata->auth_tag.len, 14145 "Generated auth tag not as expected"); 14146 14147 return 0; 14148 } 14149 14150 static int 14151 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 14152 { 14153 return test_authenticated_encryption_SGL( 14154 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 14155 } 14156 14157 static int 14158 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 14159 { 14160 return test_authenticated_encryption_SGL( 14161 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 14162 } 14163 14164 static int 14165 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 14166 { 14167 return test_authenticated_encryption_SGL( 14168 &gcm_test_case_8, OUT_OF_PLACE, 400, 14169 gcm_test_case_8.plaintext.len); 14170 } 14171 14172 static int 14173 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 14174 { 14175 /* This test is not for OPENSSL PMD */ 14176 if (gbl_driver_id == rte_cryptodev_driver_id_get( 14177 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 14178 return TEST_SKIPPED; 14179 14180 return test_authenticated_encryption_SGL( 14181 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 14182 } 14183 14184 static int 14185 test_authentication_verify_fail_when_data_corrupted( 14186 struct crypto_testsuite_params *ts_params, 14187 struct crypto_unittest_params *ut_params, 14188 const struct test_crypto_vector *reference) 14189 { 14190 return test_authentication_verify_fail_when_data_corruption( 14191 ts_params, ut_params, reference, 1); 14192 } 14193 14194 static int 14195 test_authentication_verify_fail_when_tag_corrupted( 14196 struct crypto_testsuite_params *ts_params, 14197 struct crypto_unittest_params *ut_params, 14198 const struct test_crypto_vector *reference) 14199 { 14200 return test_authentication_verify_fail_when_data_corruption( 14201 ts_params, ut_params, reference, 0); 14202 } 14203 14204 static int 14205 test_authentication_verify_GMAC_fail_when_data_corrupted( 14206 struct crypto_testsuite_params *ts_params, 14207 struct crypto_unittest_params *ut_params, 14208 const struct test_crypto_vector *reference) 14209 { 14210 return test_authentication_verify_GMAC_fail_when_corruption( 14211 ts_params, ut_params, reference, 1); 14212 } 14213 14214 static int 14215 test_authentication_verify_GMAC_fail_when_tag_corrupted( 14216 struct crypto_testsuite_params *ts_params, 14217 struct crypto_unittest_params *ut_params, 14218 const struct test_crypto_vector *reference) 14219 { 14220 return test_authentication_verify_GMAC_fail_when_corruption( 14221 ts_params, ut_params, reference, 0); 14222 } 14223 14224 static int 14225 test_authenticated_decryption_fail_when_data_corrupted( 14226 struct crypto_testsuite_params *ts_params, 14227 struct crypto_unittest_params *ut_params, 14228 const struct test_crypto_vector *reference) 14229 { 14230 return test_authenticated_decryption_fail_when_corruption( 14231 ts_params, ut_params, reference, 1); 14232 } 14233 14234 static int 14235 test_authenticated_decryption_fail_when_tag_corrupted( 14236 struct crypto_testsuite_params *ts_params, 14237 struct crypto_unittest_params *ut_params, 14238 const struct test_crypto_vector *reference) 14239 { 14240 return test_authenticated_decryption_fail_when_corruption( 14241 ts_params, ut_params, reference, 0); 14242 } 14243 14244 static int 14245 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 14246 { 14247 return test_authentication_verify_fail_when_data_corrupted( 14248 &testsuite_params, &unittest_params, 14249 &hmac_sha1_test_crypto_vector); 14250 } 14251 14252 static int 14253 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 14254 { 14255 return test_authentication_verify_fail_when_tag_corrupted( 14256 &testsuite_params, &unittest_params, 14257 &hmac_sha1_test_crypto_vector); 14258 } 14259 14260 static int 14261 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 14262 { 14263 return test_authentication_verify_GMAC_fail_when_data_corrupted( 14264 &testsuite_params, &unittest_params, 14265 &aes128_gmac_test_vector); 14266 } 14267 14268 static int 14269 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 14270 { 14271 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 14272 &testsuite_params, &unittest_params, 14273 &aes128_gmac_test_vector); 14274 } 14275 14276 static int 14277 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 14278 { 14279 return test_authenticated_decryption_fail_when_data_corrupted( 14280 &testsuite_params, 14281 &unittest_params, 14282 &aes128cbc_hmac_sha1_test_vector); 14283 } 14284 14285 static int 14286 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 14287 { 14288 return test_authenticated_decryption_fail_when_tag_corrupted( 14289 &testsuite_params, 14290 &unittest_params, 14291 &aes128cbc_hmac_sha1_test_vector); 14292 } 14293 14294 static int 14295 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 14296 { 14297 return test_authenticated_encrypt_with_esn( 14298 &testsuite_params, 14299 &unittest_params, 14300 &aes128cbc_hmac_sha1_aad_test_vector); 14301 } 14302 14303 static int 14304 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 14305 { 14306 return test_authenticated_decrypt_with_esn( 14307 &testsuite_params, 14308 &unittest_params, 14309 &aes128cbc_hmac_sha1_aad_test_vector); 14310 } 14311 14312 static int 14313 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 14314 { 14315 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 14316 } 14317 14318 static int 14319 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 14320 { 14321 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 14322 } 14323 14324 static int 14325 test_chacha20_poly1305_encrypt_SGL_out_of_place(void) 14326 { 14327 return test_authenticated_encryption_SGL( 14328 &chacha20_poly1305_case_2, OUT_OF_PLACE, 32, 14329 chacha20_poly1305_case_2.plaintext.len); 14330 } 14331 14332 #ifdef RTE_CRYPTO_SCHEDULER 14333 14334 /* global AESNI worker IDs for the scheduler test */ 14335 uint8_t aesni_ids[2]; 14336 14337 static int 14338 scheduler_testsuite_setup(void) 14339 { 14340 uint32_t i = 0; 14341 int32_t nb_devs, ret; 14342 char vdev_args[VDEV_ARGS_SIZE] = {""}; 14343 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 14344 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 14345 uint16_t worker_core_count = 0; 14346 uint16_t socket_id = 0; 14347 14348 if (gbl_driver_id == rte_cryptodev_driver_id_get( 14349 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 14350 14351 /* Identify the Worker Cores 14352 * Use 2 worker cores for the device args 14353 */ 14354 RTE_LCORE_FOREACH_WORKER(i) { 14355 if (worker_core_count > 1) 14356 break; 14357 snprintf(vdev_args, sizeof(vdev_args), 14358 "%s%d", temp_str, i); 14359 strcpy(temp_str, vdev_args); 14360 strlcat(temp_str, ";", sizeof(temp_str)); 14361 worker_core_count++; 14362 socket_id = rte_lcore_to_socket_id(i); 14363 } 14364 if (worker_core_count != 2) { 14365 RTE_LOG(ERR, USER1, 14366 "Cryptodev scheduler test require at least " 14367 "two worker cores to run. " 14368 "Please use the correct coremask.\n"); 14369 return TEST_FAILED; 14370 } 14371 strcpy(temp_str, vdev_args); 14372 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 14373 temp_str, socket_id); 14374 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 14375 nb_devs = rte_cryptodev_device_count_by_driver( 14376 rte_cryptodev_driver_id_get( 14377 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 14378 if (nb_devs < 1) { 14379 ret = rte_vdev_init( 14380 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 14381 vdev_args); 14382 TEST_ASSERT(ret == 0, 14383 "Failed to create instance %u of pmd : %s", 14384 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 14385 } 14386 } 14387 return testsuite_setup(); 14388 } 14389 14390 static int 14391 test_scheduler_attach_worker_op(void) 14392 { 14393 struct crypto_testsuite_params *ts_params = &testsuite_params; 14394 uint8_t sched_id = ts_params->valid_devs[0]; 14395 uint32_t i, nb_devs_attached = 0; 14396 int ret; 14397 char vdev_name[32]; 14398 unsigned int count = rte_cryptodev_count(); 14399 14400 /* create 2 AESNI_MB vdevs on top of existing devices */ 14401 for (i = count; i < count + 2; i++) { 14402 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 14403 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 14404 i); 14405 ret = rte_vdev_init(vdev_name, NULL); 14406 14407 TEST_ASSERT(ret == 0, 14408 "Failed to create instance %u of" 14409 " pmd : %s", 14410 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14411 14412 if (ret < 0) { 14413 RTE_LOG(ERR, USER1, 14414 "Failed to create 2 AESNI MB PMDs.\n"); 14415 return TEST_SKIPPED; 14416 } 14417 } 14418 14419 /* attach 2 AESNI_MB cdevs */ 14420 for (i = count; i < count + 2; i++) { 14421 struct rte_cryptodev_info info; 14422 unsigned int session_size; 14423 14424 rte_cryptodev_info_get(i, &info); 14425 if (info.driver_id != rte_cryptodev_driver_id_get( 14426 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 14427 continue; 14428 14429 session_size = rte_cryptodev_sym_get_private_session_size(i); 14430 /* 14431 * Create the session mempool again, since now there are new devices 14432 * to use the mempool. 14433 */ 14434 if (ts_params->session_mpool) { 14435 rte_mempool_free(ts_params->session_mpool); 14436 ts_params->session_mpool = NULL; 14437 } 14438 if (ts_params->session_priv_mpool) { 14439 rte_mempool_free(ts_params->session_priv_mpool); 14440 ts_params->session_priv_mpool = NULL; 14441 } 14442 14443 if (info.sym.max_nb_sessions != 0 && 14444 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 14445 RTE_LOG(ERR, USER1, 14446 "Device does not support " 14447 "at least %u sessions\n", 14448 MAX_NB_SESSIONS); 14449 return TEST_FAILED; 14450 } 14451 /* 14452 * Create mempool with maximum number of sessions, 14453 * to include the session headers 14454 */ 14455 if (ts_params->session_mpool == NULL) { 14456 ts_params->session_mpool = 14457 rte_cryptodev_sym_session_pool_create( 14458 "test_sess_mp", 14459 MAX_NB_SESSIONS, 0, 0, 0, 14460 SOCKET_ID_ANY); 14461 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 14462 "session mempool allocation failed"); 14463 } 14464 14465 /* 14466 * Create mempool with maximum number of sessions, 14467 * to include device specific session private data 14468 */ 14469 if (ts_params->session_priv_mpool == NULL) { 14470 ts_params->session_priv_mpool = rte_mempool_create( 14471 "test_sess_mp_priv", 14472 MAX_NB_SESSIONS, 14473 session_size, 14474 0, 0, NULL, NULL, NULL, 14475 NULL, SOCKET_ID_ANY, 14476 0); 14477 14478 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 14479 "session mempool allocation failed"); 14480 } 14481 14482 ts_params->qp_conf.mp_session = ts_params->session_mpool; 14483 ts_params->qp_conf.mp_session_private = 14484 ts_params->session_priv_mpool; 14485 14486 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 14487 (uint8_t)i); 14488 14489 TEST_ASSERT(ret == 0, 14490 "Failed to attach device %u of pmd : %s", i, 14491 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14492 14493 aesni_ids[nb_devs_attached] = (uint8_t)i; 14494 14495 nb_devs_attached++; 14496 } 14497 14498 return 0; 14499 } 14500 14501 static int 14502 test_scheduler_detach_worker_op(void) 14503 { 14504 struct crypto_testsuite_params *ts_params = &testsuite_params; 14505 uint8_t sched_id = ts_params->valid_devs[0]; 14506 uint32_t i; 14507 int ret; 14508 14509 for (i = 0; i < 2; i++) { 14510 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 14511 aesni_ids[i]); 14512 TEST_ASSERT(ret == 0, 14513 "Failed to detach device %u", aesni_ids[i]); 14514 } 14515 14516 return 0; 14517 } 14518 14519 static int 14520 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 14521 { 14522 struct crypto_testsuite_params *ts_params = &testsuite_params; 14523 uint8_t sched_id = ts_params->valid_devs[0]; 14524 /* set mode */ 14525 return rte_cryptodev_scheduler_mode_set(sched_id, 14526 scheduler_mode); 14527 } 14528 14529 static int 14530 test_scheduler_mode_roundrobin_op(void) 14531 { 14532 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 14533 0, "Failed to set roundrobin mode"); 14534 return 0; 14535 14536 } 14537 14538 static int 14539 test_scheduler_mode_multicore_op(void) 14540 { 14541 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 14542 0, "Failed to set multicore mode"); 14543 14544 return 0; 14545 } 14546 14547 static int 14548 test_scheduler_mode_failover_op(void) 14549 { 14550 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 14551 0, "Failed to set failover mode"); 14552 14553 return 0; 14554 } 14555 14556 static int 14557 test_scheduler_mode_pkt_size_distr_op(void) 14558 { 14559 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 14560 0, "Failed to set pktsize mode"); 14561 14562 return 0; 14563 } 14564 14565 static int 14566 scheduler_multicore_testsuite_setup(void) 14567 { 14568 if (test_scheduler_attach_worker_op() < 0) 14569 return TEST_SKIPPED; 14570 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0) 14571 return TEST_SKIPPED; 14572 return 0; 14573 } 14574 14575 static int 14576 scheduler_roundrobin_testsuite_setup(void) 14577 { 14578 if (test_scheduler_attach_worker_op() < 0) 14579 return TEST_SKIPPED; 14580 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0) 14581 return TEST_SKIPPED; 14582 return 0; 14583 } 14584 14585 static int 14586 scheduler_failover_testsuite_setup(void) 14587 { 14588 if (test_scheduler_attach_worker_op() < 0) 14589 return TEST_SKIPPED; 14590 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0) 14591 return TEST_SKIPPED; 14592 return 0; 14593 } 14594 14595 static int 14596 scheduler_pkt_size_distr_testsuite_setup(void) 14597 { 14598 if (test_scheduler_attach_worker_op() < 0) 14599 return TEST_SKIPPED; 14600 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0) 14601 return TEST_SKIPPED; 14602 return 0; 14603 } 14604 14605 static void 14606 scheduler_mode_testsuite_teardown(void) 14607 { 14608 test_scheduler_detach_worker_op(); 14609 } 14610 14611 #endif /* RTE_CRYPTO_SCHEDULER */ 14612 14613 static struct unit_test_suite end_testsuite = { 14614 .suite_name = NULL, 14615 .setup = NULL, 14616 .teardown = NULL, 14617 .unit_test_suites = NULL 14618 }; 14619 14620 #ifdef RTE_LIB_SECURITY 14621 static struct unit_test_suite ipsec_proto_testsuite = { 14622 .suite_name = "IPsec Proto Unit Test Suite", 14623 .setup = ipsec_proto_testsuite_setup, 14624 .unit_test_cases = { 14625 TEST_CASE_NAMED_WITH_DATA( 14626 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 14627 ut_setup_security, ut_teardown, 14628 test_ipsec_proto_known_vec, &pkt_aes_128_gcm), 14629 TEST_CASE_NAMED_WITH_DATA( 14630 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 14631 ut_setup_security, ut_teardown, 14632 test_ipsec_proto_known_vec, &pkt_aes_192_gcm), 14633 TEST_CASE_NAMED_WITH_DATA( 14634 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 14635 ut_setup_security, ut_teardown, 14636 test_ipsec_proto_known_vec, &pkt_aes_256_gcm), 14637 TEST_CASE_NAMED_WITH_DATA( 14638 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])", 14639 ut_setup_security, ut_teardown, 14640 test_ipsec_proto_known_vec, 14641 &pkt_aes_128_cbc_hmac_sha256), 14642 TEST_CASE_NAMED_WITH_DATA( 14643 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])", 14644 ut_setup_security, ut_teardown, 14645 test_ipsec_proto_known_vec, 14646 &pkt_aes_128_cbc_hmac_sha384), 14647 TEST_CASE_NAMED_WITH_DATA( 14648 "Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])", 14649 ut_setup_security, ut_teardown, 14650 test_ipsec_proto_known_vec, 14651 &pkt_aes_128_cbc_hmac_sha512), 14652 TEST_CASE_NAMED_WITH_DATA( 14653 "Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)", 14654 ut_setup_security, ut_teardown, 14655 test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6), 14656 TEST_CASE_NAMED_WITH_DATA( 14657 "Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])", 14658 ut_setup_security, ut_teardown, 14659 test_ipsec_proto_known_vec, 14660 &pkt_aes_128_cbc_hmac_sha256_v6), 14661 TEST_CASE_NAMED_WITH_DATA( 14662 "Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])", 14663 ut_setup_security, ut_teardown, 14664 test_ipsec_proto_known_vec, 14665 &pkt_null_aes_xcbc), 14666 TEST_CASE_NAMED_WITH_DATA( 14667 "Outbound fragmented packet", 14668 ut_setup_security, ut_teardown, 14669 test_ipsec_proto_known_vec_fragmented, 14670 &pkt_aes_128_gcm_frag), 14671 TEST_CASE_NAMED_WITH_DATA( 14672 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 14673 ut_setup_security, ut_teardown, 14674 test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm), 14675 TEST_CASE_NAMED_WITH_DATA( 14676 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 14677 ut_setup_security, ut_teardown, 14678 test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm), 14679 TEST_CASE_NAMED_WITH_DATA( 14680 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 14681 ut_setup_security, ut_teardown, 14682 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm), 14683 TEST_CASE_NAMED_WITH_DATA( 14684 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)", 14685 ut_setup_security, ut_teardown, 14686 test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null), 14687 TEST_CASE_NAMED_WITH_DATA( 14688 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])", 14689 ut_setup_security, ut_teardown, 14690 test_ipsec_proto_known_vec_inb, 14691 &pkt_aes_128_cbc_hmac_sha256), 14692 TEST_CASE_NAMED_WITH_DATA( 14693 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])", 14694 ut_setup_security, ut_teardown, 14695 test_ipsec_proto_known_vec_inb, 14696 &pkt_aes_128_cbc_hmac_sha384), 14697 TEST_CASE_NAMED_WITH_DATA( 14698 "Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])", 14699 ut_setup_security, ut_teardown, 14700 test_ipsec_proto_known_vec_inb, 14701 &pkt_aes_128_cbc_hmac_sha512), 14702 TEST_CASE_NAMED_WITH_DATA( 14703 "Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)", 14704 ut_setup_security, ut_teardown, 14705 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6), 14706 TEST_CASE_NAMED_WITH_DATA( 14707 "Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])", 14708 ut_setup_security, ut_teardown, 14709 test_ipsec_proto_known_vec_inb, 14710 &pkt_aes_128_cbc_hmac_sha256_v6), 14711 TEST_CASE_NAMED_WITH_DATA( 14712 "Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])", 14713 ut_setup_security, ut_teardown, 14714 test_ipsec_proto_known_vec_inb, 14715 &pkt_null_aes_xcbc), 14716 TEST_CASE_NAMED_ST( 14717 "Combined test alg list", 14718 ut_setup_security, ut_teardown, 14719 test_ipsec_proto_display_list), 14720 TEST_CASE_NAMED_ST( 14721 "IV generation", 14722 ut_setup_security, ut_teardown, 14723 test_ipsec_proto_iv_gen), 14724 TEST_CASE_NAMED_ST( 14725 "UDP encapsulation", 14726 ut_setup_security, ut_teardown, 14727 test_ipsec_proto_udp_encap), 14728 TEST_CASE_NAMED_ST( 14729 "UDP encapsulation ports verification test", 14730 ut_setup_security, ut_teardown, 14731 test_ipsec_proto_udp_ports_verify), 14732 TEST_CASE_NAMED_ST( 14733 "SA expiry packets soft", 14734 ut_setup_security, ut_teardown, 14735 test_ipsec_proto_sa_exp_pkts_soft), 14736 TEST_CASE_NAMED_ST( 14737 "SA expiry packets hard", 14738 ut_setup_security, ut_teardown, 14739 test_ipsec_proto_sa_exp_pkts_hard), 14740 TEST_CASE_NAMED_ST( 14741 "Negative test: ICV corruption", 14742 ut_setup_security, ut_teardown, 14743 test_ipsec_proto_err_icv_corrupt), 14744 TEST_CASE_NAMED_ST( 14745 "Tunnel dst addr verification", 14746 ut_setup_security, ut_teardown, 14747 test_ipsec_proto_tunnel_dst_addr_verify), 14748 TEST_CASE_NAMED_ST( 14749 "Tunnel src and dst addr verification", 14750 ut_setup_security, ut_teardown, 14751 test_ipsec_proto_tunnel_src_dst_addr_verify), 14752 TEST_CASE_NAMED_ST( 14753 "Inner IP checksum", 14754 ut_setup_security, ut_teardown, 14755 test_ipsec_proto_inner_ip_csum), 14756 TEST_CASE_NAMED_ST( 14757 "Inner L4 checksum", 14758 ut_setup_security, ut_teardown, 14759 test_ipsec_proto_inner_l4_csum), 14760 TEST_CASE_NAMED_ST( 14761 "Tunnel IPv4 in IPv4", 14762 ut_setup_security, ut_teardown, 14763 test_ipsec_proto_tunnel_v4_in_v4), 14764 TEST_CASE_NAMED_ST( 14765 "Tunnel IPv6 in IPv6", 14766 ut_setup_security, ut_teardown, 14767 test_ipsec_proto_tunnel_v6_in_v6), 14768 TEST_CASE_NAMED_ST( 14769 "Tunnel IPv4 in IPv6", 14770 ut_setup_security, ut_teardown, 14771 test_ipsec_proto_tunnel_v4_in_v6), 14772 TEST_CASE_NAMED_ST( 14773 "Tunnel IPv6 in IPv4", 14774 ut_setup_security, ut_teardown, 14775 test_ipsec_proto_tunnel_v6_in_v4), 14776 TEST_CASE_NAMED_ST( 14777 "Transport IPv4", 14778 ut_setup_security, ut_teardown, 14779 test_ipsec_proto_transport_v4), 14780 TEST_CASE_NAMED_ST( 14781 "Statistics: success", 14782 ut_setup_security, ut_teardown, 14783 test_ipsec_proto_stats), 14784 TEST_CASE_NAMED_ST( 14785 "Fragmented packet", 14786 ut_setup_security, ut_teardown, 14787 test_ipsec_proto_pkt_fragment), 14788 TEST_CASE_NAMED_ST( 14789 "Tunnel header copy DF (inner 0)", 14790 ut_setup_security, ut_teardown, 14791 test_ipsec_proto_copy_df_inner_0), 14792 TEST_CASE_NAMED_ST( 14793 "Tunnel header copy DF (inner 1)", 14794 ut_setup_security, ut_teardown, 14795 test_ipsec_proto_copy_df_inner_1), 14796 TEST_CASE_NAMED_ST( 14797 "Tunnel header set DF 0 (inner 1)", 14798 ut_setup_security, ut_teardown, 14799 test_ipsec_proto_set_df_0_inner_1), 14800 TEST_CASE_NAMED_ST( 14801 "Tunnel header set DF 1 (inner 0)", 14802 ut_setup_security, ut_teardown, 14803 test_ipsec_proto_set_df_1_inner_0), 14804 TEST_CASES_END() /**< NULL terminate unit test array */ 14805 } 14806 }; 14807 14808 static struct unit_test_suite pdcp_proto_testsuite = { 14809 .suite_name = "PDCP Proto Unit Test Suite", 14810 .setup = pdcp_proto_testsuite_setup, 14811 .unit_test_cases = { 14812 TEST_CASE_ST(ut_setup_security, ut_teardown, 14813 test_PDCP_PROTO_all), 14814 TEST_CASES_END() /**< NULL terminate unit test array */ 14815 } 14816 }; 14817 14818 #define ADD_UPLINK_TESTCASE(data) \ 14819 TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security, \ 14820 ut_teardown, test_docsis_proto_uplink, (const void *) &data), \ 14821 14822 #define ADD_DOWNLINK_TESTCASE(data) \ 14823 TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security, \ 14824 ut_teardown, test_docsis_proto_downlink, (const void *) &data), \ 14825 14826 static struct unit_test_suite docsis_proto_testsuite = { 14827 .suite_name = "DOCSIS Proto Unit Test Suite", 14828 .setup = docsis_proto_testsuite_setup, 14829 .unit_test_cases = { 14830 /* Uplink */ 14831 ADD_UPLINK_TESTCASE(docsis_test_case_1) 14832 ADD_UPLINK_TESTCASE(docsis_test_case_2) 14833 ADD_UPLINK_TESTCASE(docsis_test_case_3) 14834 ADD_UPLINK_TESTCASE(docsis_test_case_4) 14835 ADD_UPLINK_TESTCASE(docsis_test_case_5) 14836 ADD_UPLINK_TESTCASE(docsis_test_case_6) 14837 ADD_UPLINK_TESTCASE(docsis_test_case_7) 14838 ADD_UPLINK_TESTCASE(docsis_test_case_8) 14839 ADD_UPLINK_TESTCASE(docsis_test_case_9) 14840 ADD_UPLINK_TESTCASE(docsis_test_case_10) 14841 ADD_UPLINK_TESTCASE(docsis_test_case_11) 14842 ADD_UPLINK_TESTCASE(docsis_test_case_12) 14843 ADD_UPLINK_TESTCASE(docsis_test_case_13) 14844 ADD_UPLINK_TESTCASE(docsis_test_case_14) 14845 ADD_UPLINK_TESTCASE(docsis_test_case_15) 14846 ADD_UPLINK_TESTCASE(docsis_test_case_16) 14847 ADD_UPLINK_TESTCASE(docsis_test_case_17) 14848 ADD_UPLINK_TESTCASE(docsis_test_case_18) 14849 ADD_UPLINK_TESTCASE(docsis_test_case_19) 14850 ADD_UPLINK_TESTCASE(docsis_test_case_20) 14851 ADD_UPLINK_TESTCASE(docsis_test_case_21) 14852 ADD_UPLINK_TESTCASE(docsis_test_case_22) 14853 ADD_UPLINK_TESTCASE(docsis_test_case_23) 14854 ADD_UPLINK_TESTCASE(docsis_test_case_24) 14855 ADD_UPLINK_TESTCASE(docsis_test_case_25) 14856 ADD_UPLINK_TESTCASE(docsis_test_case_26) 14857 /* Downlink */ 14858 ADD_DOWNLINK_TESTCASE(docsis_test_case_1) 14859 ADD_DOWNLINK_TESTCASE(docsis_test_case_2) 14860 ADD_DOWNLINK_TESTCASE(docsis_test_case_3) 14861 ADD_DOWNLINK_TESTCASE(docsis_test_case_4) 14862 ADD_DOWNLINK_TESTCASE(docsis_test_case_5) 14863 ADD_DOWNLINK_TESTCASE(docsis_test_case_6) 14864 ADD_DOWNLINK_TESTCASE(docsis_test_case_7) 14865 ADD_DOWNLINK_TESTCASE(docsis_test_case_8) 14866 ADD_DOWNLINK_TESTCASE(docsis_test_case_9) 14867 ADD_DOWNLINK_TESTCASE(docsis_test_case_10) 14868 ADD_DOWNLINK_TESTCASE(docsis_test_case_11) 14869 ADD_DOWNLINK_TESTCASE(docsis_test_case_12) 14870 ADD_DOWNLINK_TESTCASE(docsis_test_case_13) 14871 ADD_DOWNLINK_TESTCASE(docsis_test_case_14) 14872 ADD_DOWNLINK_TESTCASE(docsis_test_case_15) 14873 ADD_DOWNLINK_TESTCASE(docsis_test_case_16) 14874 ADD_DOWNLINK_TESTCASE(docsis_test_case_17) 14875 ADD_DOWNLINK_TESTCASE(docsis_test_case_18) 14876 ADD_DOWNLINK_TESTCASE(docsis_test_case_19) 14877 ADD_DOWNLINK_TESTCASE(docsis_test_case_20) 14878 ADD_DOWNLINK_TESTCASE(docsis_test_case_21) 14879 ADD_DOWNLINK_TESTCASE(docsis_test_case_22) 14880 ADD_DOWNLINK_TESTCASE(docsis_test_case_23) 14881 ADD_DOWNLINK_TESTCASE(docsis_test_case_24) 14882 ADD_DOWNLINK_TESTCASE(docsis_test_case_25) 14883 ADD_DOWNLINK_TESTCASE(docsis_test_case_26) 14884 TEST_CASES_END() /**< NULL terminate unit test array */ 14885 } 14886 }; 14887 #endif 14888 14889 static struct unit_test_suite cryptodev_gen_testsuite = { 14890 .suite_name = "Crypto General Unit Test Suite", 14891 .setup = crypto_gen_testsuite_setup, 14892 .unit_test_cases = { 14893 TEST_CASE_ST(ut_setup, ut_teardown, 14894 test_device_configure_invalid_dev_id), 14895 TEST_CASE_ST(ut_setup, ut_teardown, 14896 test_queue_pair_descriptor_setup), 14897 TEST_CASE_ST(ut_setup, ut_teardown, 14898 test_device_configure_invalid_queue_pair_ids), 14899 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 14900 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup), 14901 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup), 14902 TEST_CASES_END() /**< NULL terminate unit test array */ 14903 } 14904 }; 14905 14906 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = { 14907 .suite_name = "Negative HMAC SHA1 Unit Test Suite", 14908 .setup = negative_hmac_sha1_testsuite_setup, 14909 .unit_test_cases = { 14910 /** Negative tests */ 14911 TEST_CASE_ST(ut_setup, ut_teardown, 14912 authentication_verify_HMAC_SHA1_fail_data_corrupt), 14913 TEST_CASE_ST(ut_setup, ut_teardown, 14914 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 14915 TEST_CASE_ST(ut_setup, ut_teardown, 14916 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 14917 TEST_CASE_ST(ut_setup, ut_teardown, 14918 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 14919 14920 TEST_CASES_END() /**< NULL terminate unit test array */ 14921 } 14922 }; 14923 14924 static struct unit_test_suite cryptodev_multi_session_testsuite = { 14925 .suite_name = "Multi Session Unit Test Suite", 14926 .setup = multi_session_testsuite_setup, 14927 .unit_test_cases = { 14928 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 14929 TEST_CASE_ST(ut_setup, ut_teardown, 14930 test_multi_session_random_usage), 14931 14932 TEST_CASES_END() /**< NULL terminate unit test array */ 14933 } 14934 }; 14935 14936 static struct unit_test_suite cryptodev_null_testsuite = { 14937 .suite_name = "NULL Test Suite", 14938 .setup = null_testsuite_setup, 14939 .unit_test_cases = { 14940 TEST_CASE_ST(ut_setup, ut_teardown, 14941 test_null_invalid_operation), 14942 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 14943 TEST_CASES_END() 14944 } 14945 }; 14946 14947 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = { 14948 .suite_name = "AES CCM Authenticated Test Suite", 14949 .setup = aes_ccm_auth_testsuite_setup, 14950 .unit_test_cases = { 14951 /** AES CCM Authenticated Encryption 128 bits key*/ 14952 TEST_CASE_ST(ut_setup, ut_teardown, 14953 test_AES_CCM_authenticated_encryption_test_case_128_1), 14954 TEST_CASE_ST(ut_setup, ut_teardown, 14955 test_AES_CCM_authenticated_encryption_test_case_128_2), 14956 TEST_CASE_ST(ut_setup, ut_teardown, 14957 test_AES_CCM_authenticated_encryption_test_case_128_3), 14958 14959 /** AES CCM Authenticated Decryption 128 bits key*/ 14960 TEST_CASE_ST(ut_setup, ut_teardown, 14961 test_AES_CCM_authenticated_decryption_test_case_128_1), 14962 TEST_CASE_ST(ut_setup, ut_teardown, 14963 test_AES_CCM_authenticated_decryption_test_case_128_2), 14964 TEST_CASE_ST(ut_setup, ut_teardown, 14965 test_AES_CCM_authenticated_decryption_test_case_128_3), 14966 14967 /** AES CCM Authenticated Encryption 192 bits key */ 14968 TEST_CASE_ST(ut_setup, ut_teardown, 14969 test_AES_CCM_authenticated_encryption_test_case_192_1), 14970 TEST_CASE_ST(ut_setup, ut_teardown, 14971 test_AES_CCM_authenticated_encryption_test_case_192_2), 14972 TEST_CASE_ST(ut_setup, ut_teardown, 14973 test_AES_CCM_authenticated_encryption_test_case_192_3), 14974 14975 /** AES CCM Authenticated Decryption 192 bits key*/ 14976 TEST_CASE_ST(ut_setup, ut_teardown, 14977 test_AES_CCM_authenticated_decryption_test_case_192_1), 14978 TEST_CASE_ST(ut_setup, ut_teardown, 14979 test_AES_CCM_authenticated_decryption_test_case_192_2), 14980 TEST_CASE_ST(ut_setup, ut_teardown, 14981 test_AES_CCM_authenticated_decryption_test_case_192_3), 14982 14983 /** AES CCM Authenticated Encryption 256 bits key */ 14984 TEST_CASE_ST(ut_setup, ut_teardown, 14985 test_AES_CCM_authenticated_encryption_test_case_256_1), 14986 TEST_CASE_ST(ut_setup, ut_teardown, 14987 test_AES_CCM_authenticated_encryption_test_case_256_2), 14988 TEST_CASE_ST(ut_setup, ut_teardown, 14989 test_AES_CCM_authenticated_encryption_test_case_256_3), 14990 14991 /** AES CCM Authenticated Decryption 256 bits key*/ 14992 TEST_CASE_ST(ut_setup, ut_teardown, 14993 test_AES_CCM_authenticated_decryption_test_case_256_1), 14994 TEST_CASE_ST(ut_setup, ut_teardown, 14995 test_AES_CCM_authenticated_decryption_test_case_256_2), 14996 TEST_CASE_ST(ut_setup, ut_teardown, 14997 test_AES_CCM_authenticated_decryption_test_case_256_3), 14998 TEST_CASES_END() 14999 } 15000 }; 15001 15002 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = { 15003 .suite_name = "AES GCM Authenticated Test Suite", 15004 .setup = aes_gcm_auth_testsuite_setup, 15005 .unit_test_cases = { 15006 /** AES GCM Authenticated Encryption */ 15007 TEST_CASE_ST(ut_setup, ut_teardown, 15008 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 15009 TEST_CASE_ST(ut_setup, ut_teardown, 15010 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 15011 TEST_CASE_ST(ut_setup, ut_teardown, 15012 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 15013 TEST_CASE_ST(ut_setup, ut_teardown, 15014 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 15015 TEST_CASE_ST(ut_setup, ut_teardown, 15016 test_AES_GCM_authenticated_encryption_test_case_1), 15017 TEST_CASE_ST(ut_setup, ut_teardown, 15018 test_AES_GCM_authenticated_encryption_test_case_2), 15019 TEST_CASE_ST(ut_setup, ut_teardown, 15020 test_AES_GCM_authenticated_encryption_test_case_3), 15021 TEST_CASE_ST(ut_setup, ut_teardown, 15022 test_AES_GCM_authenticated_encryption_test_case_4), 15023 TEST_CASE_ST(ut_setup, ut_teardown, 15024 test_AES_GCM_authenticated_encryption_test_case_5), 15025 TEST_CASE_ST(ut_setup, ut_teardown, 15026 test_AES_GCM_authenticated_encryption_test_case_6), 15027 TEST_CASE_ST(ut_setup, ut_teardown, 15028 test_AES_GCM_authenticated_encryption_test_case_7), 15029 TEST_CASE_ST(ut_setup, ut_teardown, 15030 test_AES_GCM_authenticated_encryption_test_case_8), 15031 TEST_CASE_ST(ut_setup, ut_teardown, 15032 test_AES_GCM_J0_authenticated_encryption_test_case_1), 15033 15034 /** AES GCM Authenticated Decryption */ 15035 TEST_CASE_ST(ut_setup, ut_teardown, 15036 test_AES_GCM_authenticated_decryption_test_case_1), 15037 TEST_CASE_ST(ut_setup, ut_teardown, 15038 test_AES_GCM_authenticated_decryption_test_case_2), 15039 TEST_CASE_ST(ut_setup, ut_teardown, 15040 test_AES_GCM_authenticated_decryption_test_case_3), 15041 TEST_CASE_ST(ut_setup, ut_teardown, 15042 test_AES_GCM_authenticated_decryption_test_case_4), 15043 TEST_CASE_ST(ut_setup, ut_teardown, 15044 test_AES_GCM_authenticated_decryption_test_case_5), 15045 TEST_CASE_ST(ut_setup, ut_teardown, 15046 test_AES_GCM_authenticated_decryption_test_case_6), 15047 TEST_CASE_ST(ut_setup, ut_teardown, 15048 test_AES_GCM_authenticated_decryption_test_case_7), 15049 TEST_CASE_ST(ut_setup, ut_teardown, 15050 test_AES_GCM_authenticated_decryption_test_case_8), 15051 TEST_CASE_ST(ut_setup, ut_teardown, 15052 test_AES_GCM_J0_authenticated_decryption_test_case_1), 15053 15054 /** AES GCM Authenticated Encryption 192 bits key */ 15055 TEST_CASE_ST(ut_setup, ut_teardown, 15056 test_AES_GCM_auth_encryption_test_case_192_1), 15057 TEST_CASE_ST(ut_setup, ut_teardown, 15058 test_AES_GCM_auth_encryption_test_case_192_2), 15059 TEST_CASE_ST(ut_setup, ut_teardown, 15060 test_AES_GCM_auth_encryption_test_case_192_3), 15061 TEST_CASE_ST(ut_setup, ut_teardown, 15062 test_AES_GCM_auth_encryption_test_case_192_4), 15063 TEST_CASE_ST(ut_setup, ut_teardown, 15064 test_AES_GCM_auth_encryption_test_case_192_5), 15065 TEST_CASE_ST(ut_setup, ut_teardown, 15066 test_AES_GCM_auth_encryption_test_case_192_6), 15067 TEST_CASE_ST(ut_setup, ut_teardown, 15068 test_AES_GCM_auth_encryption_test_case_192_7), 15069 15070 /** AES GCM Authenticated Decryption 192 bits key */ 15071 TEST_CASE_ST(ut_setup, ut_teardown, 15072 test_AES_GCM_auth_decryption_test_case_192_1), 15073 TEST_CASE_ST(ut_setup, ut_teardown, 15074 test_AES_GCM_auth_decryption_test_case_192_2), 15075 TEST_CASE_ST(ut_setup, ut_teardown, 15076 test_AES_GCM_auth_decryption_test_case_192_3), 15077 TEST_CASE_ST(ut_setup, ut_teardown, 15078 test_AES_GCM_auth_decryption_test_case_192_4), 15079 TEST_CASE_ST(ut_setup, ut_teardown, 15080 test_AES_GCM_auth_decryption_test_case_192_5), 15081 TEST_CASE_ST(ut_setup, ut_teardown, 15082 test_AES_GCM_auth_decryption_test_case_192_6), 15083 TEST_CASE_ST(ut_setup, ut_teardown, 15084 test_AES_GCM_auth_decryption_test_case_192_7), 15085 15086 /** AES GCM Authenticated Encryption 256 bits key */ 15087 TEST_CASE_ST(ut_setup, ut_teardown, 15088 test_AES_GCM_auth_encryption_test_case_256_1), 15089 TEST_CASE_ST(ut_setup, ut_teardown, 15090 test_AES_GCM_auth_encryption_test_case_256_2), 15091 TEST_CASE_ST(ut_setup, ut_teardown, 15092 test_AES_GCM_auth_encryption_test_case_256_3), 15093 TEST_CASE_ST(ut_setup, ut_teardown, 15094 test_AES_GCM_auth_encryption_test_case_256_4), 15095 TEST_CASE_ST(ut_setup, ut_teardown, 15096 test_AES_GCM_auth_encryption_test_case_256_5), 15097 TEST_CASE_ST(ut_setup, ut_teardown, 15098 test_AES_GCM_auth_encryption_test_case_256_6), 15099 TEST_CASE_ST(ut_setup, ut_teardown, 15100 test_AES_GCM_auth_encryption_test_case_256_7), 15101 15102 /** AES GCM Authenticated Decryption 256 bits key */ 15103 TEST_CASE_ST(ut_setup, ut_teardown, 15104 test_AES_GCM_auth_decryption_test_case_256_1), 15105 TEST_CASE_ST(ut_setup, ut_teardown, 15106 test_AES_GCM_auth_decryption_test_case_256_2), 15107 TEST_CASE_ST(ut_setup, ut_teardown, 15108 test_AES_GCM_auth_decryption_test_case_256_3), 15109 TEST_CASE_ST(ut_setup, ut_teardown, 15110 test_AES_GCM_auth_decryption_test_case_256_4), 15111 TEST_CASE_ST(ut_setup, ut_teardown, 15112 test_AES_GCM_auth_decryption_test_case_256_5), 15113 TEST_CASE_ST(ut_setup, ut_teardown, 15114 test_AES_GCM_auth_decryption_test_case_256_6), 15115 TEST_CASE_ST(ut_setup, ut_teardown, 15116 test_AES_GCM_auth_decryption_test_case_256_7), 15117 15118 /** AES GCM Authenticated Encryption big aad size */ 15119 TEST_CASE_ST(ut_setup, ut_teardown, 15120 test_AES_GCM_auth_encryption_test_case_aad_1), 15121 TEST_CASE_ST(ut_setup, ut_teardown, 15122 test_AES_GCM_auth_encryption_test_case_aad_2), 15123 15124 /** AES GCM Authenticated Decryption big aad size */ 15125 TEST_CASE_ST(ut_setup, ut_teardown, 15126 test_AES_GCM_auth_decryption_test_case_aad_1), 15127 TEST_CASE_ST(ut_setup, ut_teardown, 15128 test_AES_GCM_auth_decryption_test_case_aad_2), 15129 15130 /** Out of place tests */ 15131 TEST_CASE_ST(ut_setup, ut_teardown, 15132 test_AES_GCM_authenticated_encryption_oop_test_case_1), 15133 TEST_CASE_ST(ut_setup, ut_teardown, 15134 test_AES_GCM_authenticated_decryption_oop_test_case_1), 15135 15136 /** Session-less tests */ 15137 TEST_CASE_ST(ut_setup, ut_teardown, 15138 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 15139 TEST_CASE_ST(ut_setup, ut_teardown, 15140 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 15141 15142 TEST_CASES_END() 15143 } 15144 }; 15145 15146 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = { 15147 .suite_name = "AES GMAC Authentication Test Suite", 15148 .setup = aes_gmac_auth_testsuite_setup, 15149 .unit_test_cases = { 15150 TEST_CASE_ST(ut_setup, ut_teardown, 15151 test_AES_GMAC_authentication_test_case_1), 15152 TEST_CASE_ST(ut_setup, ut_teardown, 15153 test_AES_GMAC_authentication_verify_test_case_1), 15154 TEST_CASE_ST(ut_setup, ut_teardown, 15155 test_AES_GMAC_authentication_test_case_2), 15156 TEST_CASE_ST(ut_setup, ut_teardown, 15157 test_AES_GMAC_authentication_verify_test_case_2), 15158 TEST_CASE_ST(ut_setup, ut_teardown, 15159 test_AES_GMAC_authentication_test_case_3), 15160 TEST_CASE_ST(ut_setup, ut_teardown, 15161 test_AES_GMAC_authentication_verify_test_case_3), 15162 TEST_CASE_ST(ut_setup, ut_teardown, 15163 test_AES_GMAC_authentication_test_case_4), 15164 TEST_CASE_ST(ut_setup, ut_teardown, 15165 test_AES_GMAC_authentication_verify_test_case_4), 15166 TEST_CASE_ST(ut_setup, ut_teardown, 15167 test_AES_GMAC_authentication_SGL_40B), 15168 TEST_CASE_ST(ut_setup, ut_teardown, 15169 test_AES_GMAC_authentication_SGL_80B), 15170 TEST_CASE_ST(ut_setup, ut_teardown, 15171 test_AES_GMAC_authentication_SGL_2048B), 15172 TEST_CASE_ST(ut_setup, ut_teardown, 15173 test_AES_GMAC_authentication_SGL_2047B), 15174 15175 TEST_CASES_END() 15176 } 15177 }; 15178 15179 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = { 15180 .suite_name = "Chacha20-Poly1305 Test Suite", 15181 .setup = chacha20_poly1305_testsuite_setup, 15182 .unit_test_cases = { 15183 TEST_CASE_ST(ut_setup, ut_teardown, 15184 test_chacha20_poly1305_encrypt_test_case_rfc8439), 15185 TEST_CASE_ST(ut_setup, ut_teardown, 15186 test_chacha20_poly1305_decrypt_test_case_rfc8439), 15187 TEST_CASE_ST(ut_setup, ut_teardown, 15188 test_chacha20_poly1305_encrypt_SGL_out_of_place), 15189 TEST_CASES_END() 15190 } 15191 }; 15192 15193 static struct unit_test_suite cryptodev_snow3g_testsuite = { 15194 .suite_name = "SNOW 3G Test Suite", 15195 .setup = snow3g_testsuite_setup, 15196 .unit_test_cases = { 15197 /** SNOW 3G encrypt only (UEA2) */ 15198 TEST_CASE_ST(ut_setup, ut_teardown, 15199 test_snow3g_encryption_test_case_1), 15200 TEST_CASE_ST(ut_setup, ut_teardown, 15201 test_snow3g_encryption_test_case_2), 15202 TEST_CASE_ST(ut_setup, ut_teardown, 15203 test_snow3g_encryption_test_case_3), 15204 TEST_CASE_ST(ut_setup, ut_teardown, 15205 test_snow3g_encryption_test_case_4), 15206 TEST_CASE_ST(ut_setup, ut_teardown, 15207 test_snow3g_encryption_test_case_5), 15208 15209 TEST_CASE_ST(ut_setup, ut_teardown, 15210 test_snow3g_encryption_test_case_1_oop), 15211 TEST_CASE_ST(ut_setup, ut_teardown, 15212 test_snow3g_encryption_test_case_1_oop_sgl), 15213 TEST_CASE_ST(ut_setup, ut_teardown, 15214 test_snow3g_encryption_test_case_1_offset_oop), 15215 TEST_CASE_ST(ut_setup, ut_teardown, 15216 test_snow3g_decryption_test_case_1_oop), 15217 15218 /** SNOW 3G generate auth, then encrypt (UEA2) */ 15219 TEST_CASE_ST(ut_setup, ut_teardown, 15220 test_snow3g_auth_cipher_test_case_1), 15221 TEST_CASE_ST(ut_setup, ut_teardown, 15222 test_snow3g_auth_cipher_test_case_2), 15223 TEST_CASE_ST(ut_setup, ut_teardown, 15224 test_snow3g_auth_cipher_test_case_2_oop), 15225 TEST_CASE_ST(ut_setup, ut_teardown, 15226 test_snow3g_auth_cipher_part_digest_enc), 15227 TEST_CASE_ST(ut_setup, ut_teardown, 15228 test_snow3g_auth_cipher_part_digest_enc_oop), 15229 TEST_CASE_ST(ut_setup, ut_teardown, 15230 test_snow3g_auth_cipher_test_case_3_sgl), 15231 TEST_CASE_ST(ut_setup, ut_teardown, 15232 test_snow3g_auth_cipher_test_case_3_oop_sgl), 15233 TEST_CASE_ST(ut_setup, ut_teardown, 15234 test_snow3g_auth_cipher_part_digest_enc_sgl), 15235 TEST_CASE_ST(ut_setup, ut_teardown, 15236 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 15237 15238 /** SNOW 3G decrypt (UEA2), then verify auth */ 15239 TEST_CASE_ST(ut_setup, ut_teardown, 15240 test_snow3g_auth_cipher_verify_test_case_1), 15241 TEST_CASE_ST(ut_setup, ut_teardown, 15242 test_snow3g_auth_cipher_verify_test_case_2), 15243 TEST_CASE_ST(ut_setup, ut_teardown, 15244 test_snow3g_auth_cipher_verify_test_case_2_oop), 15245 TEST_CASE_ST(ut_setup, ut_teardown, 15246 test_snow3g_auth_cipher_verify_part_digest_enc), 15247 TEST_CASE_ST(ut_setup, ut_teardown, 15248 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 15249 TEST_CASE_ST(ut_setup, ut_teardown, 15250 test_snow3g_auth_cipher_verify_test_case_3_sgl), 15251 TEST_CASE_ST(ut_setup, ut_teardown, 15252 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 15253 TEST_CASE_ST(ut_setup, ut_teardown, 15254 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 15255 TEST_CASE_ST(ut_setup, ut_teardown, 15256 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 15257 15258 /** SNOW 3G decrypt only (UEA2) */ 15259 TEST_CASE_ST(ut_setup, ut_teardown, 15260 test_snow3g_decryption_test_case_1), 15261 TEST_CASE_ST(ut_setup, ut_teardown, 15262 test_snow3g_decryption_test_case_2), 15263 TEST_CASE_ST(ut_setup, ut_teardown, 15264 test_snow3g_decryption_test_case_3), 15265 TEST_CASE_ST(ut_setup, ut_teardown, 15266 test_snow3g_decryption_test_case_4), 15267 TEST_CASE_ST(ut_setup, ut_teardown, 15268 test_snow3g_decryption_test_case_5), 15269 TEST_CASE_ST(ut_setup, ut_teardown, 15270 test_snow3g_decryption_with_digest_test_case_1), 15271 TEST_CASE_ST(ut_setup, ut_teardown, 15272 test_snow3g_hash_generate_test_case_1), 15273 TEST_CASE_ST(ut_setup, ut_teardown, 15274 test_snow3g_hash_generate_test_case_2), 15275 TEST_CASE_ST(ut_setup, ut_teardown, 15276 test_snow3g_hash_generate_test_case_3), 15277 15278 /* Tests with buffers which length is not byte-aligned */ 15279 TEST_CASE_ST(ut_setup, ut_teardown, 15280 test_snow3g_hash_generate_test_case_4), 15281 TEST_CASE_ST(ut_setup, ut_teardown, 15282 test_snow3g_hash_generate_test_case_5), 15283 TEST_CASE_ST(ut_setup, ut_teardown, 15284 test_snow3g_hash_generate_test_case_6), 15285 TEST_CASE_ST(ut_setup, ut_teardown, 15286 test_snow3g_hash_verify_test_case_1), 15287 TEST_CASE_ST(ut_setup, ut_teardown, 15288 test_snow3g_hash_verify_test_case_2), 15289 TEST_CASE_ST(ut_setup, ut_teardown, 15290 test_snow3g_hash_verify_test_case_3), 15291 15292 /* Tests with buffers which length is not byte-aligned */ 15293 TEST_CASE_ST(ut_setup, ut_teardown, 15294 test_snow3g_hash_verify_test_case_4), 15295 TEST_CASE_ST(ut_setup, ut_teardown, 15296 test_snow3g_hash_verify_test_case_5), 15297 TEST_CASE_ST(ut_setup, ut_teardown, 15298 test_snow3g_hash_verify_test_case_6), 15299 TEST_CASE_ST(ut_setup, ut_teardown, 15300 test_snow3g_cipher_auth_test_case_1), 15301 TEST_CASE_ST(ut_setup, ut_teardown, 15302 test_snow3g_auth_cipher_with_digest_test_case_1), 15303 TEST_CASES_END() 15304 } 15305 }; 15306 15307 static struct unit_test_suite cryptodev_zuc_testsuite = { 15308 .suite_name = "ZUC Test Suite", 15309 .setup = zuc_testsuite_setup, 15310 .unit_test_cases = { 15311 /** ZUC encrypt only (EEA3) */ 15312 TEST_CASE_ST(ut_setup, ut_teardown, 15313 test_zuc_encryption_test_case_1), 15314 TEST_CASE_ST(ut_setup, ut_teardown, 15315 test_zuc_encryption_test_case_2), 15316 TEST_CASE_ST(ut_setup, ut_teardown, 15317 test_zuc_encryption_test_case_3), 15318 TEST_CASE_ST(ut_setup, ut_teardown, 15319 test_zuc_encryption_test_case_4), 15320 TEST_CASE_ST(ut_setup, ut_teardown, 15321 test_zuc_encryption_test_case_5), 15322 TEST_CASE_ST(ut_setup, ut_teardown, 15323 test_zuc_encryption_test_case_6_sgl), 15324 15325 /** ZUC authenticate (EIA3) */ 15326 TEST_CASE_ST(ut_setup, ut_teardown, 15327 test_zuc_hash_generate_test_case_1), 15328 TEST_CASE_ST(ut_setup, ut_teardown, 15329 test_zuc_hash_generate_test_case_2), 15330 TEST_CASE_ST(ut_setup, ut_teardown, 15331 test_zuc_hash_generate_test_case_3), 15332 TEST_CASE_ST(ut_setup, ut_teardown, 15333 test_zuc_hash_generate_test_case_4), 15334 TEST_CASE_ST(ut_setup, ut_teardown, 15335 test_zuc_hash_generate_test_case_5), 15336 TEST_CASE_ST(ut_setup, ut_teardown, 15337 test_zuc_hash_generate_test_case_6), 15338 TEST_CASE_ST(ut_setup, ut_teardown, 15339 test_zuc_hash_generate_test_case_7), 15340 TEST_CASE_ST(ut_setup, ut_teardown, 15341 test_zuc_hash_generate_test_case_8), 15342 TEST_CASE_ST(ut_setup, ut_teardown, 15343 test_zuc_hash_generate_test_case_9), 15344 TEST_CASE_ST(ut_setup, ut_teardown, 15345 test_zuc_hash_generate_test_case_10), 15346 TEST_CASE_ST(ut_setup, ut_teardown, 15347 test_zuc_hash_generate_test_case_11), 15348 15349 15350 /** ZUC alg-chain (EEA3/EIA3) */ 15351 TEST_CASE_ST(ut_setup, ut_teardown, 15352 test_zuc_cipher_auth_test_case_1), 15353 TEST_CASE_ST(ut_setup, ut_teardown, 15354 test_zuc_cipher_auth_test_case_2), 15355 15356 /** ZUC generate auth, then encrypt (EEA3) */ 15357 TEST_CASE_ST(ut_setup, ut_teardown, 15358 test_zuc_auth_cipher_test_case_1), 15359 TEST_CASE_ST(ut_setup, ut_teardown, 15360 test_zuc_auth_cipher_test_case_1_oop), 15361 TEST_CASE_ST(ut_setup, ut_teardown, 15362 test_zuc_auth_cipher_test_case_1_sgl), 15363 TEST_CASE_ST(ut_setup, ut_teardown, 15364 test_zuc_auth_cipher_test_case_1_oop_sgl), 15365 15366 /** ZUC decrypt (EEA3), then verify auth */ 15367 TEST_CASE_ST(ut_setup, ut_teardown, 15368 test_zuc_auth_cipher_verify_test_case_1), 15369 TEST_CASE_ST(ut_setup, ut_teardown, 15370 test_zuc_auth_cipher_verify_test_case_1_oop), 15371 TEST_CASE_ST(ut_setup, ut_teardown, 15372 test_zuc_auth_cipher_verify_test_case_1_sgl), 15373 TEST_CASE_ST(ut_setup, ut_teardown, 15374 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 15375 15376 /** ZUC-256 encrypt only **/ 15377 TEST_CASE_ST(ut_setup, ut_teardown, 15378 test_zuc256_encryption_test_case_1), 15379 TEST_CASE_ST(ut_setup, ut_teardown, 15380 test_zuc256_encryption_test_case_2), 15381 15382 /** ZUC-256 authentication only **/ 15383 TEST_CASE_ST(ut_setup, ut_teardown, 15384 test_zuc256_authentication_test_case_1), 15385 TEST_CASE_ST(ut_setup, ut_teardown, 15386 test_zuc256_authentication_test_case_2), 15387 15388 TEST_CASES_END() 15389 } 15390 }; 15391 15392 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = { 15393 .suite_name = "HMAC_MD5 Authentication Test Suite", 15394 .setup = hmac_md5_auth_testsuite_setup, 15395 .unit_test_cases = { 15396 TEST_CASE_ST(ut_setup, ut_teardown, 15397 test_MD5_HMAC_generate_case_1), 15398 TEST_CASE_ST(ut_setup, ut_teardown, 15399 test_MD5_HMAC_verify_case_1), 15400 TEST_CASE_ST(ut_setup, ut_teardown, 15401 test_MD5_HMAC_generate_case_2), 15402 TEST_CASE_ST(ut_setup, ut_teardown, 15403 test_MD5_HMAC_verify_case_2), 15404 TEST_CASES_END() 15405 } 15406 }; 15407 15408 static struct unit_test_suite cryptodev_kasumi_testsuite = { 15409 .suite_name = "Kasumi Test Suite", 15410 .setup = kasumi_testsuite_setup, 15411 .unit_test_cases = { 15412 /** KASUMI hash only (UIA1) */ 15413 TEST_CASE_ST(ut_setup, ut_teardown, 15414 test_kasumi_hash_generate_test_case_1), 15415 TEST_CASE_ST(ut_setup, ut_teardown, 15416 test_kasumi_hash_generate_test_case_2), 15417 TEST_CASE_ST(ut_setup, ut_teardown, 15418 test_kasumi_hash_generate_test_case_3), 15419 TEST_CASE_ST(ut_setup, ut_teardown, 15420 test_kasumi_hash_generate_test_case_4), 15421 TEST_CASE_ST(ut_setup, ut_teardown, 15422 test_kasumi_hash_generate_test_case_5), 15423 TEST_CASE_ST(ut_setup, ut_teardown, 15424 test_kasumi_hash_generate_test_case_6), 15425 15426 TEST_CASE_ST(ut_setup, ut_teardown, 15427 test_kasumi_hash_verify_test_case_1), 15428 TEST_CASE_ST(ut_setup, ut_teardown, 15429 test_kasumi_hash_verify_test_case_2), 15430 TEST_CASE_ST(ut_setup, ut_teardown, 15431 test_kasumi_hash_verify_test_case_3), 15432 TEST_CASE_ST(ut_setup, ut_teardown, 15433 test_kasumi_hash_verify_test_case_4), 15434 TEST_CASE_ST(ut_setup, ut_teardown, 15435 test_kasumi_hash_verify_test_case_5), 15436 15437 /** KASUMI encrypt only (UEA1) */ 15438 TEST_CASE_ST(ut_setup, ut_teardown, 15439 test_kasumi_encryption_test_case_1), 15440 TEST_CASE_ST(ut_setup, ut_teardown, 15441 test_kasumi_encryption_test_case_1_sgl), 15442 TEST_CASE_ST(ut_setup, ut_teardown, 15443 test_kasumi_encryption_test_case_1_oop), 15444 TEST_CASE_ST(ut_setup, ut_teardown, 15445 test_kasumi_encryption_test_case_1_oop_sgl), 15446 TEST_CASE_ST(ut_setup, ut_teardown, 15447 test_kasumi_encryption_test_case_2), 15448 TEST_CASE_ST(ut_setup, ut_teardown, 15449 test_kasumi_encryption_test_case_3), 15450 TEST_CASE_ST(ut_setup, ut_teardown, 15451 test_kasumi_encryption_test_case_4), 15452 TEST_CASE_ST(ut_setup, ut_teardown, 15453 test_kasumi_encryption_test_case_5), 15454 15455 /** KASUMI decrypt only (UEA1) */ 15456 TEST_CASE_ST(ut_setup, ut_teardown, 15457 test_kasumi_decryption_test_case_1), 15458 TEST_CASE_ST(ut_setup, ut_teardown, 15459 test_kasumi_decryption_test_case_2), 15460 TEST_CASE_ST(ut_setup, ut_teardown, 15461 test_kasumi_decryption_test_case_3), 15462 TEST_CASE_ST(ut_setup, ut_teardown, 15463 test_kasumi_decryption_test_case_4), 15464 TEST_CASE_ST(ut_setup, ut_teardown, 15465 test_kasumi_decryption_test_case_5), 15466 TEST_CASE_ST(ut_setup, ut_teardown, 15467 test_kasumi_decryption_test_case_1_oop), 15468 TEST_CASE_ST(ut_setup, ut_teardown, 15469 test_kasumi_cipher_auth_test_case_1), 15470 15471 /** KASUMI generate auth, then encrypt (F8) */ 15472 TEST_CASE_ST(ut_setup, ut_teardown, 15473 test_kasumi_auth_cipher_test_case_1), 15474 TEST_CASE_ST(ut_setup, ut_teardown, 15475 test_kasumi_auth_cipher_test_case_2), 15476 TEST_CASE_ST(ut_setup, ut_teardown, 15477 test_kasumi_auth_cipher_test_case_2_oop), 15478 TEST_CASE_ST(ut_setup, ut_teardown, 15479 test_kasumi_auth_cipher_test_case_2_sgl), 15480 TEST_CASE_ST(ut_setup, ut_teardown, 15481 test_kasumi_auth_cipher_test_case_2_oop_sgl), 15482 15483 /** KASUMI decrypt (F8), then verify auth */ 15484 TEST_CASE_ST(ut_setup, ut_teardown, 15485 test_kasumi_auth_cipher_verify_test_case_1), 15486 TEST_CASE_ST(ut_setup, ut_teardown, 15487 test_kasumi_auth_cipher_verify_test_case_2), 15488 TEST_CASE_ST(ut_setup, ut_teardown, 15489 test_kasumi_auth_cipher_verify_test_case_2_oop), 15490 TEST_CASE_ST(ut_setup, ut_teardown, 15491 test_kasumi_auth_cipher_verify_test_case_2_sgl), 15492 TEST_CASE_ST(ut_setup, ut_teardown, 15493 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 15494 15495 TEST_CASES_END() 15496 } 15497 }; 15498 15499 static struct unit_test_suite cryptodev_esn_testsuite = { 15500 .suite_name = "ESN Test Suite", 15501 .setup = esn_testsuite_setup, 15502 .unit_test_cases = { 15503 TEST_CASE_ST(ut_setup, ut_teardown, 15504 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 15505 TEST_CASE_ST(ut_setup, ut_teardown, 15506 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 15507 TEST_CASES_END() 15508 } 15509 }; 15510 15511 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = { 15512 .suite_name = "Negative AES GCM Test Suite", 15513 .setup = negative_aes_gcm_testsuite_setup, 15514 .unit_test_cases = { 15515 TEST_CASE_ST(ut_setup, ut_teardown, 15516 test_AES_GCM_auth_encryption_fail_iv_corrupt), 15517 TEST_CASE_ST(ut_setup, ut_teardown, 15518 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 15519 TEST_CASE_ST(ut_setup, ut_teardown, 15520 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 15521 TEST_CASE_ST(ut_setup, ut_teardown, 15522 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 15523 TEST_CASE_ST(ut_setup, ut_teardown, 15524 test_AES_GCM_auth_encryption_fail_aad_corrupt), 15525 TEST_CASE_ST(ut_setup, ut_teardown, 15526 test_AES_GCM_auth_encryption_fail_tag_corrupt), 15527 TEST_CASE_ST(ut_setup, ut_teardown, 15528 test_AES_GCM_auth_decryption_fail_iv_corrupt), 15529 TEST_CASE_ST(ut_setup, ut_teardown, 15530 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 15531 TEST_CASE_ST(ut_setup, ut_teardown, 15532 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 15533 TEST_CASE_ST(ut_setup, ut_teardown, 15534 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 15535 TEST_CASE_ST(ut_setup, ut_teardown, 15536 test_AES_GCM_auth_decryption_fail_aad_corrupt), 15537 TEST_CASE_ST(ut_setup, ut_teardown, 15538 test_AES_GCM_auth_decryption_fail_tag_corrupt), 15539 15540 TEST_CASES_END() 15541 } 15542 }; 15543 15544 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = { 15545 .suite_name = "Negative AES GMAC Test Suite", 15546 .setup = negative_aes_gmac_testsuite_setup, 15547 .unit_test_cases = { 15548 TEST_CASE_ST(ut_setup, ut_teardown, 15549 authentication_verify_AES128_GMAC_fail_data_corrupt), 15550 TEST_CASE_ST(ut_setup, ut_teardown, 15551 authentication_verify_AES128_GMAC_fail_tag_corrupt), 15552 15553 TEST_CASES_END() 15554 } 15555 }; 15556 15557 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = { 15558 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite", 15559 .setup = mixed_cipher_hash_testsuite_setup, 15560 .unit_test_cases = { 15561 /** AUTH AES CMAC + CIPHER AES CTR */ 15562 TEST_CASE_ST(ut_setup, ut_teardown, 15563 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 15564 TEST_CASE_ST(ut_setup, ut_teardown, 15565 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 15566 TEST_CASE_ST(ut_setup, ut_teardown, 15567 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 15568 TEST_CASE_ST(ut_setup, ut_teardown, 15569 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 15570 TEST_CASE_ST(ut_setup, ut_teardown, 15571 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 15572 TEST_CASE_ST(ut_setup, ut_teardown, 15573 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 15574 TEST_CASE_ST(ut_setup, ut_teardown, 15575 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 15576 TEST_CASE_ST(ut_setup, ut_teardown, 15577 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 15578 15579 /** AUTH ZUC + CIPHER SNOW3G */ 15580 TEST_CASE_ST(ut_setup, ut_teardown, 15581 test_auth_zuc_cipher_snow_test_case_1), 15582 TEST_CASE_ST(ut_setup, ut_teardown, 15583 test_verify_auth_zuc_cipher_snow_test_case_1), 15584 /** AUTH AES CMAC + CIPHER SNOW3G */ 15585 TEST_CASE_ST(ut_setup, ut_teardown, 15586 test_auth_aes_cmac_cipher_snow_test_case_1), 15587 TEST_CASE_ST(ut_setup, ut_teardown, 15588 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 15589 /** AUTH ZUC + CIPHER AES CTR */ 15590 TEST_CASE_ST(ut_setup, ut_teardown, 15591 test_auth_zuc_cipher_aes_ctr_test_case_1), 15592 TEST_CASE_ST(ut_setup, ut_teardown, 15593 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 15594 /** AUTH SNOW3G + CIPHER AES CTR */ 15595 TEST_CASE_ST(ut_setup, ut_teardown, 15596 test_auth_snow_cipher_aes_ctr_test_case_1), 15597 TEST_CASE_ST(ut_setup, ut_teardown, 15598 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 15599 /** AUTH SNOW3G + CIPHER ZUC */ 15600 TEST_CASE_ST(ut_setup, ut_teardown, 15601 test_auth_snow_cipher_zuc_test_case_1), 15602 TEST_CASE_ST(ut_setup, ut_teardown, 15603 test_verify_auth_snow_cipher_zuc_test_case_1), 15604 /** AUTH AES CMAC + CIPHER ZUC */ 15605 TEST_CASE_ST(ut_setup, ut_teardown, 15606 test_auth_aes_cmac_cipher_zuc_test_case_1), 15607 TEST_CASE_ST(ut_setup, ut_teardown, 15608 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 15609 15610 /** AUTH NULL + CIPHER SNOW3G */ 15611 TEST_CASE_ST(ut_setup, ut_teardown, 15612 test_auth_null_cipher_snow_test_case_1), 15613 TEST_CASE_ST(ut_setup, ut_teardown, 15614 test_verify_auth_null_cipher_snow_test_case_1), 15615 /** AUTH NULL + CIPHER ZUC */ 15616 TEST_CASE_ST(ut_setup, ut_teardown, 15617 test_auth_null_cipher_zuc_test_case_1), 15618 TEST_CASE_ST(ut_setup, ut_teardown, 15619 test_verify_auth_null_cipher_zuc_test_case_1), 15620 /** AUTH SNOW3G + CIPHER NULL */ 15621 TEST_CASE_ST(ut_setup, ut_teardown, 15622 test_auth_snow_cipher_null_test_case_1), 15623 TEST_CASE_ST(ut_setup, ut_teardown, 15624 test_verify_auth_snow_cipher_null_test_case_1), 15625 /** AUTH ZUC + CIPHER NULL */ 15626 TEST_CASE_ST(ut_setup, ut_teardown, 15627 test_auth_zuc_cipher_null_test_case_1), 15628 TEST_CASE_ST(ut_setup, ut_teardown, 15629 test_verify_auth_zuc_cipher_null_test_case_1), 15630 /** AUTH NULL + CIPHER AES CTR */ 15631 TEST_CASE_ST(ut_setup, ut_teardown, 15632 test_auth_null_cipher_aes_ctr_test_case_1), 15633 TEST_CASE_ST(ut_setup, ut_teardown, 15634 test_verify_auth_null_cipher_aes_ctr_test_case_1), 15635 /** AUTH AES CMAC + CIPHER NULL */ 15636 TEST_CASE_ST(ut_setup, ut_teardown, 15637 test_auth_aes_cmac_cipher_null_test_case_1), 15638 TEST_CASE_ST(ut_setup, ut_teardown, 15639 test_verify_auth_aes_cmac_cipher_null_test_case_1), 15640 TEST_CASES_END() 15641 } 15642 }; 15643 15644 static int 15645 run_cryptodev_testsuite(const char *pmd_name) 15646 { 15647 uint8_t ret, j, i = 0, blk_start_idx = 0; 15648 const enum blockcipher_test_type blk_suites[] = { 15649 BLKCIPHER_AES_CHAIN_TYPE, 15650 BLKCIPHER_AES_CIPHERONLY_TYPE, 15651 BLKCIPHER_AES_DOCSIS_TYPE, 15652 BLKCIPHER_3DES_CHAIN_TYPE, 15653 BLKCIPHER_3DES_CIPHERONLY_TYPE, 15654 BLKCIPHER_DES_CIPHERONLY_TYPE, 15655 BLKCIPHER_DES_DOCSIS_TYPE, 15656 BLKCIPHER_AUTHONLY_TYPE}; 15657 struct unit_test_suite *static_suites[] = { 15658 &cryptodev_multi_session_testsuite, 15659 &cryptodev_null_testsuite, 15660 &cryptodev_aes_ccm_auth_testsuite, 15661 &cryptodev_aes_gcm_auth_testsuite, 15662 &cryptodev_aes_gmac_auth_testsuite, 15663 &cryptodev_snow3g_testsuite, 15664 &cryptodev_chacha20_poly1305_testsuite, 15665 &cryptodev_zuc_testsuite, 15666 &cryptodev_hmac_md5_auth_testsuite, 15667 &cryptodev_kasumi_testsuite, 15668 &cryptodev_esn_testsuite, 15669 &cryptodev_negative_aes_gcm_testsuite, 15670 &cryptodev_negative_aes_gmac_testsuite, 15671 &cryptodev_mixed_cipher_hash_testsuite, 15672 &cryptodev_negative_hmac_sha1_testsuite, 15673 &cryptodev_gen_testsuite, 15674 #ifdef RTE_LIB_SECURITY 15675 &ipsec_proto_testsuite, 15676 &pdcp_proto_testsuite, 15677 &docsis_proto_testsuite, 15678 #endif 15679 &end_testsuite 15680 }; 15681 static struct unit_test_suite ts = { 15682 .suite_name = "Cryptodev Unit Test Suite", 15683 .setup = testsuite_setup, 15684 .teardown = testsuite_teardown, 15685 .unit_test_cases = {TEST_CASES_END()} 15686 }; 15687 15688 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name); 15689 15690 if (gbl_driver_id == -1) { 15691 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name); 15692 return TEST_SKIPPED; 15693 } 15694 15695 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 15696 (RTE_DIM(blk_suites) + RTE_DIM(static_suites))); 15697 15698 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites)); 15699 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 15700 ret = unit_test_suite_runner(&ts); 15701 15702 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites)); 15703 free(ts.unit_test_suites); 15704 return ret; 15705 } 15706 15707 static int 15708 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name) 15709 { 15710 struct rte_cryptodev_info dev_info; 15711 uint8_t i, nb_devs; 15712 int driver_id; 15713 15714 driver_id = rte_cryptodev_driver_id_get(pmd_name); 15715 if (driver_id == -1) { 15716 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name); 15717 return TEST_SKIPPED; 15718 } 15719 15720 nb_devs = rte_cryptodev_count(); 15721 if (nb_devs < 1) { 15722 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 15723 return TEST_SKIPPED; 15724 } 15725 15726 for (i = 0; i < nb_devs; i++) { 15727 rte_cryptodev_info_get(i, &dev_info); 15728 if (dev_info.driver_id == driver_id) { 15729 if (!(dev_info.feature_flags & flag)) { 15730 RTE_LOG(INFO, USER1, "%s not supported\n", 15731 flag_name); 15732 return TEST_SKIPPED; 15733 } 15734 return 0; /* found */ 15735 } 15736 } 15737 15738 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name); 15739 return TEST_SKIPPED; 15740 } 15741 15742 static int 15743 test_cryptodev_qat(void) 15744 { 15745 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 15746 } 15747 15748 static int 15749 test_cryptodev_virtio(void) 15750 { 15751 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 15752 } 15753 15754 static int 15755 test_cryptodev_aesni_mb(void) 15756 { 15757 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15758 } 15759 15760 static int 15761 test_cryptodev_cpu_aesni_mb(void) 15762 { 15763 int32_t rc; 15764 enum rte_security_session_action_type at = gbl_action_type; 15765 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 15766 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15767 gbl_action_type = at; 15768 return rc; 15769 } 15770 15771 static int 15772 test_cryptodev_chacha_poly_mb(void) 15773 { 15774 int32_t rc; 15775 enum rte_security_session_action_type at = gbl_action_type; 15776 rc = run_cryptodev_testsuite( 15777 RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD)); 15778 gbl_action_type = at; 15779 return rc; 15780 } 15781 15782 static int 15783 test_cryptodev_openssl(void) 15784 { 15785 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 15786 } 15787 15788 static int 15789 test_cryptodev_aesni_gcm(void) 15790 { 15791 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 15792 } 15793 15794 static int 15795 test_cryptodev_cpu_aesni_gcm(void) 15796 { 15797 int32_t rc; 15798 enum rte_security_session_action_type at = gbl_action_type; 15799 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 15800 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 15801 gbl_action_type = at; 15802 return rc; 15803 } 15804 15805 static int 15806 test_cryptodev_mlx5(void) 15807 { 15808 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD)); 15809 } 15810 15811 static int 15812 test_cryptodev_null(void) 15813 { 15814 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 15815 } 15816 15817 static int 15818 test_cryptodev_sw_snow3g(void) 15819 { 15820 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 15821 } 15822 15823 static int 15824 test_cryptodev_sw_kasumi(void) 15825 { 15826 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 15827 } 15828 15829 static int 15830 test_cryptodev_sw_zuc(void) 15831 { 15832 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 15833 } 15834 15835 static int 15836 test_cryptodev_armv8(void) 15837 { 15838 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 15839 } 15840 15841 static int 15842 test_cryptodev_mrvl(void) 15843 { 15844 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 15845 } 15846 15847 #ifdef RTE_CRYPTO_SCHEDULER 15848 15849 static int 15850 test_cryptodev_scheduler(void) 15851 { 15852 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0; 15853 const enum blockcipher_test_type blk_suites[] = { 15854 BLKCIPHER_AES_CHAIN_TYPE, 15855 BLKCIPHER_AES_CIPHERONLY_TYPE, 15856 BLKCIPHER_AUTHONLY_TYPE 15857 }; 15858 static struct unit_test_suite scheduler_multicore = { 15859 .suite_name = "Scheduler Multicore Unit Test Suite", 15860 .setup = scheduler_multicore_testsuite_setup, 15861 .teardown = scheduler_mode_testsuite_teardown, 15862 .unit_test_cases = {TEST_CASES_END()} 15863 }; 15864 static struct unit_test_suite scheduler_round_robin = { 15865 .suite_name = "Scheduler Round Robin Unit Test Suite", 15866 .setup = scheduler_roundrobin_testsuite_setup, 15867 .teardown = scheduler_mode_testsuite_teardown, 15868 .unit_test_cases = {TEST_CASES_END()} 15869 }; 15870 static struct unit_test_suite scheduler_failover = { 15871 .suite_name = "Scheduler Failover Unit Test Suite", 15872 .setup = scheduler_failover_testsuite_setup, 15873 .teardown = scheduler_mode_testsuite_teardown, 15874 .unit_test_cases = {TEST_CASES_END()} 15875 }; 15876 static struct unit_test_suite scheduler_pkt_size_distr = { 15877 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite", 15878 .setup = scheduler_pkt_size_distr_testsuite_setup, 15879 .teardown = scheduler_mode_testsuite_teardown, 15880 .unit_test_cases = {TEST_CASES_END()} 15881 }; 15882 struct unit_test_suite *sched_mode_suites[] = { 15883 &scheduler_multicore, 15884 &scheduler_round_robin, 15885 &scheduler_failover, 15886 &scheduler_pkt_size_distr 15887 }; 15888 static struct unit_test_suite scheduler_config = { 15889 .suite_name = "Crypto Device Scheduler Config Unit Test Suite", 15890 .unit_test_cases = { 15891 TEST_CASE(test_scheduler_attach_worker_op), 15892 TEST_CASE(test_scheduler_mode_multicore_op), 15893 TEST_CASE(test_scheduler_mode_roundrobin_op), 15894 TEST_CASE(test_scheduler_mode_failover_op), 15895 TEST_CASE(test_scheduler_mode_pkt_size_distr_op), 15896 TEST_CASE(test_scheduler_detach_worker_op), 15897 15898 TEST_CASES_END() /**< NULL terminate array */ 15899 } 15900 }; 15901 struct unit_test_suite *static_suites[] = { 15902 &scheduler_config, 15903 &end_testsuite 15904 }; 15905 static struct unit_test_suite ts = { 15906 .suite_name = "Scheduler Unit Test Suite", 15907 .setup = scheduler_testsuite_setup, 15908 .teardown = testsuite_teardown, 15909 .unit_test_cases = {TEST_CASES_END()} 15910 }; 15911 15912 gbl_driver_id = rte_cryptodev_driver_id_get( 15913 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 15914 15915 if (gbl_driver_id == -1) { 15916 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 15917 return TEST_SKIPPED; 15918 } 15919 15920 if (rte_cryptodev_driver_id_get( 15921 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 15922 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 15923 return TEST_SKIPPED; 15924 } 15925 15926 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 15927 uint8_t blk_i = 0; 15928 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof 15929 (struct unit_test_suite *) * 15930 (RTE_DIM(blk_suites) + 1)); 15931 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]), 15932 blk_suites, RTE_DIM(blk_suites)); 15933 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite; 15934 } 15935 15936 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 15937 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites))); 15938 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites, 15939 RTE_DIM(sched_mode_suites)); 15940 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 15941 ret = unit_test_suite_runner(&ts); 15942 15943 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 15944 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, 15945 (*sched_mode_suites[sched_i]), 15946 RTE_DIM(blk_suites)); 15947 free(sched_mode_suites[sched_i]->unit_test_suites); 15948 } 15949 free(ts.unit_test_suites); 15950 return ret; 15951 } 15952 15953 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 15954 15955 #endif 15956 15957 static int 15958 test_cryptodev_dpaa2_sec(void) 15959 { 15960 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 15961 } 15962 15963 static int 15964 test_cryptodev_dpaa_sec(void) 15965 { 15966 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 15967 } 15968 15969 static int 15970 test_cryptodev_ccp(void) 15971 { 15972 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 15973 } 15974 15975 static int 15976 test_cryptodev_octeontx(void) 15977 { 15978 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 15979 } 15980 15981 static int 15982 test_cryptodev_caam_jr(void) 15983 { 15984 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 15985 } 15986 15987 static int 15988 test_cryptodev_nitrox(void) 15989 { 15990 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 15991 } 15992 15993 static int 15994 test_cryptodev_bcmfs(void) 15995 { 15996 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 15997 } 15998 15999 static int 16000 test_cryptodev_qat_raw_api(void) 16001 { 16002 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD); 16003 int ret; 16004 16005 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 16006 "RAW API"); 16007 if (ret) 16008 return ret; 16009 16010 global_api_test_type = CRYPTODEV_RAW_API_TEST; 16011 ret = run_cryptodev_testsuite(pmd_name); 16012 global_api_test_type = CRYPTODEV_API_TEST; 16013 16014 return ret; 16015 } 16016 16017 static int 16018 test_cryptodev_cn9k(void) 16019 { 16020 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD)); 16021 } 16022 16023 static int 16024 test_cryptodev_cn10k(void) 16025 { 16026 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD)); 16027 } 16028 16029 static int 16030 test_cryptodev_dpaa2_sec_raw_api(void) 16031 { 16032 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD); 16033 int ret; 16034 16035 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 16036 "RAW API"); 16037 if (ret) 16038 return ret; 16039 16040 global_api_test_type = CRYPTODEV_RAW_API_TEST; 16041 ret = run_cryptodev_testsuite(pmd_name); 16042 global_api_test_type = CRYPTODEV_API_TEST; 16043 16044 return ret; 16045 } 16046 16047 static int 16048 test_cryptodev_dpaa_sec_raw_api(void) 16049 { 16050 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD); 16051 int ret; 16052 16053 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 16054 "RAW API"); 16055 if (ret) 16056 return ret; 16057 16058 global_api_test_type = CRYPTODEV_RAW_API_TEST; 16059 ret = run_cryptodev_testsuite(pmd_name); 16060 global_api_test_type = CRYPTODEV_API_TEST; 16061 16062 return ret; 16063 } 16064 16065 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest, 16066 test_cryptodev_dpaa2_sec_raw_api); 16067 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest, 16068 test_cryptodev_dpaa_sec_raw_api); 16069 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 16070 test_cryptodev_qat_raw_api); 16071 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 16072 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 16073 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 16074 test_cryptodev_cpu_aesni_mb); 16075 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest, 16076 test_cryptodev_chacha_poly_mb); 16077 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 16078 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 16079 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 16080 test_cryptodev_cpu_aesni_gcm); 16081 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5); 16082 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 16083 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 16084 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 16085 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 16086 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 16087 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 16088 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 16089 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 16090 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 16091 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 16092 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 16093 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 16094 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 16095 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 16096 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k); 16097 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k); 16098 16099 #endif /* !RTE_EXEC_ENV_WINDOWS */ 16100