1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2020 Intel Corporation 3 */ 4 5 #include <time.h> 6 7 #include <rte_common.h> 8 #include <rte_hexdump.h> 9 #include <rte_mbuf.h> 10 #include <rte_malloc.h> 11 #include <rte_memcpy.h> 12 #include <rte_pause.h> 13 #include <rte_bus_vdev.h> 14 15 #include <rte_crypto.h> 16 #include <rte_cryptodev.h> 17 #include <rte_cryptodev_pmd.h> 18 #include <rte_string_fns.h> 19 20 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER 21 #include <rte_cryptodev_scheduler.h> 22 #include <rte_cryptodev_scheduler_operations.h> 23 #endif 24 25 #include <rte_lcore.h> 26 27 #include "test.h" 28 #include "test_cryptodev.h" 29 30 #include "test_cryptodev_blockcipher.h" 31 #include "test_cryptodev_aes_test_vectors.h" 32 #include "test_cryptodev_des_test_vectors.h" 33 #include "test_cryptodev_hash_test_vectors.h" 34 #include "test_cryptodev_kasumi_test_vectors.h" 35 #include "test_cryptodev_kasumi_hash_test_vectors.h" 36 #include "test_cryptodev_snow3g_test_vectors.h" 37 #include "test_cryptodev_snow3g_hash_test_vectors.h" 38 #include "test_cryptodev_zuc_test_vectors.h" 39 #include "test_cryptodev_aead_test_vectors.h" 40 #include "test_cryptodev_hmac_test_vectors.h" 41 #include "test_cryptodev_mixed_test_vectors.h" 42 #ifdef RTE_LIBRTE_SECURITY 43 #include "test_cryptodev_security_pdcp_test_vectors.h" 44 #include "test_cryptodev_security_pdcp_test_func.h" 45 #endif 46 47 #define VDEV_ARGS_SIZE 100 48 #define MAX_NB_SESSIONS 4 49 50 #define IN_PLACE 0 51 #define OUT_OF_PLACE 1 52 53 static int gbl_driver_id; 54 55 static enum rte_security_session_action_type gbl_action_type = 56 RTE_SECURITY_ACTION_TYPE_NONE; 57 58 struct crypto_testsuite_params { 59 struct rte_mempool *mbuf_pool; 60 struct rte_mempool *large_mbuf_pool; 61 struct rte_mempool *op_mpool; 62 struct rte_mempool *session_mpool; 63 struct rte_mempool *session_priv_mpool; 64 struct rte_cryptodev_config conf; 65 struct rte_cryptodev_qp_conf qp_conf; 66 67 uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS]; 68 uint8_t valid_dev_count; 69 }; 70 71 struct crypto_unittest_params { 72 struct rte_crypto_sym_xform cipher_xform; 73 struct rte_crypto_sym_xform auth_xform; 74 struct rte_crypto_sym_xform aead_xform; 75 76 union { 77 struct rte_cryptodev_sym_session *sess; 78 #ifdef RTE_LIBRTE_SECURITY 79 struct rte_security_session *sec_session; 80 #endif 81 }; 82 #ifdef RTE_LIBRTE_SECURITY 83 enum rte_security_session_action_type type; 84 #endif 85 struct rte_crypto_op *op; 86 87 struct rte_mbuf *obuf, *ibuf; 88 89 uint8_t *digest; 90 }; 91 92 #define ALIGN_POW2_ROUNDUP(num, align) \ 93 (((num) + (align) - 1) & ~((align) - 1)) 94 95 /* 96 * Forward declarations. 97 */ 98 static int 99 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 100 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 101 uint8_t *hmac_key); 102 103 static int 104 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 105 struct crypto_unittest_params *ut_params, 106 struct crypto_testsuite_params *ts_param, 107 const uint8_t *cipher, 108 const uint8_t *digest, 109 const uint8_t *iv); 110 111 static struct rte_mbuf * 112 setup_test_string(struct rte_mempool *mpool, 113 const char *string, size_t len, uint8_t blocksize) 114 { 115 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 116 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 117 118 memset(m->buf_addr, 0, m->buf_len); 119 if (m) { 120 char *dst = rte_pktmbuf_append(m, t_len); 121 122 if (!dst) { 123 rte_pktmbuf_free(m); 124 return NULL; 125 } 126 if (string != NULL) 127 rte_memcpy(dst, string, t_len); 128 else 129 memset(dst, 0, t_len); 130 } 131 132 return m; 133 } 134 135 /* Get number of bytes in X bits (rounding up) */ 136 static uint32_t 137 ceil_byte_length(uint32_t num_bits) 138 { 139 if (num_bits % 8) 140 return ((num_bits >> 3) + 1); 141 else 142 return (num_bits >> 3); 143 } 144 145 static void 146 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 147 { 148 int32_t n, st; 149 void *iv; 150 struct rte_crypto_sym_op *sop; 151 union rte_crypto_sym_ofs ofs; 152 struct rte_crypto_sgl sgl; 153 struct rte_crypto_sym_vec symvec; 154 struct rte_crypto_vec vec[UINT8_MAX]; 155 156 sop = op->sym; 157 158 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 159 sop->aead.data.length, vec, RTE_DIM(vec)); 160 161 if (n < 0 || n != sop->m_src->nb_segs) { 162 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 163 return; 164 } 165 166 sgl.vec = vec; 167 sgl.num = n; 168 symvec.sgl = &sgl; 169 iv = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 170 symvec.iv = &iv; 171 symvec.aad = (void **)&sop->aead.aad.data; 172 symvec.digest = (void **)&sop->aead.digest.data; 173 symvec.status = &st; 174 symvec.num = 1; 175 176 ofs.raw = 0; 177 178 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 179 &symvec); 180 181 if (n != 1) 182 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 183 else 184 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 185 } 186 187 static void 188 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 189 { 190 int32_t n, st; 191 void *iv; 192 struct rte_crypto_sym_op *sop; 193 union rte_crypto_sym_ofs ofs; 194 struct rte_crypto_sgl sgl; 195 struct rte_crypto_sym_vec symvec; 196 struct rte_crypto_vec vec[UINT8_MAX]; 197 198 sop = op->sym; 199 200 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 201 sop->auth.data.length, vec, RTE_DIM(vec)); 202 203 if (n < 0 || n != sop->m_src->nb_segs) { 204 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 205 return; 206 } 207 208 sgl.vec = vec; 209 sgl.num = n; 210 symvec.sgl = &sgl; 211 iv = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 212 symvec.iv = &iv; 213 symvec.aad = (void **)&sop->aead.aad.data; 214 symvec.digest = (void **)&sop->auth.digest.data; 215 symvec.status = &st; 216 symvec.num = 1; 217 218 ofs.raw = 0; 219 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 220 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 221 (sop->cipher.data.offset + sop->cipher.data.length); 222 223 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 224 &symvec); 225 226 if (n != 1) 227 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 228 else 229 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 230 } 231 232 static struct rte_crypto_op * 233 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 234 { 235 236 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 237 238 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 239 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 240 return NULL; 241 } 242 243 op = NULL; 244 245 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 246 rte_pause(); 247 248 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 249 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 250 return NULL; 251 } 252 253 return op; 254 } 255 256 static struct crypto_testsuite_params testsuite_params = { NULL }; 257 static struct crypto_unittest_params unittest_params; 258 259 static int 260 testsuite_setup(void) 261 { 262 struct crypto_testsuite_params *ts_params = &testsuite_params; 263 struct rte_cryptodev_info info; 264 uint32_t i = 0, nb_devs, dev_id; 265 int ret; 266 uint16_t qp_id; 267 268 memset(ts_params, 0, sizeof(*ts_params)); 269 270 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 271 if (ts_params->mbuf_pool == NULL) { 272 /* Not already created so create */ 273 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 274 "CRYPTO_MBUFPOOL", 275 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 276 rte_socket_id()); 277 if (ts_params->mbuf_pool == NULL) { 278 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 279 return TEST_FAILED; 280 } 281 } 282 283 ts_params->large_mbuf_pool = rte_mempool_lookup( 284 "CRYPTO_LARGE_MBUFPOOL"); 285 if (ts_params->large_mbuf_pool == NULL) { 286 /* Not already created so create */ 287 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 288 "CRYPTO_LARGE_MBUFPOOL", 289 1, 0, 0, UINT16_MAX, 290 rte_socket_id()); 291 if (ts_params->large_mbuf_pool == NULL) { 292 RTE_LOG(ERR, USER1, 293 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 294 return TEST_FAILED; 295 } 296 } 297 298 ts_params->op_mpool = rte_crypto_op_pool_create( 299 "MBUF_CRYPTO_SYM_OP_POOL", 300 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 301 NUM_MBUFS, MBUF_CACHE_SIZE, 302 DEFAULT_NUM_XFORMS * 303 sizeof(struct rte_crypto_sym_xform) + 304 MAXIMUM_IV_LENGTH, 305 rte_socket_id()); 306 if (ts_params->op_mpool == NULL) { 307 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 308 return TEST_FAILED; 309 } 310 311 /* Create an AESNI MB device if required */ 312 if (gbl_driver_id == rte_cryptodev_driver_id_get( 313 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) { 314 nb_devs = rte_cryptodev_device_count_by_driver( 315 rte_cryptodev_driver_id_get( 316 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))); 317 if (nb_devs < 1) { 318 ret = rte_vdev_init( 319 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL); 320 321 TEST_ASSERT(ret == 0, 322 "Failed to create instance of" 323 " pmd : %s", 324 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 325 } 326 } 327 328 /* Create an AESNI GCM device if required */ 329 if (gbl_driver_id == rte_cryptodev_driver_id_get( 330 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) { 331 nb_devs = rte_cryptodev_device_count_by_driver( 332 rte_cryptodev_driver_id_get( 333 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))); 334 if (nb_devs < 1) { 335 TEST_ASSERT_SUCCESS(rte_vdev_init( 336 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL), 337 "Failed to create instance of" 338 " pmd : %s", 339 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 340 } 341 } 342 343 /* Create a SNOW 3G device if required */ 344 if (gbl_driver_id == rte_cryptodev_driver_id_get( 345 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) { 346 nb_devs = rte_cryptodev_device_count_by_driver( 347 rte_cryptodev_driver_id_get( 348 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))); 349 if (nb_devs < 1) { 350 TEST_ASSERT_SUCCESS(rte_vdev_init( 351 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL), 352 "Failed to create instance of" 353 " pmd : %s", 354 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 355 } 356 } 357 358 /* Create a KASUMI device if required */ 359 if (gbl_driver_id == rte_cryptodev_driver_id_get( 360 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) { 361 nb_devs = rte_cryptodev_device_count_by_driver( 362 rte_cryptodev_driver_id_get( 363 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))); 364 if (nb_devs < 1) { 365 TEST_ASSERT_SUCCESS(rte_vdev_init( 366 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL), 367 "Failed to create instance of" 368 " pmd : %s", 369 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 370 } 371 } 372 373 /* Create a ZUC device if required */ 374 if (gbl_driver_id == rte_cryptodev_driver_id_get( 375 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) { 376 nb_devs = rte_cryptodev_device_count_by_driver( 377 rte_cryptodev_driver_id_get( 378 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))); 379 if (nb_devs < 1) { 380 TEST_ASSERT_SUCCESS(rte_vdev_init( 381 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL), 382 "Failed to create instance of" 383 " pmd : %s", 384 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 385 } 386 } 387 388 /* Create a NULL device if required */ 389 if (gbl_driver_id == rte_cryptodev_driver_id_get( 390 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) { 391 nb_devs = rte_cryptodev_device_count_by_driver( 392 rte_cryptodev_driver_id_get( 393 RTE_STR(CRYPTODEV_NAME_NULL_PMD))); 394 if (nb_devs < 1) { 395 ret = rte_vdev_init( 396 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL); 397 398 TEST_ASSERT(ret == 0, 399 "Failed to create instance of" 400 " pmd : %s", 401 RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 402 } 403 } 404 405 /* Create an OPENSSL device if required */ 406 if (gbl_driver_id == rte_cryptodev_driver_id_get( 407 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) { 408 nb_devs = rte_cryptodev_device_count_by_driver( 409 rte_cryptodev_driver_id_get( 410 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))); 411 if (nb_devs < 1) { 412 ret = rte_vdev_init( 413 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD), 414 NULL); 415 416 TEST_ASSERT(ret == 0, "Failed to create " 417 "instance of pmd : %s", 418 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 419 } 420 } 421 422 /* Create a ARMv8 device if required */ 423 if (gbl_driver_id == rte_cryptodev_driver_id_get( 424 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) { 425 nb_devs = rte_cryptodev_device_count_by_driver( 426 rte_cryptodev_driver_id_get( 427 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))); 428 if (nb_devs < 1) { 429 ret = rte_vdev_init( 430 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD), 431 NULL); 432 433 TEST_ASSERT(ret == 0, "Failed to create " 434 "instance of pmd : %s", 435 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 436 } 437 } 438 439 /* Create a MVSAM device if required */ 440 if (gbl_driver_id == rte_cryptodev_driver_id_get( 441 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) { 442 nb_devs = rte_cryptodev_device_count_by_driver( 443 rte_cryptodev_driver_id_get( 444 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))); 445 if (nb_devs < 1) { 446 ret = rte_vdev_init( 447 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD), 448 NULL); 449 450 TEST_ASSERT(ret == 0, "Failed to create " 451 "instance of pmd : %s", 452 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 453 } 454 } 455 456 /* Create an CCP device if required */ 457 if (gbl_driver_id == rte_cryptodev_driver_id_get( 458 RTE_STR(CRYPTODEV_NAME_CCP_PMD))) { 459 nb_devs = rte_cryptodev_device_count_by_driver( 460 rte_cryptodev_driver_id_get( 461 RTE_STR(CRYPTODEV_NAME_CCP_PMD))); 462 if (nb_devs < 1) { 463 ret = rte_vdev_init( 464 RTE_STR(CRYPTODEV_NAME_CCP_PMD), 465 NULL); 466 467 TEST_ASSERT(ret == 0, "Failed to create " 468 "instance of pmd : %s", 469 RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 470 } 471 } 472 473 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER 474 char vdev_args[VDEV_ARGS_SIZE] = {""}; 475 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 476 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 477 uint16_t slave_core_count = 0; 478 uint16_t socket_id = 0; 479 480 if (gbl_driver_id == rte_cryptodev_driver_id_get( 481 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 482 483 /* Identify the Slave Cores 484 * Use 2 slave cores for the device args 485 */ 486 RTE_LCORE_FOREACH_SLAVE(i) { 487 if (slave_core_count > 1) 488 break; 489 snprintf(vdev_args, sizeof(vdev_args), 490 "%s%d", temp_str, i); 491 strcpy(temp_str, vdev_args); 492 strlcat(temp_str, ";", sizeof(temp_str)); 493 slave_core_count++; 494 socket_id = rte_lcore_to_socket_id(i); 495 } 496 if (slave_core_count != 2) { 497 RTE_LOG(ERR, USER1, 498 "Cryptodev scheduler test require at least " 499 "two slave cores to run. " 500 "Please use the correct coremask.\n"); 501 return TEST_FAILED; 502 } 503 strcpy(temp_str, vdev_args); 504 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 505 temp_str, socket_id); 506 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 507 nb_devs = rte_cryptodev_device_count_by_driver( 508 rte_cryptodev_driver_id_get( 509 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 510 if (nb_devs < 1) { 511 ret = rte_vdev_init( 512 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 513 vdev_args); 514 TEST_ASSERT(ret == 0, 515 "Failed to create instance %u of" 516 " pmd : %s", 517 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 518 } 519 } 520 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */ 521 522 nb_devs = rte_cryptodev_count(); 523 if (nb_devs < 1) { 524 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 525 return TEST_SKIPPED; 526 } 527 528 /* Create list of valid crypto devs */ 529 for (i = 0; i < nb_devs; i++) { 530 rte_cryptodev_info_get(i, &info); 531 if (info.driver_id == gbl_driver_id) 532 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 533 } 534 535 if (ts_params->valid_dev_count < 1) 536 return TEST_FAILED; 537 538 /* Set up all the qps on the first of the valid devices found */ 539 540 dev_id = ts_params->valid_devs[0]; 541 542 rte_cryptodev_info_get(dev_id, &info); 543 544 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 545 ts_params->conf.socket_id = SOCKET_ID_ANY; 546 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 547 548 unsigned int session_size = 549 rte_cryptodev_sym_get_private_session_size(dev_id); 550 551 /* 552 * Create mempool with maximum number of sessions * 2, 553 * to include the session headers 554 */ 555 if (info.sym.max_nb_sessions != 0 && 556 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 557 RTE_LOG(ERR, USER1, "Device does not support " 558 "at least %u sessions\n", 559 MAX_NB_SESSIONS); 560 return TEST_FAILED; 561 } 562 563 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 564 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 565 SOCKET_ID_ANY); 566 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 567 "session mempool allocation failed"); 568 569 ts_params->session_priv_mpool = rte_mempool_create( 570 "test_sess_mp_priv", 571 MAX_NB_SESSIONS, 572 session_size, 573 0, 0, NULL, NULL, NULL, 574 NULL, SOCKET_ID_ANY, 575 0); 576 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 577 "session mempool allocation failed"); 578 579 580 581 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 582 &ts_params->conf), 583 "Failed to configure cryptodev %u with %u qps", 584 dev_id, ts_params->conf.nb_queue_pairs); 585 586 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 587 ts_params->qp_conf.mp_session = ts_params->session_mpool; 588 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 589 590 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 591 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 592 dev_id, qp_id, &ts_params->qp_conf, 593 rte_cryptodev_socket_id(dev_id)), 594 "Failed to setup queue pair %u on cryptodev %u", 595 qp_id, dev_id); 596 } 597 598 return TEST_SUCCESS; 599 } 600 601 static void 602 testsuite_teardown(void) 603 { 604 struct crypto_testsuite_params *ts_params = &testsuite_params; 605 606 if (ts_params->mbuf_pool != NULL) { 607 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 608 rte_mempool_avail_count(ts_params->mbuf_pool)); 609 } 610 611 if (ts_params->op_mpool != NULL) { 612 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 613 rte_mempool_avail_count(ts_params->op_mpool)); 614 } 615 616 /* Free session mempools */ 617 if (ts_params->session_priv_mpool != NULL) { 618 rte_mempool_free(ts_params->session_priv_mpool); 619 ts_params->session_priv_mpool = NULL; 620 } 621 622 if (ts_params->session_mpool != NULL) { 623 rte_mempool_free(ts_params->session_mpool); 624 ts_params->session_mpool = NULL; 625 } 626 } 627 628 static int 629 ut_setup(void) 630 { 631 struct crypto_testsuite_params *ts_params = &testsuite_params; 632 struct crypto_unittest_params *ut_params = &unittest_params; 633 634 uint16_t qp_id; 635 636 /* Clear unit test parameters before running test */ 637 memset(ut_params, 0, sizeof(*ut_params)); 638 639 /* Reconfigure device to default parameters */ 640 ts_params->conf.socket_id = SOCKET_ID_ANY; 641 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 642 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 643 ts_params->qp_conf.mp_session = ts_params->session_mpool; 644 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 645 646 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 647 &ts_params->conf), 648 "Failed to configure cryptodev %u", 649 ts_params->valid_devs[0]); 650 651 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 652 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 653 ts_params->valid_devs[0], qp_id, 654 &ts_params->qp_conf, 655 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 656 "Failed to setup queue pair %u on cryptodev %u", 657 qp_id, ts_params->valid_devs[0]); 658 } 659 660 661 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 662 663 /* Start the device */ 664 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 665 "Failed to start cryptodev %u", 666 ts_params->valid_devs[0]); 667 668 return TEST_SUCCESS; 669 } 670 671 static void 672 ut_teardown(void) 673 { 674 struct crypto_testsuite_params *ts_params = &testsuite_params; 675 struct crypto_unittest_params *ut_params = &unittest_params; 676 struct rte_cryptodev_stats stats; 677 678 /* free crypto session structure */ 679 #ifdef RTE_LIBRTE_SECURITY 680 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 681 if (ut_params->sec_session) { 682 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 683 (ts_params->valid_devs[0]), 684 ut_params->sec_session); 685 ut_params->sec_session = NULL; 686 } 687 } else 688 #endif 689 { 690 if (ut_params->sess) { 691 rte_cryptodev_sym_session_clear( 692 ts_params->valid_devs[0], 693 ut_params->sess); 694 rte_cryptodev_sym_session_free(ut_params->sess); 695 ut_params->sess = NULL; 696 } 697 } 698 699 /* free crypto operation structure */ 700 if (ut_params->op) 701 rte_crypto_op_free(ut_params->op); 702 703 /* 704 * free mbuf - both obuf and ibuf are usually the same, 705 * so check if they point at the same address is necessary, 706 * to avoid freeing the mbuf twice. 707 */ 708 if (ut_params->obuf) { 709 rte_pktmbuf_free(ut_params->obuf); 710 if (ut_params->ibuf == ut_params->obuf) 711 ut_params->ibuf = 0; 712 ut_params->obuf = 0; 713 } 714 if (ut_params->ibuf) { 715 rte_pktmbuf_free(ut_params->ibuf); 716 ut_params->ibuf = 0; 717 } 718 719 if (ts_params->mbuf_pool != NULL) 720 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 721 rte_mempool_avail_count(ts_params->mbuf_pool)); 722 723 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); 724 725 /* Stop the device */ 726 rte_cryptodev_stop(ts_params->valid_devs[0]); 727 } 728 729 static int 730 test_device_configure_invalid_dev_id(void) 731 { 732 struct crypto_testsuite_params *ts_params = &testsuite_params; 733 uint16_t dev_id, num_devs = 0; 734 735 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 736 "Need at least %d devices for test", 1); 737 738 /* valid dev_id values */ 739 dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1]; 740 741 /* Stop the device in case it's started so it can be configured */ 742 rte_cryptodev_stop(dev_id); 743 744 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 745 "Failed test for rte_cryptodev_configure: " 746 "invalid dev_num %u", dev_id); 747 748 /* invalid dev_id values */ 749 dev_id = num_devs; 750 751 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 752 "Failed test for rte_cryptodev_configure: " 753 "invalid dev_num %u", dev_id); 754 755 dev_id = 0xff; 756 757 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 758 "Failed test for rte_cryptodev_configure:" 759 "invalid dev_num %u", dev_id); 760 761 return TEST_SUCCESS; 762 } 763 764 static int 765 test_device_configure_invalid_queue_pair_ids(void) 766 { 767 struct crypto_testsuite_params *ts_params = &testsuite_params; 768 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 769 770 /* This test is for QAT and NITROX PMDs only */ 771 if (gbl_driver_id != rte_cryptodev_driver_id_get( 772 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)) && 773 gbl_driver_id != rte_cryptodev_driver_id_get( 774 RTE_STR(CRYPTODEV_NAME_NITROX_PMD))) 775 return -ENOTSUP; 776 777 /* Stop the device in case it's started so it can be configured */ 778 rte_cryptodev_stop(ts_params->valid_devs[0]); 779 780 /* valid - one queue pairs */ 781 ts_params->conf.nb_queue_pairs = 1; 782 783 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 784 &ts_params->conf), 785 "Failed to configure cryptodev: dev_id %u, qp_id %u", 786 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 787 788 789 /* valid - max value queue pairs */ 790 ts_params->conf.nb_queue_pairs = orig_nb_qps; 791 792 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 793 &ts_params->conf), 794 "Failed to configure cryptodev: dev_id %u, qp_id %u", 795 ts_params->valid_devs[0], 796 ts_params->conf.nb_queue_pairs); 797 798 799 /* invalid - zero queue pairs */ 800 ts_params->conf.nb_queue_pairs = 0; 801 802 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 803 &ts_params->conf), 804 "Failed test for rte_cryptodev_configure, dev_id %u," 805 " invalid qps: %u", 806 ts_params->valid_devs[0], 807 ts_params->conf.nb_queue_pairs); 808 809 810 /* invalid - max value supported by field queue pairs */ 811 ts_params->conf.nb_queue_pairs = UINT16_MAX; 812 813 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 814 &ts_params->conf), 815 "Failed test for rte_cryptodev_configure, dev_id %u," 816 " invalid qps: %u", 817 ts_params->valid_devs[0], 818 ts_params->conf.nb_queue_pairs); 819 820 821 /* invalid - max value + 1 queue pairs */ 822 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 823 824 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 825 &ts_params->conf), 826 "Failed test for rte_cryptodev_configure, dev_id %u," 827 " invalid qps: %u", 828 ts_params->valid_devs[0], 829 ts_params->conf.nb_queue_pairs); 830 831 /* revert to original testsuite value */ 832 ts_params->conf.nb_queue_pairs = orig_nb_qps; 833 834 return TEST_SUCCESS; 835 } 836 837 static int 838 test_queue_pair_descriptor_setup(void) 839 { 840 struct crypto_testsuite_params *ts_params = &testsuite_params; 841 struct rte_cryptodev_info dev_info; 842 struct rte_cryptodev_qp_conf qp_conf = { 843 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 844 }; 845 846 uint16_t qp_id; 847 848 /* This test is for QAT PMD only */ 849 if (gbl_driver_id != rte_cryptodev_driver_id_get( 850 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))) 851 return -ENOTSUP; 852 853 /* Stop the device in case it's started so it can be configured */ 854 rte_cryptodev_stop(ts_params->valid_devs[0]); 855 856 857 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 858 859 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 860 &ts_params->conf), 861 "Failed to configure cryptodev %u", 862 ts_params->valid_devs[0]); 863 864 /* 865 * Test various ring sizes on this device. memzones can't be 866 * freed so are re-used if ring is released and re-created. 867 */ 868 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 869 qp_conf.mp_session = ts_params->session_mpool; 870 qp_conf.mp_session_private = ts_params->session_priv_mpool; 871 872 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 873 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 874 ts_params->valid_devs[0], qp_id, &qp_conf, 875 rte_cryptodev_socket_id( 876 ts_params->valid_devs[0])), 877 "Failed test for " 878 "rte_cryptodev_queue_pair_setup: num_inflights " 879 "%u on qp %u on cryptodev %u", 880 qp_conf.nb_descriptors, qp_id, 881 ts_params->valid_devs[0]); 882 } 883 884 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 885 886 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 887 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 888 ts_params->valid_devs[0], qp_id, &qp_conf, 889 rte_cryptodev_socket_id( 890 ts_params->valid_devs[0])), 891 "Failed test for" 892 " rte_cryptodev_queue_pair_setup: num_inflights" 893 " %u on qp %u on cryptodev %u", 894 qp_conf.nb_descriptors, qp_id, 895 ts_params->valid_devs[0]); 896 } 897 898 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 899 900 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 901 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 902 ts_params->valid_devs[0], qp_id, &qp_conf, 903 rte_cryptodev_socket_id( 904 ts_params->valid_devs[0])), 905 "Failed test for " 906 "rte_cryptodev_queue_pair_setup: num_inflights" 907 " %u on qp %u on cryptodev %u", 908 qp_conf.nb_descriptors, qp_id, 909 ts_params->valid_devs[0]); 910 } 911 912 /* invalid number of descriptors - max supported + 2 */ 913 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT + 2; 914 915 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 916 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 917 ts_params->valid_devs[0], qp_id, &qp_conf, 918 rte_cryptodev_socket_id( 919 ts_params->valid_devs[0])), 920 "Unexpectedly passed test for " 921 "rte_cryptodev_queue_pair_setup:" 922 "num_inflights %u on qp %u on cryptodev %u", 923 qp_conf.nb_descriptors, qp_id, 924 ts_params->valid_devs[0]); 925 } 926 927 /* invalid number of descriptors - max value of parameter */ 928 qp_conf.nb_descriptors = UINT32_MAX-1; 929 930 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 931 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 932 ts_params->valid_devs[0], qp_id, &qp_conf, 933 rte_cryptodev_socket_id( 934 ts_params->valid_devs[0])), 935 "Unexpectedly passed test for " 936 "rte_cryptodev_queue_pair_setup:" 937 "num_inflights %u on qp %u on cryptodev %u", 938 qp_conf.nb_descriptors, qp_id, 939 ts_params->valid_devs[0]); 940 } 941 942 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 943 944 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 945 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 946 ts_params->valid_devs[0], qp_id, &qp_conf, 947 rte_cryptodev_socket_id( 948 ts_params->valid_devs[0])), 949 "Failed test for" 950 " rte_cryptodev_queue_pair_setup:" 951 "num_inflights %u on qp %u on cryptodev %u", 952 qp_conf.nb_descriptors, qp_id, 953 ts_params->valid_devs[0]); 954 } 955 956 /* invalid number of descriptors - max supported + 1 */ 957 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT + 1; 958 959 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 960 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 961 ts_params->valid_devs[0], qp_id, &qp_conf, 962 rte_cryptodev_socket_id( 963 ts_params->valid_devs[0])), 964 "Unexpectedly passed test for " 965 "rte_cryptodev_queue_pair_setup:" 966 "num_inflights %u on qp %u on cryptodev %u", 967 qp_conf.nb_descriptors, qp_id, 968 ts_params->valid_devs[0]); 969 } 970 971 /* test invalid queue pair id */ 972 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 973 974 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 975 976 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 977 ts_params->valid_devs[0], 978 qp_id, &qp_conf, 979 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 980 "Failed test for rte_cryptodev_queue_pair_setup:" 981 "invalid qp %u on cryptodev %u", 982 qp_id, ts_params->valid_devs[0]); 983 984 qp_id = 0xffff; /*invalid*/ 985 986 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 987 ts_params->valid_devs[0], 988 qp_id, &qp_conf, 989 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 990 "Failed test for rte_cryptodev_queue_pair_setup:" 991 "invalid qp %u on cryptodev %u", 992 qp_id, ts_params->valid_devs[0]); 993 994 return TEST_SUCCESS; 995 } 996 997 /* ***** Plaintext data for tests ***** */ 998 999 const char catch_22_quote_1[] = 1000 "There was only one catch and that was Catch-22, which " 1001 "specified that a concern for one's safety in the face of " 1002 "dangers that were real and immediate was the process of a " 1003 "rational mind. Orr was crazy and could be grounded. All he " 1004 "had to do was ask; and as soon as he did, he would no longer " 1005 "be crazy and would have to fly more missions. Orr would be " 1006 "crazy to fly more missions and sane if he didn't, but if he " 1007 "was sane he had to fly them. If he flew them he was crazy " 1008 "and didn't have to; but if he didn't want to he was sane and " 1009 "had to. Yossarian was moved very deeply by the absolute " 1010 "simplicity of this clause of Catch-22 and let out a " 1011 "respectful whistle. \"That's some catch, that Catch-22\", he " 1012 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1013 1014 const char catch_22_quote[] = 1015 "What a lousy earth! He wondered how many people were " 1016 "destitute that same night even in his own prosperous country, " 1017 "how many homes were shanties, how many husbands were drunk " 1018 "and wives socked, and how many children were bullied, abused, " 1019 "or abandoned. How many families hungered for food they could " 1020 "not afford to buy? How many hearts were broken? How many " 1021 "suicides would take place that same night, how many people " 1022 "would go insane? How many cockroaches and landlords would " 1023 "triumph? How many winners were losers, successes failures, " 1024 "and rich men poor men? How many wise guys were stupid? How " 1025 "many happy endings were unhappy endings? How many honest men " 1026 "were liars, brave men cowards, loyal men traitors, how many " 1027 "sainted men were corrupt, how many people in positions of " 1028 "trust had sold their souls to bodyguards, how many had never " 1029 "had souls? How many straight-and-narrow paths were crooked " 1030 "paths? How many best families were worst families and how " 1031 "many good people were bad people? When you added them all up " 1032 "and then subtracted, you might be left with only the children, " 1033 "and perhaps with Albert Einstein and an old violinist or " 1034 "sculptor somewhere."; 1035 1036 #define QUOTE_480_BYTES (480) 1037 #define QUOTE_512_BYTES (512) 1038 #define QUOTE_768_BYTES (768) 1039 #define QUOTE_1024_BYTES (1024) 1040 1041 1042 1043 /* ***** SHA1 Hash Tests ***** */ 1044 1045 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1046 1047 static uint8_t hmac_sha1_key[] = { 1048 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1049 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1050 0xDE, 0xF4, 0xDE, 0xAD }; 1051 1052 /* ***** SHA224 Hash Tests ***** */ 1053 1054 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1055 1056 1057 /* ***** AES-CBC Cipher Tests ***** */ 1058 1059 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1060 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1061 1062 static uint8_t aes_cbc_key[] = { 1063 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1064 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1065 1066 static uint8_t aes_cbc_iv[] = { 1067 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1068 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1069 1070 1071 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1072 1073 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1074 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1075 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1076 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1077 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1078 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1079 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1080 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1081 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1082 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1083 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1084 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1085 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1086 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1087 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1088 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1089 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1090 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1091 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1092 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1093 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1094 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1095 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1096 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1097 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1098 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1099 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1100 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1101 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1102 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1103 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1104 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1105 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1106 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1107 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1108 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1109 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1110 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1111 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1112 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1113 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1114 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1115 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1116 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1117 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1118 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1119 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1120 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1121 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1122 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1123 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1124 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1125 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1126 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1127 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1128 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1129 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1130 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1131 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1132 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1133 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1134 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1135 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1136 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1137 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1138 }; 1139 1140 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1141 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1142 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1143 0x18, 0x8c, 0x1d, 0x32 1144 }; 1145 1146 1147 /* Multisession Vector context Test */ 1148 /*Begin Session 0 */ 1149 static uint8_t ms_aes_cbc_key0[] = { 1150 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1151 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1152 }; 1153 1154 static uint8_t ms_aes_cbc_iv0[] = { 1155 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1156 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1157 }; 1158 1159 static const uint8_t ms_aes_cbc_cipher0[] = { 1160 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1161 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1162 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1163 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1164 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1165 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1166 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1167 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1168 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1169 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1170 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1171 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1172 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1173 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1174 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1175 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1176 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1177 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1178 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1179 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1180 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1181 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1182 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1183 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1184 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1185 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1186 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1187 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1188 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1189 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1190 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1191 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1192 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1193 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1194 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1195 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1196 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1197 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1198 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1199 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1200 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1201 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1202 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1203 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1204 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1205 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1206 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1207 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1208 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1209 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1210 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1211 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1212 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1213 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1214 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1215 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1216 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1217 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1218 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1219 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1220 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1221 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1222 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1223 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1224 }; 1225 1226 1227 static uint8_t ms_hmac_key0[] = { 1228 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1229 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1230 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1231 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1232 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1233 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1234 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1235 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1236 }; 1237 1238 static const uint8_t ms_hmac_digest0[] = { 1239 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1240 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1241 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1242 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1243 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1244 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1245 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1246 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1247 }; 1248 1249 /* End Session 0 */ 1250 /* Begin session 1 */ 1251 1252 static uint8_t ms_aes_cbc_key1[] = { 1253 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1254 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1255 }; 1256 1257 static uint8_t ms_aes_cbc_iv1[] = { 1258 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1259 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1260 }; 1261 1262 static const uint8_t ms_aes_cbc_cipher1[] = { 1263 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1264 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1265 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1266 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1267 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1268 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1269 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1270 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1271 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1272 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1273 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1274 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1275 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1276 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1277 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1278 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1279 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1280 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1281 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1282 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1283 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1284 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1285 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1286 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1287 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1288 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1289 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1290 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1291 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1292 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1293 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1294 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1295 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1296 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1297 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1298 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1299 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1300 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1301 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1302 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1303 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1304 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1305 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1306 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1307 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1308 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1309 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1310 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1311 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1312 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1313 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1314 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1315 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1316 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1317 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1318 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1319 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1320 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1321 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1322 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1323 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 1324 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 1325 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 1326 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 1327 1328 }; 1329 1330 static uint8_t ms_hmac_key1[] = { 1331 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1332 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1333 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1334 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1335 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1336 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1337 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1338 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1339 }; 1340 1341 static const uint8_t ms_hmac_digest1[] = { 1342 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 1343 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 1344 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 1345 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 1346 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 1347 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 1348 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 1349 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 1350 }; 1351 /* End Session 1 */ 1352 /* Begin Session 2 */ 1353 static uint8_t ms_aes_cbc_key2[] = { 1354 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1355 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1356 }; 1357 1358 static uint8_t ms_aes_cbc_iv2[] = { 1359 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1360 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1361 }; 1362 1363 static const uint8_t ms_aes_cbc_cipher2[] = { 1364 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 1365 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 1366 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 1367 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 1368 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 1369 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 1370 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 1371 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 1372 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 1373 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 1374 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 1375 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 1376 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 1377 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 1378 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 1379 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 1380 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 1381 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 1382 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 1383 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 1384 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 1385 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 1386 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 1387 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 1388 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 1389 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 1390 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 1391 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 1392 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 1393 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 1394 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 1395 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 1396 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 1397 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 1398 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 1399 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 1400 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 1401 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 1402 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 1403 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 1404 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 1405 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 1406 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 1407 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 1408 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 1409 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 1410 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 1411 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 1412 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 1413 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 1414 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 1415 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 1416 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 1417 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 1418 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 1419 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 1420 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 1421 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 1422 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 1423 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 1424 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 1425 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 1426 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 1427 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 1428 }; 1429 1430 static uint8_t ms_hmac_key2[] = { 1431 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1432 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1433 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1434 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1435 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1436 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1437 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1438 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1439 }; 1440 1441 static const uint8_t ms_hmac_digest2[] = { 1442 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 1443 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 1444 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 1445 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 1446 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 1447 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 1448 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 1449 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 1450 }; 1451 1452 /* End Session 2 */ 1453 1454 1455 static int 1456 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 1457 { 1458 struct crypto_testsuite_params *ts_params = &testsuite_params; 1459 struct crypto_unittest_params *ut_params = &unittest_params; 1460 1461 /* Verify the capabilities */ 1462 struct rte_cryptodev_sym_capability_idx cap_idx; 1463 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1464 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 1465 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 1466 &cap_idx) == NULL) 1467 return -ENOTSUP; 1468 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1469 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 1470 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 1471 &cap_idx) == NULL) 1472 return -ENOTSUP; 1473 1474 /* Generate test mbuf data and space for digest */ 1475 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 1476 catch_22_quote, QUOTE_512_BYTES, 0); 1477 1478 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 1479 DIGEST_BYTE_LENGTH_SHA1); 1480 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 1481 1482 /* Setup Cipher Parameters */ 1483 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1484 ut_params->cipher_xform.next = &ut_params->auth_xform; 1485 1486 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 1487 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 1488 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 1489 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 1490 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1491 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 1492 1493 /* Setup HMAC Parameters */ 1494 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1495 1496 ut_params->auth_xform.next = NULL; 1497 1498 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 1499 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 1500 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 1501 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 1502 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 1503 1504 ut_params->sess = rte_cryptodev_sym_session_create( 1505 ts_params->session_mpool); 1506 1507 /* Create crypto session*/ 1508 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 1509 ut_params->sess, &ut_params->cipher_xform, 1510 ts_params->session_priv_mpool); 1511 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 1512 1513 /* Generate crypto op data structure */ 1514 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1515 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1516 TEST_ASSERT_NOT_NULL(ut_params->op, 1517 "Failed to allocate symmetric crypto operation struct"); 1518 1519 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 1520 1521 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1522 1523 /* set crypto operation source mbuf */ 1524 sym_op->m_src = ut_params->ibuf; 1525 1526 /* Set crypto operation authentication parameters */ 1527 sym_op->auth.digest.data = ut_params->digest; 1528 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 1529 ut_params->ibuf, QUOTE_512_BYTES); 1530 1531 sym_op->auth.data.offset = 0; 1532 sym_op->auth.data.length = QUOTE_512_BYTES; 1533 1534 /* Copy IV at the end of the crypto operation */ 1535 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1536 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 1537 1538 /* Set crypto operation cipher parameters */ 1539 sym_op->cipher.data.offset = 0; 1540 sym_op->cipher.data.length = QUOTE_512_BYTES; 1541 1542 /* Process crypto operation */ 1543 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 1544 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 1545 ut_params->op); 1546 else 1547 TEST_ASSERT_NOT_NULL( 1548 process_crypto_request(ts_params->valid_devs[0], 1549 ut_params->op), 1550 "failed to process sym crypto op"); 1551 1552 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1553 "crypto op processing failed"); 1554 1555 /* Validate obuf */ 1556 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 1557 uint8_t *); 1558 1559 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 1560 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 1561 QUOTE_512_BYTES, 1562 "ciphertext data not as expected"); 1563 1564 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 1565 1566 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 1567 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 1568 gbl_driver_id == rte_cryptodev_driver_id_get( 1569 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 1570 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 1571 DIGEST_BYTE_LENGTH_SHA1, 1572 "Generated digest data not as expected"); 1573 1574 return TEST_SUCCESS; 1575 } 1576 1577 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 1578 1579 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 1580 1581 static uint8_t hmac_sha512_key[] = { 1582 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1583 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1584 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1585 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 1586 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 1587 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1588 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 1589 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 1590 1591 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 1592 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 1593 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 1594 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 1595 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 1596 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 1597 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 1598 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 1599 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 1600 1601 1602 1603 static int 1604 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 1605 struct crypto_unittest_params *ut_params, 1606 uint8_t *cipher_key, 1607 uint8_t *hmac_key); 1608 1609 static int 1610 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 1611 struct crypto_unittest_params *ut_params, 1612 struct crypto_testsuite_params *ts_params, 1613 const uint8_t *cipher, 1614 const uint8_t *digest, 1615 const uint8_t *iv); 1616 1617 1618 static int 1619 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 1620 struct crypto_unittest_params *ut_params, 1621 uint8_t *cipher_key, 1622 uint8_t *hmac_key) 1623 { 1624 1625 /* Setup Cipher Parameters */ 1626 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1627 ut_params->cipher_xform.next = NULL; 1628 1629 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 1630 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 1631 ut_params->cipher_xform.cipher.key.data = cipher_key; 1632 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 1633 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1634 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 1635 1636 /* Setup HMAC Parameters */ 1637 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1638 ut_params->auth_xform.next = &ut_params->cipher_xform; 1639 1640 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 1641 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 1642 ut_params->auth_xform.auth.key.data = hmac_key; 1643 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 1644 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 1645 1646 return TEST_SUCCESS; 1647 } 1648 1649 1650 static int 1651 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 1652 struct crypto_unittest_params *ut_params, 1653 struct crypto_testsuite_params *ts_params, 1654 const uint8_t *cipher, 1655 const uint8_t *digest, 1656 const uint8_t *iv) 1657 { 1658 /* Generate test mbuf data and digest */ 1659 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 1660 (const char *) 1661 cipher, 1662 QUOTE_512_BYTES, 0); 1663 1664 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 1665 DIGEST_BYTE_LENGTH_SHA512); 1666 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 1667 1668 rte_memcpy(ut_params->digest, 1669 digest, 1670 DIGEST_BYTE_LENGTH_SHA512); 1671 1672 /* Generate Crypto op data structure */ 1673 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1674 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1675 TEST_ASSERT_NOT_NULL(ut_params->op, 1676 "Failed to allocate symmetric crypto operation struct"); 1677 1678 rte_crypto_op_attach_sym_session(ut_params->op, sess); 1679 1680 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1681 1682 /* set crypto operation source mbuf */ 1683 sym_op->m_src = ut_params->ibuf; 1684 1685 sym_op->auth.digest.data = ut_params->digest; 1686 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 1687 ut_params->ibuf, QUOTE_512_BYTES); 1688 1689 sym_op->auth.data.offset = 0; 1690 sym_op->auth.data.length = QUOTE_512_BYTES; 1691 1692 /* Copy IV at the end of the crypto operation */ 1693 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1694 iv, CIPHER_IV_LENGTH_AES_CBC); 1695 1696 sym_op->cipher.data.offset = 0; 1697 sym_op->cipher.data.length = QUOTE_512_BYTES; 1698 1699 /* Process crypto operation */ 1700 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 1701 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 1702 ut_params->op); 1703 else 1704 TEST_ASSERT_NOT_NULL( 1705 process_crypto_request(ts_params->valid_devs[0], 1706 ut_params->op), 1707 "failed to process sym crypto op"); 1708 1709 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1710 "crypto op processing failed"); 1711 1712 ut_params->obuf = ut_params->op->sym->m_src; 1713 1714 /* Validate obuf */ 1715 TEST_ASSERT_BUFFERS_ARE_EQUAL( 1716 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 1717 catch_22_quote, 1718 QUOTE_512_BYTES, 1719 "Plaintext data not as expected"); 1720 1721 /* Validate obuf */ 1722 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1723 "Digest verification failed"); 1724 1725 return TEST_SUCCESS; 1726 } 1727 1728 static int 1729 test_blockcipher(enum blockcipher_test_type test_type) 1730 { 1731 struct crypto_testsuite_params *ts_params = &testsuite_params; 1732 int status; 1733 1734 status = test_blockcipher_all_tests(ts_params->mbuf_pool, 1735 ts_params->op_mpool, 1736 ts_params->session_mpool, ts_params->session_priv_mpool, 1737 ts_params->valid_devs[0], 1738 test_type); 1739 1740 if (status == -ENOTSUP) 1741 return status; 1742 1743 TEST_ASSERT_EQUAL(status, 0, "Test failed"); 1744 1745 return TEST_SUCCESS; 1746 } 1747 1748 static int 1749 test_AES_cipheronly_all(void) 1750 { 1751 return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE); 1752 } 1753 1754 static int 1755 test_AES_docsis_all(void) 1756 { 1757 return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE); 1758 } 1759 1760 static int 1761 test_DES_docsis_all(void) 1762 { 1763 return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE); 1764 } 1765 1766 static int 1767 test_DES_cipheronly_all(void) 1768 { 1769 return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE); 1770 } 1771 1772 static int 1773 test_authonly_all(void) 1774 { 1775 return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE); 1776 } 1777 1778 static int 1779 test_AES_chain_all(void) 1780 { 1781 return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE); 1782 } 1783 1784 static int 1785 test_3DES_chain_all(void) 1786 { 1787 return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE); 1788 } 1789 1790 static int 1791 test_3DES_cipheronly_all(void) 1792 { 1793 return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE); 1794 } 1795 1796 /* ***** SNOW 3G Tests ***** */ 1797 static int 1798 create_wireless_algo_hash_session(uint8_t dev_id, 1799 const uint8_t *key, const uint8_t key_len, 1800 const uint8_t iv_len, const uint8_t auth_len, 1801 enum rte_crypto_auth_operation op, 1802 enum rte_crypto_auth_algorithm algo) 1803 { 1804 uint8_t hash_key[key_len]; 1805 int status; 1806 1807 struct crypto_testsuite_params *ts_params = &testsuite_params; 1808 struct crypto_unittest_params *ut_params = &unittest_params; 1809 1810 memcpy(hash_key, key, key_len); 1811 1812 debug_hexdump(stdout, "key:", key, key_len); 1813 1814 /* Setup Authentication Parameters */ 1815 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1816 ut_params->auth_xform.next = NULL; 1817 1818 ut_params->auth_xform.auth.op = op; 1819 ut_params->auth_xform.auth.algo = algo; 1820 ut_params->auth_xform.auth.key.length = key_len; 1821 ut_params->auth_xform.auth.key.data = hash_key; 1822 ut_params->auth_xform.auth.digest_length = auth_len; 1823 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 1824 ut_params->auth_xform.auth.iv.length = iv_len; 1825 ut_params->sess = rte_cryptodev_sym_session_create( 1826 ts_params->session_mpool); 1827 1828 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 1829 &ut_params->auth_xform, 1830 ts_params->session_priv_mpool); 1831 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 1832 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 1833 return 0; 1834 } 1835 1836 static int 1837 create_wireless_algo_cipher_session(uint8_t dev_id, 1838 enum rte_crypto_cipher_operation op, 1839 enum rte_crypto_cipher_algorithm algo, 1840 const uint8_t *key, const uint8_t key_len, 1841 uint8_t iv_len) 1842 { 1843 uint8_t cipher_key[key_len]; 1844 int status; 1845 struct crypto_testsuite_params *ts_params = &testsuite_params; 1846 struct crypto_unittest_params *ut_params = &unittest_params; 1847 1848 memcpy(cipher_key, key, key_len); 1849 1850 /* Setup Cipher Parameters */ 1851 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1852 ut_params->cipher_xform.next = NULL; 1853 1854 ut_params->cipher_xform.cipher.algo = algo; 1855 ut_params->cipher_xform.cipher.op = op; 1856 ut_params->cipher_xform.cipher.key.data = cipher_key; 1857 ut_params->cipher_xform.cipher.key.length = key_len; 1858 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1859 ut_params->cipher_xform.cipher.iv.length = iv_len; 1860 1861 debug_hexdump(stdout, "key:", key, key_len); 1862 1863 /* Create Crypto session */ 1864 ut_params->sess = rte_cryptodev_sym_session_create( 1865 ts_params->session_mpool); 1866 1867 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 1868 &ut_params->cipher_xform, 1869 ts_params->session_priv_mpool); 1870 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 1871 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 1872 return 0; 1873 } 1874 1875 static int 1876 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 1877 unsigned int cipher_len, 1878 unsigned int cipher_offset) 1879 { 1880 struct crypto_testsuite_params *ts_params = &testsuite_params; 1881 struct crypto_unittest_params *ut_params = &unittest_params; 1882 1883 /* Generate Crypto op data structure */ 1884 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1885 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1886 TEST_ASSERT_NOT_NULL(ut_params->op, 1887 "Failed to allocate pktmbuf offload"); 1888 1889 /* Set crypto operation data parameters */ 1890 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 1891 1892 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1893 1894 /* set crypto operation source mbuf */ 1895 sym_op->m_src = ut_params->ibuf; 1896 1897 /* iv */ 1898 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1899 iv, iv_len); 1900 sym_op->cipher.data.length = cipher_len; 1901 sym_op->cipher.data.offset = cipher_offset; 1902 return 0; 1903 } 1904 1905 static int 1906 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 1907 unsigned int cipher_len, 1908 unsigned int cipher_offset) 1909 { 1910 struct crypto_testsuite_params *ts_params = &testsuite_params; 1911 struct crypto_unittest_params *ut_params = &unittest_params; 1912 1913 /* Generate Crypto op data structure */ 1914 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1915 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1916 TEST_ASSERT_NOT_NULL(ut_params->op, 1917 "Failed to allocate pktmbuf offload"); 1918 1919 /* Set crypto operation data parameters */ 1920 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 1921 1922 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1923 1924 /* set crypto operation source mbuf */ 1925 sym_op->m_src = ut_params->ibuf; 1926 sym_op->m_dst = ut_params->obuf; 1927 1928 /* iv */ 1929 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1930 iv, iv_len); 1931 sym_op->cipher.data.length = cipher_len; 1932 sym_op->cipher.data.offset = cipher_offset; 1933 return 0; 1934 } 1935 1936 static int 1937 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 1938 enum rte_crypto_cipher_operation cipher_op, 1939 enum rte_crypto_auth_operation auth_op, 1940 enum rte_crypto_auth_algorithm auth_algo, 1941 enum rte_crypto_cipher_algorithm cipher_algo, 1942 const uint8_t *key, uint8_t key_len, 1943 uint8_t auth_iv_len, uint8_t auth_len, 1944 uint8_t cipher_iv_len) 1945 1946 { 1947 uint8_t cipher_auth_key[key_len]; 1948 int status; 1949 1950 struct crypto_testsuite_params *ts_params = &testsuite_params; 1951 struct crypto_unittest_params *ut_params = &unittest_params; 1952 1953 memcpy(cipher_auth_key, key, key_len); 1954 1955 /* Setup Authentication Parameters */ 1956 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1957 ut_params->auth_xform.next = NULL; 1958 1959 ut_params->auth_xform.auth.op = auth_op; 1960 ut_params->auth_xform.auth.algo = auth_algo; 1961 ut_params->auth_xform.auth.key.length = key_len; 1962 /* Hash key = cipher key */ 1963 ut_params->auth_xform.auth.key.data = cipher_auth_key; 1964 ut_params->auth_xform.auth.digest_length = auth_len; 1965 /* Auth IV will be after cipher IV */ 1966 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 1967 ut_params->auth_xform.auth.iv.length = auth_iv_len; 1968 1969 /* Setup Cipher Parameters */ 1970 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1971 ut_params->cipher_xform.next = &ut_params->auth_xform; 1972 1973 ut_params->cipher_xform.cipher.algo = cipher_algo; 1974 ut_params->cipher_xform.cipher.op = cipher_op; 1975 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 1976 ut_params->cipher_xform.cipher.key.length = key_len; 1977 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1978 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 1979 1980 debug_hexdump(stdout, "key:", key, key_len); 1981 1982 /* Create Crypto session*/ 1983 ut_params->sess = rte_cryptodev_sym_session_create( 1984 ts_params->session_mpool); 1985 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 1986 1987 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 1988 &ut_params->cipher_xform, 1989 ts_params->session_priv_mpool); 1990 if (status == -ENOTSUP) 1991 return status; 1992 1993 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 1994 return 0; 1995 } 1996 1997 static int 1998 create_wireless_cipher_auth_session(uint8_t dev_id, 1999 enum rte_crypto_cipher_operation cipher_op, 2000 enum rte_crypto_auth_operation auth_op, 2001 enum rte_crypto_auth_algorithm auth_algo, 2002 enum rte_crypto_cipher_algorithm cipher_algo, 2003 const struct wireless_test_data *tdata) 2004 { 2005 const uint8_t key_len = tdata->key.len; 2006 uint8_t cipher_auth_key[key_len]; 2007 int status; 2008 2009 struct crypto_testsuite_params *ts_params = &testsuite_params; 2010 struct crypto_unittest_params *ut_params = &unittest_params; 2011 const uint8_t *key = tdata->key.data; 2012 const uint8_t auth_len = tdata->digest.len; 2013 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2014 uint8_t auth_iv_len = tdata->auth_iv.len; 2015 2016 memcpy(cipher_auth_key, key, key_len); 2017 2018 /* Setup Authentication Parameters */ 2019 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2020 ut_params->auth_xform.next = NULL; 2021 2022 ut_params->auth_xform.auth.op = auth_op; 2023 ut_params->auth_xform.auth.algo = auth_algo; 2024 ut_params->auth_xform.auth.key.length = key_len; 2025 /* Hash key = cipher key */ 2026 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2027 ut_params->auth_xform.auth.digest_length = auth_len; 2028 /* Auth IV will be after cipher IV */ 2029 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2030 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2031 2032 /* Setup Cipher Parameters */ 2033 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2034 ut_params->cipher_xform.next = &ut_params->auth_xform; 2035 2036 ut_params->cipher_xform.cipher.algo = cipher_algo; 2037 ut_params->cipher_xform.cipher.op = cipher_op; 2038 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2039 ut_params->cipher_xform.cipher.key.length = key_len; 2040 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2041 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2042 2043 2044 debug_hexdump(stdout, "key:", key, key_len); 2045 2046 /* Create Crypto session*/ 2047 ut_params->sess = rte_cryptodev_sym_session_create( 2048 ts_params->session_mpool); 2049 2050 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2051 &ut_params->cipher_xform, 2052 ts_params->session_priv_mpool); 2053 2054 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2055 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2056 return 0; 2057 } 2058 2059 static int 2060 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2061 const struct wireless_test_data *tdata) 2062 { 2063 return create_wireless_cipher_auth_session(dev_id, 2064 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2065 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2066 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2067 } 2068 2069 static int 2070 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2071 enum rte_crypto_cipher_operation cipher_op, 2072 enum rte_crypto_auth_operation auth_op, 2073 enum rte_crypto_auth_algorithm auth_algo, 2074 enum rte_crypto_cipher_algorithm cipher_algo, 2075 const uint8_t *key, const uint8_t key_len, 2076 uint8_t auth_iv_len, uint8_t auth_len, 2077 uint8_t cipher_iv_len) 2078 { 2079 uint8_t auth_cipher_key[key_len]; 2080 int status; 2081 struct crypto_testsuite_params *ts_params = &testsuite_params; 2082 struct crypto_unittest_params *ut_params = &unittest_params; 2083 2084 memcpy(auth_cipher_key, key, key_len); 2085 2086 /* Setup Authentication Parameters */ 2087 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2088 ut_params->auth_xform.auth.op = auth_op; 2089 ut_params->auth_xform.next = &ut_params->cipher_xform; 2090 ut_params->auth_xform.auth.algo = auth_algo; 2091 ut_params->auth_xform.auth.key.length = key_len; 2092 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2093 ut_params->auth_xform.auth.digest_length = auth_len; 2094 /* Auth IV will be after cipher IV */ 2095 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2096 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2097 2098 /* Setup Cipher Parameters */ 2099 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2100 ut_params->cipher_xform.next = NULL; 2101 ut_params->cipher_xform.cipher.algo = cipher_algo; 2102 ut_params->cipher_xform.cipher.op = cipher_op; 2103 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2104 ut_params->cipher_xform.cipher.key.length = key_len; 2105 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2106 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2107 2108 debug_hexdump(stdout, "key:", key, key_len); 2109 2110 /* Create Crypto session*/ 2111 ut_params->sess = rte_cryptodev_sym_session_create( 2112 ts_params->session_mpool); 2113 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2114 2115 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2116 ut_params->auth_xform.next = NULL; 2117 ut_params->cipher_xform.next = &ut_params->auth_xform; 2118 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2119 &ut_params->cipher_xform, 2120 ts_params->session_priv_mpool); 2121 2122 } else 2123 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2124 &ut_params->auth_xform, 2125 ts_params->session_priv_mpool); 2126 2127 if (status == -ENOTSUP) 2128 return status; 2129 2130 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2131 2132 return 0; 2133 } 2134 2135 static int 2136 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2137 unsigned int auth_tag_len, 2138 const uint8_t *iv, unsigned int iv_len, 2139 unsigned int data_pad_len, 2140 enum rte_crypto_auth_operation op, 2141 unsigned int auth_len, unsigned int auth_offset) 2142 { 2143 struct crypto_testsuite_params *ts_params = &testsuite_params; 2144 2145 struct crypto_unittest_params *ut_params = &unittest_params; 2146 2147 /* Generate Crypto op data structure */ 2148 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2149 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2150 TEST_ASSERT_NOT_NULL(ut_params->op, 2151 "Failed to allocate pktmbuf offload"); 2152 2153 /* Set crypto operation data parameters */ 2154 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2155 2156 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2157 2158 /* set crypto operation source mbuf */ 2159 sym_op->m_src = ut_params->ibuf; 2160 2161 /* iv */ 2162 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2163 iv, iv_len); 2164 /* digest */ 2165 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2166 ut_params->ibuf, auth_tag_len); 2167 2168 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2169 "no room to append auth tag"); 2170 ut_params->digest = sym_op->auth.digest.data; 2171 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2172 ut_params->ibuf, data_pad_len); 2173 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2174 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2175 else 2176 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2177 2178 debug_hexdump(stdout, "digest:", 2179 sym_op->auth.digest.data, 2180 auth_tag_len); 2181 2182 sym_op->auth.data.length = auth_len; 2183 sym_op->auth.data.offset = auth_offset; 2184 2185 return 0; 2186 } 2187 2188 static int 2189 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2190 enum rte_crypto_auth_operation op) 2191 { 2192 struct crypto_testsuite_params *ts_params = &testsuite_params; 2193 struct crypto_unittest_params *ut_params = &unittest_params; 2194 2195 const uint8_t *auth_tag = tdata->digest.data; 2196 const unsigned int auth_tag_len = tdata->digest.len; 2197 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2198 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2199 2200 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2201 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2202 const uint8_t *auth_iv = tdata->auth_iv.data; 2203 const uint8_t auth_iv_len = tdata->auth_iv.len; 2204 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2205 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2206 2207 /* Generate Crypto op data structure */ 2208 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2209 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2210 TEST_ASSERT_NOT_NULL(ut_params->op, 2211 "Failed to allocate pktmbuf offload"); 2212 /* Set crypto operation data parameters */ 2213 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2214 2215 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2216 2217 /* set crypto operation source mbuf */ 2218 sym_op->m_src = ut_params->ibuf; 2219 2220 /* digest */ 2221 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2222 ut_params->ibuf, auth_tag_len); 2223 2224 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2225 "no room to append auth tag"); 2226 ut_params->digest = sym_op->auth.digest.data; 2227 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2228 ut_params->ibuf, data_pad_len); 2229 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2230 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2231 else 2232 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2233 2234 debug_hexdump(stdout, "digest:", 2235 sym_op->auth.digest.data, 2236 auth_tag_len); 2237 2238 /* Copy cipher and auth IVs at the end of the crypto operation */ 2239 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2240 IV_OFFSET); 2241 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2242 iv_ptr += cipher_iv_len; 2243 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2244 2245 sym_op->cipher.data.length = cipher_len; 2246 sym_op->cipher.data.offset = 0; 2247 sym_op->auth.data.length = auth_len; 2248 sym_op->auth.data.offset = 0; 2249 2250 return 0; 2251 } 2252 2253 static int 2254 create_zuc_cipher_hash_generate_operation( 2255 const struct wireless_test_data *tdata) 2256 { 2257 return create_wireless_cipher_hash_operation(tdata, 2258 RTE_CRYPTO_AUTH_OP_GENERATE); 2259 } 2260 2261 static int 2262 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2263 const unsigned auth_tag_len, 2264 const uint8_t *auth_iv, uint8_t auth_iv_len, 2265 unsigned data_pad_len, 2266 enum rte_crypto_auth_operation op, 2267 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2268 const unsigned cipher_len, const unsigned cipher_offset, 2269 const unsigned auth_len, const unsigned auth_offset) 2270 { 2271 struct crypto_testsuite_params *ts_params = &testsuite_params; 2272 struct crypto_unittest_params *ut_params = &unittest_params; 2273 2274 enum rte_crypto_cipher_algorithm cipher_algo = 2275 ut_params->cipher_xform.cipher.algo; 2276 enum rte_crypto_auth_algorithm auth_algo = 2277 ut_params->auth_xform.auth.algo; 2278 2279 /* Generate Crypto op data structure */ 2280 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2281 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2282 TEST_ASSERT_NOT_NULL(ut_params->op, 2283 "Failed to allocate pktmbuf offload"); 2284 /* Set crypto operation data parameters */ 2285 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2286 2287 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2288 2289 /* set crypto operation source mbuf */ 2290 sym_op->m_src = ut_params->ibuf; 2291 2292 /* digest */ 2293 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2294 ut_params->ibuf, auth_tag_len); 2295 2296 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2297 "no room to append auth tag"); 2298 ut_params->digest = sym_op->auth.digest.data; 2299 2300 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2301 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2302 ut_params->ibuf, data_pad_len); 2303 } else { 2304 struct rte_mbuf *m = ut_params->ibuf; 2305 unsigned int offset = data_pad_len; 2306 2307 while (offset > m->data_len && m->next != NULL) { 2308 offset -= m->data_len; 2309 m = m->next; 2310 } 2311 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2312 m, offset); 2313 } 2314 2315 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2316 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2317 else 2318 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2319 2320 debug_hexdump(stdout, "digest:", 2321 sym_op->auth.digest.data, 2322 auth_tag_len); 2323 2324 /* Copy cipher and auth IVs at the end of the crypto operation */ 2325 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2326 IV_OFFSET); 2327 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2328 iv_ptr += cipher_iv_len; 2329 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2330 2331 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2332 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2333 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2334 sym_op->cipher.data.length = cipher_len; 2335 sym_op->cipher.data.offset = cipher_offset; 2336 } else { 2337 sym_op->cipher.data.length = cipher_len >> 3; 2338 sym_op->cipher.data.offset = cipher_offset >> 3; 2339 } 2340 2341 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2342 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2343 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2344 sym_op->auth.data.length = auth_len; 2345 sym_op->auth.data.offset = auth_offset; 2346 } else { 2347 sym_op->auth.data.length = auth_len >> 3; 2348 sym_op->auth.data.offset = auth_offset >> 3; 2349 } 2350 2351 return 0; 2352 } 2353 2354 static int 2355 create_wireless_algo_auth_cipher_operation( 2356 const uint8_t *auth_tag, unsigned int auth_tag_len, 2357 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2358 const uint8_t *auth_iv, uint8_t auth_iv_len, 2359 unsigned int data_pad_len, 2360 unsigned int cipher_len, unsigned int cipher_offset, 2361 unsigned int auth_len, unsigned int auth_offset, 2362 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2363 { 2364 struct crypto_testsuite_params *ts_params = &testsuite_params; 2365 struct crypto_unittest_params *ut_params = &unittest_params; 2366 2367 enum rte_crypto_cipher_algorithm cipher_algo = 2368 ut_params->cipher_xform.cipher.algo; 2369 enum rte_crypto_auth_algorithm auth_algo = 2370 ut_params->auth_xform.auth.algo; 2371 2372 /* Generate Crypto op data structure */ 2373 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2374 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2375 TEST_ASSERT_NOT_NULL(ut_params->op, 2376 "Failed to allocate pktmbuf offload"); 2377 2378 /* Set crypto operation data parameters */ 2379 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2380 2381 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2382 2383 /* set crypto operation mbufs */ 2384 sym_op->m_src = ut_params->ibuf; 2385 if (op_mode == OUT_OF_PLACE) 2386 sym_op->m_dst = ut_params->obuf; 2387 2388 /* digest */ 2389 if (!do_sgl) { 2390 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2391 (op_mode == IN_PLACE ? 2392 ut_params->ibuf : ut_params->obuf), 2393 uint8_t *, data_pad_len); 2394 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2395 (op_mode == IN_PLACE ? 2396 ut_params->ibuf : ut_params->obuf), 2397 data_pad_len); 2398 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2399 } else { 2400 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2401 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2402 sym_op->m_src : sym_op->m_dst); 2403 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2404 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2405 sgl_buf = sgl_buf->next; 2406 } 2407 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 2408 uint8_t *, remaining_off); 2409 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 2410 remaining_off); 2411 memset(sym_op->auth.digest.data, 0, remaining_off); 2412 while (sgl_buf->next != NULL) { 2413 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 2414 0, rte_pktmbuf_data_len(sgl_buf)); 2415 sgl_buf = sgl_buf->next; 2416 } 2417 } 2418 2419 /* Copy digest for the verification */ 2420 if (verify) 2421 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2422 2423 /* Copy cipher and auth IVs at the end of the crypto operation */ 2424 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 2425 ut_params->op, uint8_t *, IV_OFFSET); 2426 2427 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2428 iv_ptr += cipher_iv_len; 2429 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2430 2431 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2432 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2433 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2434 sym_op->cipher.data.length = cipher_len; 2435 sym_op->cipher.data.offset = cipher_offset; 2436 } else { 2437 sym_op->cipher.data.length = cipher_len >> 3; 2438 sym_op->cipher.data.offset = cipher_offset >> 3; 2439 } 2440 2441 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2442 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2443 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2444 sym_op->auth.data.length = auth_len; 2445 sym_op->auth.data.offset = auth_offset; 2446 } else { 2447 sym_op->auth.data.length = auth_len >> 3; 2448 sym_op->auth.data.offset = auth_offset >> 3; 2449 } 2450 2451 return 0; 2452 } 2453 2454 static int 2455 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 2456 { 2457 struct crypto_testsuite_params *ts_params = &testsuite_params; 2458 struct crypto_unittest_params *ut_params = &unittest_params; 2459 2460 int retval; 2461 unsigned plaintext_pad_len; 2462 unsigned plaintext_len; 2463 uint8_t *plaintext; 2464 2465 /* QAT PMD supports byte-aligned data only */ 2466 if ((tdata->validAuthLenInBits.len % 8 != 0) && 2467 (gbl_driver_id == rte_cryptodev_driver_id_get( 2468 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))) 2469 return -ENOTSUP; 2470 2471 /* Verify the capabilities */ 2472 struct rte_cryptodev_sym_capability_idx cap_idx; 2473 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2474 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 2475 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2476 &cap_idx) == NULL) 2477 return -ENOTSUP; 2478 2479 /* Create SNOW 3G session */ 2480 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2481 tdata->key.data, tdata->key.len, 2482 tdata->auth_iv.len, tdata->digest.len, 2483 RTE_CRYPTO_AUTH_OP_GENERATE, 2484 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 2485 if (retval < 0) 2486 return retval; 2487 2488 /* alloc mbuf and set payload */ 2489 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2490 2491 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2492 rte_pktmbuf_tailroom(ut_params->ibuf)); 2493 2494 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2495 /* Append data which is padded to a multiple of */ 2496 /* the algorithms block size */ 2497 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2498 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2499 plaintext_pad_len); 2500 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2501 2502 /* Create SNOW 3G operation */ 2503 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 2504 tdata->auth_iv.data, tdata->auth_iv.len, 2505 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 2506 tdata->validAuthLenInBits.len, 2507 0); 2508 if (retval < 0) 2509 return retval; 2510 2511 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2512 ut_params->op); 2513 ut_params->obuf = ut_params->op->sym->m_src; 2514 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2515 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2516 + plaintext_pad_len; 2517 2518 /* Validate obuf */ 2519 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2520 ut_params->digest, 2521 tdata->digest.data, 2522 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 2523 "SNOW 3G Generated auth tag not as expected"); 2524 2525 return 0; 2526 } 2527 2528 static int 2529 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 2530 { 2531 struct crypto_testsuite_params *ts_params = &testsuite_params; 2532 struct crypto_unittest_params *ut_params = &unittest_params; 2533 2534 int retval; 2535 unsigned plaintext_pad_len; 2536 unsigned plaintext_len; 2537 uint8_t *plaintext; 2538 2539 /* QAT PMD supports byte-aligned data only */ 2540 if ((tdata->validAuthLenInBits.len % 8 != 0) && 2541 (gbl_driver_id == rte_cryptodev_driver_id_get( 2542 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))) 2543 return -ENOTSUP; 2544 2545 /* Verify the capabilities */ 2546 struct rte_cryptodev_sym_capability_idx cap_idx; 2547 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2548 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 2549 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2550 &cap_idx) == NULL) 2551 return -ENOTSUP; 2552 2553 /* Create SNOW 3G session */ 2554 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2555 tdata->key.data, tdata->key.len, 2556 tdata->auth_iv.len, tdata->digest.len, 2557 RTE_CRYPTO_AUTH_OP_VERIFY, 2558 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 2559 if (retval < 0) 2560 return retval; 2561 /* alloc mbuf and set payload */ 2562 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2563 2564 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2565 rte_pktmbuf_tailroom(ut_params->ibuf)); 2566 2567 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2568 /* Append data which is padded to a multiple of */ 2569 /* the algorithms block size */ 2570 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2571 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2572 plaintext_pad_len); 2573 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2574 2575 /* Create SNOW 3G operation */ 2576 retval = create_wireless_algo_hash_operation(tdata->digest.data, 2577 tdata->digest.len, 2578 tdata->auth_iv.data, tdata->auth_iv.len, 2579 plaintext_pad_len, 2580 RTE_CRYPTO_AUTH_OP_VERIFY, 2581 tdata->validAuthLenInBits.len, 2582 0); 2583 if (retval < 0) 2584 return retval; 2585 2586 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2587 ut_params->op); 2588 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2589 ut_params->obuf = ut_params->op->sym->m_src; 2590 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2591 + plaintext_pad_len; 2592 2593 /* Validate obuf */ 2594 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 2595 return 0; 2596 else 2597 return -1; 2598 2599 return 0; 2600 } 2601 2602 static int 2603 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 2604 { 2605 struct crypto_testsuite_params *ts_params = &testsuite_params; 2606 struct crypto_unittest_params *ut_params = &unittest_params; 2607 2608 int retval; 2609 unsigned plaintext_pad_len; 2610 unsigned plaintext_len; 2611 uint8_t *plaintext; 2612 2613 /* Verify the capabilities */ 2614 struct rte_cryptodev_sym_capability_idx cap_idx; 2615 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2616 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 2617 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2618 &cap_idx) == NULL) 2619 return -ENOTSUP; 2620 2621 /* Create KASUMI session */ 2622 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2623 tdata->key.data, tdata->key.len, 2624 0, tdata->digest.len, 2625 RTE_CRYPTO_AUTH_OP_GENERATE, 2626 RTE_CRYPTO_AUTH_KASUMI_F9); 2627 if (retval < 0) 2628 return retval; 2629 2630 /* alloc mbuf and set payload */ 2631 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2632 2633 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2634 rte_pktmbuf_tailroom(ut_params->ibuf)); 2635 2636 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2637 /* Append data which is padded to a multiple of */ 2638 /* the algorithms block size */ 2639 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 2640 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2641 plaintext_pad_len); 2642 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2643 2644 /* Create KASUMI operation */ 2645 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 2646 NULL, 0, 2647 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 2648 tdata->plaintext.len, 2649 0); 2650 if (retval < 0) 2651 return retval; 2652 2653 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2654 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2655 ut_params->op); 2656 else 2657 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2658 ut_params->op); 2659 2660 ut_params->obuf = ut_params->op->sym->m_src; 2661 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2662 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2663 + plaintext_pad_len; 2664 2665 /* Validate obuf */ 2666 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2667 ut_params->digest, 2668 tdata->digest.data, 2669 DIGEST_BYTE_LENGTH_KASUMI_F9, 2670 "KASUMI Generated auth tag not as expected"); 2671 2672 return 0; 2673 } 2674 2675 static int 2676 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 2677 { 2678 struct crypto_testsuite_params *ts_params = &testsuite_params; 2679 struct crypto_unittest_params *ut_params = &unittest_params; 2680 2681 int retval; 2682 unsigned plaintext_pad_len; 2683 unsigned plaintext_len; 2684 uint8_t *plaintext; 2685 2686 /* Verify the capabilities */ 2687 struct rte_cryptodev_sym_capability_idx cap_idx; 2688 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2689 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 2690 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2691 &cap_idx) == NULL) 2692 return -ENOTSUP; 2693 2694 /* Create KASUMI session */ 2695 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2696 tdata->key.data, tdata->key.len, 2697 0, tdata->digest.len, 2698 RTE_CRYPTO_AUTH_OP_VERIFY, 2699 RTE_CRYPTO_AUTH_KASUMI_F9); 2700 if (retval < 0) 2701 return retval; 2702 /* alloc mbuf and set payload */ 2703 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2704 2705 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2706 rte_pktmbuf_tailroom(ut_params->ibuf)); 2707 2708 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2709 /* Append data which is padded to a multiple */ 2710 /* of the algorithms block size */ 2711 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 2712 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2713 plaintext_pad_len); 2714 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2715 2716 /* Create KASUMI operation */ 2717 retval = create_wireless_algo_hash_operation(tdata->digest.data, 2718 tdata->digest.len, 2719 NULL, 0, 2720 plaintext_pad_len, 2721 RTE_CRYPTO_AUTH_OP_VERIFY, 2722 tdata->plaintext.len, 2723 0); 2724 if (retval < 0) 2725 return retval; 2726 2727 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2728 ut_params->op); 2729 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2730 ut_params->obuf = ut_params->op->sym->m_src; 2731 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2732 + plaintext_pad_len; 2733 2734 /* Validate obuf */ 2735 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 2736 return 0; 2737 else 2738 return -1; 2739 2740 return 0; 2741 } 2742 2743 static int 2744 test_snow3g_hash_generate_test_case_1(void) 2745 { 2746 return test_snow3g_authentication(&snow3g_hash_test_case_1); 2747 } 2748 2749 static int 2750 test_snow3g_hash_generate_test_case_2(void) 2751 { 2752 return test_snow3g_authentication(&snow3g_hash_test_case_2); 2753 } 2754 2755 static int 2756 test_snow3g_hash_generate_test_case_3(void) 2757 { 2758 return test_snow3g_authentication(&snow3g_hash_test_case_3); 2759 } 2760 2761 static int 2762 test_snow3g_hash_generate_test_case_4(void) 2763 { 2764 return test_snow3g_authentication(&snow3g_hash_test_case_4); 2765 } 2766 2767 static int 2768 test_snow3g_hash_generate_test_case_5(void) 2769 { 2770 return test_snow3g_authentication(&snow3g_hash_test_case_5); 2771 } 2772 2773 static int 2774 test_snow3g_hash_generate_test_case_6(void) 2775 { 2776 return test_snow3g_authentication(&snow3g_hash_test_case_6); 2777 } 2778 2779 static int 2780 test_snow3g_hash_verify_test_case_1(void) 2781 { 2782 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 2783 2784 } 2785 2786 static int 2787 test_snow3g_hash_verify_test_case_2(void) 2788 { 2789 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 2790 } 2791 2792 static int 2793 test_snow3g_hash_verify_test_case_3(void) 2794 { 2795 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 2796 } 2797 2798 static int 2799 test_snow3g_hash_verify_test_case_4(void) 2800 { 2801 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 2802 } 2803 2804 static int 2805 test_snow3g_hash_verify_test_case_5(void) 2806 { 2807 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 2808 } 2809 2810 static int 2811 test_snow3g_hash_verify_test_case_6(void) 2812 { 2813 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 2814 } 2815 2816 static int 2817 test_kasumi_hash_generate_test_case_1(void) 2818 { 2819 return test_kasumi_authentication(&kasumi_hash_test_case_1); 2820 } 2821 2822 static int 2823 test_kasumi_hash_generate_test_case_2(void) 2824 { 2825 return test_kasumi_authentication(&kasumi_hash_test_case_2); 2826 } 2827 2828 static int 2829 test_kasumi_hash_generate_test_case_3(void) 2830 { 2831 return test_kasumi_authentication(&kasumi_hash_test_case_3); 2832 } 2833 2834 static int 2835 test_kasumi_hash_generate_test_case_4(void) 2836 { 2837 return test_kasumi_authentication(&kasumi_hash_test_case_4); 2838 } 2839 2840 static int 2841 test_kasumi_hash_generate_test_case_5(void) 2842 { 2843 return test_kasumi_authentication(&kasumi_hash_test_case_5); 2844 } 2845 2846 static int 2847 test_kasumi_hash_generate_test_case_6(void) 2848 { 2849 return test_kasumi_authentication(&kasumi_hash_test_case_6); 2850 } 2851 2852 static int 2853 test_kasumi_hash_verify_test_case_1(void) 2854 { 2855 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 2856 } 2857 2858 static int 2859 test_kasumi_hash_verify_test_case_2(void) 2860 { 2861 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 2862 } 2863 2864 static int 2865 test_kasumi_hash_verify_test_case_3(void) 2866 { 2867 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 2868 } 2869 2870 static int 2871 test_kasumi_hash_verify_test_case_4(void) 2872 { 2873 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 2874 } 2875 2876 static int 2877 test_kasumi_hash_verify_test_case_5(void) 2878 { 2879 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 2880 } 2881 2882 static int 2883 test_kasumi_encryption(const struct kasumi_test_data *tdata) 2884 { 2885 struct crypto_testsuite_params *ts_params = &testsuite_params; 2886 struct crypto_unittest_params *ut_params = &unittest_params; 2887 2888 int retval; 2889 uint8_t *plaintext, *ciphertext; 2890 unsigned plaintext_pad_len; 2891 unsigned plaintext_len; 2892 2893 /* Verify the capabilities */ 2894 struct rte_cryptodev_sym_capability_idx cap_idx; 2895 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2896 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 2897 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2898 &cap_idx) == NULL) 2899 return -ENOTSUP; 2900 2901 /* Create KASUMI session */ 2902 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 2903 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2904 RTE_CRYPTO_CIPHER_KASUMI_F8, 2905 tdata->key.data, tdata->key.len, 2906 tdata->cipher_iv.len); 2907 if (retval < 0) 2908 return retval; 2909 2910 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2911 2912 /* Clear mbuf payload */ 2913 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2914 rte_pktmbuf_tailroom(ut_params->ibuf)); 2915 2916 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2917 /* Append data which is padded to a multiple */ 2918 /* of the algorithms block size */ 2919 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 2920 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2921 plaintext_pad_len); 2922 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2923 2924 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 2925 2926 /* Create KASUMI operation */ 2927 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 2928 tdata->cipher_iv.len, 2929 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 2930 tdata->validCipherOffsetInBits.len); 2931 if (retval < 0) 2932 return retval; 2933 2934 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2935 ut_params->op); 2936 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2937 2938 ut_params->obuf = ut_params->op->sym->m_dst; 2939 if (ut_params->obuf) 2940 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 2941 else 2942 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 2943 2944 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 2945 2946 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 2947 (tdata->validCipherOffsetInBits.len >> 3); 2948 /* Validate obuf */ 2949 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 2950 ciphertext, 2951 reference_ciphertext, 2952 tdata->validCipherLenInBits.len, 2953 "KASUMI Ciphertext data not as expected"); 2954 return 0; 2955 } 2956 2957 static int 2958 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 2959 { 2960 struct crypto_testsuite_params *ts_params = &testsuite_params; 2961 struct crypto_unittest_params *ut_params = &unittest_params; 2962 2963 int retval; 2964 2965 unsigned int plaintext_pad_len; 2966 unsigned int plaintext_len; 2967 2968 uint8_t buffer[10000]; 2969 const uint8_t *ciphertext; 2970 2971 struct rte_cryptodev_info dev_info; 2972 2973 /* Verify the capabilities */ 2974 struct rte_cryptodev_sym_capability_idx cap_idx; 2975 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2976 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 2977 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2978 &cap_idx) == NULL) 2979 return -ENOTSUP; 2980 2981 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 2982 2983 uint64_t feat_flags = dev_info.feature_flags; 2984 2985 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 2986 printf("Device doesn't support in-place scatter-gather. " 2987 "Test Skipped.\n"); 2988 return -ENOTSUP; 2989 } 2990 2991 /* Create KASUMI session */ 2992 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 2993 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2994 RTE_CRYPTO_CIPHER_KASUMI_F8, 2995 tdata->key.data, tdata->key.len, 2996 tdata->cipher_iv.len); 2997 if (retval < 0) 2998 return retval; 2999 3000 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3001 3002 3003 /* Append data which is padded to a multiple */ 3004 /* of the algorithms block size */ 3005 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3006 3007 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3008 plaintext_pad_len, 10, 0); 3009 3010 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3011 3012 /* Create KASUMI operation */ 3013 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3014 tdata->cipher_iv.len, 3015 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3016 tdata->validCipherOffsetInBits.len); 3017 if (retval < 0) 3018 return retval; 3019 3020 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3021 ut_params->op); 3022 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3023 3024 ut_params->obuf = ut_params->op->sym->m_dst; 3025 3026 if (ut_params->obuf) 3027 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3028 plaintext_len, buffer); 3029 else 3030 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3031 tdata->validCipherOffsetInBits.len >> 3, 3032 plaintext_len, buffer); 3033 3034 /* Validate obuf */ 3035 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3036 3037 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3038 (tdata->validCipherOffsetInBits.len >> 3); 3039 /* Validate obuf */ 3040 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3041 ciphertext, 3042 reference_ciphertext, 3043 tdata->validCipherLenInBits.len, 3044 "KASUMI Ciphertext data not as expected"); 3045 return 0; 3046 } 3047 3048 static int 3049 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3050 { 3051 struct crypto_testsuite_params *ts_params = &testsuite_params; 3052 struct crypto_unittest_params *ut_params = &unittest_params; 3053 3054 int retval; 3055 uint8_t *plaintext, *ciphertext; 3056 unsigned plaintext_pad_len; 3057 unsigned plaintext_len; 3058 3059 /* Verify the capabilities */ 3060 struct rte_cryptodev_sym_capability_idx cap_idx; 3061 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3062 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3063 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3064 &cap_idx) == NULL) 3065 return -ENOTSUP; 3066 3067 /* Create KASUMI session */ 3068 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3069 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3070 RTE_CRYPTO_CIPHER_KASUMI_F8, 3071 tdata->key.data, tdata->key.len, 3072 tdata->cipher_iv.len); 3073 if (retval < 0) 3074 return retval; 3075 3076 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3077 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3078 3079 /* Clear mbuf payload */ 3080 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3081 rte_pktmbuf_tailroom(ut_params->ibuf)); 3082 3083 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3084 /* Append data which is padded to a multiple */ 3085 /* of the algorithms block size */ 3086 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3087 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3088 plaintext_pad_len); 3089 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3090 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3091 3092 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3093 3094 /* Create KASUMI operation */ 3095 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3096 tdata->cipher_iv.len, 3097 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3098 tdata->validCipherOffsetInBits.len); 3099 if (retval < 0) 3100 return retval; 3101 3102 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3103 ut_params->op); 3104 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3105 3106 ut_params->obuf = ut_params->op->sym->m_dst; 3107 if (ut_params->obuf) 3108 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3109 else 3110 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3111 3112 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3113 3114 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3115 (tdata->validCipherOffsetInBits.len >> 3); 3116 /* Validate obuf */ 3117 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3118 ciphertext, 3119 reference_ciphertext, 3120 tdata->validCipherLenInBits.len, 3121 "KASUMI Ciphertext data not as expected"); 3122 return 0; 3123 } 3124 3125 static int 3126 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3127 { 3128 struct crypto_testsuite_params *ts_params = &testsuite_params; 3129 struct crypto_unittest_params *ut_params = &unittest_params; 3130 3131 int retval; 3132 unsigned int plaintext_pad_len; 3133 unsigned int plaintext_len; 3134 3135 const uint8_t *ciphertext; 3136 uint8_t buffer[2048]; 3137 3138 struct rte_cryptodev_info dev_info; 3139 3140 /* Verify the capabilities */ 3141 struct rte_cryptodev_sym_capability_idx cap_idx; 3142 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3143 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3144 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3145 &cap_idx) == NULL) 3146 return -ENOTSUP; 3147 3148 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3149 3150 uint64_t feat_flags = dev_info.feature_flags; 3151 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3152 printf("Device doesn't support out-of-place scatter-gather " 3153 "in both input and output mbufs. " 3154 "Test Skipped.\n"); 3155 return -ENOTSUP; 3156 } 3157 3158 /* Create KASUMI session */ 3159 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3160 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3161 RTE_CRYPTO_CIPHER_KASUMI_F8, 3162 tdata->key.data, tdata->key.len, 3163 tdata->cipher_iv.len); 3164 if (retval < 0) 3165 return retval; 3166 3167 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3168 /* Append data which is padded to a multiple */ 3169 /* of the algorithms block size */ 3170 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3171 3172 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3173 plaintext_pad_len, 10, 0); 3174 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3175 plaintext_pad_len, 3, 0); 3176 3177 /* Append data which is padded to a multiple */ 3178 /* of the algorithms block size */ 3179 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3180 3181 /* Create KASUMI operation */ 3182 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3183 tdata->cipher_iv.len, 3184 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3185 tdata->validCipherOffsetInBits.len); 3186 if (retval < 0) 3187 return retval; 3188 3189 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3190 ut_params->op); 3191 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3192 3193 ut_params->obuf = ut_params->op->sym->m_dst; 3194 if (ut_params->obuf) 3195 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3196 plaintext_pad_len, buffer); 3197 else 3198 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3199 tdata->validCipherOffsetInBits.len >> 3, 3200 plaintext_pad_len, buffer); 3201 3202 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3203 (tdata->validCipherOffsetInBits.len >> 3); 3204 /* Validate obuf */ 3205 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3206 ciphertext, 3207 reference_ciphertext, 3208 tdata->validCipherLenInBits.len, 3209 "KASUMI Ciphertext data not as expected"); 3210 return 0; 3211 } 3212 3213 3214 static int 3215 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3216 { 3217 struct crypto_testsuite_params *ts_params = &testsuite_params; 3218 struct crypto_unittest_params *ut_params = &unittest_params; 3219 3220 int retval; 3221 uint8_t *ciphertext, *plaintext; 3222 unsigned ciphertext_pad_len; 3223 unsigned ciphertext_len; 3224 3225 /* Verify the capabilities */ 3226 struct rte_cryptodev_sym_capability_idx cap_idx; 3227 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3228 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3229 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3230 &cap_idx) == NULL) 3231 return -ENOTSUP; 3232 3233 /* Create KASUMI session */ 3234 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3235 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3236 RTE_CRYPTO_CIPHER_KASUMI_F8, 3237 tdata->key.data, tdata->key.len, 3238 tdata->cipher_iv.len); 3239 if (retval < 0) 3240 return retval; 3241 3242 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3243 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3244 3245 /* Clear mbuf payload */ 3246 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3247 rte_pktmbuf_tailroom(ut_params->ibuf)); 3248 3249 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3250 /* Append data which is padded to a multiple */ 3251 /* of the algorithms block size */ 3252 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3253 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3254 ciphertext_pad_len); 3255 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3256 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3257 3258 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3259 3260 /* Create KASUMI operation */ 3261 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3262 tdata->cipher_iv.len, 3263 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3264 tdata->validCipherOffsetInBits.len); 3265 if (retval < 0) 3266 return retval; 3267 3268 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3269 ut_params->op); 3270 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3271 3272 ut_params->obuf = ut_params->op->sym->m_dst; 3273 if (ut_params->obuf) 3274 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3275 else 3276 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3277 3278 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3279 3280 const uint8_t *reference_plaintext = tdata->plaintext.data + 3281 (tdata->validCipherOffsetInBits.len >> 3); 3282 /* Validate obuf */ 3283 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3284 plaintext, 3285 reference_plaintext, 3286 tdata->validCipherLenInBits.len, 3287 "KASUMI Plaintext data not as expected"); 3288 return 0; 3289 } 3290 3291 static int 3292 test_kasumi_decryption(const struct kasumi_test_data *tdata) 3293 { 3294 struct crypto_testsuite_params *ts_params = &testsuite_params; 3295 struct crypto_unittest_params *ut_params = &unittest_params; 3296 3297 int retval; 3298 uint8_t *ciphertext, *plaintext; 3299 unsigned ciphertext_pad_len; 3300 unsigned ciphertext_len; 3301 3302 /* Verify the capabilities */ 3303 struct rte_cryptodev_sym_capability_idx cap_idx; 3304 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3305 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3306 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3307 &cap_idx) == NULL) 3308 return -ENOTSUP; 3309 3310 /* Create KASUMI session */ 3311 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3312 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3313 RTE_CRYPTO_CIPHER_KASUMI_F8, 3314 tdata->key.data, tdata->key.len, 3315 tdata->cipher_iv.len); 3316 if (retval < 0) 3317 return retval; 3318 3319 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3320 3321 /* Clear mbuf payload */ 3322 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3323 rte_pktmbuf_tailroom(ut_params->ibuf)); 3324 3325 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3326 /* Append data which is padded to a multiple */ 3327 /* of the algorithms block size */ 3328 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3329 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3330 ciphertext_pad_len); 3331 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3332 3333 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3334 3335 /* Create KASUMI operation */ 3336 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3337 tdata->cipher_iv.len, 3338 tdata->ciphertext.len, 3339 tdata->validCipherOffsetInBits.len); 3340 if (retval < 0) 3341 return retval; 3342 3343 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3344 ut_params->op); 3345 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3346 3347 ut_params->obuf = ut_params->op->sym->m_dst; 3348 if (ut_params->obuf) 3349 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3350 else 3351 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3352 3353 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3354 3355 const uint8_t *reference_plaintext = tdata->plaintext.data + 3356 (tdata->validCipherOffsetInBits.len >> 3); 3357 /* Validate obuf */ 3358 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3359 plaintext, 3360 reference_plaintext, 3361 tdata->validCipherLenInBits.len, 3362 "KASUMI Plaintext data not as expected"); 3363 return 0; 3364 } 3365 3366 static int 3367 test_snow3g_encryption(const struct snow3g_test_data *tdata) 3368 { 3369 struct crypto_testsuite_params *ts_params = &testsuite_params; 3370 struct crypto_unittest_params *ut_params = &unittest_params; 3371 3372 int retval; 3373 uint8_t *plaintext, *ciphertext; 3374 unsigned plaintext_pad_len; 3375 unsigned plaintext_len; 3376 3377 /* Verify the capabilities */ 3378 struct rte_cryptodev_sym_capability_idx cap_idx; 3379 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3380 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3381 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3382 &cap_idx) == NULL) 3383 return -ENOTSUP; 3384 3385 /* Create SNOW 3G session */ 3386 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3387 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3388 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3389 tdata->key.data, tdata->key.len, 3390 tdata->cipher_iv.len); 3391 if (retval < 0) 3392 return retval; 3393 3394 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3395 3396 /* Clear mbuf payload */ 3397 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3398 rte_pktmbuf_tailroom(ut_params->ibuf)); 3399 3400 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3401 /* Append data which is padded to a multiple of */ 3402 /* the algorithms block size */ 3403 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3404 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3405 plaintext_pad_len); 3406 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3407 3408 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3409 3410 /* Create SNOW 3G operation */ 3411 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3412 tdata->cipher_iv.len, 3413 tdata->validCipherLenInBits.len, 3414 0); 3415 if (retval < 0) 3416 return retval; 3417 3418 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3419 ut_params->op); 3420 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3421 3422 ut_params->obuf = ut_params->op->sym->m_dst; 3423 if (ut_params->obuf) 3424 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3425 else 3426 ciphertext = plaintext; 3427 3428 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3429 3430 /* Validate obuf */ 3431 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3432 ciphertext, 3433 tdata->ciphertext.data, 3434 tdata->validDataLenInBits.len, 3435 "SNOW 3G Ciphertext data not as expected"); 3436 return 0; 3437 } 3438 3439 3440 static int 3441 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 3442 { 3443 struct crypto_testsuite_params *ts_params = &testsuite_params; 3444 struct crypto_unittest_params *ut_params = &unittest_params; 3445 uint8_t *plaintext, *ciphertext; 3446 3447 int retval; 3448 unsigned plaintext_pad_len; 3449 unsigned plaintext_len; 3450 3451 /* Verify the capabilities */ 3452 struct rte_cryptodev_sym_capability_idx cap_idx; 3453 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3454 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3455 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3456 &cap_idx) == NULL) 3457 return -ENOTSUP; 3458 3459 /* Create SNOW 3G session */ 3460 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3461 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3462 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3463 tdata->key.data, tdata->key.len, 3464 tdata->cipher_iv.len); 3465 if (retval < 0) 3466 return retval; 3467 3468 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3469 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3470 3471 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3472 "Failed to allocate input buffer in mempool"); 3473 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3474 "Failed to allocate output buffer in mempool"); 3475 3476 /* Clear mbuf payload */ 3477 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3478 rte_pktmbuf_tailroom(ut_params->ibuf)); 3479 3480 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3481 /* Append data which is padded to a multiple of */ 3482 /* the algorithms block size */ 3483 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3484 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3485 plaintext_pad_len); 3486 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3487 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3488 3489 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3490 3491 /* Create SNOW 3G operation */ 3492 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3493 tdata->cipher_iv.len, 3494 tdata->validCipherLenInBits.len, 3495 0); 3496 if (retval < 0) 3497 return retval; 3498 3499 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3500 ut_params->op); 3501 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3502 3503 ut_params->obuf = ut_params->op->sym->m_dst; 3504 if (ut_params->obuf) 3505 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3506 else 3507 ciphertext = plaintext; 3508 3509 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3510 3511 /* Validate obuf */ 3512 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3513 ciphertext, 3514 tdata->ciphertext.data, 3515 tdata->validDataLenInBits.len, 3516 "SNOW 3G Ciphertext data not as expected"); 3517 return 0; 3518 } 3519 3520 static int 3521 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 3522 { 3523 struct crypto_testsuite_params *ts_params = &testsuite_params; 3524 struct crypto_unittest_params *ut_params = &unittest_params; 3525 3526 int retval; 3527 unsigned int plaintext_pad_len; 3528 unsigned int plaintext_len; 3529 uint8_t buffer[10000]; 3530 const uint8_t *ciphertext; 3531 3532 struct rte_cryptodev_info dev_info; 3533 3534 /* Verify the capabilities */ 3535 struct rte_cryptodev_sym_capability_idx cap_idx; 3536 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3537 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3538 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3539 &cap_idx) == NULL) 3540 return -ENOTSUP; 3541 3542 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3543 3544 uint64_t feat_flags = dev_info.feature_flags; 3545 3546 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3547 printf("Device doesn't support out-of-place scatter-gather " 3548 "in both input and output mbufs. " 3549 "Test Skipped.\n"); 3550 return -ENOTSUP; 3551 } 3552 3553 /* Create SNOW 3G session */ 3554 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3555 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3556 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3557 tdata->key.data, tdata->key.len, 3558 tdata->cipher_iv.len); 3559 if (retval < 0) 3560 return retval; 3561 3562 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3563 /* Append data which is padded to a multiple of */ 3564 /* the algorithms block size */ 3565 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3566 3567 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3568 plaintext_pad_len, 10, 0); 3569 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3570 plaintext_pad_len, 3, 0); 3571 3572 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3573 "Failed to allocate input buffer in mempool"); 3574 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3575 "Failed to allocate output buffer in mempool"); 3576 3577 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3578 3579 /* Create SNOW 3G operation */ 3580 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3581 tdata->cipher_iv.len, 3582 tdata->validCipherLenInBits.len, 3583 0); 3584 if (retval < 0) 3585 return retval; 3586 3587 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3588 ut_params->op); 3589 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3590 3591 ut_params->obuf = ut_params->op->sym->m_dst; 3592 if (ut_params->obuf) 3593 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3594 plaintext_len, buffer); 3595 else 3596 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 3597 plaintext_len, buffer); 3598 3599 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3600 3601 /* Validate obuf */ 3602 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3603 ciphertext, 3604 tdata->ciphertext.data, 3605 tdata->validDataLenInBits.len, 3606 "SNOW 3G Ciphertext data not as expected"); 3607 3608 return 0; 3609 } 3610 3611 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 3612 static void 3613 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 3614 { 3615 uint8_t curr_byte, prev_byte; 3616 uint32_t length_in_bytes = ceil_byte_length(length + offset); 3617 uint8_t lower_byte_mask = (1 << offset) - 1; 3618 unsigned i; 3619 3620 prev_byte = buffer[0]; 3621 buffer[0] >>= offset; 3622 3623 for (i = 1; i < length_in_bytes; i++) { 3624 curr_byte = buffer[i]; 3625 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 3626 (curr_byte >> offset); 3627 prev_byte = curr_byte; 3628 } 3629 } 3630 3631 static int 3632 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 3633 { 3634 struct crypto_testsuite_params *ts_params = &testsuite_params; 3635 struct crypto_unittest_params *ut_params = &unittest_params; 3636 uint8_t *plaintext, *ciphertext; 3637 int retval; 3638 uint32_t plaintext_len; 3639 uint32_t plaintext_pad_len; 3640 uint8_t extra_offset = 4; 3641 uint8_t *expected_ciphertext_shifted; 3642 3643 /* QAT PMD supports byte-aligned data only */ 3644 if (gbl_driver_id == rte_cryptodev_driver_id_get( 3645 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD))) 3646 return -ENOTSUP; 3647 3648 /* Verify the capabilities */ 3649 struct rte_cryptodev_sym_capability_idx cap_idx; 3650 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3651 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3652 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3653 &cap_idx) == NULL) 3654 return -ENOTSUP; 3655 3656 /* Create SNOW 3G session */ 3657 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3658 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3659 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3660 tdata->key.data, tdata->key.len, 3661 tdata->cipher_iv.len); 3662 if (retval < 0) 3663 return retval; 3664 3665 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3666 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3667 3668 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3669 "Failed to allocate input buffer in mempool"); 3670 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3671 "Failed to allocate output buffer in mempool"); 3672 3673 /* Clear mbuf payload */ 3674 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3675 rte_pktmbuf_tailroom(ut_params->ibuf)); 3676 3677 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 3678 /* 3679 * Append data which is padded to a 3680 * multiple of the algorithms block size 3681 */ 3682 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3683 3684 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 3685 plaintext_pad_len); 3686 3687 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3688 3689 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 3690 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 3691 3692 #ifdef RTE_APP_TEST_DEBUG 3693 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 3694 #endif 3695 /* Create SNOW 3G operation */ 3696 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3697 tdata->cipher_iv.len, 3698 tdata->validCipherLenInBits.len, 3699 extra_offset); 3700 if (retval < 0) 3701 return retval; 3702 3703 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3704 ut_params->op); 3705 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3706 3707 ut_params->obuf = ut_params->op->sym->m_dst; 3708 if (ut_params->obuf) 3709 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3710 else 3711 ciphertext = plaintext; 3712 3713 #ifdef RTE_APP_TEST_DEBUG 3714 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3715 #endif 3716 3717 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 3718 3719 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 3720 "failed to reserve memory for ciphertext shifted\n"); 3721 3722 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 3723 ceil_byte_length(tdata->ciphertext.len)); 3724 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 3725 extra_offset); 3726 /* Validate obuf */ 3727 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 3728 ciphertext, 3729 expected_ciphertext_shifted, 3730 tdata->validDataLenInBits.len, 3731 extra_offset, 3732 "SNOW 3G Ciphertext data not as expected"); 3733 return 0; 3734 } 3735 3736 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 3737 { 3738 struct crypto_testsuite_params *ts_params = &testsuite_params; 3739 struct crypto_unittest_params *ut_params = &unittest_params; 3740 3741 int retval; 3742 3743 uint8_t *plaintext, *ciphertext; 3744 unsigned ciphertext_pad_len; 3745 unsigned ciphertext_len; 3746 3747 /* Verify the capabilities */ 3748 struct rte_cryptodev_sym_capability_idx cap_idx; 3749 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3750 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3751 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3752 &cap_idx) == NULL) 3753 return -ENOTSUP; 3754 3755 /* Create SNOW 3G session */ 3756 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3757 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3758 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3759 tdata->key.data, tdata->key.len, 3760 tdata->cipher_iv.len); 3761 if (retval < 0) 3762 return retval; 3763 3764 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3765 3766 /* Clear mbuf payload */ 3767 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3768 rte_pktmbuf_tailroom(ut_params->ibuf)); 3769 3770 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3771 /* Append data which is padded to a multiple of */ 3772 /* the algorithms block size */ 3773 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 3774 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3775 ciphertext_pad_len); 3776 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3777 3778 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3779 3780 /* Create SNOW 3G operation */ 3781 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3782 tdata->cipher_iv.len, 3783 tdata->validCipherLenInBits.len, 3784 tdata->cipher.offset_bits); 3785 if (retval < 0) 3786 return retval; 3787 3788 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3789 ut_params->op); 3790 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3791 ut_params->obuf = ut_params->op->sym->m_dst; 3792 if (ut_params->obuf) 3793 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3794 else 3795 plaintext = ciphertext; 3796 3797 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3798 3799 /* Validate obuf */ 3800 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 3801 tdata->plaintext.data, 3802 tdata->validDataLenInBits.len, 3803 "SNOW 3G Plaintext data not as expected"); 3804 return 0; 3805 } 3806 3807 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 3808 { 3809 struct crypto_testsuite_params *ts_params = &testsuite_params; 3810 struct crypto_unittest_params *ut_params = &unittest_params; 3811 3812 int retval; 3813 3814 uint8_t *plaintext, *ciphertext; 3815 unsigned ciphertext_pad_len; 3816 unsigned ciphertext_len; 3817 3818 /* Verify the capabilities */ 3819 struct rte_cryptodev_sym_capability_idx cap_idx; 3820 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3821 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3822 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3823 &cap_idx) == NULL) 3824 return -ENOTSUP; 3825 3826 /* Create SNOW 3G session */ 3827 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3828 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3829 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3830 tdata->key.data, tdata->key.len, 3831 tdata->cipher_iv.len); 3832 if (retval < 0) 3833 return retval; 3834 3835 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3836 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3837 3838 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3839 "Failed to allocate input buffer"); 3840 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3841 "Failed to allocate output buffer"); 3842 3843 /* Clear mbuf payload */ 3844 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3845 rte_pktmbuf_tailroom(ut_params->ibuf)); 3846 3847 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 3848 rte_pktmbuf_tailroom(ut_params->obuf)); 3849 3850 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3851 /* Append data which is padded to a multiple of */ 3852 /* the algorithms block size */ 3853 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 3854 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3855 ciphertext_pad_len); 3856 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3857 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3858 3859 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3860 3861 /* Create SNOW 3G operation */ 3862 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3863 tdata->cipher_iv.len, 3864 tdata->validCipherLenInBits.len, 3865 0); 3866 if (retval < 0) 3867 return retval; 3868 3869 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3870 ut_params->op); 3871 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3872 ut_params->obuf = ut_params->op->sym->m_dst; 3873 if (ut_params->obuf) 3874 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3875 else 3876 plaintext = ciphertext; 3877 3878 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3879 3880 /* Validate obuf */ 3881 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 3882 tdata->plaintext.data, 3883 tdata->validDataLenInBits.len, 3884 "SNOW 3G Plaintext data not as expected"); 3885 return 0; 3886 } 3887 3888 static int 3889 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 3890 { 3891 struct crypto_testsuite_params *ts_params = &testsuite_params; 3892 struct crypto_unittest_params *ut_params = &unittest_params; 3893 3894 int retval; 3895 3896 uint8_t *plaintext, *ciphertext; 3897 unsigned int plaintext_pad_len; 3898 unsigned int plaintext_len; 3899 3900 struct rte_cryptodev_sym_capability_idx cap_idx; 3901 3902 /* Check if device supports ZUC EEA3 */ 3903 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3904 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 3905 3906 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3907 &cap_idx) == NULL) 3908 return -ENOTSUP; 3909 3910 /* Check if device supports ZUC EIA3 */ 3911 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3912 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 3913 3914 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3915 &cap_idx) == NULL) 3916 return -ENOTSUP; 3917 3918 /* Create ZUC session */ 3919 retval = create_zuc_cipher_auth_encrypt_generate_session( 3920 ts_params->valid_devs[0], 3921 tdata); 3922 if (retval < 0) 3923 return retval; 3924 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3925 3926 /* clear mbuf payload */ 3927 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3928 rte_pktmbuf_tailroom(ut_params->ibuf)); 3929 3930 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3931 /* Append data which is padded to a multiple of */ 3932 /* the algorithms block size */ 3933 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3934 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3935 plaintext_pad_len); 3936 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3937 3938 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3939 3940 /* Create ZUC operation */ 3941 retval = create_zuc_cipher_hash_generate_operation(tdata); 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 ut_params->obuf = ut_params->op->sym->m_src; 3949 if (ut_params->obuf) 3950 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3951 else 3952 ciphertext = plaintext; 3953 3954 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3955 /* Validate obuf */ 3956 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3957 ciphertext, 3958 tdata->ciphertext.data, 3959 tdata->validDataLenInBits.len, 3960 "ZUC Ciphertext data not as expected"); 3961 3962 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3963 + plaintext_pad_len; 3964 3965 /* Validate obuf */ 3966 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3967 ut_params->digest, 3968 tdata->digest.data, 3969 4, 3970 "ZUC Generated auth tag not as expected"); 3971 return 0; 3972 } 3973 3974 static int 3975 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 3976 { 3977 struct crypto_testsuite_params *ts_params = &testsuite_params; 3978 struct crypto_unittest_params *ut_params = &unittest_params; 3979 3980 int retval; 3981 3982 uint8_t *plaintext, *ciphertext; 3983 unsigned plaintext_pad_len; 3984 unsigned plaintext_len; 3985 3986 /* Verify the capabilities */ 3987 struct rte_cryptodev_sym_capability_idx cap_idx; 3988 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3989 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3990 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3991 &cap_idx) == NULL) 3992 return -ENOTSUP; 3993 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3994 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3995 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3996 &cap_idx) == NULL) 3997 return -ENOTSUP; 3998 3999 /* Create SNOW 3G session */ 4000 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4001 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4002 RTE_CRYPTO_AUTH_OP_GENERATE, 4003 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4004 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4005 tdata->key.data, tdata->key.len, 4006 tdata->auth_iv.len, tdata->digest.len, 4007 tdata->cipher_iv.len); 4008 if (retval < 0) 4009 return retval; 4010 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4011 4012 /* clear mbuf payload */ 4013 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4014 rte_pktmbuf_tailroom(ut_params->ibuf)); 4015 4016 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4017 /* Append data which is padded to a multiple of */ 4018 /* the algorithms block size */ 4019 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4020 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4021 plaintext_pad_len); 4022 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4023 4024 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4025 4026 /* Create SNOW 3G operation */ 4027 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4028 tdata->digest.len, tdata->auth_iv.data, 4029 tdata->auth_iv.len, 4030 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4031 tdata->cipher_iv.data, tdata->cipher_iv.len, 4032 tdata->validCipherLenInBits.len, 4033 0, 4034 tdata->validAuthLenInBits.len, 4035 0 4036 ); 4037 if (retval < 0) 4038 return retval; 4039 4040 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4041 ut_params->op); 4042 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4043 ut_params->obuf = ut_params->op->sym->m_src; 4044 if (ut_params->obuf) 4045 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4046 else 4047 ciphertext = plaintext; 4048 4049 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4050 /* Validate obuf */ 4051 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4052 ciphertext, 4053 tdata->ciphertext.data, 4054 tdata->validDataLenInBits.len, 4055 "SNOW 3G Ciphertext data not as expected"); 4056 4057 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4058 + plaintext_pad_len; 4059 4060 /* Validate obuf */ 4061 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4062 ut_params->digest, 4063 tdata->digest.data, 4064 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4065 "SNOW 3G Generated auth tag not as expected"); 4066 return 0; 4067 } 4068 4069 static int 4070 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4071 uint8_t op_mode, uint8_t verify) 4072 { 4073 struct crypto_testsuite_params *ts_params = &testsuite_params; 4074 struct crypto_unittest_params *ut_params = &unittest_params; 4075 4076 int retval; 4077 4078 uint8_t *plaintext = NULL, *ciphertext = NULL; 4079 unsigned int plaintext_pad_len; 4080 unsigned int plaintext_len; 4081 unsigned int ciphertext_pad_len; 4082 unsigned int ciphertext_len; 4083 4084 struct rte_cryptodev_info dev_info; 4085 4086 /* Verify the capabilities */ 4087 struct rte_cryptodev_sym_capability_idx cap_idx; 4088 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4089 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4090 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4091 &cap_idx) == NULL) 4092 return -ENOTSUP; 4093 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4094 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4095 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4096 &cap_idx) == NULL) 4097 return -ENOTSUP; 4098 4099 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4100 4101 uint64_t feat_flags = dev_info.feature_flags; 4102 4103 if (op_mode == OUT_OF_PLACE) { 4104 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4105 printf("Device doesn't support digest encrypted.\n"); 4106 return -ENOTSUP; 4107 } 4108 } 4109 4110 /* Create SNOW 3G session */ 4111 retval = create_wireless_algo_auth_cipher_session( 4112 ts_params->valid_devs[0], 4113 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4114 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4115 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4116 : RTE_CRYPTO_AUTH_OP_GENERATE), 4117 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4118 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4119 tdata->key.data, tdata->key.len, 4120 tdata->auth_iv.len, tdata->digest.len, 4121 tdata->cipher_iv.len); 4122 4123 if (retval < 0) 4124 return retval; 4125 4126 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4127 if (op_mode == OUT_OF_PLACE) 4128 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4129 4130 /* clear mbuf payload */ 4131 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4132 rte_pktmbuf_tailroom(ut_params->ibuf)); 4133 if (op_mode == OUT_OF_PLACE) 4134 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4135 rte_pktmbuf_tailroom(ut_params->obuf)); 4136 4137 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4138 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4139 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4140 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4141 4142 if (verify) { 4143 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4144 ciphertext_pad_len); 4145 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4146 if (op_mode == OUT_OF_PLACE) 4147 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4148 debug_hexdump(stdout, "ciphertext:", ciphertext, 4149 ciphertext_len); 4150 } else { 4151 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4152 plaintext_pad_len); 4153 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4154 if (op_mode == OUT_OF_PLACE) 4155 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4156 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4157 } 4158 4159 /* Create SNOW 3G operation */ 4160 retval = create_wireless_algo_auth_cipher_operation( 4161 tdata->digest.data, tdata->digest.len, 4162 tdata->cipher_iv.data, tdata->cipher_iv.len, 4163 tdata->auth_iv.data, tdata->auth_iv.len, 4164 (tdata->digest.offset_bytes == 0 ? 4165 (verify ? ciphertext_pad_len : plaintext_pad_len) 4166 : tdata->digest.offset_bytes), 4167 tdata->validCipherLenInBits.len, 4168 tdata->cipher.offset_bits, 4169 tdata->validAuthLenInBits.len, 4170 tdata->auth.offset_bits, 4171 op_mode, 0, verify); 4172 4173 if (retval < 0) 4174 return retval; 4175 4176 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4177 ut_params->op); 4178 4179 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4180 4181 ut_params->obuf = (op_mode == IN_PLACE ? 4182 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4183 4184 if (verify) { 4185 if (ut_params->obuf) 4186 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 4187 uint8_t *); 4188 else 4189 plaintext = ciphertext + 4190 (tdata->cipher.offset_bits >> 3); 4191 4192 debug_hexdump(stdout, "plaintext:", plaintext, 4193 (tdata->plaintext.len >> 3) - tdata->digest.len); 4194 debug_hexdump(stdout, "plaintext expected:", 4195 tdata->plaintext.data, 4196 (tdata->plaintext.len >> 3) - tdata->digest.len); 4197 } else { 4198 if (ut_params->obuf) 4199 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 4200 uint8_t *); 4201 else 4202 ciphertext = plaintext; 4203 4204 debug_hexdump(stdout, "ciphertext:", ciphertext, 4205 ciphertext_len); 4206 debug_hexdump(stdout, "ciphertext expected:", 4207 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4208 4209 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4210 + (tdata->digest.offset_bytes == 0 ? 4211 plaintext_pad_len : tdata->digest.offset_bytes); 4212 4213 debug_hexdump(stdout, "digest:", ut_params->digest, 4214 tdata->digest.len); 4215 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 4216 tdata->digest.len); 4217 } 4218 4219 /* Validate obuf */ 4220 if (verify) { 4221 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4222 plaintext, 4223 tdata->plaintext.data, 4224 tdata->plaintext.len >> 3, 4225 "SNOW 3G Plaintext data not as expected"); 4226 } else { 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 4233 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4234 ut_params->digest, 4235 tdata->digest.data, 4236 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4237 "SNOW 3G Generated auth tag not as expected"); 4238 } 4239 return 0; 4240 } 4241 4242 static int 4243 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 4244 uint8_t op_mode, uint8_t verify) 4245 { 4246 struct crypto_testsuite_params *ts_params = &testsuite_params; 4247 struct crypto_unittest_params *ut_params = &unittest_params; 4248 4249 int retval; 4250 4251 const uint8_t *plaintext = NULL; 4252 const uint8_t *ciphertext = NULL; 4253 const uint8_t *digest = NULL; 4254 unsigned int plaintext_pad_len; 4255 unsigned int plaintext_len; 4256 unsigned int ciphertext_pad_len; 4257 unsigned int ciphertext_len; 4258 uint8_t buffer[10000]; 4259 uint8_t digest_buffer[10000]; 4260 4261 struct rte_cryptodev_info dev_info; 4262 4263 /* Verify the capabilities */ 4264 struct rte_cryptodev_sym_capability_idx cap_idx; 4265 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4266 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4267 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4268 &cap_idx) == NULL) 4269 return -ENOTSUP; 4270 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4271 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4272 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4273 &cap_idx) == NULL) 4274 return -ENOTSUP; 4275 4276 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4277 4278 uint64_t feat_flags = dev_info.feature_flags; 4279 4280 if (op_mode == IN_PLACE) { 4281 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 4282 printf("Device doesn't support in-place scatter-gather " 4283 "in both input and output mbufs.\n"); 4284 return -ENOTSUP; 4285 } 4286 } else { 4287 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4288 printf("Device doesn't support out-of-place scatter-gather " 4289 "in both input and output mbufs.\n"); 4290 return -ENOTSUP; 4291 } 4292 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4293 printf("Device doesn't support digest encrypted.\n"); 4294 return -ENOTSUP; 4295 } 4296 } 4297 4298 /* Create SNOW 3G session */ 4299 retval = create_wireless_algo_auth_cipher_session( 4300 ts_params->valid_devs[0], 4301 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4302 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4303 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4304 : RTE_CRYPTO_AUTH_OP_GENERATE), 4305 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4306 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4307 tdata->key.data, tdata->key.len, 4308 tdata->auth_iv.len, tdata->digest.len, 4309 tdata->cipher_iv.len); 4310 4311 if (retval < 0) 4312 return retval; 4313 4314 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4315 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4316 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4317 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4318 4319 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4320 plaintext_pad_len, 15, 0); 4321 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4322 "Failed to allocate input buffer in mempool"); 4323 4324 if (op_mode == OUT_OF_PLACE) { 4325 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4326 plaintext_pad_len, 15, 0); 4327 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4328 "Failed to allocate output buffer in mempool"); 4329 } 4330 4331 if (verify) { 4332 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 4333 tdata->ciphertext.data); 4334 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4335 ciphertext_len, buffer); 4336 debug_hexdump(stdout, "ciphertext:", ciphertext, 4337 ciphertext_len); 4338 } else { 4339 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 4340 tdata->plaintext.data); 4341 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4342 plaintext_len, buffer); 4343 debug_hexdump(stdout, "plaintext:", plaintext, 4344 plaintext_len); 4345 } 4346 memset(buffer, 0, sizeof(buffer)); 4347 4348 /* Create SNOW 3G operation */ 4349 retval = create_wireless_algo_auth_cipher_operation( 4350 tdata->digest.data, tdata->digest.len, 4351 tdata->cipher_iv.data, tdata->cipher_iv.len, 4352 tdata->auth_iv.data, tdata->auth_iv.len, 4353 (tdata->digest.offset_bytes == 0 ? 4354 (verify ? ciphertext_pad_len : plaintext_pad_len) 4355 : tdata->digest.offset_bytes), 4356 tdata->validCipherLenInBits.len, 4357 tdata->cipher.offset_bits, 4358 tdata->validAuthLenInBits.len, 4359 tdata->auth.offset_bits, 4360 op_mode, 1, verify); 4361 4362 if (retval < 0) 4363 return retval; 4364 4365 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4366 ut_params->op); 4367 4368 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4369 4370 ut_params->obuf = (op_mode == IN_PLACE ? 4371 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4372 4373 if (verify) { 4374 if (ut_params->obuf) 4375 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 4376 plaintext_len, buffer); 4377 else 4378 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4379 plaintext_len, buffer); 4380 4381 debug_hexdump(stdout, "plaintext:", plaintext, 4382 (tdata->plaintext.len >> 3) - tdata->digest.len); 4383 debug_hexdump(stdout, "plaintext expected:", 4384 tdata->plaintext.data, 4385 (tdata->plaintext.len >> 3) - tdata->digest.len); 4386 } else { 4387 if (ut_params->obuf) 4388 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4389 ciphertext_len, buffer); 4390 else 4391 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4392 ciphertext_len, buffer); 4393 4394 debug_hexdump(stdout, "ciphertext:", ciphertext, 4395 ciphertext_len); 4396 debug_hexdump(stdout, "ciphertext expected:", 4397 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4398 4399 if (ut_params->obuf) 4400 digest = rte_pktmbuf_read(ut_params->obuf, 4401 (tdata->digest.offset_bytes == 0 ? 4402 plaintext_pad_len : tdata->digest.offset_bytes), 4403 tdata->digest.len, digest_buffer); 4404 else 4405 digest = rte_pktmbuf_read(ut_params->ibuf, 4406 (tdata->digest.offset_bytes == 0 ? 4407 plaintext_pad_len : tdata->digest.offset_bytes), 4408 tdata->digest.len, digest_buffer); 4409 4410 debug_hexdump(stdout, "digest:", digest, 4411 tdata->digest.len); 4412 debug_hexdump(stdout, "digest expected:", 4413 tdata->digest.data, tdata->digest.len); 4414 } 4415 4416 /* Validate obuf */ 4417 if (verify) { 4418 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4419 plaintext, 4420 tdata->plaintext.data, 4421 tdata->plaintext.len >> 3, 4422 "SNOW 3G Plaintext data not as expected"); 4423 } else { 4424 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4425 ciphertext, 4426 tdata->ciphertext.data, 4427 tdata->validDataLenInBits.len, 4428 "SNOW 3G Ciphertext data not as expected"); 4429 4430 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4431 digest, 4432 tdata->digest.data, 4433 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4434 "SNOW 3G Generated auth tag not as expected"); 4435 } 4436 return 0; 4437 } 4438 4439 static int 4440 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 4441 uint8_t op_mode, uint8_t verify) 4442 { 4443 struct crypto_testsuite_params *ts_params = &testsuite_params; 4444 struct crypto_unittest_params *ut_params = &unittest_params; 4445 4446 int retval; 4447 4448 uint8_t *plaintext = NULL, *ciphertext = NULL; 4449 unsigned int plaintext_pad_len; 4450 unsigned int plaintext_len; 4451 unsigned int ciphertext_pad_len; 4452 unsigned int ciphertext_len; 4453 4454 struct rte_cryptodev_info dev_info; 4455 4456 /* Verify the capabilities */ 4457 struct rte_cryptodev_sym_capability_idx cap_idx; 4458 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4459 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 4460 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4461 &cap_idx) == NULL) 4462 return -ENOTSUP; 4463 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4464 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4465 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4466 &cap_idx) == NULL) 4467 return -ENOTSUP; 4468 4469 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4470 4471 uint64_t feat_flags = dev_info.feature_flags; 4472 4473 if (op_mode == OUT_OF_PLACE) { 4474 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4475 printf("Device doesn't support digest encrypted.\n"); 4476 return -ENOTSUP; 4477 } 4478 } 4479 4480 /* Create KASUMI session */ 4481 retval = create_wireless_algo_auth_cipher_session( 4482 ts_params->valid_devs[0], 4483 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4484 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4485 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4486 : RTE_CRYPTO_AUTH_OP_GENERATE), 4487 RTE_CRYPTO_AUTH_KASUMI_F9, 4488 RTE_CRYPTO_CIPHER_KASUMI_F8, 4489 tdata->key.data, tdata->key.len, 4490 0, tdata->digest.len, 4491 tdata->cipher_iv.len); 4492 4493 if (retval < 0) 4494 return retval; 4495 4496 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4497 if (op_mode == OUT_OF_PLACE) 4498 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4499 4500 /* clear mbuf payload */ 4501 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4502 rte_pktmbuf_tailroom(ut_params->ibuf)); 4503 if (op_mode == OUT_OF_PLACE) 4504 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4505 rte_pktmbuf_tailroom(ut_params->obuf)); 4506 4507 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4508 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4509 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4510 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4511 4512 if (verify) { 4513 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4514 ciphertext_pad_len); 4515 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4516 if (op_mode == OUT_OF_PLACE) 4517 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4518 debug_hexdump(stdout, "ciphertext:", ciphertext, 4519 ciphertext_len); 4520 } else { 4521 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4522 plaintext_pad_len); 4523 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4524 if (op_mode == OUT_OF_PLACE) 4525 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4526 debug_hexdump(stdout, "plaintext:", plaintext, 4527 plaintext_len); 4528 } 4529 4530 /* Create KASUMI operation */ 4531 retval = create_wireless_algo_auth_cipher_operation( 4532 tdata->digest.data, tdata->digest.len, 4533 tdata->cipher_iv.data, tdata->cipher_iv.len, 4534 NULL, 0, 4535 (tdata->digest.offset_bytes == 0 ? 4536 (verify ? ciphertext_pad_len : plaintext_pad_len) 4537 : tdata->digest.offset_bytes), 4538 tdata->validCipherLenInBits.len, 4539 tdata->validCipherOffsetInBits.len, 4540 tdata->validAuthLenInBits.len, 4541 0, 4542 op_mode, 0, verify); 4543 4544 if (retval < 0) 4545 return retval; 4546 4547 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4548 ut_params->op); 4549 4550 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4551 4552 ut_params->obuf = (op_mode == IN_PLACE ? 4553 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4554 4555 4556 if (verify) { 4557 if (ut_params->obuf) 4558 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 4559 uint8_t *); 4560 else 4561 plaintext = ciphertext; 4562 4563 debug_hexdump(stdout, "plaintext:", plaintext, 4564 (tdata->plaintext.len >> 3) - tdata->digest.len); 4565 debug_hexdump(stdout, "plaintext expected:", 4566 tdata->plaintext.data, 4567 (tdata->plaintext.len >> 3) - tdata->digest.len); 4568 } else { 4569 if (ut_params->obuf) 4570 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 4571 uint8_t *); 4572 else 4573 ciphertext = plaintext; 4574 4575 debug_hexdump(stdout, "ciphertext:", ciphertext, 4576 ciphertext_len); 4577 debug_hexdump(stdout, "ciphertext expected:", 4578 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4579 4580 ut_params->digest = rte_pktmbuf_mtod( 4581 ut_params->obuf, uint8_t *) + 4582 (tdata->digest.offset_bytes == 0 ? 4583 plaintext_pad_len : tdata->digest.offset_bytes); 4584 4585 debug_hexdump(stdout, "digest:", ut_params->digest, 4586 tdata->digest.len); 4587 debug_hexdump(stdout, "digest expected:", 4588 tdata->digest.data, tdata->digest.len); 4589 } 4590 4591 /* Validate obuf */ 4592 if (verify) { 4593 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4594 plaintext, 4595 tdata->plaintext.data, 4596 tdata->plaintext.len >> 3, 4597 "KASUMI Plaintext data not as expected"); 4598 } else { 4599 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4600 ciphertext, 4601 tdata->ciphertext.data, 4602 tdata->ciphertext.len >> 3, 4603 "KASUMI Ciphertext data not as expected"); 4604 4605 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4606 ut_params->digest, 4607 tdata->digest.data, 4608 DIGEST_BYTE_LENGTH_KASUMI_F9, 4609 "KASUMI Generated auth tag not as expected"); 4610 } 4611 return 0; 4612 } 4613 4614 static int 4615 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 4616 uint8_t op_mode, uint8_t verify) 4617 { 4618 struct crypto_testsuite_params *ts_params = &testsuite_params; 4619 struct crypto_unittest_params *ut_params = &unittest_params; 4620 4621 int retval; 4622 4623 const uint8_t *plaintext = NULL; 4624 const uint8_t *ciphertext = NULL; 4625 const uint8_t *digest = NULL; 4626 unsigned int plaintext_pad_len; 4627 unsigned int plaintext_len; 4628 unsigned int ciphertext_pad_len; 4629 unsigned int ciphertext_len; 4630 uint8_t buffer[10000]; 4631 uint8_t digest_buffer[10000]; 4632 4633 struct rte_cryptodev_info dev_info; 4634 4635 /* Verify the capabilities */ 4636 struct rte_cryptodev_sym_capability_idx cap_idx; 4637 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4638 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 4639 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4640 &cap_idx) == NULL) 4641 return -ENOTSUP; 4642 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4643 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4644 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4645 &cap_idx) == NULL) 4646 return -ENOTSUP; 4647 4648 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4649 4650 uint64_t feat_flags = dev_info.feature_flags; 4651 4652 if (op_mode == IN_PLACE) { 4653 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 4654 printf("Device doesn't support in-place scatter-gather " 4655 "in both input and output mbufs.\n"); 4656 return -ENOTSUP; 4657 } 4658 } else { 4659 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4660 printf("Device doesn't support out-of-place scatter-gather " 4661 "in both input and output mbufs.\n"); 4662 return -ENOTSUP; 4663 } 4664 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4665 printf("Device doesn't support digest encrypted.\n"); 4666 return -ENOTSUP; 4667 } 4668 } 4669 4670 /* Create KASUMI session */ 4671 retval = create_wireless_algo_auth_cipher_session( 4672 ts_params->valid_devs[0], 4673 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4674 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4675 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4676 : RTE_CRYPTO_AUTH_OP_GENERATE), 4677 RTE_CRYPTO_AUTH_KASUMI_F9, 4678 RTE_CRYPTO_CIPHER_KASUMI_F8, 4679 tdata->key.data, tdata->key.len, 4680 0, tdata->digest.len, 4681 tdata->cipher_iv.len); 4682 4683 if (retval < 0) 4684 return retval; 4685 4686 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4687 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4688 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4689 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4690 4691 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4692 plaintext_pad_len, 15, 0); 4693 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4694 "Failed to allocate input buffer in mempool"); 4695 4696 if (op_mode == OUT_OF_PLACE) { 4697 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4698 plaintext_pad_len, 15, 0); 4699 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4700 "Failed to allocate output buffer in mempool"); 4701 } 4702 4703 if (verify) { 4704 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 4705 tdata->ciphertext.data); 4706 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4707 ciphertext_len, buffer); 4708 debug_hexdump(stdout, "ciphertext:", ciphertext, 4709 ciphertext_len); 4710 } else { 4711 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 4712 tdata->plaintext.data); 4713 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4714 plaintext_len, buffer); 4715 debug_hexdump(stdout, "plaintext:", plaintext, 4716 plaintext_len); 4717 } 4718 memset(buffer, 0, sizeof(buffer)); 4719 4720 /* Create KASUMI operation */ 4721 retval = create_wireless_algo_auth_cipher_operation( 4722 tdata->digest.data, tdata->digest.len, 4723 tdata->cipher_iv.data, tdata->cipher_iv.len, 4724 NULL, 0, 4725 (tdata->digest.offset_bytes == 0 ? 4726 (verify ? ciphertext_pad_len : plaintext_pad_len) 4727 : tdata->digest.offset_bytes), 4728 tdata->validCipherLenInBits.len, 4729 tdata->validCipherOffsetInBits.len, 4730 tdata->validAuthLenInBits.len, 4731 0, 4732 op_mode, 1, verify); 4733 4734 if (retval < 0) 4735 return retval; 4736 4737 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4738 ut_params->op); 4739 4740 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4741 4742 ut_params->obuf = (op_mode == IN_PLACE ? 4743 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4744 4745 if (verify) { 4746 if (ut_params->obuf) 4747 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 4748 plaintext_len, buffer); 4749 else 4750 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4751 plaintext_len, buffer); 4752 4753 debug_hexdump(stdout, "plaintext:", plaintext, 4754 (tdata->plaintext.len >> 3) - tdata->digest.len); 4755 debug_hexdump(stdout, "plaintext expected:", 4756 tdata->plaintext.data, 4757 (tdata->plaintext.len >> 3) - tdata->digest.len); 4758 } else { 4759 if (ut_params->obuf) 4760 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4761 ciphertext_len, buffer); 4762 else 4763 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4764 ciphertext_len, buffer); 4765 4766 debug_hexdump(stdout, "ciphertext:", ciphertext, 4767 ciphertext_len); 4768 debug_hexdump(stdout, "ciphertext expected:", 4769 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4770 4771 if (ut_params->obuf) 4772 digest = rte_pktmbuf_read(ut_params->obuf, 4773 (tdata->digest.offset_bytes == 0 ? 4774 plaintext_pad_len : tdata->digest.offset_bytes), 4775 tdata->digest.len, digest_buffer); 4776 else 4777 digest = rte_pktmbuf_read(ut_params->ibuf, 4778 (tdata->digest.offset_bytes == 0 ? 4779 plaintext_pad_len : tdata->digest.offset_bytes), 4780 tdata->digest.len, digest_buffer); 4781 4782 debug_hexdump(stdout, "digest:", digest, 4783 tdata->digest.len); 4784 debug_hexdump(stdout, "digest expected:", 4785 tdata->digest.data, tdata->digest.len); 4786 } 4787 4788 /* Validate obuf */ 4789 if (verify) { 4790 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4791 plaintext, 4792 tdata->plaintext.data, 4793 tdata->plaintext.len >> 3, 4794 "KASUMI Plaintext data not as expected"); 4795 } else { 4796 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4797 ciphertext, 4798 tdata->ciphertext.data, 4799 tdata->validDataLenInBits.len, 4800 "KASUMI Ciphertext data not as expected"); 4801 4802 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4803 digest, 4804 tdata->digest.data, 4805 DIGEST_BYTE_LENGTH_KASUMI_F9, 4806 "KASUMI Generated auth tag not as expected"); 4807 } 4808 return 0; 4809 } 4810 4811 static int 4812 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 4813 { 4814 struct crypto_testsuite_params *ts_params = &testsuite_params; 4815 struct crypto_unittest_params *ut_params = &unittest_params; 4816 4817 int retval; 4818 4819 uint8_t *plaintext, *ciphertext; 4820 unsigned plaintext_pad_len; 4821 unsigned plaintext_len; 4822 4823 /* Verify the capabilities */ 4824 struct rte_cryptodev_sym_capability_idx cap_idx; 4825 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4826 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 4827 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4828 &cap_idx) == NULL) 4829 return -ENOTSUP; 4830 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4831 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4832 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4833 &cap_idx) == NULL) 4834 return -ENOTSUP; 4835 4836 /* Create KASUMI session */ 4837 retval = create_wireless_algo_cipher_auth_session( 4838 ts_params->valid_devs[0], 4839 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4840 RTE_CRYPTO_AUTH_OP_GENERATE, 4841 RTE_CRYPTO_AUTH_KASUMI_F9, 4842 RTE_CRYPTO_CIPHER_KASUMI_F8, 4843 tdata->key.data, tdata->key.len, 4844 0, tdata->digest.len, 4845 tdata->cipher_iv.len); 4846 if (retval < 0) 4847 return retval; 4848 4849 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4850 4851 /* clear mbuf payload */ 4852 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4853 rte_pktmbuf_tailroom(ut_params->ibuf)); 4854 4855 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4856 /* Append data which is padded to a multiple of */ 4857 /* the algorithms block size */ 4858 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4859 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4860 plaintext_pad_len); 4861 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4862 4863 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4864 4865 /* Create KASUMI operation */ 4866 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4867 tdata->digest.len, NULL, 0, 4868 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4869 tdata->cipher_iv.data, tdata->cipher_iv.len, 4870 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 4871 tdata->validCipherOffsetInBits.len, 4872 tdata->validAuthLenInBits.len, 4873 0 4874 ); 4875 if (retval < 0) 4876 return retval; 4877 4878 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4879 ut_params->op); 4880 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4881 4882 if (ut_params->op->sym->m_dst) 4883 ut_params->obuf = ut_params->op->sym->m_dst; 4884 else 4885 ut_params->obuf = ut_params->op->sym->m_src; 4886 4887 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 4888 tdata->validCipherOffsetInBits.len >> 3); 4889 4890 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4891 + plaintext_pad_len; 4892 4893 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 4894 (tdata->validCipherOffsetInBits.len >> 3); 4895 /* Validate obuf */ 4896 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4897 ciphertext, 4898 reference_ciphertext, 4899 tdata->validCipherLenInBits.len, 4900 "KASUMI Ciphertext data not as expected"); 4901 4902 /* Validate obuf */ 4903 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4904 ut_params->digest, 4905 tdata->digest.data, 4906 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4907 "KASUMI Generated auth tag not as expected"); 4908 return 0; 4909 } 4910 4911 static int 4912 test_zuc_encryption(const struct wireless_test_data *tdata) 4913 { 4914 struct crypto_testsuite_params *ts_params = &testsuite_params; 4915 struct crypto_unittest_params *ut_params = &unittest_params; 4916 4917 int retval; 4918 uint8_t *plaintext, *ciphertext; 4919 unsigned plaintext_pad_len; 4920 unsigned plaintext_len; 4921 4922 struct rte_cryptodev_sym_capability_idx cap_idx; 4923 4924 /* Check if device supports ZUC EEA3 */ 4925 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4926 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4927 4928 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4929 &cap_idx) == NULL) 4930 return -ENOTSUP; 4931 4932 /* Create ZUC session */ 4933 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4934 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4935 RTE_CRYPTO_CIPHER_ZUC_EEA3, 4936 tdata->key.data, tdata->key.len, 4937 tdata->cipher_iv.len); 4938 if (retval < 0) 4939 return retval; 4940 4941 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4942 4943 /* Clear mbuf payload */ 4944 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4945 rte_pktmbuf_tailroom(ut_params->ibuf)); 4946 4947 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4948 /* Append data which is padded to a multiple */ 4949 /* of the algorithms block size */ 4950 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 4951 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4952 plaintext_pad_len); 4953 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4954 4955 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4956 4957 /* Create ZUC operation */ 4958 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4959 tdata->cipher_iv.len, 4960 tdata->plaintext.len, 4961 0); 4962 if (retval < 0) 4963 return retval; 4964 4965 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4966 ut_params->op); 4967 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4968 4969 ut_params->obuf = ut_params->op->sym->m_dst; 4970 if (ut_params->obuf) 4971 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4972 else 4973 ciphertext = plaintext; 4974 4975 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4976 4977 /* Validate obuf */ 4978 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4979 ciphertext, 4980 tdata->ciphertext.data, 4981 tdata->validCipherLenInBits.len, 4982 "ZUC Ciphertext data not as expected"); 4983 return 0; 4984 } 4985 4986 static int 4987 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 4988 { 4989 struct crypto_testsuite_params *ts_params = &testsuite_params; 4990 struct crypto_unittest_params *ut_params = &unittest_params; 4991 4992 int retval; 4993 4994 unsigned int plaintext_pad_len; 4995 unsigned int plaintext_len; 4996 const uint8_t *ciphertext; 4997 uint8_t ciphertext_buffer[2048]; 4998 struct rte_cryptodev_info dev_info; 4999 5000 struct rte_cryptodev_sym_capability_idx cap_idx; 5001 5002 /* Check if device supports ZUC EEA3 */ 5003 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5004 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5005 5006 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5007 &cap_idx) == NULL) 5008 return -ENOTSUP; 5009 5010 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5011 5012 uint64_t feat_flags = dev_info.feature_flags; 5013 5014 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5015 printf("Device doesn't support in-place scatter-gather. " 5016 "Test Skipped.\n"); 5017 return -ENOTSUP; 5018 } 5019 5020 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5021 5022 /* Append data which is padded to a multiple */ 5023 /* of the algorithms block size */ 5024 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5025 5026 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5027 plaintext_pad_len, 10, 0); 5028 5029 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5030 tdata->plaintext.data); 5031 5032 /* Create ZUC session */ 5033 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5034 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5035 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5036 tdata->key.data, tdata->key.len, 5037 tdata->cipher_iv.len); 5038 if (retval < 0) 5039 return retval; 5040 5041 /* Clear mbuf payload */ 5042 5043 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 5044 5045 /* Create ZUC operation */ 5046 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5047 tdata->cipher_iv.len, tdata->plaintext.len, 5048 0); 5049 if (retval < 0) 5050 return retval; 5051 5052 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5053 ut_params->op); 5054 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5055 5056 ut_params->obuf = ut_params->op->sym->m_dst; 5057 if (ut_params->obuf) 5058 ciphertext = rte_pktmbuf_read(ut_params->obuf, 5059 0, plaintext_len, ciphertext_buffer); 5060 else 5061 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 5062 0, plaintext_len, ciphertext_buffer); 5063 5064 /* Validate obuf */ 5065 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5066 5067 /* Validate obuf */ 5068 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5069 ciphertext, 5070 tdata->ciphertext.data, 5071 tdata->validCipherLenInBits.len, 5072 "ZUC Ciphertext data not as expected"); 5073 5074 return 0; 5075 } 5076 5077 static int 5078 test_zuc_authentication(const struct wireless_test_data *tdata) 5079 { 5080 struct crypto_testsuite_params *ts_params = &testsuite_params; 5081 struct crypto_unittest_params *ut_params = &unittest_params; 5082 5083 int retval; 5084 unsigned plaintext_pad_len; 5085 unsigned plaintext_len; 5086 uint8_t *plaintext; 5087 5088 struct rte_cryptodev_sym_capability_idx cap_idx; 5089 5090 /* QAT PMD supports byte-aligned data only */ 5091 if ((tdata->validAuthLenInBits.len % 8 != 0) && 5092 (gbl_driver_id == rte_cryptodev_driver_id_get( 5093 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)))) 5094 return -ENOTSUP; 5095 5096 /* Check if device supports ZUC EIA3 */ 5097 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5098 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5099 5100 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5101 &cap_idx) == NULL) 5102 return -ENOTSUP; 5103 5104 /* Create ZUC session */ 5105 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 5106 tdata->key.data, tdata->key.len, 5107 tdata->auth_iv.len, tdata->digest.len, 5108 RTE_CRYPTO_AUTH_OP_GENERATE, 5109 RTE_CRYPTO_AUTH_ZUC_EIA3); 5110 if (retval < 0) 5111 return retval; 5112 5113 /* alloc mbuf and set payload */ 5114 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5115 5116 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5117 rte_pktmbuf_tailroom(ut_params->ibuf)); 5118 5119 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5120 /* Append data which is padded to a multiple of */ 5121 /* the algorithms block size */ 5122 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5123 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5124 plaintext_pad_len); 5125 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5126 5127 /* Create ZUC operation */ 5128 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 5129 tdata->auth_iv.data, tdata->auth_iv.len, 5130 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5131 tdata->validAuthLenInBits.len, 5132 0); 5133 if (retval < 0) 5134 return retval; 5135 5136 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5137 ut_params->op); 5138 ut_params->obuf = ut_params->op->sym->m_src; 5139 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5140 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5141 + plaintext_pad_len; 5142 5143 /* Validate obuf */ 5144 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5145 ut_params->digest, 5146 tdata->digest.data, 5147 tdata->digest.len, 5148 "ZUC Generated auth tag not as expected"); 5149 5150 return 0; 5151 } 5152 5153 static int 5154 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 5155 uint8_t op_mode, uint8_t verify) 5156 { 5157 struct crypto_testsuite_params *ts_params = &testsuite_params; 5158 struct crypto_unittest_params *ut_params = &unittest_params; 5159 5160 int retval; 5161 5162 uint8_t *plaintext = NULL, *ciphertext = NULL; 5163 unsigned int plaintext_pad_len; 5164 unsigned int plaintext_len; 5165 unsigned int ciphertext_pad_len; 5166 unsigned int ciphertext_len; 5167 5168 struct rte_cryptodev_info dev_info; 5169 struct rte_cryptodev_sym_capability_idx cap_idx; 5170 5171 /* Check if device supports ZUC EIA3 */ 5172 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5173 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5174 5175 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5176 &cap_idx) == NULL) 5177 return -ENOTSUP; 5178 5179 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5180 5181 uint64_t feat_flags = dev_info.feature_flags; 5182 5183 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5184 printf("Device doesn't support digest encrypted.\n"); 5185 return -ENOTSUP; 5186 } 5187 5188 /* Create ZUC session */ 5189 retval = create_wireless_algo_auth_cipher_session( 5190 ts_params->valid_devs[0], 5191 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5192 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5193 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5194 : RTE_CRYPTO_AUTH_OP_GENERATE), 5195 RTE_CRYPTO_AUTH_ZUC_EIA3, 5196 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5197 tdata->key.data, tdata->key.len, 5198 tdata->auth_iv.len, tdata->digest.len, 5199 tdata->cipher_iv.len); 5200 5201 if (retval < 0) 5202 return retval; 5203 5204 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5205 if (op_mode == OUT_OF_PLACE) 5206 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5207 5208 /* clear mbuf payload */ 5209 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5210 rte_pktmbuf_tailroom(ut_params->ibuf)); 5211 if (op_mode == OUT_OF_PLACE) 5212 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5213 rte_pktmbuf_tailroom(ut_params->obuf)); 5214 5215 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5216 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5217 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5218 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5219 5220 if (verify) { 5221 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5222 ciphertext_pad_len); 5223 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5224 if (op_mode == OUT_OF_PLACE) 5225 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5226 debug_hexdump(stdout, "ciphertext:", ciphertext, 5227 ciphertext_len); 5228 } else { 5229 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5230 plaintext_pad_len); 5231 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5232 if (op_mode == OUT_OF_PLACE) 5233 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5234 debug_hexdump(stdout, "plaintext:", plaintext, 5235 plaintext_len); 5236 } 5237 5238 /* Create ZUC operation */ 5239 retval = create_wireless_algo_auth_cipher_operation( 5240 tdata->digest.data, tdata->digest.len, 5241 tdata->cipher_iv.data, tdata->cipher_iv.len, 5242 tdata->auth_iv.data, tdata->auth_iv.len, 5243 (tdata->digest.offset_bytes == 0 ? 5244 (verify ? ciphertext_pad_len : plaintext_pad_len) 5245 : tdata->digest.offset_bytes), 5246 tdata->validCipherLenInBits.len, 5247 tdata->validCipherOffsetInBits.len, 5248 tdata->validAuthLenInBits.len, 5249 0, 5250 op_mode, 0, verify); 5251 5252 if (retval < 0) 5253 return retval; 5254 5255 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5256 ut_params->op); 5257 5258 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5259 5260 ut_params->obuf = (op_mode == IN_PLACE ? 5261 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5262 5263 5264 if (verify) { 5265 if (ut_params->obuf) 5266 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5267 uint8_t *); 5268 else 5269 plaintext = ciphertext; 5270 5271 debug_hexdump(stdout, "plaintext:", plaintext, 5272 (tdata->plaintext.len >> 3) - tdata->digest.len); 5273 debug_hexdump(stdout, "plaintext expected:", 5274 tdata->plaintext.data, 5275 (tdata->plaintext.len >> 3) - tdata->digest.len); 5276 } else { 5277 if (ut_params->obuf) 5278 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5279 uint8_t *); 5280 else 5281 ciphertext = plaintext; 5282 5283 debug_hexdump(stdout, "ciphertext:", ciphertext, 5284 ciphertext_len); 5285 debug_hexdump(stdout, "ciphertext expected:", 5286 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5287 5288 ut_params->digest = rte_pktmbuf_mtod( 5289 ut_params->obuf, uint8_t *) + 5290 (tdata->digest.offset_bytes == 0 ? 5291 plaintext_pad_len : tdata->digest.offset_bytes); 5292 5293 debug_hexdump(stdout, "digest:", ut_params->digest, 5294 tdata->digest.len); 5295 debug_hexdump(stdout, "digest expected:", 5296 tdata->digest.data, tdata->digest.len); 5297 } 5298 5299 /* Validate obuf */ 5300 if (verify) { 5301 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5302 plaintext, 5303 tdata->plaintext.data, 5304 tdata->plaintext.len >> 3, 5305 "ZUC Plaintext data not as expected"); 5306 } else { 5307 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5308 ciphertext, 5309 tdata->ciphertext.data, 5310 tdata->ciphertext.len >> 3, 5311 "ZUC Ciphertext data not as expected"); 5312 5313 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5314 ut_params->digest, 5315 tdata->digest.data, 5316 DIGEST_BYTE_LENGTH_KASUMI_F9, 5317 "ZUC Generated auth tag not as expected"); 5318 } 5319 return 0; 5320 } 5321 5322 static int 5323 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 5324 uint8_t op_mode, uint8_t verify) 5325 { 5326 struct crypto_testsuite_params *ts_params = &testsuite_params; 5327 struct crypto_unittest_params *ut_params = &unittest_params; 5328 5329 int retval; 5330 5331 const uint8_t *plaintext = NULL; 5332 const uint8_t *ciphertext = NULL; 5333 const uint8_t *digest = NULL; 5334 unsigned int plaintext_pad_len; 5335 unsigned int plaintext_len; 5336 unsigned int ciphertext_pad_len; 5337 unsigned int ciphertext_len; 5338 uint8_t buffer[10000]; 5339 uint8_t digest_buffer[10000]; 5340 5341 struct rte_cryptodev_info dev_info; 5342 struct rte_cryptodev_sym_capability_idx cap_idx; 5343 5344 /* Check if device supports ZUC EIA3 */ 5345 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5346 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5347 5348 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5349 &cap_idx) == NULL) 5350 return -ENOTSUP; 5351 5352 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5353 5354 uint64_t feat_flags = dev_info.feature_flags; 5355 5356 if (op_mode == IN_PLACE) { 5357 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5358 printf("Device doesn't support in-place scatter-gather " 5359 "in both input and output mbufs.\n"); 5360 return -ENOTSUP; 5361 } 5362 } else { 5363 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5364 printf("Device doesn't support out-of-place scatter-gather " 5365 "in both input and output mbufs.\n"); 5366 return -ENOTSUP; 5367 } 5368 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5369 printf("Device doesn't support digest encrypted.\n"); 5370 return -ENOTSUP; 5371 } 5372 } 5373 5374 /* Create ZUC session */ 5375 retval = create_wireless_algo_auth_cipher_session( 5376 ts_params->valid_devs[0], 5377 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5378 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5379 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5380 : RTE_CRYPTO_AUTH_OP_GENERATE), 5381 RTE_CRYPTO_AUTH_ZUC_EIA3, 5382 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5383 tdata->key.data, tdata->key.len, 5384 tdata->auth_iv.len, tdata->digest.len, 5385 tdata->cipher_iv.len); 5386 5387 if (retval < 0) 5388 return retval; 5389 5390 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5391 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5392 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5393 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5394 5395 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5396 plaintext_pad_len, 15, 0); 5397 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5398 "Failed to allocate input buffer in mempool"); 5399 5400 if (op_mode == OUT_OF_PLACE) { 5401 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5402 plaintext_pad_len, 15, 0); 5403 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5404 "Failed to allocate output buffer in mempool"); 5405 } 5406 5407 if (verify) { 5408 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5409 tdata->ciphertext.data); 5410 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5411 ciphertext_len, buffer); 5412 debug_hexdump(stdout, "ciphertext:", ciphertext, 5413 ciphertext_len); 5414 } else { 5415 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5416 tdata->plaintext.data); 5417 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5418 plaintext_len, buffer); 5419 debug_hexdump(stdout, "plaintext:", plaintext, 5420 plaintext_len); 5421 } 5422 memset(buffer, 0, sizeof(buffer)); 5423 5424 /* Create ZUC operation */ 5425 retval = create_wireless_algo_auth_cipher_operation( 5426 tdata->digest.data, tdata->digest.len, 5427 tdata->cipher_iv.data, tdata->cipher_iv.len, 5428 NULL, 0, 5429 (tdata->digest.offset_bytes == 0 ? 5430 (verify ? ciphertext_pad_len : plaintext_pad_len) 5431 : tdata->digest.offset_bytes), 5432 tdata->validCipherLenInBits.len, 5433 tdata->validCipherOffsetInBits.len, 5434 tdata->validAuthLenInBits.len, 5435 0, 5436 op_mode, 1, verify); 5437 5438 if (retval < 0) 5439 return retval; 5440 5441 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5442 ut_params->op); 5443 5444 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5445 5446 ut_params->obuf = (op_mode == IN_PLACE ? 5447 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5448 5449 if (verify) { 5450 if (ut_params->obuf) 5451 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5452 plaintext_len, buffer); 5453 else 5454 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5455 plaintext_len, buffer); 5456 5457 debug_hexdump(stdout, "plaintext:", plaintext, 5458 (tdata->plaintext.len >> 3) - tdata->digest.len); 5459 debug_hexdump(stdout, "plaintext expected:", 5460 tdata->plaintext.data, 5461 (tdata->plaintext.len >> 3) - tdata->digest.len); 5462 } else { 5463 if (ut_params->obuf) 5464 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5465 ciphertext_len, buffer); 5466 else 5467 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5468 ciphertext_len, buffer); 5469 5470 debug_hexdump(stdout, "ciphertext:", ciphertext, 5471 ciphertext_len); 5472 debug_hexdump(stdout, "ciphertext expected:", 5473 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5474 5475 if (ut_params->obuf) 5476 digest = rte_pktmbuf_read(ut_params->obuf, 5477 (tdata->digest.offset_bytes == 0 ? 5478 plaintext_pad_len : tdata->digest.offset_bytes), 5479 tdata->digest.len, digest_buffer); 5480 else 5481 digest = rte_pktmbuf_read(ut_params->ibuf, 5482 (tdata->digest.offset_bytes == 0 ? 5483 plaintext_pad_len : tdata->digest.offset_bytes), 5484 tdata->digest.len, digest_buffer); 5485 5486 debug_hexdump(stdout, "digest:", digest, 5487 tdata->digest.len); 5488 debug_hexdump(stdout, "digest expected:", 5489 tdata->digest.data, tdata->digest.len); 5490 } 5491 5492 /* Validate obuf */ 5493 if (verify) { 5494 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5495 plaintext, 5496 tdata->plaintext.data, 5497 tdata->plaintext.len >> 3, 5498 "ZUC Plaintext data not as expected"); 5499 } else { 5500 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5501 ciphertext, 5502 tdata->ciphertext.data, 5503 tdata->validDataLenInBits.len, 5504 "ZUC Ciphertext data not as expected"); 5505 5506 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5507 digest, 5508 tdata->digest.data, 5509 DIGEST_BYTE_LENGTH_KASUMI_F9, 5510 "ZUC Generated auth tag not as expected"); 5511 } 5512 return 0; 5513 } 5514 5515 static int 5516 test_kasumi_encryption_test_case_1(void) 5517 { 5518 return test_kasumi_encryption(&kasumi_test_case_1); 5519 } 5520 5521 static int 5522 test_kasumi_encryption_test_case_1_sgl(void) 5523 { 5524 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 5525 } 5526 5527 static int 5528 test_kasumi_encryption_test_case_1_oop(void) 5529 { 5530 return test_kasumi_encryption_oop(&kasumi_test_case_1); 5531 } 5532 5533 static int 5534 test_kasumi_encryption_test_case_1_oop_sgl(void) 5535 { 5536 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 5537 } 5538 5539 static int 5540 test_kasumi_encryption_test_case_2(void) 5541 { 5542 return test_kasumi_encryption(&kasumi_test_case_2); 5543 } 5544 5545 static int 5546 test_kasumi_encryption_test_case_3(void) 5547 { 5548 return test_kasumi_encryption(&kasumi_test_case_3); 5549 } 5550 5551 static int 5552 test_kasumi_encryption_test_case_4(void) 5553 { 5554 return test_kasumi_encryption(&kasumi_test_case_4); 5555 } 5556 5557 static int 5558 test_kasumi_encryption_test_case_5(void) 5559 { 5560 return test_kasumi_encryption(&kasumi_test_case_5); 5561 } 5562 5563 static int 5564 test_kasumi_decryption_test_case_1(void) 5565 { 5566 return test_kasumi_decryption(&kasumi_test_case_1); 5567 } 5568 5569 static int 5570 test_kasumi_decryption_test_case_1_oop(void) 5571 { 5572 return test_kasumi_decryption_oop(&kasumi_test_case_1); 5573 } 5574 5575 static int 5576 test_kasumi_decryption_test_case_2(void) 5577 { 5578 return test_kasumi_decryption(&kasumi_test_case_2); 5579 } 5580 5581 static int 5582 test_kasumi_decryption_test_case_3(void) 5583 { 5584 return test_kasumi_decryption(&kasumi_test_case_3); 5585 } 5586 5587 static int 5588 test_kasumi_decryption_test_case_4(void) 5589 { 5590 return test_kasumi_decryption(&kasumi_test_case_4); 5591 } 5592 5593 static int 5594 test_kasumi_decryption_test_case_5(void) 5595 { 5596 return test_kasumi_decryption(&kasumi_test_case_5); 5597 } 5598 static int 5599 test_snow3g_encryption_test_case_1(void) 5600 { 5601 return test_snow3g_encryption(&snow3g_test_case_1); 5602 } 5603 5604 static int 5605 test_snow3g_encryption_test_case_1_oop(void) 5606 { 5607 return test_snow3g_encryption_oop(&snow3g_test_case_1); 5608 } 5609 5610 static int 5611 test_snow3g_encryption_test_case_1_oop_sgl(void) 5612 { 5613 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 5614 } 5615 5616 5617 static int 5618 test_snow3g_encryption_test_case_1_offset_oop(void) 5619 { 5620 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 5621 } 5622 5623 static int 5624 test_snow3g_encryption_test_case_2(void) 5625 { 5626 return test_snow3g_encryption(&snow3g_test_case_2); 5627 } 5628 5629 static int 5630 test_snow3g_encryption_test_case_3(void) 5631 { 5632 return test_snow3g_encryption(&snow3g_test_case_3); 5633 } 5634 5635 static int 5636 test_snow3g_encryption_test_case_4(void) 5637 { 5638 return test_snow3g_encryption(&snow3g_test_case_4); 5639 } 5640 5641 static int 5642 test_snow3g_encryption_test_case_5(void) 5643 { 5644 return test_snow3g_encryption(&snow3g_test_case_5); 5645 } 5646 5647 static int 5648 test_snow3g_decryption_test_case_1(void) 5649 { 5650 return test_snow3g_decryption(&snow3g_test_case_1); 5651 } 5652 5653 static int 5654 test_snow3g_decryption_test_case_1_oop(void) 5655 { 5656 return test_snow3g_decryption_oop(&snow3g_test_case_1); 5657 } 5658 5659 static int 5660 test_snow3g_decryption_test_case_2(void) 5661 { 5662 return test_snow3g_decryption(&snow3g_test_case_2); 5663 } 5664 5665 static int 5666 test_snow3g_decryption_test_case_3(void) 5667 { 5668 return test_snow3g_decryption(&snow3g_test_case_3); 5669 } 5670 5671 static int 5672 test_snow3g_decryption_test_case_4(void) 5673 { 5674 return test_snow3g_decryption(&snow3g_test_case_4); 5675 } 5676 5677 static int 5678 test_snow3g_decryption_test_case_5(void) 5679 { 5680 return test_snow3g_decryption(&snow3g_test_case_5); 5681 } 5682 5683 /* 5684 * Function prepares snow3g_hash_test_data from snow3g_test_data. 5685 * Pattern digest from snow3g_test_data must be allocated as 5686 * 4 last bytes in plaintext. 5687 */ 5688 static void 5689 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 5690 struct snow3g_hash_test_data *output) 5691 { 5692 if ((pattern != NULL) && (output != NULL)) { 5693 output->key.len = pattern->key.len; 5694 5695 memcpy(output->key.data, 5696 pattern->key.data, pattern->key.len); 5697 5698 output->auth_iv.len = pattern->auth_iv.len; 5699 5700 memcpy(output->auth_iv.data, 5701 pattern->auth_iv.data, pattern->auth_iv.len); 5702 5703 output->plaintext.len = pattern->plaintext.len; 5704 5705 memcpy(output->plaintext.data, 5706 pattern->plaintext.data, pattern->plaintext.len >> 3); 5707 5708 output->digest.len = pattern->digest.len; 5709 5710 memcpy(output->digest.data, 5711 &pattern->plaintext.data[pattern->digest.offset_bytes], 5712 pattern->digest.len); 5713 5714 output->validAuthLenInBits.len = 5715 pattern->validAuthLenInBits.len; 5716 } 5717 } 5718 5719 /* 5720 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 5721 */ 5722 static int 5723 test_snow3g_decryption_with_digest_test_case_1(void) 5724 { 5725 struct snow3g_hash_test_data snow3g_hash_data; 5726 5727 /* 5728 * Function prepare data for hash veryfication test case. 5729 * Digest is allocated in 4 last bytes in plaintext, pattern. 5730 */ 5731 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 5732 5733 return test_snow3g_decryption(&snow3g_test_case_7) & 5734 test_snow3g_authentication_verify(&snow3g_hash_data); 5735 } 5736 5737 static int 5738 test_snow3g_cipher_auth_test_case_1(void) 5739 { 5740 return test_snow3g_cipher_auth(&snow3g_test_case_3); 5741 } 5742 5743 static int 5744 test_snow3g_auth_cipher_test_case_1(void) 5745 { 5746 return test_snow3g_auth_cipher( 5747 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 5748 } 5749 5750 static int 5751 test_snow3g_auth_cipher_test_case_2(void) 5752 { 5753 return test_snow3g_auth_cipher( 5754 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 5755 } 5756 5757 static int 5758 test_snow3g_auth_cipher_test_case_2_oop(void) 5759 { 5760 return test_snow3g_auth_cipher( 5761 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 5762 } 5763 5764 static int 5765 test_snow3g_auth_cipher_part_digest_enc(void) 5766 { 5767 return test_snow3g_auth_cipher( 5768 &snow3g_auth_cipher_partial_digest_encryption, 5769 IN_PLACE, 0); 5770 } 5771 5772 static int 5773 test_snow3g_auth_cipher_part_digest_enc_oop(void) 5774 { 5775 return test_snow3g_auth_cipher( 5776 &snow3g_auth_cipher_partial_digest_encryption, 5777 OUT_OF_PLACE, 0); 5778 } 5779 5780 static int 5781 test_snow3g_auth_cipher_test_case_3_sgl(void) 5782 { 5783 return test_snow3g_auth_cipher_sgl( 5784 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 5785 } 5786 5787 static int 5788 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 5789 { 5790 return test_snow3g_auth_cipher_sgl( 5791 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 5792 } 5793 5794 static int 5795 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 5796 { 5797 return test_snow3g_auth_cipher_sgl( 5798 &snow3g_auth_cipher_partial_digest_encryption, 5799 IN_PLACE, 0); 5800 } 5801 5802 static int 5803 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 5804 { 5805 return test_snow3g_auth_cipher_sgl( 5806 &snow3g_auth_cipher_partial_digest_encryption, 5807 OUT_OF_PLACE, 0); 5808 } 5809 5810 static int 5811 test_snow3g_auth_cipher_verify_test_case_1(void) 5812 { 5813 return test_snow3g_auth_cipher( 5814 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 5815 } 5816 5817 static int 5818 test_snow3g_auth_cipher_verify_test_case_2(void) 5819 { 5820 return test_snow3g_auth_cipher( 5821 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 5822 } 5823 5824 static int 5825 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 5826 { 5827 return test_snow3g_auth_cipher( 5828 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 5829 } 5830 5831 static int 5832 test_snow3g_auth_cipher_verify_part_digest_enc(void) 5833 { 5834 return test_snow3g_auth_cipher( 5835 &snow3g_auth_cipher_partial_digest_encryption, 5836 IN_PLACE, 1); 5837 } 5838 5839 static int 5840 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 5841 { 5842 return test_snow3g_auth_cipher( 5843 &snow3g_auth_cipher_partial_digest_encryption, 5844 OUT_OF_PLACE, 1); 5845 } 5846 5847 static int 5848 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 5849 { 5850 return test_snow3g_auth_cipher_sgl( 5851 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 5852 } 5853 5854 static int 5855 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 5856 { 5857 return test_snow3g_auth_cipher_sgl( 5858 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 5859 } 5860 5861 static int 5862 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 5863 { 5864 return test_snow3g_auth_cipher_sgl( 5865 &snow3g_auth_cipher_partial_digest_encryption, 5866 IN_PLACE, 1); 5867 } 5868 5869 static int 5870 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 5871 { 5872 return test_snow3g_auth_cipher_sgl( 5873 &snow3g_auth_cipher_partial_digest_encryption, 5874 OUT_OF_PLACE, 1); 5875 } 5876 5877 static int 5878 test_snow3g_auth_cipher_with_digest_test_case_1(void) 5879 { 5880 return test_snow3g_auth_cipher( 5881 &snow3g_test_case_7, IN_PLACE, 0); 5882 } 5883 5884 static int 5885 test_kasumi_auth_cipher_test_case_1(void) 5886 { 5887 return test_kasumi_auth_cipher( 5888 &kasumi_test_case_3, IN_PLACE, 0); 5889 } 5890 5891 static int 5892 test_kasumi_auth_cipher_test_case_2(void) 5893 { 5894 return test_kasumi_auth_cipher( 5895 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 5896 } 5897 5898 static int 5899 test_kasumi_auth_cipher_test_case_2_oop(void) 5900 { 5901 return test_kasumi_auth_cipher( 5902 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 5903 } 5904 5905 static int 5906 test_kasumi_auth_cipher_test_case_2_sgl(void) 5907 { 5908 return test_kasumi_auth_cipher_sgl( 5909 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 5910 } 5911 5912 static int 5913 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 5914 { 5915 return test_kasumi_auth_cipher_sgl( 5916 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 5917 } 5918 5919 static int 5920 test_kasumi_auth_cipher_verify_test_case_1(void) 5921 { 5922 return test_kasumi_auth_cipher( 5923 &kasumi_test_case_3, IN_PLACE, 1); 5924 } 5925 5926 static int 5927 test_kasumi_auth_cipher_verify_test_case_2(void) 5928 { 5929 return test_kasumi_auth_cipher( 5930 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 5931 } 5932 5933 static int 5934 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 5935 { 5936 return test_kasumi_auth_cipher( 5937 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 5938 } 5939 5940 static int 5941 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 5942 { 5943 return test_kasumi_auth_cipher_sgl( 5944 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 5945 } 5946 5947 static int 5948 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 5949 { 5950 return test_kasumi_auth_cipher_sgl( 5951 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 5952 } 5953 5954 static int 5955 test_kasumi_cipher_auth_test_case_1(void) 5956 { 5957 return test_kasumi_cipher_auth(&kasumi_test_case_6); 5958 } 5959 5960 static int 5961 test_zuc_encryption_test_case_1(void) 5962 { 5963 return test_zuc_encryption(&zuc_test_case_cipher_193b); 5964 } 5965 5966 static int 5967 test_zuc_encryption_test_case_2(void) 5968 { 5969 return test_zuc_encryption(&zuc_test_case_cipher_800b); 5970 } 5971 5972 static int 5973 test_zuc_encryption_test_case_3(void) 5974 { 5975 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 5976 } 5977 5978 static int 5979 test_zuc_encryption_test_case_4(void) 5980 { 5981 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 5982 } 5983 5984 static int 5985 test_zuc_encryption_test_case_5(void) 5986 { 5987 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 5988 } 5989 5990 static int 5991 test_zuc_encryption_test_case_6_sgl(void) 5992 { 5993 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 5994 } 5995 5996 static int 5997 test_zuc_hash_generate_test_case_1(void) 5998 { 5999 return test_zuc_authentication(&zuc_test_case_auth_1b); 6000 } 6001 6002 static int 6003 test_zuc_hash_generate_test_case_2(void) 6004 { 6005 return test_zuc_authentication(&zuc_test_case_auth_90b); 6006 } 6007 6008 static int 6009 test_zuc_hash_generate_test_case_3(void) 6010 { 6011 return test_zuc_authentication(&zuc_test_case_auth_577b); 6012 } 6013 6014 static int 6015 test_zuc_hash_generate_test_case_4(void) 6016 { 6017 return test_zuc_authentication(&zuc_test_case_auth_2079b); 6018 } 6019 6020 static int 6021 test_zuc_hash_generate_test_case_5(void) 6022 { 6023 return test_zuc_authentication(&zuc_test_auth_5670b); 6024 } 6025 6026 static int 6027 test_zuc_hash_generate_test_case_6(void) 6028 { 6029 return test_zuc_authentication(&zuc_test_case_auth_128b); 6030 } 6031 6032 static int 6033 test_zuc_hash_generate_test_case_7(void) 6034 { 6035 /* This test is not for SW ZUC PMD */ 6036 if (gbl_driver_id == rte_cryptodev_driver_id_get( 6037 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) 6038 return -ENOTSUP; 6039 6040 return test_zuc_authentication(&zuc_test_case_auth_2080b); 6041 } 6042 6043 static int 6044 test_zuc_hash_generate_test_case_8(void) 6045 { 6046 return test_zuc_authentication(&zuc_test_case_auth_584b); 6047 } 6048 6049 static int 6050 test_zuc_cipher_auth_test_case_1(void) 6051 { 6052 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 6053 } 6054 6055 static int 6056 test_zuc_cipher_auth_test_case_2(void) 6057 { 6058 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 6059 } 6060 6061 static int 6062 test_zuc_auth_cipher_test_case_1(void) 6063 { 6064 /* This test is not for SW ZUC PMD */ 6065 if (gbl_driver_id == rte_cryptodev_driver_id_get( 6066 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) 6067 return -ENOTSUP; 6068 6069 return test_zuc_auth_cipher( 6070 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 6071 } 6072 6073 static int 6074 test_zuc_auth_cipher_test_case_1_oop(void) 6075 { 6076 return test_zuc_auth_cipher( 6077 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 6078 } 6079 6080 static int 6081 test_zuc_auth_cipher_test_case_1_sgl(void) 6082 { 6083 return test_zuc_auth_cipher_sgl( 6084 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 6085 } 6086 6087 static int 6088 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 6089 { 6090 return test_zuc_auth_cipher_sgl( 6091 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 6092 } 6093 6094 static int 6095 test_zuc_auth_cipher_verify_test_case_1(void) 6096 { 6097 return test_zuc_auth_cipher( 6098 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 6099 } 6100 6101 static int 6102 test_zuc_auth_cipher_verify_test_case_1_oop(void) 6103 { 6104 return test_zuc_auth_cipher( 6105 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 6106 } 6107 6108 static int 6109 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 6110 { 6111 return test_zuc_auth_cipher_sgl( 6112 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 6113 } 6114 6115 static int 6116 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 6117 { 6118 return test_zuc_auth_cipher_sgl( 6119 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 6120 } 6121 6122 static int 6123 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 6124 { 6125 uint8_t dev_id = testsuite_params.valid_devs[0]; 6126 6127 struct rte_cryptodev_sym_capability_idx cap_idx; 6128 6129 /* Check if device supports particular cipher algorithm */ 6130 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 6131 cap_idx.algo.cipher = tdata->cipher_algo; 6132 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 6133 return -ENOTSUP; 6134 6135 /* Check if device supports particular hash algorithm */ 6136 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6137 cap_idx.algo.auth = tdata->auth_algo; 6138 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 6139 return -ENOTSUP; 6140 6141 return 0; 6142 } 6143 6144 static int 6145 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 6146 uint8_t op_mode, uint8_t verify) 6147 { 6148 struct crypto_testsuite_params *ts_params = &testsuite_params; 6149 struct crypto_unittest_params *ut_params = &unittest_params; 6150 6151 int retval; 6152 6153 uint8_t *plaintext = NULL, *ciphertext = NULL; 6154 unsigned int plaintext_pad_len; 6155 unsigned int plaintext_len; 6156 unsigned int ciphertext_pad_len; 6157 unsigned int ciphertext_len; 6158 6159 struct rte_cryptodev_info dev_info; 6160 struct rte_crypto_op *op; 6161 6162 /* Check if device supports particular algorithms separately */ 6163 if (test_mixed_check_if_unsupported(tdata)) 6164 return -ENOTSUP; 6165 6166 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6167 6168 uint64_t feat_flags = dev_info.feature_flags; 6169 6170 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6171 printf("Device doesn't support digest encrypted.\n"); 6172 return -ENOTSUP; 6173 } 6174 6175 /* Create the session */ 6176 if (verify) 6177 retval = create_wireless_algo_cipher_auth_session( 6178 ts_params->valid_devs[0], 6179 RTE_CRYPTO_CIPHER_OP_DECRYPT, 6180 RTE_CRYPTO_AUTH_OP_VERIFY, 6181 tdata->auth_algo, 6182 tdata->cipher_algo, 6183 tdata->auth_key.data, tdata->auth_key.len, 6184 tdata->auth_iv.len, tdata->digest_enc.len, 6185 tdata->cipher_iv.len); 6186 else 6187 retval = create_wireless_algo_auth_cipher_session( 6188 ts_params->valid_devs[0], 6189 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6190 RTE_CRYPTO_AUTH_OP_GENERATE, 6191 tdata->auth_algo, 6192 tdata->cipher_algo, 6193 tdata->auth_key.data, tdata->auth_key.len, 6194 tdata->auth_iv.len, tdata->digest_enc.len, 6195 tdata->cipher_iv.len); 6196 if (retval < 0) 6197 return retval; 6198 6199 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6200 if (op_mode == OUT_OF_PLACE) 6201 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6202 6203 /* clear mbuf payload */ 6204 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6205 rte_pktmbuf_tailroom(ut_params->ibuf)); 6206 if (op_mode == OUT_OF_PLACE) 6207 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6208 rte_pktmbuf_tailroom(ut_params->obuf)); 6209 6210 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 6211 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 6212 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6213 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6214 6215 if (verify) { 6216 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6217 ciphertext_pad_len); 6218 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6219 if (op_mode == OUT_OF_PLACE) 6220 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6221 debug_hexdump(stdout, "ciphertext:", ciphertext, 6222 ciphertext_len); 6223 } else { 6224 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6225 plaintext_pad_len); 6226 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6227 if (op_mode == OUT_OF_PLACE) 6228 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 6229 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 6230 } 6231 6232 /* Create the operation */ 6233 retval = create_wireless_algo_auth_cipher_operation( 6234 tdata->digest_enc.data, tdata->digest_enc.len, 6235 tdata->cipher_iv.data, tdata->cipher_iv.len, 6236 tdata->auth_iv.data, tdata->auth_iv.len, 6237 (tdata->digest_enc.offset == 0 ? 6238 plaintext_pad_len 6239 : tdata->digest_enc.offset), 6240 tdata->validCipherLen.len_bits, 6241 tdata->cipher.offset_bits, 6242 tdata->validAuthLen.len_bits, 6243 tdata->auth.offset_bits, 6244 op_mode, 0, verify); 6245 6246 if (retval < 0) 6247 return retval; 6248 6249 op = process_crypto_request(ts_params->valid_devs[0], 6250 ut_params->op); 6251 6252 /* Check if the op failed because the device doesn't */ 6253 /* support this particular combination of algorithms */ 6254 if (op == NULL && ut_params->op->status == 6255 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 6256 printf("Device doesn't support this mixed combination. " 6257 "Test Skipped.\n"); 6258 return -ENOTSUP; 6259 } 6260 ut_params->op = op; 6261 6262 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6263 6264 ut_params->obuf = (op_mode == IN_PLACE ? 6265 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6266 6267 if (verify) { 6268 if (ut_params->obuf) 6269 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6270 uint8_t *); 6271 else 6272 plaintext = ciphertext + 6273 (tdata->cipher.offset_bits >> 3); 6274 6275 debug_hexdump(stdout, "plaintext:", plaintext, 6276 tdata->plaintext.len_bits >> 3); 6277 debug_hexdump(stdout, "plaintext expected:", 6278 tdata->plaintext.data, 6279 tdata->plaintext.len_bits >> 3); 6280 } else { 6281 if (ut_params->obuf) 6282 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6283 uint8_t *); 6284 else 6285 ciphertext = plaintext; 6286 6287 debug_hexdump(stdout, "ciphertext:", ciphertext, 6288 ciphertext_len); 6289 debug_hexdump(stdout, "ciphertext expected:", 6290 tdata->ciphertext.data, 6291 tdata->ciphertext.len_bits >> 3); 6292 6293 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6294 + (tdata->digest_enc.offset == 0 ? 6295 plaintext_pad_len : tdata->digest_enc.offset); 6296 6297 debug_hexdump(stdout, "digest:", ut_params->digest, 6298 tdata->digest_enc.len); 6299 debug_hexdump(stdout, "digest expected:", 6300 tdata->digest_enc.data, 6301 tdata->digest_enc.len); 6302 } 6303 6304 /* Validate obuf */ 6305 if (verify) { 6306 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6307 plaintext, 6308 tdata->plaintext.data, 6309 tdata->plaintext.len_bits >> 3, 6310 "Plaintext data not as expected"); 6311 } else { 6312 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6313 ciphertext, 6314 tdata->ciphertext.data, 6315 tdata->validDataLen.len_bits, 6316 "Ciphertext data not as expected"); 6317 6318 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6319 ut_params->digest, 6320 tdata->digest_enc.data, 6321 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 6322 "Generated auth tag not as expected"); 6323 } 6324 6325 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 6326 "crypto op processing failed"); 6327 6328 return 0; 6329 } 6330 6331 static int 6332 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 6333 uint8_t op_mode, uint8_t verify) 6334 { 6335 struct crypto_testsuite_params *ts_params = &testsuite_params; 6336 struct crypto_unittest_params *ut_params = &unittest_params; 6337 6338 int retval; 6339 6340 const uint8_t *plaintext = NULL; 6341 const uint8_t *ciphertext = NULL; 6342 const uint8_t *digest = NULL; 6343 unsigned int plaintext_pad_len; 6344 unsigned int plaintext_len; 6345 unsigned int ciphertext_pad_len; 6346 unsigned int ciphertext_len; 6347 uint8_t buffer[10000]; 6348 uint8_t digest_buffer[10000]; 6349 6350 struct rte_cryptodev_info dev_info; 6351 struct rte_crypto_op *op; 6352 6353 /* Check if device supports particular algorithms */ 6354 if (test_mixed_check_if_unsupported(tdata)) 6355 return -ENOTSUP; 6356 6357 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6358 6359 uint64_t feat_flags = dev_info.feature_flags; 6360 6361 if (op_mode == IN_PLACE) { 6362 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6363 printf("Device doesn't support in-place scatter-gather " 6364 "in both input and output mbufs.\n"); 6365 return -ENOTSUP; 6366 } 6367 } else { 6368 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6369 printf("Device doesn't support out-of-place scatter-gather " 6370 "in both input and output mbufs.\n"); 6371 return -ENOTSUP; 6372 } 6373 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6374 printf("Device doesn't support digest encrypted.\n"); 6375 return -ENOTSUP; 6376 } 6377 } 6378 6379 /* Create the session */ 6380 if (verify) 6381 retval = create_wireless_algo_cipher_auth_session( 6382 ts_params->valid_devs[0], 6383 RTE_CRYPTO_CIPHER_OP_DECRYPT, 6384 RTE_CRYPTO_AUTH_OP_VERIFY, 6385 tdata->auth_algo, 6386 tdata->cipher_algo, 6387 tdata->auth_key.data, tdata->auth_key.len, 6388 tdata->auth_iv.len, tdata->digest_enc.len, 6389 tdata->cipher_iv.len); 6390 else 6391 retval = create_wireless_algo_auth_cipher_session( 6392 ts_params->valid_devs[0], 6393 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6394 RTE_CRYPTO_AUTH_OP_GENERATE, 6395 tdata->auth_algo, 6396 tdata->cipher_algo, 6397 tdata->auth_key.data, tdata->auth_key.len, 6398 tdata->auth_iv.len, tdata->digest_enc.len, 6399 tdata->cipher_iv.len); 6400 if (retval < 0) 6401 return retval; 6402 6403 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 6404 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 6405 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6406 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6407 6408 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6409 ciphertext_pad_len, 15, 0); 6410 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6411 "Failed to allocate input buffer in mempool"); 6412 6413 if (op_mode == OUT_OF_PLACE) { 6414 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6415 plaintext_pad_len, 15, 0); 6416 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6417 "Failed to allocate output buffer in mempool"); 6418 } 6419 6420 if (verify) { 6421 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6422 tdata->ciphertext.data); 6423 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6424 ciphertext_len, buffer); 6425 debug_hexdump(stdout, "ciphertext:", ciphertext, 6426 ciphertext_len); 6427 } else { 6428 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6429 tdata->plaintext.data); 6430 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6431 plaintext_len, buffer); 6432 debug_hexdump(stdout, "plaintext:", plaintext, 6433 plaintext_len); 6434 } 6435 memset(buffer, 0, sizeof(buffer)); 6436 6437 /* Create the operation */ 6438 retval = create_wireless_algo_auth_cipher_operation( 6439 tdata->digest_enc.data, tdata->digest_enc.len, 6440 tdata->cipher_iv.data, tdata->cipher_iv.len, 6441 tdata->auth_iv.data, tdata->auth_iv.len, 6442 (tdata->digest_enc.offset == 0 ? 6443 plaintext_pad_len 6444 : tdata->digest_enc.offset), 6445 tdata->validCipherLen.len_bits, 6446 tdata->cipher.offset_bits, 6447 tdata->validAuthLen.len_bits, 6448 tdata->auth.offset_bits, 6449 op_mode, 1, verify); 6450 6451 if (retval < 0) 6452 return retval; 6453 6454 op = process_crypto_request(ts_params->valid_devs[0], 6455 ut_params->op); 6456 6457 /* Check if the op failed because the device doesn't */ 6458 /* support this particular combination of algorithms */ 6459 if (op == NULL && ut_params->op->status == 6460 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 6461 printf("Device doesn't support this mixed combination. " 6462 "Test Skipped.\n"); 6463 return -ENOTSUP; 6464 } 6465 6466 ut_params->op = op; 6467 6468 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6469 6470 ut_params->obuf = (op_mode == IN_PLACE ? 6471 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6472 6473 if (verify) { 6474 if (ut_params->obuf) 6475 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6476 plaintext_len, buffer); 6477 else 6478 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6479 plaintext_len, buffer); 6480 6481 debug_hexdump(stdout, "plaintext:", plaintext, 6482 (tdata->plaintext.len_bits >> 3) - 6483 tdata->digest_enc.len); 6484 debug_hexdump(stdout, "plaintext expected:", 6485 tdata->plaintext.data, 6486 (tdata->plaintext.len_bits >> 3) - 6487 tdata->digest_enc.len); 6488 } else { 6489 if (ut_params->obuf) 6490 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6491 ciphertext_len, buffer); 6492 else 6493 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6494 ciphertext_len, buffer); 6495 6496 debug_hexdump(stdout, "ciphertext:", ciphertext, 6497 ciphertext_len); 6498 debug_hexdump(stdout, "ciphertext expected:", 6499 tdata->ciphertext.data, 6500 tdata->ciphertext.len_bits >> 3); 6501 6502 if (ut_params->obuf) 6503 digest = rte_pktmbuf_read(ut_params->obuf, 6504 (tdata->digest_enc.offset == 0 ? 6505 plaintext_pad_len : 6506 tdata->digest_enc.offset), 6507 tdata->digest_enc.len, digest_buffer); 6508 else 6509 digest = rte_pktmbuf_read(ut_params->ibuf, 6510 (tdata->digest_enc.offset == 0 ? 6511 plaintext_pad_len : 6512 tdata->digest_enc.offset), 6513 tdata->digest_enc.len, digest_buffer); 6514 6515 debug_hexdump(stdout, "digest:", digest, 6516 tdata->digest_enc.len); 6517 debug_hexdump(stdout, "digest expected:", 6518 tdata->digest_enc.data, tdata->digest_enc.len); 6519 } 6520 6521 /* Validate obuf */ 6522 if (verify) { 6523 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6524 plaintext, 6525 tdata->plaintext.data, 6526 tdata->plaintext.len_bits >> 3, 6527 "Plaintext data not as expected"); 6528 } else { 6529 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6530 ciphertext, 6531 tdata->ciphertext.data, 6532 tdata->validDataLen.len_bits, 6533 "Ciphertext data not as expected"); 6534 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6535 digest, 6536 tdata->digest_enc.data, 6537 tdata->digest_enc.len, 6538 "Generated auth tag not as expected"); 6539 } 6540 6541 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 6542 "crypto op processing failed"); 6543 6544 return 0; 6545 } 6546 6547 /** AUTH AES CMAC + CIPHER AES CTR */ 6548 6549 static int 6550 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 6551 { 6552 return test_mixed_auth_cipher( 6553 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 6554 } 6555 6556 static int 6557 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 6558 { 6559 return test_mixed_auth_cipher( 6560 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 6561 } 6562 6563 static int 6564 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 6565 { 6566 return test_mixed_auth_cipher_sgl( 6567 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 6568 } 6569 6570 static int 6571 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 6572 { 6573 return test_mixed_auth_cipher_sgl( 6574 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 6575 } 6576 6577 static int 6578 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 6579 { 6580 return test_mixed_auth_cipher( 6581 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 6582 } 6583 6584 static int 6585 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 6586 { 6587 return test_mixed_auth_cipher( 6588 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 6589 } 6590 6591 static int 6592 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 6593 { 6594 return test_mixed_auth_cipher_sgl( 6595 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 6596 } 6597 6598 static int 6599 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 6600 { 6601 return test_mixed_auth_cipher_sgl( 6602 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 6603 } 6604 6605 /** MIXED AUTH + CIPHER */ 6606 6607 static int 6608 test_auth_zuc_cipher_snow_test_case_1(void) 6609 { 6610 return test_mixed_auth_cipher( 6611 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 6612 } 6613 6614 static int 6615 test_verify_auth_zuc_cipher_snow_test_case_1(void) 6616 { 6617 return test_mixed_auth_cipher( 6618 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 6619 } 6620 6621 static int 6622 test_auth_aes_cmac_cipher_snow_test_case_1(void) 6623 { 6624 return test_mixed_auth_cipher( 6625 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 6626 } 6627 6628 static int 6629 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 6630 { 6631 return test_mixed_auth_cipher( 6632 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 6633 } 6634 6635 static int 6636 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 6637 { 6638 return test_mixed_auth_cipher( 6639 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 6640 } 6641 6642 static int 6643 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 6644 { 6645 return test_mixed_auth_cipher( 6646 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 6647 } 6648 6649 static int 6650 test_auth_snow_cipher_aes_ctr_test_case_1(void) 6651 { 6652 return test_mixed_auth_cipher( 6653 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 6654 } 6655 6656 static int 6657 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 6658 { 6659 return test_mixed_auth_cipher( 6660 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 6661 } 6662 6663 static int 6664 test_auth_snow_cipher_zuc_test_case_1(void) 6665 { 6666 return test_mixed_auth_cipher( 6667 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 6668 } 6669 6670 static int 6671 test_verify_auth_snow_cipher_zuc_test_case_1(void) 6672 { 6673 return test_mixed_auth_cipher( 6674 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 6675 } 6676 6677 static int 6678 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 6679 { 6680 return test_mixed_auth_cipher( 6681 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 6682 } 6683 6684 static int 6685 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 6686 { 6687 return test_mixed_auth_cipher( 6688 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 6689 } 6690 6691 static int 6692 test_auth_null_cipher_snow_test_case_1(void) 6693 { 6694 return test_mixed_auth_cipher( 6695 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 6696 } 6697 6698 static int 6699 test_verify_auth_null_cipher_snow_test_case_1(void) 6700 { 6701 return test_mixed_auth_cipher( 6702 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 6703 } 6704 6705 static int 6706 test_auth_null_cipher_zuc_test_case_1(void) 6707 { 6708 return test_mixed_auth_cipher( 6709 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 6710 } 6711 6712 static int 6713 test_verify_auth_null_cipher_zuc_test_case_1(void) 6714 { 6715 return test_mixed_auth_cipher( 6716 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 6717 } 6718 6719 static int 6720 test_auth_snow_cipher_null_test_case_1(void) 6721 { 6722 return test_mixed_auth_cipher( 6723 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 6724 } 6725 6726 static int 6727 test_verify_auth_snow_cipher_null_test_case_1(void) 6728 { 6729 return test_mixed_auth_cipher( 6730 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 6731 } 6732 6733 static int 6734 test_auth_zuc_cipher_null_test_case_1(void) 6735 { 6736 return test_mixed_auth_cipher( 6737 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 6738 } 6739 6740 static int 6741 test_verify_auth_zuc_cipher_null_test_case_1(void) 6742 { 6743 return test_mixed_auth_cipher( 6744 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 6745 } 6746 6747 static int 6748 test_auth_null_cipher_aes_ctr_test_case_1(void) 6749 { 6750 return test_mixed_auth_cipher( 6751 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 6752 } 6753 6754 static int 6755 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 6756 { 6757 return test_mixed_auth_cipher( 6758 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 6759 } 6760 6761 static int 6762 test_auth_aes_cmac_cipher_null_test_case_1(void) 6763 { 6764 return test_mixed_auth_cipher( 6765 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 6766 } 6767 6768 static int 6769 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 6770 { 6771 return test_mixed_auth_cipher( 6772 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 6773 } 6774 6775 /* ***** AEAD algorithm Tests ***** */ 6776 6777 static int 6778 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 6779 enum rte_crypto_aead_operation op, 6780 const uint8_t *key, const uint8_t key_len, 6781 const uint16_t aad_len, const uint8_t auth_len, 6782 uint8_t iv_len) 6783 { 6784 uint8_t aead_key[key_len]; 6785 6786 struct crypto_testsuite_params *ts_params = &testsuite_params; 6787 struct crypto_unittest_params *ut_params = &unittest_params; 6788 6789 memcpy(aead_key, key, key_len); 6790 6791 /* Setup AEAD Parameters */ 6792 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 6793 ut_params->aead_xform.next = NULL; 6794 ut_params->aead_xform.aead.algo = algo; 6795 ut_params->aead_xform.aead.op = op; 6796 ut_params->aead_xform.aead.key.data = aead_key; 6797 ut_params->aead_xform.aead.key.length = key_len; 6798 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 6799 ut_params->aead_xform.aead.iv.length = iv_len; 6800 ut_params->aead_xform.aead.digest_length = auth_len; 6801 ut_params->aead_xform.aead.aad_length = aad_len; 6802 6803 debug_hexdump(stdout, "key:", key, key_len); 6804 6805 /* Create Crypto session*/ 6806 ut_params->sess = rte_cryptodev_sym_session_create( 6807 ts_params->session_mpool); 6808 6809 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 6810 &ut_params->aead_xform, 6811 ts_params->session_priv_mpool); 6812 6813 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 6814 6815 return 0; 6816 } 6817 6818 static int 6819 create_aead_xform(struct rte_crypto_op *op, 6820 enum rte_crypto_aead_algorithm algo, 6821 enum rte_crypto_aead_operation aead_op, 6822 uint8_t *key, const uint8_t key_len, 6823 const uint8_t aad_len, const uint8_t auth_len, 6824 uint8_t iv_len) 6825 { 6826 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 6827 "failed to allocate space for crypto transform"); 6828 6829 struct rte_crypto_sym_op *sym_op = op->sym; 6830 6831 /* Setup AEAD Parameters */ 6832 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 6833 sym_op->xform->next = NULL; 6834 sym_op->xform->aead.algo = algo; 6835 sym_op->xform->aead.op = aead_op; 6836 sym_op->xform->aead.key.data = key; 6837 sym_op->xform->aead.key.length = key_len; 6838 sym_op->xform->aead.iv.offset = IV_OFFSET; 6839 sym_op->xform->aead.iv.length = iv_len; 6840 sym_op->xform->aead.digest_length = auth_len; 6841 sym_op->xform->aead.aad_length = aad_len; 6842 6843 debug_hexdump(stdout, "key:", key, key_len); 6844 6845 return 0; 6846 } 6847 6848 static int 6849 create_aead_operation(enum rte_crypto_aead_operation op, 6850 const struct aead_test_data *tdata) 6851 { 6852 struct crypto_testsuite_params *ts_params = &testsuite_params; 6853 struct crypto_unittest_params *ut_params = &unittest_params; 6854 6855 uint8_t *plaintext, *ciphertext; 6856 unsigned int aad_pad_len, plaintext_pad_len; 6857 6858 /* Generate Crypto op data structure */ 6859 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 6860 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 6861 TEST_ASSERT_NOT_NULL(ut_params->op, 6862 "Failed to allocate symmetric crypto operation struct"); 6863 6864 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 6865 6866 /* Append aad data */ 6867 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 6868 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 6869 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6870 aad_pad_len); 6871 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 6872 "no room to append aad"); 6873 6874 sym_op->aead.aad.phys_addr = 6875 rte_pktmbuf_iova(ut_params->ibuf); 6876 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 6877 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 6878 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 6879 tdata->aad.len); 6880 6881 /* Append IV at the end of the crypto operation*/ 6882 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 6883 uint8_t *, IV_OFFSET); 6884 6885 /* Copy IV 1 byte after the IV pointer, according to the API */ 6886 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 6887 debug_hexdump(stdout, "iv:", iv_ptr, 6888 tdata->iv.len); 6889 } else { 6890 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 6891 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6892 aad_pad_len); 6893 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 6894 "no room to append aad"); 6895 6896 sym_op->aead.aad.phys_addr = 6897 rte_pktmbuf_iova(ut_params->ibuf); 6898 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 6899 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 6900 tdata->aad.len); 6901 6902 /* Append IV at the end of the crypto operation*/ 6903 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 6904 uint8_t *, IV_OFFSET); 6905 6906 if (tdata->iv.len == 0) { 6907 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 6908 debug_hexdump(stdout, "iv:", iv_ptr, 6909 AES_GCM_J0_LENGTH); 6910 } else { 6911 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 6912 debug_hexdump(stdout, "iv:", iv_ptr, 6913 tdata->iv.len); 6914 } 6915 } 6916 6917 /* Append plaintext/ciphertext */ 6918 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 6919 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 6920 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6921 plaintext_pad_len); 6922 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 6923 6924 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 6925 debug_hexdump(stdout, "plaintext:", plaintext, 6926 tdata->plaintext.len); 6927 6928 if (ut_params->obuf) { 6929 ciphertext = (uint8_t *)rte_pktmbuf_append( 6930 ut_params->obuf, 6931 plaintext_pad_len + aad_pad_len); 6932 TEST_ASSERT_NOT_NULL(ciphertext, 6933 "no room to append ciphertext"); 6934 6935 memset(ciphertext + aad_pad_len, 0, 6936 tdata->ciphertext.len); 6937 } 6938 } else { 6939 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 6940 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6941 plaintext_pad_len); 6942 TEST_ASSERT_NOT_NULL(ciphertext, 6943 "no room to append ciphertext"); 6944 6945 memcpy(ciphertext, tdata->ciphertext.data, 6946 tdata->ciphertext.len); 6947 debug_hexdump(stdout, "ciphertext:", ciphertext, 6948 tdata->ciphertext.len); 6949 6950 if (ut_params->obuf) { 6951 plaintext = (uint8_t *)rte_pktmbuf_append( 6952 ut_params->obuf, 6953 plaintext_pad_len + aad_pad_len); 6954 TEST_ASSERT_NOT_NULL(plaintext, 6955 "no room to append plaintext"); 6956 6957 memset(plaintext + aad_pad_len, 0, 6958 tdata->plaintext.len); 6959 } 6960 } 6961 6962 /* Append digest data */ 6963 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 6964 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 6965 ut_params->obuf ? ut_params->obuf : 6966 ut_params->ibuf, 6967 tdata->auth_tag.len); 6968 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 6969 "no room to append digest"); 6970 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 6971 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 6972 ut_params->obuf ? ut_params->obuf : 6973 ut_params->ibuf, 6974 plaintext_pad_len + 6975 aad_pad_len); 6976 } else { 6977 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 6978 ut_params->ibuf, tdata->auth_tag.len); 6979 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 6980 "no room to append digest"); 6981 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 6982 ut_params->ibuf, 6983 plaintext_pad_len + aad_pad_len); 6984 6985 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 6986 tdata->auth_tag.len); 6987 debug_hexdump(stdout, "digest:", 6988 sym_op->aead.digest.data, 6989 tdata->auth_tag.len); 6990 } 6991 6992 sym_op->aead.data.length = tdata->plaintext.len; 6993 sym_op->aead.data.offset = aad_pad_len; 6994 6995 return 0; 6996 } 6997 6998 static int 6999 test_authenticated_encryption(const struct aead_test_data *tdata) 7000 { 7001 struct crypto_testsuite_params *ts_params = &testsuite_params; 7002 struct crypto_unittest_params *ut_params = &unittest_params; 7003 7004 int retval; 7005 uint8_t *ciphertext, *auth_tag; 7006 uint16_t plaintext_pad_len; 7007 uint32_t i; 7008 7009 /* Verify the capabilities */ 7010 struct rte_cryptodev_sym_capability_idx cap_idx; 7011 const struct rte_cryptodev_symmetric_capability *capability; 7012 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7013 cap_idx.algo.aead = tdata->algo; 7014 capability = rte_cryptodev_sym_capability_get( 7015 ts_params->valid_devs[0], &cap_idx); 7016 if (capability == NULL) 7017 return -ENOTSUP; 7018 if (rte_cryptodev_sym_capability_check_aead( 7019 capability, tdata->key.len, tdata->auth_tag.len, 7020 tdata->aad.len, tdata->iv.len)) 7021 return -ENOTSUP; 7022 7023 /* Create AEAD session */ 7024 retval = create_aead_session(ts_params->valid_devs[0], 7025 tdata->algo, 7026 RTE_CRYPTO_AEAD_OP_ENCRYPT, 7027 tdata->key.data, tdata->key.len, 7028 tdata->aad.len, tdata->auth_tag.len, 7029 tdata->iv.len); 7030 if (retval < 0) 7031 return retval; 7032 7033 if (tdata->aad.len > MBUF_SIZE) { 7034 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 7035 /* Populate full size of add data */ 7036 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 7037 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 7038 } else 7039 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7040 7041 /* clear mbuf payload */ 7042 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7043 rte_pktmbuf_tailroom(ut_params->ibuf)); 7044 7045 /* Create AEAD operation */ 7046 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 7047 if (retval < 0) 7048 return retval; 7049 7050 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 7051 7052 ut_params->op->sym->m_src = ut_params->ibuf; 7053 7054 /* Process crypto operation */ 7055 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 7056 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 7057 else 7058 TEST_ASSERT_NOT_NULL( 7059 process_crypto_request(ts_params->valid_devs[0], 7060 ut_params->op), "failed to process sym crypto op"); 7061 7062 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7063 "crypto op processing failed"); 7064 7065 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7066 7067 if (ut_params->op->sym->m_dst) { 7068 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 7069 uint8_t *); 7070 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 7071 uint8_t *, plaintext_pad_len); 7072 } else { 7073 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 7074 uint8_t *, 7075 ut_params->op->sym->cipher.data.offset); 7076 auth_tag = ciphertext + plaintext_pad_len; 7077 } 7078 7079 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 7080 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 7081 7082 /* Validate obuf */ 7083 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7084 ciphertext, 7085 tdata->ciphertext.data, 7086 tdata->ciphertext.len, 7087 "Ciphertext data not as expected"); 7088 7089 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7090 auth_tag, 7091 tdata->auth_tag.data, 7092 tdata->auth_tag.len, 7093 "Generated auth tag not as expected"); 7094 7095 return 0; 7096 7097 } 7098 7099 #ifdef RTE_LIBRTE_SECURITY 7100 /* Basic algorithm run function for async inplace mode. 7101 * Creates a session from input parameters and runs one operation 7102 * on input_vec. Checks the output of the crypto operation against 7103 * output_vec. 7104 */ 7105 static int 7106 test_pdcp_proto(int i, int oop, 7107 enum rte_crypto_cipher_operation opc, 7108 enum rte_crypto_auth_operation opa, 7109 uint8_t *input_vec, 7110 unsigned int input_vec_len, 7111 uint8_t *output_vec, 7112 unsigned int output_vec_len) 7113 { 7114 struct crypto_testsuite_params *ts_params = &testsuite_params; 7115 struct crypto_unittest_params *ut_params = &unittest_params; 7116 uint8_t *plaintext; 7117 int ret = TEST_SUCCESS; 7118 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 7119 rte_cryptodev_get_sec_ctx( 7120 ts_params->valid_devs[0]); 7121 7122 /* Verify the capabilities */ 7123 struct rte_security_capability_idx sec_cap_idx; 7124 7125 sec_cap_idx.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 7126 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 7127 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 7128 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 7129 return -ENOTSUP; 7130 7131 /* Generate test mbuf data */ 7132 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7133 7134 /* clear mbuf payload */ 7135 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7136 rte_pktmbuf_tailroom(ut_params->ibuf)); 7137 7138 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7139 input_vec_len); 7140 memcpy(plaintext, input_vec, input_vec_len); 7141 7142 /* Out of place support */ 7143 if (oop) { 7144 /* 7145 * For out-op-place we need to alloc another mbuf 7146 */ 7147 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7148 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 7149 } 7150 7151 /* Set crypto type as IPSEC */ 7152 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 7153 7154 /* Setup Cipher Parameters */ 7155 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7156 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 7157 ut_params->cipher_xform.cipher.op = opc; 7158 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 7159 ut_params->cipher_xform.cipher.key.length = 7160 pdcp_test_params[i].cipher_key_len; 7161 ut_params->cipher_xform.cipher.iv.length = 0; 7162 7163 /* Setup HMAC Parameters if ICV header is required */ 7164 if (pdcp_test_params[i].auth_alg != 0) { 7165 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7166 ut_params->auth_xform.next = NULL; 7167 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 7168 ut_params->auth_xform.auth.op = opa; 7169 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 7170 ut_params->auth_xform.auth.key.length = 7171 pdcp_test_params[i].auth_key_len; 7172 7173 ut_params->cipher_xform.next = &ut_params->auth_xform; 7174 } else { 7175 ut_params->cipher_xform.next = NULL; 7176 } 7177 7178 struct rte_security_session_conf sess_conf = { 7179 .action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 7180 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 7181 {.pdcp = { 7182 .bearer = pdcp_test_bearer[i], 7183 .domain = pdcp_test_params[i].domain, 7184 .pkt_dir = pdcp_test_packet_direction[i], 7185 .sn_size = pdcp_test_data_sn_size[i], 7186 .hfn = pdcp_test_hfn[i], 7187 .hfn_threshold = pdcp_test_hfn_threshold[i], 7188 } }, 7189 .crypto_xform = &ut_params->cipher_xform 7190 }; 7191 7192 /* Create security session */ 7193 ut_params->sec_session = rte_security_session_create(ctx, 7194 &sess_conf, ts_params->session_priv_mpool); 7195 7196 if (!ut_params->sec_session) { 7197 printf("TestCase %s()-%d line %d failed %s: ", 7198 __func__, i, __LINE__, "Failed to allocate session"); 7199 ret = TEST_FAILED; 7200 goto on_err; 7201 } 7202 7203 /* Generate crypto op data structure */ 7204 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7205 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7206 if (!ut_params->op) { 7207 printf("TestCase %s()-%d line %d failed %s: ", 7208 __func__, i, __LINE__, 7209 "Failed to allocate symmetric crypto operation struct"); 7210 ret = TEST_FAILED; 7211 goto on_err; 7212 } 7213 7214 rte_security_attach_session(ut_params->op, ut_params->sec_session); 7215 7216 /* set crypto operation source mbuf */ 7217 ut_params->op->sym->m_src = ut_params->ibuf; 7218 if (oop) 7219 ut_params->op->sym->m_dst = ut_params->obuf; 7220 7221 /* Process crypto operation */ 7222 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 7223 == NULL) { 7224 printf("TestCase %s()-%d line %d failed %s: ", 7225 __func__, i, __LINE__, 7226 "failed to process sym crypto op"); 7227 ret = TEST_FAILED; 7228 goto on_err; 7229 } 7230 7231 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 7232 printf("TestCase %s()-%d line %d failed %s: ", 7233 __func__, i, __LINE__, "crypto op processing failed"); 7234 ret = TEST_FAILED; 7235 goto on_err; 7236 } 7237 7238 /* Validate obuf */ 7239 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 7240 uint8_t *); 7241 if (oop) { 7242 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 7243 uint8_t *); 7244 } 7245 7246 if (memcmp(ciphertext, output_vec, output_vec_len)) { 7247 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 7248 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 7249 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 7250 ret = TEST_FAILED; 7251 goto on_err; 7252 } 7253 7254 on_err: 7255 rte_crypto_op_free(ut_params->op); 7256 ut_params->op = NULL; 7257 7258 if (ut_params->sec_session) 7259 rte_security_session_destroy(ctx, ut_params->sec_session); 7260 ut_params->sec_session = NULL; 7261 7262 rte_pktmbuf_free(ut_params->ibuf); 7263 ut_params->ibuf = NULL; 7264 if (oop) { 7265 rte_pktmbuf_free(ut_params->obuf); 7266 ut_params->obuf = NULL; 7267 } 7268 7269 return ret; 7270 } 7271 7272 static int 7273 test_pdcp_proto_SGL(int i, int oop, 7274 enum rte_crypto_cipher_operation opc, 7275 enum rte_crypto_auth_operation opa, 7276 uint8_t *input_vec, 7277 unsigned int input_vec_len, 7278 uint8_t *output_vec, 7279 unsigned int output_vec_len, 7280 uint32_t fragsz, 7281 uint32_t fragsz_oop) 7282 { 7283 struct crypto_testsuite_params *ts_params = &testsuite_params; 7284 struct crypto_unittest_params *ut_params = &unittest_params; 7285 uint8_t *plaintext; 7286 struct rte_mbuf *buf, *buf_oop = NULL; 7287 int ret = TEST_SUCCESS; 7288 int to_trn = 0; 7289 int to_trn_tbl[16]; 7290 int segs = 1; 7291 unsigned int trn_data = 0; 7292 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 7293 rte_cryptodev_get_sec_ctx( 7294 ts_params->valid_devs[0]); 7295 7296 /* Verify the capabilities */ 7297 struct rte_security_capability_idx sec_cap_idx; 7298 7299 sec_cap_idx.action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 7300 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 7301 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 7302 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 7303 return -ENOTSUP; 7304 7305 if (fragsz > input_vec_len) 7306 fragsz = input_vec_len; 7307 7308 uint16_t plaintext_len = fragsz; 7309 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 7310 7311 if (fragsz_oop > output_vec_len) 7312 frag_size_oop = output_vec_len; 7313 7314 int ecx = 0; 7315 if (input_vec_len % fragsz != 0) { 7316 if (input_vec_len / fragsz + 1 > 16) 7317 return 1; 7318 } else if (input_vec_len / fragsz > 16) 7319 return 1; 7320 7321 /* Out of place support */ 7322 if (oop) { 7323 /* 7324 * For out-op-place we need to alloc another mbuf 7325 */ 7326 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7327 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 7328 buf_oop = ut_params->obuf; 7329 } 7330 7331 /* Generate test mbuf data */ 7332 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7333 7334 /* clear mbuf payload */ 7335 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7336 rte_pktmbuf_tailroom(ut_params->ibuf)); 7337 7338 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7339 plaintext_len); 7340 memcpy(plaintext, input_vec, plaintext_len); 7341 trn_data += plaintext_len; 7342 7343 buf = ut_params->ibuf; 7344 7345 /* 7346 * Loop until no more fragments 7347 */ 7348 7349 while (trn_data < input_vec_len) { 7350 ++segs; 7351 to_trn = (input_vec_len - trn_data < fragsz) ? 7352 (input_vec_len - trn_data) : fragsz; 7353 7354 to_trn_tbl[ecx++] = to_trn; 7355 7356 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7357 buf = buf->next; 7358 7359 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 7360 rte_pktmbuf_tailroom(buf)); 7361 7362 /* OOP */ 7363 if (oop && !fragsz_oop) { 7364 buf_oop->next = 7365 rte_pktmbuf_alloc(ts_params->mbuf_pool); 7366 buf_oop = buf_oop->next; 7367 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 7368 0, rte_pktmbuf_tailroom(buf_oop)); 7369 rte_pktmbuf_append(buf_oop, to_trn); 7370 } 7371 7372 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 7373 to_trn); 7374 7375 memcpy(plaintext, input_vec + trn_data, to_trn); 7376 trn_data += to_trn; 7377 } 7378 7379 ut_params->ibuf->nb_segs = segs; 7380 7381 segs = 1; 7382 if (fragsz_oop && oop) { 7383 to_trn = 0; 7384 ecx = 0; 7385 7386 trn_data = frag_size_oop; 7387 while (trn_data < output_vec_len) { 7388 ++segs; 7389 to_trn = 7390 (output_vec_len - trn_data < 7391 frag_size_oop) ? 7392 (output_vec_len - trn_data) : 7393 frag_size_oop; 7394 7395 to_trn_tbl[ecx++] = to_trn; 7396 7397 buf_oop->next = 7398 rte_pktmbuf_alloc(ts_params->mbuf_pool); 7399 buf_oop = buf_oop->next; 7400 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 7401 0, rte_pktmbuf_tailroom(buf_oop)); 7402 rte_pktmbuf_append(buf_oop, to_trn); 7403 7404 trn_data += to_trn; 7405 } 7406 ut_params->obuf->nb_segs = segs; 7407 } 7408 7409 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 7410 7411 /* Setup Cipher Parameters */ 7412 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7413 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 7414 ut_params->cipher_xform.cipher.op = opc; 7415 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 7416 ut_params->cipher_xform.cipher.key.length = 7417 pdcp_test_params[i].cipher_key_len; 7418 ut_params->cipher_xform.cipher.iv.length = 0; 7419 7420 /* Setup HMAC Parameters if ICV header is required */ 7421 if (pdcp_test_params[i].auth_alg != 0) { 7422 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7423 ut_params->auth_xform.next = NULL; 7424 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 7425 ut_params->auth_xform.auth.op = opa; 7426 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 7427 ut_params->auth_xform.auth.key.length = 7428 pdcp_test_params[i].auth_key_len; 7429 7430 ut_params->cipher_xform.next = &ut_params->auth_xform; 7431 } else { 7432 ut_params->cipher_xform.next = NULL; 7433 } 7434 7435 struct rte_security_session_conf sess_conf = { 7436 .action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 7437 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 7438 {.pdcp = { 7439 .bearer = pdcp_test_bearer[i], 7440 .domain = pdcp_test_params[i].domain, 7441 .pkt_dir = pdcp_test_packet_direction[i], 7442 .sn_size = pdcp_test_data_sn_size[i], 7443 .hfn = pdcp_test_hfn[i], 7444 .hfn_threshold = pdcp_test_hfn_threshold[i], 7445 } }, 7446 .crypto_xform = &ut_params->cipher_xform 7447 }; 7448 7449 /* Create security session */ 7450 ut_params->sec_session = rte_security_session_create(ctx, 7451 &sess_conf, ts_params->session_priv_mpool); 7452 7453 if (!ut_params->sec_session) { 7454 printf("TestCase %s()-%d line %d failed %s: ", 7455 __func__, i, __LINE__, "Failed to allocate session"); 7456 ret = TEST_FAILED; 7457 goto on_err; 7458 } 7459 7460 /* Generate crypto op data structure */ 7461 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7462 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7463 if (!ut_params->op) { 7464 printf("TestCase %s()-%d line %d failed %s: ", 7465 __func__, i, __LINE__, 7466 "Failed to allocate symmetric crypto operation struct"); 7467 ret = TEST_FAILED; 7468 goto on_err; 7469 } 7470 7471 rte_security_attach_session(ut_params->op, ut_params->sec_session); 7472 7473 /* set crypto operation source mbuf */ 7474 ut_params->op->sym->m_src = ut_params->ibuf; 7475 if (oop) 7476 ut_params->op->sym->m_dst = ut_params->obuf; 7477 7478 /* Process crypto operation */ 7479 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 7480 == NULL) { 7481 printf("TestCase %s()-%d line %d failed %s: ", 7482 __func__, i, __LINE__, 7483 "failed to process sym crypto op"); 7484 ret = TEST_FAILED; 7485 goto on_err; 7486 } 7487 7488 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 7489 printf("TestCase %s()-%d line %d failed %s: ", 7490 __func__, i, __LINE__, "crypto op processing failed"); 7491 ret = TEST_FAILED; 7492 goto on_err; 7493 } 7494 7495 /* Validate obuf */ 7496 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 7497 uint8_t *); 7498 if (oop) { 7499 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 7500 uint8_t *); 7501 } 7502 if (fragsz_oop) 7503 fragsz = frag_size_oop; 7504 if (memcmp(ciphertext, output_vec, fragsz)) { 7505 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 7506 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 7507 rte_hexdump(stdout, "reference", output_vec, fragsz); 7508 ret = TEST_FAILED; 7509 goto on_err; 7510 } 7511 7512 buf = ut_params->op->sym->m_src->next; 7513 if (oop) 7514 buf = ut_params->op->sym->m_dst->next; 7515 7516 unsigned int off = fragsz; 7517 7518 ecx = 0; 7519 while (buf) { 7520 ciphertext = rte_pktmbuf_mtod(buf, 7521 uint8_t *); 7522 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 7523 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 7524 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 7525 rte_hexdump(stdout, "reference", output_vec + off, 7526 to_trn_tbl[ecx]); 7527 ret = TEST_FAILED; 7528 goto on_err; 7529 } 7530 off += to_trn_tbl[ecx++]; 7531 buf = buf->next; 7532 } 7533 on_err: 7534 rte_crypto_op_free(ut_params->op); 7535 ut_params->op = NULL; 7536 7537 if (ut_params->sec_session) 7538 rte_security_session_destroy(ctx, ut_params->sec_session); 7539 ut_params->sec_session = NULL; 7540 7541 rte_pktmbuf_free(ut_params->ibuf); 7542 ut_params->ibuf = NULL; 7543 if (oop) { 7544 rte_pktmbuf_free(ut_params->obuf); 7545 ut_params->obuf = NULL; 7546 } 7547 7548 return ret; 7549 } 7550 7551 int 7552 test_pdcp_proto_cplane_encap(int i) 7553 { 7554 return test_pdcp_proto(i, 0, 7555 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7556 RTE_CRYPTO_AUTH_OP_GENERATE, 7557 pdcp_test_data_in[i], 7558 pdcp_test_data_in_len[i], 7559 pdcp_test_data_out[i], 7560 pdcp_test_data_in_len[i]+4); 7561 } 7562 7563 int 7564 test_pdcp_proto_uplane_encap(int i) 7565 { 7566 return test_pdcp_proto(i, 0, 7567 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7568 RTE_CRYPTO_AUTH_OP_GENERATE, 7569 pdcp_test_data_in[i], 7570 pdcp_test_data_in_len[i], 7571 pdcp_test_data_out[i], 7572 pdcp_test_data_in_len[i]); 7573 7574 } 7575 7576 int 7577 test_pdcp_proto_uplane_encap_with_int(int i) 7578 { 7579 return test_pdcp_proto(i, 0, 7580 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7581 RTE_CRYPTO_AUTH_OP_GENERATE, 7582 pdcp_test_data_in[i], 7583 pdcp_test_data_in_len[i], 7584 pdcp_test_data_out[i], 7585 pdcp_test_data_in_len[i] + 4); 7586 } 7587 7588 int 7589 test_pdcp_proto_cplane_decap(int i) 7590 { 7591 return test_pdcp_proto(i, 0, 7592 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7593 RTE_CRYPTO_AUTH_OP_VERIFY, 7594 pdcp_test_data_out[i], 7595 pdcp_test_data_in_len[i] + 4, 7596 pdcp_test_data_in[i], 7597 pdcp_test_data_in_len[i]); 7598 } 7599 7600 int 7601 test_pdcp_proto_uplane_decap(int i) 7602 { 7603 return test_pdcp_proto(i, 0, 7604 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7605 RTE_CRYPTO_AUTH_OP_VERIFY, 7606 pdcp_test_data_out[i], 7607 pdcp_test_data_in_len[i], 7608 pdcp_test_data_in[i], 7609 pdcp_test_data_in_len[i]); 7610 } 7611 7612 int 7613 test_pdcp_proto_uplane_decap_with_int(int i) 7614 { 7615 return test_pdcp_proto(i, 0, 7616 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7617 RTE_CRYPTO_AUTH_OP_VERIFY, 7618 pdcp_test_data_out[i], 7619 pdcp_test_data_in_len[i] + 4, 7620 pdcp_test_data_in[i], 7621 pdcp_test_data_in_len[i]); 7622 } 7623 7624 static int 7625 test_PDCP_PROTO_SGL_in_place_32B(void) 7626 { 7627 /* i can be used for running any PDCP case 7628 * In this case it is uplane 12-bit AES-SNOW DL encap 7629 */ 7630 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 7631 return test_pdcp_proto_SGL(i, IN_PLACE, 7632 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7633 RTE_CRYPTO_AUTH_OP_GENERATE, 7634 pdcp_test_data_in[i], 7635 pdcp_test_data_in_len[i], 7636 pdcp_test_data_out[i], 7637 pdcp_test_data_in_len[i]+4, 7638 32, 0); 7639 } 7640 static int 7641 test_PDCP_PROTO_SGL_oop_32B_128B(void) 7642 { 7643 /* i can be used for running any PDCP case 7644 * In this case it is uplane 18-bit NULL-NULL DL encap 7645 */ 7646 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 7647 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 7648 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7649 RTE_CRYPTO_AUTH_OP_GENERATE, 7650 pdcp_test_data_in[i], 7651 pdcp_test_data_in_len[i], 7652 pdcp_test_data_out[i], 7653 pdcp_test_data_in_len[i]+4, 7654 32, 128); 7655 } 7656 static int 7657 test_PDCP_PROTO_SGL_oop_32B_40B(void) 7658 { 7659 /* i can be used for running any PDCP case 7660 * In this case it is uplane 18-bit AES DL encap 7661 */ 7662 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 7663 + DOWNLINK; 7664 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 7665 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7666 RTE_CRYPTO_AUTH_OP_GENERATE, 7667 pdcp_test_data_in[i], 7668 pdcp_test_data_in_len[i], 7669 pdcp_test_data_out[i], 7670 pdcp_test_data_in_len[i], 7671 32, 40); 7672 } 7673 static int 7674 test_PDCP_PROTO_SGL_oop_128B_32B(void) 7675 { 7676 /* i can be used for running any PDCP case 7677 * In this case it is cplane 12-bit AES-ZUC DL encap 7678 */ 7679 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 7680 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 7681 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7682 RTE_CRYPTO_AUTH_OP_GENERATE, 7683 pdcp_test_data_in[i], 7684 pdcp_test_data_in_len[i], 7685 pdcp_test_data_out[i], 7686 pdcp_test_data_in_len[i]+4, 7687 128, 32); 7688 } 7689 #endif 7690 7691 static int 7692 test_AES_GCM_authenticated_encryption_test_case_1(void) 7693 { 7694 return test_authenticated_encryption(&gcm_test_case_1); 7695 } 7696 7697 static int 7698 test_AES_GCM_authenticated_encryption_test_case_2(void) 7699 { 7700 return test_authenticated_encryption(&gcm_test_case_2); 7701 } 7702 7703 static int 7704 test_AES_GCM_authenticated_encryption_test_case_3(void) 7705 { 7706 return test_authenticated_encryption(&gcm_test_case_3); 7707 } 7708 7709 static int 7710 test_AES_GCM_authenticated_encryption_test_case_4(void) 7711 { 7712 return test_authenticated_encryption(&gcm_test_case_4); 7713 } 7714 7715 static int 7716 test_AES_GCM_authenticated_encryption_test_case_5(void) 7717 { 7718 return test_authenticated_encryption(&gcm_test_case_5); 7719 } 7720 7721 static int 7722 test_AES_GCM_authenticated_encryption_test_case_6(void) 7723 { 7724 return test_authenticated_encryption(&gcm_test_case_6); 7725 } 7726 7727 static int 7728 test_AES_GCM_authenticated_encryption_test_case_7(void) 7729 { 7730 return test_authenticated_encryption(&gcm_test_case_7); 7731 } 7732 7733 static int 7734 test_AES_GCM_authenticated_encryption_test_case_8(void) 7735 { 7736 return test_authenticated_encryption(&gcm_test_case_8); 7737 } 7738 7739 static int 7740 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 7741 { 7742 return test_authenticated_encryption(&gcm_J0_test_case_1); 7743 } 7744 7745 static int 7746 test_AES_GCM_auth_encryption_test_case_192_1(void) 7747 { 7748 return test_authenticated_encryption(&gcm_test_case_192_1); 7749 } 7750 7751 static int 7752 test_AES_GCM_auth_encryption_test_case_192_2(void) 7753 { 7754 return test_authenticated_encryption(&gcm_test_case_192_2); 7755 } 7756 7757 static int 7758 test_AES_GCM_auth_encryption_test_case_192_3(void) 7759 { 7760 return test_authenticated_encryption(&gcm_test_case_192_3); 7761 } 7762 7763 static int 7764 test_AES_GCM_auth_encryption_test_case_192_4(void) 7765 { 7766 return test_authenticated_encryption(&gcm_test_case_192_4); 7767 } 7768 7769 static int 7770 test_AES_GCM_auth_encryption_test_case_192_5(void) 7771 { 7772 return test_authenticated_encryption(&gcm_test_case_192_5); 7773 } 7774 7775 static int 7776 test_AES_GCM_auth_encryption_test_case_192_6(void) 7777 { 7778 return test_authenticated_encryption(&gcm_test_case_192_6); 7779 } 7780 7781 static int 7782 test_AES_GCM_auth_encryption_test_case_192_7(void) 7783 { 7784 return test_authenticated_encryption(&gcm_test_case_192_7); 7785 } 7786 7787 static int 7788 test_AES_GCM_auth_encryption_test_case_256_1(void) 7789 { 7790 return test_authenticated_encryption(&gcm_test_case_256_1); 7791 } 7792 7793 static int 7794 test_AES_GCM_auth_encryption_test_case_256_2(void) 7795 { 7796 return test_authenticated_encryption(&gcm_test_case_256_2); 7797 } 7798 7799 static int 7800 test_AES_GCM_auth_encryption_test_case_256_3(void) 7801 { 7802 return test_authenticated_encryption(&gcm_test_case_256_3); 7803 } 7804 7805 static int 7806 test_AES_GCM_auth_encryption_test_case_256_4(void) 7807 { 7808 return test_authenticated_encryption(&gcm_test_case_256_4); 7809 } 7810 7811 static int 7812 test_AES_GCM_auth_encryption_test_case_256_5(void) 7813 { 7814 return test_authenticated_encryption(&gcm_test_case_256_5); 7815 } 7816 7817 static int 7818 test_AES_GCM_auth_encryption_test_case_256_6(void) 7819 { 7820 return test_authenticated_encryption(&gcm_test_case_256_6); 7821 } 7822 7823 static int 7824 test_AES_GCM_auth_encryption_test_case_256_7(void) 7825 { 7826 return test_authenticated_encryption(&gcm_test_case_256_7); 7827 } 7828 7829 static int 7830 test_AES_GCM_auth_encryption_test_case_aad_1(void) 7831 { 7832 return test_authenticated_encryption(&gcm_test_case_aad_1); 7833 } 7834 7835 static int 7836 test_AES_GCM_auth_encryption_test_case_aad_2(void) 7837 { 7838 return test_authenticated_encryption(&gcm_test_case_aad_2); 7839 } 7840 7841 static int 7842 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 7843 { 7844 struct aead_test_data tdata; 7845 int res; 7846 7847 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7848 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7849 tdata.iv.data[0] += 1; 7850 res = test_authenticated_encryption(&tdata); 7851 if (res == -ENOTSUP) 7852 return res; 7853 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7854 return TEST_SUCCESS; 7855 } 7856 7857 static int 7858 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 7859 { 7860 struct aead_test_data tdata; 7861 int res; 7862 7863 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7864 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7865 tdata.plaintext.data[0] += 1; 7866 res = test_authenticated_encryption(&tdata); 7867 if (res == -ENOTSUP) 7868 return res; 7869 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7870 return TEST_SUCCESS; 7871 } 7872 7873 static int 7874 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 7875 { 7876 struct aead_test_data tdata; 7877 int res; 7878 7879 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7880 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7881 tdata.ciphertext.data[0] += 1; 7882 res = test_authenticated_encryption(&tdata); 7883 if (res == -ENOTSUP) 7884 return res; 7885 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7886 return TEST_SUCCESS; 7887 } 7888 7889 static int 7890 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 7891 { 7892 struct aead_test_data tdata; 7893 int res; 7894 7895 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7896 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7897 tdata.aad.len += 1; 7898 res = test_authenticated_encryption(&tdata); 7899 if (res == -ENOTSUP) 7900 return res; 7901 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7902 return TEST_SUCCESS; 7903 } 7904 7905 static int 7906 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 7907 { 7908 struct aead_test_data tdata; 7909 uint8_t aad[gcm_test_case_7.aad.len]; 7910 int res; 7911 7912 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7913 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7914 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 7915 aad[0] += 1; 7916 tdata.aad.data = aad; 7917 res = test_authenticated_encryption(&tdata); 7918 if (res == -ENOTSUP) 7919 return res; 7920 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7921 return TEST_SUCCESS; 7922 } 7923 7924 static int 7925 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 7926 { 7927 struct aead_test_data tdata; 7928 int res; 7929 7930 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 7931 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 7932 tdata.auth_tag.data[0] += 1; 7933 res = test_authenticated_encryption(&tdata); 7934 if (res == -ENOTSUP) 7935 return res; 7936 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 7937 return TEST_SUCCESS; 7938 } 7939 7940 static int 7941 test_authenticated_decryption(const struct aead_test_data *tdata) 7942 { 7943 struct crypto_testsuite_params *ts_params = &testsuite_params; 7944 struct crypto_unittest_params *ut_params = &unittest_params; 7945 7946 int retval; 7947 uint8_t *plaintext; 7948 uint32_t i; 7949 7950 /* Verify the capabilities */ 7951 struct rte_cryptodev_sym_capability_idx cap_idx; 7952 const struct rte_cryptodev_symmetric_capability *capability; 7953 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7954 cap_idx.algo.aead = tdata->algo; 7955 capability = rte_cryptodev_sym_capability_get( 7956 ts_params->valid_devs[0], &cap_idx); 7957 if (capability == NULL) 7958 return -ENOTSUP; 7959 if (rte_cryptodev_sym_capability_check_aead( 7960 capability, tdata->key.len, tdata->auth_tag.len, 7961 tdata->aad.len, tdata->iv.len)) 7962 return -ENOTSUP; 7963 7964 /* Create AEAD session */ 7965 retval = create_aead_session(ts_params->valid_devs[0], 7966 tdata->algo, 7967 RTE_CRYPTO_AEAD_OP_DECRYPT, 7968 tdata->key.data, tdata->key.len, 7969 tdata->aad.len, tdata->auth_tag.len, 7970 tdata->iv.len); 7971 if (retval < 0) 7972 return retval; 7973 7974 /* alloc mbuf and set payload */ 7975 if (tdata->aad.len > MBUF_SIZE) { 7976 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 7977 /* Populate full size of add data */ 7978 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 7979 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 7980 } else 7981 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7982 7983 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7984 rte_pktmbuf_tailroom(ut_params->ibuf)); 7985 7986 /* Create AEAD operation */ 7987 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 7988 if (retval < 0) 7989 return retval; 7990 7991 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 7992 7993 ut_params->op->sym->m_src = ut_params->ibuf; 7994 7995 /* Process crypto operation */ 7996 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 7997 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 7998 else 7999 TEST_ASSERT_NOT_NULL( 8000 process_crypto_request(ts_params->valid_devs[0], 8001 ut_params->op), "failed to process sym crypto op"); 8002 8003 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8004 "crypto op processing failed"); 8005 8006 if (ut_params->op->sym->m_dst) 8007 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8008 uint8_t *); 8009 else 8010 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8011 uint8_t *, 8012 ut_params->op->sym->cipher.data.offset); 8013 8014 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 8015 8016 /* Validate obuf */ 8017 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8018 plaintext, 8019 tdata->plaintext.data, 8020 tdata->plaintext.len, 8021 "Plaintext data not as expected"); 8022 8023 TEST_ASSERT_EQUAL(ut_params->op->status, 8024 RTE_CRYPTO_OP_STATUS_SUCCESS, 8025 "Authentication failed"); 8026 8027 return 0; 8028 } 8029 8030 static int 8031 test_AES_GCM_authenticated_decryption_test_case_1(void) 8032 { 8033 return test_authenticated_decryption(&gcm_test_case_1); 8034 } 8035 8036 static int 8037 test_AES_GCM_authenticated_decryption_test_case_2(void) 8038 { 8039 return test_authenticated_decryption(&gcm_test_case_2); 8040 } 8041 8042 static int 8043 test_AES_GCM_authenticated_decryption_test_case_3(void) 8044 { 8045 return test_authenticated_decryption(&gcm_test_case_3); 8046 } 8047 8048 static int 8049 test_AES_GCM_authenticated_decryption_test_case_4(void) 8050 { 8051 return test_authenticated_decryption(&gcm_test_case_4); 8052 } 8053 8054 static int 8055 test_AES_GCM_authenticated_decryption_test_case_5(void) 8056 { 8057 return test_authenticated_decryption(&gcm_test_case_5); 8058 } 8059 8060 static int 8061 test_AES_GCM_authenticated_decryption_test_case_6(void) 8062 { 8063 return test_authenticated_decryption(&gcm_test_case_6); 8064 } 8065 8066 static int 8067 test_AES_GCM_authenticated_decryption_test_case_7(void) 8068 { 8069 return test_authenticated_decryption(&gcm_test_case_7); 8070 } 8071 8072 static int 8073 test_AES_GCM_authenticated_decryption_test_case_8(void) 8074 { 8075 return test_authenticated_decryption(&gcm_test_case_8); 8076 } 8077 8078 static int 8079 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 8080 { 8081 return test_authenticated_decryption(&gcm_J0_test_case_1); 8082 } 8083 8084 static int 8085 test_AES_GCM_auth_decryption_test_case_192_1(void) 8086 { 8087 return test_authenticated_decryption(&gcm_test_case_192_1); 8088 } 8089 8090 static int 8091 test_AES_GCM_auth_decryption_test_case_192_2(void) 8092 { 8093 return test_authenticated_decryption(&gcm_test_case_192_2); 8094 } 8095 8096 static int 8097 test_AES_GCM_auth_decryption_test_case_192_3(void) 8098 { 8099 return test_authenticated_decryption(&gcm_test_case_192_3); 8100 } 8101 8102 static int 8103 test_AES_GCM_auth_decryption_test_case_192_4(void) 8104 { 8105 return test_authenticated_decryption(&gcm_test_case_192_4); 8106 } 8107 8108 static int 8109 test_AES_GCM_auth_decryption_test_case_192_5(void) 8110 { 8111 return test_authenticated_decryption(&gcm_test_case_192_5); 8112 } 8113 8114 static int 8115 test_AES_GCM_auth_decryption_test_case_192_6(void) 8116 { 8117 return test_authenticated_decryption(&gcm_test_case_192_6); 8118 } 8119 8120 static int 8121 test_AES_GCM_auth_decryption_test_case_192_7(void) 8122 { 8123 return test_authenticated_decryption(&gcm_test_case_192_7); 8124 } 8125 8126 static int 8127 test_AES_GCM_auth_decryption_test_case_256_1(void) 8128 { 8129 return test_authenticated_decryption(&gcm_test_case_256_1); 8130 } 8131 8132 static int 8133 test_AES_GCM_auth_decryption_test_case_256_2(void) 8134 { 8135 return test_authenticated_decryption(&gcm_test_case_256_2); 8136 } 8137 8138 static int 8139 test_AES_GCM_auth_decryption_test_case_256_3(void) 8140 { 8141 return test_authenticated_decryption(&gcm_test_case_256_3); 8142 } 8143 8144 static int 8145 test_AES_GCM_auth_decryption_test_case_256_4(void) 8146 { 8147 return test_authenticated_decryption(&gcm_test_case_256_4); 8148 } 8149 8150 static int 8151 test_AES_GCM_auth_decryption_test_case_256_5(void) 8152 { 8153 return test_authenticated_decryption(&gcm_test_case_256_5); 8154 } 8155 8156 static int 8157 test_AES_GCM_auth_decryption_test_case_256_6(void) 8158 { 8159 return test_authenticated_decryption(&gcm_test_case_256_6); 8160 } 8161 8162 static int 8163 test_AES_GCM_auth_decryption_test_case_256_7(void) 8164 { 8165 return test_authenticated_decryption(&gcm_test_case_256_7); 8166 } 8167 8168 static int 8169 test_AES_GCM_auth_decryption_test_case_aad_1(void) 8170 { 8171 return test_authenticated_decryption(&gcm_test_case_aad_1); 8172 } 8173 8174 static int 8175 test_AES_GCM_auth_decryption_test_case_aad_2(void) 8176 { 8177 return test_authenticated_decryption(&gcm_test_case_aad_2); 8178 } 8179 8180 static int 8181 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 8182 { 8183 struct aead_test_data tdata; 8184 int res; 8185 8186 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8187 tdata.iv.data[0] += 1; 8188 res = test_authenticated_decryption(&tdata); 8189 if (res == -ENOTSUP) 8190 return res; 8191 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 8192 return TEST_SUCCESS; 8193 } 8194 8195 static int 8196 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 8197 { 8198 struct aead_test_data tdata; 8199 int res; 8200 8201 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 8202 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8203 tdata.plaintext.data[0] += 1; 8204 res = test_authenticated_decryption(&tdata); 8205 if (res == -ENOTSUP) 8206 return res; 8207 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 8208 return TEST_SUCCESS; 8209 } 8210 8211 static int 8212 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 8213 { 8214 struct aead_test_data tdata; 8215 int res; 8216 8217 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8218 tdata.ciphertext.data[0] += 1; 8219 res = test_authenticated_decryption(&tdata); 8220 if (res == -ENOTSUP) 8221 return res; 8222 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 8223 return TEST_SUCCESS; 8224 } 8225 8226 static int 8227 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 8228 { 8229 struct aead_test_data tdata; 8230 int res; 8231 8232 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8233 tdata.aad.len += 1; 8234 res = test_authenticated_decryption(&tdata); 8235 if (res == -ENOTSUP) 8236 return res; 8237 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 8238 return TEST_SUCCESS; 8239 } 8240 8241 static int 8242 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 8243 { 8244 struct aead_test_data tdata; 8245 uint8_t aad[gcm_test_case_7.aad.len]; 8246 int res; 8247 8248 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8249 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 8250 aad[0] += 1; 8251 tdata.aad.data = aad; 8252 res = test_authenticated_decryption(&tdata); 8253 if (res == -ENOTSUP) 8254 return res; 8255 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 8256 return TEST_SUCCESS; 8257 } 8258 8259 static int 8260 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 8261 { 8262 struct aead_test_data tdata; 8263 int res; 8264 8265 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 8266 tdata.auth_tag.data[0] += 1; 8267 res = test_authenticated_decryption(&tdata); 8268 if (res == -ENOTSUP) 8269 return res; 8270 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 8271 return TEST_SUCCESS; 8272 } 8273 8274 static int 8275 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 8276 { 8277 struct crypto_testsuite_params *ts_params = &testsuite_params; 8278 struct crypto_unittest_params *ut_params = &unittest_params; 8279 8280 int retval; 8281 uint8_t *ciphertext, *auth_tag; 8282 uint16_t plaintext_pad_len; 8283 8284 /* Verify the capabilities */ 8285 struct rte_cryptodev_sym_capability_idx cap_idx; 8286 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8287 cap_idx.algo.aead = tdata->algo; 8288 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8289 &cap_idx) == NULL) 8290 return -ENOTSUP; 8291 8292 /* not supported with CPU crypto */ 8293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8294 return -ENOTSUP; 8295 8296 /* Create AEAD session */ 8297 retval = create_aead_session(ts_params->valid_devs[0], 8298 tdata->algo, 8299 RTE_CRYPTO_AEAD_OP_ENCRYPT, 8300 tdata->key.data, tdata->key.len, 8301 tdata->aad.len, tdata->auth_tag.len, 8302 tdata->iv.len); 8303 if (retval < 0) 8304 return retval; 8305 8306 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8307 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8308 8309 /* clear mbuf payload */ 8310 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8311 rte_pktmbuf_tailroom(ut_params->ibuf)); 8312 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 8313 rte_pktmbuf_tailroom(ut_params->obuf)); 8314 8315 /* Create AEAD operation */ 8316 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8317 if (retval < 0) 8318 return retval; 8319 8320 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8321 8322 ut_params->op->sym->m_src = ut_params->ibuf; 8323 ut_params->op->sym->m_dst = ut_params->obuf; 8324 8325 /* Process crypto operation */ 8326 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 8327 ut_params->op), "failed to process sym crypto op"); 8328 8329 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8330 "crypto op processing failed"); 8331 8332 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8333 8334 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 8335 ut_params->op->sym->cipher.data.offset); 8336 auth_tag = ciphertext + plaintext_pad_len; 8337 8338 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8339 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8340 8341 /* Validate obuf */ 8342 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8343 ciphertext, 8344 tdata->ciphertext.data, 8345 tdata->ciphertext.len, 8346 "Ciphertext data not as expected"); 8347 8348 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8349 auth_tag, 8350 tdata->auth_tag.data, 8351 tdata->auth_tag.len, 8352 "Generated auth tag not as expected"); 8353 8354 return 0; 8355 8356 } 8357 8358 static int 8359 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 8360 { 8361 return test_authenticated_encryption_oop(&gcm_test_case_5); 8362 } 8363 8364 static int 8365 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 8366 { 8367 struct crypto_testsuite_params *ts_params = &testsuite_params; 8368 struct crypto_unittest_params *ut_params = &unittest_params; 8369 8370 int retval; 8371 uint8_t *plaintext; 8372 8373 /* Verify the capabilities */ 8374 struct rte_cryptodev_sym_capability_idx cap_idx; 8375 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8376 cap_idx.algo.aead = tdata->algo; 8377 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8378 &cap_idx) == NULL) 8379 return -ENOTSUP; 8380 8381 /* not supported with CPU crypto */ 8382 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8383 return -ENOTSUP; 8384 8385 /* Create AEAD session */ 8386 retval = create_aead_session(ts_params->valid_devs[0], 8387 tdata->algo, 8388 RTE_CRYPTO_AEAD_OP_DECRYPT, 8389 tdata->key.data, tdata->key.len, 8390 tdata->aad.len, tdata->auth_tag.len, 8391 tdata->iv.len); 8392 if (retval < 0) 8393 return retval; 8394 8395 /* alloc mbuf and set payload */ 8396 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8397 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8398 8399 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8400 rte_pktmbuf_tailroom(ut_params->ibuf)); 8401 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 8402 rte_pktmbuf_tailroom(ut_params->obuf)); 8403 8404 /* Create AEAD operation */ 8405 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 8406 if (retval < 0) 8407 return retval; 8408 8409 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8410 8411 ut_params->op->sym->m_src = ut_params->ibuf; 8412 ut_params->op->sym->m_dst = ut_params->obuf; 8413 8414 /* Process crypto operation */ 8415 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 8416 ut_params->op), "failed to process sym crypto op"); 8417 8418 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8419 "crypto op processing failed"); 8420 8421 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 8422 ut_params->op->sym->cipher.data.offset); 8423 8424 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 8425 8426 /* Validate obuf */ 8427 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8428 plaintext, 8429 tdata->plaintext.data, 8430 tdata->plaintext.len, 8431 "Plaintext data not as expected"); 8432 8433 TEST_ASSERT_EQUAL(ut_params->op->status, 8434 RTE_CRYPTO_OP_STATUS_SUCCESS, 8435 "Authentication failed"); 8436 return 0; 8437 } 8438 8439 static int 8440 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 8441 { 8442 return test_authenticated_decryption_oop(&gcm_test_case_5); 8443 } 8444 8445 static int 8446 test_authenticated_encryption_sessionless( 8447 const struct aead_test_data *tdata) 8448 { 8449 struct crypto_testsuite_params *ts_params = &testsuite_params; 8450 struct crypto_unittest_params *ut_params = &unittest_params; 8451 8452 int retval; 8453 uint8_t *ciphertext, *auth_tag; 8454 uint16_t plaintext_pad_len; 8455 uint8_t key[tdata->key.len + 1]; 8456 8457 /* This test is for AESNI MB and AESNI GCM PMDs only */ 8458 if ((gbl_driver_id != rte_cryptodev_driver_id_get( 8459 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) && 8460 (gbl_driver_id != rte_cryptodev_driver_id_get( 8461 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)))) 8462 return -ENOTSUP; 8463 8464 /* not supported with CPU crypto */ 8465 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8466 return -ENOTSUP; 8467 8468 /* Verify the capabilities */ 8469 struct rte_cryptodev_sym_capability_idx cap_idx; 8470 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8471 cap_idx.algo.aead = tdata->algo; 8472 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8473 &cap_idx) == NULL) 8474 return -ENOTSUP; 8475 8476 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8477 8478 /* clear mbuf payload */ 8479 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8480 rte_pktmbuf_tailroom(ut_params->ibuf)); 8481 8482 /* Create AEAD operation */ 8483 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8484 if (retval < 0) 8485 return retval; 8486 8487 /* Create GCM xform */ 8488 memcpy(key, tdata->key.data, tdata->key.len); 8489 retval = create_aead_xform(ut_params->op, 8490 tdata->algo, 8491 RTE_CRYPTO_AEAD_OP_ENCRYPT, 8492 key, tdata->key.len, 8493 tdata->aad.len, tdata->auth_tag.len, 8494 tdata->iv.len); 8495 if (retval < 0) 8496 return retval; 8497 8498 ut_params->op->sym->m_src = ut_params->ibuf; 8499 8500 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 8501 RTE_CRYPTO_OP_SESSIONLESS, 8502 "crypto op session type not sessionless"); 8503 8504 /* Process crypto operation */ 8505 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 8506 ut_params->op), "failed to process sym crypto op"); 8507 8508 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 8509 8510 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8511 "crypto op status not success"); 8512 8513 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8514 8515 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 8516 ut_params->op->sym->cipher.data.offset); 8517 auth_tag = ciphertext + plaintext_pad_len; 8518 8519 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8520 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8521 8522 /* Validate obuf */ 8523 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8524 ciphertext, 8525 tdata->ciphertext.data, 8526 tdata->ciphertext.len, 8527 "Ciphertext data not as expected"); 8528 8529 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8530 auth_tag, 8531 tdata->auth_tag.data, 8532 tdata->auth_tag.len, 8533 "Generated auth tag not as expected"); 8534 8535 return 0; 8536 8537 } 8538 8539 static int 8540 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 8541 { 8542 return test_authenticated_encryption_sessionless( 8543 &gcm_test_case_5); 8544 } 8545 8546 static int 8547 test_authenticated_decryption_sessionless( 8548 const struct aead_test_data *tdata) 8549 { 8550 struct crypto_testsuite_params *ts_params = &testsuite_params; 8551 struct crypto_unittest_params *ut_params = &unittest_params; 8552 8553 int retval; 8554 uint8_t *plaintext; 8555 uint8_t key[tdata->key.len + 1]; 8556 8557 /* This test is for AESNI MB and AESNI GCM PMDs only */ 8558 if ((gbl_driver_id != rte_cryptodev_driver_id_get( 8559 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) && 8560 (gbl_driver_id != rte_cryptodev_driver_id_get( 8561 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)))) 8562 return -ENOTSUP; 8563 8564 /* not supported with CPU crypto */ 8565 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8566 return -ENOTSUP; 8567 8568 /* Verify the capabilities */ 8569 struct rte_cryptodev_sym_capability_idx cap_idx; 8570 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8571 cap_idx.algo.aead = tdata->algo; 8572 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8573 &cap_idx) == NULL) 8574 return -ENOTSUP; 8575 8576 /* alloc mbuf and set payload */ 8577 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8578 8579 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8580 rte_pktmbuf_tailroom(ut_params->ibuf)); 8581 8582 /* Create AEAD operation */ 8583 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 8584 if (retval < 0) 8585 return retval; 8586 8587 /* Create AEAD xform */ 8588 memcpy(key, tdata->key.data, tdata->key.len); 8589 retval = create_aead_xform(ut_params->op, 8590 tdata->algo, 8591 RTE_CRYPTO_AEAD_OP_DECRYPT, 8592 key, tdata->key.len, 8593 tdata->aad.len, tdata->auth_tag.len, 8594 tdata->iv.len); 8595 if (retval < 0) 8596 return retval; 8597 8598 ut_params->op->sym->m_src = ut_params->ibuf; 8599 8600 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 8601 RTE_CRYPTO_OP_SESSIONLESS, 8602 "crypto op session type not sessionless"); 8603 8604 /* Process crypto operation */ 8605 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 8606 ut_params->op), "failed to process sym crypto op"); 8607 8608 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 8609 8610 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8611 "crypto op status not success"); 8612 8613 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 8614 ut_params->op->sym->cipher.data.offset); 8615 8616 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 8617 8618 /* Validate obuf */ 8619 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8620 plaintext, 8621 tdata->plaintext.data, 8622 tdata->plaintext.len, 8623 "Plaintext data not as expected"); 8624 8625 TEST_ASSERT_EQUAL(ut_params->op->status, 8626 RTE_CRYPTO_OP_STATUS_SUCCESS, 8627 "Authentication failed"); 8628 return 0; 8629 } 8630 8631 static int 8632 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 8633 { 8634 return test_authenticated_decryption_sessionless( 8635 &gcm_test_case_5); 8636 } 8637 8638 static int 8639 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 8640 { 8641 return test_authenticated_encryption(&ccm_test_case_128_1); 8642 } 8643 8644 static int 8645 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 8646 { 8647 return test_authenticated_encryption(&ccm_test_case_128_2); 8648 } 8649 8650 static int 8651 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 8652 { 8653 return test_authenticated_encryption(&ccm_test_case_128_3); 8654 } 8655 8656 static int 8657 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 8658 { 8659 return test_authenticated_decryption(&ccm_test_case_128_1); 8660 } 8661 8662 static int 8663 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 8664 { 8665 return test_authenticated_decryption(&ccm_test_case_128_2); 8666 } 8667 8668 static int 8669 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 8670 { 8671 return test_authenticated_decryption(&ccm_test_case_128_3); 8672 } 8673 8674 static int 8675 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 8676 { 8677 return test_authenticated_encryption(&ccm_test_case_192_1); 8678 } 8679 8680 static int 8681 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 8682 { 8683 return test_authenticated_encryption(&ccm_test_case_192_2); 8684 } 8685 8686 static int 8687 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 8688 { 8689 return test_authenticated_encryption(&ccm_test_case_192_3); 8690 } 8691 8692 static int 8693 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 8694 { 8695 return test_authenticated_decryption(&ccm_test_case_192_1); 8696 } 8697 8698 static int 8699 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 8700 { 8701 return test_authenticated_decryption(&ccm_test_case_192_2); 8702 } 8703 8704 static int 8705 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 8706 { 8707 return test_authenticated_decryption(&ccm_test_case_192_3); 8708 } 8709 8710 static int 8711 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 8712 { 8713 return test_authenticated_encryption(&ccm_test_case_256_1); 8714 } 8715 8716 static int 8717 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 8718 { 8719 return test_authenticated_encryption(&ccm_test_case_256_2); 8720 } 8721 8722 static int 8723 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 8724 { 8725 return test_authenticated_encryption(&ccm_test_case_256_3); 8726 } 8727 8728 static int 8729 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 8730 { 8731 return test_authenticated_decryption(&ccm_test_case_256_1); 8732 } 8733 8734 static int 8735 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 8736 { 8737 return test_authenticated_decryption(&ccm_test_case_256_2); 8738 } 8739 8740 static int 8741 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 8742 { 8743 return test_authenticated_decryption(&ccm_test_case_256_3); 8744 } 8745 8746 static int 8747 test_stats(void) 8748 { 8749 struct crypto_testsuite_params *ts_params = &testsuite_params; 8750 struct rte_cryptodev_stats stats; 8751 struct rte_cryptodev *dev; 8752 cryptodev_stats_get_t temp_pfn; 8753 8754 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8755 return -ENOTSUP; 8756 8757 /* Verify the capabilities */ 8758 struct rte_cryptodev_sym_capability_idx cap_idx; 8759 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8760 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 8761 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8762 &cap_idx) == NULL) 8763 return -ENOTSUP; 8764 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8765 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 8766 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8767 &cap_idx) == NULL) 8768 return -ENOTSUP; 8769 8770 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 8771 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 8772 &stats) == -ENODEV), 8773 "rte_cryptodev_stats_get invalid dev failed"); 8774 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 8775 "rte_cryptodev_stats_get invalid Param failed"); 8776 dev = &rte_cryptodevs[ts_params->valid_devs[0]]; 8777 temp_pfn = dev->dev_ops->stats_get; 8778 dev->dev_ops->stats_get = (cryptodev_stats_get_t)0; 8779 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 8780 == -ENOTSUP), 8781 "rte_cryptodev_stats_get invalid Param failed"); 8782 dev->dev_ops->stats_get = temp_pfn; 8783 8784 /* Test expected values */ 8785 ut_setup(); 8786 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 8787 ut_teardown(); 8788 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 8789 &stats), 8790 "rte_cryptodev_stats_get failed"); 8791 TEST_ASSERT((stats.enqueued_count == 1), 8792 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8793 TEST_ASSERT((stats.dequeued_count == 1), 8794 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8795 TEST_ASSERT((stats.enqueue_err_count == 0), 8796 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8797 TEST_ASSERT((stats.dequeue_err_count == 0), 8798 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8799 8800 /* invalid device but should ignore and not reset device stats*/ 8801 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 8802 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 8803 &stats), 8804 "rte_cryptodev_stats_get failed"); 8805 TEST_ASSERT((stats.enqueued_count == 1), 8806 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8807 8808 /* check that a valid reset clears stats */ 8809 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 8810 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 8811 &stats), 8812 "rte_cryptodev_stats_get failed"); 8813 TEST_ASSERT((stats.enqueued_count == 0), 8814 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8815 TEST_ASSERT((stats.dequeued_count == 0), 8816 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 8817 8818 return TEST_SUCCESS; 8819 } 8820 8821 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 8822 struct crypto_unittest_params *ut_params, 8823 enum rte_crypto_auth_operation op, 8824 const struct HMAC_MD5_vector *test_case) 8825 { 8826 uint8_t key[64]; 8827 8828 memcpy(key, test_case->key.data, test_case->key.len); 8829 8830 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8831 ut_params->auth_xform.next = NULL; 8832 ut_params->auth_xform.auth.op = op; 8833 8834 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 8835 8836 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 8837 ut_params->auth_xform.auth.key.length = test_case->key.len; 8838 ut_params->auth_xform.auth.key.data = key; 8839 8840 ut_params->sess = rte_cryptodev_sym_session_create( 8841 ts_params->session_mpool); 8842 8843 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 8844 ut_params->sess, &ut_params->auth_xform, 8845 ts_params->session_priv_mpool); 8846 8847 if (ut_params->sess == NULL) 8848 return TEST_FAILED; 8849 8850 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8851 8852 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8853 rte_pktmbuf_tailroom(ut_params->ibuf)); 8854 8855 return 0; 8856 } 8857 8858 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 8859 const struct HMAC_MD5_vector *test_case, 8860 uint8_t **plaintext) 8861 { 8862 uint16_t plaintext_pad_len; 8863 8864 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 8865 8866 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 8867 16); 8868 8869 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8870 plaintext_pad_len); 8871 memcpy(*plaintext, test_case->plaintext.data, 8872 test_case->plaintext.len); 8873 8874 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 8875 ut_params->ibuf, MD5_DIGEST_LEN); 8876 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 8877 "no room to append digest"); 8878 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 8879 ut_params->ibuf, plaintext_pad_len); 8880 8881 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 8882 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 8883 test_case->auth_tag.len); 8884 } 8885 8886 sym_op->auth.data.offset = 0; 8887 sym_op->auth.data.length = test_case->plaintext.len; 8888 8889 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8890 ut_params->op->sym->m_src = ut_params->ibuf; 8891 8892 return 0; 8893 } 8894 8895 static int 8896 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 8897 { 8898 uint16_t plaintext_pad_len; 8899 uint8_t *plaintext, *auth_tag; 8900 8901 struct crypto_testsuite_params *ts_params = &testsuite_params; 8902 struct crypto_unittest_params *ut_params = &unittest_params; 8903 8904 /* Verify the capabilities */ 8905 struct rte_cryptodev_sym_capability_idx cap_idx; 8906 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8907 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 8908 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8909 &cap_idx) == NULL) 8910 return -ENOTSUP; 8911 8912 if (MD5_HMAC_create_session(ts_params, ut_params, 8913 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 8914 return TEST_FAILED; 8915 8916 /* Generate Crypto op data structure */ 8917 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8918 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8919 TEST_ASSERT_NOT_NULL(ut_params->op, 8920 "Failed to allocate symmetric crypto operation struct"); 8921 8922 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 8923 16); 8924 8925 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 8926 return TEST_FAILED; 8927 8928 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8929 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 8930 ut_params->op); 8931 else 8932 TEST_ASSERT_NOT_NULL( 8933 process_crypto_request(ts_params->valid_devs[0], 8934 ut_params->op), 8935 "failed to process sym crypto op"); 8936 8937 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8938 "crypto op processing failed"); 8939 8940 if (ut_params->op->sym->m_dst) { 8941 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8942 uint8_t *, plaintext_pad_len); 8943 } else { 8944 auth_tag = plaintext + plaintext_pad_len; 8945 } 8946 8947 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8948 auth_tag, 8949 test_case->auth_tag.data, 8950 test_case->auth_tag.len, 8951 "HMAC_MD5 generated tag not as expected"); 8952 8953 return TEST_SUCCESS; 8954 } 8955 8956 static int 8957 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 8958 { 8959 uint8_t *plaintext; 8960 8961 struct crypto_testsuite_params *ts_params = &testsuite_params; 8962 struct crypto_unittest_params *ut_params = &unittest_params; 8963 8964 /* Verify the capabilities */ 8965 struct rte_cryptodev_sym_capability_idx cap_idx; 8966 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8967 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 8968 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 8969 &cap_idx) == NULL) 8970 return -ENOTSUP; 8971 8972 if (MD5_HMAC_create_session(ts_params, ut_params, 8973 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 8974 return TEST_FAILED; 8975 } 8976 8977 /* Generate Crypto op data structure */ 8978 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8979 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8980 TEST_ASSERT_NOT_NULL(ut_params->op, 8981 "Failed to allocate symmetric crypto operation struct"); 8982 8983 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 8984 return TEST_FAILED; 8985 8986 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8987 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 8988 ut_params->op); 8989 else 8990 TEST_ASSERT_NOT_NULL( 8991 process_crypto_request(ts_params->valid_devs[0], 8992 ut_params->op), 8993 "failed to process sym crypto op"); 8994 8995 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8996 "HMAC_MD5 crypto op processing failed"); 8997 8998 return TEST_SUCCESS; 8999 } 9000 9001 static int 9002 test_MD5_HMAC_generate_case_1(void) 9003 { 9004 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 9005 } 9006 9007 static int 9008 test_MD5_HMAC_verify_case_1(void) 9009 { 9010 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 9011 } 9012 9013 static int 9014 test_MD5_HMAC_generate_case_2(void) 9015 { 9016 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 9017 } 9018 9019 static int 9020 test_MD5_HMAC_verify_case_2(void) 9021 { 9022 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 9023 } 9024 9025 static int 9026 test_multi_session(void) 9027 { 9028 struct crypto_testsuite_params *ts_params = &testsuite_params; 9029 struct crypto_unittest_params *ut_params = &unittest_params; 9030 9031 struct rte_cryptodev_info dev_info; 9032 struct rte_cryptodev_sym_session **sessions; 9033 9034 uint16_t i; 9035 9036 /* Verify the capabilities */ 9037 struct rte_cryptodev_sym_capability_idx cap_idx; 9038 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9039 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 9040 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9041 &cap_idx) == NULL) 9042 return -ENOTSUP; 9043 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9044 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 9045 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9046 &cap_idx) == NULL) 9047 return -ENOTSUP; 9048 9049 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 9050 aes_cbc_key, hmac_sha512_key); 9051 9052 9053 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9054 9055 sessions = rte_malloc(NULL, 9056 (sizeof(struct rte_cryptodev_sym_session *) * 9057 MAX_NB_SESSIONS) + 1, 0); 9058 9059 /* Create multiple crypto sessions*/ 9060 for (i = 0; i < MAX_NB_SESSIONS; i++) { 9061 9062 sessions[i] = rte_cryptodev_sym_session_create( 9063 ts_params->session_mpool); 9064 9065 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9066 sessions[i], &ut_params->auth_xform, 9067 ts_params->session_priv_mpool); 9068 TEST_ASSERT_NOT_NULL(sessions[i], 9069 "Session creation failed at session number %u", 9070 i); 9071 9072 /* Attempt to send a request on each session */ 9073 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 9074 sessions[i], 9075 ut_params, 9076 ts_params, 9077 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 9078 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 9079 aes_cbc_iv), 9080 "Failed to perform decrypt on request number %u.", i); 9081 /* free crypto operation structure */ 9082 if (ut_params->op) 9083 rte_crypto_op_free(ut_params->op); 9084 9085 /* 9086 * free mbuf - both obuf and ibuf are usually the same, 9087 * so check if they point at the same address is necessary, 9088 * to avoid freeing the mbuf twice. 9089 */ 9090 if (ut_params->obuf) { 9091 rte_pktmbuf_free(ut_params->obuf); 9092 if (ut_params->ibuf == ut_params->obuf) 9093 ut_params->ibuf = 0; 9094 ut_params->obuf = 0; 9095 } 9096 if (ut_params->ibuf) { 9097 rte_pktmbuf_free(ut_params->ibuf); 9098 ut_params->ibuf = 0; 9099 } 9100 } 9101 9102 /* Next session create should fail */ 9103 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9104 sessions[i], &ut_params->auth_xform, 9105 ts_params->session_priv_mpool); 9106 TEST_ASSERT_NULL(sessions[i], 9107 "Session creation succeeded unexpectedly!"); 9108 9109 for (i = 0; i < MAX_NB_SESSIONS; i++) { 9110 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 9111 sessions[i]); 9112 rte_cryptodev_sym_session_free(sessions[i]); 9113 } 9114 9115 rte_free(sessions); 9116 9117 return TEST_SUCCESS; 9118 } 9119 9120 struct multi_session_params { 9121 struct crypto_unittest_params ut_params; 9122 uint8_t *cipher_key; 9123 uint8_t *hmac_key; 9124 const uint8_t *cipher; 9125 const uint8_t *digest; 9126 uint8_t *iv; 9127 }; 9128 9129 #define MB_SESSION_NUMBER 3 9130 9131 static int 9132 test_multi_session_random_usage(void) 9133 { 9134 struct crypto_testsuite_params *ts_params = &testsuite_params; 9135 struct rte_cryptodev_info dev_info; 9136 struct rte_cryptodev_sym_session **sessions; 9137 uint32_t i, j; 9138 struct multi_session_params ut_paramz[] = { 9139 9140 { 9141 .cipher_key = ms_aes_cbc_key0, 9142 .hmac_key = ms_hmac_key0, 9143 .cipher = ms_aes_cbc_cipher0, 9144 .digest = ms_hmac_digest0, 9145 .iv = ms_aes_cbc_iv0 9146 }, 9147 { 9148 .cipher_key = ms_aes_cbc_key1, 9149 .hmac_key = ms_hmac_key1, 9150 .cipher = ms_aes_cbc_cipher1, 9151 .digest = ms_hmac_digest1, 9152 .iv = ms_aes_cbc_iv1 9153 }, 9154 { 9155 .cipher_key = ms_aes_cbc_key2, 9156 .hmac_key = ms_hmac_key2, 9157 .cipher = ms_aes_cbc_cipher2, 9158 .digest = ms_hmac_digest2, 9159 .iv = ms_aes_cbc_iv2 9160 }, 9161 9162 }; 9163 9164 /* Verify the capabilities */ 9165 struct rte_cryptodev_sym_capability_idx cap_idx; 9166 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9167 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 9168 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9169 &cap_idx) == NULL) 9170 return -ENOTSUP; 9171 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9172 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 9173 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9174 &cap_idx) == NULL) 9175 return -ENOTSUP; 9176 9177 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9178 9179 sessions = rte_malloc(NULL, 9180 (sizeof(struct rte_cryptodev_sym_session *) 9181 * MAX_NB_SESSIONS) + 1, 0); 9182 9183 for (i = 0; i < MB_SESSION_NUMBER; i++) { 9184 sessions[i] = rte_cryptodev_sym_session_create( 9185 ts_params->session_mpool); 9186 9187 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 9188 sizeof(struct crypto_unittest_params)); 9189 9190 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 9191 &ut_paramz[i].ut_params, 9192 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 9193 9194 /* Create multiple crypto sessions*/ 9195 rte_cryptodev_sym_session_init( 9196 ts_params->valid_devs[0], 9197 sessions[i], 9198 &ut_paramz[i].ut_params.auth_xform, 9199 ts_params->session_priv_mpool); 9200 9201 TEST_ASSERT_NOT_NULL(sessions[i], 9202 "Session creation failed at session number %u", 9203 i); 9204 9205 } 9206 9207 srand(time(NULL)); 9208 for (i = 0; i < 40000; i++) { 9209 9210 j = rand() % MB_SESSION_NUMBER; 9211 9212 TEST_ASSERT_SUCCESS( 9213 test_AES_CBC_HMAC_SHA512_decrypt_perform( 9214 sessions[j], 9215 &ut_paramz[j].ut_params, 9216 ts_params, ut_paramz[j].cipher, 9217 ut_paramz[j].digest, 9218 ut_paramz[j].iv), 9219 "Failed to perform decrypt on request number %u.", i); 9220 9221 if (ut_paramz[j].ut_params.op) 9222 rte_crypto_op_free(ut_paramz[j].ut_params.op); 9223 9224 /* 9225 * free mbuf - both obuf and ibuf are usually the same, 9226 * so check if they point at the same address is necessary, 9227 * to avoid freeing the mbuf twice. 9228 */ 9229 if (ut_paramz[j].ut_params.obuf) { 9230 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 9231 if (ut_paramz[j].ut_params.ibuf 9232 == ut_paramz[j].ut_params.obuf) 9233 ut_paramz[j].ut_params.ibuf = 0; 9234 ut_paramz[j].ut_params.obuf = 0; 9235 } 9236 if (ut_paramz[j].ut_params.ibuf) { 9237 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 9238 ut_paramz[j].ut_params.ibuf = 0; 9239 } 9240 } 9241 9242 for (i = 0; i < MB_SESSION_NUMBER; i++) { 9243 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 9244 sessions[i]); 9245 rte_cryptodev_sym_session_free(sessions[i]); 9246 } 9247 9248 rte_free(sessions); 9249 9250 return TEST_SUCCESS; 9251 } 9252 9253 static int 9254 test_null_cipher_only_operation(void) 9255 { 9256 struct crypto_testsuite_params *ts_params = &testsuite_params; 9257 struct crypto_unittest_params *ut_params = &unittest_params; 9258 9259 /* Verify the capabilities */ 9260 struct rte_cryptodev_sym_capability_idx cap_idx; 9261 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9262 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL; 9263 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9264 &cap_idx) == NULL) 9265 return -ENOTSUP; 9266 9267 /* Generate test mbuf data and space for digest */ 9268 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 9269 catch_22_quote, QUOTE_512_BYTES, 0); 9270 9271 /* Setup Cipher Parameters */ 9272 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9273 ut_params->cipher_xform.next = NULL; 9274 9275 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 9276 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9277 9278 ut_params->sess = rte_cryptodev_sym_session_create( 9279 ts_params->session_mpool); 9280 9281 /* Create Crypto session*/ 9282 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9283 ut_params->sess, 9284 &ut_params->cipher_xform, 9285 ts_params->session_priv_mpool); 9286 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9287 9288 /* Generate Crypto op data structure */ 9289 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9290 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9291 TEST_ASSERT_NOT_NULL(ut_params->op, 9292 "Failed to allocate symmetric crypto operation struct"); 9293 9294 /* Set crypto operation data parameters */ 9295 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9296 9297 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 9298 9299 /* set crypto operation source mbuf */ 9300 sym_op->m_src = ut_params->ibuf; 9301 9302 sym_op->cipher.data.offset = 0; 9303 sym_op->cipher.data.length = QUOTE_512_BYTES; 9304 9305 /* Process crypto operation */ 9306 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 9307 ut_params->op); 9308 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 9309 9310 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9311 "crypto operation processing failed"); 9312 9313 /* Validate obuf */ 9314 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9315 rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *), 9316 catch_22_quote, 9317 QUOTE_512_BYTES, 9318 "Ciphertext data not as expected"); 9319 9320 return TEST_SUCCESS; 9321 } 9322 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 9323 0xab, 0xab, 0xab, 0xab, 9324 0xab, 0xab, 0xab, 0xab, 9325 0xab, 0xab, 0xab, 0xab}; 9326 static int 9327 test_null_auth_only_operation(void) 9328 { 9329 struct crypto_testsuite_params *ts_params = &testsuite_params; 9330 struct crypto_unittest_params *ut_params = &unittest_params; 9331 uint8_t *digest; 9332 9333 /* Verify the capabilities */ 9334 struct rte_cryptodev_sym_capability_idx cap_idx; 9335 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9336 cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL; 9337 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9338 &cap_idx) == NULL) 9339 return -ENOTSUP; 9340 9341 /* Generate test mbuf data and space for digest */ 9342 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 9343 catch_22_quote, QUOTE_512_BYTES, 0); 9344 9345 /* create a pointer for digest, but don't expect anything to be written 9346 * here in a NULL auth algo so no mbuf append done. 9347 */ 9348 digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 9349 QUOTE_512_BYTES); 9350 /* prefill the memory pointed to by digest */ 9351 memcpy(digest, orig_data, sizeof(orig_data)); 9352 9353 /* Setup HMAC Parameters */ 9354 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9355 ut_params->auth_xform.next = NULL; 9356 9357 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 9358 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 9359 9360 ut_params->sess = rte_cryptodev_sym_session_create( 9361 ts_params->session_mpool); 9362 9363 /* Create Crypto session*/ 9364 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9365 ut_params->sess, &ut_params->auth_xform, 9366 ts_params->session_priv_mpool); 9367 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9368 9369 /* Generate Crypto op data structure */ 9370 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9371 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9372 TEST_ASSERT_NOT_NULL(ut_params->op, 9373 "Failed to allocate symmetric crypto operation struct"); 9374 9375 /* Set crypto operation data parameters */ 9376 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9377 9378 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 9379 9380 sym_op->m_src = ut_params->ibuf; 9381 9382 sym_op->auth.data.offset = 0; 9383 sym_op->auth.data.length = QUOTE_512_BYTES; 9384 sym_op->auth.digest.data = digest; 9385 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf, 9386 QUOTE_512_BYTES); 9387 9388 /* Process crypto operation */ 9389 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 9390 ut_params->op); 9391 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 9392 9393 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9394 "crypto operation processing failed"); 9395 /* Make sure memory pointed to by digest hasn't been overwritten */ 9396 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9397 orig_data, 9398 digest, 9399 sizeof(orig_data), 9400 "Memory at digest ptr overwritten unexpectedly"); 9401 9402 return TEST_SUCCESS; 9403 } 9404 9405 9406 static int 9407 test_null_cipher_auth_operation(void) 9408 { 9409 struct crypto_testsuite_params *ts_params = &testsuite_params; 9410 struct crypto_unittest_params *ut_params = &unittest_params; 9411 uint8_t *digest; 9412 9413 /* Verify the capabilities */ 9414 struct rte_cryptodev_sym_capability_idx cap_idx; 9415 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9416 cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL; 9417 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9418 &cap_idx) == NULL) 9419 return -ENOTSUP; 9420 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9421 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL; 9422 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9423 &cap_idx) == NULL) 9424 return -ENOTSUP; 9425 9426 /* Generate test mbuf data and space for digest */ 9427 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 9428 catch_22_quote, QUOTE_512_BYTES, 0); 9429 9430 /* create a pointer for digest, but don't expect anything to be written 9431 * here in a NULL auth algo so no mbuf append done. 9432 */ 9433 digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 9434 QUOTE_512_BYTES); 9435 /* prefill the memory pointed to by digest */ 9436 memcpy(digest, orig_data, sizeof(orig_data)); 9437 9438 /* Setup Cipher Parameters */ 9439 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9440 ut_params->cipher_xform.next = &ut_params->auth_xform; 9441 9442 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 9443 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9444 9445 /* Setup HMAC Parameters */ 9446 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9447 ut_params->auth_xform.next = NULL; 9448 9449 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 9450 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 9451 9452 ut_params->sess = rte_cryptodev_sym_session_create( 9453 ts_params->session_mpool); 9454 9455 /* Create Crypto session*/ 9456 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9457 ut_params->sess, &ut_params->cipher_xform, 9458 ts_params->session_priv_mpool); 9459 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9460 9461 /* Generate Crypto op data structure */ 9462 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9463 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9464 TEST_ASSERT_NOT_NULL(ut_params->op, 9465 "Failed to allocate symmetric crypto operation struct"); 9466 9467 /* Set crypto operation data parameters */ 9468 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9469 9470 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 9471 9472 sym_op->m_src = ut_params->ibuf; 9473 9474 sym_op->cipher.data.offset = 0; 9475 sym_op->cipher.data.length = QUOTE_512_BYTES; 9476 9477 sym_op->auth.data.offset = 0; 9478 sym_op->auth.data.length = QUOTE_512_BYTES; 9479 sym_op->auth.digest.data = digest; 9480 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf, 9481 QUOTE_512_BYTES); 9482 9483 /* Process crypto operation */ 9484 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 9485 ut_params->op); 9486 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 9487 9488 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9489 "crypto operation processing failed"); 9490 9491 /* Validate obuf */ 9492 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9493 rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *), 9494 catch_22_quote, 9495 QUOTE_512_BYTES, 9496 "Ciphertext data not as expected"); 9497 /* Make sure memory pointed to by digest hasn't been overwritten */ 9498 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9499 orig_data, 9500 digest, 9501 sizeof(orig_data), 9502 "Memory at digest ptr overwritten unexpectedly"); 9503 9504 return TEST_SUCCESS; 9505 } 9506 9507 static int 9508 test_null_auth_cipher_operation(void) 9509 { 9510 struct crypto_testsuite_params *ts_params = &testsuite_params; 9511 struct crypto_unittest_params *ut_params = &unittest_params; 9512 uint8_t *digest; 9513 9514 /* Verify the capabilities */ 9515 struct rte_cryptodev_sym_capability_idx cap_idx; 9516 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9517 cap_idx.algo.auth = RTE_CRYPTO_AUTH_NULL; 9518 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9519 &cap_idx) == NULL) 9520 return -ENOTSUP; 9521 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9522 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_NULL; 9523 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9524 &cap_idx) == NULL) 9525 return -ENOTSUP; 9526 9527 /* Generate test mbuf data */ 9528 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 9529 catch_22_quote, QUOTE_512_BYTES, 0); 9530 9531 /* create a pointer for digest, but don't expect anything to be written 9532 * here in a NULL auth algo so no mbuf append done. 9533 */ 9534 digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 9535 QUOTE_512_BYTES); 9536 /* prefill the memory pointed to by digest */ 9537 memcpy(digest, orig_data, sizeof(orig_data)); 9538 9539 /* Setup Cipher Parameters */ 9540 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9541 ut_params->cipher_xform.next = NULL; 9542 9543 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 9544 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9545 9546 /* Setup HMAC Parameters */ 9547 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9548 ut_params->auth_xform.next = &ut_params->cipher_xform; 9549 9550 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 9551 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 9552 9553 ut_params->sess = rte_cryptodev_sym_session_create( 9554 ts_params->session_mpool); 9555 9556 /* Create Crypto session*/ 9557 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9558 ut_params->sess, &ut_params->cipher_xform, 9559 ts_params->session_priv_mpool); 9560 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9561 9562 /* Generate Crypto op data structure */ 9563 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9564 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9565 TEST_ASSERT_NOT_NULL(ut_params->op, 9566 "Failed to allocate symmetric crypto operation struct"); 9567 9568 /* Set crypto operation data parameters */ 9569 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9570 9571 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 9572 9573 sym_op->m_src = ut_params->ibuf; 9574 9575 sym_op->cipher.data.offset = 0; 9576 sym_op->cipher.data.length = QUOTE_512_BYTES; 9577 9578 sym_op->auth.data.offset = 0; 9579 sym_op->auth.data.length = QUOTE_512_BYTES; 9580 sym_op->auth.digest.data = digest; 9581 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf, 9582 QUOTE_512_BYTES); 9583 9584 /* Process crypto operation */ 9585 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 9586 ut_params->op); 9587 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 9588 9589 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9590 "crypto operation processing failed"); 9591 9592 /* Validate obuf */ 9593 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9594 rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *), 9595 catch_22_quote, 9596 QUOTE_512_BYTES, 9597 "Ciphertext data not as expected"); 9598 /* Make sure memory pointed to by digest hasn't been overwritten */ 9599 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9600 orig_data, 9601 digest, 9602 sizeof(orig_data), 9603 "Memory at digest ptr overwritten unexpectedly"); 9604 9605 return TEST_SUCCESS; 9606 } 9607 9608 9609 static int 9610 test_null_invalid_operation(void) 9611 { 9612 struct crypto_testsuite_params *ts_params = &testsuite_params; 9613 struct crypto_unittest_params *ut_params = &unittest_params; 9614 int ret; 9615 9616 /* This test is for NULL PMD only */ 9617 if (gbl_driver_id != rte_cryptodev_driver_id_get( 9618 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 9619 return -ENOTSUP; 9620 9621 /* Setup Cipher Parameters */ 9622 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9623 ut_params->cipher_xform.next = NULL; 9624 9625 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 9626 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9627 9628 ut_params->sess = rte_cryptodev_sym_session_create( 9629 ts_params->session_mpool); 9630 9631 /* Create Crypto session*/ 9632 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9633 ut_params->sess, &ut_params->cipher_xform, 9634 ts_params->session_priv_mpool); 9635 TEST_ASSERT(ret < 0, 9636 "Session creation succeeded unexpectedly"); 9637 9638 9639 /* Setup HMAC Parameters */ 9640 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9641 ut_params->auth_xform.next = NULL; 9642 9643 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 9644 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 9645 9646 ut_params->sess = rte_cryptodev_sym_session_create( 9647 ts_params->session_mpool); 9648 9649 /* Create Crypto session*/ 9650 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9651 ut_params->sess, &ut_params->auth_xform, 9652 ts_params->session_priv_mpool); 9653 TEST_ASSERT(ret < 0, 9654 "Session creation succeeded unexpectedly"); 9655 9656 return TEST_SUCCESS; 9657 } 9658 9659 9660 #define NULL_BURST_LENGTH (32) 9661 9662 static int 9663 test_null_burst_operation(void) 9664 { 9665 struct crypto_testsuite_params *ts_params = &testsuite_params; 9666 struct crypto_unittest_params *ut_params = &unittest_params; 9667 9668 unsigned i, burst_len = NULL_BURST_LENGTH; 9669 9670 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 9671 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 9672 9673 /* This test is for NULL PMD only */ 9674 if (gbl_driver_id != rte_cryptodev_driver_id_get( 9675 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 9676 return -ENOTSUP; 9677 9678 /* Setup Cipher Parameters */ 9679 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9680 ut_params->cipher_xform.next = &ut_params->auth_xform; 9681 9682 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 9683 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9684 9685 /* Setup HMAC Parameters */ 9686 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9687 ut_params->auth_xform.next = NULL; 9688 9689 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 9690 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 9691 9692 ut_params->sess = rte_cryptodev_sym_session_create( 9693 ts_params->session_mpool); 9694 9695 /* Create Crypto session*/ 9696 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 9697 ut_params->sess, &ut_params->cipher_xform, 9698 ts_params->session_priv_mpool); 9699 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9700 9701 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 9702 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 9703 burst_len, "failed to generate burst of crypto ops"); 9704 9705 /* Generate an operation for each mbuf in burst */ 9706 for (i = 0; i < burst_len; i++) { 9707 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9708 9709 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 9710 9711 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 9712 sizeof(unsigned)); 9713 *data = i; 9714 9715 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 9716 9717 burst[i]->sym->m_src = m; 9718 } 9719 9720 /* Process crypto operation */ 9721 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 9722 0, burst, burst_len), 9723 burst_len, 9724 "Error enqueuing burst"); 9725 9726 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 9727 0, burst_dequeued, burst_len), 9728 burst_len, 9729 "Error dequeuing burst"); 9730 9731 9732 for (i = 0; i < burst_len; i++) { 9733 TEST_ASSERT_EQUAL( 9734 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 9735 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 9736 uint32_t *), 9737 "data not as expected"); 9738 9739 rte_pktmbuf_free(burst[i]->sym->m_src); 9740 rte_crypto_op_free(burst[i]); 9741 } 9742 9743 return TEST_SUCCESS; 9744 } 9745 9746 static void 9747 generate_gmac_large_plaintext(uint8_t *data) 9748 { 9749 uint16_t i; 9750 9751 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 9752 memcpy(&data[i], &data[0], 32); 9753 } 9754 9755 static int 9756 create_gmac_operation(enum rte_crypto_auth_operation op, 9757 const struct gmac_test_data *tdata) 9758 { 9759 struct crypto_testsuite_params *ts_params = &testsuite_params; 9760 struct crypto_unittest_params *ut_params = &unittest_params; 9761 struct rte_crypto_sym_op *sym_op; 9762 9763 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9764 9765 /* Generate Crypto op data structure */ 9766 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9767 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9768 TEST_ASSERT_NOT_NULL(ut_params->op, 9769 "Failed to allocate symmetric crypto operation struct"); 9770 9771 sym_op = ut_params->op->sym; 9772 9773 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 9774 ut_params->ibuf, tdata->gmac_tag.len); 9775 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 9776 "no room to append digest"); 9777 9778 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 9779 ut_params->ibuf, plaintext_pad_len); 9780 9781 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 9782 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 9783 tdata->gmac_tag.len); 9784 debug_hexdump(stdout, "digest:", 9785 sym_op->auth.digest.data, 9786 tdata->gmac_tag.len); 9787 } 9788 9789 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 9790 uint8_t *, IV_OFFSET); 9791 9792 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 9793 9794 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 9795 9796 sym_op->cipher.data.length = 0; 9797 sym_op->cipher.data.offset = 0; 9798 9799 sym_op->auth.data.offset = 0; 9800 sym_op->auth.data.length = tdata->plaintext.len; 9801 9802 return 0; 9803 } 9804 9805 static int create_gmac_session(uint8_t dev_id, 9806 const struct gmac_test_data *tdata, 9807 enum rte_crypto_auth_operation auth_op) 9808 { 9809 uint8_t auth_key[tdata->key.len]; 9810 9811 struct crypto_testsuite_params *ts_params = &testsuite_params; 9812 struct crypto_unittest_params *ut_params = &unittest_params; 9813 9814 memcpy(auth_key, tdata->key.data, tdata->key.len); 9815 9816 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9817 ut_params->auth_xform.next = NULL; 9818 9819 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 9820 ut_params->auth_xform.auth.op = auth_op; 9821 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 9822 ut_params->auth_xform.auth.key.length = tdata->key.len; 9823 ut_params->auth_xform.auth.key.data = auth_key; 9824 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 9825 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 9826 9827 9828 ut_params->sess = rte_cryptodev_sym_session_create( 9829 ts_params->session_mpool); 9830 9831 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 9832 &ut_params->auth_xform, 9833 ts_params->session_priv_mpool); 9834 9835 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 9836 9837 return 0; 9838 } 9839 9840 static int 9841 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 9842 { 9843 struct crypto_testsuite_params *ts_params = &testsuite_params; 9844 struct crypto_unittest_params *ut_params = &unittest_params; 9845 9846 int retval; 9847 9848 uint8_t *auth_tag, *plaintext; 9849 uint16_t plaintext_pad_len; 9850 9851 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 9852 "No GMAC length in the source data"); 9853 9854 /* Verify the capabilities */ 9855 struct rte_cryptodev_sym_capability_idx cap_idx; 9856 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9857 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 9858 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9859 &cap_idx) == NULL) 9860 return -ENOTSUP; 9861 9862 retval = create_gmac_session(ts_params->valid_devs[0], 9863 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 9864 9865 if (retval < 0) 9866 return retval; 9867 9868 if (tdata->plaintext.len > MBUF_SIZE) 9869 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 9870 else 9871 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9872 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 9873 "Failed to allocate input buffer in mempool"); 9874 9875 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9876 rte_pktmbuf_tailroom(ut_params->ibuf)); 9877 9878 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9879 /* 9880 * Runtime generate the large plain text instead of use hard code 9881 * plain text vector. It is done to avoid create huge source file 9882 * with the test vector. 9883 */ 9884 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 9885 generate_gmac_large_plaintext(tdata->plaintext.data); 9886 9887 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9888 plaintext_pad_len); 9889 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 9890 9891 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 9892 debug_hexdump(stdout, "plaintext:", plaintext, 9893 tdata->plaintext.len); 9894 9895 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 9896 tdata); 9897 9898 if (retval < 0) 9899 return retval; 9900 9901 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9902 9903 ut_params->op->sym->m_src = ut_params->ibuf; 9904 9905 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9906 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 9907 ut_params->op); 9908 else 9909 TEST_ASSERT_NOT_NULL( 9910 process_crypto_request(ts_params->valid_devs[0], 9911 ut_params->op), "failed to process sym crypto op"); 9912 9913 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9914 "crypto op processing failed"); 9915 9916 if (ut_params->op->sym->m_dst) { 9917 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 9918 uint8_t *, plaintext_pad_len); 9919 } else { 9920 auth_tag = plaintext + plaintext_pad_len; 9921 } 9922 9923 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 9924 9925 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9926 auth_tag, 9927 tdata->gmac_tag.data, 9928 tdata->gmac_tag.len, 9929 "GMAC Generated auth tag not as expected"); 9930 9931 return 0; 9932 } 9933 9934 static int 9935 test_AES_GMAC_authentication_test_case_1(void) 9936 { 9937 return test_AES_GMAC_authentication(&gmac_test_case_1); 9938 } 9939 9940 static int 9941 test_AES_GMAC_authentication_test_case_2(void) 9942 { 9943 return test_AES_GMAC_authentication(&gmac_test_case_2); 9944 } 9945 9946 static int 9947 test_AES_GMAC_authentication_test_case_3(void) 9948 { 9949 return test_AES_GMAC_authentication(&gmac_test_case_3); 9950 } 9951 9952 static int 9953 test_AES_GMAC_authentication_test_case_4(void) 9954 { 9955 return test_AES_GMAC_authentication(&gmac_test_case_4); 9956 } 9957 9958 static int 9959 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 9960 { 9961 struct crypto_testsuite_params *ts_params = &testsuite_params; 9962 struct crypto_unittest_params *ut_params = &unittest_params; 9963 int retval; 9964 uint32_t plaintext_pad_len; 9965 uint8_t *plaintext; 9966 9967 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 9968 "No GMAC length in the source data"); 9969 9970 /* Verify the capabilities */ 9971 struct rte_cryptodev_sym_capability_idx cap_idx; 9972 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 9973 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 9974 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9975 &cap_idx) == NULL) 9976 return -ENOTSUP; 9977 9978 retval = create_gmac_session(ts_params->valid_devs[0], 9979 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 9980 9981 if (retval < 0) 9982 return retval; 9983 9984 if (tdata->plaintext.len > MBUF_SIZE) 9985 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 9986 else 9987 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9988 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 9989 "Failed to allocate input buffer in mempool"); 9990 9991 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9992 rte_pktmbuf_tailroom(ut_params->ibuf)); 9993 9994 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9995 9996 /* 9997 * Runtime generate the large plain text instead of use hard code 9998 * plain text vector. It is done to avoid create huge source file 9999 * with the test vector. 10000 */ 10001 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 10002 generate_gmac_large_plaintext(tdata->plaintext.data); 10003 10004 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10005 plaintext_pad_len); 10006 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 10007 10008 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 10009 debug_hexdump(stdout, "plaintext:", plaintext, 10010 tdata->plaintext.len); 10011 10012 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 10013 tdata); 10014 10015 if (retval < 0) 10016 return retval; 10017 10018 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10019 10020 ut_params->op->sym->m_src = ut_params->ibuf; 10021 10022 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10023 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10024 ut_params->op); 10025 else 10026 TEST_ASSERT_NOT_NULL( 10027 process_crypto_request(ts_params->valid_devs[0], 10028 ut_params->op), "failed to process sym crypto op"); 10029 10030 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10031 "crypto op processing failed"); 10032 10033 return 0; 10034 10035 } 10036 10037 static int 10038 test_AES_GMAC_authentication_verify_test_case_1(void) 10039 { 10040 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 10041 } 10042 10043 static int 10044 test_AES_GMAC_authentication_verify_test_case_2(void) 10045 { 10046 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 10047 } 10048 10049 static int 10050 test_AES_GMAC_authentication_verify_test_case_3(void) 10051 { 10052 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 10053 } 10054 10055 static int 10056 test_AES_GMAC_authentication_verify_test_case_4(void) 10057 { 10058 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 10059 } 10060 10061 struct test_crypto_vector { 10062 enum rte_crypto_cipher_algorithm crypto_algo; 10063 unsigned int cipher_offset; 10064 unsigned int cipher_len; 10065 10066 struct { 10067 uint8_t data[64]; 10068 unsigned int len; 10069 } cipher_key; 10070 10071 struct { 10072 uint8_t data[64]; 10073 unsigned int len; 10074 } iv; 10075 10076 struct { 10077 const uint8_t *data; 10078 unsigned int len; 10079 } plaintext; 10080 10081 struct { 10082 const uint8_t *data; 10083 unsigned int len; 10084 } ciphertext; 10085 10086 enum rte_crypto_auth_algorithm auth_algo; 10087 unsigned int auth_offset; 10088 10089 struct { 10090 uint8_t data[128]; 10091 unsigned int len; 10092 } auth_key; 10093 10094 struct { 10095 const uint8_t *data; 10096 unsigned int len; 10097 } aad; 10098 10099 struct { 10100 uint8_t data[128]; 10101 unsigned int len; 10102 } digest; 10103 }; 10104 10105 static const struct test_crypto_vector 10106 hmac_sha1_test_crypto_vector = { 10107 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 10108 .plaintext = { 10109 .data = plaintext_hash, 10110 .len = 512 10111 }, 10112 .auth_key = { 10113 .data = { 10114 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 10115 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 10116 0xDE, 0xF4, 0xDE, 0xAD 10117 }, 10118 .len = 20 10119 }, 10120 .digest = { 10121 .data = { 10122 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 10123 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 10124 0x3F, 0x91, 0x64, 0x59 10125 }, 10126 .len = 20 10127 } 10128 }; 10129 10130 static const struct test_crypto_vector 10131 aes128_gmac_test_vector = { 10132 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 10133 .plaintext = { 10134 .data = plaintext_hash, 10135 .len = 512 10136 }, 10137 .iv = { 10138 .data = { 10139 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 10140 0x08, 0x09, 0x0A, 0x0B 10141 }, 10142 .len = 12 10143 }, 10144 .auth_key = { 10145 .data = { 10146 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 10147 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 10148 }, 10149 .len = 16 10150 }, 10151 .digest = { 10152 .data = { 10153 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 10154 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 10155 }, 10156 .len = 16 10157 } 10158 }; 10159 10160 static const struct test_crypto_vector 10161 aes128cbc_hmac_sha1_test_vector = { 10162 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 10163 .cipher_offset = 0, 10164 .cipher_len = 512, 10165 .cipher_key = { 10166 .data = { 10167 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 10168 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 10169 }, 10170 .len = 16 10171 }, 10172 .iv = { 10173 .data = { 10174 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 10175 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 10176 }, 10177 .len = 16 10178 }, 10179 .plaintext = { 10180 .data = plaintext_hash, 10181 .len = 512 10182 }, 10183 .ciphertext = { 10184 .data = ciphertext512_aes128cbc, 10185 .len = 512 10186 }, 10187 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 10188 .auth_offset = 0, 10189 .auth_key = { 10190 .data = { 10191 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 10192 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 10193 0xDE, 0xF4, 0xDE, 0xAD 10194 }, 10195 .len = 20 10196 }, 10197 .digest = { 10198 .data = { 10199 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 10200 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 10201 0x18, 0x8C, 0x1D, 0x32 10202 }, 10203 .len = 20 10204 } 10205 }; 10206 10207 static const struct test_crypto_vector 10208 aes128cbc_hmac_sha1_aad_test_vector = { 10209 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 10210 .cipher_offset = 12, 10211 .cipher_len = 496, 10212 .cipher_key = { 10213 .data = { 10214 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 10215 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 10216 }, 10217 .len = 16 10218 }, 10219 .iv = { 10220 .data = { 10221 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 10222 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 10223 }, 10224 .len = 16 10225 }, 10226 .plaintext = { 10227 .data = plaintext_hash, 10228 .len = 512 10229 }, 10230 .ciphertext = { 10231 .data = ciphertext512_aes128cbc_aad, 10232 .len = 512 10233 }, 10234 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 10235 .auth_offset = 0, 10236 .auth_key = { 10237 .data = { 10238 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 10239 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 10240 0xDE, 0xF4, 0xDE, 0xAD 10241 }, 10242 .len = 20 10243 }, 10244 .digest = { 10245 .data = { 10246 0x1F, 0x6A, 0xD2, 0x8B, 0x4B, 0xB3, 0xC0, 0x9E, 10247 0x86, 0x9B, 0x3A, 0xF2, 0x00, 0x5B, 0x4F, 0x08, 10248 0x62, 0x8D, 0x62, 0x65 10249 }, 10250 .len = 20 10251 } 10252 }; 10253 10254 static void 10255 data_corruption(uint8_t *data) 10256 { 10257 data[0] += 1; 10258 } 10259 10260 static void 10261 tag_corruption(uint8_t *data, unsigned int tag_offset) 10262 { 10263 data[tag_offset] += 1; 10264 } 10265 10266 static int 10267 create_auth_session(struct crypto_unittest_params *ut_params, 10268 uint8_t dev_id, 10269 const struct test_crypto_vector *reference, 10270 enum rte_crypto_auth_operation auth_op) 10271 { 10272 struct crypto_testsuite_params *ts_params = &testsuite_params; 10273 uint8_t auth_key[reference->auth_key.len + 1]; 10274 10275 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 10276 10277 /* Setup Authentication Parameters */ 10278 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10279 ut_params->auth_xform.auth.op = auth_op; 10280 ut_params->auth_xform.next = NULL; 10281 ut_params->auth_xform.auth.algo = reference->auth_algo; 10282 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 10283 ut_params->auth_xform.auth.key.data = auth_key; 10284 ut_params->auth_xform.auth.digest_length = reference->digest.len; 10285 10286 /* Create Crypto session*/ 10287 ut_params->sess = rte_cryptodev_sym_session_create( 10288 ts_params->session_mpool); 10289 10290 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 10291 &ut_params->auth_xform, 10292 ts_params->session_priv_mpool); 10293 10294 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10295 10296 return 0; 10297 } 10298 10299 static int 10300 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 10301 uint8_t dev_id, 10302 const struct test_crypto_vector *reference, 10303 enum rte_crypto_auth_operation auth_op, 10304 enum rte_crypto_cipher_operation cipher_op) 10305 { 10306 struct crypto_testsuite_params *ts_params = &testsuite_params; 10307 uint8_t cipher_key[reference->cipher_key.len + 1]; 10308 uint8_t auth_key[reference->auth_key.len + 1]; 10309 10310 memcpy(cipher_key, reference->cipher_key.data, 10311 reference->cipher_key.len); 10312 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 10313 10314 /* Setup Authentication Parameters */ 10315 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10316 ut_params->auth_xform.auth.op = auth_op; 10317 ut_params->auth_xform.auth.algo = reference->auth_algo; 10318 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 10319 ut_params->auth_xform.auth.key.data = auth_key; 10320 ut_params->auth_xform.auth.digest_length = reference->digest.len; 10321 10322 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 10323 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 10324 ut_params->auth_xform.auth.iv.length = reference->iv.len; 10325 } else { 10326 ut_params->auth_xform.next = &ut_params->cipher_xform; 10327 10328 /* Setup Cipher Parameters */ 10329 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10330 ut_params->cipher_xform.next = NULL; 10331 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 10332 ut_params->cipher_xform.cipher.op = cipher_op; 10333 ut_params->cipher_xform.cipher.key.data = cipher_key; 10334 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 10335 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10336 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 10337 } 10338 10339 /* Create Crypto session*/ 10340 ut_params->sess = rte_cryptodev_sym_session_create( 10341 ts_params->session_mpool); 10342 10343 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 10344 &ut_params->auth_xform, 10345 ts_params->session_priv_mpool); 10346 10347 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10348 10349 return 0; 10350 } 10351 10352 static int 10353 create_auth_operation(struct crypto_testsuite_params *ts_params, 10354 struct crypto_unittest_params *ut_params, 10355 const struct test_crypto_vector *reference, 10356 unsigned int auth_generate) 10357 { 10358 /* Generate Crypto op data structure */ 10359 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10360 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10361 TEST_ASSERT_NOT_NULL(ut_params->op, 10362 "Failed to allocate pktmbuf offload"); 10363 10364 /* Set crypto operation data parameters */ 10365 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10366 10367 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10368 10369 /* set crypto operation source mbuf */ 10370 sym_op->m_src = ut_params->ibuf; 10371 10372 /* digest */ 10373 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10374 ut_params->ibuf, reference->digest.len); 10375 10376 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10377 "no room to append auth tag"); 10378 10379 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10380 ut_params->ibuf, reference->plaintext.len); 10381 10382 if (auth_generate) 10383 memset(sym_op->auth.digest.data, 0, reference->digest.len); 10384 else 10385 memcpy(sym_op->auth.digest.data, 10386 reference->digest.data, 10387 reference->digest.len); 10388 10389 debug_hexdump(stdout, "digest:", 10390 sym_op->auth.digest.data, 10391 reference->digest.len); 10392 10393 sym_op->auth.data.length = reference->plaintext.len; 10394 sym_op->auth.data.offset = 0; 10395 10396 return 0; 10397 } 10398 10399 static int 10400 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 10401 struct crypto_unittest_params *ut_params, 10402 const struct test_crypto_vector *reference, 10403 unsigned int auth_generate) 10404 { 10405 /* Generate Crypto op data structure */ 10406 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10407 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10408 TEST_ASSERT_NOT_NULL(ut_params->op, 10409 "Failed to allocate pktmbuf offload"); 10410 10411 /* Set crypto operation data parameters */ 10412 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10413 10414 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10415 10416 /* set crypto operation source mbuf */ 10417 sym_op->m_src = ut_params->ibuf; 10418 10419 /* digest */ 10420 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10421 ut_params->ibuf, reference->digest.len); 10422 10423 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10424 "no room to append auth tag"); 10425 10426 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10427 ut_params->ibuf, reference->ciphertext.len); 10428 10429 if (auth_generate) 10430 memset(sym_op->auth.digest.data, 0, reference->digest.len); 10431 else 10432 memcpy(sym_op->auth.digest.data, 10433 reference->digest.data, 10434 reference->digest.len); 10435 10436 debug_hexdump(stdout, "digest:", 10437 sym_op->auth.digest.data, 10438 reference->digest.len); 10439 10440 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 10441 reference->iv.data, reference->iv.len); 10442 10443 sym_op->cipher.data.length = 0; 10444 sym_op->cipher.data.offset = 0; 10445 10446 sym_op->auth.data.length = reference->plaintext.len; 10447 sym_op->auth.data.offset = 0; 10448 10449 return 0; 10450 } 10451 10452 static int 10453 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 10454 struct crypto_unittest_params *ut_params, 10455 const struct test_crypto_vector *reference, 10456 unsigned int auth_generate) 10457 { 10458 /* Generate Crypto op data structure */ 10459 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10460 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10461 TEST_ASSERT_NOT_NULL(ut_params->op, 10462 "Failed to allocate pktmbuf offload"); 10463 10464 /* Set crypto operation data parameters */ 10465 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10466 10467 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10468 10469 /* set crypto operation source mbuf */ 10470 sym_op->m_src = ut_params->ibuf; 10471 10472 /* digest */ 10473 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10474 ut_params->ibuf, reference->digest.len); 10475 10476 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10477 "no room to append auth tag"); 10478 10479 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10480 ut_params->ibuf, reference->ciphertext.len); 10481 10482 if (auth_generate) 10483 memset(sym_op->auth.digest.data, 0, reference->digest.len); 10484 else 10485 memcpy(sym_op->auth.digest.data, 10486 reference->digest.data, 10487 reference->digest.len); 10488 10489 debug_hexdump(stdout, "digest:", 10490 sym_op->auth.digest.data, 10491 reference->digest.len); 10492 10493 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 10494 reference->iv.data, reference->iv.len); 10495 10496 sym_op->cipher.data.length = reference->cipher_len; 10497 sym_op->cipher.data.offset = reference->cipher_offset; 10498 10499 sym_op->auth.data.length = reference->plaintext.len; 10500 sym_op->auth.data.offset = reference->auth_offset; 10501 10502 return 0; 10503 } 10504 10505 static int 10506 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 10507 struct crypto_unittest_params *ut_params, 10508 const struct test_crypto_vector *reference) 10509 { 10510 return create_auth_operation(ts_params, ut_params, reference, 0); 10511 } 10512 10513 static int 10514 create_auth_verify_GMAC_operation( 10515 struct crypto_testsuite_params *ts_params, 10516 struct crypto_unittest_params *ut_params, 10517 const struct test_crypto_vector *reference) 10518 { 10519 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 10520 } 10521 10522 static int 10523 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 10524 struct crypto_unittest_params *ut_params, 10525 const struct test_crypto_vector *reference) 10526 { 10527 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 10528 } 10529 10530 static int 10531 test_authentication_verify_fail_when_data_corruption( 10532 struct crypto_testsuite_params *ts_params, 10533 struct crypto_unittest_params *ut_params, 10534 const struct test_crypto_vector *reference, 10535 unsigned int data_corrupted) 10536 { 10537 int retval; 10538 10539 uint8_t *plaintext; 10540 10541 /* Verify the capabilities */ 10542 struct rte_cryptodev_sym_capability_idx cap_idx; 10543 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10544 cap_idx.algo.auth = reference->auth_algo; 10545 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10546 &cap_idx) == NULL) 10547 return -ENOTSUP; 10548 10549 /* Create session */ 10550 retval = create_auth_session(ut_params, 10551 ts_params->valid_devs[0], 10552 reference, 10553 RTE_CRYPTO_AUTH_OP_VERIFY); 10554 if (retval < 0) 10555 return retval; 10556 10557 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10558 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10559 "Failed to allocate input buffer in mempool"); 10560 10561 /* clear mbuf payload */ 10562 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10563 rte_pktmbuf_tailroom(ut_params->ibuf)); 10564 10565 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10566 reference->plaintext.len); 10567 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 10568 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 10569 10570 debug_hexdump(stdout, "plaintext:", plaintext, 10571 reference->plaintext.len); 10572 10573 /* Create operation */ 10574 retval = create_auth_verify_operation(ts_params, ut_params, reference); 10575 10576 if (retval < 0) 10577 return retval; 10578 10579 if (data_corrupted) 10580 data_corruption(plaintext); 10581 else 10582 tag_corruption(plaintext, reference->plaintext.len); 10583 10584 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 10585 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10586 ut_params->op); 10587 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 10588 RTE_CRYPTO_OP_STATUS_SUCCESS, 10589 "authentication not failed"); 10590 } else { 10591 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 10592 ut_params->op); 10593 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 10594 } 10595 10596 return 0; 10597 } 10598 10599 static int 10600 test_authentication_verify_GMAC_fail_when_corruption( 10601 struct crypto_testsuite_params *ts_params, 10602 struct crypto_unittest_params *ut_params, 10603 const struct test_crypto_vector *reference, 10604 unsigned int data_corrupted) 10605 { 10606 int retval; 10607 uint8_t *plaintext; 10608 10609 /* Verify the capabilities */ 10610 struct rte_cryptodev_sym_capability_idx cap_idx; 10611 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10612 cap_idx.algo.auth = reference->auth_algo; 10613 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10614 &cap_idx) == NULL) 10615 return -ENOTSUP; 10616 10617 /* Create session */ 10618 retval = create_auth_cipher_session(ut_params, 10619 ts_params->valid_devs[0], 10620 reference, 10621 RTE_CRYPTO_AUTH_OP_VERIFY, 10622 RTE_CRYPTO_CIPHER_OP_DECRYPT); 10623 if (retval < 0) 10624 return retval; 10625 10626 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10627 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10628 "Failed to allocate input buffer in mempool"); 10629 10630 /* clear mbuf payload */ 10631 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10632 rte_pktmbuf_tailroom(ut_params->ibuf)); 10633 10634 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10635 reference->plaintext.len); 10636 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 10637 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 10638 10639 debug_hexdump(stdout, "plaintext:", plaintext, 10640 reference->plaintext.len); 10641 10642 /* Create operation */ 10643 retval = create_auth_verify_GMAC_operation(ts_params, 10644 ut_params, 10645 reference); 10646 10647 if (retval < 0) 10648 return retval; 10649 10650 if (data_corrupted) 10651 data_corruption(plaintext); 10652 else 10653 tag_corruption(plaintext, reference->aad.len); 10654 10655 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 10656 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10657 ut_params->op); 10658 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 10659 RTE_CRYPTO_OP_STATUS_SUCCESS, 10660 "authentication not failed"); 10661 } else { 10662 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 10663 ut_params->op); 10664 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 10665 } 10666 10667 return 0; 10668 } 10669 10670 static int 10671 test_authenticated_decryption_fail_when_corruption( 10672 struct crypto_testsuite_params *ts_params, 10673 struct crypto_unittest_params *ut_params, 10674 const struct test_crypto_vector *reference, 10675 unsigned int data_corrupted) 10676 { 10677 int retval; 10678 10679 uint8_t *ciphertext; 10680 10681 /* Verify the capabilities */ 10682 struct rte_cryptodev_sym_capability_idx cap_idx; 10683 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10684 cap_idx.algo.auth = reference->auth_algo; 10685 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10686 &cap_idx) == NULL) 10687 return -ENOTSUP; 10688 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10689 cap_idx.algo.cipher = reference->crypto_algo; 10690 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10691 &cap_idx) == NULL) 10692 return -ENOTSUP; 10693 10694 /* Create session */ 10695 retval = create_auth_cipher_session(ut_params, 10696 ts_params->valid_devs[0], 10697 reference, 10698 RTE_CRYPTO_AUTH_OP_VERIFY, 10699 RTE_CRYPTO_CIPHER_OP_DECRYPT); 10700 if (retval < 0) 10701 return retval; 10702 10703 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10704 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10705 "Failed to allocate input buffer in mempool"); 10706 10707 /* clear mbuf payload */ 10708 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10709 rte_pktmbuf_tailroom(ut_params->ibuf)); 10710 10711 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10712 reference->ciphertext.len); 10713 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 10714 memcpy(ciphertext, reference->ciphertext.data, 10715 reference->ciphertext.len); 10716 10717 /* Create operation */ 10718 retval = create_cipher_auth_verify_operation(ts_params, 10719 ut_params, 10720 reference); 10721 10722 if (retval < 0) 10723 return retval; 10724 10725 if (data_corrupted) 10726 data_corruption(ciphertext); 10727 else 10728 tag_corruption(ciphertext, reference->ciphertext.len); 10729 10730 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 10731 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10732 ut_params->op); 10733 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 10734 RTE_CRYPTO_OP_STATUS_SUCCESS, 10735 "authentication not failed"); 10736 } else { 10737 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 10738 ut_params->op); 10739 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 10740 } 10741 10742 return 0; 10743 } 10744 10745 static int 10746 test_authenticated_encryt_with_esn( 10747 struct crypto_testsuite_params *ts_params, 10748 struct crypto_unittest_params *ut_params, 10749 const struct test_crypto_vector *reference) 10750 { 10751 int retval; 10752 10753 uint8_t *authciphertext, *plaintext, *auth_tag; 10754 uint16_t plaintext_pad_len; 10755 uint8_t cipher_key[reference->cipher_key.len + 1]; 10756 uint8_t auth_key[reference->auth_key.len + 1]; 10757 10758 /* Verify the capabilities */ 10759 struct rte_cryptodev_sym_capability_idx cap_idx; 10760 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10761 cap_idx.algo.auth = reference->auth_algo; 10762 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10763 &cap_idx) == NULL) 10764 return -ENOTSUP; 10765 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10766 cap_idx.algo.cipher = reference->crypto_algo; 10767 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10768 &cap_idx) == NULL) 10769 return -ENOTSUP; 10770 10771 /* Create session */ 10772 memcpy(cipher_key, reference->cipher_key.data, 10773 reference->cipher_key.len); 10774 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 10775 10776 /* Setup Cipher Parameters */ 10777 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10778 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 10779 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10780 ut_params->cipher_xform.cipher.key.data = cipher_key; 10781 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 10782 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10783 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 10784 10785 ut_params->cipher_xform.next = &ut_params->auth_xform; 10786 10787 /* Setup Authentication Parameters */ 10788 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10789 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 10790 ut_params->auth_xform.auth.algo = reference->auth_algo; 10791 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 10792 ut_params->auth_xform.auth.key.data = auth_key; 10793 ut_params->auth_xform.auth.digest_length = reference->digest.len; 10794 ut_params->auth_xform.next = NULL; 10795 10796 /* Create Crypto session*/ 10797 ut_params->sess = rte_cryptodev_sym_session_create( 10798 ts_params->session_mpool); 10799 10800 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10801 ut_params->sess, 10802 &ut_params->cipher_xform, 10803 ts_params->session_priv_mpool); 10804 10805 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10806 10807 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10808 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10809 "Failed to allocate input buffer in mempool"); 10810 10811 /* clear mbuf payload */ 10812 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10813 rte_pktmbuf_tailroom(ut_params->ibuf)); 10814 10815 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10816 reference->plaintext.len); 10817 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 10818 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 10819 10820 /* Create operation */ 10821 retval = create_cipher_auth_operation(ts_params, 10822 ut_params, 10823 reference, 0); 10824 10825 if (retval < 0) 10826 return retval; 10827 10828 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10829 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10830 ut_params->op); 10831 else 10832 ut_params->op = process_crypto_request( 10833 ts_params->valid_devs[0], ut_params->op); 10834 10835 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 10836 10837 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10838 "crypto op processing failed"); 10839 10840 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 10841 10842 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10843 ut_params->op->sym->auth.data.offset); 10844 auth_tag = authciphertext + plaintext_pad_len; 10845 debug_hexdump(stdout, "ciphertext:", authciphertext, 10846 reference->ciphertext.len); 10847 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 10848 10849 /* Validate obuf */ 10850 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10851 authciphertext, 10852 reference->ciphertext.data, 10853 reference->ciphertext.len, 10854 "Ciphertext data not as expected"); 10855 10856 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10857 auth_tag, 10858 reference->digest.data, 10859 reference->digest.len, 10860 "Generated digest not as expected"); 10861 10862 return TEST_SUCCESS; 10863 10864 } 10865 10866 static int 10867 test_authenticated_decrypt_with_esn( 10868 struct crypto_testsuite_params *ts_params, 10869 struct crypto_unittest_params *ut_params, 10870 const struct test_crypto_vector *reference) 10871 { 10872 int retval; 10873 10874 uint8_t *ciphertext; 10875 uint8_t cipher_key[reference->cipher_key.len + 1]; 10876 uint8_t auth_key[reference->auth_key.len + 1]; 10877 10878 /* Verify the capabilities */ 10879 struct rte_cryptodev_sym_capability_idx cap_idx; 10880 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10881 cap_idx.algo.auth = reference->auth_algo; 10882 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10883 &cap_idx) == NULL) 10884 return -ENOTSUP; 10885 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10886 cap_idx.algo.cipher = reference->crypto_algo; 10887 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10888 &cap_idx) == NULL) 10889 return -ENOTSUP; 10890 10891 /* Create session */ 10892 memcpy(cipher_key, reference->cipher_key.data, 10893 reference->cipher_key.len); 10894 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 10895 10896 /* Setup Authentication Parameters */ 10897 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10898 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 10899 ut_params->auth_xform.auth.algo = reference->auth_algo; 10900 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 10901 ut_params->auth_xform.auth.key.data = auth_key; 10902 ut_params->auth_xform.auth.digest_length = reference->digest.len; 10903 ut_params->auth_xform.next = &ut_params->cipher_xform; 10904 10905 /* Setup Cipher Parameters */ 10906 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10907 ut_params->cipher_xform.next = NULL; 10908 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 10909 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 10910 ut_params->cipher_xform.cipher.key.data = cipher_key; 10911 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 10912 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 10913 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 10914 10915 /* Create Crypto session*/ 10916 ut_params->sess = rte_cryptodev_sym_session_create( 10917 ts_params->session_mpool); 10918 10919 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10920 ut_params->sess, 10921 &ut_params->auth_xform, 10922 ts_params->session_priv_mpool); 10923 10924 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10925 10926 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10927 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10928 "Failed to allocate input buffer in mempool"); 10929 10930 /* clear mbuf payload */ 10931 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10932 rte_pktmbuf_tailroom(ut_params->ibuf)); 10933 10934 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10935 reference->ciphertext.len); 10936 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 10937 memcpy(ciphertext, reference->ciphertext.data, 10938 reference->ciphertext.len); 10939 10940 /* Create operation */ 10941 retval = create_cipher_auth_verify_operation(ts_params, 10942 ut_params, 10943 reference); 10944 10945 if (retval < 0) 10946 return retval; 10947 10948 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10949 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10950 ut_params->op); 10951 else 10952 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 10953 ut_params->op); 10954 10955 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10956 TEST_ASSERT_EQUAL(ut_params->op->status, 10957 RTE_CRYPTO_OP_STATUS_SUCCESS, 10958 "crypto op processing passed"); 10959 10960 ut_params->obuf = ut_params->op->sym->m_src; 10961 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 10962 10963 return 0; 10964 } 10965 10966 static int 10967 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 10968 const struct aead_test_data *tdata, 10969 void *digest_mem, uint64_t digest_phys) 10970 { 10971 struct crypto_testsuite_params *ts_params = &testsuite_params; 10972 struct crypto_unittest_params *ut_params = &unittest_params; 10973 10974 const unsigned int auth_tag_len = tdata->auth_tag.len; 10975 const unsigned int iv_len = tdata->iv.len; 10976 unsigned int aad_len = tdata->aad.len; 10977 unsigned int aad_len_pad = 0; 10978 10979 /* Generate Crypto op data structure */ 10980 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10981 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10982 TEST_ASSERT_NOT_NULL(ut_params->op, 10983 "Failed to allocate symmetric crypto operation struct"); 10984 10985 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10986 10987 sym_op->aead.digest.data = digest_mem; 10988 10989 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 10990 "no room to append digest"); 10991 10992 sym_op->aead.digest.phys_addr = digest_phys; 10993 10994 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 10995 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 10996 auth_tag_len); 10997 debug_hexdump(stdout, "digest:", 10998 sym_op->aead.digest.data, 10999 auth_tag_len); 11000 } 11001 11002 /* Append aad data */ 11003 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 11004 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11005 uint8_t *, IV_OFFSET); 11006 11007 /* Copy IV 1 byte after the IV pointer, according to the API */ 11008 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 11009 11010 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 11011 11012 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 11013 ut_params->ibuf, aad_len); 11014 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 11015 "no room to prepend aad"); 11016 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 11017 ut_params->ibuf); 11018 11019 memset(sym_op->aead.aad.data, 0, aad_len); 11020 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 11021 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 11022 11023 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 11024 debug_hexdump(stdout, "aad:", 11025 sym_op->aead.aad.data, aad_len); 11026 } else { 11027 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11028 uint8_t *, IV_OFFSET); 11029 11030 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 11031 11032 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 11033 11034 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 11035 ut_params->ibuf, aad_len_pad); 11036 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 11037 "no room to prepend aad"); 11038 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 11039 ut_params->ibuf); 11040 11041 memset(sym_op->aead.aad.data, 0, aad_len); 11042 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 11043 11044 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 11045 debug_hexdump(stdout, "aad:", 11046 sym_op->aead.aad.data, aad_len); 11047 } 11048 11049 sym_op->aead.data.length = tdata->plaintext.len; 11050 sym_op->aead.data.offset = aad_len_pad; 11051 11052 return 0; 11053 } 11054 11055 #define SGL_MAX_NO 16 11056 11057 static int 11058 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 11059 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 11060 { 11061 struct crypto_testsuite_params *ts_params = &testsuite_params; 11062 struct crypto_unittest_params *ut_params = &unittest_params; 11063 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 11064 int retval; 11065 int to_trn = 0; 11066 int to_trn_tbl[SGL_MAX_NO]; 11067 int segs = 1; 11068 unsigned int trn_data = 0; 11069 uint8_t *plaintext, *ciphertext, *auth_tag; 11070 struct rte_cryptodev_info dev_info; 11071 11072 /* Verify the capabilities */ 11073 struct rte_cryptodev_sym_capability_idx cap_idx; 11074 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 11075 cap_idx.algo.aead = tdata->algo; 11076 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11077 &cap_idx) == NULL) 11078 return -ENOTSUP; 11079 11080 /* OOP not supported with CPU crypto */ 11081 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11082 return -ENOTSUP; 11083 11084 /* Detailed check for the particular SGL support flag */ 11085 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11086 if (!oop) { 11087 unsigned int sgl_in = fragsz < tdata->plaintext.len; 11088 if (sgl_in && (!(dev_info.feature_flags & 11089 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 11090 return -ENOTSUP; 11091 } else { 11092 unsigned int sgl_in = fragsz < tdata->plaintext.len; 11093 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 11094 tdata->plaintext.len; 11095 if (sgl_in && !sgl_out) { 11096 if (!(dev_info.feature_flags & 11097 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 11098 return -ENOTSUP; 11099 } else if (!sgl_in && sgl_out) { 11100 if (!(dev_info.feature_flags & 11101 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 11102 return -ENOTSUP; 11103 } else if (sgl_in && sgl_out) { 11104 if (!(dev_info.feature_flags & 11105 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 11106 return -ENOTSUP; 11107 } 11108 } 11109 11110 if (fragsz > tdata->plaintext.len) 11111 fragsz = tdata->plaintext.len; 11112 11113 uint16_t plaintext_len = fragsz; 11114 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 11115 11116 if (fragsz_oop > tdata->plaintext.len) 11117 frag_size_oop = tdata->plaintext.len; 11118 11119 int ecx = 0; 11120 void *digest_mem = NULL; 11121 11122 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 11123 11124 if (tdata->plaintext.len % fragsz != 0) { 11125 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 11126 return 1; 11127 } else { 11128 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 11129 return 1; 11130 } 11131 11132 /* 11133 * For out-op-place we need to alloc another mbuf 11134 */ 11135 if (oop) { 11136 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11137 rte_pktmbuf_append(ut_params->obuf, 11138 frag_size_oop + prepend_len); 11139 buf_oop = ut_params->obuf; 11140 } 11141 11142 /* Create AEAD session */ 11143 retval = create_aead_session(ts_params->valid_devs[0], 11144 tdata->algo, 11145 RTE_CRYPTO_AEAD_OP_ENCRYPT, 11146 tdata->key.data, tdata->key.len, 11147 tdata->aad.len, tdata->auth_tag.len, 11148 tdata->iv.len); 11149 if (retval < 0) 11150 return retval; 11151 11152 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11153 11154 /* clear mbuf payload */ 11155 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11156 rte_pktmbuf_tailroom(ut_params->ibuf)); 11157 11158 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11159 plaintext_len); 11160 11161 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 11162 11163 trn_data += plaintext_len; 11164 11165 buf = ut_params->ibuf; 11166 11167 /* 11168 * Loop until no more fragments 11169 */ 11170 11171 while (trn_data < tdata->plaintext.len) { 11172 ++segs; 11173 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 11174 (tdata->plaintext.len - trn_data) : fragsz; 11175 11176 to_trn_tbl[ecx++] = to_trn; 11177 11178 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11179 buf = buf->next; 11180 11181 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 11182 rte_pktmbuf_tailroom(buf)); 11183 11184 /* OOP */ 11185 if (oop && !fragsz_oop) { 11186 buf_last_oop = buf_oop->next = 11187 rte_pktmbuf_alloc(ts_params->mbuf_pool); 11188 buf_oop = buf_oop->next; 11189 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 11190 0, rte_pktmbuf_tailroom(buf_oop)); 11191 rte_pktmbuf_append(buf_oop, to_trn); 11192 } 11193 11194 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 11195 to_trn); 11196 11197 memcpy(plaintext, tdata->plaintext.data + trn_data, 11198 to_trn); 11199 trn_data += to_trn; 11200 if (trn_data == tdata->plaintext.len) { 11201 if (oop) { 11202 if (!fragsz_oop) 11203 digest_mem = rte_pktmbuf_append(buf_oop, 11204 tdata->auth_tag.len); 11205 } else 11206 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 11207 tdata->auth_tag.len); 11208 } 11209 } 11210 11211 uint64_t digest_phys = 0; 11212 11213 ut_params->ibuf->nb_segs = segs; 11214 11215 segs = 1; 11216 if (fragsz_oop && oop) { 11217 to_trn = 0; 11218 ecx = 0; 11219 11220 if (frag_size_oop == tdata->plaintext.len) { 11221 digest_mem = rte_pktmbuf_append(ut_params->obuf, 11222 tdata->auth_tag.len); 11223 11224 digest_phys = rte_pktmbuf_iova_offset( 11225 ut_params->obuf, 11226 tdata->plaintext.len + prepend_len); 11227 } 11228 11229 trn_data = frag_size_oop; 11230 while (trn_data < tdata->plaintext.len) { 11231 ++segs; 11232 to_trn = 11233 (tdata->plaintext.len - trn_data < 11234 frag_size_oop) ? 11235 (tdata->plaintext.len - trn_data) : 11236 frag_size_oop; 11237 11238 to_trn_tbl[ecx++] = to_trn; 11239 11240 buf_last_oop = buf_oop->next = 11241 rte_pktmbuf_alloc(ts_params->mbuf_pool); 11242 buf_oop = buf_oop->next; 11243 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 11244 0, rte_pktmbuf_tailroom(buf_oop)); 11245 rte_pktmbuf_append(buf_oop, to_trn); 11246 11247 trn_data += to_trn; 11248 11249 if (trn_data == tdata->plaintext.len) { 11250 digest_mem = rte_pktmbuf_append(buf_oop, 11251 tdata->auth_tag.len); 11252 } 11253 } 11254 11255 ut_params->obuf->nb_segs = segs; 11256 } 11257 11258 /* 11259 * Place digest at the end of the last buffer 11260 */ 11261 if (!digest_phys) 11262 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 11263 if (oop && buf_last_oop) 11264 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 11265 11266 if (!digest_mem && !oop) { 11267 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11268 + tdata->auth_tag.len); 11269 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 11270 tdata->plaintext.len); 11271 } 11272 11273 /* Create AEAD operation */ 11274 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 11275 tdata, digest_mem, digest_phys); 11276 11277 if (retval < 0) 11278 return retval; 11279 11280 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11281 11282 ut_params->op->sym->m_src = ut_params->ibuf; 11283 if (oop) 11284 ut_params->op->sym->m_dst = ut_params->obuf; 11285 11286 /* Process crypto operation */ 11287 if (oop == IN_PLACE && 11288 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11289 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 11290 else 11291 TEST_ASSERT_NOT_NULL( 11292 process_crypto_request(ts_params->valid_devs[0], 11293 ut_params->op), "failed to process sym crypto op"); 11294 11295 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11296 "crypto op processing failed"); 11297 11298 11299 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 11300 uint8_t *, prepend_len); 11301 if (oop) { 11302 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11303 uint8_t *, prepend_len); 11304 } 11305 11306 if (fragsz_oop) 11307 fragsz = fragsz_oop; 11308 11309 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11310 ciphertext, 11311 tdata->ciphertext.data, 11312 fragsz, 11313 "Ciphertext data not as expected"); 11314 11315 buf = ut_params->op->sym->m_src->next; 11316 if (oop) 11317 buf = ut_params->op->sym->m_dst->next; 11318 11319 unsigned int off = fragsz; 11320 11321 ecx = 0; 11322 while (buf) { 11323 ciphertext = rte_pktmbuf_mtod(buf, 11324 uint8_t *); 11325 11326 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11327 ciphertext, 11328 tdata->ciphertext.data + off, 11329 to_trn_tbl[ecx], 11330 "Ciphertext data not as expected"); 11331 11332 off += to_trn_tbl[ecx++]; 11333 buf = buf->next; 11334 } 11335 11336 auth_tag = digest_mem; 11337 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11338 auth_tag, 11339 tdata->auth_tag.data, 11340 tdata->auth_tag.len, 11341 "Generated auth tag not as expected"); 11342 11343 return 0; 11344 } 11345 11346 static int 11347 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 11348 { 11349 return test_authenticated_encryption_SGL( 11350 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 11351 } 11352 11353 static int 11354 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 11355 { 11356 return test_authenticated_encryption_SGL( 11357 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 11358 } 11359 11360 static int 11361 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 11362 { 11363 return test_authenticated_encryption_SGL( 11364 &gcm_test_case_8, OUT_OF_PLACE, 400, 11365 gcm_test_case_8.plaintext.len); 11366 } 11367 11368 static int 11369 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 11370 { 11371 /* This test is not for OPENSSL PMD */ 11372 if (gbl_driver_id == rte_cryptodev_driver_id_get( 11373 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 11374 return -ENOTSUP; 11375 11376 return test_authenticated_encryption_SGL( 11377 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 11378 } 11379 11380 static int 11381 test_authentication_verify_fail_when_data_corrupted( 11382 struct crypto_testsuite_params *ts_params, 11383 struct crypto_unittest_params *ut_params, 11384 const struct test_crypto_vector *reference) 11385 { 11386 return test_authentication_verify_fail_when_data_corruption( 11387 ts_params, ut_params, reference, 1); 11388 } 11389 11390 static int 11391 test_authentication_verify_fail_when_tag_corrupted( 11392 struct crypto_testsuite_params *ts_params, 11393 struct crypto_unittest_params *ut_params, 11394 const struct test_crypto_vector *reference) 11395 { 11396 return test_authentication_verify_fail_when_data_corruption( 11397 ts_params, ut_params, reference, 0); 11398 } 11399 11400 static int 11401 test_authentication_verify_GMAC_fail_when_data_corrupted( 11402 struct crypto_testsuite_params *ts_params, 11403 struct crypto_unittest_params *ut_params, 11404 const struct test_crypto_vector *reference) 11405 { 11406 return test_authentication_verify_GMAC_fail_when_corruption( 11407 ts_params, ut_params, reference, 1); 11408 } 11409 11410 static int 11411 test_authentication_verify_GMAC_fail_when_tag_corrupted( 11412 struct crypto_testsuite_params *ts_params, 11413 struct crypto_unittest_params *ut_params, 11414 const struct test_crypto_vector *reference) 11415 { 11416 return test_authentication_verify_GMAC_fail_when_corruption( 11417 ts_params, ut_params, reference, 0); 11418 } 11419 11420 static int 11421 test_authenticated_decryption_fail_when_data_corrupted( 11422 struct crypto_testsuite_params *ts_params, 11423 struct crypto_unittest_params *ut_params, 11424 const struct test_crypto_vector *reference) 11425 { 11426 return test_authenticated_decryption_fail_when_corruption( 11427 ts_params, ut_params, reference, 1); 11428 } 11429 11430 static int 11431 test_authenticated_decryption_fail_when_tag_corrupted( 11432 struct crypto_testsuite_params *ts_params, 11433 struct crypto_unittest_params *ut_params, 11434 const struct test_crypto_vector *reference) 11435 { 11436 return test_authenticated_decryption_fail_when_corruption( 11437 ts_params, ut_params, reference, 0); 11438 } 11439 11440 static int 11441 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 11442 { 11443 return test_authentication_verify_fail_when_data_corrupted( 11444 &testsuite_params, &unittest_params, 11445 &hmac_sha1_test_crypto_vector); 11446 } 11447 11448 static int 11449 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 11450 { 11451 return test_authentication_verify_fail_when_tag_corrupted( 11452 &testsuite_params, &unittest_params, 11453 &hmac_sha1_test_crypto_vector); 11454 } 11455 11456 static int 11457 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 11458 { 11459 return test_authentication_verify_GMAC_fail_when_data_corrupted( 11460 &testsuite_params, &unittest_params, 11461 &aes128_gmac_test_vector); 11462 } 11463 11464 static int 11465 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 11466 { 11467 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 11468 &testsuite_params, &unittest_params, 11469 &aes128_gmac_test_vector); 11470 } 11471 11472 static int 11473 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 11474 { 11475 return test_authenticated_decryption_fail_when_data_corrupted( 11476 &testsuite_params, 11477 &unittest_params, 11478 &aes128cbc_hmac_sha1_test_vector); 11479 } 11480 11481 static int 11482 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 11483 { 11484 return test_authenticated_decryption_fail_when_tag_corrupted( 11485 &testsuite_params, 11486 &unittest_params, 11487 &aes128cbc_hmac_sha1_test_vector); 11488 } 11489 11490 static int 11491 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 11492 { 11493 return test_authenticated_encryt_with_esn( 11494 &testsuite_params, 11495 &unittest_params, 11496 &aes128cbc_hmac_sha1_aad_test_vector); 11497 } 11498 11499 static int 11500 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 11501 { 11502 return test_authenticated_decrypt_with_esn( 11503 &testsuite_params, 11504 &unittest_params, 11505 &aes128cbc_hmac_sha1_aad_test_vector); 11506 } 11507 11508 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER 11509 11510 /* global AESNI slave IDs for the scheduler test */ 11511 uint8_t aesni_ids[2]; 11512 11513 static int 11514 test_scheduler_attach_slave_op(void) 11515 { 11516 struct crypto_testsuite_params *ts_params = &testsuite_params; 11517 uint8_t sched_id = ts_params->valid_devs[0]; 11518 uint32_t nb_devs, i, nb_devs_attached = 0; 11519 int ret; 11520 char vdev_name[32]; 11521 11522 /* create 2 AESNI_MB if necessary */ 11523 nb_devs = rte_cryptodev_device_count_by_driver( 11524 rte_cryptodev_driver_id_get( 11525 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))); 11526 if (nb_devs < 2) { 11527 for (i = nb_devs; i < 2; i++) { 11528 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 11529 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 11530 i); 11531 ret = rte_vdev_init(vdev_name, NULL); 11532 11533 TEST_ASSERT(ret == 0, 11534 "Failed to create instance %u of" 11535 " pmd : %s", 11536 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 11537 } 11538 } 11539 11540 /* attach 2 AESNI_MB cdevs */ 11541 for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2; 11542 i++) { 11543 struct rte_cryptodev_info info; 11544 unsigned int session_size; 11545 11546 rte_cryptodev_info_get(i, &info); 11547 if (info.driver_id != rte_cryptodev_driver_id_get( 11548 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 11549 continue; 11550 11551 session_size = rte_cryptodev_sym_get_private_session_size(i); 11552 /* 11553 * Create the session mempool again, since now there are new devices 11554 * to use the mempool. 11555 */ 11556 if (ts_params->session_mpool) { 11557 rte_mempool_free(ts_params->session_mpool); 11558 ts_params->session_mpool = NULL; 11559 } 11560 if (ts_params->session_priv_mpool) { 11561 rte_mempool_free(ts_params->session_priv_mpool); 11562 ts_params->session_priv_mpool = NULL; 11563 } 11564 11565 if (info.sym.max_nb_sessions != 0 && 11566 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 11567 RTE_LOG(ERR, USER1, 11568 "Device does not support " 11569 "at least %u sessions\n", 11570 MAX_NB_SESSIONS); 11571 return TEST_FAILED; 11572 } 11573 /* 11574 * Create mempool with maximum number of sessions, 11575 * to include the session headers 11576 */ 11577 if (ts_params->session_mpool == NULL) { 11578 ts_params->session_mpool = 11579 rte_cryptodev_sym_session_pool_create( 11580 "test_sess_mp", 11581 MAX_NB_SESSIONS, 0, 0, 0, 11582 SOCKET_ID_ANY); 11583 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 11584 "session mempool allocation failed"); 11585 } 11586 11587 /* 11588 * Create mempool with maximum number of sessions, 11589 * to include device specific session private data 11590 */ 11591 if (ts_params->session_priv_mpool == NULL) { 11592 ts_params->session_priv_mpool = rte_mempool_create( 11593 "test_sess_mp_priv", 11594 MAX_NB_SESSIONS, 11595 session_size, 11596 0, 0, NULL, NULL, NULL, 11597 NULL, SOCKET_ID_ANY, 11598 0); 11599 11600 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 11601 "session mempool allocation failed"); 11602 } 11603 11604 ts_params->qp_conf.mp_session = ts_params->session_mpool; 11605 ts_params->qp_conf.mp_session_private = 11606 ts_params->session_priv_mpool; 11607 11608 ret = rte_cryptodev_scheduler_slave_attach(sched_id, 11609 (uint8_t)i); 11610 11611 TEST_ASSERT(ret == 0, 11612 "Failed to attach device %u of pmd : %s", i, 11613 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 11614 11615 aesni_ids[nb_devs_attached] = (uint8_t)i; 11616 11617 nb_devs_attached++; 11618 } 11619 11620 return 0; 11621 } 11622 11623 static int 11624 test_scheduler_detach_slave_op(void) 11625 { 11626 struct crypto_testsuite_params *ts_params = &testsuite_params; 11627 uint8_t sched_id = ts_params->valid_devs[0]; 11628 uint32_t i; 11629 int ret; 11630 11631 for (i = 0; i < 2; i++) { 11632 ret = rte_cryptodev_scheduler_slave_detach(sched_id, 11633 aesni_ids[i]); 11634 TEST_ASSERT(ret == 0, 11635 "Failed to detach device %u", aesni_ids[i]); 11636 } 11637 11638 return 0; 11639 } 11640 11641 static int 11642 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 11643 { 11644 struct crypto_testsuite_params *ts_params = &testsuite_params; 11645 uint8_t sched_id = ts_params->valid_devs[0]; 11646 /* set mode */ 11647 return rte_cryptodev_scheduler_mode_set(sched_id, 11648 scheduler_mode); 11649 } 11650 11651 static int 11652 test_scheduler_mode_roundrobin_op(void) 11653 { 11654 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 11655 0, "Failed to set roundrobin mode"); 11656 return 0; 11657 11658 } 11659 11660 static int 11661 test_scheduler_mode_multicore_op(void) 11662 { 11663 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 11664 0, "Failed to set multicore mode"); 11665 11666 return 0; 11667 } 11668 11669 static int 11670 test_scheduler_mode_failover_op(void) 11671 { 11672 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 11673 0, "Failed to set failover mode"); 11674 11675 return 0; 11676 } 11677 11678 static int 11679 test_scheduler_mode_pkt_size_distr_op(void) 11680 { 11681 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 11682 0, "Failed to set pktsize mode"); 11683 11684 return 0; 11685 } 11686 11687 static struct unit_test_suite cryptodev_scheduler_testsuite = { 11688 .suite_name = "Crypto Device Scheduler Unit Test Suite", 11689 .setup = testsuite_setup, 11690 .teardown = testsuite_teardown, 11691 .unit_test_cases = { 11692 /* Multi Core */ 11693 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 11694 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op), 11695 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 11696 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 11697 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 11698 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 11699 11700 /* Round Robin */ 11701 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 11702 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op), 11703 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 11704 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 11705 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 11706 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 11707 11708 /* Fail over */ 11709 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 11710 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op), 11711 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 11712 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 11713 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 11714 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 11715 11716 /* PKT SIZE */ 11717 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 11718 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op), 11719 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 11720 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 11721 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 11722 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 11723 11724 TEST_CASES_END() /**< NULL terminate unit test array */ 11725 } 11726 }; 11727 11728 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */ 11729 11730 static struct unit_test_suite cryptodev_testsuite = { 11731 .suite_name = "Crypto Unit Test Suite", 11732 .setup = testsuite_setup, 11733 .teardown = testsuite_teardown, 11734 .unit_test_cases = { 11735 TEST_CASE_ST(ut_setup, ut_teardown, 11736 test_device_configure_invalid_dev_id), 11737 TEST_CASE_ST(ut_setup, ut_teardown, 11738 test_device_configure_invalid_queue_pair_ids), 11739 TEST_CASE_ST(ut_setup, ut_teardown, 11740 test_queue_pair_descriptor_setup), 11741 11742 TEST_CASE_ST(ut_setup, ut_teardown, 11743 test_multi_session), 11744 TEST_CASE_ST(ut_setup, ut_teardown, 11745 test_multi_session_random_usage), 11746 11747 TEST_CASE_ST(ut_setup, ut_teardown, 11748 test_null_invalid_operation), 11749 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 11750 11751 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 11752 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 11753 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 11754 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 11755 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all), 11756 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all), 11757 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all), 11758 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 11759 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 11760 11761 /** AES CCM Authenticated Encryption 128 bits key */ 11762 TEST_CASE_ST(ut_setup, ut_teardown, 11763 test_AES_CCM_authenticated_encryption_test_case_128_1), 11764 TEST_CASE_ST(ut_setup, ut_teardown, 11765 test_AES_CCM_authenticated_encryption_test_case_128_2), 11766 TEST_CASE_ST(ut_setup, ut_teardown, 11767 test_AES_CCM_authenticated_encryption_test_case_128_3), 11768 11769 /** AES CCM Authenticated Decryption 128 bits key*/ 11770 TEST_CASE_ST(ut_setup, ut_teardown, 11771 test_AES_CCM_authenticated_decryption_test_case_128_1), 11772 TEST_CASE_ST(ut_setup, ut_teardown, 11773 test_AES_CCM_authenticated_decryption_test_case_128_2), 11774 TEST_CASE_ST(ut_setup, ut_teardown, 11775 test_AES_CCM_authenticated_decryption_test_case_128_3), 11776 11777 /** AES CCM Authenticated Encryption 192 bits key */ 11778 TEST_CASE_ST(ut_setup, ut_teardown, 11779 test_AES_CCM_authenticated_encryption_test_case_192_1), 11780 TEST_CASE_ST(ut_setup, ut_teardown, 11781 test_AES_CCM_authenticated_encryption_test_case_192_2), 11782 TEST_CASE_ST(ut_setup, ut_teardown, 11783 test_AES_CCM_authenticated_encryption_test_case_192_3), 11784 11785 /** AES CCM Authenticated Decryption 192 bits key*/ 11786 TEST_CASE_ST(ut_setup, ut_teardown, 11787 test_AES_CCM_authenticated_decryption_test_case_192_1), 11788 TEST_CASE_ST(ut_setup, ut_teardown, 11789 test_AES_CCM_authenticated_decryption_test_case_192_2), 11790 TEST_CASE_ST(ut_setup, ut_teardown, 11791 test_AES_CCM_authenticated_decryption_test_case_192_3), 11792 11793 /** AES CCM Authenticated Encryption 256 bits key */ 11794 TEST_CASE_ST(ut_setup, ut_teardown, 11795 test_AES_CCM_authenticated_encryption_test_case_256_1), 11796 TEST_CASE_ST(ut_setup, ut_teardown, 11797 test_AES_CCM_authenticated_encryption_test_case_256_2), 11798 TEST_CASE_ST(ut_setup, ut_teardown, 11799 test_AES_CCM_authenticated_encryption_test_case_256_3), 11800 11801 /** AES CCM Authenticated Decryption 256 bits key*/ 11802 TEST_CASE_ST(ut_setup, ut_teardown, 11803 test_AES_CCM_authenticated_decryption_test_case_256_1), 11804 TEST_CASE_ST(ut_setup, ut_teardown, 11805 test_AES_CCM_authenticated_decryption_test_case_256_2), 11806 TEST_CASE_ST(ut_setup, ut_teardown, 11807 test_AES_CCM_authenticated_decryption_test_case_256_3), 11808 11809 /** AES GCM Authenticated Encryption */ 11810 TEST_CASE_ST(ut_setup, ut_teardown, 11811 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 11812 TEST_CASE_ST(ut_setup, ut_teardown, 11813 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 11814 TEST_CASE_ST(ut_setup, ut_teardown, 11815 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 11816 TEST_CASE_ST(ut_setup, ut_teardown, 11817 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 11818 TEST_CASE_ST(ut_setup, ut_teardown, 11819 test_AES_GCM_authenticated_encryption_test_case_1), 11820 TEST_CASE_ST(ut_setup, ut_teardown, 11821 test_AES_GCM_authenticated_encryption_test_case_2), 11822 TEST_CASE_ST(ut_setup, ut_teardown, 11823 test_AES_GCM_authenticated_encryption_test_case_3), 11824 TEST_CASE_ST(ut_setup, ut_teardown, 11825 test_AES_GCM_authenticated_encryption_test_case_4), 11826 TEST_CASE_ST(ut_setup, ut_teardown, 11827 test_AES_GCM_authenticated_encryption_test_case_5), 11828 TEST_CASE_ST(ut_setup, ut_teardown, 11829 test_AES_GCM_authenticated_encryption_test_case_6), 11830 TEST_CASE_ST(ut_setup, ut_teardown, 11831 test_AES_GCM_authenticated_encryption_test_case_7), 11832 TEST_CASE_ST(ut_setup, ut_teardown, 11833 test_AES_GCM_authenticated_encryption_test_case_8), 11834 TEST_CASE_ST(ut_setup, ut_teardown, 11835 test_AES_GCM_J0_authenticated_encryption_test_case_1), 11836 11837 /** AES GCM Authenticated Decryption */ 11838 TEST_CASE_ST(ut_setup, ut_teardown, 11839 test_AES_GCM_authenticated_decryption_test_case_1), 11840 TEST_CASE_ST(ut_setup, ut_teardown, 11841 test_AES_GCM_authenticated_decryption_test_case_2), 11842 TEST_CASE_ST(ut_setup, ut_teardown, 11843 test_AES_GCM_authenticated_decryption_test_case_3), 11844 TEST_CASE_ST(ut_setup, ut_teardown, 11845 test_AES_GCM_authenticated_decryption_test_case_4), 11846 TEST_CASE_ST(ut_setup, ut_teardown, 11847 test_AES_GCM_authenticated_decryption_test_case_5), 11848 TEST_CASE_ST(ut_setup, ut_teardown, 11849 test_AES_GCM_authenticated_decryption_test_case_6), 11850 TEST_CASE_ST(ut_setup, ut_teardown, 11851 test_AES_GCM_authenticated_decryption_test_case_7), 11852 TEST_CASE_ST(ut_setup, ut_teardown, 11853 test_AES_GCM_authenticated_decryption_test_case_8), 11854 TEST_CASE_ST(ut_setup, ut_teardown, 11855 test_AES_GCM_J0_authenticated_decryption_test_case_1), 11856 11857 /** AES GCM Authenticated Encryption 192 bits key */ 11858 TEST_CASE_ST(ut_setup, ut_teardown, 11859 test_AES_GCM_auth_encryption_test_case_192_1), 11860 TEST_CASE_ST(ut_setup, ut_teardown, 11861 test_AES_GCM_auth_encryption_test_case_192_2), 11862 TEST_CASE_ST(ut_setup, ut_teardown, 11863 test_AES_GCM_auth_encryption_test_case_192_3), 11864 TEST_CASE_ST(ut_setup, ut_teardown, 11865 test_AES_GCM_auth_encryption_test_case_192_4), 11866 TEST_CASE_ST(ut_setup, ut_teardown, 11867 test_AES_GCM_auth_encryption_test_case_192_5), 11868 TEST_CASE_ST(ut_setup, ut_teardown, 11869 test_AES_GCM_auth_encryption_test_case_192_6), 11870 TEST_CASE_ST(ut_setup, ut_teardown, 11871 test_AES_GCM_auth_encryption_test_case_192_7), 11872 11873 /** AES GCM Authenticated Decryption 192 bits key */ 11874 TEST_CASE_ST(ut_setup, ut_teardown, 11875 test_AES_GCM_auth_decryption_test_case_192_1), 11876 TEST_CASE_ST(ut_setup, ut_teardown, 11877 test_AES_GCM_auth_decryption_test_case_192_2), 11878 TEST_CASE_ST(ut_setup, ut_teardown, 11879 test_AES_GCM_auth_decryption_test_case_192_3), 11880 TEST_CASE_ST(ut_setup, ut_teardown, 11881 test_AES_GCM_auth_decryption_test_case_192_4), 11882 TEST_CASE_ST(ut_setup, ut_teardown, 11883 test_AES_GCM_auth_decryption_test_case_192_5), 11884 TEST_CASE_ST(ut_setup, ut_teardown, 11885 test_AES_GCM_auth_decryption_test_case_192_6), 11886 TEST_CASE_ST(ut_setup, ut_teardown, 11887 test_AES_GCM_auth_decryption_test_case_192_7), 11888 11889 /** AES GCM Authenticated Encryption 256 bits key */ 11890 TEST_CASE_ST(ut_setup, ut_teardown, 11891 test_AES_GCM_auth_encryption_test_case_256_1), 11892 TEST_CASE_ST(ut_setup, ut_teardown, 11893 test_AES_GCM_auth_encryption_test_case_256_2), 11894 TEST_CASE_ST(ut_setup, ut_teardown, 11895 test_AES_GCM_auth_encryption_test_case_256_3), 11896 TEST_CASE_ST(ut_setup, ut_teardown, 11897 test_AES_GCM_auth_encryption_test_case_256_4), 11898 TEST_CASE_ST(ut_setup, ut_teardown, 11899 test_AES_GCM_auth_encryption_test_case_256_5), 11900 TEST_CASE_ST(ut_setup, ut_teardown, 11901 test_AES_GCM_auth_encryption_test_case_256_6), 11902 TEST_CASE_ST(ut_setup, ut_teardown, 11903 test_AES_GCM_auth_encryption_test_case_256_7), 11904 11905 /** AES GCM Authenticated Decryption 256 bits key */ 11906 TEST_CASE_ST(ut_setup, ut_teardown, 11907 test_AES_GCM_auth_decryption_test_case_256_1), 11908 TEST_CASE_ST(ut_setup, ut_teardown, 11909 test_AES_GCM_auth_decryption_test_case_256_2), 11910 TEST_CASE_ST(ut_setup, ut_teardown, 11911 test_AES_GCM_auth_decryption_test_case_256_3), 11912 TEST_CASE_ST(ut_setup, ut_teardown, 11913 test_AES_GCM_auth_decryption_test_case_256_4), 11914 TEST_CASE_ST(ut_setup, ut_teardown, 11915 test_AES_GCM_auth_decryption_test_case_256_5), 11916 TEST_CASE_ST(ut_setup, ut_teardown, 11917 test_AES_GCM_auth_decryption_test_case_256_6), 11918 TEST_CASE_ST(ut_setup, ut_teardown, 11919 test_AES_GCM_auth_decryption_test_case_256_7), 11920 11921 /** AES GCM Authenticated Encryption big aad size */ 11922 TEST_CASE_ST(ut_setup, ut_teardown, 11923 test_AES_GCM_auth_encryption_test_case_aad_1), 11924 TEST_CASE_ST(ut_setup, ut_teardown, 11925 test_AES_GCM_auth_encryption_test_case_aad_2), 11926 11927 /** AES GCM Authenticated Decryption big aad size */ 11928 TEST_CASE_ST(ut_setup, ut_teardown, 11929 test_AES_GCM_auth_decryption_test_case_aad_1), 11930 TEST_CASE_ST(ut_setup, ut_teardown, 11931 test_AES_GCM_auth_decryption_test_case_aad_2), 11932 11933 /** Out of place tests */ 11934 TEST_CASE_ST(ut_setup, ut_teardown, 11935 test_AES_GCM_authenticated_encryption_oop_test_case_1), 11936 TEST_CASE_ST(ut_setup, ut_teardown, 11937 test_AES_GCM_authenticated_decryption_oop_test_case_1), 11938 11939 /** Session-less tests */ 11940 TEST_CASE_ST(ut_setup, ut_teardown, 11941 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 11942 TEST_CASE_ST(ut_setup, ut_teardown, 11943 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 11944 11945 /** AES GMAC Authentication */ 11946 TEST_CASE_ST(ut_setup, ut_teardown, 11947 test_AES_GMAC_authentication_test_case_1), 11948 TEST_CASE_ST(ut_setup, ut_teardown, 11949 test_AES_GMAC_authentication_verify_test_case_1), 11950 TEST_CASE_ST(ut_setup, ut_teardown, 11951 test_AES_GMAC_authentication_test_case_2), 11952 TEST_CASE_ST(ut_setup, ut_teardown, 11953 test_AES_GMAC_authentication_verify_test_case_2), 11954 TEST_CASE_ST(ut_setup, ut_teardown, 11955 test_AES_GMAC_authentication_test_case_3), 11956 TEST_CASE_ST(ut_setup, ut_teardown, 11957 test_AES_GMAC_authentication_verify_test_case_3), 11958 TEST_CASE_ST(ut_setup, ut_teardown, 11959 test_AES_GMAC_authentication_test_case_4), 11960 TEST_CASE_ST(ut_setup, ut_teardown, 11961 test_AES_GMAC_authentication_verify_test_case_4), 11962 11963 /** SNOW 3G encrypt only (UEA2) */ 11964 TEST_CASE_ST(ut_setup, ut_teardown, 11965 test_snow3g_encryption_test_case_1), 11966 TEST_CASE_ST(ut_setup, ut_teardown, 11967 test_snow3g_encryption_test_case_2), 11968 TEST_CASE_ST(ut_setup, ut_teardown, 11969 test_snow3g_encryption_test_case_3), 11970 TEST_CASE_ST(ut_setup, ut_teardown, 11971 test_snow3g_encryption_test_case_4), 11972 TEST_CASE_ST(ut_setup, ut_teardown, 11973 test_snow3g_encryption_test_case_5), 11974 11975 TEST_CASE_ST(ut_setup, ut_teardown, 11976 test_snow3g_encryption_test_case_1_oop), 11977 TEST_CASE_ST(ut_setup, ut_teardown, 11978 test_snow3g_encryption_test_case_1_oop_sgl), 11979 TEST_CASE_ST(ut_setup, ut_teardown, 11980 test_snow3g_encryption_test_case_1_offset_oop), 11981 TEST_CASE_ST(ut_setup, ut_teardown, 11982 test_snow3g_decryption_test_case_1_oop), 11983 11984 /** SNOW 3G generate auth, then encrypt (UEA2) */ 11985 TEST_CASE_ST(ut_setup, ut_teardown, 11986 test_snow3g_auth_cipher_test_case_1), 11987 TEST_CASE_ST(ut_setup, ut_teardown, 11988 test_snow3g_auth_cipher_test_case_2), 11989 TEST_CASE_ST(ut_setup, ut_teardown, 11990 test_snow3g_auth_cipher_test_case_2_oop), 11991 TEST_CASE_ST(ut_setup, ut_teardown, 11992 test_snow3g_auth_cipher_part_digest_enc), 11993 TEST_CASE_ST(ut_setup, ut_teardown, 11994 test_snow3g_auth_cipher_part_digest_enc_oop), 11995 TEST_CASE_ST(ut_setup, ut_teardown, 11996 test_snow3g_auth_cipher_test_case_3_sgl), 11997 TEST_CASE_ST(ut_setup, ut_teardown, 11998 test_snow3g_auth_cipher_test_case_3_oop_sgl), 11999 TEST_CASE_ST(ut_setup, ut_teardown, 12000 test_snow3g_auth_cipher_part_digest_enc_sgl), 12001 TEST_CASE_ST(ut_setup, ut_teardown, 12002 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 12003 12004 /** SNOW 3G decrypt (UEA2), then verify auth */ 12005 TEST_CASE_ST(ut_setup, ut_teardown, 12006 test_snow3g_auth_cipher_verify_test_case_1), 12007 TEST_CASE_ST(ut_setup, ut_teardown, 12008 test_snow3g_auth_cipher_verify_test_case_2), 12009 TEST_CASE_ST(ut_setup, ut_teardown, 12010 test_snow3g_auth_cipher_verify_test_case_2_oop), 12011 TEST_CASE_ST(ut_setup, ut_teardown, 12012 test_snow3g_auth_cipher_verify_part_digest_enc), 12013 TEST_CASE_ST(ut_setup, ut_teardown, 12014 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 12015 TEST_CASE_ST(ut_setup, ut_teardown, 12016 test_snow3g_auth_cipher_verify_test_case_3_sgl), 12017 TEST_CASE_ST(ut_setup, ut_teardown, 12018 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 12019 TEST_CASE_ST(ut_setup, ut_teardown, 12020 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 12021 TEST_CASE_ST(ut_setup, ut_teardown, 12022 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 12023 12024 /** SNOW 3G decrypt only (UEA2) */ 12025 TEST_CASE_ST(ut_setup, ut_teardown, 12026 test_snow3g_decryption_test_case_1), 12027 TEST_CASE_ST(ut_setup, ut_teardown, 12028 test_snow3g_decryption_test_case_2), 12029 TEST_CASE_ST(ut_setup, ut_teardown, 12030 test_snow3g_decryption_test_case_3), 12031 TEST_CASE_ST(ut_setup, ut_teardown, 12032 test_snow3g_decryption_test_case_4), 12033 TEST_CASE_ST(ut_setup, ut_teardown, 12034 test_snow3g_decryption_test_case_5), 12035 TEST_CASE_ST(ut_setup, ut_teardown, 12036 test_snow3g_decryption_with_digest_test_case_1), 12037 TEST_CASE_ST(ut_setup, ut_teardown, 12038 test_snow3g_hash_generate_test_case_1), 12039 TEST_CASE_ST(ut_setup, ut_teardown, 12040 test_snow3g_hash_generate_test_case_2), 12041 TEST_CASE_ST(ut_setup, ut_teardown, 12042 test_snow3g_hash_generate_test_case_3), 12043 /* Tests with buffers which length is not byte-aligned */ 12044 TEST_CASE_ST(ut_setup, ut_teardown, 12045 test_snow3g_hash_generate_test_case_4), 12046 TEST_CASE_ST(ut_setup, ut_teardown, 12047 test_snow3g_hash_generate_test_case_5), 12048 TEST_CASE_ST(ut_setup, ut_teardown, 12049 test_snow3g_hash_generate_test_case_6), 12050 TEST_CASE_ST(ut_setup, ut_teardown, 12051 test_snow3g_hash_verify_test_case_1), 12052 TEST_CASE_ST(ut_setup, ut_teardown, 12053 test_snow3g_hash_verify_test_case_2), 12054 TEST_CASE_ST(ut_setup, ut_teardown, 12055 test_snow3g_hash_verify_test_case_3), 12056 /* Tests with buffers which length is not byte-aligned */ 12057 TEST_CASE_ST(ut_setup, ut_teardown, 12058 test_snow3g_hash_verify_test_case_4), 12059 TEST_CASE_ST(ut_setup, ut_teardown, 12060 test_snow3g_hash_verify_test_case_5), 12061 TEST_CASE_ST(ut_setup, ut_teardown, 12062 test_snow3g_hash_verify_test_case_6), 12063 TEST_CASE_ST(ut_setup, ut_teardown, 12064 test_snow3g_cipher_auth_test_case_1), 12065 TEST_CASE_ST(ut_setup, ut_teardown, 12066 test_snow3g_auth_cipher_with_digest_test_case_1), 12067 12068 /** ZUC encrypt only (EEA3) */ 12069 TEST_CASE_ST(ut_setup, ut_teardown, 12070 test_zuc_encryption_test_case_1), 12071 TEST_CASE_ST(ut_setup, ut_teardown, 12072 test_zuc_encryption_test_case_2), 12073 TEST_CASE_ST(ut_setup, ut_teardown, 12074 test_zuc_encryption_test_case_3), 12075 TEST_CASE_ST(ut_setup, ut_teardown, 12076 test_zuc_encryption_test_case_4), 12077 TEST_CASE_ST(ut_setup, ut_teardown, 12078 test_zuc_encryption_test_case_5), 12079 TEST_CASE_ST(ut_setup, ut_teardown, 12080 test_zuc_encryption_test_case_6_sgl), 12081 12082 /** ZUC authenticate (EIA3) */ 12083 TEST_CASE_ST(ut_setup, ut_teardown, 12084 test_zuc_hash_generate_test_case_1), 12085 TEST_CASE_ST(ut_setup, ut_teardown, 12086 test_zuc_hash_generate_test_case_2), 12087 TEST_CASE_ST(ut_setup, ut_teardown, 12088 test_zuc_hash_generate_test_case_3), 12089 TEST_CASE_ST(ut_setup, ut_teardown, 12090 test_zuc_hash_generate_test_case_4), 12091 TEST_CASE_ST(ut_setup, ut_teardown, 12092 test_zuc_hash_generate_test_case_5), 12093 TEST_CASE_ST(ut_setup, ut_teardown, 12094 test_zuc_hash_generate_test_case_6), 12095 TEST_CASE_ST(ut_setup, ut_teardown, 12096 test_zuc_hash_generate_test_case_7), 12097 TEST_CASE_ST(ut_setup, ut_teardown, 12098 test_zuc_hash_generate_test_case_8), 12099 12100 /** ZUC alg-chain (EEA3/EIA3) */ 12101 TEST_CASE_ST(ut_setup, ut_teardown, 12102 test_zuc_cipher_auth_test_case_1), 12103 TEST_CASE_ST(ut_setup, ut_teardown, 12104 test_zuc_cipher_auth_test_case_2), 12105 12106 /** ZUC generate auth, then encrypt (EEA3) */ 12107 TEST_CASE_ST(ut_setup, ut_teardown, 12108 test_zuc_auth_cipher_test_case_1), 12109 TEST_CASE_ST(ut_setup, ut_teardown, 12110 test_zuc_auth_cipher_test_case_1_oop), 12111 TEST_CASE_ST(ut_setup, ut_teardown, 12112 test_zuc_auth_cipher_test_case_1_sgl), 12113 TEST_CASE_ST(ut_setup, ut_teardown, 12114 test_zuc_auth_cipher_test_case_1_oop_sgl), 12115 12116 /** ZUC decrypt (EEA3), then verify auth */ 12117 TEST_CASE_ST(ut_setup, ut_teardown, 12118 test_zuc_auth_cipher_verify_test_case_1), 12119 TEST_CASE_ST(ut_setup, ut_teardown, 12120 test_zuc_auth_cipher_verify_test_case_1_oop), 12121 TEST_CASE_ST(ut_setup, ut_teardown, 12122 test_zuc_auth_cipher_verify_test_case_1_sgl), 12123 TEST_CASE_ST(ut_setup, ut_teardown, 12124 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 12125 12126 /** HMAC_MD5 Authentication */ 12127 TEST_CASE_ST(ut_setup, ut_teardown, 12128 test_MD5_HMAC_generate_case_1), 12129 TEST_CASE_ST(ut_setup, ut_teardown, 12130 test_MD5_HMAC_verify_case_1), 12131 TEST_CASE_ST(ut_setup, ut_teardown, 12132 test_MD5_HMAC_generate_case_2), 12133 TEST_CASE_ST(ut_setup, ut_teardown, 12134 test_MD5_HMAC_verify_case_2), 12135 12136 /** KASUMI hash only (UIA1) */ 12137 TEST_CASE_ST(ut_setup, ut_teardown, 12138 test_kasumi_hash_generate_test_case_1), 12139 TEST_CASE_ST(ut_setup, ut_teardown, 12140 test_kasumi_hash_generate_test_case_2), 12141 TEST_CASE_ST(ut_setup, ut_teardown, 12142 test_kasumi_hash_generate_test_case_3), 12143 TEST_CASE_ST(ut_setup, ut_teardown, 12144 test_kasumi_hash_generate_test_case_4), 12145 TEST_CASE_ST(ut_setup, ut_teardown, 12146 test_kasumi_hash_generate_test_case_5), 12147 TEST_CASE_ST(ut_setup, ut_teardown, 12148 test_kasumi_hash_generate_test_case_6), 12149 12150 TEST_CASE_ST(ut_setup, ut_teardown, 12151 test_kasumi_hash_verify_test_case_1), 12152 TEST_CASE_ST(ut_setup, ut_teardown, 12153 test_kasumi_hash_verify_test_case_2), 12154 TEST_CASE_ST(ut_setup, ut_teardown, 12155 test_kasumi_hash_verify_test_case_3), 12156 TEST_CASE_ST(ut_setup, ut_teardown, 12157 test_kasumi_hash_verify_test_case_4), 12158 TEST_CASE_ST(ut_setup, ut_teardown, 12159 test_kasumi_hash_verify_test_case_5), 12160 12161 /** KASUMI encrypt only (UEA1) */ 12162 TEST_CASE_ST(ut_setup, ut_teardown, 12163 test_kasumi_encryption_test_case_1), 12164 TEST_CASE_ST(ut_setup, ut_teardown, 12165 test_kasumi_encryption_test_case_1_sgl), 12166 TEST_CASE_ST(ut_setup, ut_teardown, 12167 test_kasumi_encryption_test_case_1_oop), 12168 TEST_CASE_ST(ut_setup, ut_teardown, 12169 test_kasumi_encryption_test_case_1_oop_sgl), 12170 TEST_CASE_ST(ut_setup, ut_teardown, 12171 test_kasumi_encryption_test_case_2), 12172 TEST_CASE_ST(ut_setup, ut_teardown, 12173 test_kasumi_encryption_test_case_3), 12174 TEST_CASE_ST(ut_setup, ut_teardown, 12175 test_kasumi_encryption_test_case_4), 12176 TEST_CASE_ST(ut_setup, ut_teardown, 12177 test_kasumi_encryption_test_case_5), 12178 12179 /** KASUMI decrypt only (UEA1) */ 12180 TEST_CASE_ST(ut_setup, ut_teardown, 12181 test_kasumi_decryption_test_case_1), 12182 TEST_CASE_ST(ut_setup, ut_teardown, 12183 test_kasumi_decryption_test_case_2), 12184 TEST_CASE_ST(ut_setup, ut_teardown, 12185 test_kasumi_decryption_test_case_3), 12186 TEST_CASE_ST(ut_setup, ut_teardown, 12187 test_kasumi_decryption_test_case_4), 12188 TEST_CASE_ST(ut_setup, ut_teardown, 12189 test_kasumi_decryption_test_case_5), 12190 TEST_CASE_ST(ut_setup, ut_teardown, 12191 test_kasumi_decryption_test_case_1_oop), 12192 12193 TEST_CASE_ST(ut_setup, ut_teardown, 12194 test_kasumi_cipher_auth_test_case_1), 12195 12196 /** KASUMI generate auth, then encrypt (F8) */ 12197 TEST_CASE_ST(ut_setup, ut_teardown, 12198 test_kasumi_auth_cipher_test_case_1), 12199 TEST_CASE_ST(ut_setup, ut_teardown, 12200 test_kasumi_auth_cipher_test_case_2), 12201 TEST_CASE_ST(ut_setup, ut_teardown, 12202 test_kasumi_auth_cipher_test_case_2_oop), 12203 TEST_CASE_ST(ut_setup, ut_teardown, 12204 test_kasumi_auth_cipher_test_case_2_sgl), 12205 TEST_CASE_ST(ut_setup, ut_teardown, 12206 test_kasumi_auth_cipher_test_case_2_oop_sgl), 12207 12208 /** KASUMI decrypt (F8), then verify auth */ 12209 TEST_CASE_ST(ut_setup, ut_teardown, 12210 test_kasumi_auth_cipher_verify_test_case_1), 12211 TEST_CASE_ST(ut_setup, ut_teardown, 12212 test_kasumi_auth_cipher_verify_test_case_2), 12213 TEST_CASE_ST(ut_setup, ut_teardown, 12214 test_kasumi_auth_cipher_verify_test_case_2_oop), 12215 TEST_CASE_ST(ut_setup, ut_teardown, 12216 test_kasumi_auth_cipher_verify_test_case_2_sgl), 12217 TEST_CASE_ST(ut_setup, ut_teardown, 12218 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 12219 12220 /** ESN Testcase */ 12221 TEST_CASE_ST(ut_setup, ut_teardown, 12222 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 12223 TEST_CASE_ST(ut_setup, ut_teardown, 12224 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 12225 12226 /** Negative tests */ 12227 TEST_CASE_ST(ut_setup, ut_teardown, 12228 authentication_verify_HMAC_SHA1_fail_data_corrupt), 12229 TEST_CASE_ST(ut_setup, ut_teardown, 12230 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 12231 TEST_CASE_ST(ut_setup, ut_teardown, 12232 test_AES_GCM_auth_encryption_fail_iv_corrupt), 12233 TEST_CASE_ST(ut_setup, ut_teardown, 12234 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 12235 TEST_CASE_ST(ut_setup, ut_teardown, 12236 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 12237 TEST_CASE_ST(ut_setup, ut_teardown, 12238 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 12239 TEST_CASE_ST(ut_setup, ut_teardown, 12240 test_AES_GCM_auth_encryption_fail_aad_corrupt), 12241 TEST_CASE_ST(ut_setup, ut_teardown, 12242 test_AES_GCM_auth_encryption_fail_tag_corrupt), 12243 TEST_CASE_ST(ut_setup, ut_teardown, 12244 test_AES_GCM_auth_decryption_fail_iv_corrupt), 12245 TEST_CASE_ST(ut_setup, ut_teardown, 12246 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 12247 TEST_CASE_ST(ut_setup, ut_teardown, 12248 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 12249 TEST_CASE_ST(ut_setup, ut_teardown, 12250 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 12251 TEST_CASE_ST(ut_setup, ut_teardown, 12252 test_AES_GCM_auth_decryption_fail_aad_corrupt), 12253 TEST_CASE_ST(ut_setup, ut_teardown, 12254 test_AES_GCM_auth_decryption_fail_tag_corrupt), 12255 TEST_CASE_ST(ut_setup, ut_teardown, 12256 authentication_verify_AES128_GMAC_fail_data_corrupt), 12257 TEST_CASE_ST(ut_setup, ut_teardown, 12258 authentication_verify_AES128_GMAC_fail_tag_corrupt), 12259 TEST_CASE_ST(ut_setup, ut_teardown, 12260 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12261 TEST_CASE_ST(ut_setup, ut_teardown, 12262 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12263 12264 /** Mixed CIPHER + HASH algorithms */ 12265 /** AUTH AES CMAC + CIPHER AES CTR */ 12266 TEST_CASE_ST(ut_setup, ut_teardown, 12267 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 12268 TEST_CASE_ST(ut_setup, ut_teardown, 12269 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 12270 TEST_CASE_ST(ut_setup, ut_teardown, 12271 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 12272 TEST_CASE_ST(ut_setup, ut_teardown, 12273 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 12274 TEST_CASE_ST(ut_setup, ut_teardown, 12275 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 12276 TEST_CASE_ST(ut_setup, ut_teardown, 12277 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 12278 TEST_CASE_ST(ut_setup, ut_teardown, 12279 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 12280 TEST_CASE_ST(ut_setup, ut_teardown, 12281 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 12282 12283 /** AUTH ZUC + CIPHER SNOW3G */ 12284 TEST_CASE_ST(ut_setup, ut_teardown, 12285 test_auth_zuc_cipher_snow_test_case_1), 12286 TEST_CASE_ST(ut_setup, ut_teardown, 12287 test_verify_auth_zuc_cipher_snow_test_case_1), 12288 /** AUTH AES CMAC + CIPHER SNOW3G */ 12289 TEST_CASE_ST(ut_setup, ut_teardown, 12290 test_auth_aes_cmac_cipher_snow_test_case_1), 12291 TEST_CASE_ST(ut_setup, ut_teardown, 12292 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 12293 /** AUTH ZUC + CIPHER AES CTR */ 12294 TEST_CASE_ST(ut_setup, ut_teardown, 12295 test_auth_zuc_cipher_aes_ctr_test_case_1), 12296 TEST_CASE_ST(ut_setup, ut_teardown, 12297 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 12298 /** AUTH SNOW3G + CIPHER AES CTR */ 12299 TEST_CASE_ST(ut_setup, ut_teardown, 12300 test_auth_snow_cipher_aes_ctr_test_case_1), 12301 TEST_CASE_ST(ut_setup, ut_teardown, 12302 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 12303 /** AUTH SNOW3G + CIPHER ZUC */ 12304 TEST_CASE_ST(ut_setup, ut_teardown, 12305 test_auth_snow_cipher_zuc_test_case_1), 12306 TEST_CASE_ST(ut_setup, ut_teardown, 12307 test_verify_auth_snow_cipher_zuc_test_case_1), 12308 /** AUTH AES CMAC + CIPHER ZUC */ 12309 TEST_CASE_ST(ut_setup, ut_teardown, 12310 test_auth_aes_cmac_cipher_zuc_test_case_1), 12311 TEST_CASE_ST(ut_setup, ut_teardown, 12312 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 12313 12314 /** AUTH NULL + CIPHER SNOW3G */ 12315 TEST_CASE_ST(ut_setup, ut_teardown, 12316 test_auth_null_cipher_snow_test_case_1), 12317 TEST_CASE_ST(ut_setup, ut_teardown, 12318 test_verify_auth_null_cipher_snow_test_case_1), 12319 /** AUTH NULL + CIPHER ZUC */ 12320 TEST_CASE_ST(ut_setup, ut_teardown, 12321 test_auth_null_cipher_zuc_test_case_1), 12322 TEST_CASE_ST(ut_setup, ut_teardown, 12323 test_verify_auth_null_cipher_zuc_test_case_1), 12324 /** AUTH SNOW3G + CIPHER NULL */ 12325 TEST_CASE_ST(ut_setup, ut_teardown, 12326 test_auth_snow_cipher_null_test_case_1), 12327 TEST_CASE_ST(ut_setup, ut_teardown, 12328 test_verify_auth_snow_cipher_null_test_case_1), 12329 /** AUTH ZUC + CIPHER NULL */ 12330 TEST_CASE_ST(ut_setup, ut_teardown, 12331 test_auth_zuc_cipher_null_test_case_1), 12332 TEST_CASE_ST(ut_setup, ut_teardown, 12333 test_verify_auth_zuc_cipher_null_test_case_1), 12334 /** AUTH NULL + CIPHER AES CTR */ 12335 TEST_CASE_ST(ut_setup, ut_teardown, 12336 test_auth_null_cipher_aes_ctr_test_case_1), 12337 TEST_CASE_ST(ut_setup, ut_teardown, 12338 test_verify_auth_null_cipher_aes_ctr_test_case_1), 12339 /** AUTH AES CMAC + CIPHER NULL */ 12340 TEST_CASE_ST(ut_setup, ut_teardown, 12341 test_auth_aes_cmac_cipher_null_test_case_1), 12342 TEST_CASE_ST(ut_setup, ut_teardown, 12343 test_verify_auth_aes_cmac_cipher_null_test_case_1), 12344 12345 TEST_CASES_END() /**< NULL terminate unit test array */ 12346 } 12347 }; 12348 12349 static struct unit_test_suite cryptodev_virtio_testsuite = { 12350 .suite_name = "Crypto VIRTIO Unit Test Suite", 12351 .setup = testsuite_setup, 12352 .teardown = testsuite_teardown, 12353 .unit_test_cases = { 12354 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12355 12356 TEST_CASES_END() /**< NULL terminate unit test array */ 12357 } 12358 }; 12359 12360 static struct unit_test_suite cryptodev_caam_jr_testsuite = { 12361 .suite_name = "Crypto CAAM JR Unit Test Suite", 12362 .setup = testsuite_setup, 12363 .teardown = testsuite_teardown, 12364 .unit_test_cases = { 12365 TEST_CASE_ST(ut_setup, ut_teardown, 12366 test_device_configure_invalid_dev_id), 12367 TEST_CASE_ST(ut_setup, ut_teardown, 12368 test_multi_session), 12369 12370 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12371 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12372 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12373 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12374 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12375 12376 TEST_CASES_END() /**< NULL terminate unit test array */ 12377 } 12378 }; 12379 12380 static struct unit_test_suite cryptodev_dpaa_sec_testsuite = { 12381 .suite_name = "Crypto DPAA_SEC Unit Test Suite", 12382 .setup = testsuite_setup, 12383 .teardown = testsuite_teardown, 12384 .unit_test_cases = { 12385 TEST_CASE_ST(ut_setup, ut_teardown, 12386 test_device_configure_invalid_dev_id), 12387 TEST_CASE_ST(ut_setup, ut_teardown, 12388 test_multi_session), 12389 12390 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12391 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12392 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12393 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12394 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12395 12396 #ifdef RTE_LIBRTE_SECURITY 12397 TEST_CASE_ST(ut_setup, ut_teardown, 12398 test_PDCP_PROTO_cplane_encap_all), 12399 12400 TEST_CASE_ST(ut_setup, ut_teardown, 12401 test_PDCP_PROTO_cplane_decap_all), 12402 12403 TEST_CASE_ST(ut_setup, ut_teardown, 12404 test_PDCP_PROTO_uplane_encap_all), 12405 12406 TEST_CASE_ST(ut_setup, ut_teardown, 12407 test_PDCP_PROTO_uplane_decap_all), 12408 12409 TEST_CASE_ST(ut_setup, ut_teardown, 12410 test_PDCP_PROTO_SGL_in_place_32B), 12411 TEST_CASE_ST(ut_setup, ut_teardown, 12412 test_PDCP_PROTO_SGL_oop_32B_128B), 12413 TEST_CASE_ST(ut_setup, ut_teardown, 12414 test_PDCP_PROTO_SGL_oop_32B_40B), 12415 TEST_CASE_ST(ut_setup, ut_teardown, 12416 test_PDCP_PROTO_SGL_oop_128B_32B), 12417 #endif 12418 /** AES GCM Authenticated Encryption */ 12419 TEST_CASE_ST(ut_setup, ut_teardown, 12420 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 12421 TEST_CASE_ST(ut_setup, ut_teardown, 12422 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 12423 TEST_CASE_ST(ut_setup, ut_teardown, 12424 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 12425 TEST_CASE_ST(ut_setup, ut_teardown, 12426 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 12427 TEST_CASE_ST(ut_setup, ut_teardown, 12428 test_AES_GCM_authenticated_encryption_test_case_1), 12429 TEST_CASE_ST(ut_setup, ut_teardown, 12430 test_AES_GCM_authenticated_encryption_test_case_2), 12431 TEST_CASE_ST(ut_setup, ut_teardown, 12432 test_AES_GCM_authenticated_encryption_test_case_3), 12433 TEST_CASE_ST(ut_setup, ut_teardown, 12434 test_AES_GCM_authenticated_encryption_test_case_4), 12435 TEST_CASE_ST(ut_setup, ut_teardown, 12436 test_AES_GCM_authenticated_encryption_test_case_5), 12437 TEST_CASE_ST(ut_setup, ut_teardown, 12438 test_AES_GCM_authenticated_encryption_test_case_6), 12439 TEST_CASE_ST(ut_setup, ut_teardown, 12440 test_AES_GCM_authenticated_encryption_test_case_7), 12441 TEST_CASE_ST(ut_setup, ut_teardown, 12442 test_AES_GCM_authenticated_encryption_test_case_8), 12443 12444 /** AES GCM Authenticated Decryption */ 12445 TEST_CASE_ST(ut_setup, ut_teardown, 12446 test_AES_GCM_authenticated_decryption_test_case_1), 12447 TEST_CASE_ST(ut_setup, ut_teardown, 12448 test_AES_GCM_authenticated_decryption_test_case_2), 12449 TEST_CASE_ST(ut_setup, ut_teardown, 12450 test_AES_GCM_authenticated_decryption_test_case_3), 12451 TEST_CASE_ST(ut_setup, ut_teardown, 12452 test_AES_GCM_authenticated_decryption_test_case_4), 12453 TEST_CASE_ST(ut_setup, ut_teardown, 12454 test_AES_GCM_authenticated_decryption_test_case_5), 12455 TEST_CASE_ST(ut_setup, ut_teardown, 12456 test_AES_GCM_authenticated_decryption_test_case_6), 12457 TEST_CASE_ST(ut_setup, ut_teardown, 12458 test_AES_GCM_authenticated_decryption_test_case_7), 12459 TEST_CASE_ST(ut_setup, ut_teardown, 12460 test_AES_GCM_authenticated_decryption_test_case_8), 12461 12462 /** AES GCM Authenticated Encryption 192 bits key */ 12463 TEST_CASE_ST(ut_setup, ut_teardown, 12464 test_AES_GCM_auth_encryption_test_case_192_1), 12465 TEST_CASE_ST(ut_setup, ut_teardown, 12466 test_AES_GCM_auth_encryption_test_case_192_2), 12467 TEST_CASE_ST(ut_setup, ut_teardown, 12468 test_AES_GCM_auth_encryption_test_case_192_3), 12469 TEST_CASE_ST(ut_setup, ut_teardown, 12470 test_AES_GCM_auth_encryption_test_case_192_4), 12471 TEST_CASE_ST(ut_setup, ut_teardown, 12472 test_AES_GCM_auth_encryption_test_case_192_5), 12473 TEST_CASE_ST(ut_setup, ut_teardown, 12474 test_AES_GCM_auth_encryption_test_case_192_6), 12475 TEST_CASE_ST(ut_setup, ut_teardown, 12476 test_AES_GCM_auth_encryption_test_case_192_7), 12477 12478 /** AES GCM Authenticated Decryption 192 bits key */ 12479 TEST_CASE_ST(ut_setup, ut_teardown, 12480 test_AES_GCM_auth_decryption_test_case_192_1), 12481 TEST_CASE_ST(ut_setup, ut_teardown, 12482 test_AES_GCM_auth_decryption_test_case_192_2), 12483 TEST_CASE_ST(ut_setup, ut_teardown, 12484 test_AES_GCM_auth_decryption_test_case_192_3), 12485 TEST_CASE_ST(ut_setup, ut_teardown, 12486 test_AES_GCM_auth_decryption_test_case_192_4), 12487 TEST_CASE_ST(ut_setup, ut_teardown, 12488 test_AES_GCM_auth_decryption_test_case_192_5), 12489 TEST_CASE_ST(ut_setup, ut_teardown, 12490 test_AES_GCM_auth_decryption_test_case_192_6), 12491 TEST_CASE_ST(ut_setup, ut_teardown, 12492 test_AES_GCM_auth_decryption_test_case_192_7), 12493 12494 /** AES GCM Authenticated Encryption 256 bits key */ 12495 TEST_CASE_ST(ut_setup, ut_teardown, 12496 test_AES_GCM_auth_encryption_test_case_256_1), 12497 TEST_CASE_ST(ut_setup, ut_teardown, 12498 test_AES_GCM_auth_encryption_test_case_256_2), 12499 TEST_CASE_ST(ut_setup, ut_teardown, 12500 test_AES_GCM_auth_encryption_test_case_256_3), 12501 TEST_CASE_ST(ut_setup, ut_teardown, 12502 test_AES_GCM_auth_encryption_test_case_256_4), 12503 TEST_CASE_ST(ut_setup, ut_teardown, 12504 test_AES_GCM_auth_encryption_test_case_256_5), 12505 TEST_CASE_ST(ut_setup, ut_teardown, 12506 test_AES_GCM_auth_encryption_test_case_256_6), 12507 TEST_CASE_ST(ut_setup, ut_teardown, 12508 test_AES_GCM_auth_encryption_test_case_256_7), 12509 12510 /** AES GCM Authenticated Decryption 256 bits key */ 12511 TEST_CASE_ST(ut_setup, ut_teardown, 12512 test_AES_GCM_auth_decryption_test_case_256_1), 12513 TEST_CASE_ST(ut_setup, ut_teardown, 12514 test_AES_GCM_auth_decryption_test_case_256_2), 12515 TEST_CASE_ST(ut_setup, ut_teardown, 12516 test_AES_GCM_auth_decryption_test_case_256_3), 12517 TEST_CASE_ST(ut_setup, ut_teardown, 12518 test_AES_GCM_auth_decryption_test_case_256_4), 12519 TEST_CASE_ST(ut_setup, ut_teardown, 12520 test_AES_GCM_auth_decryption_test_case_256_5), 12521 TEST_CASE_ST(ut_setup, ut_teardown, 12522 test_AES_GCM_auth_decryption_test_case_256_6), 12523 TEST_CASE_ST(ut_setup, ut_teardown, 12524 test_AES_GCM_auth_decryption_test_case_256_7), 12525 12526 /** Out of place tests */ 12527 TEST_CASE_ST(ut_setup, ut_teardown, 12528 test_AES_GCM_authenticated_encryption_oop_test_case_1), 12529 TEST_CASE_ST(ut_setup, ut_teardown, 12530 test_AES_GCM_authenticated_decryption_oop_test_case_1), 12531 12532 /** SNOW 3G encrypt only (UEA2) */ 12533 TEST_CASE_ST(ut_setup, ut_teardown, 12534 test_snow3g_encryption_test_case_1), 12535 TEST_CASE_ST(ut_setup, ut_teardown, 12536 test_snow3g_encryption_test_case_2), 12537 TEST_CASE_ST(ut_setup, ut_teardown, 12538 test_snow3g_encryption_test_case_3), 12539 TEST_CASE_ST(ut_setup, ut_teardown, 12540 test_snow3g_encryption_test_case_4), 12541 TEST_CASE_ST(ut_setup, ut_teardown, 12542 test_snow3g_encryption_test_case_5), 12543 12544 TEST_CASE_ST(ut_setup, ut_teardown, 12545 test_snow3g_encryption_test_case_1_oop), 12546 TEST_CASE_ST(ut_setup, ut_teardown, 12547 test_snow3g_encryption_test_case_1_oop_sgl), 12548 TEST_CASE_ST(ut_setup, ut_teardown, 12549 test_snow3g_decryption_test_case_1_oop), 12550 12551 /** SNOW 3G decrypt only (UEA2) */ 12552 TEST_CASE_ST(ut_setup, ut_teardown, 12553 test_snow3g_decryption_test_case_1), 12554 TEST_CASE_ST(ut_setup, ut_teardown, 12555 test_snow3g_decryption_test_case_2), 12556 TEST_CASE_ST(ut_setup, ut_teardown, 12557 test_snow3g_decryption_test_case_3), 12558 TEST_CASE_ST(ut_setup, ut_teardown, 12559 test_snow3g_decryption_test_case_4), 12560 TEST_CASE_ST(ut_setup, ut_teardown, 12561 test_snow3g_decryption_test_case_5), 12562 12563 TEST_CASE_ST(ut_setup, ut_teardown, 12564 test_snow3g_hash_generate_test_case_1), 12565 TEST_CASE_ST(ut_setup, ut_teardown, 12566 test_snow3g_hash_generate_test_case_2), 12567 TEST_CASE_ST(ut_setup, ut_teardown, 12568 test_snow3g_hash_generate_test_case_3), 12569 TEST_CASE_ST(ut_setup, ut_teardown, 12570 test_snow3g_hash_verify_test_case_1), 12571 TEST_CASE_ST(ut_setup, ut_teardown, 12572 test_snow3g_hash_verify_test_case_2), 12573 TEST_CASE_ST(ut_setup, ut_teardown, 12574 test_snow3g_hash_verify_test_case_3), 12575 12576 /** ZUC encrypt only (EEA3) */ 12577 TEST_CASE_ST(ut_setup, ut_teardown, 12578 test_zuc_encryption_test_case_1), 12579 TEST_CASE_ST(ut_setup, ut_teardown, 12580 test_zuc_encryption_test_case_2), 12581 TEST_CASE_ST(ut_setup, ut_teardown, 12582 test_zuc_encryption_test_case_3), 12583 TEST_CASE_ST(ut_setup, ut_teardown, 12584 test_zuc_encryption_test_case_4), 12585 TEST_CASE_ST(ut_setup, ut_teardown, 12586 test_zuc_encryption_test_case_5), 12587 12588 /** ZUC authenticate (EIA3) */ 12589 TEST_CASE_ST(ut_setup, ut_teardown, 12590 test_zuc_hash_generate_test_case_6), 12591 TEST_CASE_ST(ut_setup, ut_teardown, 12592 test_zuc_hash_generate_test_case_7), 12593 TEST_CASE_ST(ut_setup, ut_teardown, 12594 test_zuc_hash_generate_test_case_8), 12595 12596 /** Negative tests */ 12597 TEST_CASE_ST(ut_setup, ut_teardown, 12598 test_AES_GCM_auth_encryption_fail_iv_corrupt), 12599 TEST_CASE_ST(ut_setup, ut_teardown, 12600 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 12601 TEST_CASE_ST(ut_setup, ut_teardown, 12602 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 12603 TEST_CASE_ST(ut_setup, ut_teardown, 12604 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 12605 TEST_CASE_ST(ut_setup, ut_teardown, 12606 test_AES_GCM_auth_encryption_fail_aad_corrupt), 12607 TEST_CASE_ST(ut_setup, ut_teardown, 12608 test_AES_GCM_auth_encryption_fail_tag_corrupt), 12609 TEST_CASE_ST(ut_setup, ut_teardown, 12610 test_AES_GCM_auth_decryption_fail_iv_corrupt), 12611 TEST_CASE_ST(ut_setup, ut_teardown, 12612 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 12613 TEST_CASE_ST(ut_setup, ut_teardown, 12614 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 12615 TEST_CASE_ST(ut_setup, ut_teardown, 12616 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 12617 TEST_CASE_ST(ut_setup, ut_teardown, 12618 test_AES_GCM_auth_decryption_fail_aad_corrupt), 12619 TEST_CASE_ST(ut_setup, ut_teardown, 12620 test_AES_GCM_auth_decryption_fail_tag_corrupt), 12621 TEST_CASE_ST(ut_setup, ut_teardown, 12622 authentication_verify_HMAC_SHA1_fail_data_corrupt), 12623 TEST_CASE_ST(ut_setup, ut_teardown, 12624 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 12625 TEST_CASE_ST(ut_setup, ut_teardown, 12626 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12627 TEST_CASE_ST(ut_setup, ut_teardown, 12628 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12629 12630 /* ESN Testcase */ 12631 TEST_CASE_ST(ut_setup, ut_teardown, 12632 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 12633 TEST_CASE_ST(ut_setup, ut_teardown, 12634 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 12635 12636 TEST_CASES_END() /**< NULL terminate unit test array */ 12637 } 12638 }; 12639 12640 static struct unit_test_suite cryptodev_dpaa2_sec_testsuite = { 12641 .suite_name = "Crypto DPAA2_SEC Unit Test Suite", 12642 .setup = testsuite_setup, 12643 .teardown = testsuite_teardown, 12644 .unit_test_cases = { 12645 TEST_CASE_ST(ut_setup, ut_teardown, 12646 test_device_configure_invalid_dev_id), 12647 TEST_CASE_ST(ut_setup, ut_teardown, 12648 test_multi_session), 12649 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12650 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12651 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12652 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12653 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12654 12655 #ifdef RTE_LIBRTE_SECURITY 12656 TEST_CASE_ST(ut_setup, ut_teardown, 12657 test_PDCP_PROTO_cplane_encap_all), 12658 12659 TEST_CASE_ST(ut_setup, ut_teardown, 12660 test_PDCP_PROTO_cplane_decap_all), 12661 12662 TEST_CASE_ST(ut_setup, ut_teardown, 12663 test_PDCP_PROTO_uplane_encap_all), 12664 12665 TEST_CASE_ST(ut_setup, ut_teardown, 12666 test_PDCP_PROTO_uplane_decap_all), 12667 12668 TEST_CASE_ST(ut_setup, ut_teardown, 12669 test_PDCP_PROTO_SGL_in_place_32B), 12670 TEST_CASE_ST(ut_setup, ut_teardown, 12671 test_PDCP_PROTO_SGL_oop_32B_128B), 12672 TEST_CASE_ST(ut_setup, ut_teardown, 12673 test_PDCP_PROTO_SGL_oop_32B_40B), 12674 TEST_CASE_ST(ut_setup, ut_teardown, 12675 test_PDCP_PROTO_SGL_oop_128B_32B), 12676 #endif 12677 /** AES GCM Authenticated Encryption */ 12678 TEST_CASE_ST(ut_setup, ut_teardown, 12679 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 12680 TEST_CASE_ST(ut_setup, ut_teardown, 12681 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 12682 TEST_CASE_ST(ut_setup, ut_teardown, 12683 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 12684 TEST_CASE_ST(ut_setup, ut_teardown, 12685 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 12686 TEST_CASE_ST(ut_setup, ut_teardown, 12687 test_AES_GCM_authenticated_encryption_test_case_1), 12688 TEST_CASE_ST(ut_setup, ut_teardown, 12689 test_AES_GCM_authenticated_encryption_test_case_2), 12690 TEST_CASE_ST(ut_setup, ut_teardown, 12691 test_AES_GCM_authenticated_encryption_test_case_3), 12692 TEST_CASE_ST(ut_setup, ut_teardown, 12693 test_AES_GCM_authenticated_encryption_test_case_4), 12694 TEST_CASE_ST(ut_setup, ut_teardown, 12695 test_AES_GCM_authenticated_encryption_test_case_5), 12696 TEST_CASE_ST(ut_setup, ut_teardown, 12697 test_AES_GCM_authenticated_encryption_test_case_6), 12698 TEST_CASE_ST(ut_setup, ut_teardown, 12699 test_AES_GCM_authenticated_encryption_test_case_7), 12700 TEST_CASE_ST(ut_setup, ut_teardown, 12701 test_AES_GCM_authenticated_encryption_test_case_8), 12702 12703 /** AES GCM Authenticated Decryption */ 12704 TEST_CASE_ST(ut_setup, ut_teardown, 12705 test_AES_GCM_authenticated_decryption_test_case_1), 12706 TEST_CASE_ST(ut_setup, ut_teardown, 12707 test_AES_GCM_authenticated_decryption_test_case_2), 12708 TEST_CASE_ST(ut_setup, ut_teardown, 12709 test_AES_GCM_authenticated_decryption_test_case_3), 12710 TEST_CASE_ST(ut_setup, ut_teardown, 12711 test_AES_GCM_authenticated_decryption_test_case_4), 12712 TEST_CASE_ST(ut_setup, ut_teardown, 12713 test_AES_GCM_authenticated_decryption_test_case_5), 12714 TEST_CASE_ST(ut_setup, ut_teardown, 12715 test_AES_GCM_authenticated_decryption_test_case_6), 12716 TEST_CASE_ST(ut_setup, ut_teardown, 12717 test_AES_GCM_authenticated_decryption_test_case_7), 12718 TEST_CASE_ST(ut_setup, ut_teardown, 12719 test_AES_GCM_authenticated_decryption_test_case_8), 12720 12721 /** AES GCM Authenticated Encryption 192 bits key */ 12722 TEST_CASE_ST(ut_setup, ut_teardown, 12723 test_AES_GCM_auth_encryption_test_case_192_1), 12724 TEST_CASE_ST(ut_setup, ut_teardown, 12725 test_AES_GCM_auth_encryption_test_case_192_2), 12726 TEST_CASE_ST(ut_setup, ut_teardown, 12727 test_AES_GCM_auth_encryption_test_case_192_3), 12728 TEST_CASE_ST(ut_setup, ut_teardown, 12729 test_AES_GCM_auth_encryption_test_case_192_4), 12730 TEST_CASE_ST(ut_setup, ut_teardown, 12731 test_AES_GCM_auth_encryption_test_case_192_5), 12732 TEST_CASE_ST(ut_setup, ut_teardown, 12733 test_AES_GCM_auth_encryption_test_case_192_6), 12734 TEST_CASE_ST(ut_setup, ut_teardown, 12735 test_AES_GCM_auth_encryption_test_case_192_7), 12736 12737 /** AES GCM Authenticated Decryption 192 bits key */ 12738 TEST_CASE_ST(ut_setup, ut_teardown, 12739 test_AES_GCM_auth_decryption_test_case_192_1), 12740 TEST_CASE_ST(ut_setup, ut_teardown, 12741 test_AES_GCM_auth_decryption_test_case_192_2), 12742 TEST_CASE_ST(ut_setup, ut_teardown, 12743 test_AES_GCM_auth_decryption_test_case_192_3), 12744 TEST_CASE_ST(ut_setup, ut_teardown, 12745 test_AES_GCM_auth_decryption_test_case_192_4), 12746 TEST_CASE_ST(ut_setup, ut_teardown, 12747 test_AES_GCM_auth_decryption_test_case_192_5), 12748 TEST_CASE_ST(ut_setup, ut_teardown, 12749 test_AES_GCM_auth_decryption_test_case_192_6), 12750 TEST_CASE_ST(ut_setup, ut_teardown, 12751 test_AES_GCM_auth_decryption_test_case_192_7), 12752 12753 /** AES GCM Authenticated Encryption 256 bits key */ 12754 TEST_CASE_ST(ut_setup, ut_teardown, 12755 test_AES_GCM_auth_encryption_test_case_256_1), 12756 TEST_CASE_ST(ut_setup, ut_teardown, 12757 test_AES_GCM_auth_encryption_test_case_256_2), 12758 TEST_CASE_ST(ut_setup, ut_teardown, 12759 test_AES_GCM_auth_encryption_test_case_256_3), 12760 TEST_CASE_ST(ut_setup, ut_teardown, 12761 test_AES_GCM_auth_encryption_test_case_256_4), 12762 TEST_CASE_ST(ut_setup, ut_teardown, 12763 test_AES_GCM_auth_encryption_test_case_256_5), 12764 TEST_CASE_ST(ut_setup, ut_teardown, 12765 test_AES_GCM_auth_encryption_test_case_256_6), 12766 TEST_CASE_ST(ut_setup, ut_teardown, 12767 test_AES_GCM_auth_encryption_test_case_256_7), 12768 12769 /** AES GCM Authenticated Decryption 256 bits key */ 12770 TEST_CASE_ST(ut_setup, ut_teardown, 12771 test_AES_GCM_auth_decryption_test_case_256_1), 12772 TEST_CASE_ST(ut_setup, ut_teardown, 12773 test_AES_GCM_auth_decryption_test_case_256_2), 12774 TEST_CASE_ST(ut_setup, ut_teardown, 12775 test_AES_GCM_auth_decryption_test_case_256_3), 12776 TEST_CASE_ST(ut_setup, ut_teardown, 12777 test_AES_GCM_auth_decryption_test_case_256_4), 12778 TEST_CASE_ST(ut_setup, ut_teardown, 12779 test_AES_GCM_auth_decryption_test_case_256_5), 12780 TEST_CASE_ST(ut_setup, ut_teardown, 12781 test_AES_GCM_auth_decryption_test_case_256_6), 12782 TEST_CASE_ST(ut_setup, ut_teardown, 12783 test_AES_GCM_auth_decryption_test_case_256_7), 12784 12785 /** Out of place tests */ 12786 TEST_CASE_ST(ut_setup, ut_teardown, 12787 test_AES_GCM_authenticated_encryption_oop_test_case_1), 12788 TEST_CASE_ST(ut_setup, ut_teardown, 12789 test_AES_GCM_authenticated_decryption_oop_test_case_1), 12790 12791 /** SNOW 3G encrypt only (UEA2) */ 12792 TEST_CASE_ST(ut_setup, ut_teardown, 12793 test_snow3g_encryption_test_case_1), 12794 TEST_CASE_ST(ut_setup, ut_teardown, 12795 test_snow3g_encryption_test_case_2), 12796 TEST_CASE_ST(ut_setup, ut_teardown, 12797 test_snow3g_encryption_test_case_3), 12798 TEST_CASE_ST(ut_setup, ut_teardown, 12799 test_snow3g_encryption_test_case_4), 12800 TEST_CASE_ST(ut_setup, ut_teardown, 12801 test_snow3g_encryption_test_case_5), 12802 12803 TEST_CASE_ST(ut_setup, ut_teardown, 12804 test_snow3g_encryption_test_case_1_oop), 12805 TEST_CASE_ST(ut_setup, ut_teardown, 12806 test_snow3g_encryption_test_case_1_oop_sgl), 12807 TEST_CASE_ST(ut_setup, ut_teardown, 12808 test_snow3g_decryption_test_case_1_oop), 12809 12810 /** SNOW 3G decrypt only (UEA2) */ 12811 TEST_CASE_ST(ut_setup, ut_teardown, 12812 test_snow3g_decryption_test_case_1), 12813 TEST_CASE_ST(ut_setup, ut_teardown, 12814 test_snow3g_decryption_test_case_2), 12815 TEST_CASE_ST(ut_setup, ut_teardown, 12816 test_snow3g_decryption_test_case_3), 12817 TEST_CASE_ST(ut_setup, ut_teardown, 12818 test_snow3g_decryption_test_case_4), 12819 TEST_CASE_ST(ut_setup, ut_teardown, 12820 test_snow3g_decryption_test_case_5), 12821 12822 TEST_CASE_ST(ut_setup, ut_teardown, 12823 test_snow3g_hash_generate_test_case_1), 12824 TEST_CASE_ST(ut_setup, ut_teardown, 12825 test_snow3g_hash_generate_test_case_2), 12826 TEST_CASE_ST(ut_setup, ut_teardown, 12827 test_snow3g_hash_generate_test_case_3), 12828 TEST_CASE_ST(ut_setup, ut_teardown, 12829 test_snow3g_hash_verify_test_case_1), 12830 TEST_CASE_ST(ut_setup, ut_teardown, 12831 test_snow3g_hash_verify_test_case_2), 12832 TEST_CASE_ST(ut_setup, ut_teardown, 12833 test_snow3g_hash_verify_test_case_3), 12834 12835 /** ZUC encrypt only (EEA3) */ 12836 TEST_CASE_ST(ut_setup, ut_teardown, 12837 test_zuc_encryption_test_case_1), 12838 TEST_CASE_ST(ut_setup, ut_teardown, 12839 test_zuc_encryption_test_case_2), 12840 TEST_CASE_ST(ut_setup, ut_teardown, 12841 test_zuc_encryption_test_case_3), 12842 TEST_CASE_ST(ut_setup, ut_teardown, 12843 test_zuc_encryption_test_case_4), 12844 TEST_CASE_ST(ut_setup, ut_teardown, 12845 test_zuc_encryption_test_case_5), 12846 12847 /** ZUC authenticate (EIA3) */ 12848 TEST_CASE_ST(ut_setup, ut_teardown, 12849 test_zuc_hash_generate_test_case_6), 12850 TEST_CASE_ST(ut_setup, ut_teardown, 12851 test_zuc_hash_generate_test_case_7), 12852 TEST_CASE_ST(ut_setup, ut_teardown, 12853 test_zuc_hash_generate_test_case_8), 12854 12855 /** HMAC_MD5 Authentication */ 12856 TEST_CASE_ST(ut_setup, ut_teardown, 12857 test_MD5_HMAC_generate_case_1), 12858 TEST_CASE_ST(ut_setup, ut_teardown, 12859 test_MD5_HMAC_verify_case_1), 12860 TEST_CASE_ST(ut_setup, ut_teardown, 12861 test_MD5_HMAC_generate_case_2), 12862 TEST_CASE_ST(ut_setup, ut_teardown, 12863 test_MD5_HMAC_verify_case_2), 12864 12865 /** Negative tests */ 12866 TEST_CASE_ST(ut_setup, ut_teardown, 12867 test_AES_GCM_auth_encryption_fail_iv_corrupt), 12868 TEST_CASE_ST(ut_setup, ut_teardown, 12869 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 12870 TEST_CASE_ST(ut_setup, ut_teardown, 12871 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 12872 TEST_CASE_ST(ut_setup, ut_teardown, 12873 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 12874 TEST_CASE_ST(ut_setup, ut_teardown, 12875 test_AES_GCM_auth_encryption_fail_aad_corrupt), 12876 TEST_CASE_ST(ut_setup, ut_teardown, 12877 test_AES_GCM_auth_encryption_fail_tag_corrupt), 12878 TEST_CASE_ST(ut_setup, ut_teardown, 12879 test_AES_GCM_auth_decryption_fail_iv_corrupt), 12880 TEST_CASE_ST(ut_setup, ut_teardown, 12881 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 12882 TEST_CASE_ST(ut_setup, ut_teardown, 12883 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 12884 TEST_CASE_ST(ut_setup, ut_teardown, 12885 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 12886 TEST_CASE_ST(ut_setup, ut_teardown, 12887 test_AES_GCM_auth_decryption_fail_aad_corrupt), 12888 TEST_CASE_ST(ut_setup, ut_teardown, 12889 test_AES_GCM_auth_decryption_fail_tag_corrupt), 12890 TEST_CASE_ST(ut_setup, ut_teardown, 12891 authentication_verify_HMAC_SHA1_fail_data_corrupt), 12892 TEST_CASE_ST(ut_setup, ut_teardown, 12893 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 12894 TEST_CASE_ST(ut_setup, ut_teardown, 12895 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12896 TEST_CASE_ST(ut_setup, ut_teardown, 12897 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12898 12899 /* ESN Testcase */ 12900 TEST_CASE_ST(ut_setup, ut_teardown, 12901 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 12902 12903 TEST_CASE_ST(ut_setup, ut_teardown, 12904 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 12905 12906 TEST_CASES_END() /**< NULL terminate unit test array */ 12907 } 12908 }; 12909 12910 static struct unit_test_suite cryptodev_armv8_testsuite = { 12911 .suite_name = "Crypto Device ARMv8 Unit Test Suite", 12912 .setup = testsuite_setup, 12913 .teardown = testsuite_teardown, 12914 .unit_test_cases = { 12915 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12916 12917 /** Negative tests */ 12918 TEST_CASE_ST(ut_setup, ut_teardown, 12919 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12920 TEST_CASE_ST(ut_setup, ut_teardown, 12921 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12922 12923 TEST_CASES_END() /**< NULL terminate unit test array */ 12924 } 12925 }; 12926 12927 static struct unit_test_suite cryptodev_mrvl_testsuite = { 12928 .suite_name = "Crypto Device Marvell Component Test Suite", 12929 .setup = testsuite_setup, 12930 .teardown = testsuite_teardown, 12931 .unit_test_cases = { 12932 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 12933 TEST_CASE_ST(ut_setup, ut_teardown, 12934 test_multi_session_random_usage), 12935 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12936 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12937 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12938 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12939 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12940 12941 /** Negative tests */ 12942 TEST_CASE_ST(ut_setup, ut_teardown, 12943 authentication_verify_HMAC_SHA1_fail_data_corrupt), 12944 TEST_CASE_ST(ut_setup, ut_teardown, 12945 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 12946 TEST_CASE_ST(ut_setup, ut_teardown, 12947 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12948 TEST_CASE_ST(ut_setup, ut_teardown, 12949 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12950 12951 TEST_CASES_END() /**< NULL terminate unit test array */ 12952 } 12953 }; 12954 12955 static struct unit_test_suite cryptodev_ccp_testsuite = { 12956 .suite_name = "Crypto Device CCP Unit Test Suite", 12957 .setup = testsuite_setup, 12958 .teardown = testsuite_teardown, 12959 .unit_test_cases = { 12960 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 12961 TEST_CASE_ST(ut_setup, ut_teardown, 12962 test_multi_session_random_usage), 12963 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12964 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12965 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12966 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12967 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12968 12969 /** Negative tests */ 12970 TEST_CASE_ST(ut_setup, ut_teardown, 12971 authentication_verify_HMAC_SHA1_fail_data_corrupt), 12972 TEST_CASE_ST(ut_setup, ut_teardown, 12973 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 12974 TEST_CASE_ST(ut_setup, ut_teardown, 12975 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 12976 TEST_CASE_ST(ut_setup, ut_teardown, 12977 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 12978 12979 TEST_CASES_END() /**< NULL terminate unit test array */ 12980 } 12981 }; 12982 12983 static struct unit_test_suite cryptodev_octeontx_testsuite = { 12984 .suite_name = "Crypto Device OCTEONTX Unit Test Suite", 12985 .setup = testsuite_setup, 12986 .teardown = testsuite_teardown, 12987 .unit_test_cases = { 12988 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 12989 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 12990 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 12991 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 12992 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 12993 12994 /** AES GCM Authenticated Encryption */ 12995 TEST_CASE_ST(ut_setup, ut_teardown, 12996 test_AES_GCM_authenticated_encryption_test_case_1), 12997 TEST_CASE_ST(ut_setup, ut_teardown, 12998 test_AES_GCM_authenticated_encryption_test_case_2), 12999 TEST_CASE_ST(ut_setup, ut_teardown, 13000 test_AES_GCM_authenticated_encryption_test_case_3), 13001 TEST_CASE_ST(ut_setup, ut_teardown, 13002 test_AES_GCM_authenticated_encryption_test_case_4), 13003 TEST_CASE_ST(ut_setup, ut_teardown, 13004 test_AES_GCM_authenticated_encryption_test_case_5), 13005 TEST_CASE_ST(ut_setup, ut_teardown, 13006 test_AES_GCM_authenticated_encryption_test_case_6), 13007 TEST_CASE_ST(ut_setup, ut_teardown, 13008 test_AES_GCM_authenticated_encryption_test_case_7), 13009 13010 /** AES GCM Authenticated Decryption */ 13011 TEST_CASE_ST(ut_setup, ut_teardown, 13012 test_AES_GCM_authenticated_decryption_test_case_1), 13013 TEST_CASE_ST(ut_setup, ut_teardown, 13014 test_AES_GCM_authenticated_decryption_test_case_2), 13015 TEST_CASE_ST(ut_setup, ut_teardown, 13016 test_AES_GCM_authenticated_decryption_test_case_3), 13017 TEST_CASE_ST(ut_setup, ut_teardown, 13018 test_AES_GCM_authenticated_decryption_test_case_4), 13019 TEST_CASE_ST(ut_setup, ut_teardown, 13020 test_AES_GCM_authenticated_decryption_test_case_5), 13021 TEST_CASE_ST(ut_setup, ut_teardown, 13022 test_AES_GCM_authenticated_decryption_test_case_6), 13023 TEST_CASE_ST(ut_setup, ut_teardown, 13024 test_AES_GCM_authenticated_decryption_test_case_7), 13025 /** AES GMAC Authentication */ 13026 TEST_CASE_ST(ut_setup, ut_teardown, 13027 test_AES_GMAC_authentication_test_case_1), 13028 TEST_CASE_ST(ut_setup, ut_teardown, 13029 test_AES_GMAC_authentication_verify_test_case_1), 13030 TEST_CASE_ST(ut_setup, ut_teardown, 13031 test_AES_GMAC_authentication_test_case_2), 13032 TEST_CASE_ST(ut_setup, ut_teardown, 13033 test_AES_GMAC_authentication_verify_test_case_2), 13034 TEST_CASE_ST(ut_setup, ut_teardown, 13035 test_AES_GMAC_authentication_test_case_3), 13036 TEST_CASE_ST(ut_setup, ut_teardown, 13037 test_AES_GMAC_authentication_verify_test_case_3), 13038 13039 /** SNOW 3G encrypt only (UEA2) */ 13040 TEST_CASE_ST(ut_setup, ut_teardown, 13041 test_snow3g_encryption_test_case_1), 13042 TEST_CASE_ST(ut_setup, ut_teardown, 13043 test_snow3g_encryption_test_case_2), 13044 TEST_CASE_ST(ut_setup, ut_teardown, 13045 test_snow3g_encryption_test_case_3), 13046 TEST_CASE_ST(ut_setup, ut_teardown, 13047 test_snow3g_encryption_test_case_4), 13048 TEST_CASE_ST(ut_setup, ut_teardown, 13049 test_snow3g_encryption_test_case_5), 13050 13051 TEST_CASE_ST(ut_setup, ut_teardown, 13052 test_snow3g_encryption_test_case_1_oop), 13053 TEST_CASE_ST(ut_setup, ut_teardown, 13054 test_snow3g_decryption_test_case_1_oop), 13055 TEST_CASE_ST(ut_setup, ut_teardown, 13056 test_snow3g_encryption_test_case_1_oop_sgl), 13057 13058 /** SNOW 3G decrypt only (UEA2) */ 13059 TEST_CASE_ST(ut_setup, ut_teardown, 13060 test_snow3g_decryption_test_case_1), 13061 TEST_CASE_ST(ut_setup, ut_teardown, 13062 test_snow3g_decryption_test_case_2), 13063 TEST_CASE_ST(ut_setup, ut_teardown, 13064 test_snow3g_decryption_test_case_3), 13065 TEST_CASE_ST(ut_setup, ut_teardown, 13066 test_snow3g_decryption_test_case_4), 13067 TEST_CASE_ST(ut_setup, ut_teardown, 13068 test_snow3g_decryption_test_case_5), 13069 13070 TEST_CASE_ST(ut_setup, ut_teardown, 13071 test_snow3g_hash_generate_test_case_1), 13072 TEST_CASE_ST(ut_setup, ut_teardown, 13073 test_snow3g_hash_generate_test_case_2), 13074 TEST_CASE_ST(ut_setup, ut_teardown, 13075 test_snow3g_hash_generate_test_case_3), 13076 TEST_CASE_ST(ut_setup, ut_teardown, 13077 test_snow3g_hash_verify_test_case_1), 13078 TEST_CASE_ST(ut_setup, ut_teardown, 13079 test_snow3g_hash_verify_test_case_2), 13080 TEST_CASE_ST(ut_setup, ut_teardown, 13081 test_snow3g_hash_verify_test_case_3), 13082 13083 /** ZUC encrypt only (EEA3) */ 13084 TEST_CASE_ST(ut_setup, ut_teardown, 13085 test_zuc_encryption_test_case_1), 13086 TEST_CASE_ST(ut_setup, ut_teardown, 13087 test_zuc_encryption_test_case_2), 13088 TEST_CASE_ST(ut_setup, ut_teardown, 13089 test_zuc_encryption_test_case_3), 13090 TEST_CASE_ST(ut_setup, ut_teardown, 13091 test_zuc_encryption_test_case_4), 13092 TEST_CASE_ST(ut_setup, ut_teardown, 13093 test_zuc_encryption_test_case_5), 13094 TEST_CASE_ST(ut_setup, ut_teardown, 13095 test_zuc_hash_generate_test_case_1), 13096 TEST_CASE_ST(ut_setup, ut_teardown, 13097 test_zuc_hash_generate_test_case_2), 13098 TEST_CASE_ST(ut_setup, ut_teardown, 13099 test_zuc_hash_generate_test_case_3), 13100 TEST_CASE_ST(ut_setup, ut_teardown, 13101 test_zuc_hash_generate_test_case_4), 13102 TEST_CASE_ST(ut_setup, ut_teardown, 13103 test_zuc_hash_generate_test_case_5), 13104 TEST_CASE_ST(ut_setup, ut_teardown, 13105 test_zuc_encryption_test_case_6_sgl), 13106 13107 /** KASUMI encrypt only (UEA1) */ 13108 TEST_CASE_ST(ut_setup, ut_teardown, 13109 test_kasumi_encryption_test_case_1), 13110 TEST_CASE_ST(ut_setup, ut_teardown, 13111 test_kasumi_encryption_test_case_2), 13112 TEST_CASE_ST(ut_setup, ut_teardown, 13113 test_kasumi_encryption_test_case_3), 13114 TEST_CASE_ST(ut_setup, ut_teardown, 13115 test_kasumi_encryption_test_case_4), 13116 TEST_CASE_ST(ut_setup, ut_teardown, 13117 test_kasumi_encryption_test_case_5), 13118 TEST_CASE_ST(ut_setup, ut_teardown, 13119 test_kasumi_encryption_test_case_1_sgl), 13120 TEST_CASE_ST(ut_setup, ut_teardown, 13121 test_kasumi_encryption_test_case_1_oop_sgl), 13122 /** KASUMI decrypt only (UEA1) */ 13123 TEST_CASE_ST(ut_setup, ut_teardown, 13124 test_kasumi_decryption_test_case_1), 13125 TEST_CASE_ST(ut_setup, ut_teardown, 13126 test_kasumi_decryption_test_case_2), 13127 TEST_CASE_ST(ut_setup, ut_teardown, 13128 test_kasumi_decryption_test_case_3), 13129 TEST_CASE_ST(ut_setup, ut_teardown, 13130 test_kasumi_decryption_test_case_4), 13131 TEST_CASE_ST(ut_setup, ut_teardown, 13132 test_kasumi_decryption_test_case_5), 13133 13134 TEST_CASE_ST(ut_setup, ut_teardown, 13135 test_kasumi_encryption_test_case_1_oop), 13136 TEST_CASE_ST(ut_setup, ut_teardown, 13137 test_kasumi_decryption_test_case_1_oop), 13138 13139 /** KASUMI hash only (UIA1) */ 13140 TEST_CASE_ST(ut_setup, ut_teardown, 13141 test_kasumi_hash_generate_test_case_1), 13142 TEST_CASE_ST(ut_setup, ut_teardown, 13143 test_kasumi_hash_generate_test_case_2), 13144 TEST_CASE_ST(ut_setup, ut_teardown, 13145 test_kasumi_hash_generate_test_case_3), 13146 TEST_CASE_ST(ut_setup, ut_teardown, 13147 test_kasumi_hash_generate_test_case_4), 13148 TEST_CASE_ST(ut_setup, ut_teardown, 13149 test_kasumi_hash_generate_test_case_5), 13150 TEST_CASE_ST(ut_setup, ut_teardown, 13151 test_kasumi_hash_generate_test_case_6), 13152 TEST_CASE_ST(ut_setup, ut_teardown, 13153 test_kasumi_hash_verify_test_case_1), 13154 TEST_CASE_ST(ut_setup, ut_teardown, 13155 test_kasumi_hash_verify_test_case_2), 13156 TEST_CASE_ST(ut_setup, ut_teardown, 13157 test_kasumi_hash_verify_test_case_3), 13158 TEST_CASE_ST(ut_setup, ut_teardown, 13159 test_kasumi_hash_verify_test_case_4), 13160 TEST_CASE_ST(ut_setup, ut_teardown, 13161 test_kasumi_hash_verify_test_case_5), 13162 13163 /** NULL tests */ 13164 TEST_CASE_ST(ut_setup, ut_teardown, 13165 test_null_cipher_only_operation), 13166 TEST_CASE_ST(ut_setup, ut_teardown, 13167 test_null_auth_only_operation), 13168 TEST_CASE_ST(ut_setup, ut_teardown, 13169 test_null_cipher_auth_operation), 13170 TEST_CASE_ST(ut_setup, ut_teardown, 13171 test_null_auth_cipher_operation), 13172 13173 /** Negative tests */ 13174 TEST_CASE_ST(ut_setup, ut_teardown, 13175 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13176 TEST_CASE_ST(ut_setup, ut_teardown, 13177 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13178 TEST_CASE_ST(ut_setup, ut_teardown, 13179 authentication_verify_AES128_GMAC_fail_data_corrupt), 13180 TEST_CASE_ST(ut_setup, ut_teardown, 13181 authentication_verify_AES128_GMAC_fail_tag_corrupt), 13182 TEST_CASE_ST(ut_setup, ut_teardown, 13183 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13184 TEST_CASE_ST(ut_setup, ut_teardown, 13185 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13186 TEST_CASES_END() /**< NULL terminate unit test array */ 13187 } 13188 }; 13189 13190 static struct unit_test_suite cryptodev_nitrox_testsuite = { 13191 .suite_name = "Crypto NITROX Unit Test Suite", 13192 .setup = testsuite_setup, 13193 .teardown = testsuite_teardown, 13194 .unit_test_cases = { 13195 TEST_CASE_ST(ut_setup, ut_teardown, 13196 test_device_configure_invalid_dev_id), 13197 TEST_CASE_ST(ut_setup, ut_teardown, 13198 test_device_configure_invalid_queue_pair_ids), 13199 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13200 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13201 13202 TEST_CASES_END() /**< NULL terminate unit test array */ 13203 } 13204 }; 13205 13206 static struct unit_test_suite cryptodev_octeontx2_testsuite = { 13207 .suite_name = "Crypto Device OCTEON TX2 Unit Test Suite", 13208 .setup = testsuite_setup, 13209 .teardown = testsuite_teardown, 13210 .unit_test_cases = { 13211 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13212 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13213 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13214 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 13215 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13216 13217 /** AES GCM Authenticated Encryption */ 13218 TEST_CASE_ST(ut_setup, ut_teardown, 13219 test_AES_GCM_authenticated_encryption_test_case_1), 13220 TEST_CASE_ST(ut_setup, ut_teardown, 13221 test_AES_GCM_authenticated_encryption_test_case_2), 13222 TEST_CASE_ST(ut_setup, ut_teardown, 13223 test_AES_GCM_authenticated_encryption_test_case_3), 13224 TEST_CASE_ST(ut_setup, ut_teardown, 13225 test_AES_GCM_authenticated_encryption_test_case_4), 13226 TEST_CASE_ST(ut_setup, ut_teardown, 13227 test_AES_GCM_authenticated_encryption_test_case_5), 13228 TEST_CASE_ST(ut_setup, ut_teardown, 13229 test_AES_GCM_authenticated_encryption_test_case_6), 13230 TEST_CASE_ST(ut_setup, ut_teardown, 13231 test_AES_GCM_authenticated_encryption_test_case_7), 13232 13233 /** AES GCM Authenticated Decryption */ 13234 TEST_CASE_ST(ut_setup, ut_teardown, 13235 test_AES_GCM_authenticated_decryption_test_case_1), 13236 TEST_CASE_ST(ut_setup, ut_teardown, 13237 test_AES_GCM_authenticated_decryption_test_case_2), 13238 TEST_CASE_ST(ut_setup, ut_teardown, 13239 test_AES_GCM_authenticated_decryption_test_case_3), 13240 TEST_CASE_ST(ut_setup, ut_teardown, 13241 test_AES_GCM_authenticated_decryption_test_case_4), 13242 TEST_CASE_ST(ut_setup, ut_teardown, 13243 test_AES_GCM_authenticated_decryption_test_case_5), 13244 TEST_CASE_ST(ut_setup, ut_teardown, 13245 test_AES_GCM_authenticated_decryption_test_case_6), 13246 TEST_CASE_ST(ut_setup, ut_teardown, 13247 test_AES_GCM_authenticated_decryption_test_case_7), 13248 /** AES GMAC Authentication */ 13249 TEST_CASE_ST(ut_setup, ut_teardown, 13250 test_AES_GMAC_authentication_test_case_1), 13251 TEST_CASE_ST(ut_setup, ut_teardown, 13252 test_AES_GMAC_authentication_verify_test_case_1), 13253 TEST_CASE_ST(ut_setup, ut_teardown, 13254 test_AES_GMAC_authentication_test_case_2), 13255 TEST_CASE_ST(ut_setup, ut_teardown, 13256 test_AES_GMAC_authentication_verify_test_case_2), 13257 TEST_CASE_ST(ut_setup, ut_teardown, 13258 test_AES_GMAC_authentication_test_case_3), 13259 TEST_CASE_ST(ut_setup, ut_teardown, 13260 test_AES_GMAC_authentication_verify_test_case_3), 13261 13262 /** SNOW 3G encrypt only (UEA2) */ 13263 TEST_CASE_ST(ut_setup, ut_teardown, 13264 test_snow3g_encryption_test_case_1), 13265 TEST_CASE_ST(ut_setup, ut_teardown, 13266 test_snow3g_encryption_test_case_2), 13267 TEST_CASE_ST(ut_setup, ut_teardown, 13268 test_snow3g_encryption_test_case_3), 13269 TEST_CASE_ST(ut_setup, ut_teardown, 13270 test_snow3g_encryption_test_case_4), 13271 TEST_CASE_ST(ut_setup, ut_teardown, 13272 test_snow3g_encryption_test_case_5), 13273 13274 TEST_CASE_ST(ut_setup, ut_teardown, 13275 test_snow3g_encryption_test_case_1_oop), 13276 TEST_CASE_ST(ut_setup, ut_teardown, 13277 test_snow3g_decryption_test_case_1_oop), 13278 TEST_CASE_ST(ut_setup, ut_teardown, 13279 test_snow3g_encryption_test_case_1_oop_sgl), 13280 13281 /** SNOW 3G decrypt only (UEA2) */ 13282 TEST_CASE_ST(ut_setup, ut_teardown, 13283 test_snow3g_decryption_test_case_1), 13284 TEST_CASE_ST(ut_setup, ut_teardown, 13285 test_snow3g_decryption_test_case_2), 13286 TEST_CASE_ST(ut_setup, ut_teardown, 13287 test_snow3g_decryption_test_case_3), 13288 TEST_CASE_ST(ut_setup, ut_teardown, 13289 test_snow3g_decryption_test_case_4), 13290 TEST_CASE_ST(ut_setup, ut_teardown, 13291 test_snow3g_decryption_test_case_5), 13292 13293 TEST_CASE_ST(ut_setup, ut_teardown, 13294 test_snow3g_hash_generate_test_case_1), 13295 TEST_CASE_ST(ut_setup, ut_teardown, 13296 test_snow3g_hash_generate_test_case_2), 13297 TEST_CASE_ST(ut_setup, ut_teardown, 13298 test_snow3g_hash_generate_test_case_3), 13299 TEST_CASE_ST(ut_setup, ut_teardown, 13300 test_snow3g_hash_verify_test_case_1), 13301 TEST_CASE_ST(ut_setup, ut_teardown, 13302 test_snow3g_hash_verify_test_case_2), 13303 TEST_CASE_ST(ut_setup, ut_teardown, 13304 test_snow3g_hash_verify_test_case_3), 13305 13306 /** ZUC encrypt only (EEA3) */ 13307 TEST_CASE_ST(ut_setup, ut_teardown, 13308 test_zuc_encryption_test_case_1), 13309 TEST_CASE_ST(ut_setup, ut_teardown, 13310 test_zuc_encryption_test_case_2), 13311 TEST_CASE_ST(ut_setup, ut_teardown, 13312 test_zuc_encryption_test_case_3), 13313 TEST_CASE_ST(ut_setup, ut_teardown, 13314 test_zuc_encryption_test_case_4), 13315 TEST_CASE_ST(ut_setup, ut_teardown, 13316 test_zuc_encryption_test_case_5), 13317 TEST_CASE_ST(ut_setup, ut_teardown, 13318 test_zuc_hash_generate_test_case_1), 13319 TEST_CASE_ST(ut_setup, ut_teardown, 13320 test_zuc_hash_generate_test_case_2), 13321 TEST_CASE_ST(ut_setup, ut_teardown, 13322 test_zuc_hash_generate_test_case_3), 13323 TEST_CASE_ST(ut_setup, ut_teardown, 13324 test_zuc_hash_generate_test_case_4), 13325 TEST_CASE_ST(ut_setup, ut_teardown, 13326 test_zuc_hash_generate_test_case_5), 13327 TEST_CASE_ST(ut_setup, ut_teardown, 13328 test_zuc_encryption_test_case_6_sgl), 13329 13330 /** KASUMI encrypt only (UEA1) */ 13331 TEST_CASE_ST(ut_setup, ut_teardown, 13332 test_kasumi_encryption_test_case_1), 13333 TEST_CASE_ST(ut_setup, ut_teardown, 13334 test_kasumi_encryption_test_case_2), 13335 TEST_CASE_ST(ut_setup, ut_teardown, 13336 test_kasumi_encryption_test_case_3), 13337 TEST_CASE_ST(ut_setup, ut_teardown, 13338 test_kasumi_encryption_test_case_4), 13339 TEST_CASE_ST(ut_setup, ut_teardown, 13340 test_kasumi_encryption_test_case_5), 13341 TEST_CASE_ST(ut_setup, ut_teardown, 13342 test_kasumi_encryption_test_case_1_sgl), 13343 TEST_CASE_ST(ut_setup, ut_teardown, 13344 test_kasumi_encryption_test_case_1_oop_sgl), 13345 /** KASUMI decrypt only (UEA1) */ 13346 TEST_CASE_ST(ut_setup, ut_teardown, 13347 test_kasumi_decryption_test_case_1), 13348 TEST_CASE_ST(ut_setup, ut_teardown, 13349 test_kasumi_decryption_test_case_2), 13350 TEST_CASE_ST(ut_setup, ut_teardown, 13351 test_kasumi_decryption_test_case_3), 13352 TEST_CASE_ST(ut_setup, ut_teardown, 13353 test_kasumi_decryption_test_case_4), 13354 TEST_CASE_ST(ut_setup, ut_teardown, 13355 test_kasumi_decryption_test_case_5), 13356 13357 TEST_CASE_ST(ut_setup, ut_teardown, 13358 test_kasumi_encryption_test_case_1_oop), 13359 TEST_CASE_ST(ut_setup, ut_teardown, 13360 test_kasumi_decryption_test_case_1_oop), 13361 13362 /** KASUMI hash only (UIA1) */ 13363 TEST_CASE_ST(ut_setup, ut_teardown, 13364 test_kasumi_hash_generate_test_case_1), 13365 TEST_CASE_ST(ut_setup, ut_teardown, 13366 test_kasumi_hash_generate_test_case_2), 13367 TEST_CASE_ST(ut_setup, ut_teardown, 13368 test_kasumi_hash_generate_test_case_3), 13369 TEST_CASE_ST(ut_setup, ut_teardown, 13370 test_kasumi_hash_generate_test_case_4), 13371 TEST_CASE_ST(ut_setup, ut_teardown, 13372 test_kasumi_hash_generate_test_case_5), 13373 TEST_CASE_ST(ut_setup, ut_teardown, 13374 test_kasumi_hash_generate_test_case_6), 13375 TEST_CASE_ST(ut_setup, ut_teardown, 13376 test_kasumi_hash_verify_test_case_1), 13377 TEST_CASE_ST(ut_setup, ut_teardown, 13378 test_kasumi_hash_verify_test_case_2), 13379 TEST_CASE_ST(ut_setup, ut_teardown, 13380 test_kasumi_hash_verify_test_case_3), 13381 TEST_CASE_ST(ut_setup, ut_teardown, 13382 test_kasumi_hash_verify_test_case_4), 13383 TEST_CASE_ST(ut_setup, ut_teardown, 13384 test_kasumi_hash_verify_test_case_5), 13385 13386 /** NULL tests */ 13387 TEST_CASE_ST(ut_setup, ut_teardown, 13388 test_null_cipher_only_operation), 13389 TEST_CASE_ST(ut_setup, ut_teardown, 13390 test_null_auth_only_operation), 13391 TEST_CASE_ST(ut_setup, ut_teardown, 13392 test_null_cipher_auth_operation), 13393 TEST_CASE_ST(ut_setup, ut_teardown, 13394 test_null_auth_cipher_operation), 13395 13396 /** Negative tests */ 13397 TEST_CASE_ST(ut_setup, ut_teardown, 13398 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13399 TEST_CASE_ST(ut_setup, ut_teardown, 13400 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13401 TEST_CASE_ST(ut_setup, ut_teardown, 13402 authentication_verify_AES128_GMAC_fail_data_corrupt), 13403 TEST_CASE_ST(ut_setup, ut_teardown, 13404 authentication_verify_AES128_GMAC_fail_tag_corrupt), 13405 TEST_CASE_ST(ut_setup, ut_teardown, 13406 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13407 TEST_CASE_ST(ut_setup, ut_teardown, 13408 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13409 TEST_CASES_END() /**< NULL terminate unit test array */ 13410 } 13411 }; 13412 13413 static int 13414 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/) 13415 { 13416 gbl_driver_id = rte_cryptodev_driver_id_get( 13417 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 13418 13419 if (gbl_driver_id == -1) { 13420 RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check that both " 13421 "CONFIG_RTE_LIBRTE_PMD_QAT and CONFIG_RTE_LIBRTE_PMD_QAT_SYM " 13422 "are enabled in config file to run this testsuite.\n"); 13423 return TEST_SKIPPED; 13424 } 13425 13426 return unit_test_suite_runner(&cryptodev_testsuite); 13427 } 13428 13429 static int 13430 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/) 13431 { 13432 gbl_driver_id = rte_cryptodev_driver_id_get( 13433 RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 13434 13435 if (gbl_driver_id == -1) { 13436 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded. Check if " 13437 "CONFIG_RTE_LIBRTE_PMD_VIRTIO_CRYPTO is enabled " 13438 "in config file to run this testsuite.\n"); 13439 return TEST_FAILED; 13440 } 13441 13442 return unit_test_suite_runner(&cryptodev_virtio_testsuite); 13443 } 13444 13445 static int 13446 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/) 13447 { 13448 gbl_driver_id = rte_cryptodev_driver_id_get( 13449 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13450 13451 if (gbl_driver_id == -1) { 13452 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if " 13453 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled " 13454 "in config file to run this testsuite.\n"); 13455 return TEST_SKIPPED; 13456 } 13457 13458 return unit_test_suite_runner(&cryptodev_testsuite); 13459 } 13460 13461 static int 13462 test_cryptodev_cpu_aesni_mb(void) 13463 { 13464 int32_t rc; 13465 enum rte_security_session_action_type at; 13466 13467 gbl_driver_id = rte_cryptodev_driver_id_get( 13468 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13469 13470 if (gbl_driver_id == -1) { 13471 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if " 13472 "CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled " 13473 "in config file to run this testsuite.\n"); 13474 return TEST_SKIPPED; 13475 } 13476 13477 at = gbl_action_type; 13478 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 13479 rc = unit_test_suite_runner(&cryptodev_testsuite); 13480 gbl_action_type = at; 13481 return rc; 13482 } 13483 13484 static int 13485 test_cryptodev_openssl(void) 13486 { 13487 gbl_driver_id = rte_cryptodev_driver_id_get( 13488 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 13489 13490 if (gbl_driver_id == -1) { 13491 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if " 13492 "CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled " 13493 "in config file to run this testsuite.\n"); 13494 return TEST_SKIPPED; 13495 } 13496 13497 return unit_test_suite_runner(&cryptodev_testsuite); 13498 } 13499 13500 static int 13501 test_cryptodev_aesni_gcm(void) 13502 { 13503 gbl_driver_id = rte_cryptodev_driver_id_get( 13504 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 13505 13506 if (gbl_driver_id == -1) { 13507 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if " 13508 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled " 13509 "in config file to run this testsuite.\n"); 13510 return TEST_SKIPPED; 13511 } 13512 13513 return unit_test_suite_runner(&cryptodev_testsuite); 13514 } 13515 13516 static int 13517 test_cryptodev_cpu_aesni_gcm(void) 13518 { 13519 int32_t rc; 13520 enum rte_security_session_action_type at; 13521 13522 gbl_driver_id = rte_cryptodev_driver_id_get( 13523 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 13524 13525 if (gbl_driver_id == -1) { 13526 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if " 13527 "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled " 13528 "in config file to run this testsuite.\n"); 13529 return TEST_SKIPPED; 13530 } 13531 13532 at = gbl_action_type; 13533 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 13534 rc = unit_test_suite_runner(&cryptodev_testsuite); 13535 gbl_action_type = at; 13536 return rc; 13537 } 13538 13539 static int 13540 test_cryptodev_null(void) 13541 { 13542 gbl_driver_id = rte_cryptodev_driver_id_get( 13543 RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 13544 13545 if (gbl_driver_id == -1) { 13546 RTE_LOG(ERR, USER1, "NULL PMD must be loaded. Check if " 13547 "CONFIG_RTE_LIBRTE_PMD_NULL is enabled " 13548 "in config file to run this testsuite.\n"); 13549 return TEST_SKIPPED; 13550 } 13551 13552 return unit_test_suite_runner(&cryptodev_testsuite); 13553 } 13554 13555 static int 13556 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/) 13557 { 13558 gbl_driver_id = rte_cryptodev_driver_id_get( 13559 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 13560 13561 if (gbl_driver_id == -1) { 13562 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if " 13563 "CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled " 13564 "in config file to run this testsuite.\n"); 13565 return TEST_SKIPPED; 13566 } 13567 13568 return unit_test_suite_runner(&cryptodev_testsuite); 13569 } 13570 13571 static int 13572 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/) 13573 { 13574 gbl_driver_id = rte_cryptodev_driver_id_get( 13575 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 13576 13577 if (gbl_driver_id == -1) { 13578 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if " 13579 "CONFIG_RTE_LIBRTE_PMD_KASUMI is enabled " 13580 "in config file to run this testsuite.\n"); 13581 return TEST_SKIPPED; 13582 } 13583 13584 return unit_test_suite_runner(&cryptodev_testsuite); 13585 } 13586 13587 static int 13588 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/) 13589 { 13590 gbl_driver_id = rte_cryptodev_driver_id_get( 13591 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 13592 13593 if (gbl_driver_id == -1) { 13594 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if " 13595 "CONFIG_RTE_LIBRTE_PMD_ZUC is enabled " 13596 "in config file to run this testsuite.\n"); 13597 return TEST_SKIPPED; 13598 } 13599 13600 return unit_test_suite_runner(&cryptodev_testsuite); 13601 } 13602 13603 static int 13604 test_cryptodev_armv8(void) 13605 { 13606 gbl_driver_id = rte_cryptodev_driver_id_get( 13607 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 13608 13609 if (gbl_driver_id == -1) { 13610 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if " 13611 "CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled " 13612 "in config file to run this testsuite.\n"); 13613 return TEST_SKIPPED; 13614 } 13615 13616 return unit_test_suite_runner(&cryptodev_armv8_testsuite); 13617 } 13618 13619 static int 13620 test_cryptodev_mrvl(void) 13621 { 13622 gbl_driver_id = rte_cryptodev_driver_id_get( 13623 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 13624 13625 if (gbl_driver_id == -1) { 13626 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded. Check if " 13627 "CONFIG_RTE_LIBRTE_PMD_MVSAM_CRYPTO is enabled " 13628 "in config file to run this testsuite.\n"); 13629 return TEST_SKIPPED; 13630 } 13631 13632 return unit_test_suite_runner(&cryptodev_mrvl_testsuite); 13633 } 13634 13635 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER 13636 13637 static int 13638 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/) 13639 { 13640 gbl_driver_id = rte_cryptodev_driver_id_get( 13641 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 13642 13643 if (gbl_driver_id == -1) { 13644 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded. Check if " 13645 "CONFIG_RTE_LIBRTE_PMD_SCHEDULER is enabled " 13646 "in config file to run this testsuite.\n"); 13647 return TEST_SKIPPED; 13648 } 13649 13650 if (rte_cryptodev_driver_id_get( 13651 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 13652 RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be" 13653 " enabled in config file to run this testsuite.\n"); 13654 return TEST_SKIPPED; 13655 } 13656 return unit_test_suite_runner(&cryptodev_scheduler_testsuite); 13657 } 13658 13659 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 13660 13661 #endif 13662 13663 static int 13664 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/) 13665 { 13666 gbl_driver_id = rte_cryptodev_driver_id_get( 13667 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 13668 13669 if (gbl_driver_id == -1) { 13670 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if " 13671 "CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled " 13672 "in config file to run this testsuite.\n"); 13673 return TEST_SKIPPED; 13674 } 13675 13676 return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite); 13677 } 13678 13679 static int 13680 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/) 13681 { 13682 gbl_driver_id = rte_cryptodev_driver_id_get( 13683 RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 13684 13685 if (gbl_driver_id == -1) { 13686 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded. Check if " 13687 "CONFIG_RTE_LIBRTE_PMD_DPAA_SEC is enabled " 13688 "in config file to run this testsuite.\n"); 13689 return TEST_SKIPPED; 13690 } 13691 13692 return unit_test_suite_runner(&cryptodev_dpaa_sec_testsuite); 13693 } 13694 13695 static int 13696 test_cryptodev_ccp(void) 13697 { 13698 gbl_driver_id = rte_cryptodev_driver_id_get( 13699 RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 13700 13701 if (gbl_driver_id == -1) { 13702 RTE_LOG(ERR, USER1, "CCP PMD must be loaded. Check if " 13703 "CONFIG_RTE_LIBRTE_PMD_CCP is enabled " 13704 "in config file to run this testsuite.\n"); 13705 return TEST_FAILED; 13706 } 13707 13708 return unit_test_suite_runner(&cryptodev_ccp_testsuite); 13709 } 13710 13711 static int 13712 test_cryptodev_octeontx(void) 13713 { 13714 gbl_driver_id = rte_cryptodev_driver_id_get( 13715 RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 13716 if (gbl_driver_id == -1) { 13717 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded. Check if " 13718 "CONFIG_RTE_LIBRTE_PMD_OCTEONTX_CRYPTO is " 13719 "enabled in config file to run this " 13720 "testsuite.\n"); 13721 return TEST_FAILED; 13722 } 13723 return unit_test_suite_runner(&cryptodev_octeontx_testsuite); 13724 } 13725 13726 static int 13727 test_cryptodev_octeontx2(void) 13728 { 13729 gbl_driver_id = rte_cryptodev_driver_id_get( 13730 RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)); 13731 if (gbl_driver_id == -1) { 13732 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded. Check if " 13733 "CONFIG_RTE_LIBRTE_PMD_OCTEONTX2_CRYPTO is " 13734 "enabled in config file to run this " 13735 "testsuite.\n"); 13736 return TEST_FAILED; 13737 } 13738 return unit_test_suite_runner(&cryptodev_octeontx2_testsuite); 13739 } 13740 13741 static int 13742 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/) 13743 { 13744 gbl_driver_id = rte_cryptodev_driver_id_get( 13745 RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 13746 13747 if (gbl_driver_id == -1) { 13748 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded. Check if " 13749 "CONFIG_RTE_LIBRTE_PMD_CAAM_JR is enabled " 13750 "in config file to run this testsuite.\n"); 13751 return TEST_FAILED; 13752 } 13753 13754 return unit_test_suite_runner(&cryptodev_caam_jr_testsuite); 13755 } 13756 13757 static int 13758 test_cryptodev_nitrox(void) 13759 { 13760 gbl_driver_id = rte_cryptodev_driver_id_get( 13761 RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 13762 13763 if (gbl_driver_id == -1) { 13764 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded. Check if " 13765 "CONFIG_RTE_LIBRTE_PMD_NITROX is enabled " 13766 "in config file to run this testsuite.\n"); 13767 return TEST_FAILED; 13768 } 13769 13770 return unit_test_suite_runner(&cryptodev_nitrox_testsuite); 13771 } 13772 13773 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 13774 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 13775 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 13776 test_cryptodev_cpu_aesni_mb); 13777 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 13778 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 13779 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 13780 test_cryptodev_cpu_aesni_gcm); 13781 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 13782 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 13783 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 13784 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 13785 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 13786 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 13787 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 13788 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 13789 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 13790 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 13791 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 13792 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2); 13793 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 13794 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 13795