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