1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2020 Intel Corporation 3 * Copyright 2020 NXP 4 */ 5 6 #include <time.h> 7 8 #include <rte_common.h> 9 #include <rte_hexdump.h> 10 #include <rte_mbuf.h> 11 #include <rte_malloc.h> 12 #include <rte_memcpy.h> 13 #include <rte_pause.h> 14 #include <rte_bus_vdev.h> 15 #include <rte_ether.h> 16 17 #include <rte_crypto.h> 18 #include <rte_cryptodev.h> 19 #include <rte_cryptodev_pmd.h> 20 #include <rte_string_fns.h> 21 22 #ifdef RTE_CRYPTO_SCHEDULER 23 #include <rte_cryptodev_scheduler.h> 24 #include <rte_cryptodev_scheduler_operations.h> 25 #endif 26 27 #include <rte_lcore.h> 28 29 #include "test.h" 30 #include "test_cryptodev.h" 31 32 #include "test_cryptodev_blockcipher.h" 33 #include "test_cryptodev_aes_test_vectors.h" 34 #include "test_cryptodev_des_test_vectors.h" 35 #include "test_cryptodev_hash_test_vectors.h" 36 #include "test_cryptodev_kasumi_test_vectors.h" 37 #include "test_cryptodev_kasumi_hash_test_vectors.h" 38 #include "test_cryptodev_snow3g_test_vectors.h" 39 #include "test_cryptodev_snow3g_hash_test_vectors.h" 40 #include "test_cryptodev_zuc_test_vectors.h" 41 #include "test_cryptodev_aead_test_vectors.h" 42 #include "test_cryptodev_hmac_test_vectors.h" 43 #include "test_cryptodev_mixed_test_vectors.h" 44 #ifdef RTE_LIB_SECURITY 45 #include "test_cryptodev_security_pdcp_test_vectors.h" 46 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 47 #include "test_cryptodev_security_pdcp_test_func.h" 48 #include "test_cryptodev_security_docsis_test_vectors.h" 49 50 #define SDAP_DISABLED 0 51 #define SDAP_ENABLED 1 52 #endif 53 54 #define VDEV_ARGS_SIZE 100 55 #define MAX_NB_SESSIONS 4 56 57 #define MAX_DRV_SERVICE_CTX_SIZE 256 58 59 #define MAX_RAW_DEQUEUE_COUNT 65535 60 61 #define IN_PLACE 0 62 #define OUT_OF_PLACE 1 63 64 #ifndef ARRAY_SIZE 65 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 66 #endif 67 68 static int gbl_driver_id; 69 70 static enum rte_security_session_action_type gbl_action_type = 71 RTE_SECURITY_ACTION_TYPE_NONE; 72 73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 74 75 struct crypto_unittest_params { 76 struct rte_crypto_sym_xform cipher_xform; 77 struct rte_crypto_sym_xform auth_xform; 78 struct rte_crypto_sym_xform aead_xform; 79 #ifdef RTE_LIB_SECURITY 80 struct rte_security_docsis_xform docsis_xform; 81 #endif 82 83 union { 84 struct rte_cryptodev_sym_session *sess; 85 #ifdef RTE_LIB_SECURITY 86 struct rte_security_session *sec_session; 87 #endif 88 }; 89 #ifdef RTE_LIB_SECURITY 90 enum rte_security_session_action_type type; 91 #endif 92 struct rte_crypto_op *op; 93 94 struct rte_mbuf *obuf, *ibuf; 95 96 uint8_t *digest; 97 }; 98 99 #define ALIGN_POW2_ROUNDUP(num, align) \ 100 (((num) + (align) - 1) & ~((align) - 1)) 101 102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \ 103 for (j = 0; j < num_child_ts; index++, j++) \ 104 parent_ts.unit_test_suites[index] = child_ts[j] 105 106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \ 107 for (j = 0; j < num_blk_types; index++, j++) \ 108 parent_ts.unit_test_suites[index] = \ 109 build_blockcipher_test_suite(blk_types[j]) 110 111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \ 112 for (j = index; j < index + num_blk_types; j++) \ 113 free_blockcipher_test_suite(parent_ts.unit_test_suites[j]) 114 115 /* 116 * Forward declarations. 117 */ 118 static int 119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 120 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 121 uint8_t *hmac_key); 122 123 static int 124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 125 struct crypto_unittest_params *ut_params, 126 struct crypto_testsuite_params *ts_param, 127 const uint8_t *cipher, 128 const uint8_t *digest, 129 const uint8_t *iv); 130 131 static struct rte_mbuf * 132 setup_test_string(struct rte_mempool *mpool, 133 const char *string, size_t len, uint8_t blocksize) 134 { 135 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 136 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 137 138 memset(m->buf_addr, 0, m->buf_len); 139 if (m) { 140 char *dst = rte_pktmbuf_append(m, t_len); 141 142 if (!dst) { 143 rte_pktmbuf_free(m); 144 return NULL; 145 } 146 if (string != NULL) 147 rte_memcpy(dst, string, t_len); 148 else 149 memset(dst, 0, t_len); 150 } 151 152 return m; 153 } 154 155 /* Get number of bytes in X bits (rounding up) */ 156 static uint32_t 157 ceil_byte_length(uint32_t num_bits) 158 { 159 if (num_bits % 8) 160 return ((num_bits >> 3) + 1); 161 else 162 return (num_bits >> 3); 163 } 164 165 static void 166 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 167 uint8_t is_op_success) 168 { 169 struct rte_crypto_op *op = user_data; 170 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 171 RTE_CRYPTO_OP_STATUS_ERROR; 172 } 173 174 void 175 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 176 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 177 uint8_t len_in_bits, uint8_t cipher_iv_len) 178 { 179 struct rte_crypto_sym_op *sop = op->sym; 180 struct rte_crypto_op *ret_op = NULL; 181 struct rte_crypto_vec data_vec[UINT8_MAX]; 182 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 183 union rte_crypto_sym_ofs ofs; 184 struct rte_crypto_sym_vec vec; 185 struct rte_crypto_sgl sgl; 186 uint32_t max_len; 187 union rte_cryptodev_session_ctx sess; 188 uint32_t count = 0; 189 struct rte_crypto_raw_dp_ctx *ctx; 190 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 191 auth_len = 0; 192 int32_t n; 193 uint32_t n_success; 194 int ctx_service_size; 195 int32_t status = 0; 196 int enqueue_status, dequeue_status; 197 198 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id); 199 if (ctx_service_size < 0) { 200 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 201 return; 202 } 203 204 ctx = malloc(ctx_service_size); 205 if (!ctx) { 206 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 207 return; 208 } 209 210 /* Both are enums, setting crypto_sess will suit any session type */ 211 sess.crypto_sess = op->sym->session; 212 213 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, 214 op->sess_type, sess, 0) < 0) { 215 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 216 goto exit; 217 } 218 219 cipher_iv.iova = 0; 220 cipher_iv.va = NULL; 221 aad_auth_iv.iova = 0; 222 aad_auth_iv.va = NULL; 223 digest.iova = 0; 224 digest.va = NULL; 225 sgl.vec = data_vec; 226 vec.num = 1; 227 vec.sgl = &sgl; 228 vec.iv = &cipher_iv; 229 vec.digest = &digest; 230 vec.aad = &aad_auth_iv; 231 vec.status = &status; 232 233 ofs.raw = 0; 234 235 if (is_cipher && is_auth) { 236 cipher_offset = sop->cipher.data.offset; 237 cipher_len = sop->cipher.data.length; 238 auth_offset = sop->auth.data.offset; 239 auth_len = sop->auth.data.length; 240 max_len = RTE_MAX(cipher_offset + cipher_len, 241 auth_offset + auth_len); 242 if (len_in_bits) { 243 max_len = max_len >> 3; 244 cipher_offset = cipher_offset >> 3; 245 auth_offset = auth_offset >> 3; 246 cipher_len = cipher_len >> 3; 247 auth_len = auth_len >> 3; 248 } 249 ofs.ofs.cipher.head = cipher_offset; 250 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 251 ofs.ofs.auth.head = auth_offset; 252 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 253 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 254 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 255 aad_auth_iv.va = rte_crypto_op_ctod_offset( 256 op, void *, IV_OFFSET + cipher_iv_len); 257 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 258 cipher_iv_len); 259 digest.va = (void *)sop->auth.digest.data; 260 digest.iova = sop->auth.digest.phys_addr; 261 262 } else if (is_cipher) { 263 cipher_offset = sop->cipher.data.offset; 264 cipher_len = sop->cipher.data.length; 265 max_len = cipher_len + cipher_offset; 266 if (len_in_bits) { 267 max_len = max_len >> 3; 268 cipher_offset = cipher_offset >> 3; 269 cipher_len = cipher_len >> 3; 270 } 271 ofs.ofs.cipher.head = cipher_offset; 272 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 273 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 274 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 275 276 } else if (is_auth) { 277 auth_offset = sop->auth.data.offset; 278 auth_len = sop->auth.data.length; 279 max_len = auth_len + auth_offset; 280 if (len_in_bits) { 281 max_len = max_len >> 3; 282 auth_offset = auth_offset >> 3; 283 auth_len = auth_len >> 3; 284 } 285 ofs.ofs.auth.head = auth_offset; 286 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 287 aad_auth_iv.va = rte_crypto_op_ctod_offset( 288 op, void *, IV_OFFSET + cipher_iv_len); 289 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 290 cipher_iv_len); 291 digest.va = (void *)sop->auth.digest.data; 292 digest.iova = sop->auth.digest.phys_addr; 293 294 } else { /* aead */ 295 cipher_offset = sop->aead.data.offset; 296 cipher_len = sop->aead.data.length; 297 max_len = cipher_len + cipher_offset; 298 if (len_in_bits) { 299 max_len = max_len >> 3; 300 cipher_offset = cipher_offset >> 3; 301 cipher_len = cipher_len >> 3; 302 } 303 ofs.ofs.cipher.head = cipher_offset; 304 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 305 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 306 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 307 aad_auth_iv.va = (void *)sop->aead.aad.data; 308 aad_auth_iv.iova = sop->aead.aad.phys_addr; 309 digest.va = (void *)sop->aead.digest.data; 310 digest.iova = sop->aead.digest.phys_addr; 311 } 312 313 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 314 data_vec, RTE_DIM(data_vec)); 315 if (n < 0 || n > sop->m_src->nb_segs) { 316 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 317 goto exit; 318 } 319 320 sgl.num = n; 321 322 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 323 &enqueue_status) < 1) { 324 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 325 goto exit; 326 } 327 328 if (enqueue_status == 0) { 329 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 330 if (status < 0) { 331 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 332 goto exit; 333 } 334 } else if (enqueue_status < 0) { 335 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 336 goto exit; 337 } 338 339 n = n_success = 0; 340 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 341 n = rte_cryptodev_raw_dequeue_burst(ctx, 342 NULL, 1, post_process_raw_dp_op, 343 (void **)&ret_op, 0, &n_success, 344 &dequeue_status); 345 if (dequeue_status < 0) { 346 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 347 goto exit; 348 } 349 if (n == 0) 350 rte_pause(); 351 } 352 353 if (n == 1 && dequeue_status == 0) { 354 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 355 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 356 goto exit; 357 } 358 } 359 360 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 361 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 362 RTE_CRYPTO_OP_STATUS_SUCCESS; 363 364 exit: 365 free(ctx); 366 } 367 368 static void 369 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 370 { 371 int32_t n, st; 372 struct rte_crypto_sym_op *sop; 373 union rte_crypto_sym_ofs ofs; 374 struct rte_crypto_sgl sgl; 375 struct rte_crypto_sym_vec symvec; 376 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 377 struct rte_crypto_vec vec[UINT8_MAX]; 378 379 sop = op->sym; 380 381 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 382 sop->aead.data.length, vec, RTE_DIM(vec)); 383 384 if (n < 0 || n != sop->m_src->nb_segs) { 385 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 386 return; 387 } 388 389 sgl.vec = vec; 390 sgl.num = n; 391 symvec.sgl = &sgl; 392 symvec.iv = &iv_ptr; 393 symvec.digest = &digest_ptr; 394 symvec.aad = &aad_ptr; 395 symvec.status = &st; 396 symvec.num = 1; 397 398 /* for CPU crypto the IOVA address is not required */ 399 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 400 digest_ptr.va = (void *)sop->aead.digest.data; 401 aad_ptr.va = (void *)sop->aead.aad.data; 402 403 ofs.raw = 0; 404 405 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 406 &symvec); 407 408 if (n != 1) 409 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 410 else 411 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 412 } 413 414 static void 415 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 416 { 417 int32_t n, st; 418 struct rte_crypto_sym_op *sop; 419 union rte_crypto_sym_ofs ofs; 420 struct rte_crypto_sgl sgl; 421 struct rte_crypto_sym_vec symvec; 422 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 423 struct rte_crypto_vec vec[UINT8_MAX]; 424 425 sop = op->sym; 426 427 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 428 sop->auth.data.length, vec, RTE_DIM(vec)); 429 430 if (n < 0 || n != sop->m_src->nb_segs) { 431 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 432 return; 433 } 434 435 sgl.vec = vec; 436 sgl.num = n; 437 symvec.sgl = &sgl; 438 symvec.iv = &iv_ptr; 439 symvec.digest = &digest_ptr; 440 symvec.status = &st; 441 symvec.num = 1; 442 443 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 444 digest_ptr.va = (void *)sop->auth.digest.data; 445 446 ofs.raw = 0; 447 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 448 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 449 (sop->cipher.data.offset + sop->cipher.data.length); 450 451 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 452 &symvec); 453 454 if (n != 1) 455 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 456 else 457 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 458 } 459 460 static struct rte_crypto_op * 461 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 462 { 463 464 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 465 466 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 467 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 468 return NULL; 469 } 470 471 op = NULL; 472 473 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 474 rte_pause(); 475 476 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 477 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 478 return NULL; 479 } 480 481 return op; 482 } 483 484 static struct crypto_testsuite_params testsuite_params = { NULL }; 485 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; 486 static struct crypto_unittest_params unittest_params; 487 488 static int 489 testsuite_setup(void) 490 { 491 struct crypto_testsuite_params *ts_params = &testsuite_params; 492 struct rte_cryptodev_info info; 493 uint32_t i = 0, nb_devs, dev_id; 494 uint16_t qp_id; 495 496 memset(ts_params, 0, sizeof(*ts_params)); 497 498 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 499 if (ts_params->mbuf_pool == NULL) { 500 /* Not already created so create */ 501 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 502 "CRYPTO_MBUFPOOL", 503 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 504 rte_socket_id()); 505 if (ts_params->mbuf_pool == NULL) { 506 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 507 return TEST_FAILED; 508 } 509 } 510 511 ts_params->large_mbuf_pool = rte_mempool_lookup( 512 "CRYPTO_LARGE_MBUFPOOL"); 513 if (ts_params->large_mbuf_pool == NULL) { 514 /* Not already created so create */ 515 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 516 "CRYPTO_LARGE_MBUFPOOL", 517 1, 0, 0, UINT16_MAX, 518 rte_socket_id()); 519 if (ts_params->large_mbuf_pool == NULL) { 520 RTE_LOG(ERR, USER1, 521 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 522 return TEST_FAILED; 523 } 524 } 525 526 ts_params->op_mpool = rte_crypto_op_pool_create( 527 "MBUF_CRYPTO_SYM_OP_POOL", 528 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 529 NUM_MBUFS, MBUF_CACHE_SIZE, 530 DEFAULT_NUM_XFORMS * 531 sizeof(struct rte_crypto_sym_xform) + 532 MAXIMUM_IV_LENGTH, 533 rte_socket_id()); 534 if (ts_params->op_mpool == NULL) { 535 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 536 return TEST_FAILED; 537 } 538 539 nb_devs = rte_cryptodev_count(); 540 if (nb_devs < 1) { 541 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 542 return TEST_SKIPPED; 543 } 544 545 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) { 546 RTE_LOG(WARNING, USER1, "No %s devices found?\n", 547 rte_cryptodev_driver_name_get(gbl_driver_id)); 548 return TEST_SKIPPED; 549 } 550 551 /* Create list of valid crypto devs */ 552 for (i = 0; i < nb_devs; i++) { 553 rte_cryptodev_info_get(i, &info); 554 if (info.driver_id == gbl_driver_id) 555 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 556 } 557 558 if (ts_params->valid_dev_count < 1) 559 return TEST_FAILED; 560 561 /* Set up all the qps on the first of the valid devices found */ 562 563 dev_id = ts_params->valid_devs[0]; 564 565 rte_cryptodev_info_get(dev_id, &info); 566 567 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 568 ts_params->conf.socket_id = SOCKET_ID_ANY; 569 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 570 571 unsigned int session_size = 572 rte_cryptodev_sym_get_private_session_size(dev_id); 573 574 #ifdef RTE_LIB_SECURITY 575 unsigned int security_session_size = rte_security_session_get_size( 576 rte_cryptodev_get_sec_ctx(dev_id)); 577 578 if (session_size < security_session_size) 579 session_size = security_session_size; 580 #endif 581 /* 582 * Create mempool with maximum number of sessions. 583 */ 584 if (info.sym.max_nb_sessions != 0 && 585 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 586 RTE_LOG(ERR, USER1, "Device does not support " 587 "at least %u sessions\n", 588 MAX_NB_SESSIONS); 589 return TEST_FAILED; 590 } 591 592 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 593 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 594 SOCKET_ID_ANY); 595 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 596 "session mempool allocation failed"); 597 598 ts_params->session_priv_mpool = rte_mempool_create( 599 "test_sess_mp_priv", 600 MAX_NB_SESSIONS, 601 session_size, 602 0, 0, NULL, NULL, NULL, 603 NULL, SOCKET_ID_ANY, 604 0); 605 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 606 "session mempool allocation failed"); 607 608 609 610 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 611 &ts_params->conf), 612 "Failed to configure cryptodev %u with %u qps", 613 dev_id, ts_params->conf.nb_queue_pairs); 614 615 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 616 ts_params->qp_conf.mp_session = ts_params->session_mpool; 617 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 618 619 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 620 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 621 dev_id, qp_id, &ts_params->qp_conf, 622 rte_cryptodev_socket_id(dev_id)), 623 "Failed to setup queue pair %u on cryptodev %u", 624 qp_id, dev_id); 625 } 626 627 return TEST_SUCCESS; 628 } 629 630 static void 631 testsuite_teardown(void) 632 { 633 struct crypto_testsuite_params *ts_params = &testsuite_params; 634 int res; 635 636 if (ts_params->mbuf_pool != NULL) { 637 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 638 rte_mempool_avail_count(ts_params->mbuf_pool)); 639 } 640 641 if (ts_params->op_mpool != NULL) { 642 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 643 rte_mempool_avail_count(ts_params->op_mpool)); 644 } 645 646 /* Free session mempools */ 647 if (ts_params->session_priv_mpool != NULL) { 648 rte_mempool_free(ts_params->session_priv_mpool); 649 ts_params->session_priv_mpool = NULL; 650 } 651 652 if (ts_params->session_mpool != NULL) { 653 rte_mempool_free(ts_params->session_mpool); 654 ts_params->session_mpool = NULL; 655 } 656 657 res = rte_cryptodev_close(ts_params->valid_devs[0]); 658 if (res) 659 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res); 660 } 661 662 static int 663 check_capabilities_supported(enum rte_crypto_sym_xform_type type, 664 const int *algs, uint16_t num_algs) 665 { 666 uint8_t dev_id = testsuite_params.valid_devs[0]; 667 bool some_alg_supported = FALSE; 668 uint16_t i; 669 670 for (i = 0; i < num_algs && !some_alg_supported; i++) { 671 struct rte_cryptodev_sym_capability_idx alg = { 672 type, {algs[i]} 673 }; 674 if (rte_cryptodev_sym_capability_get(dev_id, 675 &alg) != NULL) 676 some_alg_supported = TRUE; 677 } 678 if (!some_alg_supported) 679 return TEST_SKIPPED; 680 681 return 0; 682 } 683 684 int 685 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 686 uint16_t num_ciphers) 687 { 688 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, 689 (const int *) ciphers, num_ciphers); 690 } 691 692 int 693 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 694 uint16_t num_auths) 695 { 696 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, 697 (const int *) auths, num_auths); 698 } 699 700 int 701 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 702 uint16_t num_aeads) 703 { 704 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, 705 (const int *) aeads, num_aeads); 706 } 707 708 static int 709 null_testsuite_setup(void) 710 { 711 struct crypto_testsuite_params *ts_params = &testsuite_params; 712 uint8_t dev_id = ts_params->valid_devs[0]; 713 struct rte_cryptodev_info dev_info; 714 const enum rte_crypto_cipher_algorithm ciphers[] = { 715 RTE_CRYPTO_CIPHER_NULL 716 }; 717 const enum rte_crypto_auth_algorithm auths[] = { 718 RTE_CRYPTO_AUTH_NULL 719 }; 720 721 rte_cryptodev_info_get(dev_id, &dev_info); 722 723 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 724 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL " 725 "testsuite not met\n"); 726 return TEST_SKIPPED; 727 } 728 729 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 730 && check_auth_capabilities_supported(auths, 731 RTE_DIM(auths)) != 0) { 732 RTE_LOG(INFO, USER1, "Capability requirements for NULL " 733 "testsuite not met\n"); 734 return TEST_SKIPPED; 735 } 736 737 return 0; 738 } 739 740 static int 741 crypto_gen_testsuite_setup(void) 742 { 743 struct crypto_testsuite_params *ts_params = &testsuite_params; 744 uint8_t dev_id = ts_params->valid_devs[0]; 745 struct rte_cryptodev_info dev_info; 746 747 rte_cryptodev_info_get(dev_id, &dev_info); 748 749 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 750 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen " 751 "testsuite not met\n"); 752 return TEST_SKIPPED; 753 } 754 755 return 0; 756 } 757 758 #ifdef RTE_LIB_SECURITY 759 static int 760 pdcp_proto_testsuite_setup(void) 761 { 762 struct crypto_testsuite_params *ts_params = &testsuite_params; 763 uint8_t dev_id = ts_params->valid_devs[0]; 764 struct rte_cryptodev_info dev_info; 765 const enum rte_crypto_cipher_algorithm ciphers[] = { 766 RTE_CRYPTO_CIPHER_NULL, 767 RTE_CRYPTO_CIPHER_AES_CTR, 768 RTE_CRYPTO_CIPHER_ZUC_EEA3, 769 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 770 }; 771 const enum rte_crypto_auth_algorithm auths[] = { 772 RTE_CRYPTO_AUTH_NULL, 773 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 774 RTE_CRYPTO_AUTH_AES_CMAC, 775 RTE_CRYPTO_AUTH_ZUC_EIA3 776 }; 777 778 rte_cryptodev_info_get(dev_id, &dev_info); 779 780 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 781 !(dev_info.feature_flags & 782 RTE_CRYPTODEV_FF_SECURITY)) { 783 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto " 784 "testsuite not met\n"); 785 return TEST_SKIPPED; 786 } 787 788 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 789 && check_auth_capabilities_supported(auths, 790 RTE_DIM(auths)) != 0) { 791 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto " 792 "testsuite not met\n"); 793 return TEST_SKIPPED; 794 } 795 796 return 0; 797 } 798 799 static int 800 docsis_proto_testsuite_setup(void) 801 { 802 struct crypto_testsuite_params *ts_params = &testsuite_params; 803 uint8_t dev_id = ts_params->valid_devs[0]; 804 struct rte_cryptodev_info dev_info; 805 const enum rte_crypto_cipher_algorithm ciphers[] = { 806 RTE_CRYPTO_CIPHER_AES_DOCSISBPI 807 }; 808 809 rte_cryptodev_info_get(dev_id, &dev_info); 810 811 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 812 !(dev_info.feature_flags & 813 RTE_CRYPTODEV_FF_SECURITY)) { 814 RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis " 815 "Proto testsuite not met\n"); 816 return TEST_SKIPPED; 817 } 818 819 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 820 RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto " 821 "testsuite not met\n"); 822 return TEST_SKIPPED; 823 } 824 825 return 0; 826 } 827 #endif 828 829 static int 830 aes_ccm_auth_testsuite_setup(void) 831 { 832 struct crypto_testsuite_params *ts_params = &testsuite_params; 833 uint8_t dev_id = ts_params->valid_devs[0]; 834 struct rte_cryptodev_info dev_info; 835 const enum rte_crypto_aead_algorithm aeads[] = { 836 RTE_CRYPTO_AEAD_AES_CCM 837 }; 838 839 rte_cryptodev_info_get(dev_id, &dev_info); 840 841 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 842 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 843 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 844 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM " 845 "testsuite not met\n"); 846 return TEST_SKIPPED; 847 } 848 849 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 850 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM " 851 "testsuite not met\n"); 852 return TEST_SKIPPED; 853 } 854 855 return 0; 856 } 857 858 static int 859 aes_gcm_auth_testsuite_setup(void) 860 { 861 struct crypto_testsuite_params *ts_params = &testsuite_params; 862 uint8_t dev_id = ts_params->valid_devs[0]; 863 struct rte_cryptodev_info dev_info; 864 const enum rte_crypto_aead_algorithm aeads[] = { 865 RTE_CRYPTO_AEAD_AES_GCM 866 }; 867 868 rte_cryptodev_info_get(dev_id, &dev_info); 869 870 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 871 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM " 872 "testsuite not met\n"); 873 return TEST_SKIPPED; 874 } 875 876 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 877 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM " 878 "testsuite not met\n"); 879 return TEST_SKIPPED; 880 } 881 882 return 0; 883 } 884 885 static int 886 aes_gmac_auth_testsuite_setup(void) 887 { 888 struct crypto_testsuite_params *ts_params = &testsuite_params; 889 uint8_t dev_id = ts_params->valid_devs[0]; 890 struct rte_cryptodev_info dev_info; 891 const enum rte_crypto_auth_algorithm auths[] = { 892 RTE_CRYPTO_AUTH_AES_GMAC 893 }; 894 895 rte_cryptodev_info_get(dev_id, &dev_info); 896 897 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 898 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 899 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 900 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC " 901 "testsuite not met\n"); 902 return TEST_SKIPPED; 903 } 904 905 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 906 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC " 907 "testsuite not met\n"); 908 return TEST_SKIPPED; 909 } 910 911 return 0; 912 } 913 914 static int 915 chacha20_poly1305_testsuite_setup(void) 916 { 917 struct crypto_testsuite_params *ts_params = &testsuite_params; 918 uint8_t dev_id = ts_params->valid_devs[0]; 919 struct rte_cryptodev_info dev_info; 920 const enum rte_crypto_aead_algorithm aeads[] = { 921 RTE_CRYPTO_AEAD_CHACHA20_POLY1305 922 }; 923 924 rte_cryptodev_info_get(dev_id, &dev_info); 925 926 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 927 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 928 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 929 RTE_LOG(INFO, USER1, "Feature flag requirements for " 930 "Chacha20-Poly1305 testsuite not met\n"); 931 return TEST_SKIPPED; 932 } 933 934 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 935 RTE_LOG(INFO, USER1, "Capability requirements for " 936 "Chacha20-Poly1305 testsuite not met\n"); 937 return TEST_SKIPPED; 938 } 939 940 return 0; 941 } 942 943 static int 944 snow3g_testsuite_setup(void) 945 { 946 struct crypto_testsuite_params *ts_params = &testsuite_params; 947 uint8_t dev_id = ts_params->valid_devs[0]; 948 struct rte_cryptodev_info dev_info; 949 const enum rte_crypto_cipher_algorithm ciphers[] = { 950 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 951 952 }; 953 const enum rte_crypto_auth_algorithm auths[] = { 954 RTE_CRYPTO_AUTH_SNOW3G_UIA2 955 }; 956 957 rte_cryptodev_info_get(dev_id, &dev_info); 958 959 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 960 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G " 961 "testsuite not met\n"); 962 return TEST_SKIPPED; 963 } 964 965 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 966 && check_auth_capabilities_supported(auths, 967 RTE_DIM(auths)) != 0) { 968 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G " 969 "testsuite not met\n"); 970 return TEST_SKIPPED; 971 } 972 973 return 0; 974 } 975 976 static int 977 zuc_testsuite_setup(void) 978 { 979 struct crypto_testsuite_params *ts_params = &testsuite_params; 980 uint8_t dev_id = ts_params->valid_devs[0]; 981 struct rte_cryptodev_info dev_info; 982 const enum rte_crypto_cipher_algorithm ciphers[] = { 983 RTE_CRYPTO_CIPHER_ZUC_EEA3 984 }; 985 const enum rte_crypto_auth_algorithm auths[] = { 986 RTE_CRYPTO_AUTH_ZUC_EIA3 987 }; 988 989 rte_cryptodev_info_get(dev_id, &dev_info); 990 991 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 992 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " 993 "testsuite not met\n"); 994 return TEST_SKIPPED; 995 } 996 997 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 998 && check_auth_capabilities_supported(auths, 999 RTE_DIM(auths)) != 0) { 1000 RTE_LOG(INFO, USER1, "Capability requirements for ZUC " 1001 "testsuite not met\n"); 1002 return TEST_SKIPPED; 1003 } 1004 1005 return 0; 1006 } 1007 1008 static int 1009 hmac_md5_auth_testsuite_setup(void) 1010 { 1011 struct crypto_testsuite_params *ts_params = &testsuite_params; 1012 uint8_t dev_id = ts_params->valid_devs[0]; 1013 struct rte_cryptodev_info dev_info; 1014 const enum rte_crypto_auth_algorithm auths[] = { 1015 RTE_CRYPTO_AUTH_MD5_HMAC 1016 }; 1017 1018 rte_cryptodev_info_get(dev_id, &dev_info); 1019 1020 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1021 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1022 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1023 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 " 1024 "Auth testsuite not met\n"); 1025 return TEST_SKIPPED; 1026 } 1027 1028 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1029 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 " 1030 "testsuite not met\n"); 1031 return TEST_SKIPPED; 1032 } 1033 1034 return 0; 1035 } 1036 1037 static int 1038 kasumi_testsuite_setup(void) 1039 { 1040 struct crypto_testsuite_params *ts_params = &testsuite_params; 1041 uint8_t dev_id = ts_params->valid_devs[0]; 1042 struct rte_cryptodev_info dev_info; 1043 const enum rte_crypto_cipher_algorithm ciphers[] = { 1044 RTE_CRYPTO_CIPHER_KASUMI_F8 1045 }; 1046 const enum rte_crypto_auth_algorithm auths[] = { 1047 RTE_CRYPTO_AUTH_KASUMI_F9 1048 }; 1049 1050 rte_cryptodev_info_get(dev_id, &dev_info); 1051 1052 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1053 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1054 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1055 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi " 1056 "testsuite not met\n"); 1057 return TEST_SKIPPED; 1058 } 1059 1060 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1061 && check_auth_capabilities_supported(auths, 1062 RTE_DIM(auths)) != 0) { 1063 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi " 1064 "testsuite not met\n"); 1065 return TEST_SKIPPED; 1066 } 1067 1068 return 0; 1069 } 1070 1071 static int 1072 negative_aes_gcm_testsuite_setup(void) 1073 { 1074 struct crypto_testsuite_params *ts_params = &testsuite_params; 1075 uint8_t dev_id = ts_params->valid_devs[0]; 1076 struct rte_cryptodev_info dev_info; 1077 const enum rte_crypto_aead_algorithm aeads[] = { 1078 RTE_CRYPTO_AEAD_AES_GCM 1079 }; 1080 1081 rte_cryptodev_info_get(dev_id, &dev_info); 1082 1083 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1084 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1085 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1086 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1087 "AES GCM testsuite not met\n"); 1088 return TEST_SKIPPED; 1089 } 1090 1091 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1092 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1093 "AES GCM testsuite not met\n"); 1094 return TEST_SKIPPED; 1095 } 1096 1097 return 0; 1098 } 1099 1100 static int 1101 negative_aes_gmac_testsuite_setup(void) 1102 { 1103 struct crypto_testsuite_params *ts_params = &testsuite_params; 1104 uint8_t dev_id = ts_params->valid_devs[0]; 1105 struct rte_cryptodev_info dev_info; 1106 const enum rte_crypto_auth_algorithm auths[] = { 1107 RTE_CRYPTO_AUTH_AES_GMAC 1108 }; 1109 1110 rte_cryptodev_info_get(dev_id, &dev_info); 1111 1112 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1113 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1114 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1115 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1116 "AES GMAC testsuite not met\n"); 1117 return TEST_SKIPPED; 1118 } 1119 1120 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1121 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1122 "AES GMAC testsuite not met\n"); 1123 return TEST_SKIPPED; 1124 } 1125 1126 return 0; 1127 } 1128 1129 static int 1130 mixed_cipher_hash_testsuite_setup(void) 1131 { 1132 struct crypto_testsuite_params *ts_params = &testsuite_params; 1133 uint8_t dev_id = ts_params->valid_devs[0]; 1134 struct rte_cryptodev_info dev_info; 1135 uint64_t feat_flags; 1136 const enum rte_crypto_cipher_algorithm ciphers[] = { 1137 RTE_CRYPTO_CIPHER_NULL, 1138 RTE_CRYPTO_CIPHER_AES_CTR, 1139 RTE_CRYPTO_CIPHER_ZUC_EEA3, 1140 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1141 }; 1142 const enum rte_crypto_auth_algorithm auths[] = { 1143 RTE_CRYPTO_AUTH_NULL, 1144 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 1145 RTE_CRYPTO_AUTH_AES_CMAC, 1146 RTE_CRYPTO_AUTH_ZUC_EIA3 1147 }; 1148 1149 rte_cryptodev_info_get(dev_id, &dev_info); 1150 feat_flags = dev_info.feature_flags; 1151 1152 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1153 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1154 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed " 1155 "Cipher Hash testsuite not met\n"); 1156 return TEST_SKIPPED; 1157 } 1158 1159 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1160 && check_auth_capabilities_supported(auths, 1161 RTE_DIM(auths)) != 0) { 1162 RTE_LOG(INFO, USER1, "Capability requirements for Mixed " 1163 "Cipher Hash testsuite not met\n"); 1164 return TEST_SKIPPED; 1165 } 1166 1167 return 0; 1168 } 1169 1170 static int 1171 esn_testsuite_setup(void) 1172 { 1173 struct crypto_testsuite_params *ts_params = &testsuite_params; 1174 uint8_t dev_id = ts_params->valid_devs[0]; 1175 struct rte_cryptodev_info dev_info; 1176 const enum rte_crypto_cipher_algorithm ciphers[] = { 1177 RTE_CRYPTO_CIPHER_AES_CBC 1178 }; 1179 const enum rte_crypto_auth_algorithm auths[] = { 1180 RTE_CRYPTO_AUTH_SHA1_HMAC 1181 }; 1182 1183 rte_cryptodev_info_get(dev_id, &dev_info); 1184 1185 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1186 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1187 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1188 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " 1189 "testsuite not met\n"); 1190 return TEST_SKIPPED; 1191 } 1192 1193 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1194 && check_auth_capabilities_supported(auths, 1195 RTE_DIM(auths)) != 0) { 1196 RTE_LOG(INFO, USER1, "Capability requirements for ESN " 1197 "testsuite not met\n"); 1198 return TEST_SKIPPED; 1199 } 1200 1201 return 0; 1202 } 1203 1204 static int 1205 multi_session_testsuite_setup(void) 1206 { 1207 struct crypto_testsuite_params *ts_params = &testsuite_params; 1208 uint8_t dev_id = ts_params->valid_devs[0]; 1209 struct rte_cryptodev_info dev_info; 1210 const enum rte_crypto_cipher_algorithm ciphers[] = { 1211 RTE_CRYPTO_CIPHER_AES_CBC 1212 }; 1213 const enum rte_crypto_auth_algorithm auths[] = { 1214 RTE_CRYPTO_AUTH_SHA512_HMAC 1215 }; 1216 1217 rte_cryptodev_info_get(dev_id, &dev_info); 1218 1219 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1220 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi " 1221 "Session testsuite not met\n"); 1222 return TEST_SKIPPED; 1223 } 1224 1225 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1226 && check_auth_capabilities_supported(auths, 1227 RTE_DIM(auths)) != 0) { 1228 RTE_LOG(INFO, USER1, "Capability requirements for Multi " 1229 "Session testsuite not met\n"); 1230 return TEST_SKIPPED; 1231 } 1232 1233 return 0; 1234 } 1235 1236 static int 1237 negative_hmac_sha1_testsuite_setup(void) 1238 { 1239 struct crypto_testsuite_params *ts_params = &testsuite_params; 1240 uint8_t dev_id = ts_params->valid_devs[0]; 1241 struct rte_cryptodev_info dev_info; 1242 const enum rte_crypto_cipher_algorithm ciphers[] = { 1243 RTE_CRYPTO_CIPHER_AES_CBC 1244 }; 1245 const enum rte_crypto_auth_algorithm auths[] = { 1246 RTE_CRYPTO_AUTH_SHA1_HMAC 1247 }; 1248 1249 rte_cryptodev_info_get(dev_id, &dev_info); 1250 1251 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1252 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1253 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1254 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1255 "HMAC SHA1 testsuite not met\n"); 1256 return TEST_SKIPPED; 1257 } 1258 1259 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1260 && check_auth_capabilities_supported(auths, 1261 RTE_DIM(auths)) != 0) { 1262 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1263 "HMAC SHA1 testsuite not met\n"); 1264 return TEST_SKIPPED; 1265 } 1266 1267 return 0; 1268 } 1269 1270 static int 1271 dev_configure_and_start(uint64_t ff_disable) 1272 { 1273 struct crypto_testsuite_params *ts_params = &testsuite_params; 1274 struct crypto_unittest_params *ut_params = &unittest_params; 1275 1276 uint16_t qp_id; 1277 1278 /* Clear unit test parameters before running test */ 1279 memset(ut_params, 0, sizeof(*ut_params)); 1280 1281 /* Reconfigure device to default parameters */ 1282 ts_params->conf.socket_id = SOCKET_ID_ANY; 1283 ts_params->conf.ff_disable = ff_disable; 1284 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 1285 ts_params->qp_conf.mp_session = ts_params->session_mpool; 1286 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 1287 1288 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1289 &ts_params->conf), 1290 "Failed to configure cryptodev %u", 1291 ts_params->valid_devs[0]); 1292 1293 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 1294 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1295 ts_params->valid_devs[0], qp_id, 1296 &ts_params->qp_conf, 1297 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1298 "Failed to setup queue pair %u on cryptodev %u", 1299 qp_id, ts_params->valid_devs[0]); 1300 } 1301 1302 1303 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 1304 1305 /* Start the device */ 1306 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 1307 "Failed to start cryptodev %u", 1308 ts_params->valid_devs[0]); 1309 1310 return TEST_SUCCESS; 1311 } 1312 1313 int 1314 ut_setup(void) 1315 { 1316 /* Configure and start the device with security feature disabled */ 1317 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 1318 } 1319 1320 static int 1321 ut_setup_security(void) 1322 { 1323 /* Configure and start the device with no features disabled */ 1324 return dev_configure_and_start(0); 1325 } 1326 1327 void 1328 ut_teardown(void) 1329 { 1330 struct crypto_testsuite_params *ts_params = &testsuite_params; 1331 struct crypto_unittest_params *ut_params = &unittest_params; 1332 struct rte_cryptodev_stats stats; 1333 1334 /* free crypto session structure */ 1335 #ifdef RTE_LIB_SECURITY 1336 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 1337 if (ut_params->sec_session) { 1338 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 1339 (ts_params->valid_devs[0]), 1340 ut_params->sec_session); 1341 ut_params->sec_session = NULL; 1342 } 1343 } else 1344 #endif 1345 { 1346 if (ut_params->sess) { 1347 rte_cryptodev_sym_session_clear( 1348 ts_params->valid_devs[0], 1349 ut_params->sess); 1350 rte_cryptodev_sym_session_free(ut_params->sess); 1351 ut_params->sess = NULL; 1352 } 1353 } 1354 1355 /* free crypto operation structure */ 1356 if (ut_params->op) 1357 rte_crypto_op_free(ut_params->op); 1358 1359 /* 1360 * free mbuf - both obuf and ibuf are usually the same, 1361 * so check if they point at the same address is necessary, 1362 * to avoid freeing the mbuf twice. 1363 */ 1364 if (ut_params->obuf) { 1365 rte_pktmbuf_free(ut_params->obuf); 1366 if (ut_params->ibuf == ut_params->obuf) 1367 ut_params->ibuf = 0; 1368 ut_params->obuf = 0; 1369 } 1370 if (ut_params->ibuf) { 1371 rte_pktmbuf_free(ut_params->ibuf); 1372 ut_params->ibuf = 0; 1373 } 1374 1375 if (ts_params->mbuf_pool != NULL) 1376 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 1377 rte_mempool_avail_count(ts_params->mbuf_pool)); 1378 1379 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); 1380 1381 /* Stop the device */ 1382 rte_cryptodev_stop(ts_params->valid_devs[0]); 1383 } 1384 1385 static int 1386 test_device_configure_invalid_dev_id(void) 1387 { 1388 struct crypto_testsuite_params *ts_params = &testsuite_params; 1389 uint16_t dev_id, num_devs = 0; 1390 1391 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 1392 "Need at least %d devices for test", 1); 1393 1394 /* valid dev_id values */ 1395 dev_id = ts_params->valid_devs[0]; 1396 1397 /* Stop the device in case it's started so it can be configured */ 1398 rte_cryptodev_stop(dev_id); 1399 1400 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 1401 "Failed test for rte_cryptodev_configure: " 1402 "invalid dev_num %u", dev_id); 1403 1404 /* invalid dev_id values */ 1405 dev_id = num_devs; 1406 1407 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1408 "Failed test for rte_cryptodev_configure: " 1409 "invalid dev_num %u", dev_id); 1410 1411 dev_id = 0xff; 1412 1413 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1414 "Failed test for rte_cryptodev_configure:" 1415 "invalid dev_num %u", dev_id); 1416 1417 return TEST_SUCCESS; 1418 } 1419 1420 static int 1421 test_device_configure_invalid_queue_pair_ids(void) 1422 { 1423 struct crypto_testsuite_params *ts_params = &testsuite_params; 1424 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1425 1426 /* Stop the device in case it's started so it can be configured */ 1427 rte_cryptodev_stop(ts_params->valid_devs[0]); 1428 1429 /* valid - max value queue pairs */ 1430 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1431 1432 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1433 &ts_params->conf), 1434 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1435 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1436 1437 /* valid - one queue pairs */ 1438 ts_params->conf.nb_queue_pairs = 1; 1439 1440 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1441 &ts_params->conf), 1442 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1443 ts_params->valid_devs[0], 1444 ts_params->conf.nb_queue_pairs); 1445 1446 1447 /* invalid - zero queue pairs */ 1448 ts_params->conf.nb_queue_pairs = 0; 1449 1450 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1451 &ts_params->conf), 1452 "Failed test for rte_cryptodev_configure, dev_id %u," 1453 " invalid qps: %u", 1454 ts_params->valid_devs[0], 1455 ts_params->conf.nb_queue_pairs); 1456 1457 1458 /* invalid - max value supported by field queue pairs */ 1459 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1460 1461 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1462 &ts_params->conf), 1463 "Failed test for rte_cryptodev_configure, dev_id %u," 1464 " invalid qps: %u", 1465 ts_params->valid_devs[0], 1466 ts_params->conf.nb_queue_pairs); 1467 1468 1469 /* invalid - max value + 1 queue pairs */ 1470 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1471 1472 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1473 &ts_params->conf), 1474 "Failed test for rte_cryptodev_configure, dev_id %u," 1475 " invalid qps: %u", 1476 ts_params->valid_devs[0], 1477 ts_params->conf.nb_queue_pairs); 1478 1479 /* revert to original testsuite value */ 1480 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1481 1482 return TEST_SUCCESS; 1483 } 1484 1485 static int 1486 test_queue_pair_descriptor_setup(void) 1487 { 1488 struct crypto_testsuite_params *ts_params = &testsuite_params; 1489 struct rte_cryptodev_qp_conf qp_conf = { 1490 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1491 }; 1492 uint16_t qp_id; 1493 1494 /* Stop the device in case it's started so it can be configured */ 1495 rte_cryptodev_stop(ts_params->valid_devs[0]); 1496 1497 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1498 &ts_params->conf), 1499 "Failed to configure cryptodev %u", 1500 ts_params->valid_devs[0]); 1501 1502 /* 1503 * Test various ring sizes on this device. memzones can't be 1504 * freed so are re-used if ring is released and re-created. 1505 */ 1506 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1507 qp_conf.mp_session = ts_params->session_mpool; 1508 qp_conf.mp_session_private = ts_params->session_priv_mpool; 1509 1510 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1511 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1512 ts_params->valid_devs[0], qp_id, &qp_conf, 1513 rte_cryptodev_socket_id( 1514 ts_params->valid_devs[0])), 1515 "Failed test for " 1516 "rte_cryptodev_queue_pair_setup: num_inflights " 1517 "%u on qp %u on cryptodev %u", 1518 qp_conf.nb_descriptors, qp_id, 1519 ts_params->valid_devs[0]); 1520 } 1521 1522 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1523 1524 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1525 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1526 ts_params->valid_devs[0], qp_id, &qp_conf, 1527 rte_cryptodev_socket_id( 1528 ts_params->valid_devs[0])), 1529 "Failed test for" 1530 " rte_cryptodev_queue_pair_setup: num_inflights" 1531 " %u on qp %u on cryptodev %u", 1532 qp_conf.nb_descriptors, qp_id, 1533 ts_params->valid_devs[0]); 1534 } 1535 1536 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1537 1538 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1539 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1540 ts_params->valid_devs[0], qp_id, &qp_conf, 1541 rte_cryptodev_socket_id( 1542 ts_params->valid_devs[0])), 1543 "Failed test for " 1544 "rte_cryptodev_queue_pair_setup: num_inflights" 1545 " %u on qp %u on cryptodev %u", 1546 qp_conf.nb_descriptors, qp_id, 1547 ts_params->valid_devs[0]); 1548 } 1549 1550 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1551 1552 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1553 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1554 ts_params->valid_devs[0], qp_id, &qp_conf, 1555 rte_cryptodev_socket_id( 1556 ts_params->valid_devs[0])), 1557 "Failed test for" 1558 " rte_cryptodev_queue_pair_setup:" 1559 "num_inflights %u on qp %u on cryptodev %u", 1560 qp_conf.nb_descriptors, qp_id, 1561 ts_params->valid_devs[0]); 1562 } 1563 1564 /* test invalid queue pair id */ 1565 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1566 1567 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1568 1569 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1570 ts_params->valid_devs[0], 1571 qp_id, &qp_conf, 1572 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1573 "Failed test for rte_cryptodev_queue_pair_setup:" 1574 "invalid qp %u on cryptodev %u", 1575 qp_id, ts_params->valid_devs[0]); 1576 1577 qp_id = 0xffff; /*invalid*/ 1578 1579 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1580 ts_params->valid_devs[0], 1581 qp_id, &qp_conf, 1582 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1583 "Failed test for rte_cryptodev_queue_pair_setup:" 1584 "invalid qp %u on cryptodev %u", 1585 qp_id, ts_params->valid_devs[0]); 1586 1587 return TEST_SUCCESS; 1588 } 1589 1590 /* ***** Plaintext data for tests ***** */ 1591 1592 const char catch_22_quote_1[] = 1593 "There was only one catch and that was Catch-22, which " 1594 "specified that a concern for one's safety in the face of " 1595 "dangers that were real and immediate was the process of a " 1596 "rational mind. Orr was crazy and could be grounded. All he " 1597 "had to do was ask; and as soon as he did, he would no longer " 1598 "be crazy and would have to fly more missions. Orr would be " 1599 "crazy to fly more missions and sane if he didn't, but if he " 1600 "was sane he had to fly them. If he flew them he was crazy " 1601 "and didn't have to; but if he didn't want to he was sane and " 1602 "had to. Yossarian was moved very deeply by the absolute " 1603 "simplicity of this clause of Catch-22 and let out a " 1604 "respectful whistle. \"That's some catch, that Catch-22\", he " 1605 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1606 1607 const char catch_22_quote[] = 1608 "What a lousy earth! He wondered how many people were " 1609 "destitute that same night even in his own prosperous country, " 1610 "how many homes were shanties, how many husbands were drunk " 1611 "and wives socked, and how many children were bullied, abused, " 1612 "or abandoned. How many families hungered for food they could " 1613 "not afford to buy? How many hearts were broken? How many " 1614 "suicides would take place that same night, how many people " 1615 "would go insane? How many cockroaches and landlords would " 1616 "triumph? How many winners were losers, successes failures, " 1617 "and rich men poor men? How many wise guys were stupid? How " 1618 "many happy endings were unhappy endings? How many honest men " 1619 "were liars, brave men cowards, loyal men traitors, how many " 1620 "sainted men were corrupt, how many people in positions of " 1621 "trust had sold their souls to bodyguards, how many had never " 1622 "had souls? How many straight-and-narrow paths were crooked " 1623 "paths? How many best families were worst families and how " 1624 "many good people were bad people? When you added them all up " 1625 "and then subtracted, you might be left with only the children, " 1626 "and perhaps with Albert Einstein and an old violinist or " 1627 "sculptor somewhere."; 1628 1629 #define QUOTE_480_BYTES (480) 1630 #define QUOTE_512_BYTES (512) 1631 #define QUOTE_768_BYTES (768) 1632 #define QUOTE_1024_BYTES (1024) 1633 1634 1635 1636 /* ***** SHA1 Hash Tests ***** */ 1637 1638 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1639 1640 static uint8_t hmac_sha1_key[] = { 1641 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1642 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1643 0xDE, 0xF4, 0xDE, 0xAD }; 1644 1645 /* ***** SHA224 Hash Tests ***** */ 1646 1647 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1648 1649 1650 /* ***** AES-CBC Cipher Tests ***** */ 1651 1652 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1653 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1654 1655 static uint8_t aes_cbc_key[] = { 1656 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1657 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1658 1659 static uint8_t aes_cbc_iv[] = { 1660 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1661 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1662 1663 1664 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1665 1666 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1667 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1668 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1669 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1670 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1671 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1672 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1673 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1674 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1675 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1676 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1677 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1678 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1679 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1680 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1681 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1682 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1683 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1684 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1685 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1686 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1687 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1688 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1689 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1690 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1691 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1692 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1693 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1694 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1695 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1696 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1697 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1698 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1699 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1700 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1701 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1702 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1703 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1704 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1705 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1706 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1707 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1708 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1709 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1710 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1711 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1712 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1713 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1714 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1715 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1716 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1717 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1718 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1719 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1720 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1721 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1722 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1723 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1724 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1725 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1726 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1727 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1728 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1729 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1730 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1731 }; 1732 1733 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1734 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1735 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1736 0x18, 0x8c, 0x1d, 0x32 1737 }; 1738 1739 1740 /* Multisession Vector context Test */ 1741 /*Begin Session 0 */ 1742 static uint8_t ms_aes_cbc_key0[] = { 1743 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1744 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1745 }; 1746 1747 static uint8_t ms_aes_cbc_iv0[] = { 1748 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1749 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1750 }; 1751 1752 static const uint8_t ms_aes_cbc_cipher0[] = { 1753 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1754 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1755 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1756 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1757 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1758 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1759 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1760 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1761 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1762 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1763 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1764 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1765 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1766 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1767 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1768 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1769 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1770 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1771 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1772 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1773 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1774 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1775 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1776 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1777 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1778 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1779 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1780 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1781 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1782 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1783 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1784 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1785 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1786 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1787 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1788 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1789 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1790 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1791 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1792 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1793 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1794 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1795 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1796 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1797 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1798 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1799 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1800 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1801 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1802 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1803 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1804 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1805 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1806 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1807 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1808 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1809 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1810 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1811 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1812 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1813 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1814 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1815 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1816 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1817 }; 1818 1819 1820 static uint8_t ms_hmac_key0[] = { 1821 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1822 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1823 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1824 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1825 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1826 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1827 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1828 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1829 }; 1830 1831 static const uint8_t ms_hmac_digest0[] = { 1832 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1833 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1834 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1835 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1836 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1837 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1838 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1839 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1840 }; 1841 1842 /* End Session 0 */ 1843 /* Begin session 1 */ 1844 1845 static uint8_t ms_aes_cbc_key1[] = { 1846 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1847 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1848 }; 1849 1850 static uint8_t ms_aes_cbc_iv1[] = { 1851 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1852 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1853 }; 1854 1855 static const uint8_t ms_aes_cbc_cipher1[] = { 1856 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1857 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1858 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1859 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1860 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1861 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1862 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1863 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1864 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1865 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1866 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1867 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1868 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1869 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1870 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1871 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1872 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1873 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1874 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1875 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1876 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1877 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1878 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1879 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1880 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1881 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1882 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1883 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1884 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1885 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1886 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1887 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1888 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1889 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1890 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1891 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1892 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1893 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1894 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1895 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1896 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1897 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1898 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1899 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1900 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1901 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1902 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1903 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1904 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1905 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1906 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1907 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1908 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1909 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1910 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1911 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1912 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1913 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1914 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1915 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1916 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 1917 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 1918 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 1919 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 1920 1921 }; 1922 1923 static uint8_t ms_hmac_key1[] = { 1924 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1925 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1926 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1927 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1928 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1929 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1930 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1931 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1932 }; 1933 1934 static const uint8_t ms_hmac_digest1[] = { 1935 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 1936 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 1937 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 1938 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 1939 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 1940 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 1941 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 1942 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 1943 }; 1944 /* End Session 1 */ 1945 /* Begin Session 2 */ 1946 static uint8_t ms_aes_cbc_key2[] = { 1947 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1948 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1949 }; 1950 1951 static uint8_t ms_aes_cbc_iv2[] = { 1952 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1953 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1954 }; 1955 1956 static const uint8_t ms_aes_cbc_cipher2[] = { 1957 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 1958 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 1959 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 1960 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 1961 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 1962 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 1963 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 1964 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 1965 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 1966 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 1967 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 1968 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 1969 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 1970 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 1971 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 1972 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 1973 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 1974 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 1975 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 1976 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 1977 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 1978 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 1979 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 1980 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 1981 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 1982 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 1983 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 1984 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 1985 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 1986 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 1987 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 1988 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 1989 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 1990 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 1991 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 1992 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 1993 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 1994 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 1995 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 1996 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 1997 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 1998 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 1999 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 2000 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 2001 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 2002 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 2003 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 2004 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 2005 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 2006 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 2007 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 2008 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 2009 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 2010 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 2011 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 2012 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 2013 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 2014 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 2015 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 2016 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 2017 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 2018 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 2019 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 2020 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 2021 }; 2022 2023 static uint8_t ms_hmac_key2[] = { 2024 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2025 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2026 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2027 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2028 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2029 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2030 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2031 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2032 }; 2033 2034 static const uint8_t ms_hmac_digest2[] = { 2035 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 2036 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 2037 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 2038 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 2039 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 2040 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 2041 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 2042 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 2043 }; 2044 2045 /* End Session 2 */ 2046 2047 2048 static int 2049 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 2050 { 2051 struct crypto_testsuite_params *ts_params = &testsuite_params; 2052 struct crypto_unittest_params *ut_params = &unittest_params; 2053 2054 /* Verify the capabilities */ 2055 struct rte_cryptodev_sym_capability_idx cap_idx; 2056 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2057 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 2058 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2059 &cap_idx) == NULL) 2060 return TEST_SKIPPED; 2061 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2062 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 2063 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2064 &cap_idx) == NULL) 2065 return TEST_SKIPPED; 2066 2067 /* Generate test mbuf data and space for digest */ 2068 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2069 catch_22_quote, QUOTE_512_BYTES, 0); 2070 2071 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2072 DIGEST_BYTE_LENGTH_SHA1); 2073 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2074 2075 /* Setup Cipher Parameters */ 2076 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2077 ut_params->cipher_xform.next = &ut_params->auth_xform; 2078 2079 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2080 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 2081 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 2082 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2083 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2084 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2085 2086 /* Setup HMAC Parameters */ 2087 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2088 2089 ut_params->auth_xform.next = NULL; 2090 2091 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 2092 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 2093 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 2094 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 2095 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 2096 2097 ut_params->sess = rte_cryptodev_sym_session_create( 2098 ts_params->session_mpool); 2099 2100 /* Create crypto session*/ 2101 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 2102 ut_params->sess, &ut_params->cipher_xform, 2103 ts_params->session_priv_mpool); 2104 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2105 2106 /* Generate crypto op data structure */ 2107 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2108 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2109 TEST_ASSERT_NOT_NULL(ut_params->op, 2110 "Failed to allocate symmetric crypto operation struct"); 2111 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 /* Set crypto operation authentication parameters */ 2120 sym_op->auth.digest.data = ut_params->digest; 2121 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2122 ut_params->ibuf, QUOTE_512_BYTES); 2123 2124 sym_op->auth.data.offset = 0; 2125 sym_op->auth.data.length = QUOTE_512_BYTES; 2126 2127 /* Copy IV at the end of the crypto operation */ 2128 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2129 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 2130 2131 /* Set crypto operation cipher parameters */ 2132 sym_op->cipher.data.offset = 0; 2133 sym_op->cipher.data.length = QUOTE_512_BYTES; 2134 2135 /* Process crypto operation */ 2136 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2137 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2138 ut_params->op); 2139 else 2140 TEST_ASSERT_NOT_NULL( 2141 process_crypto_request(ts_params->valid_devs[0], 2142 ut_params->op), 2143 "failed to process sym crypto op"); 2144 2145 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2146 "crypto op processing failed"); 2147 2148 /* Validate obuf */ 2149 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 2150 uint8_t *); 2151 2152 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 2153 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 2154 QUOTE_512_BYTES, 2155 "ciphertext data not as expected"); 2156 2157 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 2158 2159 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 2160 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 2161 gbl_driver_id == rte_cryptodev_driver_id_get( 2162 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 2163 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 2164 DIGEST_BYTE_LENGTH_SHA1, 2165 "Generated digest data not as expected"); 2166 2167 return TEST_SUCCESS; 2168 } 2169 2170 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 2171 2172 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 2173 2174 static uint8_t hmac_sha512_key[] = { 2175 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 2176 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2177 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2178 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 2179 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 2180 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2181 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 2182 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 2183 2184 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 2185 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 2186 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 2187 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 2188 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 2189 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 2190 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 2191 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 2192 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 2193 2194 2195 2196 static int 2197 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2198 struct crypto_unittest_params *ut_params, 2199 uint8_t *cipher_key, 2200 uint8_t *hmac_key); 2201 2202 static int 2203 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2204 struct crypto_unittest_params *ut_params, 2205 struct crypto_testsuite_params *ts_params, 2206 const uint8_t *cipher, 2207 const uint8_t *digest, 2208 const uint8_t *iv); 2209 2210 2211 static int 2212 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2213 struct crypto_unittest_params *ut_params, 2214 uint8_t *cipher_key, 2215 uint8_t *hmac_key) 2216 { 2217 2218 /* Setup Cipher Parameters */ 2219 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2220 ut_params->cipher_xform.next = NULL; 2221 2222 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2223 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 2224 ut_params->cipher_xform.cipher.key.data = cipher_key; 2225 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2226 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2227 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2228 2229 /* Setup HMAC Parameters */ 2230 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2231 ut_params->auth_xform.next = &ut_params->cipher_xform; 2232 2233 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 2234 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 2235 ut_params->auth_xform.auth.key.data = hmac_key; 2236 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 2237 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 2238 2239 return TEST_SUCCESS; 2240 } 2241 2242 2243 static int 2244 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2245 struct crypto_unittest_params *ut_params, 2246 struct crypto_testsuite_params *ts_params, 2247 const uint8_t *cipher, 2248 const uint8_t *digest, 2249 const uint8_t *iv) 2250 { 2251 /* Generate test mbuf data and digest */ 2252 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2253 (const char *) 2254 cipher, 2255 QUOTE_512_BYTES, 0); 2256 2257 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2258 DIGEST_BYTE_LENGTH_SHA512); 2259 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2260 2261 rte_memcpy(ut_params->digest, 2262 digest, 2263 DIGEST_BYTE_LENGTH_SHA512); 2264 2265 /* Generate Crypto op data structure */ 2266 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2267 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2268 TEST_ASSERT_NOT_NULL(ut_params->op, 2269 "Failed to allocate symmetric crypto operation struct"); 2270 2271 rte_crypto_op_attach_sym_session(ut_params->op, sess); 2272 2273 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2274 2275 /* set crypto operation source mbuf */ 2276 sym_op->m_src = ut_params->ibuf; 2277 2278 sym_op->auth.digest.data = ut_params->digest; 2279 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2280 ut_params->ibuf, QUOTE_512_BYTES); 2281 2282 sym_op->auth.data.offset = 0; 2283 sym_op->auth.data.length = QUOTE_512_BYTES; 2284 2285 /* Copy IV at the end of the crypto operation */ 2286 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2287 iv, CIPHER_IV_LENGTH_AES_CBC); 2288 2289 sym_op->cipher.data.offset = 0; 2290 sym_op->cipher.data.length = QUOTE_512_BYTES; 2291 2292 /* Process crypto operation */ 2293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2294 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2295 ut_params->op); 2296 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2297 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2298 ut_params->op, 1, 1, 0, 0); 2299 else 2300 TEST_ASSERT_NOT_NULL( 2301 process_crypto_request(ts_params->valid_devs[0], 2302 ut_params->op), 2303 "failed to process sym crypto op"); 2304 2305 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2306 "crypto op processing failed"); 2307 2308 ut_params->obuf = ut_params->op->sym->m_src; 2309 2310 /* Validate obuf */ 2311 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2312 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 2313 catch_22_quote, 2314 QUOTE_512_BYTES, 2315 "Plaintext data not as expected"); 2316 2317 /* Validate obuf */ 2318 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2319 "Digest verification failed"); 2320 2321 return TEST_SUCCESS; 2322 } 2323 2324 /* ***** SNOW 3G Tests ***** */ 2325 static int 2326 create_wireless_algo_hash_session(uint8_t dev_id, 2327 const uint8_t *key, const uint8_t key_len, 2328 const uint8_t iv_len, const uint8_t auth_len, 2329 enum rte_crypto_auth_operation op, 2330 enum rte_crypto_auth_algorithm algo) 2331 { 2332 uint8_t hash_key[key_len]; 2333 int status; 2334 2335 struct crypto_testsuite_params *ts_params = &testsuite_params; 2336 struct crypto_unittest_params *ut_params = &unittest_params; 2337 2338 memcpy(hash_key, key, key_len); 2339 2340 debug_hexdump(stdout, "key:", key, key_len); 2341 2342 /* Setup Authentication Parameters */ 2343 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2344 ut_params->auth_xform.next = NULL; 2345 2346 ut_params->auth_xform.auth.op = op; 2347 ut_params->auth_xform.auth.algo = algo; 2348 ut_params->auth_xform.auth.key.length = key_len; 2349 ut_params->auth_xform.auth.key.data = hash_key; 2350 ut_params->auth_xform.auth.digest_length = auth_len; 2351 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2352 ut_params->auth_xform.auth.iv.length = iv_len; 2353 ut_params->sess = rte_cryptodev_sym_session_create( 2354 ts_params->session_mpool); 2355 2356 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2357 &ut_params->auth_xform, 2358 ts_params->session_priv_mpool); 2359 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2360 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2361 return 0; 2362 } 2363 2364 static int 2365 create_wireless_algo_cipher_session(uint8_t dev_id, 2366 enum rte_crypto_cipher_operation op, 2367 enum rte_crypto_cipher_algorithm algo, 2368 const uint8_t *key, const uint8_t key_len, 2369 uint8_t iv_len) 2370 { 2371 uint8_t cipher_key[key_len]; 2372 int status; 2373 struct crypto_testsuite_params *ts_params = &testsuite_params; 2374 struct crypto_unittest_params *ut_params = &unittest_params; 2375 2376 memcpy(cipher_key, key, key_len); 2377 2378 /* Setup Cipher Parameters */ 2379 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2380 ut_params->cipher_xform.next = NULL; 2381 2382 ut_params->cipher_xform.cipher.algo = algo; 2383 ut_params->cipher_xform.cipher.op = op; 2384 ut_params->cipher_xform.cipher.key.data = cipher_key; 2385 ut_params->cipher_xform.cipher.key.length = key_len; 2386 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2387 ut_params->cipher_xform.cipher.iv.length = iv_len; 2388 2389 debug_hexdump(stdout, "key:", key, key_len); 2390 2391 /* Create Crypto session */ 2392 ut_params->sess = rte_cryptodev_sym_session_create( 2393 ts_params->session_mpool); 2394 2395 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2396 &ut_params->cipher_xform, 2397 ts_params->session_priv_mpool); 2398 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2399 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2400 return 0; 2401 } 2402 2403 static int 2404 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2405 unsigned int cipher_len, 2406 unsigned int cipher_offset) 2407 { 2408 struct crypto_testsuite_params *ts_params = &testsuite_params; 2409 struct crypto_unittest_params *ut_params = &unittest_params; 2410 2411 /* Generate Crypto op data structure */ 2412 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2413 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2414 TEST_ASSERT_NOT_NULL(ut_params->op, 2415 "Failed to allocate pktmbuf offload"); 2416 2417 /* Set crypto operation data parameters */ 2418 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2419 2420 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2421 2422 /* set crypto operation source mbuf */ 2423 sym_op->m_src = ut_params->ibuf; 2424 2425 /* iv */ 2426 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2427 iv, iv_len); 2428 sym_op->cipher.data.length = cipher_len; 2429 sym_op->cipher.data.offset = cipher_offset; 2430 return 0; 2431 } 2432 2433 static int 2434 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2435 unsigned int cipher_len, 2436 unsigned int cipher_offset) 2437 { 2438 struct crypto_testsuite_params *ts_params = &testsuite_params; 2439 struct crypto_unittest_params *ut_params = &unittest_params; 2440 2441 /* Generate Crypto op data structure */ 2442 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2443 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2444 TEST_ASSERT_NOT_NULL(ut_params->op, 2445 "Failed to allocate pktmbuf offload"); 2446 2447 /* Set crypto operation data parameters */ 2448 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2449 2450 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2451 2452 /* set crypto operation source mbuf */ 2453 sym_op->m_src = ut_params->ibuf; 2454 sym_op->m_dst = ut_params->obuf; 2455 2456 /* iv */ 2457 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2458 iv, iv_len); 2459 sym_op->cipher.data.length = cipher_len; 2460 sym_op->cipher.data.offset = cipher_offset; 2461 return 0; 2462 } 2463 2464 static int 2465 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2466 enum rte_crypto_cipher_operation cipher_op, 2467 enum rte_crypto_auth_operation auth_op, 2468 enum rte_crypto_auth_algorithm auth_algo, 2469 enum rte_crypto_cipher_algorithm cipher_algo, 2470 const uint8_t *key, uint8_t key_len, 2471 uint8_t auth_iv_len, uint8_t auth_len, 2472 uint8_t cipher_iv_len) 2473 2474 { 2475 uint8_t cipher_auth_key[key_len]; 2476 int status; 2477 2478 struct crypto_testsuite_params *ts_params = &testsuite_params; 2479 struct crypto_unittest_params *ut_params = &unittest_params; 2480 2481 memcpy(cipher_auth_key, key, key_len); 2482 2483 /* Setup Authentication Parameters */ 2484 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2485 ut_params->auth_xform.next = NULL; 2486 2487 ut_params->auth_xform.auth.op = auth_op; 2488 ut_params->auth_xform.auth.algo = auth_algo; 2489 ut_params->auth_xform.auth.key.length = key_len; 2490 /* Hash key = cipher key */ 2491 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2492 ut_params->auth_xform.auth.digest_length = auth_len; 2493 /* Auth IV will be after cipher IV */ 2494 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2495 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2496 2497 /* Setup Cipher Parameters */ 2498 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2499 ut_params->cipher_xform.next = &ut_params->auth_xform; 2500 2501 ut_params->cipher_xform.cipher.algo = cipher_algo; 2502 ut_params->cipher_xform.cipher.op = cipher_op; 2503 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2504 ut_params->cipher_xform.cipher.key.length = key_len; 2505 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2506 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2507 2508 debug_hexdump(stdout, "key:", key, key_len); 2509 2510 /* Create Crypto session*/ 2511 ut_params->sess = rte_cryptodev_sym_session_create( 2512 ts_params->session_mpool); 2513 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2514 2515 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2516 &ut_params->cipher_xform, 2517 ts_params->session_priv_mpool); 2518 if (status == -ENOTSUP) 2519 return TEST_SKIPPED; 2520 2521 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2522 return 0; 2523 } 2524 2525 static int 2526 create_wireless_cipher_auth_session(uint8_t dev_id, 2527 enum rte_crypto_cipher_operation cipher_op, 2528 enum rte_crypto_auth_operation auth_op, 2529 enum rte_crypto_auth_algorithm auth_algo, 2530 enum rte_crypto_cipher_algorithm cipher_algo, 2531 const struct wireless_test_data *tdata) 2532 { 2533 const uint8_t key_len = tdata->key.len; 2534 uint8_t cipher_auth_key[key_len]; 2535 int status; 2536 2537 struct crypto_testsuite_params *ts_params = &testsuite_params; 2538 struct crypto_unittest_params *ut_params = &unittest_params; 2539 const uint8_t *key = tdata->key.data; 2540 const uint8_t auth_len = tdata->digest.len; 2541 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2542 uint8_t auth_iv_len = tdata->auth_iv.len; 2543 2544 memcpy(cipher_auth_key, key, key_len); 2545 2546 /* Setup Authentication Parameters */ 2547 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2548 ut_params->auth_xform.next = NULL; 2549 2550 ut_params->auth_xform.auth.op = auth_op; 2551 ut_params->auth_xform.auth.algo = auth_algo; 2552 ut_params->auth_xform.auth.key.length = key_len; 2553 /* Hash key = cipher key */ 2554 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2555 ut_params->auth_xform.auth.digest_length = auth_len; 2556 /* Auth IV will be after cipher IV */ 2557 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2558 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2559 2560 /* Setup Cipher Parameters */ 2561 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2562 ut_params->cipher_xform.next = &ut_params->auth_xform; 2563 2564 ut_params->cipher_xform.cipher.algo = cipher_algo; 2565 ut_params->cipher_xform.cipher.op = cipher_op; 2566 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2567 ut_params->cipher_xform.cipher.key.length = key_len; 2568 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2569 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2570 2571 2572 debug_hexdump(stdout, "key:", key, key_len); 2573 2574 /* Create Crypto session*/ 2575 ut_params->sess = rte_cryptodev_sym_session_create( 2576 ts_params->session_mpool); 2577 2578 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2579 &ut_params->cipher_xform, 2580 ts_params->session_priv_mpool); 2581 if (status == -ENOTSUP) 2582 return TEST_SKIPPED; 2583 2584 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2585 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2586 return 0; 2587 } 2588 2589 static int 2590 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2591 const struct wireless_test_data *tdata) 2592 { 2593 return create_wireless_cipher_auth_session(dev_id, 2594 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2595 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2596 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2597 } 2598 2599 static int 2600 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2601 enum rte_crypto_cipher_operation cipher_op, 2602 enum rte_crypto_auth_operation auth_op, 2603 enum rte_crypto_auth_algorithm auth_algo, 2604 enum rte_crypto_cipher_algorithm cipher_algo, 2605 const uint8_t *key, const uint8_t key_len, 2606 uint8_t auth_iv_len, uint8_t auth_len, 2607 uint8_t cipher_iv_len) 2608 { 2609 uint8_t auth_cipher_key[key_len]; 2610 int status; 2611 struct crypto_testsuite_params *ts_params = &testsuite_params; 2612 struct crypto_unittest_params *ut_params = &unittest_params; 2613 2614 memcpy(auth_cipher_key, key, key_len); 2615 2616 /* Setup Authentication Parameters */ 2617 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2618 ut_params->auth_xform.auth.op = auth_op; 2619 ut_params->auth_xform.next = &ut_params->cipher_xform; 2620 ut_params->auth_xform.auth.algo = auth_algo; 2621 ut_params->auth_xform.auth.key.length = key_len; 2622 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2623 ut_params->auth_xform.auth.digest_length = auth_len; 2624 /* Auth IV will be after cipher IV */ 2625 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2626 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2627 2628 /* Setup Cipher Parameters */ 2629 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2630 ut_params->cipher_xform.next = NULL; 2631 ut_params->cipher_xform.cipher.algo = cipher_algo; 2632 ut_params->cipher_xform.cipher.op = cipher_op; 2633 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2634 ut_params->cipher_xform.cipher.key.length = key_len; 2635 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2636 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2637 2638 debug_hexdump(stdout, "key:", key, key_len); 2639 2640 /* Create Crypto session*/ 2641 ut_params->sess = rte_cryptodev_sym_session_create( 2642 ts_params->session_mpool); 2643 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2644 2645 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2646 ut_params->auth_xform.next = NULL; 2647 ut_params->cipher_xform.next = &ut_params->auth_xform; 2648 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2649 &ut_params->cipher_xform, 2650 ts_params->session_priv_mpool); 2651 2652 } else 2653 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2654 &ut_params->auth_xform, 2655 ts_params->session_priv_mpool); 2656 2657 if (status == -ENOTSUP) 2658 return TEST_SKIPPED; 2659 2660 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2661 2662 return 0; 2663 } 2664 2665 static int 2666 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2667 unsigned int auth_tag_len, 2668 const uint8_t *iv, unsigned int iv_len, 2669 unsigned int data_pad_len, 2670 enum rte_crypto_auth_operation op, 2671 unsigned int auth_len, unsigned int auth_offset) 2672 { 2673 struct crypto_testsuite_params *ts_params = &testsuite_params; 2674 2675 struct crypto_unittest_params *ut_params = &unittest_params; 2676 2677 /* Generate Crypto op data structure */ 2678 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2679 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2680 TEST_ASSERT_NOT_NULL(ut_params->op, 2681 "Failed to allocate pktmbuf offload"); 2682 2683 /* Set crypto operation data parameters */ 2684 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2685 2686 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2687 2688 /* set crypto operation source mbuf */ 2689 sym_op->m_src = ut_params->ibuf; 2690 2691 /* iv */ 2692 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2693 iv, iv_len); 2694 /* digest */ 2695 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2696 ut_params->ibuf, auth_tag_len); 2697 2698 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2699 "no room to append auth tag"); 2700 ut_params->digest = sym_op->auth.digest.data; 2701 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2702 ut_params->ibuf, data_pad_len); 2703 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2704 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2705 else 2706 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2707 2708 debug_hexdump(stdout, "digest:", 2709 sym_op->auth.digest.data, 2710 auth_tag_len); 2711 2712 sym_op->auth.data.length = auth_len; 2713 sym_op->auth.data.offset = auth_offset; 2714 2715 return 0; 2716 } 2717 2718 static int 2719 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2720 enum rte_crypto_auth_operation op) 2721 { 2722 struct crypto_testsuite_params *ts_params = &testsuite_params; 2723 struct crypto_unittest_params *ut_params = &unittest_params; 2724 2725 const uint8_t *auth_tag = tdata->digest.data; 2726 const unsigned int auth_tag_len = tdata->digest.len; 2727 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2728 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2729 2730 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2731 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2732 const uint8_t *auth_iv = tdata->auth_iv.data; 2733 const uint8_t auth_iv_len = tdata->auth_iv.len; 2734 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2735 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2736 2737 /* Generate Crypto op data structure */ 2738 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2739 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2740 TEST_ASSERT_NOT_NULL(ut_params->op, 2741 "Failed to allocate pktmbuf offload"); 2742 /* Set crypto operation data parameters */ 2743 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2744 2745 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2746 2747 /* set crypto operation source mbuf */ 2748 sym_op->m_src = ut_params->ibuf; 2749 2750 /* digest */ 2751 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2752 ut_params->ibuf, auth_tag_len); 2753 2754 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2755 "no room to append auth tag"); 2756 ut_params->digest = sym_op->auth.digest.data; 2757 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2758 ut_params->ibuf, data_pad_len); 2759 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2760 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2761 else 2762 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2763 2764 debug_hexdump(stdout, "digest:", 2765 sym_op->auth.digest.data, 2766 auth_tag_len); 2767 2768 /* Copy cipher and auth IVs at the end of the crypto operation */ 2769 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2770 IV_OFFSET); 2771 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2772 iv_ptr += cipher_iv_len; 2773 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2774 2775 sym_op->cipher.data.length = cipher_len; 2776 sym_op->cipher.data.offset = 0; 2777 sym_op->auth.data.length = auth_len; 2778 sym_op->auth.data.offset = 0; 2779 2780 return 0; 2781 } 2782 2783 static int 2784 create_zuc_cipher_hash_generate_operation( 2785 const struct wireless_test_data *tdata) 2786 { 2787 return create_wireless_cipher_hash_operation(tdata, 2788 RTE_CRYPTO_AUTH_OP_GENERATE); 2789 } 2790 2791 static int 2792 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2793 const unsigned auth_tag_len, 2794 const uint8_t *auth_iv, uint8_t auth_iv_len, 2795 unsigned data_pad_len, 2796 enum rte_crypto_auth_operation op, 2797 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2798 const unsigned cipher_len, const unsigned cipher_offset, 2799 const unsigned auth_len, const unsigned auth_offset) 2800 { 2801 struct crypto_testsuite_params *ts_params = &testsuite_params; 2802 struct crypto_unittest_params *ut_params = &unittest_params; 2803 2804 enum rte_crypto_cipher_algorithm cipher_algo = 2805 ut_params->cipher_xform.cipher.algo; 2806 enum rte_crypto_auth_algorithm auth_algo = 2807 ut_params->auth_xform.auth.algo; 2808 2809 /* Generate Crypto op data structure */ 2810 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2811 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2812 TEST_ASSERT_NOT_NULL(ut_params->op, 2813 "Failed to allocate pktmbuf offload"); 2814 /* Set crypto operation data parameters */ 2815 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2816 2817 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2818 2819 /* set crypto operation source mbuf */ 2820 sym_op->m_src = ut_params->ibuf; 2821 2822 /* digest */ 2823 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2824 ut_params->ibuf, auth_tag_len); 2825 2826 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2827 "no room to append auth tag"); 2828 ut_params->digest = sym_op->auth.digest.data; 2829 2830 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2831 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2832 ut_params->ibuf, data_pad_len); 2833 } else { 2834 struct rte_mbuf *m = ut_params->ibuf; 2835 unsigned int offset = data_pad_len; 2836 2837 while (offset > m->data_len && m->next != NULL) { 2838 offset -= m->data_len; 2839 m = m->next; 2840 } 2841 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2842 m, offset); 2843 } 2844 2845 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2846 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2847 else 2848 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2849 2850 debug_hexdump(stdout, "digest:", 2851 sym_op->auth.digest.data, 2852 auth_tag_len); 2853 2854 /* Copy cipher and auth IVs at the end of the crypto operation */ 2855 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2856 IV_OFFSET); 2857 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2858 iv_ptr += cipher_iv_len; 2859 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2860 2861 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2862 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2863 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2864 sym_op->cipher.data.length = cipher_len; 2865 sym_op->cipher.data.offset = cipher_offset; 2866 } else { 2867 sym_op->cipher.data.length = cipher_len >> 3; 2868 sym_op->cipher.data.offset = cipher_offset >> 3; 2869 } 2870 2871 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2872 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2873 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2874 sym_op->auth.data.length = auth_len; 2875 sym_op->auth.data.offset = auth_offset; 2876 } else { 2877 sym_op->auth.data.length = auth_len >> 3; 2878 sym_op->auth.data.offset = auth_offset >> 3; 2879 } 2880 2881 return 0; 2882 } 2883 2884 static int 2885 create_wireless_algo_auth_cipher_operation( 2886 const uint8_t *auth_tag, unsigned int auth_tag_len, 2887 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2888 const uint8_t *auth_iv, uint8_t auth_iv_len, 2889 unsigned int data_pad_len, 2890 unsigned int cipher_len, unsigned int cipher_offset, 2891 unsigned int auth_len, unsigned int auth_offset, 2892 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2893 { 2894 struct crypto_testsuite_params *ts_params = &testsuite_params; 2895 struct crypto_unittest_params *ut_params = &unittest_params; 2896 2897 enum rte_crypto_cipher_algorithm cipher_algo = 2898 ut_params->cipher_xform.cipher.algo; 2899 enum rte_crypto_auth_algorithm auth_algo = 2900 ut_params->auth_xform.auth.algo; 2901 2902 /* Generate Crypto op data structure */ 2903 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2904 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2905 TEST_ASSERT_NOT_NULL(ut_params->op, 2906 "Failed to allocate pktmbuf offload"); 2907 2908 /* Set crypto operation data parameters */ 2909 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2910 2911 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2912 2913 /* set crypto operation mbufs */ 2914 sym_op->m_src = ut_params->ibuf; 2915 if (op_mode == OUT_OF_PLACE) 2916 sym_op->m_dst = ut_params->obuf; 2917 2918 /* digest */ 2919 if (!do_sgl) { 2920 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2921 (op_mode == IN_PLACE ? 2922 ut_params->ibuf : ut_params->obuf), 2923 uint8_t *, data_pad_len); 2924 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2925 (op_mode == IN_PLACE ? 2926 ut_params->ibuf : ut_params->obuf), 2927 data_pad_len); 2928 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2929 } else { 2930 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2931 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2932 sym_op->m_src : sym_op->m_dst); 2933 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2934 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2935 sgl_buf = sgl_buf->next; 2936 } 2937 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 2938 uint8_t *, remaining_off); 2939 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 2940 remaining_off); 2941 memset(sym_op->auth.digest.data, 0, remaining_off); 2942 while (sgl_buf->next != NULL) { 2943 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 2944 0, rte_pktmbuf_data_len(sgl_buf)); 2945 sgl_buf = sgl_buf->next; 2946 } 2947 } 2948 2949 /* Copy digest for the verification */ 2950 if (verify) 2951 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2952 2953 /* Copy cipher and auth IVs at the end of the crypto operation */ 2954 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 2955 ut_params->op, uint8_t *, IV_OFFSET); 2956 2957 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2958 iv_ptr += cipher_iv_len; 2959 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2960 2961 /* Only copy over the offset data needed from src to dst in OOP, 2962 * if the auth and cipher offsets are not aligned 2963 */ 2964 if (op_mode == OUT_OF_PLACE) { 2965 if (cipher_offset > auth_offset) 2966 rte_memcpy( 2967 rte_pktmbuf_mtod_offset( 2968 sym_op->m_dst, 2969 uint8_t *, auth_offset >> 3), 2970 rte_pktmbuf_mtod_offset( 2971 sym_op->m_src, 2972 uint8_t *, auth_offset >> 3), 2973 ((cipher_offset >> 3) - (auth_offset >> 3))); 2974 } 2975 2976 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2977 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2978 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2979 sym_op->cipher.data.length = cipher_len; 2980 sym_op->cipher.data.offset = cipher_offset; 2981 } else { 2982 sym_op->cipher.data.length = cipher_len >> 3; 2983 sym_op->cipher.data.offset = cipher_offset >> 3; 2984 } 2985 2986 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2987 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2988 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2989 sym_op->auth.data.length = auth_len; 2990 sym_op->auth.data.offset = auth_offset; 2991 } else { 2992 sym_op->auth.data.length = auth_len >> 3; 2993 sym_op->auth.data.offset = auth_offset >> 3; 2994 } 2995 2996 return 0; 2997 } 2998 2999 static int 3000 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 3001 { 3002 struct crypto_testsuite_params *ts_params = &testsuite_params; 3003 struct crypto_unittest_params *ut_params = &unittest_params; 3004 3005 int retval; 3006 unsigned plaintext_pad_len; 3007 unsigned plaintext_len; 3008 uint8_t *plaintext; 3009 struct rte_cryptodev_info dev_info; 3010 3011 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3012 uint64_t feat_flags = dev_info.feature_flags; 3013 3014 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3015 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3016 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3017 return TEST_SKIPPED; 3018 } 3019 3020 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3021 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3022 printf("Device doesn't support RAW data-path APIs.\n"); 3023 return TEST_SKIPPED; 3024 } 3025 3026 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3027 return TEST_SKIPPED; 3028 3029 /* Verify the capabilities */ 3030 struct rte_cryptodev_sym_capability_idx cap_idx; 3031 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3032 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3033 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3034 &cap_idx) == NULL) 3035 return TEST_SKIPPED; 3036 3037 /* Create SNOW 3G session */ 3038 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3039 tdata->key.data, tdata->key.len, 3040 tdata->auth_iv.len, tdata->digest.len, 3041 RTE_CRYPTO_AUTH_OP_GENERATE, 3042 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3043 if (retval < 0) 3044 return retval; 3045 3046 /* alloc mbuf and set payload */ 3047 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3048 3049 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3050 rte_pktmbuf_tailroom(ut_params->ibuf)); 3051 3052 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3053 /* Append data which is padded to a multiple of */ 3054 /* the algorithms block size */ 3055 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3056 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3057 plaintext_pad_len); 3058 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3059 3060 /* Create SNOW 3G operation */ 3061 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3062 tdata->auth_iv.data, tdata->auth_iv.len, 3063 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3064 tdata->validAuthLenInBits.len, 3065 0); 3066 if (retval < 0) 3067 return retval; 3068 3069 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3070 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3071 ut_params->op, 0, 1, 1, 0); 3072 else 3073 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3074 ut_params->op); 3075 ut_params->obuf = ut_params->op->sym->m_src; 3076 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3077 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3078 + plaintext_pad_len; 3079 3080 /* Validate obuf */ 3081 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3082 ut_params->digest, 3083 tdata->digest.data, 3084 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 3085 "SNOW 3G Generated auth tag not as expected"); 3086 3087 return 0; 3088 } 3089 3090 static int 3091 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 3092 { 3093 struct crypto_testsuite_params *ts_params = &testsuite_params; 3094 struct crypto_unittest_params *ut_params = &unittest_params; 3095 3096 int retval; 3097 unsigned plaintext_pad_len; 3098 unsigned plaintext_len; 3099 uint8_t *plaintext; 3100 struct rte_cryptodev_info dev_info; 3101 3102 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3103 uint64_t feat_flags = dev_info.feature_flags; 3104 3105 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3106 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3107 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3108 return TEST_SKIPPED; 3109 } 3110 3111 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3112 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3113 printf("Device doesn't support RAW data-path APIs.\n"); 3114 return TEST_SKIPPED; 3115 } 3116 3117 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3118 return TEST_SKIPPED; 3119 3120 /* Verify the capabilities */ 3121 struct rte_cryptodev_sym_capability_idx cap_idx; 3122 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3123 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3124 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3125 &cap_idx) == NULL) 3126 return TEST_SKIPPED; 3127 3128 /* Create SNOW 3G session */ 3129 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3130 tdata->key.data, tdata->key.len, 3131 tdata->auth_iv.len, tdata->digest.len, 3132 RTE_CRYPTO_AUTH_OP_VERIFY, 3133 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3134 if (retval < 0) 3135 return retval; 3136 /* alloc mbuf and set payload */ 3137 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3138 3139 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3140 rte_pktmbuf_tailroom(ut_params->ibuf)); 3141 3142 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3143 /* Append data which is padded to a multiple of */ 3144 /* the algorithms block size */ 3145 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3146 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3147 plaintext_pad_len); 3148 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3149 3150 /* Create SNOW 3G operation */ 3151 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3152 tdata->digest.len, 3153 tdata->auth_iv.data, tdata->auth_iv.len, 3154 plaintext_pad_len, 3155 RTE_CRYPTO_AUTH_OP_VERIFY, 3156 tdata->validAuthLenInBits.len, 3157 0); 3158 if (retval < 0) 3159 return retval; 3160 3161 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3162 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3163 ut_params->op, 0, 1, 1, 0); 3164 else 3165 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3166 ut_params->op); 3167 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3168 ut_params->obuf = ut_params->op->sym->m_src; 3169 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3170 + plaintext_pad_len; 3171 3172 /* Validate obuf */ 3173 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3174 return 0; 3175 else 3176 return -1; 3177 3178 return 0; 3179 } 3180 3181 static int 3182 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 3183 { 3184 struct crypto_testsuite_params *ts_params = &testsuite_params; 3185 struct crypto_unittest_params *ut_params = &unittest_params; 3186 3187 int retval; 3188 unsigned plaintext_pad_len; 3189 unsigned plaintext_len; 3190 uint8_t *plaintext; 3191 struct rte_cryptodev_info dev_info; 3192 3193 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3194 uint64_t feat_flags = dev_info.feature_flags; 3195 3196 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3197 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3198 printf("Device doesn't support RAW data-path APIs.\n"); 3199 return TEST_SKIPPED; 3200 } 3201 3202 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3203 return TEST_SKIPPED; 3204 3205 /* Verify the capabilities */ 3206 struct rte_cryptodev_sym_capability_idx cap_idx; 3207 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3208 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3209 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3210 &cap_idx) == NULL) 3211 return TEST_SKIPPED; 3212 3213 /* Create KASUMI session */ 3214 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3215 tdata->key.data, tdata->key.len, 3216 0, tdata->digest.len, 3217 RTE_CRYPTO_AUTH_OP_GENERATE, 3218 RTE_CRYPTO_AUTH_KASUMI_F9); 3219 if (retval < 0) 3220 return retval; 3221 3222 /* alloc mbuf and set payload */ 3223 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3224 3225 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3226 rte_pktmbuf_tailroom(ut_params->ibuf)); 3227 3228 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3229 /* Append data which is padded to a multiple of */ 3230 /* the algorithms block size */ 3231 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3232 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3233 plaintext_pad_len); 3234 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3235 3236 /* Create KASUMI operation */ 3237 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3238 NULL, 0, 3239 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3240 tdata->plaintext.len, 3241 0); 3242 if (retval < 0) 3243 return retval; 3244 3245 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3246 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 3247 ut_params->op); 3248 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3249 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3250 ut_params->op, 0, 1, 1, 0); 3251 else 3252 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3253 ut_params->op); 3254 3255 ut_params->obuf = ut_params->op->sym->m_src; 3256 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3257 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3258 + plaintext_pad_len; 3259 3260 /* Validate obuf */ 3261 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3262 ut_params->digest, 3263 tdata->digest.data, 3264 DIGEST_BYTE_LENGTH_KASUMI_F9, 3265 "KASUMI Generated auth tag not as expected"); 3266 3267 return 0; 3268 } 3269 3270 static int 3271 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 3272 { 3273 struct crypto_testsuite_params *ts_params = &testsuite_params; 3274 struct crypto_unittest_params *ut_params = &unittest_params; 3275 3276 int retval; 3277 unsigned plaintext_pad_len; 3278 unsigned plaintext_len; 3279 uint8_t *plaintext; 3280 struct rte_cryptodev_info dev_info; 3281 3282 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3283 uint64_t feat_flags = dev_info.feature_flags; 3284 3285 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3286 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3287 printf("Device doesn't support RAW data-path APIs.\n"); 3288 return TEST_SKIPPED; 3289 } 3290 3291 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3292 return TEST_SKIPPED; 3293 3294 /* Verify the capabilities */ 3295 struct rte_cryptodev_sym_capability_idx cap_idx; 3296 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3297 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3298 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3299 &cap_idx) == NULL) 3300 return TEST_SKIPPED; 3301 3302 /* Create KASUMI session */ 3303 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3304 tdata->key.data, tdata->key.len, 3305 0, tdata->digest.len, 3306 RTE_CRYPTO_AUTH_OP_VERIFY, 3307 RTE_CRYPTO_AUTH_KASUMI_F9); 3308 if (retval < 0) 3309 return retval; 3310 /* alloc mbuf and set payload */ 3311 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3312 3313 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3314 rte_pktmbuf_tailroom(ut_params->ibuf)); 3315 3316 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3317 /* Append data which is padded to a multiple */ 3318 /* of the algorithms block size */ 3319 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3320 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3321 plaintext_pad_len); 3322 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3323 3324 /* Create KASUMI operation */ 3325 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3326 tdata->digest.len, 3327 NULL, 0, 3328 plaintext_pad_len, 3329 RTE_CRYPTO_AUTH_OP_VERIFY, 3330 tdata->plaintext.len, 3331 0); 3332 if (retval < 0) 3333 return retval; 3334 3335 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3336 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3337 ut_params->op, 0, 1, 1, 0); 3338 else 3339 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3340 ut_params->op); 3341 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3342 ut_params->obuf = ut_params->op->sym->m_src; 3343 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3344 + plaintext_pad_len; 3345 3346 /* Validate obuf */ 3347 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3348 return 0; 3349 else 3350 return -1; 3351 3352 return 0; 3353 } 3354 3355 static int 3356 test_snow3g_hash_generate_test_case_1(void) 3357 { 3358 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3359 } 3360 3361 static int 3362 test_snow3g_hash_generate_test_case_2(void) 3363 { 3364 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3365 } 3366 3367 static int 3368 test_snow3g_hash_generate_test_case_3(void) 3369 { 3370 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3371 } 3372 3373 static int 3374 test_snow3g_hash_generate_test_case_4(void) 3375 { 3376 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3377 } 3378 3379 static int 3380 test_snow3g_hash_generate_test_case_5(void) 3381 { 3382 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3383 } 3384 3385 static int 3386 test_snow3g_hash_generate_test_case_6(void) 3387 { 3388 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3389 } 3390 3391 static int 3392 test_snow3g_hash_verify_test_case_1(void) 3393 { 3394 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3395 3396 } 3397 3398 static int 3399 test_snow3g_hash_verify_test_case_2(void) 3400 { 3401 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3402 } 3403 3404 static int 3405 test_snow3g_hash_verify_test_case_3(void) 3406 { 3407 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3408 } 3409 3410 static int 3411 test_snow3g_hash_verify_test_case_4(void) 3412 { 3413 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3414 } 3415 3416 static int 3417 test_snow3g_hash_verify_test_case_5(void) 3418 { 3419 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3420 } 3421 3422 static int 3423 test_snow3g_hash_verify_test_case_6(void) 3424 { 3425 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3426 } 3427 3428 static int 3429 test_kasumi_hash_generate_test_case_1(void) 3430 { 3431 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3432 } 3433 3434 static int 3435 test_kasumi_hash_generate_test_case_2(void) 3436 { 3437 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3438 } 3439 3440 static int 3441 test_kasumi_hash_generate_test_case_3(void) 3442 { 3443 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3444 } 3445 3446 static int 3447 test_kasumi_hash_generate_test_case_4(void) 3448 { 3449 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3450 } 3451 3452 static int 3453 test_kasumi_hash_generate_test_case_5(void) 3454 { 3455 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3456 } 3457 3458 static int 3459 test_kasumi_hash_generate_test_case_6(void) 3460 { 3461 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3462 } 3463 3464 static int 3465 test_kasumi_hash_verify_test_case_1(void) 3466 { 3467 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3468 } 3469 3470 static int 3471 test_kasumi_hash_verify_test_case_2(void) 3472 { 3473 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3474 } 3475 3476 static int 3477 test_kasumi_hash_verify_test_case_3(void) 3478 { 3479 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3480 } 3481 3482 static int 3483 test_kasumi_hash_verify_test_case_4(void) 3484 { 3485 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3486 } 3487 3488 static int 3489 test_kasumi_hash_verify_test_case_5(void) 3490 { 3491 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3492 } 3493 3494 static int 3495 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3496 { 3497 struct crypto_testsuite_params *ts_params = &testsuite_params; 3498 struct crypto_unittest_params *ut_params = &unittest_params; 3499 3500 int retval; 3501 uint8_t *plaintext, *ciphertext; 3502 unsigned plaintext_pad_len; 3503 unsigned plaintext_len; 3504 struct rte_cryptodev_info dev_info; 3505 3506 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3507 uint64_t feat_flags = dev_info.feature_flags; 3508 3509 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3510 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3511 printf("Device doesn't support RAW data-path APIs.\n"); 3512 return TEST_SKIPPED; 3513 } 3514 3515 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3516 return TEST_SKIPPED; 3517 3518 /* Verify the capabilities */ 3519 struct rte_cryptodev_sym_capability_idx cap_idx; 3520 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3521 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3522 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3523 &cap_idx) == NULL) 3524 return TEST_SKIPPED; 3525 3526 /* Create KASUMI session */ 3527 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3528 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3529 RTE_CRYPTO_CIPHER_KASUMI_F8, 3530 tdata->key.data, tdata->key.len, 3531 tdata->cipher_iv.len); 3532 if (retval < 0) 3533 return retval; 3534 3535 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3536 3537 /* Clear mbuf payload */ 3538 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3539 rte_pktmbuf_tailroom(ut_params->ibuf)); 3540 3541 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3542 /* Append data which is padded to a multiple */ 3543 /* of the algorithms block size */ 3544 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3545 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3546 plaintext_pad_len); 3547 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3548 3549 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3550 3551 /* Create KASUMI operation */ 3552 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3553 tdata->cipher_iv.len, 3554 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3555 tdata->validCipherOffsetInBits.len); 3556 if (retval < 0) 3557 return retval; 3558 3559 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3560 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3561 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3562 else 3563 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3564 ut_params->op); 3565 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3566 3567 ut_params->obuf = ut_params->op->sym->m_dst; 3568 if (ut_params->obuf) 3569 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3570 else 3571 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3572 3573 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3574 3575 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3576 (tdata->validCipherOffsetInBits.len >> 3); 3577 /* Validate obuf */ 3578 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3579 ciphertext, 3580 reference_ciphertext, 3581 tdata->validCipherLenInBits.len, 3582 "KASUMI Ciphertext data not as expected"); 3583 return 0; 3584 } 3585 3586 static int 3587 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3588 { 3589 struct crypto_testsuite_params *ts_params = &testsuite_params; 3590 struct crypto_unittest_params *ut_params = &unittest_params; 3591 3592 int retval; 3593 3594 unsigned int plaintext_pad_len; 3595 unsigned int plaintext_len; 3596 3597 uint8_t buffer[10000]; 3598 const uint8_t *ciphertext; 3599 3600 struct rte_cryptodev_info dev_info; 3601 3602 /* Verify the capabilities */ 3603 struct rte_cryptodev_sym_capability_idx cap_idx; 3604 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3605 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3606 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3607 &cap_idx) == NULL) 3608 return TEST_SKIPPED; 3609 3610 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3611 3612 uint64_t feat_flags = dev_info.feature_flags; 3613 3614 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3615 printf("Device doesn't support in-place scatter-gather. " 3616 "Test Skipped.\n"); 3617 return TEST_SKIPPED; 3618 } 3619 3620 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3621 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3622 printf("Device doesn't support RAW data-path APIs.\n"); 3623 return TEST_SKIPPED; 3624 } 3625 3626 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3627 return TEST_SKIPPED; 3628 3629 /* Create KASUMI session */ 3630 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3631 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3632 RTE_CRYPTO_CIPHER_KASUMI_F8, 3633 tdata->key.data, tdata->key.len, 3634 tdata->cipher_iv.len); 3635 if (retval < 0) 3636 return retval; 3637 3638 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3639 3640 3641 /* Append data which is padded to a multiple */ 3642 /* of the algorithms block size */ 3643 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3644 3645 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3646 plaintext_pad_len, 10, 0); 3647 3648 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3649 3650 /* Create KASUMI operation */ 3651 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3652 tdata->cipher_iv.len, 3653 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3654 tdata->validCipherOffsetInBits.len); 3655 if (retval < 0) 3656 return retval; 3657 3658 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3659 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3660 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3661 else 3662 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3663 ut_params->op); 3664 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3665 3666 ut_params->obuf = ut_params->op->sym->m_dst; 3667 3668 if (ut_params->obuf) 3669 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3670 plaintext_len, buffer); 3671 else 3672 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3673 tdata->validCipherOffsetInBits.len >> 3, 3674 plaintext_len, buffer); 3675 3676 /* Validate obuf */ 3677 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3678 3679 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3680 (tdata->validCipherOffsetInBits.len >> 3); 3681 /* Validate obuf */ 3682 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3683 ciphertext, 3684 reference_ciphertext, 3685 tdata->validCipherLenInBits.len, 3686 "KASUMI Ciphertext data not as expected"); 3687 return 0; 3688 } 3689 3690 static int 3691 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3692 { 3693 struct crypto_testsuite_params *ts_params = &testsuite_params; 3694 struct crypto_unittest_params *ut_params = &unittest_params; 3695 3696 int retval; 3697 uint8_t *plaintext, *ciphertext; 3698 unsigned plaintext_pad_len; 3699 unsigned plaintext_len; 3700 3701 /* Verify the capabilities */ 3702 struct rte_cryptodev_sym_capability_idx cap_idx; 3703 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3704 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3705 /* Data-path service does not support OOP */ 3706 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3707 &cap_idx) == NULL) 3708 return TEST_SKIPPED; 3709 3710 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3711 return TEST_SKIPPED; 3712 3713 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3714 return TEST_SKIPPED; 3715 3716 /* Create KASUMI session */ 3717 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3718 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3719 RTE_CRYPTO_CIPHER_KASUMI_F8, 3720 tdata->key.data, tdata->key.len, 3721 tdata->cipher_iv.len); 3722 if (retval < 0) 3723 return retval; 3724 3725 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3726 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3727 3728 /* Clear mbuf payload */ 3729 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3730 rte_pktmbuf_tailroom(ut_params->ibuf)); 3731 3732 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3733 /* Append data which is padded to a multiple */ 3734 /* of the algorithms block size */ 3735 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3736 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3737 plaintext_pad_len); 3738 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3739 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3740 3741 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3742 3743 /* Create KASUMI operation */ 3744 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3745 tdata->cipher_iv.len, 3746 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3747 tdata->validCipherOffsetInBits.len); 3748 if (retval < 0) 3749 return retval; 3750 3751 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3752 ut_params->op); 3753 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3754 3755 ut_params->obuf = ut_params->op->sym->m_dst; 3756 if (ut_params->obuf) 3757 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3758 else 3759 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3760 3761 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3762 3763 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3764 (tdata->validCipherOffsetInBits.len >> 3); 3765 /* Validate obuf */ 3766 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3767 ciphertext, 3768 reference_ciphertext, 3769 tdata->validCipherLenInBits.len, 3770 "KASUMI Ciphertext data not as expected"); 3771 return 0; 3772 } 3773 3774 static int 3775 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3776 { 3777 struct crypto_testsuite_params *ts_params = &testsuite_params; 3778 struct crypto_unittest_params *ut_params = &unittest_params; 3779 3780 int retval; 3781 unsigned int plaintext_pad_len; 3782 unsigned int plaintext_len; 3783 3784 const uint8_t *ciphertext; 3785 uint8_t buffer[2048]; 3786 3787 struct rte_cryptodev_info dev_info; 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_KASUMI_F8; 3793 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3794 &cap_idx) == NULL) 3795 return TEST_SKIPPED; 3796 3797 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3798 return TEST_SKIPPED; 3799 3800 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3801 return TEST_SKIPPED; 3802 3803 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3804 3805 uint64_t feat_flags = dev_info.feature_flags; 3806 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3807 printf("Device doesn't support out-of-place scatter-gather " 3808 "in both input and output mbufs. " 3809 "Test Skipped.\n"); 3810 return TEST_SKIPPED; 3811 } 3812 3813 /* Create KASUMI session */ 3814 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3815 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3816 RTE_CRYPTO_CIPHER_KASUMI_F8, 3817 tdata->key.data, tdata->key.len, 3818 tdata->cipher_iv.len); 3819 if (retval < 0) 3820 return retval; 3821 3822 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3823 /* Append data which is padded to a multiple */ 3824 /* of the algorithms block size */ 3825 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3826 3827 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3828 plaintext_pad_len, 10, 0); 3829 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3830 plaintext_pad_len, 3, 0); 3831 3832 /* Append data which is padded to a multiple */ 3833 /* of the algorithms block size */ 3834 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3835 3836 /* Create KASUMI operation */ 3837 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3838 tdata->cipher_iv.len, 3839 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3840 tdata->validCipherOffsetInBits.len); 3841 if (retval < 0) 3842 return retval; 3843 3844 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3845 ut_params->op); 3846 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3847 3848 ut_params->obuf = ut_params->op->sym->m_dst; 3849 if (ut_params->obuf) 3850 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3851 plaintext_pad_len, buffer); 3852 else 3853 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3854 tdata->validCipherOffsetInBits.len >> 3, 3855 plaintext_pad_len, buffer); 3856 3857 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3858 (tdata->validCipherOffsetInBits.len >> 3); 3859 /* Validate obuf */ 3860 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3861 ciphertext, 3862 reference_ciphertext, 3863 tdata->validCipherLenInBits.len, 3864 "KASUMI Ciphertext data not as expected"); 3865 return 0; 3866 } 3867 3868 3869 static int 3870 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3871 { 3872 struct crypto_testsuite_params *ts_params = &testsuite_params; 3873 struct crypto_unittest_params *ut_params = &unittest_params; 3874 3875 int retval; 3876 uint8_t *ciphertext, *plaintext; 3877 unsigned ciphertext_pad_len; 3878 unsigned ciphertext_len; 3879 3880 /* Verify the capabilities */ 3881 struct rte_cryptodev_sym_capability_idx cap_idx; 3882 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3883 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3884 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3885 &cap_idx) == NULL) 3886 return TEST_SKIPPED; 3887 3888 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3889 return TEST_SKIPPED; 3890 3891 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3892 return TEST_SKIPPED; 3893 3894 /* Create KASUMI session */ 3895 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3896 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3897 RTE_CRYPTO_CIPHER_KASUMI_F8, 3898 tdata->key.data, tdata->key.len, 3899 tdata->cipher_iv.len); 3900 if (retval < 0) 3901 return retval; 3902 3903 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3904 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3905 3906 /* Clear mbuf payload */ 3907 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3908 rte_pktmbuf_tailroom(ut_params->ibuf)); 3909 3910 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3911 /* Append data which is padded to a multiple */ 3912 /* of the algorithms block size */ 3913 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3914 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3915 ciphertext_pad_len); 3916 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3917 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3918 3919 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3920 3921 /* Create KASUMI operation */ 3922 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3923 tdata->cipher_iv.len, 3924 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3925 tdata->validCipherOffsetInBits.len); 3926 if (retval < 0) 3927 return retval; 3928 3929 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3930 ut_params->op); 3931 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3932 3933 ut_params->obuf = ut_params->op->sym->m_dst; 3934 if (ut_params->obuf) 3935 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3936 else 3937 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3938 3939 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3940 3941 const uint8_t *reference_plaintext = tdata->plaintext.data + 3942 (tdata->validCipherOffsetInBits.len >> 3); 3943 /* Validate obuf */ 3944 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3945 plaintext, 3946 reference_plaintext, 3947 tdata->validCipherLenInBits.len, 3948 "KASUMI Plaintext data not as expected"); 3949 return 0; 3950 } 3951 3952 static int 3953 test_kasumi_decryption(const struct kasumi_test_data *tdata) 3954 { 3955 struct crypto_testsuite_params *ts_params = &testsuite_params; 3956 struct crypto_unittest_params *ut_params = &unittest_params; 3957 3958 int retval; 3959 uint8_t *ciphertext, *plaintext; 3960 unsigned ciphertext_pad_len; 3961 unsigned ciphertext_len; 3962 struct rte_cryptodev_info dev_info; 3963 3964 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3965 uint64_t feat_flags = dev_info.feature_flags; 3966 3967 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3968 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3969 printf("Device doesn't support RAW data-path APIs.\n"); 3970 return TEST_SKIPPED; 3971 } 3972 3973 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3974 return TEST_SKIPPED; 3975 3976 /* Verify the capabilities */ 3977 struct rte_cryptodev_sym_capability_idx cap_idx; 3978 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3979 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3980 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3981 &cap_idx) == NULL) 3982 return TEST_SKIPPED; 3983 3984 /* Create KASUMI session */ 3985 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3986 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3987 RTE_CRYPTO_CIPHER_KASUMI_F8, 3988 tdata->key.data, tdata->key.len, 3989 tdata->cipher_iv.len); 3990 if (retval < 0) 3991 return retval; 3992 3993 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3994 3995 /* Clear mbuf payload */ 3996 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3997 rte_pktmbuf_tailroom(ut_params->ibuf)); 3998 3999 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4000 /* Append data which is padded to a multiple */ 4001 /* of the algorithms block size */ 4002 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 4003 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4004 ciphertext_pad_len); 4005 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4006 4007 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4008 4009 /* Create KASUMI operation */ 4010 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4011 tdata->cipher_iv.len, 4012 tdata->ciphertext.len, 4013 tdata->validCipherOffsetInBits.len); 4014 if (retval < 0) 4015 return retval; 4016 4017 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4018 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4019 ut_params->op, 1, 0, 1, 0); 4020 else 4021 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4022 ut_params->op); 4023 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4024 4025 ut_params->obuf = ut_params->op->sym->m_dst; 4026 if (ut_params->obuf) 4027 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4028 else 4029 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4030 4031 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4032 4033 const uint8_t *reference_plaintext = tdata->plaintext.data + 4034 (tdata->validCipherOffsetInBits.len >> 3); 4035 /* Validate obuf */ 4036 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4037 plaintext, 4038 reference_plaintext, 4039 tdata->validCipherLenInBits.len, 4040 "KASUMI Plaintext data not as expected"); 4041 return 0; 4042 } 4043 4044 static int 4045 test_snow3g_encryption(const struct snow3g_test_data *tdata) 4046 { 4047 struct crypto_testsuite_params *ts_params = &testsuite_params; 4048 struct crypto_unittest_params *ut_params = &unittest_params; 4049 4050 int retval; 4051 uint8_t *plaintext, *ciphertext; 4052 unsigned plaintext_pad_len; 4053 unsigned plaintext_len; 4054 struct rte_cryptodev_info dev_info; 4055 4056 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4057 uint64_t feat_flags = dev_info.feature_flags; 4058 4059 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4060 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4061 printf("Device doesn't support RAW data-path APIs.\n"); 4062 return TEST_SKIPPED; 4063 } 4064 4065 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4066 return TEST_SKIPPED; 4067 4068 /* Verify the capabilities */ 4069 struct rte_cryptodev_sym_capability_idx cap_idx; 4070 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4071 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4072 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4073 &cap_idx) == NULL) 4074 return TEST_SKIPPED; 4075 4076 /* Create SNOW 3G session */ 4077 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4078 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4079 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4080 tdata->key.data, tdata->key.len, 4081 tdata->cipher_iv.len); 4082 if (retval < 0) 4083 return retval; 4084 4085 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4086 4087 /* Clear mbuf payload */ 4088 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4089 rte_pktmbuf_tailroom(ut_params->ibuf)); 4090 4091 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4092 /* Append data which is padded to a multiple of */ 4093 /* the algorithms block size */ 4094 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4095 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4096 plaintext_pad_len); 4097 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4098 4099 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4100 4101 /* Create SNOW 3G operation */ 4102 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4103 tdata->cipher_iv.len, 4104 tdata->validCipherLenInBits.len, 4105 0); 4106 if (retval < 0) 4107 return retval; 4108 4109 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4110 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4111 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4112 else 4113 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4114 ut_params->op); 4115 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4116 4117 ut_params->obuf = ut_params->op->sym->m_dst; 4118 if (ut_params->obuf) 4119 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4120 else 4121 ciphertext = plaintext; 4122 4123 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4124 4125 /* Validate obuf */ 4126 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4127 ciphertext, 4128 tdata->ciphertext.data, 4129 tdata->validDataLenInBits.len, 4130 "SNOW 3G Ciphertext data not as expected"); 4131 return 0; 4132 } 4133 4134 4135 static int 4136 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 4137 { 4138 struct crypto_testsuite_params *ts_params = &testsuite_params; 4139 struct crypto_unittest_params *ut_params = &unittest_params; 4140 uint8_t *plaintext, *ciphertext; 4141 4142 int retval; 4143 unsigned plaintext_pad_len; 4144 unsigned plaintext_len; 4145 4146 /* Verify the capabilities */ 4147 struct rte_cryptodev_sym_capability_idx cap_idx; 4148 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4149 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4150 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4151 &cap_idx) == NULL) 4152 return TEST_SKIPPED; 4153 4154 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4155 return TEST_SKIPPED; 4156 4157 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4158 return TEST_SKIPPED; 4159 4160 /* Create SNOW 3G session */ 4161 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4162 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4163 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4164 tdata->key.data, tdata->key.len, 4165 tdata->cipher_iv.len); 4166 if (retval < 0) 4167 return retval; 4168 4169 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4170 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4171 4172 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4173 "Failed to allocate input buffer in mempool"); 4174 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4175 "Failed to allocate output buffer in mempool"); 4176 4177 /* Clear mbuf payload */ 4178 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4179 rte_pktmbuf_tailroom(ut_params->ibuf)); 4180 4181 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4182 /* Append data which is padded to a multiple of */ 4183 /* the algorithms block size */ 4184 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4185 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4186 plaintext_pad_len); 4187 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4188 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4189 4190 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4191 4192 /* Create SNOW 3G operation */ 4193 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4194 tdata->cipher_iv.len, 4195 tdata->validCipherLenInBits.len, 4196 0); 4197 if (retval < 0) 4198 return retval; 4199 4200 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4201 ut_params->op); 4202 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4203 4204 ut_params->obuf = ut_params->op->sym->m_dst; 4205 if (ut_params->obuf) 4206 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4207 else 4208 ciphertext = plaintext; 4209 4210 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4211 4212 /* Validate obuf */ 4213 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4214 ciphertext, 4215 tdata->ciphertext.data, 4216 tdata->validDataLenInBits.len, 4217 "SNOW 3G Ciphertext data not as expected"); 4218 return 0; 4219 } 4220 4221 static int 4222 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 4223 { 4224 struct crypto_testsuite_params *ts_params = &testsuite_params; 4225 struct crypto_unittest_params *ut_params = &unittest_params; 4226 4227 int retval; 4228 unsigned int plaintext_pad_len; 4229 unsigned int plaintext_len; 4230 uint8_t buffer[10000]; 4231 const uint8_t *ciphertext; 4232 4233 struct rte_cryptodev_info dev_info; 4234 4235 /* Verify the capabilities */ 4236 struct rte_cryptodev_sym_capability_idx cap_idx; 4237 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4238 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4239 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4240 &cap_idx) == NULL) 4241 return TEST_SKIPPED; 4242 4243 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4244 return TEST_SKIPPED; 4245 4246 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4247 return TEST_SKIPPED; 4248 4249 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4250 4251 uint64_t feat_flags = dev_info.feature_flags; 4252 4253 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4254 printf("Device doesn't support out-of-place scatter-gather " 4255 "in both input and output mbufs. " 4256 "Test Skipped.\n"); 4257 return TEST_SKIPPED; 4258 } 4259 4260 /* Create SNOW 3G session */ 4261 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4262 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4263 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4264 tdata->key.data, tdata->key.len, 4265 tdata->cipher_iv.len); 4266 if (retval < 0) 4267 return retval; 4268 4269 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4270 /* Append data which is padded to a multiple of */ 4271 /* the algorithms block size */ 4272 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4273 4274 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4275 plaintext_pad_len, 10, 0); 4276 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4277 plaintext_pad_len, 3, 0); 4278 4279 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4280 "Failed to allocate input buffer in mempool"); 4281 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4282 "Failed to allocate output buffer in mempool"); 4283 4284 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 4285 4286 /* Create SNOW 3G operation */ 4287 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4288 tdata->cipher_iv.len, 4289 tdata->validCipherLenInBits.len, 4290 0); 4291 if (retval < 0) 4292 return retval; 4293 4294 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4295 ut_params->op); 4296 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4297 4298 ut_params->obuf = ut_params->op->sym->m_dst; 4299 if (ut_params->obuf) 4300 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4301 plaintext_len, buffer); 4302 else 4303 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4304 plaintext_len, buffer); 4305 4306 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4307 4308 /* Validate obuf */ 4309 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4310 ciphertext, 4311 tdata->ciphertext.data, 4312 tdata->validDataLenInBits.len, 4313 "SNOW 3G Ciphertext data not as expected"); 4314 4315 return 0; 4316 } 4317 4318 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 4319 static void 4320 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 4321 { 4322 uint8_t curr_byte, prev_byte; 4323 uint32_t length_in_bytes = ceil_byte_length(length + offset); 4324 uint8_t lower_byte_mask = (1 << offset) - 1; 4325 unsigned i; 4326 4327 prev_byte = buffer[0]; 4328 buffer[0] >>= offset; 4329 4330 for (i = 1; i < length_in_bytes; i++) { 4331 curr_byte = buffer[i]; 4332 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 4333 (curr_byte >> offset); 4334 prev_byte = curr_byte; 4335 } 4336 } 4337 4338 static int 4339 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 4340 { 4341 struct crypto_testsuite_params *ts_params = &testsuite_params; 4342 struct crypto_unittest_params *ut_params = &unittest_params; 4343 uint8_t *plaintext, *ciphertext; 4344 int retval; 4345 uint32_t plaintext_len; 4346 uint32_t plaintext_pad_len; 4347 uint8_t extra_offset = 4; 4348 uint8_t *expected_ciphertext_shifted; 4349 struct rte_cryptodev_info dev_info; 4350 4351 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4352 uint64_t feat_flags = dev_info.feature_flags; 4353 4354 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4355 ((tdata->validDataLenInBits.len % 8) != 0)) { 4356 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4357 return TEST_SKIPPED; 4358 } 4359 4360 /* Verify the capabilities */ 4361 struct rte_cryptodev_sym_capability_idx cap_idx; 4362 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4363 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4364 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4365 &cap_idx) == NULL) 4366 return TEST_SKIPPED; 4367 4368 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4369 return TEST_SKIPPED; 4370 4371 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4372 return TEST_SKIPPED; 4373 4374 /* Create SNOW 3G session */ 4375 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4376 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4377 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4378 tdata->key.data, tdata->key.len, 4379 tdata->cipher_iv.len); 4380 if (retval < 0) 4381 return retval; 4382 4383 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4384 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4385 4386 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4387 "Failed to allocate input buffer in mempool"); 4388 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4389 "Failed to allocate output buffer in mempool"); 4390 4391 /* Clear mbuf payload */ 4392 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4393 rte_pktmbuf_tailroom(ut_params->ibuf)); 4394 4395 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4396 /* 4397 * Append data which is padded to a 4398 * multiple of the algorithms block size 4399 */ 4400 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4401 4402 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4403 plaintext_pad_len); 4404 4405 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4406 4407 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4408 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4409 4410 #ifdef RTE_APP_TEST_DEBUG 4411 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4412 #endif 4413 /* Create SNOW 3G operation */ 4414 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4415 tdata->cipher_iv.len, 4416 tdata->validCipherLenInBits.len, 4417 extra_offset); 4418 if (retval < 0) 4419 return retval; 4420 4421 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4422 ut_params->op); 4423 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4424 4425 ut_params->obuf = ut_params->op->sym->m_dst; 4426 if (ut_params->obuf) 4427 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4428 else 4429 ciphertext = plaintext; 4430 4431 #ifdef RTE_APP_TEST_DEBUG 4432 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4433 #endif 4434 4435 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4436 4437 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4438 "failed to reserve memory for ciphertext shifted\n"); 4439 4440 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4441 ceil_byte_length(tdata->ciphertext.len)); 4442 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4443 extra_offset); 4444 /* Validate obuf */ 4445 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4446 ciphertext, 4447 expected_ciphertext_shifted, 4448 tdata->validDataLenInBits.len, 4449 extra_offset, 4450 "SNOW 3G Ciphertext data not as expected"); 4451 return 0; 4452 } 4453 4454 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4455 { 4456 struct crypto_testsuite_params *ts_params = &testsuite_params; 4457 struct crypto_unittest_params *ut_params = &unittest_params; 4458 4459 int retval; 4460 4461 uint8_t *plaintext, *ciphertext; 4462 unsigned ciphertext_pad_len; 4463 unsigned ciphertext_len; 4464 struct rte_cryptodev_info dev_info; 4465 4466 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4467 uint64_t feat_flags = dev_info.feature_flags; 4468 4469 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4470 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4471 printf("Device doesn't support RAW data-path APIs.\n"); 4472 return TEST_SKIPPED; 4473 } 4474 4475 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4476 return TEST_SKIPPED; 4477 4478 /* Verify the capabilities */ 4479 struct rte_cryptodev_sym_capability_idx cap_idx; 4480 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4481 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4482 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4483 &cap_idx) == NULL) 4484 return TEST_SKIPPED; 4485 4486 /* Create SNOW 3G session */ 4487 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4488 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4489 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4490 tdata->key.data, tdata->key.len, 4491 tdata->cipher_iv.len); 4492 if (retval < 0) 4493 return retval; 4494 4495 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4496 4497 /* Clear mbuf payload */ 4498 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4499 rte_pktmbuf_tailroom(ut_params->ibuf)); 4500 4501 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4502 /* Append data which is padded to a multiple of */ 4503 /* the algorithms block size */ 4504 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4505 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4506 ciphertext_pad_len); 4507 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4508 4509 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4510 4511 /* Create SNOW 3G operation */ 4512 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4513 tdata->cipher_iv.len, 4514 tdata->validCipherLenInBits.len, 4515 tdata->cipher.offset_bits); 4516 if (retval < 0) 4517 return retval; 4518 4519 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4520 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4521 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4522 else 4523 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4524 ut_params->op); 4525 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4526 ut_params->obuf = ut_params->op->sym->m_dst; 4527 if (ut_params->obuf) 4528 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4529 else 4530 plaintext = ciphertext; 4531 4532 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4533 4534 /* Validate obuf */ 4535 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4536 tdata->plaintext.data, 4537 tdata->validDataLenInBits.len, 4538 "SNOW 3G Plaintext data not as expected"); 4539 return 0; 4540 } 4541 4542 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4543 { 4544 struct crypto_testsuite_params *ts_params = &testsuite_params; 4545 struct crypto_unittest_params *ut_params = &unittest_params; 4546 4547 int retval; 4548 4549 uint8_t *plaintext, *ciphertext; 4550 unsigned ciphertext_pad_len; 4551 unsigned ciphertext_len; 4552 4553 /* Verify the capabilities */ 4554 struct rte_cryptodev_sym_capability_idx cap_idx; 4555 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4556 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4557 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4558 &cap_idx) == NULL) 4559 return TEST_SKIPPED; 4560 4561 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4562 return TEST_SKIPPED; 4563 4564 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4565 return TEST_SKIPPED; 4566 4567 /* Create SNOW 3G session */ 4568 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4569 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4570 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4571 tdata->key.data, tdata->key.len, 4572 tdata->cipher_iv.len); 4573 if (retval < 0) 4574 return retval; 4575 4576 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4577 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4578 4579 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4580 "Failed to allocate input buffer"); 4581 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4582 "Failed to allocate output buffer"); 4583 4584 /* Clear mbuf payload */ 4585 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4586 rte_pktmbuf_tailroom(ut_params->ibuf)); 4587 4588 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4589 rte_pktmbuf_tailroom(ut_params->obuf)); 4590 4591 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4592 /* Append data which is padded to a multiple of */ 4593 /* the algorithms block size */ 4594 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4595 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4596 ciphertext_pad_len); 4597 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4598 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4599 4600 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4601 4602 /* Create SNOW 3G operation */ 4603 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4604 tdata->cipher_iv.len, 4605 tdata->validCipherLenInBits.len, 4606 0); 4607 if (retval < 0) 4608 return retval; 4609 4610 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4611 ut_params->op); 4612 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4613 ut_params->obuf = ut_params->op->sym->m_dst; 4614 if (ut_params->obuf) 4615 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4616 else 4617 plaintext = ciphertext; 4618 4619 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4620 4621 /* Validate obuf */ 4622 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4623 tdata->plaintext.data, 4624 tdata->validDataLenInBits.len, 4625 "SNOW 3G Plaintext data not as expected"); 4626 return 0; 4627 } 4628 4629 static int 4630 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4631 { 4632 struct crypto_testsuite_params *ts_params = &testsuite_params; 4633 struct crypto_unittest_params *ut_params = &unittest_params; 4634 4635 int retval; 4636 4637 uint8_t *plaintext, *ciphertext; 4638 unsigned int plaintext_pad_len; 4639 unsigned int plaintext_len; 4640 4641 struct rte_cryptodev_info dev_info; 4642 struct rte_cryptodev_sym_capability_idx cap_idx; 4643 4644 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4645 uint64_t feat_flags = dev_info.feature_flags; 4646 4647 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4648 ((tdata->validAuthLenInBits.len % 8 != 0) || 4649 (tdata->validDataLenInBits.len % 8 != 0))) { 4650 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4651 return TEST_SKIPPED; 4652 } 4653 4654 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4655 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4656 printf("Device doesn't support RAW data-path APIs.\n"); 4657 return TEST_SKIPPED; 4658 } 4659 4660 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4661 return TEST_SKIPPED; 4662 4663 /* Check if device supports ZUC EEA3 */ 4664 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4665 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4666 4667 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4668 &cap_idx) == NULL) 4669 return TEST_SKIPPED; 4670 4671 /* Check if device supports ZUC EIA3 */ 4672 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4673 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4674 4675 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4676 &cap_idx) == NULL) 4677 return TEST_SKIPPED; 4678 4679 /* Create ZUC session */ 4680 retval = create_zuc_cipher_auth_encrypt_generate_session( 4681 ts_params->valid_devs[0], 4682 tdata); 4683 if (retval != 0) 4684 return retval; 4685 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4686 4687 /* clear mbuf payload */ 4688 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4689 rte_pktmbuf_tailroom(ut_params->ibuf)); 4690 4691 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4692 /* Append data which is padded to a multiple of */ 4693 /* the algorithms block size */ 4694 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4695 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4696 plaintext_pad_len); 4697 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4698 4699 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4700 4701 /* Create ZUC operation */ 4702 retval = create_zuc_cipher_hash_generate_operation(tdata); 4703 if (retval < 0) 4704 return retval; 4705 4706 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4707 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4708 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4709 else 4710 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4711 ut_params->op); 4712 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4713 ut_params->obuf = ut_params->op->sym->m_src; 4714 if (ut_params->obuf) 4715 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4716 else 4717 ciphertext = plaintext; 4718 4719 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4720 /* Validate obuf */ 4721 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4722 ciphertext, 4723 tdata->ciphertext.data, 4724 tdata->validDataLenInBits.len, 4725 "ZUC Ciphertext data not as expected"); 4726 4727 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4728 + plaintext_pad_len; 4729 4730 /* Validate obuf */ 4731 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4732 ut_params->digest, 4733 tdata->digest.data, 4734 4, 4735 "ZUC Generated auth tag not as expected"); 4736 return 0; 4737 } 4738 4739 static int 4740 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4741 { 4742 struct crypto_testsuite_params *ts_params = &testsuite_params; 4743 struct crypto_unittest_params *ut_params = &unittest_params; 4744 4745 int retval; 4746 4747 uint8_t *plaintext, *ciphertext; 4748 unsigned plaintext_pad_len; 4749 unsigned plaintext_len; 4750 struct rte_cryptodev_info dev_info; 4751 4752 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4753 uint64_t feat_flags = dev_info.feature_flags; 4754 4755 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4756 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4757 printf("Device doesn't support RAW data-path APIs.\n"); 4758 return TEST_SKIPPED; 4759 } 4760 4761 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4762 return TEST_SKIPPED; 4763 4764 /* Verify the capabilities */ 4765 struct rte_cryptodev_sym_capability_idx cap_idx; 4766 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4767 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4768 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4769 &cap_idx) == NULL) 4770 return TEST_SKIPPED; 4771 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4772 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4773 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4774 &cap_idx) == NULL) 4775 return TEST_SKIPPED; 4776 4777 /* Create SNOW 3G session */ 4778 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4779 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4780 RTE_CRYPTO_AUTH_OP_GENERATE, 4781 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4782 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4783 tdata->key.data, tdata->key.len, 4784 tdata->auth_iv.len, tdata->digest.len, 4785 tdata->cipher_iv.len); 4786 if (retval != 0) 4787 return retval; 4788 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4789 4790 /* clear mbuf payload */ 4791 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4792 rte_pktmbuf_tailroom(ut_params->ibuf)); 4793 4794 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4795 /* Append data which is padded to a multiple of */ 4796 /* the algorithms block size */ 4797 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4798 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4799 plaintext_pad_len); 4800 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4801 4802 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4803 4804 /* Create SNOW 3G operation */ 4805 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4806 tdata->digest.len, tdata->auth_iv.data, 4807 tdata->auth_iv.len, 4808 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4809 tdata->cipher_iv.data, tdata->cipher_iv.len, 4810 tdata->validCipherLenInBits.len, 4811 0, 4812 tdata->validAuthLenInBits.len, 4813 0 4814 ); 4815 if (retval < 0) 4816 return retval; 4817 4818 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4819 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4820 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4821 else 4822 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4823 ut_params->op); 4824 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4825 ut_params->obuf = ut_params->op->sym->m_src; 4826 if (ut_params->obuf) 4827 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4828 else 4829 ciphertext = plaintext; 4830 4831 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4832 /* Validate obuf */ 4833 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4834 ciphertext, 4835 tdata->ciphertext.data, 4836 tdata->validDataLenInBits.len, 4837 "SNOW 3G Ciphertext data not as expected"); 4838 4839 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4840 + plaintext_pad_len; 4841 4842 /* Validate obuf */ 4843 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4844 ut_params->digest, 4845 tdata->digest.data, 4846 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4847 "SNOW 3G Generated auth tag not as expected"); 4848 return 0; 4849 } 4850 4851 static int 4852 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4853 uint8_t op_mode, uint8_t verify) 4854 { 4855 struct crypto_testsuite_params *ts_params = &testsuite_params; 4856 struct crypto_unittest_params *ut_params = &unittest_params; 4857 4858 int retval; 4859 4860 uint8_t *plaintext = NULL, *ciphertext = NULL; 4861 unsigned int plaintext_pad_len; 4862 unsigned int plaintext_len; 4863 unsigned int ciphertext_pad_len; 4864 unsigned int ciphertext_len; 4865 4866 struct rte_cryptodev_info dev_info; 4867 4868 /* Verify the capabilities */ 4869 struct rte_cryptodev_sym_capability_idx cap_idx; 4870 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4871 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4872 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4873 &cap_idx) == NULL) 4874 return TEST_SKIPPED; 4875 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4876 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4877 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4878 &cap_idx) == NULL) 4879 return TEST_SKIPPED; 4880 4881 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4882 return TEST_SKIPPED; 4883 4884 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4885 4886 uint64_t feat_flags = dev_info.feature_flags; 4887 4888 if (op_mode == OUT_OF_PLACE) { 4889 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4890 printf("Device doesn't support digest encrypted.\n"); 4891 return TEST_SKIPPED; 4892 } 4893 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4894 return TEST_SKIPPED; 4895 } 4896 4897 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4898 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4899 printf("Device doesn't support RAW data-path APIs.\n"); 4900 return TEST_SKIPPED; 4901 } 4902 4903 /* Create SNOW 3G session */ 4904 retval = create_wireless_algo_auth_cipher_session( 4905 ts_params->valid_devs[0], 4906 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4907 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4908 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4909 : RTE_CRYPTO_AUTH_OP_GENERATE), 4910 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4911 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4912 tdata->key.data, tdata->key.len, 4913 tdata->auth_iv.len, tdata->digest.len, 4914 tdata->cipher_iv.len); 4915 if (retval != 0) 4916 return retval; 4917 4918 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4919 if (op_mode == OUT_OF_PLACE) 4920 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4921 4922 /* clear mbuf payload */ 4923 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4924 rte_pktmbuf_tailroom(ut_params->ibuf)); 4925 if (op_mode == OUT_OF_PLACE) 4926 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4927 rte_pktmbuf_tailroom(ut_params->obuf)); 4928 4929 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4930 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4931 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4932 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4933 4934 if (verify) { 4935 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4936 ciphertext_pad_len); 4937 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4938 if (op_mode == OUT_OF_PLACE) 4939 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4940 debug_hexdump(stdout, "ciphertext:", ciphertext, 4941 ciphertext_len); 4942 } else { 4943 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4944 plaintext_pad_len); 4945 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4946 if (op_mode == OUT_OF_PLACE) 4947 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4948 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4949 } 4950 4951 /* Create SNOW 3G operation */ 4952 retval = create_wireless_algo_auth_cipher_operation( 4953 tdata->digest.data, tdata->digest.len, 4954 tdata->cipher_iv.data, tdata->cipher_iv.len, 4955 tdata->auth_iv.data, tdata->auth_iv.len, 4956 (tdata->digest.offset_bytes == 0 ? 4957 (verify ? ciphertext_pad_len : plaintext_pad_len) 4958 : tdata->digest.offset_bytes), 4959 tdata->validCipherLenInBits.len, 4960 tdata->cipher.offset_bits, 4961 tdata->validAuthLenInBits.len, 4962 tdata->auth.offset_bits, 4963 op_mode, 0, verify); 4964 4965 if (retval < 0) 4966 return retval; 4967 4968 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4969 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4970 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4971 else 4972 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4973 ut_params->op); 4974 4975 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4976 4977 ut_params->obuf = (op_mode == IN_PLACE ? 4978 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4979 4980 if (verify) { 4981 if (ut_params->obuf) 4982 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 4983 uint8_t *); 4984 else 4985 plaintext = ciphertext + 4986 (tdata->cipher.offset_bits >> 3); 4987 4988 debug_hexdump(stdout, "plaintext:", plaintext, 4989 (tdata->plaintext.len >> 3) - tdata->digest.len); 4990 debug_hexdump(stdout, "plaintext expected:", 4991 tdata->plaintext.data, 4992 (tdata->plaintext.len >> 3) - tdata->digest.len); 4993 } else { 4994 if (ut_params->obuf) 4995 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 4996 uint8_t *); 4997 else 4998 ciphertext = plaintext; 4999 5000 debug_hexdump(stdout, "ciphertext:", ciphertext, 5001 ciphertext_len); 5002 debug_hexdump(stdout, "ciphertext expected:", 5003 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5004 5005 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5006 + (tdata->digest.offset_bytes == 0 ? 5007 plaintext_pad_len : tdata->digest.offset_bytes); 5008 5009 debug_hexdump(stdout, "digest:", ut_params->digest, 5010 tdata->digest.len); 5011 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 5012 tdata->digest.len); 5013 } 5014 5015 /* Validate obuf */ 5016 if (verify) { 5017 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5018 plaintext, 5019 tdata->plaintext.data, 5020 (tdata->plaintext.len - tdata->cipher.offset_bits - 5021 (tdata->digest.len << 3)), 5022 tdata->cipher.offset_bits, 5023 "SNOW 3G Plaintext data not as expected"); 5024 } else { 5025 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5026 ciphertext, 5027 tdata->ciphertext.data, 5028 (tdata->validDataLenInBits.len - 5029 tdata->cipher.offset_bits), 5030 tdata->cipher.offset_bits, 5031 "SNOW 3G Ciphertext data not as expected"); 5032 5033 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5034 ut_params->digest, 5035 tdata->digest.data, 5036 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5037 "SNOW 3G Generated auth tag not as expected"); 5038 } 5039 return 0; 5040 } 5041 5042 static int 5043 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 5044 uint8_t op_mode, uint8_t verify) 5045 { 5046 struct crypto_testsuite_params *ts_params = &testsuite_params; 5047 struct crypto_unittest_params *ut_params = &unittest_params; 5048 5049 int retval; 5050 5051 const uint8_t *plaintext = NULL; 5052 const uint8_t *ciphertext = NULL; 5053 const uint8_t *digest = NULL; 5054 unsigned int plaintext_pad_len; 5055 unsigned int plaintext_len; 5056 unsigned int ciphertext_pad_len; 5057 unsigned int ciphertext_len; 5058 uint8_t buffer[10000]; 5059 uint8_t digest_buffer[10000]; 5060 5061 struct rte_cryptodev_info dev_info; 5062 5063 /* Verify the capabilities */ 5064 struct rte_cryptodev_sym_capability_idx cap_idx; 5065 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5066 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5067 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5068 &cap_idx) == NULL) 5069 return TEST_SKIPPED; 5070 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5071 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5072 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5073 &cap_idx) == NULL) 5074 return TEST_SKIPPED; 5075 5076 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5077 return TEST_SKIPPED; 5078 5079 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5080 5081 uint64_t feat_flags = dev_info.feature_flags; 5082 5083 if (op_mode == IN_PLACE) { 5084 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5085 printf("Device doesn't support in-place scatter-gather " 5086 "in both input and output mbufs.\n"); 5087 return TEST_SKIPPED; 5088 } 5089 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5090 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5091 printf("Device doesn't support RAW data-path APIs.\n"); 5092 return TEST_SKIPPED; 5093 } 5094 } else { 5095 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5096 return TEST_SKIPPED; 5097 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5098 printf("Device doesn't support out-of-place scatter-gather " 5099 "in both input and output mbufs.\n"); 5100 return TEST_SKIPPED; 5101 } 5102 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5103 printf("Device doesn't support digest encrypted.\n"); 5104 return TEST_SKIPPED; 5105 } 5106 } 5107 5108 /* Create SNOW 3G session */ 5109 retval = create_wireless_algo_auth_cipher_session( 5110 ts_params->valid_devs[0], 5111 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5112 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5113 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5114 : RTE_CRYPTO_AUTH_OP_GENERATE), 5115 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5116 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5117 tdata->key.data, tdata->key.len, 5118 tdata->auth_iv.len, tdata->digest.len, 5119 tdata->cipher_iv.len); 5120 5121 if (retval != 0) 5122 return retval; 5123 5124 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5125 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5126 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5127 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5128 5129 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5130 plaintext_pad_len, 15, 0); 5131 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5132 "Failed to allocate input buffer in mempool"); 5133 5134 if (op_mode == OUT_OF_PLACE) { 5135 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5136 plaintext_pad_len, 15, 0); 5137 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5138 "Failed to allocate output buffer in mempool"); 5139 } 5140 5141 if (verify) { 5142 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5143 tdata->ciphertext.data); 5144 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5145 ciphertext_len, buffer); 5146 debug_hexdump(stdout, "ciphertext:", ciphertext, 5147 ciphertext_len); 5148 } else { 5149 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5150 tdata->plaintext.data); 5151 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5152 plaintext_len, buffer); 5153 debug_hexdump(stdout, "plaintext:", plaintext, 5154 plaintext_len); 5155 } 5156 memset(buffer, 0, sizeof(buffer)); 5157 5158 /* Create SNOW 3G operation */ 5159 retval = create_wireless_algo_auth_cipher_operation( 5160 tdata->digest.data, tdata->digest.len, 5161 tdata->cipher_iv.data, tdata->cipher_iv.len, 5162 tdata->auth_iv.data, tdata->auth_iv.len, 5163 (tdata->digest.offset_bytes == 0 ? 5164 (verify ? ciphertext_pad_len : plaintext_pad_len) 5165 : tdata->digest.offset_bytes), 5166 tdata->validCipherLenInBits.len, 5167 tdata->cipher.offset_bits, 5168 tdata->validAuthLenInBits.len, 5169 tdata->auth.offset_bits, 5170 op_mode, 1, verify); 5171 5172 if (retval < 0) 5173 return retval; 5174 5175 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5176 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5177 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5178 else 5179 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5180 ut_params->op); 5181 5182 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5183 5184 ut_params->obuf = (op_mode == IN_PLACE ? 5185 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5186 5187 if (verify) { 5188 if (ut_params->obuf) 5189 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5190 plaintext_len, buffer); 5191 else 5192 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5193 plaintext_len, buffer); 5194 5195 debug_hexdump(stdout, "plaintext:", plaintext, 5196 (tdata->plaintext.len >> 3) - tdata->digest.len); 5197 debug_hexdump(stdout, "plaintext expected:", 5198 tdata->plaintext.data, 5199 (tdata->plaintext.len >> 3) - tdata->digest.len); 5200 } else { 5201 if (ut_params->obuf) 5202 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5203 ciphertext_len, buffer); 5204 else 5205 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5206 ciphertext_len, buffer); 5207 5208 debug_hexdump(stdout, "ciphertext:", ciphertext, 5209 ciphertext_len); 5210 debug_hexdump(stdout, "ciphertext expected:", 5211 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5212 5213 if (ut_params->obuf) 5214 digest = rte_pktmbuf_read(ut_params->obuf, 5215 (tdata->digest.offset_bytes == 0 ? 5216 plaintext_pad_len : tdata->digest.offset_bytes), 5217 tdata->digest.len, digest_buffer); 5218 else 5219 digest = rte_pktmbuf_read(ut_params->ibuf, 5220 (tdata->digest.offset_bytes == 0 ? 5221 plaintext_pad_len : tdata->digest.offset_bytes), 5222 tdata->digest.len, digest_buffer); 5223 5224 debug_hexdump(stdout, "digest:", digest, 5225 tdata->digest.len); 5226 debug_hexdump(stdout, "digest expected:", 5227 tdata->digest.data, tdata->digest.len); 5228 } 5229 5230 /* Validate obuf */ 5231 if (verify) { 5232 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5233 plaintext, 5234 tdata->plaintext.data, 5235 (tdata->plaintext.len - tdata->cipher.offset_bits - 5236 (tdata->digest.len << 3)), 5237 tdata->cipher.offset_bits, 5238 "SNOW 3G Plaintext data not as expected"); 5239 } else { 5240 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5241 ciphertext, 5242 tdata->ciphertext.data, 5243 (tdata->validDataLenInBits.len - 5244 tdata->cipher.offset_bits), 5245 tdata->cipher.offset_bits, 5246 "SNOW 3G Ciphertext data not as expected"); 5247 5248 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5249 digest, 5250 tdata->digest.data, 5251 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5252 "SNOW 3G Generated auth tag not as expected"); 5253 } 5254 return 0; 5255 } 5256 5257 static int 5258 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 5259 uint8_t op_mode, uint8_t verify) 5260 { 5261 struct crypto_testsuite_params *ts_params = &testsuite_params; 5262 struct crypto_unittest_params *ut_params = &unittest_params; 5263 5264 int retval; 5265 5266 uint8_t *plaintext = NULL, *ciphertext = NULL; 5267 unsigned int plaintext_pad_len; 5268 unsigned int plaintext_len; 5269 unsigned int ciphertext_pad_len; 5270 unsigned int ciphertext_len; 5271 5272 struct rte_cryptodev_info dev_info; 5273 5274 /* Verify the capabilities */ 5275 struct rte_cryptodev_sym_capability_idx cap_idx; 5276 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5277 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5278 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5279 &cap_idx) == NULL) 5280 return TEST_SKIPPED; 5281 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5282 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5283 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5284 &cap_idx) == NULL) 5285 return TEST_SKIPPED; 5286 5287 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5288 5289 uint64_t feat_flags = dev_info.feature_flags; 5290 5291 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5292 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5293 printf("Device doesn't support RAW data-path APIs.\n"); 5294 return TEST_SKIPPED; 5295 } 5296 5297 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5298 return TEST_SKIPPED; 5299 5300 if (op_mode == OUT_OF_PLACE) { 5301 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5302 return TEST_SKIPPED; 5303 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5304 printf("Device doesn't support digest encrypted.\n"); 5305 return TEST_SKIPPED; 5306 } 5307 } 5308 5309 /* Create KASUMI session */ 5310 retval = create_wireless_algo_auth_cipher_session( 5311 ts_params->valid_devs[0], 5312 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5313 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5314 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5315 : RTE_CRYPTO_AUTH_OP_GENERATE), 5316 RTE_CRYPTO_AUTH_KASUMI_F9, 5317 RTE_CRYPTO_CIPHER_KASUMI_F8, 5318 tdata->key.data, tdata->key.len, 5319 0, tdata->digest.len, 5320 tdata->cipher_iv.len); 5321 5322 if (retval != 0) 5323 return retval; 5324 5325 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5326 if (op_mode == OUT_OF_PLACE) 5327 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5328 5329 /* clear mbuf payload */ 5330 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5331 rte_pktmbuf_tailroom(ut_params->ibuf)); 5332 if (op_mode == OUT_OF_PLACE) 5333 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5334 rte_pktmbuf_tailroom(ut_params->obuf)); 5335 5336 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5337 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5338 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5339 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5340 5341 if (verify) { 5342 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5343 ciphertext_pad_len); 5344 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5345 if (op_mode == OUT_OF_PLACE) 5346 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5347 debug_hexdump(stdout, "ciphertext:", ciphertext, 5348 ciphertext_len); 5349 } else { 5350 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5351 plaintext_pad_len); 5352 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5353 if (op_mode == OUT_OF_PLACE) 5354 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5355 debug_hexdump(stdout, "plaintext:", plaintext, 5356 plaintext_len); 5357 } 5358 5359 /* Create KASUMI operation */ 5360 retval = create_wireless_algo_auth_cipher_operation( 5361 tdata->digest.data, tdata->digest.len, 5362 tdata->cipher_iv.data, tdata->cipher_iv.len, 5363 NULL, 0, 5364 (tdata->digest.offset_bytes == 0 ? 5365 (verify ? ciphertext_pad_len : plaintext_pad_len) 5366 : tdata->digest.offset_bytes), 5367 tdata->validCipherLenInBits.len, 5368 tdata->validCipherOffsetInBits.len, 5369 tdata->validAuthLenInBits.len, 5370 0, 5371 op_mode, 0, verify); 5372 5373 if (retval < 0) 5374 return retval; 5375 5376 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5377 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5378 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5379 else 5380 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5381 ut_params->op); 5382 5383 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5384 5385 ut_params->obuf = (op_mode == IN_PLACE ? 5386 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5387 5388 5389 if (verify) { 5390 if (ut_params->obuf) 5391 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5392 uint8_t *); 5393 else 5394 plaintext = ciphertext; 5395 5396 debug_hexdump(stdout, "plaintext:", plaintext, 5397 (tdata->plaintext.len >> 3) - tdata->digest.len); 5398 debug_hexdump(stdout, "plaintext expected:", 5399 tdata->plaintext.data, 5400 (tdata->plaintext.len >> 3) - tdata->digest.len); 5401 } else { 5402 if (ut_params->obuf) 5403 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5404 uint8_t *); 5405 else 5406 ciphertext = plaintext; 5407 5408 debug_hexdump(stdout, "ciphertext:", ciphertext, 5409 ciphertext_len); 5410 debug_hexdump(stdout, "ciphertext expected:", 5411 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5412 5413 ut_params->digest = rte_pktmbuf_mtod( 5414 ut_params->obuf, uint8_t *) + 5415 (tdata->digest.offset_bytes == 0 ? 5416 plaintext_pad_len : tdata->digest.offset_bytes); 5417 5418 debug_hexdump(stdout, "digest:", ut_params->digest, 5419 tdata->digest.len); 5420 debug_hexdump(stdout, "digest expected:", 5421 tdata->digest.data, tdata->digest.len); 5422 } 5423 5424 /* Validate obuf */ 5425 if (verify) { 5426 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5427 plaintext, 5428 tdata->plaintext.data, 5429 tdata->plaintext.len >> 3, 5430 "KASUMI Plaintext data not as expected"); 5431 } else { 5432 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5433 ciphertext, 5434 tdata->ciphertext.data, 5435 tdata->ciphertext.len >> 3, 5436 "KASUMI Ciphertext data not as expected"); 5437 5438 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5439 ut_params->digest, 5440 tdata->digest.data, 5441 DIGEST_BYTE_LENGTH_KASUMI_F9, 5442 "KASUMI Generated auth tag not as expected"); 5443 } 5444 return 0; 5445 } 5446 5447 static int 5448 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5449 uint8_t op_mode, uint8_t verify) 5450 { 5451 struct crypto_testsuite_params *ts_params = &testsuite_params; 5452 struct crypto_unittest_params *ut_params = &unittest_params; 5453 5454 int retval; 5455 5456 const uint8_t *plaintext = NULL; 5457 const uint8_t *ciphertext = NULL; 5458 const uint8_t *digest = NULL; 5459 unsigned int plaintext_pad_len; 5460 unsigned int plaintext_len; 5461 unsigned int ciphertext_pad_len; 5462 unsigned int ciphertext_len; 5463 uint8_t buffer[10000]; 5464 uint8_t digest_buffer[10000]; 5465 5466 struct rte_cryptodev_info dev_info; 5467 5468 /* Verify the capabilities */ 5469 struct rte_cryptodev_sym_capability_idx cap_idx; 5470 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5471 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5472 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5473 &cap_idx) == NULL) 5474 return TEST_SKIPPED; 5475 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5476 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5477 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5478 &cap_idx) == NULL) 5479 return TEST_SKIPPED; 5480 5481 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5482 return TEST_SKIPPED; 5483 5484 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5485 5486 uint64_t feat_flags = dev_info.feature_flags; 5487 5488 if (op_mode == IN_PLACE) { 5489 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5490 printf("Device doesn't support in-place scatter-gather " 5491 "in both input and output mbufs.\n"); 5492 return TEST_SKIPPED; 5493 } 5494 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5495 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5496 printf("Device doesn't support RAW data-path APIs.\n"); 5497 return TEST_SKIPPED; 5498 } 5499 } else { 5500 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5501 return TEST_SKIPPED; 5502 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5503 printf("Device doesn't support out-of-place scatter-gather " 5504 "in both input and output mbufs.\n"); 5505 return TEST_SKIPPED; 5506 } 5507 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5508 printf("Device doesn't support digest encrypted.\n"); 5509 return TEST_SKIPPED; 5510 } 5511 } 5512 5513 /* Create KASUMI session */ 5514 retval = create_wireless_algo_auth_cipher_session( 5515 ts_params->valid_devs[0], 5516 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5517 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5518 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5519 : RTE_CRYPTO_AUTH_OP_GENERATE), 5520 RTE_CRYPTO_AUTH_KASUMI_F9, 5521 RTE_CRYPTO_CIPHER_KASUMI_F8, 5522 tdata->key.data, tdata->key.len, 5523 0, tdata->digest.len, 5524 tdata->cipher_iv.len); 5525 5526 if (retval != 0) 5527 return retval; 5528 5529 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5530 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5531 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5532 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5533 5534 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5535 plaintext_pad_len, 15, 0); 5536 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5537 "Failed to allocate input buffer in mempool"); 5538 5539 if (op_mode == OUT_OF_PLACE) { 5540 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5541 plaintext_pad_len, 15, 0); 5542 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5543 "Failed to allocate output buffer in mempool"); 5544 } 5545 5546 if (verify) { 5547 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5548 tdata->ciphertext.data); 5549 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5550 ciphertext_len, buffer); 5551 debug_hexdump(stdout, "ciphertext:", ciphertext, 5552 ciphertext_len); 5553 } else { 5554 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5555 tdata->plaintext.data); 5556 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5557 plaintext_len, buffer); 5558 debug_hexdump(stdout, "plaintext:", plaintext, 5559 plaintext_len); 5560 } 5561 memset(buffer, 0, sizeof(buffer)); 5562 5563 /* Create KASUMI operation */ 5564 retval = create_wireless_algo_auth_cipher_operation( 5565 tdata->digest.data, tdata->digest.len, 5566 tdata->cipher_iv.data, tdata->cipher_iv.len, 5567 NULL, 0, 5568 (tdata->digest.offset_bytes == 0 ? 5569 (verify ? ciphertext_pad_len : plaintext_pad_len) 5570 : tdata->digest.offset_bytes), 5571 tdata->validCipherLenInBits.len, 5572 tdata->validCipherOffsetInBits.len, 5573 tdata->validAuthLenInBits.len, 5574 0, 5575 op_mode, 1, verify); 5576 5577 if (retval < 0) 5578 return retval; 5579 5580 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5581 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5582 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5583 else 5584 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5585 ut_params->op); 5586 5587 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5588 5589 ut_params->obuf = (op_mode == IN_PLACE ? 5590 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5591 5592 if (verify) { 5593 if (ut_params->obuf) 5594 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5595 plaintext_len, buffer); 5596 else 5597 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5598 plaintext_len, buffer); 5599 5600 debug_hexdump(stdout, "plaintext:", plaintext, 5601 (tdata->plaintext.len >> 3) - tdata->digest.len); 5602 debug_hexdump(stdout, "plaintext expected:", 5603 tdata->plaintext.data, 5604 (tdata->plaintext.len >> 3) - tdata->digest.len); 5605 } else { 5606 if (ut_params->obuf) 5607 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5608 ciphertext_len, buffer); 5609 else 5610 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5611 ciphertext_len, buffer); 5612 5613 debug_hexdump(stdout, "ciphertext:", ciphertext, 5614 ciphertext_len); 5615 debug_hexdump(stdout, "ciphertext expected:", 5616 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5617 5618 if (ut_params->obuf) 5619 digest = rte_pktmbuf_read(ut_params->obuf, 5620 (tdata->digest.offset_bytes == 0 ? 5621 plaintext_pad_len : tdata->digest.offset_bytes), 5622 tdata->digest.len, digest_buffer); 5623 else 5624 digest = rte_pktmbuf_read(ut_params->ibuf, 5625 (tdata->digest.offset_bytes == 0 ? 5626 plaintext_pad_len : tdata->digest.offset_bytes), 5627 tdata->digest.len, digest_buffer); 5628 5629 debug_hexdump(stdout, "digest:", digest, 5630 tdata->digest.len); 5631 debug_hexdump(stdout, "digest expected:", 5632 tdata->digest.data, tdata->digest.len); 5633 } 5634 5635 /* Validate obuf */ 5636 if (verify) { 5637 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5638 plaintext, 5639 tdata->plaintext.data, 5640 tdata->plaintext.len >> 3, 5641 "KASUMI Plaintext data not as expected"); 5642 } else { 5643 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5644 ciphertext, 5645 tdata->ciphertext.data, 5646 tdata->validDataLenInBits.len, 5647 "KASUMI Ciphertext data not as expected"); 5648 5649 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5650 digest, 5651 tdata->digest.data, 5652 DIGEST_BYTE_LENGTH_KASUMI_F9, 5653 "KASUMI Generated auth tag not as expected"); 5654 } 5655 return 0; 5656 } 5657 5658 static int 5659 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5660 { 5661 struct crypto_testsuite_params *ts_params = &testsuite_params; 5662 struct crypto_unittest_params *ut_params = &unittest_params; 5663 5664 int retval; 5665 5666 uint8_t *plaintext, *ciphertext; 5667 unsigned plaintext_pad_len; 5668 unsigned plaintext_len; 5669 struct rte_cryptodev_info dev_info; 5670 5671 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5672 uint64_t feat_flags = dev_info.feature_flags; 5673 5674 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5675 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5676 printf("Device doesn't support RAW data-path APIs.\n"); 5677 return TEST_SKIPPED; 5678 } 5679 5680 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5681 return TEST_SKIPPED; 5682 5683 /* Verify the capabilities */ 5684 struct rte_cryptodev_sym_capability_idx cap_idx; 5685 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5686 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5687 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5688 &cap_idx) == NULL) 5689 return TEST_SKIPPED; 5690 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5691 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5692 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5693 &cap_idx) == NULL) 5694 return TEST_SKIPPED; 5695 5696 /* Create KASUMI session */ 5697 retval = create_wireless_algo_cipher_auth_session( 5698 ts_params->valid_devs[0], 5699 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5700 RTE_CRYPTO_AUTH_OP_GENERATE, 5701 RTE_CRYPTO_AUTH_KASUMI_F9, 5702 RTE_CRYPTO_CIPHER_KASUMI_F8, 5703 tdata->key.data, tdata->key.len, 5704 0, tdata->digest.len, 5705 tdata->cipher_iv.len); 5706 if (retval != 0) 5707 return retval; 5708 5709 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5710 5711 /* clear mbuf payload */ 5712 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5713 rte_pktmbuf_tailroom(ut_params->ibuf)); 5714 5715 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5716 /* Append data which is padded to a multiple of */ 5717 /* the algorithms block size */ 5718 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5719 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5720 plaintext_pad_len); 5721 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5722 5723 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5724 5725 /* Create KASUMI operation */ 5726 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5727 tdata->digest.len, NULL, 0, 5728 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5729 tdata->cipher_iv.data, tdata->cipher_iv.len, 5730 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5731 tdata->validCipherOffsetInBits.len, 5732 tdata->validAuthLenInBits.len, 5733 0 5734 ); 5735 if (retval < 0) 5736 return retval; 5737 5738 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5739 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5740 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5741 else 5742 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5743 ut_params->op); 5744 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5745 5746 if (ut_params->op->sym->m_dst) 5747 ut_params->obuf = ut_params->op->sym->m_dst; 5748 else 5749 ut_params->obuf = ut_params->op->sym->m_src; 5750 5751 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5752 tdata->validCipherOffsetInBits.len >> 3); 5753 5754 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5755 + plaintext_pad_len; 5756 5757 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5758 (tdata->validCipherOffsetInBits.len >> 3); 5759 /* Validate obuf */ 5760 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5761 ciphertext, 5762 reference_ciphertext, 5763 tdata->validCipherLenInBits.len, 5764 "KASUMI Ciphertext data not as expected"); 5765 5766 /* Validate obuf */ 5767 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5768 ut_params->digest, 5769 tdata->digest.data, 5770 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5771 "KASUMI Generated auth tag not as expected"); 5772 return 0; 5773 } 5774 5775 static int 5776 test_zuc_encryption(const struct wireless_test_data *tdata) 5777 { 5778 struct crypto_testsuite_params *ts_params = &testsuite_params; 5779 struct crypto_unittest_params *ut_params = &unittest_params; 5780 5781 int retval; 5782 uint8_t *plaintext, *ciphertext; 5783 unsigned plaintext_pad_len; 5784 unsigned plaintext_len; 5785 struct rte_cryptodev_info dev_info; 5786 5787 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5788 uint64_t feat_flags = dev_info.feature_flags; 5789 5790 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5791 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5792 printf("Device doesn't support RAW data-path APIs.\n"); 5793 return TEST_SKIPPED; 5794 } 5795 5796 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5797 return TEST_SKIPPED; 5798 5799 struct rte_cryptodev_sym_capability_idx cap_idx; 5800 5801 /* Check if device supports ZUC EEA3 */ 5802 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5803 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5804 5805 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5806 &cap_idx) == NULL) 5807 return TEST_SKIPPED; 5808 5809 /* Create ZUC session */ 5810 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5811 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5812 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5813 tdata->key.data, tdata->key.len, 5814 tdata->cipher_iv.len); 5815 if (retval < 0) 5816 return retval; 5817 5818 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5819 5820 /* Clear mbuf payload */ 5821 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5822 rte_pktmbuf_tailroom(ut_params->ibuf)); 5823 5824 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5825 /* Append data which is padded to a multiple */ 5826 /* of the algorithms block size */ 5827 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5828 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5829 plaintext_pad_len); 5830 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5831 5832 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5833 5834 /* Create ZUC operation */ 5835 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5836 tdata->cipher_iv.len, 5837 tdata->plaintext.len, 5838 0); 5839 if (retval < 0) 5840 return retval; 5841 5842 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5843 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5844 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5845 else 5846 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5847 ut_params->op); 5848 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5849 5850 ut_params->obuf = ut_params->op->sym->m_dst; 5851 if (ut_params->obuf) 5852 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 5853 else 5854 ciphertext = plaintext; 5855 5856 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5857 5858 /* Validate obuf */ 5859 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5860 ciphertext, 5861 tdata->ciphertext.data, 5862 tdata->validCipherLenInBits.len, 5863 "ZUC Ciphertext data not as expected"); 5864 return 0; 5865 } 5866 5867 static int 5868 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 5869 { 5870 struct crypto_testsuite_params *ts_params = &testsuite_params; 5871 struct crypto_unittest_params *ut_params = &unittest_params; 5872 5873 int retval; 5874 5875 unsigned int plaintext_pad_len; 5876 unsigned int plaintext_len; 5877 const uint8_t *ciphertext; 5878 uint8_t ciphertext_buffer[2048]; 5879 struct rte_cryptodev_info dev_info; 5880 5881 struct rte_cryptodev_sym_capability_idx cap_idx; 5882 5883 /* Check if device supports ZUC EEA3 */ 5884 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5885 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5886 5887 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5888 &cap_idx) == NULL) 5889 return TEST_SKIPPED; 5890 5891 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5892 return TEST_SKIPPED; 5893 5894 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5895 5896 uint64_t feat_flags = dev_info.feature_flags; 5897 5898 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5899 printf("Device doesn't support in-place scatter-gather. " 5900 "Test Skipped.\n"); 5901 return TEST_SKIPPED; 5902 } 5903 5904 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5905 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5906 printf("Device doesn't support RAW data-path APIs.\n"); 5907 return TEST_SKIPPED; 5908 } 5909 5910 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5911 5912 /* Append data which is padded to a multiple */ 5913 /* of the algorithms block size */ 5914 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5915 5916 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5917 plaintext_pad_len, 10, 0); 5918 5919 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5920 tdata->plaintext.data); 5921 5922 /* Create ZUC session */ 5923 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5924 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5925 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5926 tdata->key.data, tdata->key.len, 5927 tdata->cipher_iv.len); 5928 if (retval < 0) 5929 return retval; 5930 5931 /* Clear mbuf payload */ 5932 5933 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 5934 5935 /* Create ZUC operation */ 5936 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5937 tdata->cipher_iv.len, tdata->plaintext.len, 5938 0); 5939 if (retval < 0) 5940 return retval; 5941 5942 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5943 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5944 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5945 else 5946 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5947 ut_params->op); 5948 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5949 5950 ut_params->obuf = ut_params->op->sym->m_dst; 5951 if (ut_params->obuf) 5952 ciphertext = rte_pktmbuf_read(ut_params->obuf, 5953 0, plaintext_len, ciphertext_buffer); 5954 else 5955 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 5956 0, plaintext_len, ciphertext_buffer); 5957 5958 /* Validate obuf */ 5959 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5960 5961 /* Validate obuf */ 5962 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5963 ciphertext, 5964 tdata->ciphertext.data, 5965 tdata->validCipherLenInBits.len, 5966 "ZUC Ciphertext data not as expected"); 5967 5968 return 0; 5969 } 5970 5971 static int 5972 test_zuc_authentication(const struct wireless_test_data *tdata) 5973 { 5974 struct crypto_testsuite_params *ts_params = &testsuite_params; 5975 struct crypto_unittest_params *ut_params = &unittest_params; 5976 5977 int retval; 5978 unsigned plaintext_pad_len; 5979 unsigned plaintext_len; 5980 uint8_t *plaintext; 5981 5982 struct rte_cryptodev_sym_capability_idx cap_idx; 5983 struct rte_cryptodev_info dev_info; 5984 5985 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5986 uint64_t feat_flags = dev_info.feature_flags; 5987 5988 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 5989 (tdata->validAuthLenInBits.len % 8 != 0)) { 5990 printf("Device doesn't support NON-Byte Aligned Data.\n"); 5991 return TEST_SKIPPED; 5992 } 5993 5994 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5995 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5996 printf("Device doesn't support RAW data-path APIs.\n"); 5997 return TEST_SKIPPED; 5998 } 5999 6000 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6001 return TEST_SKIPPED; 6002 6003 /* Check if device supports ZUC EIA3 */ 6004 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6005 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6006 6007 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6008 &cap_idx) == NULL) 6009 return TEST_SKIPPED; 6010 6011 /* Create ZUC session */ 6012 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 6013 tdata->key.data, tdata->key.len, 6014 tdata->auth_iv.len, tdata->digest.len, 6015 RTE_CRYPTO_AUTH_OP_GENERATE, 6016 RTE_CRYPTO_AUTH_ZUC_EIA3); 6017 if (retval < 0) 6018 return retval; 6019 6020 /* alloc mbuf and set payload */ 6021 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6022 6023 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6024 rte_pktmbuf_tailroom(ut_params->ibuf)); 6025 6026 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6027 /* Append data which is padded to a multiple of */ 6028 /* the algorithms block size */ 6029 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6030 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6031 plaintext_pad_len); 6032 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6033 6034 /* Create ZUC operation */ 6035 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 6036 tdata->auth_iv.data, tdata->auth_iv.len, 6037 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 6038 tdata->validAuthLenInBits.len, 6039 0); 6040 if (retval < 0) 6041 return retval; 6042 6043 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6044 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6045 ut_params->op, 0, 1, 1, 0); 6046 else 6047 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6048 ut_params->op); 6049 ut_params->obuf = ut_params->op->sym->m_src; 6050 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6051 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6052 + plaintext_pad_len; 6053 6054 /* Validate obuf */ 6055 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6056 ut_params->digest, 6057 tdata->digest.data, 6058 tdata->digest.len, 6059 "ZUC Generated auth tag not as expected"); 6060 6061 return 0; 6062 } 6063 6064 static int 6065 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 6066 uint8_t op_mode, uint8_t verify) 6067 { 6068 struct crypto_testsuite_params *ts_params = &testsuite_params; 6069 struct crypto_unittest_params *ut_params = &unittest_params; 6070 6071 int retval; 6072 6073 uint8_t *plaintext = NULL, *ciphertext = NULL; 6074 unsigned int plaintext_pad_len; 6075 unsigned int plaintext_len; 6076 unsigned int ciphertext_pad_len; 6077 unsigned int ciphertext_len; 6078 6079 struct rte_cryptodev_info dev_info; 6080 struct rte_cryptodev_sym_capability_idx cap_idx; 6081 6082 /* Check if device supports ZUC EIA3 */ 6083 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6084 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6085 6086 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6087 &cap_idx) == NULL) 6088 return TEST_SKIPPED; 6089 6090 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6091 6092 uint64_t feat_flags = dev_info.feature_flags; 6093 6094 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6095 printf("Device doesn't support digest encrypted.\n"); 6096 return TEST_SKIPPED; 6097 } 6098 if (op_mode == IN_PLACE) { 6099 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6100 printf("Device doesn't support in-place scatter-gather " 6101 "in both input and output mbufs.\n"); 6102 return TEST_SKIPPED; 6103 } 6104 6105 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6106 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6107 printf("Device doesn't support RAW data-path APIs.\n"); 6108 return TEST_SKIPPED; 6109 } 6110 } else { 6111 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6112 return TEST_SKIPPED; 6113 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6114 printf("Device doesn't support out-of-place scatter-gather " 6115 "in both input and output mbufs.\n"); 6116 return TEST_SKIPPED; 6117 } 6118 } 6119 6120 /* Create ZUC session */ 6121 retval = create_wireless_algo_auth_cipher_session( 6122 ts_params->valid_devs[0], 6123 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6124 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6125 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6126 : RTE_CRYPTO_AUTH_OP_GENERATE), 6127 RTE_CRYPTO_AUTH_ZUC_EIA3, 6128 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6129 tdata->key.data, tdata->key.len, 6130 tdata->auth_iv.len, tdata->digest.len, 6131 tdata->cipher_iv.len); 6132 6133 if (retval != 0) 6134 return retval; 6135 6136 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6137 if (op_mode == OUT_OF_PLACE) 6138 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6139 6140 /* clear mbuf payload */ 6141 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6142 rte_pktmbuf_tailroom(ut_params->ibuf)); 6143 if (op_mode == OUT_OF_PLACE) 6144 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6145 rte_pktmbuf_tailroom(ut_params->obuf)); 6146 6147 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6148 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6149 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6150 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6151 6152 if (verify) { 6153 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6154 ciphertext_pad_len); 6155 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6156 if (op_mode == OUT_OF_PLACE) 6157 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6158 debug_hexdump(stdout, "ciphertext:", ciphertext, 6159 ciphertext_len); 6160 } else { 6161 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6162 plaintext_pad_len); 6163 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6164 if (op_mode == OUT_OF_PLACE) 6165 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 6166 debug_hexdump(stdout, "plaintext:", plaintext, 6167 plaintext_len); 6168 } 6169 6170 /* Create ZUC operation */ 6171 retval = create_wireless_algo_auth_cipher_operation( 6172 tdata->digest.data, tdata->digest.len, 6173 tdata->cipher_iv.data, tdata->cipher_iv.len, 6174 tdata->auth_iv.data, tdata->auth_iv.len, 6175 (tdata->digest.offset_bytes == 0 ? 6176 (verify ? ciphertext_pad_len : plaintext_pad_len) 6177 : tdata->digest.offset_bytes), 6178 tdata->validCipherLenInBits.len, 6179 tdata->validCipherOffsetInBits.len, 6180 tdata->validAuthLenInBits.len, 6181 0, 6182 op_mode, 0, verify); 6183 6184 if (retval < 0) 6185 return retval; 6186 6187 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6188 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6189 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6190 else 6191 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6192 ut_params->op); 6193 6194 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6195 6196 ut_params->obuf = (op_mode == IN_PLACE ? 6197 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6198 6199 6200 if (verify) { 6201 if (ut_params->obuf) 6202 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6203 uint8_t *); 6204 else 6205 plaintext = ciphertext; 6206 6207 debug_hexdump(stdout, "plaintext:", plaintext, 6208 (tdata->plaintext.len >> 3) - tdata->digest.len); 6209 debug_hexdump(stdout, "plaintext expected:", 6210 tdata->plaintext.data, 6211 (tdata->plaintext.len >> 3) - tdata->digest.len); 6212 } else { 6213 if (ut_params->obuf) 6214 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6215 uint8_t *); 6216 else 6217 ciphertext = plaintext; 6218 6219 debug_hexdump(stdout, "ciphertext:", ciphertext, 6220 ciphertext_len); 6221 debug_hexdump(stdout, "ciphertext expected:", 6222 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6223 6224 ut_params->digest = rte_pktmbuf_mtod( 6225 ut_params->obuf, uint8_t *) + 6226 (tdata->digest.offset_bytes == 0 ? 6227 plaintext_pad_len : tdata->digest.offset_bytes); 6228 6229 debug_hexdump(stdout, "digest:", ut_params->digest, 6230 tdata->digest.len); 6231 debug_hexdump(stdout, "digest expected:", 6232 tdata->digest.data, tdata->digest.len); 6233 } 6234 6235 /* Validate obuf */ 6236 if (verify) { 6237 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6238 plaintext, 6239 tdata->plaintext.data, 6240 tdata->plaintext.len >> 3, 6241 "ZUC Plaintext data not as expected"); 6242 } else { 6243 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6244 ciphertext, 6245 tdata->ciphertext.data, 6246 tdata->ciphertext.len >> 3, 6247 "ZUC Ciphertext data not as expected"); 6248 6249 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6250 ut_params->digest, 6251 tdata->digest.data, 6252 DIGEST_BYTE_LENGTH_KASUMI_F9, 6253 "ZUC Generated auth tag not as expected"); 6254 } 6255 return 0; 6256 } 6257 6258 static int 6259 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 6260 uint8_t op_mode, uint8_t verify) 6261 { 6262 struct crypto_testsuite_params *ts_params = &testsuite_params; 6263 struct crypto_unittest_params *ut_params = &unittest_params; 6264 6265 int retval; 6266 6267 const uint8_t *plaintext = NULL; 6268 const uint8_t *ciphertext = NULL; 6269 const uint8_t *digest = NULL; 6270 unsigned int plaintext_pad_len; 6271 unsigned int plaintext_len; 6272 unsigned int ciphertext_pad_len; 6273 unsigned int ciphertext_len; 6274 uint8_t buffer[10000]; 6275 uint8_t digest_buffer[10000]; 6276 6277 struct rte_cryptodev_info dev_info; 6278 struct rte_cryptodev_sym_capability_idx cap_idx; 6279 6280 /* Check if device supports ZUC EIA3 */ 6281 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6282 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6283 6284 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6285 &cap_idx) == NULL) 6286 return TEST_SKIPPED; 6287 6288 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6289 6290 uint64_t feat_flags = dev_info.feature_flags; 6291 6292 if (op_mode == IN_PLACE) { 6293 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6294 printf("Device doesn't support in-place scatter-gather " 6295 "in both input and output mbufs.\n"); 6296 return TEST_SKIPPED; 6297 } 6298 6299 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6300 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6301 printf("Device doesn't support RAW data-path APIs.\n"); 6302 return TEST_SKIPPED; 6303 } 6304 } else { 6305 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6306 return TEST_SKIPPED; 6307 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6308 printf("Device doesn't support out-of-place scatter-gather " 6309 "in both input and output mbufs.\n"); 6310 return TEST_SKIPPED; 6311 } 6312 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6313 printf("Device doesn't support digest encrypted.\n"); 6314 return TEST_SKIPPED; 6315 } 6316 } 6317 6318 /* Create ZUC session */ 6319 retval = create_wireless_algo_auth_cipher_session( 6320 ts_params->valid_devs[0], 6321 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6322 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6323 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6324 : RTE_CRYPTO_AUTH_OP_GENERATE), 6325 RTE_CRYPTO_AUTH_ZUC_EIA3, 6326 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6327 tdata->key.data, tdata->key.len, 6328 tdata->auth_iv.len, tdata->digest.len, 6329 tdata->cipher_iv.len); 6330 6331 if (retval != 0) 6332 return retval; 6333 6334 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6335 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6336 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6337 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6338 6339 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6340 plaintext_pad_len, 15, 0); 6341 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6342 "Failed to allocate input buffer in mempool"); 6343 6344 if (op_mode == OUT_OF_PLACE) { 6345 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6346 plaintext_pad_len, 15, 0); 6347 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6348 "Failed to allocate output buffer in mempool"); 6349 } 6350 6351 if (verify) { 6352 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6353 tdata->ciphertext.data); 6354 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6355 ciphertext_len, buffer); 6356 debug_hexdump(stdout, "ciphertext:", ciphertext, 6357 ciphertext_len); 6358 } else { 6359 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6360 tdata->plaintext.data); 6361 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6362 plaintext_len, buffer); 6363 debug_hexdump(stdout, "plaintext:", plaintext, 6364 plaintext_len); 6365 } 6366 memset(buffer, 0, sizeof(buffer)); 6367 6368 /* Create ZUC operation */ 6369 retval = create_wireless_algo_auth_cipher_operation( 6370 tdata->digest.data, tdata->digest.len, 6371 tdata->cipher_iv.data, tdata->cipher_iv.len, 6372 NULL, 0, 6373 (tdata->digest.offset_bytes == 0 ? 6374 (verify ? ciphertext_pad_len : plaintext_pad_len) 6375 : tdata->digest.offset_bytes), 6376 tdata->validCipherLenInBits.len, 6377 tdata->validCipherOffsetInBits.len, 6378 tdata->validAuthLenInBits.len, 6379 0, 6380 op_mode, 1, verify); 6381 6382 if (retval < 0) 6383 return retval; 6384 6385 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6386 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6387 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6388 else 6389 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6390 ut_params->op); 6391 6392 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6393 6394 ut_params->obuf = (op_mode == IN_PLACE ? 6395 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6396 6397 if (verify) { 6398 if (ut_params->obuf) 6399 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6400 plaintext_len, buffer); 6401 else 6402 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6403 plaintext_len, buffer); 6404 6405 debug_hexdump(stdout, "plaintext:", plaintext, 6406 (tdata->plaintext.len >> 3) - tdata->digest.len); 6407 debug_hexdump(stdout, "plaintext expected:", 6408 tdata->plaintext.data, 6409 (tdata->plaintext.len >> 3) - tdata->digest.len); 6410 } else { 6411 if (ut_params->obuf) 6412 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6413 ciphertext_len, buffer); 6414 else 6415 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6416 ciphertext_len, buffer); 6417 6418 debug_hexdump(stdout, "ciphertext:", ciphertext, 6419 ciphertext_len); 6420 debug_hexdump(stdout, "ciphertext expected:", 6421 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6422 6423 if (ut_params->obuf) 6424 digest = rte_pktmbuf_read(ut_params->obuf, 6425 (tdata->digest.offset_bytes == 0 ? 6426 plaintext_pad_len : tdata->digest.offset_bytes), 6427 tdata->digest.len, digest_buffer); 6428 else 6429 digest = rte_pktmbuf_read(ut_params->ibuf, 6430 (tdata->digest.offset_bytes == 0 ? 6431 plaintext_pad_len : tdata->digest.offset_bytes), 6432 tdata->digest.len, digest_buffer); 6433 6434 debug_hexdump(stdout, "digest:", digest, 6435 tdata->digest.len); 6436 debug_hexdump(stdout, "digest expected:", 6437 tdata->digest.data, tdata->digest.len); 6438 } 6439 6440 /* Validate obuf */ 6441 if (verify) { 6442 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6443 plaintext, 6444 tdata->plaintext.data, 6445 tdata->plaintext.len >> 3, 6446 "ZUC Plaintext data not as expected"); 6447 } else { 6448 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6449 ciphertext, 6450 tdata->ciphertext.data, 6451 tdata->validDataLenInBits.len, 6452 "ZUC Ciphertext data not as expected"); 6453 6454 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6455 digest, 6456 tdata->digest.data, 6457 DIGEST_BYTE_LENGTH_KASUMI_F9, 6458 "ZUC Generated auth tag not as expected"); 6459 } 6460 return 0; 6461 } 6462 6463 static int 6464 test_kasumi_encryption_test_case_1(void) 6465 { 6466 return test_kasumi_encryption(&kasumi_test_case_1); 6467 } 6468 6469 static int 6470 test_kasumi_encryption_test_case_1_sgl(void) 6471 { 6472 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6473 } 6474 6475 static int 6476 test_kasumi_encryption_test_case_1_oop(void) 6477 { 6478 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6479 } 6480 6481 static int 6482 test_kasumi_encryption_test_case_1_oop_sgl(void) 6483 { 6484 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6485 } 6486 6487 static int 6488 test_kasumi_encryption_test_case_2(void) 6489 { 6490 return test_kasumi_encryption(&kasumi_test_case_2); 6491 } 6492 6493 static int 6494 test_kasumi_encryption_test_case_3(void) 6495 { 6496 return test_kasumi_encryption(&kasumi_test_case_3); 6497 } 6498 6499 static int 6500 test_kasumi_encryption_test_case_4(void) 6501 { 6502 return test_kasumi_encryption(&kasumi_test_case_4); 6503 } 6504 6505 static int 6506 test_kasumi_encryption_test_case_5(void) 6507 { 6508 return test_kasumi_encryption(&kasumi_test_case_5); 6509 } 6510 6511 static int 6512 test_kasumi_decryption_test_case_1(void) 6513 { 6514 return test_kasumi_decryption(&kasumi_test_case_1); 6515 } 6516 6517 static int 6518 test_kasumi_decryption_test_case_1_oop(void) 6519 { 6520 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6521 } 6522 6523 static int 6524 test_kasumi_decryption_test_case_2(void) 6525 { 6526 return test_kasumi_decryption(&kasumi_test_case_2); 6527 } 6528 6529 static int 6530 test_kasumi_decryption_test_case_3(void) 6531 { 6532 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6533 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6534 return TEST_SKIPPED; 6535 return test_kasumi_decryption(&kasumi_test_case_3); 6536 } 6537 6538 static int 6539 test_kasumi_decryption_test_case_4(void) 6540 { 6541 return test_kasumi_decryption(&kasumi_test_case_4); 6542 } 6543 6544 static int 6545 test_kasumi_decryption_test_case_5(void) 6546 { 6547 return test_kasumi_decryption(&kasumi_test_case_5); 6548 } 6549 static int 6550 test_snow3g_encryption_test_case_1(void) 6551 { 6552 return test_snow3g_encryption(&snow3g_test_case_1); 6553 } 6554 6555 static int 6556 test_snow3g_encryption_test_case_1_oop(void) 6557 { 6558 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6559 } 6560 6561 static int 6562 test_snow3g_encryption_test_case_1_oop_sgl(void) 6563 { 6564 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 6565 } 6566 6567 6568 static int 6569 test_snow3g_encryption_test_case_1_offset_oop(void) 6570 { 6571 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6572 } 6573 6574 static int 6575 test_snow3g_encryption_test_case_2(void) 6576 { 6577 return test_snow3g_encryption(&snow3g_test_case_2); 6578 } 6579 6580 static int 6581 test_snow3g_encryption_test_case_3(void) 6582 { 6583 return test_snow3g_encryption(&snow3g_test_case_3); 6584 } 6585 6586 static int 6587 test_snow3g_encryption_test_case_4(void) 6588 { 6589 return test_snow3g_encryption(&snow3g_test_case_4); 6590 } 6591 6592 static int 6593 test_snow3g_encryption_test_case_5(void) 6594 { 6595 return test_snow3g_encryption(&snow3g_test_case_5); 6596 } 6597 6598 static int 6599 test_snow3g_decryption_test_case_1(void) 6600 { 6601 return test_snow3g_decryption(&snow3g_test_case_1); 6602 } 6603 6604 static int 6605 test_snow3g_decryption_test_case_1_oop(void) 6606 { 6607 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6608 } 6609 6610 static int 6611 test_snow3g_decryption_test_case_2(void) 6612 { 6613 return test_snow3g_decryption(&snow3g_test_case_2); 6614 } 6615 6616 static int 6617 test_snow3g_decryption_test_case_3(void) 6618 { 6619 return test_snow3g_decryption(&snow3g_test_case_3); 6620 } 6621 6622 static int 6623 test_snow3g_decryption_test_case_4(void) 6624 { 6625 return test_snow3g_decryption(&snow3g_test_case_4); 6626 } 6627 6628 static int 6629 test_snow3g_decryption_test_case_5(void) 6630 { 6631 return test_snow3g_decryption(&snow3g_test_case_5); 6632 } 6633 6634 /* 6635 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6636 * Pattern digest from snow3g_test_data must be allocated as 6637 * 4 last bytes in plaintext. 6638 */ 6639 static void 6640 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6641 struct snow3g_hash_test_data *output) 6642 { 6643 if ((pattern != NULL) && (output != NULL)) { 6644 output->key.len = pattern->key.len; 6645 6646 memcpy(output->key.data, 6647 pattern->key.data, pattern->key.len); 6648 6649 output->auth_iv.len = pattern->auth_iv.len; 6650 6651 memcpy(output->auth_iv.data, 6652 pattern->auth_iv.data, pattern->auth_iv.len); 6653 6654 output->plaintext.len = pattern->plaintext.len; 6655 6656 memcpy(output->plaintext.data, 6657 pattern->plaintext.data, pattern->plaintext.len >> 3); 6658 6659 output->digest.len = pattern->digest.len; 6660 6661 memcpy(output->digest.data, 6662 &pattern->plaintext.data[pattern->digest.offset_bytes], 6663 pattern->digest.len); 6664 6665 output->validAuthLenInBits.len = 6666 pattern->validAuthLenInBits.len; 6667 } 6668 } 6669 6670 /* 6671 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6672 */ 6673 static int 6674 test_snow3g_decryption_with_digest_test_case_1(void) 6675 { 6676 struct snow3g_hash_test_data snow3g_hash_data; 6677 struct rte_cryptodev_info dev_info; 6678 struct crypto_testsuite_params *ts_params = &testsuite_params; 6679 6680 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6681 uint64_t feat_flags = dev_info.feature_flags; 6682 6683 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6684 printf("Device doesn't support encrypted digest operations.\n"); 6685 return TEST_SKIPPED; 6686 } 6687 6688 /* 6689 * Function prepare data for hash veryfication test case. 6690 * Digest is allocated in 4 last bytes in plaintext, pattern. 6691 */ 6692 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6693 6694 return test_snow3g_decryption(&snow3g_test_case_7) & 6695 test_snow3g_authentication_verify(&snow3g_hash_data); 6696 } 6697 6698 static int 6699 test_snow3g_cipher_auth_test_case_1(void) 6700 { 6701 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6702 } 6703 6704 static int 6705 test_snow3g_auth_cipher_test_case_1(void) 6706 { 6707 return test_snow3g_auth_cipher( 6708 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6709 } 6710 6711 static int 6712 test_snow3g_auth_cipher_test_case_2(void) 6713 { 6714 return test_snow3g_auth_cipher( 6715 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6716 } 6717 6718 static int 6719 test_snow3g_auth_cipher_test_case_2_oop(void) 6720 { 6721 return test_snow3g_auth_cipher( 6722 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6723 } 6724 6725 static int 6726 test_snow3g_auth_cipher_part_digest_enc(void) 6727 { 6728 return test_snow3g_auth_cipher( 6729 &snow3g_auth_cipher_partial_digest_encryption, 6730 IN_PLACE, 0); 6731 } 6732 6733 static int 6734 test_snow3g_auth_cipher_part_digest_enc_oop(void) 6735 { 6736 return test_snow3g_auth_cipher( 6737 &snow3g_auth_cipher_partial_digest_encryption, 6738 OUT_OF_PLACE, 0); 6739 } 6740 6741 static int 6742 test_snow3g_auth_cipher_test_case_3_sgl(void) 6743 { 6744 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6745 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6746 return TEST_SKIPPED; 6747 return test_snow3g_auth_cipher_sgl( 6748 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 6749 } 6750 6751 static int 6752 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 6753 { 6754 return test_snow3g_auth_cipher_sgl( 6755 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 6756 } 6757 6758 static int 6759 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 6760 { 6761 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6762 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6763 return TEST_SKIPPED; 6764 return test_snow3g_auth_cipher_sgl( 6765 &snow3g_auth_cipher_partial_digest_encryption, 6766 IN_PLACE, 0); 6767 } 6768 6769 static int 6770 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 6771 { 6772 return test_snow3g_auth_cipher_sgl( 6773 &snow3g_auth_cipher_partial_digest_encryption, 6774 OUT_OF_PLACE, 0); 6775 } 6776 6777 static int 6778 test_snow3g_auth_cipher_verify_test_case_1(void) 6779 { 6780 return test_snow3g_auth_cipher( 6781 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 6782 } 6783 6784 static int 6785 test_snow3g_auth_cipher_verify_test_case_2(void) 6786 { 6787 return test_snow3g_auth_cipher( 6788 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 6789 } 6790 6791 static int 6792 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 6793 { 6794 return test_snow3g_auth_cipher( 6795 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6796 } 6797 6798 static int 6799 test_snow3g_auth_cipher_verify_part_digest_enc(void) 6800 { 6801 return test_snow3g_auth_cipher( 6802 &snow3g_auth_cipher_partial_digest_encryption, 6803 IN_PLACE, 1); 6804 } 6805 6806 static int 6807 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 6808 { 6809 return test_snow3g_auth_cipher( 6810 &snow3g_auth_cipher_partial_digest_encryption, 6811 OUT_OF_PLACE, 1); 6812 } 6813 6814 static int 6815 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 6816 { 6817 return test_snow3g_auth_cipher_sgl( 6818 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 6819 } 6820 6821 static int 6822 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 6823 { 6824 return test_snow3g_auth_cipher_sgl( 6825 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 6826 } 6827 6828 static int 6829 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 6830 { 6831 return test_snow3g_auth_cipher_sgl( 6832 &snow3g_auth_cipher_partial_digest_encryption, 6833 IN_PLACE, 1); 6834 } 6835 6836 static int 6837 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 6838 { 6839 return test_snow3g_auth_cipher_sgl( 6840 &snow3g_auth_cipher_partial_digest_encryption, 6841 OUT_OF_PLACE, 1); 6842 } 6843 6844 static int 6845 test_snow3g_auth_cipher_with_digest_test_case_1(void) 6846 { 6847 return test_snow3g_auth_cipher( 6848 &snow3g_test_case_7, IN_PLACE, 0); 6849 } 6850 6851 static int 6852 test_kasumi_auth_cipher_test_case_1(void) 6853 { 6854 return test_kasumi_auth_cipher( 6855 &kasumi_test_case_3, IN_PLACE, 0); 6856 } 6857 6858 static int 6859 test_kasumi_auth_cipher_test_case_2(void) 6860 { 6861 return test_kasumi_auth_cipher( 6862 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6863 } 6864 6865 static int 6866 test_kasumi_auth_cipher_test_case_2_oop(void) 6867 { 6868 return test_kasumi_auth_cipher( 6869 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6870 } 6871 6872 static int 6873 test_kasumi_auth_cipher_test_case_2_sgl(void) 6874 { 6875 return test_kasumi_auth_cipher_sgl( 6876 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6877 } 6878 6879 static int 6880 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 6881 { 6882 return test_kasumi_auth_cipher_sgl( 6883 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6884 } 6885 6886 static int 6887 test_kasumi_auth_cipher_verify_test_case_1(void) 6888 { 6889 return test_kasumi_auth_cipher( 6890 &kasumi_test_case_3, IN_PLACE, 1); 6891 } 6892 6893 static int 6894 test_kasumi_auth_cipher_verify_test_case_2(void) 6895 { 6896 return test_kasumi_auth_cipher( 6897 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6898 } 6899 6900 static int 6901 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 6902 { 6903 return test_kasumi_auth_cipher( 6904 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6905 } 6906 6907 static int 6908 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 6909 { 6910 return test_kasumi_auth_cipher_sgl( 6911 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6912 } 6913 6914 static int 6915 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 6916 { 6917 return test_kasumi_auth_cipher_sgl( 6918 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6919 } 6920 6921 static int 6922 test_kasumi_cipher_auth_test_case_1(void) 6923 { 6924 return test_kasumi_cipher_auth(&kasumi_test_case_6); 6925 } 6926 6927 static int 6928 test_zuc_encryption_test_case_1(void) 6929 { 6930 return test_zuc_encryption(&zuc_test_case_cipher_193b); 6931 } 6932 6933 static int 6934 test_zuc_encryption_test_case_2(void) 6935 { 6936 return test_zuc_encryption(&zuc_test_case_cipher_800b); 6937 } 6938 6939 static int 6940 test_zuc_encryption_test_case_3(void) 6941 { 6942 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 6943 } 6944 6945 static int 6946 test_zuc_encryption_test_case_4(void) 6947 { 6948 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 6949 } 6950 6951 static int 6952 test_zuc_encryption_test_case_5(void) 6953 { 6954 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 6955 } 6956 6957 static int 6958 test_zuc_encryption_test_case_6_sgl(void) 6959 { 6960 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 6961 } 6962 6963 static int 6964 test_zuc_hash_generate_test_case_1(void) 6965 { 6966 return test_zuc_authentication(&zuc_test_case_auth_1b); 6967 } 6968 6969 static int 6970 test_zuc_hash_generate_test_case_2(void) 6971 { 6972 return test_zuc_authentication(&zuc_test_case_auth_90b); 6973 } 6974 6975 static int 6976 test_zuc_hash_generate_test_case_3(void) 6977 { 6978 return test_zuc_authentication(&zuc_test_case_auth_577b); 6979 } 6980 6981 static int 6982 test_zuc_hash_generate_test_case_4(void) 6983 { 6984 return test_zuc_authentication(&zuc_test_case_auth_2079b); 6985 } 6986 6987 static int 6988 test_zuc_hash_generate_test_case_5(void) 6989 { 6990 return test_zuc_authentication(&zuc_test_auth_5670b); 6991 } 6992 6993 static int 6994 test_zuc_hash_generate_test_case_6(void) 6995 { 6996 return test_zuc_authentication(&zuc_test_case_auth_128b); 6997 } 6998 6999 static int 7000 test_zuc_hash_generate_test_case_7(void) 7001 { 7002 return test_zuc_authentication(&zuc_test_case_auth_2080b); 7003 } 7004 7005 static int 7006 test_zuc_hash_generate_test_case_8(void) 7007 { 7008 return test_zuc_authentication(&zuc_test_case_auth_584b); 7009 } 7010 7011 static int 7012 test_zuc_cipher_auth_test_case_1(void) 7013 { 7014 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 7015 } 7016 7017 static int 7018 test_zuc_cipher_auth_test_case_2(void) 7019 { 7020 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 7021 } 7022 7023 static int 7024 test_zuc_auth_cipher_test_case_1(void) 7025 { 7026 return test_zuc_auth_cipher( 7027 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7028 } 7029 7030 static int 7031 test_zuc_auth_cipher_test_case_1_oop(void) 7032 { 7033 return test_zuc_auth_cipher( 7034 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7035 } 7036 7037 static int 7038 test_zuc_auth_cipher_test_case_1_sgl(void) 7039 { 7040 return test_zuc_auth_cipher_sgl( 7041 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7042 } 7043 7044 static int 7045 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 7046 { 7047 return test_zuc_auth_cipher_sgl( 7048 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7049 } 7050 7051 static int 7052 test_zuc_auth_cipher_verify_test_case_1(void) 7053 { 7054 return test_zuc_auth_cipher( 7055 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7056 } 7057 7058 static int 7059 test_zuc_auth_cipher_verify_test_case_1_oop(void) 7060 { 7061 return test_zuc_auth_cipher( 7062 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7063 } 7064 7065 static int 7066 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 7067 { 7068 return test_zuc_auth_cipher_sgl( 7069 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7070 } 7071 7072 static int 7073 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 7074 { 7075 return test_zuc_auth_cipher_sgl( 7076 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7077 } 7078 7079 static int 7080 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 7081 { 7082 uint8_t dev_id = testsuite_params.valid_devs[0]; 7083 7084 struct rte_cryptodev_sym_capability_idx cap_idx; 7085 7086 /* Check if device supports particular cipher algorithm */ 7087 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7088 cap_idx.algo.cipher = tdata->cipher_algo; 7089 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7090 return TEST_SKIPPED; 7091 7092 /* Check if device supports particular hash algorithm */ 7093 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7094 cap_idx.algo.auth = tdata->auth_algo; 7095 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7096 return TEST_SKIPPED; 7097 7098 return 0; 7099 } 7100 7101 static int 7102 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 7103 uint8_t op_mode, uint8_t verify) 7104 { 7105 struct crypto_testsuite_params *ts_params = &testsuite_params; 7106 struct crypto_unittest_params *ut_params = &unittest_params; 7107 7108 int retval; 7109 7110 uint8_t *plaintext = NULL, *ciphertext = NULL; 7111 unsigned int plaintext_pad_len; 7112 unsigned int plaintext_len; 7113 unsigned int ciphertext_pad_len; 7114 unsigned int ciphertext_len; 7115 7116 struct rte_cryptodev_info dev_info; 7117 struct rte_crypto_op *op; 7118 7119 /* Check if device supports particular algorithms separately */ 7120 if (test_mixed_check_if_unsupported(tdata)) 7121 return TEST_SKIPPED; 7122 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7123 return TEST_SKIPPED; 7124 7125 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7126 7127 uint64_t feat_flags = dev_info.feature_flags; 7128 7129 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7130 printf("Device doesn't support digest encrypted.\n"); 7131 return TEST_SKIPPED; 7132 } 7133 7134 /* Create the session */ 7135 if (verify) 7136 retval = create_wireless_algo_cipher_auth_session( 7137 ts_params->valid_devs[0], 7138 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7139 RTE_CRYPTO_AUTH_OP_VERIFY, 7140 tdata->auth_algo, 7141 tdata->cipher_algo, 7142 tdata->auth_key.data, tdata->auth_key.len, 7143 tdata->auth_iv.len, tdata->digest_enc.len, 7144 tdata->cipher_iv.len); 7145 else 7146 retval = create_wireless_algo_auth_cipher_session( 7147 ts_params->valid_devs[0], 7148 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7149 RTE_CRYPTO_AUTH_OP_GENERATE, 7150 tdata->auth_algo, 7151 tdata->cipher_algo, 7152 tdata->auth_key.data, tdata->auth_key.len, 7153 tdata->auth_iv.len, tdata->digest_enc.len, 7154 tdata->cipher_iv.len); 7155 if (retval != 0) 7156 return retval; 7157 7158 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7159 if (op_mode == OUT_OF_PLACE) 7160 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7161 7162 /* clear mbuf payload */ 7163 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7164 rte_pktmbuf_tailroom(ut_params->ibuf)); 7165 if (op_mode == OUT_OF_PLACE) { 7166 7167 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 7168 rte_pktmbuf_tailroom(ut_params->obuf)); 7169 } 7170 7171 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7172 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7173 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7174 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7175 7176 if (verify) { 7177 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7178 ciphertext_pad_len); 7179 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 7180 if (op_mode == OUT_OF_PLACE) 7181 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 7182 debug_hexdump(stdout, "ciphertext:", ciphertext, 7183 ciphertext_len); 7184 } else { 7185 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7186 plaintext_pad_len); 7187 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 7188 if (op_mode == OUT_OF_PLACE) 7189 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 7190 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 7191 } 7192 7193 /* Create the operation */ 7194 retval = create_wireless_algo_auth_cipher_operation( 7195 tdata->digest_enc.data, tdata->digest_enc.len, 7196 tdata->cipher_iv.data, tdata->cipher_iv.len, 7197 tdata->auth_iv.data, tdata->auth_iv.len, 7198 (tdata->digest_enc.offset == 0 ? 7199 plaintext_pad_len 7200 : tdata->digest_enc.offset), 7201 tdata->validCipherLen.len_bits, 7202 tdata->cipher.offset_bits, 7203 tdata->validAuthLen.len_bits, 7204 tdata->auth.offset_bits, 7205 op_mode, 0, verify); 7206 7207 if (retval < 0) 7208 return retval; 7209 7210 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7211 7212 /* Check if the op failed because the device doesn't */ 7213 /* support this particular combination of algorithms */ 7214 if (op == NULL && ut_params->op->status == 7215 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7216 printf("Device doesn't support this mixed combination. " 7217 "Test Skipped.\n"); 7218 return TEST_SKIPPED; 7219 } 7220 ut_params->op = op; 7221 7222 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7223 7224 ut_params->obuf = (op_mode == IN_PLACE ? 7225 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7226 7227 if (verify) { 7228 if (ut_params->obuf) 7229 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 7230 uint8_t *); 7231 else 7232 plaintext = ciphertext + 7233 (tdata->cipher.offset_bits >> 3); 7234 7235 debug_hexdump(stdout, "plaintext:", plaintext, 7236 tdata->plaintext.len_bits >> 3); 7237 debug_hexdump(stdout, "plaintext expected:", 7238 tdata->plaintext.data, 7239 tdata->plaintext.len_bits >> 3); 7240 } else { 7241 if (ut_params->obuf) 7242 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 7243 uint8_t *); 7244 else 7245 ciphertext = plaintext; 7246 7247 debug_hexdump(stdout, "ciphertext:", ciphertext, 7248 ciphertext_len); 7249 debug_hexdump(stdout, "ciphertext expected:", 7250 tdata->ciphertext.data, 7251 tdata->ciphertext.len_bits >> 3); 7252 7253 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 7254 + (tdata->digest_enc.offset == 0 ? 7255 plaintext_pad_len : tdata->digest_enc.offset); 7256 7257 debug_hexdump(stdout, "digest:", ut_params->digest, 7258 tdata->digest_enc.len); 7259 debug_hexdump(stdout, "digest expected:", 7260 tdata->digest_enc.data, 7261 tdata->digest_enc.len); 7262 } 7263 7264 /* Validate obuf */ 7265 if (verify) { 7266 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7267 plaintext, 7268 tdata->plaintext.data, 7269 tdata->plaintext.len_bits >> 3, 7270 "Plaintext data not as expected"); 7271 } else { 7272 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7273 ciphertext, 7274 tdata->ciphertext.data, 7275 tdata->validDataLen.len_bits, 7276 "Ciphertext data not as expected"); 7277 7278 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7279 ut_params->digest, 7280 tdata->digest_enc.data, 7281 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 7282 "Generated auth tag not as expected"); 7283 } 7284 7285 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7286 "crypto op processing failed"); 7287 7288 return 0; 7289 } 7290 7291 static int 7292 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 7293 uint8_t op_mode, uint8_t verify) 7294 { 7295 struct crypto_testsuite_params *ts_params = &testsuite_params; 7296 struct crypto_unittest_params *ut_params = &unittest_params; 7297 7298 int retval; 7299 7300 const uint8_t *plaintext = NULL; 7301 const uint8_t *ciphertext = NULL; 7302 const uint8_t *digest = NULL; 7303 unsigned int plaintext_pad_len; 7304 unsigned int plaintext_len; 7305 unsigned int ciphertext_pad_len; 7306 unsigned int ciphertext_len; 7307 uint8_t buffer[10000]; 7308 uint8_t digest_buffer[10000]; 7309 7310 struct rte_cryptodev_info dev_info; 7311 struct rte_crypto_op *op; 7312 7313 /* Check if device supports particular algorithms */ 7314 if (test_mixed_check_if_unsupported(tdata)) 7315 return TEST_SKIPPED; 7316 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7317 return TEST_SKIPPED; 7318 7319 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7320 7321 uint64_t feat_flags = dev_info.feature_flags; 7322 7323 if (op_mode == IN_PLACE) { 7324 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 7325 printf("Device doesn't support in-place scatter-gather " 7326 "in both input and output mbufs.\n"); 7327 return TEST_SKIPPED; 7328 } 7329 } else { 7330 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 7331 printf("Device doesn't support out-of-place scatter-gather " 7332 "in both input and output mbufs.\n"); 7333 return TEST_SKIPPED; 7334 } 7335 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7336 printf("Device doesn't support digest encrypted.\n"); 7337 return TEST_SKIPPED; 7338 } 7339 } 7340 7341 /* Create the session */ 7342 if (verify) 7343 retval = create_wireless_algo_cipher_auth_session( 7344 ts_params->valid_devs[0], 7345 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7346 RTE_CRYPTO_AUTH_OP_VERIFY, 7347 tdata->auth_algo, 7348 tdata->cipher_algo, 7349 tdata->auth_key.data, tdata->auth_key.len, 7350 tdata->auth_iv.len, tdata->digest_enc.len, 7351 tdata->cipher_iv.len); 7352 else 7353 retval = create_wireless_algo_auth_cipher_session( 7354 ts_params->valid_devs[0], 7355 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7356 RTE_CRYPTO_AUTH_OP_GENERATE, 7357 tdata->auth_algo, 7358 tdata->cipher_algo, 7359 tdata->auth_key.data, tdata->auth_key.len, 7360 tdata->auth_iv.len, tdata->digest_enc.len, 7361 tdata->cipher_iv.len); 7362 if (retval != 0) 7363 return retval; 7364 7365 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7366 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7367 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7368 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7369 7370 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7371 ciphertext_pad_len, 15, 0); 7372 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7373 "Failed to allocate input buffer in mempool"); 7374 7375 if (op_mode == OUT_OF_PLACE) { 7376 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7377 plaintext_pad_len, 15, 0); 7378 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7379 "Failed to allocate output buffer in mempool"); 7380 } 7381 7382 if (verify) { 7383 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7384 tdata->ciphertext.data); 7385 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7386 ciphertext_len, buffer); 7387 debug_hexdump(stdout, "ciphertext:", ciphertext, 7388 ciphertext_len); 7389 } else { 7390 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7391 tdata->plaintext.data); 7392 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7393 plaintext_len, buffer); 7394 debug_hexdump(stdout, "plaintext:", plaintext, 7395 plaintext_len); 7396 } 7397 memset(buffer, 0, sizeof(buffer)); 7398 7399 /* Create the operation */ 7400 retval = create_wireless_algo_auth_cipher_operation( 7401 tdata->digest_enc.data, tdata->digest_enc.len, 7402 tdata->cipher_iv.data, tdata->cipher_iv.len, 7403 tdata->auth_iv.data, tdata->auth_iv.len, 7404 (tdata->digest_enc.offset == 0 ? 7405 plaintext_pad_len 7406 : tdata->digest_enc.offset), 7407 tdata->validCipherLen.len_bits, 7408 tdata->cipher.offset_bits, 7409 tdata->validAuthLen.len_bits, 7410 tdata->auth.offset_bits, 7411 op_mode, 1, verify); 7412 7413 if (retval < 0) 7414 return retval; 7415 7416 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7417 7418 /* Check if the op failed because the device doesn't */ 7419 /* support this particular combination of algorithms */ 7420 if (op == NULL && ut_params->op->status == 7421 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7422 printf("Device doesn't support this mixed combination. " 7423 "Test Skipped.\n"); 7424 return TEST_SKIPPED; 7425 } 7426 ut_params->op = op; 7427 7428 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7429 7430 ut_params->obuf = (op_mode == IN_PLACE ? 7431 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7432 7433 if (verify) { 7434 if (ut_params->obuf) 7435 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7436 plaintext_len, buffer); 7437 else 7438 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7439 plaintext_len, buffer); 7440 7441 debug_hexdump(stdout, "plaintext:", plaintext, 7442 (tdata->plaintext.len_bits >> 3) - 7443 tdata->digest_enc.len); 7444 debug_hexdump(stdout, "plaintext expected:", 7445 tdata->plaintext.data, 7446 (tdata->plaintext.len_bits >> 3) - 7447 tdata->digest_enc.len); 7448 } else { 7449 if (ut_params->obuf) 7450 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 7451 ciphertext_len, buffer); 7452 else 7453 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7454 ciphertext_len, buffer); 7455 7456 debug_hexdump(stdout, "ciphertext:", ciphertext, 7457 ciphertext_len); 7458 debug_hexdump(stdout, "ciphertext expected:", 7459 tdata->ciphertext.data, 7460 tdata->ciphertext.len_bits >> 3); 7461 7462 if (ut_params->obuf) 7463 digest = rte_pktmbuf_read(ut_params->obuf, 7464 (tdata->digest_enc.offset == 0 ? 7465 plaintext_pad_len : 7466 tdata->digest_enc.offset), 7467 tdata->digest_enc.len, digest_buffer); 7468 else 7469 digest = rte_pktmbuf_read(ut_params->ibuf, 7470 (tdata->digest_enc.offset == 0 ? 7471 plaintext_pad_len : 7472 tdata->digest_enc.offset), 7473 tdata->digest_enc.len, digest_buffer); 7474 7475 debug_hexdump(stdout, "digest:", digest, 7476 tdata->digest_enc.len); 7477 debug_hexdump(stdout, "digest expected:", 7478 tdata->digest_enc.data, tdata->digest_enc.len); 7479 } 7480 7481 /* Validate obuf */ 7482 if (verify) { 7483 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7484 plaintext, 7485 tdata->plaintext.data, 7486 tdata->plaintext.len_bits >> 3, 7487 "Plaintext data not as expected"); 7488 } else { 7489 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7490 ciphertext, 7491 tdata->ciphertext.data, 7492 tdata->validDataLen.len_bits, 7493 "Ciphertext data not as expected"); 7494 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7495 digest, 7496 tdata->digest_enc.data, 7497 tdata->digest_enc.len, 7498 "Generated auth tag not as expected"); 7499 } 7500 7501 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7502 "crypto op processing failed"); 7503 7504 return 0; 7505 } 7506 7507 /** AUTH AES CMAC + CIPHER AES CTR */ 7508 7509 static int 7510 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7511 { 7512 return test_mixed_auth_cipher( 7513 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7514 } 7515 7516 static int 7517 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7518 { 7519 return test_mixed_auth_cipher( 7520 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7521 } 7522 7523 static int 7524 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7525 { 7526 return test_mixed_auth_cipher_sgl( 7527 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7528 } 7529 7530 static int 7531 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7532 { 7533 return test_mixed_auth_cipher_sgl( 7534 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7535 } 7536 7537 static int 7538 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7539 { 7540 return test_mixed_auth_cipher( 7541 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7542 } 7543 7544 static int 7545 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7546 { 7547 return test_mixed_auth_cipher( 7548 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7549 } 7550 7551 static int 7552 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7553 { 7554 return test_mixed_auth_cipher_sgl( 7555 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7556 } 7557 7558 static int 7559 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7560 { 7561 return test_mixed_auth_cipher_sgl( 7562 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7563 } 7564 7565 /** MIXED AUTH + CIPHER */ 7566 7567 static int 7568 test_auth_zuc_cipher_snow_test_case_1(void) 7569 { 7570 return test_mixed_auth_cipher( 7571 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7572 } 7573 7574 static int 7575 test_verify_auth_zuc_cipher_snow_test_case_1(void) 7576 { 7577 return test_mixed_auth_cipher( 7578 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7579 } 7580 7581 static int 7582 test_auth_aes_cmac_cipher_snow_test_case_1(void) 7583 { 7584 return test_mixed_auth_cipher( 7585 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7586 } 7587 7588 static int 7589 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 7590 { 7591 return test_mixed_auth_cipher( 7592 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7593 } 7594 7595 static int 7596 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 7597 { 7598 return test_mixed_auth_cipher( 7599 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7600 } 7601 7602 static int 7603 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 7604 { 7605 return test_mixed_auth_cipher( 7606 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7607 } 7608 7609 static int 7610 test_auth_snow_cipher_aes_ctr_test_case_1(void) 7611 { 7612 return test_mixed_auth_cipher( 7613 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7614 } 7615 7616 static int 7617 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 7618 { 7619 return test_mixed_auth_cipher( 7620 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7621 } 7622 7623 static int 7624 test_auth_snow_cipher_zuc_test_case_1(void) 7625 { 7626 return test_mixed_auth_cipher( 7627 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7628 } 7629 7630 static int 7631 test_verify_auth_snow_cipher_zuc_test_case_1(void) 7632 { 7633 return test_mixed_auth_cipher( 7634 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7635 } 7636 7637 static int 7638 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 7639 { 7640 return test_mixed_auth_cipher( 7641 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7642 } 7643 7644 static int 7645 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 7646 { 7647 return test_mixed_auth_cipher( 7648 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7649 } 7650 7651 static int 7652 test_auth_null_cipher_snow_test_case_1(void) 7653 { 7654 return test_mixed_auth_cipher( 7655 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7656 } 7657 7658 static int 7659 test_verify_auth_null_cipher_snow_test_case_1(void) 7660 { 7661 return test_mixed_auth_cipher( 7662 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7663 } 7664 7665 static int 7666 test_auth_null_cipher_zuc_test_case_1(void) 7667 { 7668 return test_mixed_auth_cipher( 7669 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7670 } 7671 7672 static int 7673 test_verify_auth_null_cipher_zuc_test_case_1(void) 7674 { 7675 return test_mixed_auth_cipher( 7676 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7677 } 7678 7679 static int 7680 test_auth_snow_cipher_null_test_case_1(void) 7681 { 7682 return test_mixed_auth_cipher( 7683 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7684 } 7685 7686 static int 7687 test_verify_auth_snow_cipher_null_test_case_1(void) 7688 { 7689 return test_mixed_auth_cipher( 7690 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7691 } 7692 7693 static int 7694 test_auth_zuc_cipher_null_test_case_1(void) 7695 { 7696 return test_mixed_auth_cipher( 7697 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7698 } 7699 7700 static int 7701 test_verify_auth_zuc_cipher_null_test_case_1(void) 7702 { 7703 return test_mixed_auth_cipher( 7704 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7705 } 7706 7707 static int 7708 test_auth_null_cipher_aes_ctr_test_case_1(void) 7709 { 7710 return test_mixed_auth_cipher( 7711 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7712 } 7713 7714 static int 7715 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 7716 { 7717 return test_mixed_auth_cipher( 7718 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7719 } 7720 7721 static int 7722 test_auth_aes_cmac_cipher_null_test_case_1(void) 7723 { 7724 return test_mixed_auth_cipher( 7725 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7726 } 7727 7728 static int 7729 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 7730 { 7731 return test_mixed_auth_cipher( 7732 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7733 } 7734 7735 /* ***** AEAD algorithm Tests ***** */ 7736 7737 static int 7738 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 7739 enum rte_crypto_aead_operation op, 7740 const uint8_t *key, const uint8_t key_len, 7741 const uint16_t aad_len, const uint8_t auth_len, 7742 uint8_t iv_len) 7743 { 7744 uint8_t aead_key[key_len]; 7745 7746 struct crypto_testsuite_params *ts_params = &testsuite_params; 7747 struct crypto_unittest_params *ut_params = &unittest_params; 7748 7749 memcpy(aead_key, key, key_len); 7750 7751 /* Setup AEAD Parameters */ 7752 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7753 ut_params->aead_xform.next = NULL; 7754 ut_params->aead_xform.aead.algo = algo; 7755 ut_params->aead_xform.aead.op = op; 7756 ut_params->aead_xform.aead.key.data = aead_key; 7757 ut_params->aead_xform.aead.key.length = key_len; 7758 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 7759 ut_params->aead_xform.aead.iv.length = iv_len; 7760 ut_params->aead_xform.aead.digest_length = auth_len; 7761 ut_params->aead_xform.aead.aad_length = aad_len; 7762 7763 debug_hexdump(stdout, "key:", key, key_len); 7764 7765 /* Create Crypto session*/ 7766 ut_params->sess = rte_cryptodev_sym_session_create( 7767 ts_params->session_mpool); 7768 7769 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 7770 &ut_params->aead_xform, 7771 ts_params->session_priv_mpool); 7772 7773 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 7774 7775 return 0; 7776 } 7777 7778 static int 7779 create_aead_xform(struct rte_crypto_op *op, 7780 enum rte_crypto_aead_algorithm algo, 7781 enum rte_crypto_aead_operation aead_op, 7782 uint8_t *key, const uint8_t key_len, 7783 const uint8_t aad_len, const uint8_t auth_len, 7784 uint8_t iv_len) 7785 { 7786 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 7787 "failed to allocate space for crypto transform"); 7788 7789 struct rte_crypto_sym_op *sym_op = op->sym; 7790 7791 /* Setup AEAD Parameters */ 7792 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 7793 sym_op->xform->next = NULL; 7794 sym_op->xform->aead.algo = algo; 7795 sym_op->xform->aead.op = aead_op; 7796 sym_op->xform->aead.key.data = key; 7797 sym_op->xform->aead.key.length = key_len; 7798 sym_op->xform->aead.iv.offset = IV_OFFSET; 7799 sym_op->xform->aead.iv.length = iv_len; 7800 sym_op->xform->aead.digest_length = auth_len; 7801 sym_op->xform->aead.aad_length = aad_len; 7802 7803 debug_hexdump(stdout, "key:", key, key_len); 7804 7805 return 0; 7806 } 7807 7808 static int 7809 create_aead_operation(enum rte_crypto_aead_operation op, 7810 const struct aead_test_data *tdata) 7811 { 7812 struct crypto_testsuite_params *ts_params = &testsuite_params; 7813 struct crypto_unittest_params *ut_params = &unittest_params; 7814 7815 uint8_t *plaintext, *ciphertext; 7816 unsigned int aad_pad_len, plaintext_pad_len; 7817 7818 /* Generate Crypto op data structure */ 7819 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7820 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7821 TEST_ASSERT_NOT_NULL(ut_params->op, 7822 "Failed to allocate symmetric crypto operation struct"); 7823 7824 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 7825 7826 /* Append aad data */ 7827 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 7828 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 7829 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7830 aad_pad_len); 7831 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7832 "no room to append aad"); 7833 7834 sym_op->aead.aad.phys_addr = 7835 rte_pktmbuf_iova(ut_params->ibuf); 7836 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 7837 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 7838 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7839 tdata->aad.len); 7840 7841 /* Append IV at the end of the crypto operation*/ 7842 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7843 uint8_t *, IV_OFFSET); 7844 7845 /* Copy IV 1 byte after the IV pointer, according to the API */ 7846 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 7847 debug_hexdump(stdout, "iv:", iv_ptr, 7848 tdata->iv.len); 7849 } else { 7850 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 7851 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7852 aad_pad_len); 7853 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7854 "no room to append aad"); 7855 7856 sym_op->aead.aad.phys_addr = 7857 rte_pktmbuf_iova(ut_params->ibuf); 7858 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 7859 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7860 tdata->aad.len); 7861 7862 /* Append IV at the end of the crypto operation*/ 7863 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7864 uint8_t *, IV_OFFSET); 7865 7866 if (tdata->iv.len == 0) { 7867 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 7868 debug_hexdump(stdout, "iv:", iv_ptr, 7869 AES_GCM_J0_LENGTH); 7870 } else { 7871 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 7872 debug_hexdump(stdout, "iv:", iv_ptr, 7873 tdata->iv.len); 7874 } 7875 } 7876 7877 /* Append plaintext/ciphertext */ 7878 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7879 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7880 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7881 plaintext_pad_len); 7882 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 7883 7884 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 7885 debug_hexdump(stdout, "plaintext:", plaintext, 7886 tdata->plaintext.len); 7887 7888 if (ut_params->obuf) { 7889 ciphertext = (uint8_t *)rte_pktmbuf_append( 7890 ut_params->obuf, 7891 plaintext_pad_len + aad_pad_len); 7892 TEST_ASSERT_NOT_NULL(ciphertext, 7893 "no room to append ciphertext"); 7894 7895 memset(ciphertext + aad_pad_len, 0, 7896 tdata->ciphertext.len); 7897 } 7898 } else { 7899 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 7900 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7901 plaintext_pad_len); 7902 TEST_ASSERT_NOT_NULL(ciphertext, 7903 "no room to append ciphertext"); 7904 7905 memcpy(ciphertext, tdata->ciphertext.data, 7906 tdata->ciphertext.len); 7907 debug_hexdump(stdout, "ciphertext:", ciphertext, 7908 tdata->ciphertext.len); 7909 7910 if (ut_params->obuf) { 7911 plaintext = (uint8_t *)rte_pktmbuf_append( 7912 ut_params->obuf, 7913 plaintext_pad_len + aad_pad_len); 7914 TEST_ASSERT_NOT_NULL(plaintext, 7915 "no room to append plaintext"); 7916 7917 memset(plaintext + aad_pad_len, 0, 7918 tdata->plaintext.len); 7919 } 7920 } 7921 7922 /* Append digest data */ 7923 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7924 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7925 ut_params->obuf ? ut_params->obuf : 7926 ut_params->ibuf, 7927 tdata->auth_tag.len); 7928 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7929 "no room to append digest"); 7930 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 7931 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7932 ut_params->obuf ? ut_params->obuf : 7933 ut_params->ibuf, 7934 plaintext_pad_len + 7935 aad_pad_len); 7936 } else { 7937 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7938 ut_params->ibuf, tdata->auth_tag.len); 7939 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7940 "no room to append digest"); 7941 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7942 ut_params->ibuf, 7943 plaintext_pad_len + aad_pad_len); 7944 7945 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 7946 tdata->auth_tag.len); 7947 debug_hexdump(stdout, "digest:", 7948 sym_op->aead.digest.data, 7949 tdata->auth_tag.len); 7950 } 7951 7952 sym_op->aead.data.length = tdata->plaintext.len; 7953 sym_op->aead.data.offset = aad_pad_len; 7954 7955 return 0; 7956 } 7957 7958 static int 7959 test_authenticated_encryption(const struct aead_test_data *tdata) 7960 { 7961 struct crypto_testsuite_params *ts_params = &testsuite_params; 7962 struct crypto_unittest_params *ut_params = &unittest_params; 7963 7964 int retval; 7965 uint8_t *ciphertext, *auth_tag; 7966 uint16_t plaintext_pad_len; 7967 uint32_t i; 7968 struct rte_cryptodev_info dev_info; 7969 7970 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7971 uint64_t feat_flags = dev_info.feature_flags; 7972 7973 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 7974 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 7975 printf("Device doesn't support RAW data-path APIs.\n"); 7976 return TEST_SKIPPED; 7977 } 7978 7979 /* Verify the capabilities */ 7980 struct rte_cryptodev_sym_capability_idx cap_idx; 7981 const struct rte_cryptodev_symmetric_capability *capability; 7982 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7983 cap_idx.algo.aead = tdata->algo; 7984 capability = rte_cryptodev_sym_capability_get( 7985 ts_params->valid_devs[0], &cap_idx); 7986 if (capability == NULL) 7987 return TEST_SKIPPED; 7988 if (rte_cryptodev_sym_capability_check_aead( 7989 capability, tdata->key.len, tdata->auth_tag.len, 7990 tdata->aad.len, tdata->iv.len)) 7991 return TEST_SKIPPED; 7992 7993 /* Create AEAD session */ 7994 retval = create_aead_session(ts_params->valid_devs[0], 7995 tdata->algo, 7996 RTE_CRYPTO_AEAD_OP_ENCRYPT, 7997 tdata->key.data, tdata->key.len, 7998 tdata->aad.len, tdata->auth_tag.len, 7999 tdata->iv.len); 8000 if (retval < 0) 8001 return retval; 8002 8003 if (tdata->aad.len > MBUF_SIZE) { 8004 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 8005 /* Populate full size of add data */ 8006 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 8007 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 8008 } else 8009 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8010 8011 /* clear mbuf payload */ 8012 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8013 rte_pktmbuf_tailroom(ut_params->ibuf)); 8014 8015 /* Create AEAD operation */ 8016 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8017 if (retval < 0) 8018 return retval; 8019 8020 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8021 8022 ut_params->op->sym->m_src = ut_params->ibuf; 8023 8024 /* Process crypto operation */ 8025 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8026 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 8027 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 8028 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8029 ut_params->op, 0, 0, 0, 0); 8030 else 8031 TEST_ASSERT_NOT_NULL( 8032 process_crypto_request(ts_params->valid_devs[0], 8033 ut_params->op), "failed to process sym crypto op"); 8034 8035 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8036 "crypto op processing failed"); 8037 8038 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8039 8040 if (ut_params->op->sym->m_dst) { 8041 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8042 uint8_t *); 8043 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8044 uint8_t *, plaintext_pad_len); 8045 } else { 8046 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8047 uint8_t *, 8048 ut_params->op->sym->cipher.data.offset); 8049 auth_tag = ciphertext + plaintext_pad_len; 8050 } 8051 8052 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8053 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8054 8055 /* Validate obuf */ 8056 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8057 ciphertext, 8058 tdata->ciphertext.data, 8059 tdata->ciphertext.len, 8060 "Ciphertext data not as expected"); 8061 8062 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8063 auth_tag, 8064 tdata->auth_tag.data, 8065 tdata->auth_tag.len, 8066 "Generated auth tag not as expected"); 8067 8068 return 0; 8069 8070 } 8071 8072 #ifdef RTE_LIB_SECURITY 8073 static int 8074 security_proto_supported(enum rte_security_session_action_type action, 8075 enum rte_security_session_protocol proto) 8076 { 8077 struct crypto_testsuite_params *ts_params = &testsuite_params; 8078 8079 const struct rte_security_capability *capabilities; 8080 const struct rte_security_capability *capability; 8081 uint16_t i = 0; 8082 8083 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8084 rte_cryptodev_get_sec_ctx( 8085 ts_params->valid_devs[0]); 8086 8087 8088 capabilities = rte_security_capabilities_get(ctx); 8089 8090 if (capabilities == NULL) 8091 return -ENOTSUP; 8092 8093 while ((capability = &capabilities[i++])->action != 8094 RTE_SECURITY_ACTION_TYPE_NONE) { 8095 if (capability->action == action && 8096 capability->protocol == proto) 8097 return 0; 8098 } 8099 8100 return -ENOTSUP; 8101 } 8102 8103 /* Basic algorithm run function for async inplace mode. 8104 * Creates a session from input parameters and runs one operation 8105 * on input_vec. Checks the output of the crypto operation against 8106 * output_vec. 8107 */ 8108 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 8109 enum rte_crypto_auth_operation opa, 8110 const uint8_t *input_vec, unsigned int input_vec_len, 8111 const uint8_t *output_vec, 8112 unsigned int output_vec_len, 8113 enum rte_crypto_cipher_algorithm cipher_alg, 8114 const uint8_t *cipher_key, uint32_t cipher_key_len, 8115 enum rte_crypto_auth_algorithm auth_alg, 8116 const uint8_t *auth_key, uint32_t auth_key_len, 8117 uint8_t bearer, enum rte_security_pdcp_domain domain, 8118 uint8_t packet_direction, uint8_t sn_size, 8119 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 8120 { 8121 struct crypto_testsuite_params *ts_params = &testsuite_params; 8122 struct crypto_unittest_params *ut_params = &unittest_params; 8123 uint8_t *plaintext; 8124 int ret = TEST_SUCCESS; 8125 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8126 rte_cryptodev_get_sec_ctx( 8127 ts_params->valid_devs[0]); 8128 8129 /* Verify the capabilities */ 8130 struct rte_security_capability_idx sec_cap_idx; 8131 8132 sec_cap_idx.action = ut_params->type; 8133 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8134 sec_cap_idx.pdcp.domain = domain; 8135 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8136 return TEST_SKIPPED; 8137 8138 /* Generate test mbuf data */ 8139 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8140 8141 /* clear mbuf payload */ 8142 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8143 rte_pktmbuf_tailroom(ut_params->ibuf)); 8144 8145 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8146 input_vec_len); 8147 memcpy(plaintext, input_vec, input_vec_len); 8148 8149 /* Out of place support */ 8150 if (oop) { 8151 /* 8152 * For out-op-place we need to alloc another mbuf 8153 */ 8154 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8155 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 8156 } 8157 8158 /* Setup Cipher Parameters */ 8159 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8160 ut_params->cipher_xform.cipher.algo = cipher_alg; 8161 ut_params->cipher_xform.cipher.op = opc; 8162 ut_params->cipher_xform.cipher.key.data = cipher_key; 8163 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 8164 ut_params->cipher_xform.cipher.iv.length = 8165 packet_direction ? 4 : 0; 8166 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8167 8168 /* Setup HMAC Parameters if ICV header is required */ 8169 if (auth_alg != 0) { 8170 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8171 ut_params->auth_xform.next = NULL; 8172 ut_params->auth_xform.auth.algo = auth_alg; 8173 ut_params->auth_xform.auth.op = opa; 8174 ut_params->auth_xform.auth.key.data = auth_key; 8175 ut_params->auth_xform.auth.key.length = auth_key_len; 8176 8177 ut_params->cipher_xform.next = &ut_params->auth_xform; 8178 } else { 8179 ut_params->cipher_xform.next = NULL; 8180 } 8181 8182 struct rte_security_session_conf sess_conf = { 8183 .action_type = ut_params->type, 8184 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8185 {.pdcp = { 8186 .bearer = bearer, 8187 .domain = domain, 8188 .pkt_dir = packet_direction, 8189 .sn_size = sn_size, 8190 .hfn = packet_direction ? 0 : hfn, 8191 /** 8192 * hfn can be set as pdcp_test_hfn[i] 8193 * if hfn_ovrd is not set. Here, PDCP 8194 * packet direction is just used to 8195 * run half of the cases with session 8196 * HFN and other half with per packet 8197 * HFN. 8198 */ 8199 .hfn_threshold = hfn_threshold, 8200 .hfn_ovrd = packet_direction ? 1 : 0, 8201 .sdap_enabled = sdap, 8202 } }, 8203 .crypto_xform = &ut_params->cipher_xform 8204 }; 8205 8206 /* Create security session */ 8207 ut_params->sec_session = rte_security_session_create(ctx, 8208 &sess_conf, ts_params->session_mpool, 8209 ts_params->session_priv_mpool); 8210 8211 if (!ut_params->sec_session) { 8212 printf("TestCase %s()-%d line %d failed %s: ", 8213 __func__, i, __LINE__, "Failed to allocate session"); 8214 ret = TEST_FAILED; 8215 goto on_err; 8216 } 8217 8218 /* Generate crypto op data structure */ 8219 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8220 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8221 if (!ut_params->op) { 8222 printf("TestCase %s()-%d line %d failed %s: ", 8223 __func__, i, __LINE__, 8224 "Failed to allocate symmetric crypto operation struct"); 8225 ret = TEST_FAILED; 8226 goto on_err; 8227 } 8228 8229 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 8230 uint32_t *, IV_OFFSET); 8231 *per_pkt_hfn = packet_direction ? hfn : 0; 8232 8233 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8234 8235 /* set crypto operation source mbuf */ 8236 ut_params->op->sym->m_src = ut_params->ibuf; 8237 if (oop) 8238 ut_params->op->sym->m_dst = ut_params->obuf; 8239 8240 /* Process crypto operation */ 8241 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8242 == NULL) { 8243 printf("TestCase %s()-%d line %d failed %s: ", 8244 __func__, i, __LINE__, 8245 "failed to process sym crypto op"); 8246 ret = TEST_FAILED; 8247 goto on_err; 8248 } 8249 8250 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8251 printf("TestCase %s()-%d line %d failed %s: ", 8252 __func__, i, __LINE__, "crypto op processing failed"); 8253 ret = TEST_FAILED; 8254 goto on_err; 8255 } 8256 8257 /* Validate obuf */ 8258 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8259 uint8_t *); 8260 if (oop) { 8261 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8262 uint8_t *); 8263 } 8264 8265 if (memcmp(ciphertext, output_vec, output_vec_len)) { 8266 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8267 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 8268 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 8269 ret = TEST_FAILED; 8270 goto on_err; 8271 } 8272 8273 on_err: 8274 rte_crypto_op_free(ut_params->op); 8275 ut_params->op = NULL; 8276 8277 if (ut_params->sec_session) 8278 rte_security_session_destroy(ctx, ut_params->sec_session); 8279 ut_params->sec_session = NULL; 8280 8281 rte_pktmbuf_free(ut_params->ibuf); 8282 ut_params->ibuf = NULL; 8283 if (oop) { 8284 rte_pktmbuf_free(ut_params->obuf); 8285 ut_params->obuf = NULL; 8286 } 8287 8288 return ret; 8289 } 8290 8291 static int 8292 test_pdcp_proto_SGL(int i, int oop, 8293 enum rte_crypto_cipher_operation opc, 8294 enum rte_crypto_auth_operation opa, 8295 uint8_t *input_vec, 8296 unsigned int input_vec_len, 8297 uint8_t *output_vec, 8298 unsigned int output_vec_len, 8299 uint32_t fragsz, 8300 uint32_t fragsz_oop) 8301 { 8302 struct crypto_testsuite_params *ts_params = &testsuite_params; 8303 struct crypto_unittest_params *ut_params = &unittest_params; 8304 uint8_t *plaintext; 8305 struct rte_mbuf *buf, *buf_oop = NULL; 8306 int ret = TEST_SUCCESS; 8307 int to_trn = 0; 8308 int to_trn_tbl[16]; 8309 int segs = 1; 8310 unsigned int trn_data = 0; 8311 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8312 rte_cryptodev_get_sec_ctx( 8313 ts_params->valid_devs[0]); 8314 8315 /* Verify the capabilities */ 8316 struct rte_security_capability_idx sec_cap_idx; 8317 8318 sec_cap_idx.action = ut_params->type; 8319 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8320 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 8321 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8322 return TEST_SKIPPED; 8323 8324 if (fragsz > input_vec_len) 8325 fragsz = input_vec_len; 8326 8327 uint16_t plaintext_len = fragsz; 8328 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 8329 8330 if (fragsz_oop > output_vec_len) 8331 frag_size_oop = output_vec_len; 8332 8333 int ecx = 0; 8334 if (input_vec_len % fragsz != 0) { 8335 if (input_vec_len / fragsz + 1 > 16) 8336 return 1; 8337 } else if (input_vec_len / fragsz > 16) 8338 return 1; 8339 8340 /* Out of place support */ 8341 if (oop) { 8342 /* 8343 * For out-op-place we need to alloc another mbuf 8344 */ 8345 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8346 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 8347 buf_oop = ut_params->obuf; 8348 } 8349 8350 /* Generate test mbuf data */ 8351 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8352 8353 /* clear mbuf payload */ 8354 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8355 rte_pktmbuf_tailroom(ut_params->ibuf)); 8356 8357 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8358 plaintext_len); 8359 memcpy(plaintext, input_vec, plaintext_len); 8360 trn_data += plaintext_len; 8361 8362 buf = ut_params->ibuf; 8363 8364 /* 8365 * Loop until no more fragments 8366 */ 8367 8368 while (trn_data < input_vec_len) { 8369 ++segs; 8370 to_trn = (input_vec_len - trn_data < fragsz) ? 8371 (input_vec_len - trn_data) : fragsz; 8372 8373 to_trn_tbl[ecx++] = to_trn; 8374 8375 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8376 buf = buf->next; 8377 8378 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 8379 rte_pktmbuf_tailroom(buf)); 8380 8381 /* OOP */ 8382 if (oop && !fragsz_oop) { 8383 buf_oop->next = 8384 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8385 buf_oop = buf_oop->next; 8386 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8387 0, rte_pktmbuf_tailroom(buf_oop)); 8388 rte_pktmbuf_append(buf_oop, to_trn); 8389 } 8390 8391 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 8392 to_trn); 8393 8394 memcpy(plaintext, input_vec + trn_data, to_trn); 8395 trn_data += to_trn; 8396 } 8397 8398 ut_params->ibuf->nb_segs = segs; 8399 8400 segs = 1; 8401 if (fragsz_oop && oop) { 8402 to_trn = 0; 8403 ecx = 0; 8404 8405 trn_data = frag_size_oop; 8406 while (trn_data < output_vec_len) { 8407 ++segs; 8408 to_trn = 8409 (output_vec_len - trn_data < 8410 frag_size_oop) ? 8411 (output_vec_len - trn_data) : 8412 frag_size_oop; 8413 8414 to_trn_tbl[ecx++] = to_trn; 8415 8416 buf_oop->next = 8417 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8418 buf_oop = buf_oop->next; 8419 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8420 0, rte_pktmbuf_tailroom(buf_oop)); 8421 rte_pktmbuf_append(buf_oop, to_trn); 8422 8423 trn_data += to_trn; 8424 } 8425 ut_params->obuf->nb_segs = segs; 8426 } 8427 8428 /* Setup Cipher Parameters */ 8429 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8430 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 8431 ut_params->cipher_xform.cipher.op = opc; 8432 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 8433 ut_params->cipher_xform.cipher.key.length = 8434 pdcp_test_params[i].cipher_key_len; 8435 ut_params->cipher_xform.cipher.iv.length = 0; 8436 8437 /* Setup HMAC Parameters if ICV header is required */ 8438 if (pdcp_test_params[i].auth_alg != 0) { 8439 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8440 ut_params->auth_xform.next = NULL; 8441 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 8442 ut_params->auth_xform.auth.op = opa; 8443 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 8444 ut_params->auth_xform.auth.key.length = 8445 pdcp_test_params[i].auth_key_len; 8446 8447 ut_params->cipher_xform.next = &ut_params->auth_xform; 8448 } else { 8449 ut_params->cipher_xform.next = NULL; 8450 } 8451 8452 struct rte_security_session_conf sess_conf = { 8453 .action_type = ut_params->type, 8454 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8455 {.pdcp = { 8456 .bearer = pdcp_test_bearer[i], 8457 .domain = pdcp_test_params[i].domain, 8458 .pkt_dir = pdcp_test_packet_direction[i], 8459 .sn_size = pdcp_test_data_sn_size[i], 8460 .hfn = pdcp_test_hfn[i], 8461 .hfn_threshold = pdcp_test_hfn_threshold[i], 8462 .hfn_ovrd = 0, 8463 } }, 8464 .crypto_xform = &ut_params->cipher_xform 8465 }; 8466 8467 /* Create security session */ 8468 ut_params->sec_session = rte_security_session_create(ctx, 8469 &sess_conf, ts_params->session_mpool, 8470 ts_params->session_priv_mpool); 8471 8472 if (!ut_params->sec_session) { 8473 printf("TestCase %s()-%d line %d failed %s: ", 8474 __func__, i, __LINE__, "Failed to allocate session"); 8475 ret = TEST_FAILED; 8476 goto on_err; 8477 } 8478 8479 /* Generate crypto op data structure */ 8480 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8481 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8482 if (!ut_params->op) { 8483 printf("TestCase %s()-%d line %d failed %s: ", 8484 __func__, i, __LINE__, 8485 "Failed to allocate symmetric crypto operation struct"); 8486 ret = TEST_FAILED; 8487 goto on_err; 8488 } 8489 8490 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8491 8492 /* set crypto operation source mbuf */ 8493 ut_params->op->sym->m_src = ut_params->ibuf; 8494 if (oop) 8495 ut_params->op->sym->m_dst = ut_params->obuf; 8496 8497 /* Process crypto operation */ 8498 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8499 == NULL) { 8500 printf("TestCase %s()-%d line %d failed %s: ", 8501 __func__, i, __LINE__, 8502 "failed to process sym crypto op"); 8503 ret = TEST_FAILED; 8504 goto on_err; 8505 } 8506 8507 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8508 printf("TestCase %s()-%d line %d failed %s: ", 8509 __func__, i, __LINE__, "crypto op processing failed"); 8510 ret = TEST_FAILED; 8511 goto on_err; 8512 } 8513 8514 /* Validate obuf */ 8515 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8516 uint8_t *); 8517 if (oop) { 8518 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8519 uint8_t *); 8520 } 8521 if (fragsz_oop) 8522 fragsz = frag_size_oop; 8523 if (memcmp(ciphertext, output_vec, fragsz)) { 8524 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8525 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 8526 rte_hexdump(stdout, "reference", output_vec, fragsz); 8527 ret = TEST_FAILED; 8528 goto on_err; 8529 } 8530 8531 buf = ut_params->op->sym->m_src->next; 8532 if (oop) 8533 buf = ut_params->op->sym->m_dst->next; 8534 8535 unsigned int off = fragsz; 8536 8537 ecx = 0; 8538 while (buf) { 8539 ciphertext = rte_pktmbuf_mtod(buf, 8540 uint8_t *); 8541 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 8542 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8543 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 8544 rte_hexdump(stdout, "reference", output_vec + off, 8545 to_trn_tbl[ecx]); 8546 ret = TEST_FAILED; 8547 goto on_err; 8548 } 8549 off += to_trn_tbl[ecx++]; 8550 buf = buf->next; 8551 } 8552 on_err: 8553 rte_crypto_op_free(ut_params->op); 8554 ut_params->op = NULL; 8555 8556 if (ut_params->sec_session) 8557 rte_security_session_destroy(ctx, ut_params->sec_session); 8558 ut_params->sec_session = NULL; 8559 8560 rte_pktmbuf_free(ut_params->ibuf); 8561 ut_params->ibuf = NULL; 8562 if (oop) { 8563 rte_pktmbuf_free(ut_params->obuf); 8564 ut_params->obuf = NULL; 8565 } 8566 8567 return ret; 8568 } 8569 8570 int 8571 test_pdcp_proto_cplane_encap(int i) 8572 { 8573 return test_pdcp_proto( 8574 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8575 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8576 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8577 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8578 pdcp_test_params[i].cipher_key_len, 8579 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8580 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8581 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8582 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8583 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8584 } 8585 8586 int 8587 test_pdcp_proto_uplane_encap(int i) 8588 { 8589 return test_pdcp_proto( 8590 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8591 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8592 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8593 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8594 pdcp_test_params[i].cipher_key_len, 8595 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8596 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8597 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8598 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8599 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8600 } 8601 8602 int 8603 test_pdcp_proto_uplane_encap_with_int(int i) 8604 { 8605 return test_pdcp_proto( 8606 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8607 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8608 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8609 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8610 pdcp_test_params[i].cipher_key_len, 8611 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8612 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8613 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8614 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8615 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8616 } 8617 8618 int 8619 test_pdcp_proto_cplane_decap(int i) 8620 { 8621 return test_pdcp_proto( 8622 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8623 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8624 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8625 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8626 pdcp_test_params[i].cipher_key_len, 8627 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8628 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8629 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8630 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8631 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8632 } 8633 8634 int 8635 test_pdcp_proto_uplane_decap(int i) 8636 { 8637 return test_pdcp_proto( 8638 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8639 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8640 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8641 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8642 pdcp_test_params[i].cipher_key_len, 8643 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8644 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8645 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8646 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8647 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8648 } 8649 8650 int 8651 test_pdcp_proto_uplane_decap_with_int(int i) 8652 { 8653 return test_pdcp_proto( 8654 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8655 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8656 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8657 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8658 pdcp_test_params[i].cipher_key_len, 8659 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8660 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8661 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8662 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8663 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8664 } 8665 8666 static int 8667 test_PDCP_PROTO_SGL_in_place_32B(void) 8668 { 8669 /* i can be used for running any PDCP case 8670 * In this case it is uplane 12-bit AES-SNOW DL encap 8671 */ 8672 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 8673 return test_pdcp_proto_SGL(i, IN_PLACE, 8674 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8675 RTE_CRYPTO_AUTH_OP_GENERATE, 8676 pdcp_test_data_in[i], 8677 pdcp_test_data_in_len[i], 8678 pdcp_test_data_out[i], 8679 pdcp_test_data_in_len[i]+4, 8680 32, 0); 8681 } 8682 static int 8683 test_PDCP_PROTO_SGL_oop_32B_128B(void) 8684 { 8685 /* i can be used for running any PDCP case 8686 * In this case it is uplane 18-bit NULL-NULL DL encap 8687 */ 8688 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 8689 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8690 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8691 RTE_CRYPTO_AUTH_OP_GENERATE, 8692 pdcp_test_data_in[i], 8693 pdcp_test_data_in_len[i], 8694 pdcp_test_data_out[i], 8695 pdcp_test_data_in_len[i]+4, 8696 32, 128); 8697 } 8698 static int 8699 test_PDCP_PROTO_SGL_oop_32B_40B(void) 8700 { 8701 /* i can be used for running any PDCP case 8702 * In this case it is uplane 18-bit AES DL encap 8703 */ 8704 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 8705 + DOWNLINK; 8706 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8707 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8708 RTE_CRYPTO_AUTH_OP_GENERATE, 8709 pdcp_test_data_in[i], 8710 pdcp_test_data_in_len[i], 8711 pdcp_test_data_out[i], 8712 pdcp_test_data_in_len[i], 8713 32, 40); 8714 } 8715 static int 8716 test_PDCP_PROTO_SGL_oop_128B_32B(void) 8717 { 8718 /* i can be used for running any PDCP case 8719 * In this case it is cplane 12-bit AES-ZUC DL encap 8720 */ 8721 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 8722 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8723 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8724 RTE_CRYPTO_AUTH_OP_GENERATE, 8725 pdcp_test_data_in[i], 8726 pdcp_test_data_in_len[i], 8727 pdcp_test_data_out[i], 8728 pdcp_test_data_in_len[i]+4, 8729 128, 32); 8730 } 8731 8732 static int 8733 test_PDCP_SDAP_PROTO_encap_all(void) 8734 { 8735 int i = 0, size = 0; 8736 int err, all_err = TEST_SUCCESS; 8737 const struct pdcp_sdap_test *cur_test; 8738 8739 size = ARRAY_SIZE(list_pdcp_sdap_tests); 8740 8741 for (i = 0; i < size; i++) { 8742 cur_test = &list_pdcp_sdap_tests[i]; 8743 err = test_pdcp_proto( 8744 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8745 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8746 cur_test->in_len, cur_test->data_out, 8747 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8748 cur_test->param.cipher_alg, cur_test->cipher_key, 8749 cur_test->param.cipher_key_len, 8750 cur_test->param.auth_alg, 8751 cur_test->auth_key, cur_test->param.auth_key_len, 8752 cur_test->bearer, cur_test->param.domain, 8753 cur_test->packet_direction, cur_test->sn_size, 8754 cur_test->hfn, 8755 cur_test->hfn_threshold, SDAP_ENABLED); 8756 if (err) { 8757 printf("\t%d) %s: Encapsulation failed\n", 8758 cur_test->test_idx, 8759 cur_test->param.name); 8760 err = TEST_FAILED; 8761 } else { 8762 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 8763 cur_test->param.name); 8764 err = TEST_SUCCESS; 8765 } 8766 all_err += err; 8767 } 8768 8769 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8770 8771 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8772 } 8773 8774 static int 8775 test_PDCP_SDAP_PROTO_decap_all(void) 8776 { 8777 int i = 0, size = 0; 8778 int err, all_err = TEST_SUCCESS; 8779 const struct pdcp_sdap_test *cur_test; 8780 8781 size = ARRAY_SIZE(list_pdcp_sdap_tests); 8782 8783 for (i = 0; i < size; i++) { 8784 cur_test = &list_pdcp_sdap_tests[i]; 8785 err = test_pdcp_proto( 8786 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 8787 RTE_CRYPTO_AUTH_OP_VERIFY, 8788 cur_test->data_out, 8789 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8790 cur_test->data_in, cur_test->in_len, 8791 cur_test->param.cipher_alg, 8792 cur_test->cipher_key, cur_test->param.cipher_key_len, 8793 cur_test->param.auth_alg, cur_test->auth_key, 8794 cur_test->param.auth_key_len, cur_test->bearer, 8795 cur_test->param.domain, cur_test->packet_direction, 8796 cur_test->sn_size, cur_test->hfn, 8797 cur_test->hfn_threshold, SDAP_ENABLED); 8798 if (err) { 8799 printf("\t%d) %s: Decapsulation failed\n", 8800 cur_test->test_idx, 8801 cur_test->param.name); 8802 err = TEST_FAILED; 8803 } else { 8804 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 8805 cur_test->param.name); 8806 err = TEST_SUCCESS; 8807 } 8808 all_err += err; 8809 } 8810 8811 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8812 8813 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8814 } 8815 8816 static int 8817 test_PDCP_PROTO_all(void) 8818 { 8819 struct crypto_testsuite_params *ts_params = &testsuite_params; 8820 struct crypto_unittest_params *ut_params = &unittest_params; 8821 struct rte_cryptodev_info dev_info; 8822 int status; 8823 8824 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8825 uint64_t feat_flags = dev_info.feature_flags; 8826 8827 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 8828 return TEST_SKIPPED; 8829 8830 /* Set action type */ 8831 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 8832 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 8833 gbl_action_type; 8834 8835 if (security_proto_supported(ut_params->type, 8836 RTE_SECURITY_PROTOCOL_PDCP) < 0) 8837 return TEST_SKIPPED; 8838 8839 status = test_PDCP_PROTO_cplane_encap_all(); 8840 status += test_PDCP_PROTO_cplane_decap_all(); 8841 status += test_PDCP_PROTO_uplane_encap_all(); 8842 status += test_PDCP_PROTO_uplane_decap_all(); 8843 status += test_PDCP_PROTO_SGL_in_place_32B(); 8844 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 8845 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 8846 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 8847 status += test_PDCP_SDAP_PROTO_encap_all(); 8848 status += test_PDCP_SDAP_PROTO_decap_all(); 8849 8850 if (status) 8851 return TEST_FAILED; 8852 else 8853 return TEST_SUCCESS; 8854 } 8855 8856 static int 8857 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td) 8858 { 8859 struct crypto_testsuite_params *ts_params = &testsuite_params; 8860 struct crypto_unittest_params *ut_params = &unittest_params; 8861 uint8_t *plaintext, *ciphertext; 8862 uint8_t *iv_ptr; 8863 int32_t cipher_len, crc_len; 8864 uint32_t crc_data_len; 8865 int ret = TEST_SUCCESS; 8866 8867 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8868 rte_cryptodev_get_sec_ctx( 8869 ts_params->valid_devs[0]); 8870 8871 /* Verify the capabilities */ 8872 struct rte_security_capability_idx sec_cap_idx; 8873 const struct rte_security_capability *sec_cap; 8874 const struct rte_cryptodev_capabilities *crypto_cap; 8875 const struct rte_cryptodev_symmetric_capability *sym_cap; 8876 int j = 0; 8877 8878 sec_cap_idx.action = ut_params->type; 8879 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 8880 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 8881 8882 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 8883 if (sec_cap == NULL) 8884 return TEST_SKIPPED; 8885 8886 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 8887 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 8888 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 8889 crypto_cap->sym.xform_type == 8890 RTE_CRYPTO_SYM_XFORM_CIPHER && 8891 crypto_cap->sym.cipher.algo == 8892 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 8893 sym_cap = &crypto_cap->sym; 8894 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 8895 d_td->key.len, 8896 d_td->iv.len) == 0) 8897 break; 8898 } 8899 } 8900 8901 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 8902 return TEST_SKIPPED; 8903 8904 /* Setup source mbuf payload */ 8905 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8906 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8907 rte_pktmbuf_tailroom(ut_params->ibuf)); 8908 8909 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8910 d_td->ciphertext.len); 8911 8912 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 8913 8914 /* Setup cipher session parameters */ 8915 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8916 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 8917 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 8918 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 8919 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 8920 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 8921 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8922 ut_params->cipher_xform.next = NULL; 8923 8924 /* Setup DOCSIS session parameters */ 8925 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 8926 8927 struct rte_security_session_conf sess_conf = { 8928 .action_type = ut_params->type, 8929 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 8930 .docsis = ut_params->docsis_xform, 8931 .crypto_xform = &ut_params->cipher_xform, 8932 }; 8933 8934 /* Create security session */ 8935 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 8936 ts_params->session_mpool, 8937 ts_params->session_priv_mpool); 8938 8939 if (!ut_params->sec_session) { 8940 printf("TestCase %s(%d) line %d: %s\n", 8941 __func__, i, __LINE__, "failed to allocate session"); 8942 ret = TEST_FAILED; 8943 goto on_err; 8944 } 8945 8946 /* Generate crypto op data structure */ 8947 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8948 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8949 if (!ut_params->op) { 8950 printf("TestCase %s(%d) line %d: %s\n", 8951 __func__, i, __LINE__, 8952 "failed to allocate symmetric crypto operation"); 8953 ret = TEST_FAILED; 8954 goto on_err; 8955 } 8956 8957 /* Setup CRC operation parameters */ 8958 crc_len = d_td->ciphertext.no_crc == false ? 8959 (d_td->ciphertext.len - 8960 d_td->ciphertext.crc_offset - 8961 RTE_ETHER_CRC_LEN) : 8962 0; 8963 crc_len = crc_len > 0 ? crc_len : 0; 8964 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 8965 ut_params->op->sym->auth.data.length = crc_len; 8966 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 8967 8968 /* Setup cipher operation parameters */ 8969 cipher_len = d_td->ciphertext.no_cipher == false ? 8970 (d_td->ciphertext.len - 8971 d_td->ciphertext.cipher_offset) : 8972 0; 8973 cipher_len = cipher_len > 0 ? cipher_len : 0; 8974 ut_params->op->sym->cipher.data.length = cipher_len; 8975 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 8976 8977 /* Setup cipher IV */ 8978 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 8979 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 8980 8981 /* Attach session to operation */ 8982 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8983 8984 /* Set crypto operation mbufs */ 8985 ut_params->op->sym->m_src = ut_params->ibuf; 8986 ut_params->op->sym->m_dst = NULL; 8987 8988 /* Process crypto operation */ 8989 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 8990 NULL) { 8991 printf("TestCase %s(%d) line %d: %s\n", 8992 __func__, i, __LINE__, 8993 "failed to process security crypto op"); 8994 ret = TEST_FAILED; 8995 goto on_err; 8996 } 8997 8998 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8999 printf("TestCase %s(%d) line %d: %s\n", 9000 __func__, i, __LINE__, "crypto op processing failed"); 9001 ret = TEST_FAILED; 9002 goto on_err; 9003 } 9004 9005 /* Validate plaintext */ 9006 plaintext = ciphertext; 9007 9008 if (memcmp(plaintext, d_td->plaintext.data, 9009 d_td->plaintext.len - crc_data_len)) { 9010 printf("TestCase %s(%d) line %d: %s\n", 9011 __func__, i, __LINE__, "plaintext not as expected\n"); 9012 rte_hexdump(stdout, "expected", d_td->plaintext.data, 9013 d_td->plaintext.len); 9014 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 9015 ret = TEST_FAILED; 9016 goto on_err; 9017 } 9018 9019 on_err: 9020 rte_crypto_op_free(ut_params->op); 9021 ut_params->op = NULL; 9022 9023 if (ut_params->sec_session) 9024 rte_security_session_destroy(ctx, ut_params->sec_session); 9025 ut_params->sec_session = NULL; 9026 9027 rte_pktmbuf_free(ut_params->ibuf); 9028 ut_params->ibuf = NULL; 9029 9030 return ret; 9031 } 9032 9033 static int 9034 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td) 9035 { 9036 struct crypto_testsuite_params *ts_params = &testsuite_params; 9037 struct crypto_unittest_params *ut_params = &unittest_params; 9038 uint8_t *plaintext, *ciphertext; 9039 uint8_t *iv_ptr; 9040 int32_t cipher_len, crc_len; 9041 int ret = TEST_SUCCESS; 9042 9043 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9044 rte_cryptodev_get_sec_ctx( 9045 ts_params->valid_devs[0]); 9046 9047 /* Verify the capabilities */ 9048 struct rte_security_capability_idx sec_cap_idx; 9049 const struct rte_security_capability *sec_cap; 9050 const struct rte_cryptodev_capabilities *crypto_cap; 9051 const struct rte_cryptodev_symmetric_capability *sym_cap; 9052 int j = 0; 9053 9054 sec_cap_idx.action = ut_params->type; 9055 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 9056 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9057 9058 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9059 if (sec_cap == NULL) 9060 return TEST_SKIPPED; 9061 9062 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 9063 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 9064 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 9065 crypto_cap->sym.xform_type == 9066 RTE_CRYPTO_SYM_XFORM_CIPHER && 9067 crypto_cap->sym.cipher.algo == 9068 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 9069 sym_cap = &crypto_cap->sym; 9070 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 9071 d_td->key.len, 9072 d_td->iv.len) == 0) 9073 break; 9074 } 9075 } 9076 9077 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 9078 return TEST_SKIPPED; 9079 9080 /* Setup source mbuf payload */ 9081 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9082 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9083 rte_pktmbuf_tailroom(ut_params->ibuf)); 9084 9085 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9086 d_td->plaintext.len); 9087 9088 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 9089 9090 /* Setup cipher session parameters */ 9091 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9092 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 9093 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9094 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 9095 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 9096 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 9097 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9098 ut_params->cipher_xform.next = NULL; 9099 9100 /* Setup DOCSIS session parameters */ 9101 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9102 9103 struct rte_security_session_conf sess_conf = { 9104 .action_type = ut_params->type, 9105 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 9106 .docsis = ut_params->docsis_xform, 9107 .crypto_xform = &ut_params->cipher_xform, 9108 }; 9109 9110 /* Create security session */ 9111 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9112 ts_params->session_mpool, 9113 ts_params->session_priv_mpool); 9114 9115 if (!ut_params->sec_session) { 9116 printf("TestCase %s(%d) line %d: %s\n", 9117 __func__, i, __LINE__, "failed to allocate session"); 9118 ret = TEST_FAILED; 9119 goto on_err; 9120 } 9121 9122 /* Generate crypto op data structure */ 9123 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9124 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9125 if (!ut_params->op) { 9126 printf("TestCase %s(%d) line %d: %s\n", 9127 __func__, i, __LINE__, 9128 "failed to allocate security crypto operation"); 9129 ret = TEST_FAILED; 9130 goto on_err; 9131 } 9132 9133 /* Setup CRC operation parameters */ 9134 crc_len = d_td->plaintext.no_crc == false ? 9135 (d_td->plaintext.len - 9136 d_td->plaintext.crc_offset - 9137 RTE_ETHER_CRC_LEN) : 9138 0; 9139 crc_len = crc_len > 0 ? crc_len : 0; 9140 ut_params->op->sym->auth.data.length = crc_len; 9141 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 9142 9143 /* Setup cipher operation parameters */ 9144 cipher_len = d_td->plaintext.no_cipher == false ? 9145 (d_td->plaintext.len - 9146 d_td->plaintext.cipher_offset) : 9147 0; 9148 cipher_len = cipher_len > 0 ? cipher_len : 0; 9149 ut_params->op->sym->cipher.data.length = cipher_len; 9150 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 9151 9152 /* Setup cipher IV */ 9153 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9154 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9155 9156 /* Attach session to operation */ 9157 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9158 9159 /* Set crypto operation mbufs */ 9160 ut_params->op->sym->m_src = ut_params->ibuf; 9161 ut_params->op->sym->m_dst = NULL; 9162 9163 /* Process crypto operation */ 9164 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9165 NULL) { 9166 printf("TestCase %s(%d) line %d: %s\n", 9167 __func__, i, __LINE__, 9168 "failed to process security crypto op"); 9169 ret = TEST_FAILED; 9170 goto on_err; 9171 } 9172 9173 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9174 printf("TestCase %s(%d) line %d: %s\n", 9175 __func__, i, __LINE__, "crypto op processing failed"); 9176 ret = TEST_FAILED; 9177 goto on_err; 9178 } 9179 9180 /* Validate ciphertext */ 9181 ciphertext = plaintext; 9182 9183 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 9184 printf("TestCase %s(%d) line %d: %s\n", 9185 __func__, i, __LINE__, "ciphertext not as expected\n"); 9186 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 9187 d_td->ciphertext.len); 9188 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 9189 ret = TEST_FAILED; 9190 goto on_err; 9191 } 9192 9193 on_err: 9194 rte_crypto_op_free(ut_params->op); 9195 ut_params->op = NULL; 9196 9197 if (ut_params->sec_session) 9198 rte_security_session_destroy(ctx, ut_params->sec_session); 9199 ut_params->sec_session = NULL; 9200 9201 rte_pktmbuf_free(ut_params->ibuf); 9202 ut_params->ibuf = NULL; 9203 9204 return ret; 9205 } 9206 9207 #define TEST_DOCSIS_COUNT(func) do { \ 9208 int ret = func; \ 9209 if (ret == TEST_SUCCESS) { \ 9210 printf("\t%2d)", n++); \ 9211 printf("+++++ PASSED:" #func"\n"); \ 9212 p++; \ 9213 } else if (ret == TEST_SKIPPED) { \ 9214 printf("\t%2d)", n++); \ 9215 printf("~~~~~ SKIPPED:" #func"\n"); \ 9216 s++; \ 9217 } else { \ 9218 printf("\t%2d)", n++); \ 9219 printf("----- FAILED:" #func"\n"); \ 9220 f++; \ 9221 } \ 9222 } while (0) 9223 9224 static int 9225 test_DOCSIS_PROTO_uplink_all(void) 9226 { 9227 int p = 0, s = 0, f = 0, n = 0; 9228 9229 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1)); 9230 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2)); 9231 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3)); 9232 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4)); 9233 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5)); 9234 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6)); 9235 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7)); 9236 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8)); 9237 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9)); 9238 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10)); 9239 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11)); 9240 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12)); 9241 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13)); 9242 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14)); 9243 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15)); 9244 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16)); 9245 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17)); 9246 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18)); 9247 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19)); 9248 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20)); 9249 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21)); 9250 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22)); 9251 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23)); 9252 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24)); 9253 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25)); 9254 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26)); 9255 9256 if (f) 9257 printf("## %s: %d passed out of %d (%d skipped)\n", 9258 __func__, p, n, s); 9259 9260 return f; 9261 }; 9262 9263 static int 9264 test_DOCSIS_PROTO_downlink_all(void) 9265 { 9266 int p = 0, s = 0, f = 0, n = 0; 9267 9268 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1)); 9269 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2)); 9270 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3)); 9271 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4)); 9272 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5)); 9273 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6)); 9274 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7)); 9275 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8)); 9276 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9)); 9277 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10)); 9278 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11)); 9279 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12)); 9280 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13)); 9281 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14)); 9282 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15)); 9283 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16)); 9284 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17)); 9285 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18)); 9286 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19)); 9287 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20)); 9288 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21)); 9289 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22)); 9290 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23)); 9291 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24)); 9292 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25)); 9293 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26)); 9294 9295 if (f) 9296 printf("## %s: %d passed out of %d (%d skipped)\n", 9297 __func__, p, n, s); 9298 9299 return f; 9300 }; 9301 9302 static int 9303 test_DOCSIS_PROTO_all(void) 9304 { 9305 struct crypto_testsuite_params *ts_params = &testsuite_params; 9306 struct crypto_unittest_params *ut_params = &unittest_params; 9307 struct rte_cryptodev_info dev_info; 9308 int status; 9309 9310 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9311 uint64_t feat_flags = dev_info.feature_flags; 9312 9313 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 9314 return TEST_SKIPPED; 9315 9316 /* Set action type */ 9317 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9318 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9319 gbl_action_type; 9320 9321 if (security_proto_supported(ut_params->type, 9322 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 9323 return TEST_SKIPPED; 9324 9325 status = test_DOCSIS_PROTO_uplink_all(); 9326 status += test_DOCSIS_PROTO_downlink_all(); 9327 9328 if (status) 9329 return TEST_FAILED; 9330 else 9331 return TEST_SUCCESS; 9332 } 9333 #endif 9334 9335 static int 9336 test_AES_GCM_authenticated_encryption_test_case_1(void) 9337 { 9338 return test_authenticated_encryption(&gcm_test_case_1); 9339 } 9340 9341 static int 9342 test_AES_GCM_authenticated_encryption_test_case_2(void) 9343 { 9344 return test_authenticated_encryption(&gcm_test_case_2); 9345 } 9346 9347 static int 9348 test_AES_GCM_authenticated_encryption_test_case_3(void) 9349 { 9350 return test_authenticated_encryption(&gcm_test_case_3); 9351 } 9352 9353 static int 9354 test_AES_GCM_authenticated_encryption_test_case_4(void) 9355 { 9356 return test_authenticated_encryption(&gcm_test_case_4); 9357 } 9358 9359 static int 9360 test_AES_GCM_authenticated_encryption_test_case_5(void) 9361 { 9362 return test_authenticated_encryption(&gcm_test_case_5); 9363 } 9364 9365 static int 9366 test_AES_GCM_authenticated_encryption_test_case_6(void) 9367 { 9368 return test_authenticated_encryption(&gcm_test_case_6); 9369 } 9370 9371 static int 9372 test_AES_GCM_authenticated_encryption_test_case_7(void) 9373 { 9374 return test_authenticated_encryption(&gcm_test_case_7); 9375 } 9376 9377 static int 9378 test_AES_GCM_authenticated_encryption_test_case_8(void) 9379 { 9380 return test_authenticated_encryption(&gcm_test_case_8); 9381 } 9382 9383 static int 9384 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 9385 { 9386 return test_authenticated_encryption(&gcm_J0_test_case_1); 9387 } 9388 9389 static int 9390 test_AES_GCM_auth_encryption_test_case_192_1(void) 9391 { 9392 return test_authenticated_encryption(&gcm_test_case_192_1); 9393 } 9394 9395 static int 9396 test_AES_GCM_auth_encryption_test_case_192_2(void) 9397 { 9398 return test_authenticated_encryption(&gcm_test_case_192_2); 9399 } 9400 9401 static int 9402 test_AES_GCM_auth_encryption_test_case_192_3(void) 9403 { 9404 return test_authenticated_encryption(&gcm_test_case_192_3); 9405 } 9406 9407 static int 9408 test_AES_GCM_auth_encryption_test_case_192_4(void) 9409 { 9410 return test_authenticated_encryption(&gcm_test_case_192_4); 9411 } 9412 9413 static int 9414 test_AES_GCM_auth_encryption_test_case_192_5(void) 9415 { 9416 return test_authenticated_encryption(&gcm_test_case_192_5); 9417 } 9418 9419 static int 9420 test_AES_GCM_auth_encryption_test_case_192_6(void) 9421 { 9422 return test_authenticated_encryption(&gcm_test_case_192_6); 9423 } 9424 9425 static int 9426 test_AES_GCM_auth_encryption_test_case_192_7(void) 9427 { 9428 return test_authenticated_encryption(&gcm_test_case_192_7); 9429 } 9430 9431 static int 9432 test_AES_GCM_auth_encryption_test_case_256_1(void) 9433 { 9434 return test_authenticated_encryption(&gcm_test_case_256_1); 9435 } 9436 9437 static int 9438 test_AES_GCM_auth_encryption_test_case_256_2(void) 9439 { 9440 return test_authenticated_encryption(&gcm_test_case_256_2); 9441 } 9442 9443 static int 9444 test_AES_GCM_auth_encryption_test_case_256_3(void) 9445 { 9446 return test_authenticated_encryption(&gcm_test_case_256_3); 9447 } 9448 9449 static int 9450 test_AES_GCM_auth_encryption_test_case_256_4(void) 9451 { 9452 return test_authenticated_encryption(&gcm_test_case_256_4); 9453 } 9454 9455 static int 9456 test_AES_GCM_auth_encryption_test_case_256_5(void) 9457 { 9458 return test_authenticated_encryption(&gcm_test_case_256_5); 9459 } 9460 9461 static int 9462 test_AES_GCM_auth_encryption_test_case_256_6(void) 9463 { 9464 return test_authenticated_encryption(&gcm_test_case_256_6); 9465 } 9466 9467 static int 9468 test_AES_GCM_auth_encryption_test_case_256_7(void) 9469 { 9470 return test_authenticated_encryption(&gcm_test_case_256_7); 9471 } 9472 9473 static int 9474 test_AES_GCM_auth_encryption_test_case_aad_1(void) 9475 { 9476 return test_authenticated_encryption(&gcm_test_case_aad_1); 9477 } 9478 9479 static int 9480 test_AES_GCM_auth_encryption_test_case_aad_2(void) 9481 { 9482 return test_authenticated_encryption(&gcm_test_case_aad_2); 9483 } 9484 9485 static int 9486 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 9487 { 9488 struct aead_test_data tdata; 9489 int res; 9490 9491 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9492 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9493 tdata.iv.data[0] += 1; 9494 res = test_authenticated_encryption(&tdata); 9495 if (res == TEST_SKIPPED) 9496 return res; 9497 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9498 return TEST_SUCCESS; 9499 } 9500 9501 static int 9502 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 9503 { 9504 struct aead_test_data tdata; 9505 int res; 9506 9507 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9508 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9509 tdata.plaintext.data[0] += 1; 9510 res = test_authenticated_encryption(&tdata); 9511 if (res == TEST_SKIPPED) 9512 return res; 9513 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9514 return TEST_SUCCESS; 9515 } 9516 9517 static int 9518 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 9519 { 9520 struct aead_test_data tdata; 9521 int res; 9522 9523 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9524 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9525 tdata.ciphertext.data[0] += 1; 9526 res = test_authenticated_encryption(&tdata); 9527 if (res == TEST_SKIPPED) 9528 return res; 9529 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9530 return TEST_SUCCESS; 9531 } 9532 9533 static int 9534 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 9535 { 9536 struct aead_test_data tdata; 9537 int res; 9538 9539 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9540 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9541 tdata.aad.len += 1; 9542 res = test_authenticated_encryption(&tdata); 9543 if (res == TEST_SKIPPED) 9544 return res; 9545 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9546 return TEST_SUCCESS; 9547 } 9548 9549 static int 9550 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 9551 { 9552 struct aead_test_data tdata; 9553 uint8_t aad[gcm_test_case_7.aad.len]; 9554 int res; 9555 9556 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9557 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9558 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9559 aad[0] += 1; 9560 tdata.aad.data = aad; 9561 res = test_authenticated_encryption(&tdata); 9562 if (res == TEST_SKIPPED) 9563 return res; 9564 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9565 return TEST_SUCCESS; 9566 } 9567 9568 static int 9569 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 9570 { 9571 struct aead_test_data tdata; 9572 int res; 9573 9574 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9575 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9576 tdata.auth_tag.data[0] += 1; 9577 res = test_authenticated_encryption(&tdata); 9578 if (res == TEST_SKIPPED) 9579 return res; 9580 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9581 return TEST_SUCCESS; 9582 } 9583 9584 static int 9585 test_authenticated_decryption(const struct aead_test_data *tdata) 9586 { 9587 struct crypto_testsuite_params *ts_params = &testsuite_params; 9588 struct crypto_unittest_params *ut_params = &unittest_params; 9589 9590 int retval; 9591 uint8_t *plaintext; 9592 uint32_t i; 9593 struct rte_cryptodev_info dev_info; 9594 9595 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9596 uint64_t feat_flags = dev_info.feature_flags; 9597 9598 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9599 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9600 printf("Device doesn't support RAW data-path APIs.\n"); 9601 return TEST_SKIPPED; 9602 } 9603 9604 /* Verify the capabilities */ 9605 struct rte_cryptodev_sym_capability_idx cap_idx; 9606 const struct rte_cryptodev_symmetric_capability *capability; 9607 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9608 cap_idx.algo.aead = tdata->algo; 9609 capability = rte_cryptodev_sym_capability_get( 9610 ts_params->valid_devs[0], &cap_idx); 9611 if (capability == NULL) 9612 return TEST_SKIPPED; 9613 if (rte_cryptodev_sym_capability_check_aead( 9614 capability, tdata->key.len, tdata->auth_tag.len, 9615 tdata->aad.len, tdata->iv.len)) 9616 return TEST_SKIPPED; 9617 9618 /* Create AEAD session */ 9619 retval = create_aead_session(ts_params->valid_devs[0], 9620 tdata->algo, 9621 RTE_CRYPTO_AEAD_OP_DECRYPT, 9622 tdata->key.data, tdata->key.len, 9623 tdata->aad.len, tdata->auth_tag.len, 9624 tdata->iv.len); 9625 if (retval < 0) 9626 return retval; 9627 9628 /* alloc mbuf and set payload */ 9629 if (tdata->aad.len > MBUF_SIZE) { 9630 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 9631 /* Populate full size of add data */ 9632 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 9633 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 9634 } else 9635 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9636 9637 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9638 rte_pktmbuf_tailroom(ut_params->ibuf)); 9639 9640 /* Create AEAD operation */ 9641 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 9642 if (retval < 0) 9643 return retval; 9644 9645 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9646 9647 ut_params->op->sym->m_src = ut_params->ibuf; 9648 9649 /* Process crypto operation */ 9650 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9651 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 9652 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9653 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 9654 ut_params->op, 0, 0, 0, 0); 9655 else 9656 TEST_ASSERT_NOT_NULL( 9657 process_crypto_request(ts_params->valid_devs[0], 9658 ut_params->op), "failed to process sym crypto op"); 9659 9660 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9661 "crypto op processing failed"); 9662 9663 if (ut_params->op->sym->m_dst) 9664 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 9665 uint8_t *); 9666 else 9667 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 9668 uint8_t *, 9669 ut_params->op->sym->cipher.data.offset); 9670 9671 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 9672 9673 /* Validate obuf */ 9674 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9675 plaintext, 9676 tdata->plaintext.data, 9677 tdata->plaintext.len, 9678 "Plaintext data not as expected"); 9679 9680 TEST_ASSERT_EQUAL(ut_params->op->status, 9681 RTE_CRYPTO_OP_STATUS_SUCCESS, 9682 "Authentication failed"); 9683 9684 return 0; 9685 } 9686 9687 static int 9688 test_AES_GCM_authenticated_decryption_test_case_1(void) 9689 { 9690 return test_authenticated_decryption(&gcm_test_case_1); 9691 } 9692 9693 static int 9694 test_AES_GCM_authenticated_decryption_test_case_2(void) 9695 { 9696 return test_authenticated_decryption(&gcm_test_case_2); 9697 } 9698 9699 static int 9700 test_AES_GCM_authenticated_decryption_test_case_3(void) 9701 { 9702 return test_authenticated_decryption(&gcm_test_case_3); 9703 } 9704 9705 static int 9706 test_AES_GCM_authenticated_decryption_test_case_4(void) 9707 { 9708 return test_authenticated_decryption(&gcm_test_case_4); 9709 } 9710 9711 static int 9712 test_AES_GCM_authenticated_decryption_test_case_5(void) 9713 { 9714 return test_authenticated_decryption(&gcm_test_case_5); 9715 } 9716 9717 static int 9718 test_AES_GCM_authenticated_decryption_test_case_6(void) 9719 { 9720 return test_authenticated_decryption(&gcm_test_case_6); 9721 } 9722 9723 static int 9724 test_AES_GCM_authenticated_decryption_test_case_7(void) 9725 { 9726 return test_authenticated_decryption(&gcm_test_case_7); 9727 } 9728 9729 static int 9730 test_AES_GCM_authenticated_decryption_test_case_8(void) 9731 { 9732 return test_authenticated_decryption(&gcm_test_case_8); 9733 } 9734 9735 static int 9736 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 9737 { 9738 return test_authenticated_decryption(&gcm_J0_test_case_1); 9739 } 9740 9741 static int 9742 test_AES_GCM_auth_decryption_test_case_192_1(void) 9743 { 9744 return test_authenticated_decryption(&gcm_test_case_192_1); 9745 } 9746 9747 static int 9748 test_AES_GCM_auth_decryption_test_case_192_2(void) 9749 { 9750 return test_authenticated_decryption(&gcm_test_case_192_2); 9751 } 9752 9753 static int 9754 test_AES_GCM_auth_decryption_test_case_192_3(void) 9755 { 9756 return test_authenticated_decryption(&gcm_test_case_192_3); 9757 } 9758 9759 static int 9760 test_AES_GCM_auth_decryption_test_case_192_4(void) 9761 { 9762 return test_authenticated_decryption(&gcm_test_case_192_4); 9763 } 9764 9765 static int 9766 test_AES_GCM_auth_decryption_test_case_192_5(void) 9767 { 9768 return test_authenticated_decryption(&gcm_test_case_192_5); 9769 } 9770 9771 static int 9772 test_AES_GCM_auth_decryption_test_case_192_6(void) 9773 { 9774 return test_authenticated_decryption(&gcm_test_case_192_6); 9775 } 9776 9777 static int 9778 test_AES_GCM_auth_decryption_test_case_192_7(void) 9779 { 9780 return test_authenticated_decryption(&gcm_test_case_192_7); 9781 } 9782 9783 static int 9784 test_AES_GCM_auth_decryption_test_case_256_1(void) 9785 { 9786 return test_authenticated_decryption(&gcm_test_case_256_1); 9787 } 9788 9789 static int 9790 test_AES_GCM_auth_decryption_test_case_256_2(void) 9791 { 9792 return test_authenticated_decryption(&gcm_test_case_256_2); 9793 } 9794 9795 static int 9796 test_AES_GCM_auth_decryption_test_case_256_3(void) 9797 { 9798 return test_authenticated_decryption(&gcm_test_case_256_3); 9799 } 9800 9801 static int 9802 test_AES_GCM_auth_decryption_test_case_256_4(void) 9803 { 9804 return test_authenticated_decryption(&gcm_test_case_256_4); 9805 } 9806 9807 static int 9808 test_AES_GCM_auth_decryption_test_case_256_5(void) 9809 { 9810 return test_authenticated_decryption(&gcm_test_case_256_5); 9811 } 9812 9813 static int 9814 test_AES_GCM_auth_decryption_test_case_256_6(void) 9815 { 9816 return test_authenticated_decryption(&gcm_test_case_256_6); 9817 } 9818 9819 static int 9820 test_AES_GCM_auth_decryption_test_case_256_7(void) 9821 { 9822 return test_authenticated_decryption(&gcm_test_case_256_7); 9823 } 9824 9825 static int 9826 test_AES_GCM_auth_decryption_test_case_aad_1(void) 9827 { 9828 return test_authenticated_decryption(&gcm_test_case_aad_1); 9829 } 9830 9831 static int 9832 test_AES_GCM_auth_decryption_test_case_aad_2(void) 9833 { 9834 return test_authenticated_decryption(&gcm_test_case_aad_2); 9835 } 9836 9837 static int 9838 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 9839 { 9840 struct aead_test_data tdata; 9841 int res; 9842 9843 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9844 tdata.iv.data[0] += 1; 9845 res = test_authenticated_decryption(&tdata); 9846 if (res == TEST_SKIPPED) 9847 return res; 9848 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9849 return TEST_SUCCESS; 9850 } 9851 9852 static int 9853 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 9854 { 9855 struct aead_test_data tdata; 9856 int res; 9857 9858 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9859 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9860 tdata.plaintext.data[0] += 1; 9861 res = test_authenticated_decryption(&tdata); 9862 if (res == TEST_SKIPPED) 9863 return res; 9864 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9865 return TEST_SUCCESS; 9866 } 9867 9868 static int 9869 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 9870 { 9871 struct aead_test_data tdata; 9872 int res; 9873 9874 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9875 tdata.ciphertext.data[0] += 1; 9876 res = test_authenticated_decryption(&tdata); 9877 if (res == TEST_SKIPPED) 9878 return res; 9879 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9880 return TEST_SUCCESS; 9881 } 9882 9883 static int 9884 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 9885 { 9886 struct aead_test_data tdata; 9887 int res; 9888 9889 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9890 tdata.aad.len += 1; 9891 res = test_authenticated_decryption(&tdata); 9892 if (res == TEST_SKIPPED) 9893 return res; 9894 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9895 return TEST_SUCCESS; 9896 } 9897 9898 static int 9899 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 9900 { 9901 struct aead_test_data tdata; 9902 uint8_t aad[gcm_test_case_7.aad.len]; 9903 int res; 9904 9905 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9906 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9907 aad[0] += 1; 9908 tdata.aad.data = aad; 9909 res = test_authenticated_decryption(&tdata); 9910 if (res == TEST_SKIPPED) 9911 return res; 9912 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9913 return TEST_SUCCESS; 9914 } 9915 9916 static int 9917 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 9918 { 9919 struct aead_test_data tdata; 9920 int res; 9921 9922 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9923 tdata.auth_tag.data[0] += 1; 9924 res = test_authenticated_decryption(&tdata); 9925 if (res == TEST_SKIPPED) 9926 return res; 9927 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 9928 return TEST_SUCCESS; 9929 } 9930 9931 static int 9932 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 9933 { 9934 struct crypto_testsuite_params *ts_params = &testsuite_params; 9935 struct crypto_unittest_params *ut_params = &unittest_params; 9936 9937 int retval; 9938 uint8_t *ciphertext, *auth_tag; 9939 uint16_t plaintext_pad_len; 9940 9941 /* Verify the capabilities */ 9942 struct rte_cryptodev_sym_capability_idx cap_idx; 9943 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9944 cap_idx.algo.aead = tdata->algo; 9945 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9946 &cap_idx) == NULL) 9947 return TEST_SKIPPED; 9948 9949 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9950 return TEST_SKIPPED; 9951 9952 /* not supported with CPU crypto */ 9953 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9954 return TEST_SKIPPED; 9955 9956 /* Create AEAD session */ 9957 retval = create_aead_session(ts_params->valid_devs[0], 9958 tdata->algo, 9959 RTE_CRYPTO_AEAD_OP_ENCRYPT, 9960 tdata->key.data, tdata->key.len, 9961 tdata->aad.len, tdata->auth_tag.len, 9962 tdata->iv.len); 9963 if (retval < 0) 9964 return retval; 9965 9966 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9967 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9968 9969 /* clear mbuf payload */ 9970 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9971 rte_pktmbuf_tailroom(ut_params->ibuf)); 9972 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 9973 rte_pktmbuf_tailroom(ut_params->obuf)); 9974 9975 /* Create AEAD operation */ 9976 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 9977 if (retval < 0) 9978 return retval; 9979 9980 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9981 9982 ut_params->op->sym->m_src = ut_params->ibuf; 9983 ut_params->op->sym->m_dst = ut_params->obuf; 9984 9985 /* Process crypto operation */ 9986 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 9987 ut_params->op), "failed to process sym crypto op"); 9988 9989 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9990 "crypto op processing failed"); 9991 9992 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9993 9994 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 9995 ut_params->op->sym->cipher.data.offset); 9996 auth_tag = ciphertext + plaintext_pad_len; 9997 9998 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 9999 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10000 10001 /* Validate obuf */ 10002 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10003 ciphertext, 10004 tdata->ciphertext.data, 10005 tdata->ciphertext.len, 10006 "Ciphertext data not as expected"); 10007 10008 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10009 auth_tag, 10010 tdata->auth_tag.data, 10011 tdata->auth_tag.len, 10012 "Generated auth tag not as expected"); 10013 10014 return 0; 10015 10016 } 10017 10018 static int 10019 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 10020 { 10021 return test_authenticated_encryption_oop(&gcm_test_case_5); 10022 } 10023 10024 static int 10025 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 10026 { 10027 struct crypto_testsuite_params *ts_params = &testsuite_params; 10028 struct crypto_unittest_params *ut_params = &unittest_params; 10029 10030 int retval; 10031 uint8_t *plaintext; 10032 10033 /* Verify the capabilities */ 10034 struct rte_cryptodev_sym_capability_idx cap_idx; 10035 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10036 cap_idx.algo.aead = tdata->algo; 10037 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10038 &cap_idx) == NULL) 10039 return TEST_SKIPPED; 10040 10041 /* not supported with CPU crypto and raw data-path APIs*/ 10042 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 10043 global_api_test_type == CRYPTODEV_RAW_API_TEST) 10044 return TEST_SKIPPED; 10045 10046 /* Create AEAD session */ 10047 retval = create_aead_session(ts_params->valid_devs[0], 10048 tdata->algo, 10049 RTE_CRYPTO_AEAD_OP_DECRYPT, 10050 tdata->key.data, tdata->key.len, 10051 tdata->aad.len, tdata->auth_tag.len, 10052 tdata->iv.len); 10053 if (retval < 0) 10054 return retval; 10055 10056 /* alloc mbuf and set payload */ 10057 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10058 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10059 10060 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10061 rte_pktmbuf_tailroom(ut_params->ibuf)); 10062 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10063 rte_pktmbuf_tailroom(ut_params->obuf)); 10064 10065 /* Create AEAD operation */ 10066 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10067 if (retval < 0) 10068 return retval; 10069 10070 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10071 10072 ut_params->op->sym->m_src = ut_params->ibuf; 10073 ut_params->op->sym->m_dst = ut_params->obuf; 10074 10075 /* Process crypto operation */ 10076 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10077 ut_params->op), "failed to process sym crypto op"); 10078 10079 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10080 "crypto op processing failed"); 10081 10082 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10083 ut_params->op->sym->cipher.data.offset); 10084 10085 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10086 10087 /* Validate obuf */ 10088 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10089 plaintext, 10090 tdata->plaintext.data, 10091 tdata->plaintext.len, 10092 "Plaintext data not as expected"); 10093 10094 TEST_ASSERT_EQUAL(ut_params->op->status, 10095 RTE_CRYPTO_OP_STATUS_SUCCESS, 10096 "Authentication failed"); 10097 return 0; 10098 } 10099 10100 static int 10101 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 10102 { 10103 return test_authenticated_decryption_oop(&gcm_test_case_5); 10104 } 10105 10106 static int 10107 test_authenticated_encryption_sessionless( 10108 const struct aead_test_data *tdata) 10109 { 10110 struct crypto_testsuite_params *ts_params = &testsuite_params; 10111 struct crypto_unittest_params *ut_params = &unittest_params; 10112 10113 int retval; 10114 uint8_t *ciphertext, *auth_tag; 10115 uint16_t plaintext_pad_len; 10116 uint8_t key[tdata->key.len + 1]; 10117 struct rte_cryptodev_info dev_info; 10118 10119 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10120 uint64_t feat_flags = dev_info.feature_flags; 10121 10122 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10123 printf("Device doesn't support Sessionless ops.\n"); 10124 return TEST_SKIPPED; 10125 } 10126 10127 /* not supported with CPU crypto */ 10128 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10129 return TEST_SKIPPED; 10130 10131 /* Verify the capabilities */ 10132 struct rte_cryptodev_sym_capability_idx cap_idx; 10133 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10134 cap_idx.algo.aead = tdata->algo; 10135 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10136 &cap_idx) == NULL) 10137 return TEST_SKIPPED; 10138 10139 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10140 10141 /* clear mbuf payload */ 10142 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10143 rte_pktmbuf_tailroom(ut_params->ibuf)); 10144 10145 /* Create AEAD operation */ 10146 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10147 if (retval < 0) 10148 return retval; 10149 10150 /* Create GCM xform */ 10151 memcpy(key, tdata->key.data, tdata->key.len); 10152 retval = create_aead_xform(ut_params->op, 10153 tdata->algo, 10154 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10155 key, tdata->key.len, 10156 tdata->aad.len, tdata->auth_tag.len, 10157 tdata->iv.len); 10158 if (retval < 0) 10159 return retval; 10160 10161 ut_params->op->sym->m_src = ut_params->ibuf; 10162 10163 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10164 RTE_CRYPTO_OP_SESSIONLESS, 10165 "crypto op session type not sessionless"); 10166 10167 /* Process crypto operation */ 10168 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10169 ut_params->op), "failed to process sym crypto op"); 10170 10171 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10172 10173 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10174 "crypto op status not success"); 10175 10176 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10177 10178 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10179 ut_params->op->sym->cipher.data.offset); 10180 auth_tag = ciphertext + plaintext_pad_len; 10181 10182 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10183 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10184 10185 /* Validate obuf */ 10186 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10187 ciphertext, 10188 tdata->ciphertext.data, 10189 tdata->ciphertext.len, 10190 "Ciphertext data not as expected"); 10191 10192 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10193 auth_tag, 10194 tdata->auth_tag.data, 10195 tdata->auth_tag.len, 10196 "Generated auth tag not as expected"); 10197 10198 return 0; 10199 10200 } 10201 10202 static int 10203 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 10204 { 10205 return test_authenticated_encryption_sessionless( 10206 &gcm_test_case_5); 10207 } 10208 10209 static int 10210 test_authenticated_decryption_sessionless( 10211 const struct aead_test_data *tdata) 10212 { 10213 struct crypto_testsuite_params *ts_params = &testsuite_params; 10214 struct crypto_unittest_params *ut_params = &unittest_params; 10215 10216 int retval; 10217 uint8_t *plaintext; 10218 uint8_t key[tdata->key.len + 1]; 10219 struct rte_cryptodev_info dev_info; 10220 10221 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10222 uint64_t feat_flags = dev_info.feature_flags; 10223 10224 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10225 printf("Device doesn't support Sessionless ops.\n"); 10226 return TEST_SKIPPED; 10227 } 10228 10229 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10230 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10231 printf("Device doesn't support RAW data-path APIs.\n"); 10232 return TEST_SKIPPED; 10233 } 10234 10235 /* not supported with CPU crypto */ 10236 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10237 return TEST_SKIPPED; 10238 10239 /* Verify the capabilities */ 10240 struct rte_cryptodev_sym_capability_idx cap_idx; 10241 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10242 cap_idx.algo.aead = tdata->algo; 10243 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10244 &cap_idx) == NULL) 10245 return TEST_SKIPPED; 10246 10247 /* alloc mbuf and set payload */ 10248 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10249 10250 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10251 rte_pktmbuf_tailroom(ut_params->ibuf)); 10252 10253 /* Create AEAD operation */ 10254 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10255 if (retval < 0) 10256 return retval; 10257 10258 /* Create AEAD xform */ 10259 memcpy(key, tdata->key.data, tdata->key.len); 10260 retval = create_aead_xform(ut_params->op, 10261 tdata->algo, 10262 RTE_CRYPTO_AEAD_OP_DECRYPT, 10263 key, tdata->key.len, 10264 tdata->aad.len, tdata->auth_tag.len, 10265 tdata->iv.len); 10266 if (retval < 0) 10267 return retval; 10268 10269 ut_params->op->sym->m_src = ut_params->ibuf; 10270 10271 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10272 RTE_CRYPTO_OP_SESSIONLESS, 10273 "crypto op session type not sessionless"); 10274 10275 /* Process crypto operation */ 10276 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10277 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10278 ut_params->op, 0, 0, 0, 0); 10279 else 10280 TEST_ASSERT_NOT_NULL(process_crypto_request( 10281 ts_params->valid_devs[0], ut_params->op), 10282 "failed to process sym crypto op"); 10283 10284 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10285 10286 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10287 "crypto op status not success"); 10288 10289 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10290 ut_params->op->sym->cipher.data.offset); 10291 10292 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10293 10294 /* Validate obuf */ 10295 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10296 plaintext, 10297 tdata->plaintext.data, 10298 tdata->plaintext.len, 10299 "Plaintext data not as expected"); 10300 10301 TEST_ASSERT_EQUAL(ut_params->op->status, 10302 RTE_CRYPTO_OP_STATUS_SUCCESS, 10303 "Authentication failed"); 10304 return 0; 10305 } 10306 10307 static int 10308 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 10309 { 10310 return test_authenticated_decryption_sessionless( 10311 &gcm_test_case_5); 10312 } 10313 10314 static int 10315 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 10316 { 10317 return test_authenticated_encryption(&ccm_test_case_128_1); 10318 } 10319 10320 static int 10321 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 10322 { 10323 return test_authenticated_encryption(&ccm_test_case_128_2); 10324 } 10325 10326 static int 10327 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 10328 { 10329 return test_authenticated_encryption(&ccm_test_case_128_3); 10330 } 10331 10332 static int 10333 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 10334 { 10335 return test_authenticated_decryption(&ccm_test_case_128_1); 10336 } 10337 10338 static int 10339 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 10340 { 10341 return test_authenticated_decryption(&ccm_test_case_128_2); 10342 } 10343 10344 static int 10345 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 10346 { 10347 return test_authenticated_decryption(&ccm_test_case_128_3); 10348 } 10349 10350 static int 10351 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 10352 { 10353 return test_authenticated_encryption(&ccm_test_case_192_1); 10354 } 10355 10356 static int 10357 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 10358 { 10359 return test_authenticated_encryption(&ccm_test_case_192_2); 10360 } 10361 10362 static int 10363 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 10364 { 10365 return test_authenticated_encryption(&ccm_test_case_192_3); 10366 } 10367 10368 static int 10369 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 10370 { 10371 return test_authenticated_decryption(&ccm_test_case_192_1); 10372 } 10373 10374 static int 10375 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 10376 { 10377 return test_authenticated_decryption(&ccm_test_case_192_2); 10378 } 10379 10380 static int 10381 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 10382 { 10383 return test_authenticated_decryption(&ccm_test_case_192_3); 10384 } 10385 10386 static int 10387 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 10388 { 10389 return test_authenticated_encryption(&ccm_test_case_256_1); 10390 } 10391 10392 static int 10393 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 10394 { 10395 return test_authenticated_encryption(&ccm_test_case_256_2); 10396 } 10397 10398 static int 10399 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 10400 { 10401 return test_authenticated_encryption(&ccm_test_case_256_3); 10402 } 10403 10404 static int 10405 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 10406 { 10407 return test_authenticated_decryption(&ccm_test_case_256_1); 10408 } 10409 10410 static int 10411 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 10412 { 10413 return test_authenticated_decryption(&ccm_test_case_256_2); 10414 } 10415 10416 static int 10417 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 10418 { 10419 return test_authenticated_decryption(&ccm_test_case_256_3); 10420 } 10421 10422 static int 10423 test_stats(void) 10424 { 10425 struct crypto_testsuite_params *ts_params = &testsuite_params; 10426 struct rte_cryptodev_stats stats; 10427 10428 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10429 return TEST_SKIPPED; 10430 10431 /* Verify the capabilities */ 10432 struct rte_cryptodev_sym_capability_idx cap_idx; 10433 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10434 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 10435 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10436 &cap_idx) == NULL) 10437 return TEST_SKIPPED; 10438 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10439 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10440 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10441 &cap_idx) == NULL) 10442 return TEST_SKIPPED; 10443 10444 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 10445 == -ENOTSUP) 10446 return TEST_SKIPPED; 10447 10448 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10449 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 10450 &stats) == -ENODEV), 10451 "rte_cryptodev_stats_get invalid dev failed"); 10452 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 10453 "rte_cryptodev_stats_get invalid Param failed"); 10454 10455 /* Test expected values */ 10456 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 10457 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10458 &stats), 10459 "rte_cryptodev_stats_get failed"); 10460 TEST_ASSERT((stats.enqueued_count == 1), 10461 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10462 TEST_ASSERT((stats.dequeued_count == 1), 10463 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10464 TEST_ASSERT((stats.enqueue_err_count == 0), 10465 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10466 TEST_ASSERT((stats.dequeue_err_count == 0), 10467 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10468 10469 /* invalid device but should ignore and not reset device stats*/ 10470 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 10471 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10472 &stats), 10473 "rte_cryptodev_stats_get failed"); 10474 TEST_ASSERT((stats.enqueued_count == 1), 10475 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10476 10477 /* check that a valid reset clears stats */ 10478 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10479 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10480 &stats), 10481 "rte_cryptodev_stats_get failed"); 10482 TEST_ASSERT((stats.enqueued_count == 0), 10483 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10484 TEST_ASSERT((stats.dequeued_count == 0), 10485 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10486 10487 return TEST_SUCCESS; 10488 } 10489 10490 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 10491 struct crypto_unittest_params *ut_params, 10492 enum rte_crypto_auth_operation op, 10493 const struct HMAC_MD5_vector *test_case) 10494 { 10495 uint8_t key[64]; 10496 10497 memcpy(key, test_case->key.data, test_case->key.len); 10498 10499 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10500 ut_params->auth_xform.next = NULL; 10501 ut_params->auth_xform.auth.op = op; 10502 10503 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 10504 10505 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 10506 ut_params->auth_xform.auth.key.length = test_case->key.len; 10507 ut_params->auth_xform.auth.key.data = key; 10508 10509 ut_params->sess = rte_cryptodev_sym_session_create( 10510 ts_params->session_mpool); 10511 10512 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10513 ut_params->sess, &ut_params->auth_xform, 10514 ts_params->session_priv_mpool); 10515 10516 if (ut_params->sess == NULL) 10517 return TEST_FAILED; 10518 10519 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10520 10521 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10522 rte_pktmbuf_tailroom(ut_params->ibuf)); 10523 10524 return 0; 10525 } 10526 10527 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 10528 const struct HMAC_MD5_vector *test_case, 10529 uint8_t **plaintext) 10530 { 10531 uint16_t plaintext_pad_len; 10532 10533 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10534 10535 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10536 16); 10537 10538 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10539 plaintext_pad_len); 10540 memcpy(*plaintext, test_case->plaintext.data, 10541 test_case->plaintext.len); 10542 10543 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10544 ut_params->ibuf, MD5_DIGEST_LEN); 10545 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10546 "no room to append digest"); 10547 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10548 ut_params->ibuf, plaintext_pad_len); 10549 10550 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10551 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 10552 test_case->auth_tag.len); 10553 } 10554 10555 sym_op->auth.data.offset = 0; 10556 sym_op->auth.data.length = test_case->plaintext.len; 10557 10558 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10559 ut_params->op->sym->m_src = ut_params->ibuf; 10560 10561 return 0; 10562 } 10563 10564 static int 10565 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 10566 { 10567 uint16_t plaintext_pad_len; 10568 uint8_t *plaintext, *auth_tag; 10569 10570 struct crypto_testsuite_params *ts_params = &testsuite_params; 10571 struct crypto_unittest_params *ut_params = &unittest_params; 10572 struct rte_cryptodev_info dev_info; 10573 10574 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10575 uint64_t feat_flags = dev_info.feature_flags; 10576 10577 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10578 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10579 printf("Device doesn't support RAW data-path APIs.\n"); 10580 return TEST_SKIPPED; 10581 } 10582 10583 /* Verify the capabilities */ 10584 struct rte_cryptodev_sym_capability_idx cap_idx; 10585 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10586 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10587 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10588 &cap_idx) == NULL) 10589 return TEST_SKIPPED; 10590 10591 if (MD5_HMAC_create_session(ts_params, ut_params, 10592 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 10593 return TEST_FAILED; 10594 10595 /* Generate Crypto op data structure */ 10596 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10597 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10598 TEST_ASSERT_NOT_NULL(ut_params->op, 10599 "Failed to allocate symmetric crypto operation struct"); 10600 10601 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10602 16); 10603 10604 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10605 return TEST_FAILED; 10606 10607 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10608 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10609 ut_params->op); 10610 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10611 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10612 ut_params->op, 0, 1, 0, 0); 10613 else 10614 TEST_ASSERT_NOT_NULL( 10615 process_crypto_request(ts_params->valid_devs[0], 10616 ut_params->op), 10617 "failed to process sym crypto op"); 10618 10619 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10620 "crypto op processing failed"); 10621 10622 if (ut_params->op->sym->m_dst) { 10623 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 10624 uint8_t *, plaintext_pad_len); 10625 } else { 10626 auth_tag = plaintext + plaintext_pad_len; 10627 } 10628 10629 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10630 auth_tag, 10631 test_case->auth_tag.data, 10632 test_case->auth_tag.len, 10633 "HMAC_MD5 generated tag not as expected"); 10634 10635 return TEST_SUCCESS; 10636 } 10637 10638 static int 10639 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 10640 { 10641 uint8_t *plaintext; 10642 10643 struct crypto_testsuite_params *ts_params = &testsuite_params; 10644 struct crypto_unittest_params *ut_params = &unittest_params; 10645 struct rte_cryptodev_info dev_info; 10646 10647 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10648 uint64_t feat_flags = dev_info.feature_flags; 10649 10650 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10651 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10652 printf("Device doesn't support RAW data-path APIs.\n"); 10653 return TEST_SKIPPED; 10654 } 10655 10656 /* Verify the capabilities */ 10657 struct rte_cryptodev_sym_capability_idx cap_idx; 10658 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10659 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10660 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10661 &cap_idx) == NULL) 10662 return TEST_SKIPPED; 10663 10664 if (MD5_HMAC_create_session(ts_params, ut_params, 10665 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 10666 return TEST_FAILED; 10667 } 10668 10669 /* Generate Crypto op data structure */ 10670 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10671 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10672 TEST_ASSERT_NOT_NULL(ut_params->op, 10673 "Failed to allocate symmetric crypto operation struct"); 10674 10675 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10676 return TEST_FAILED; 10677 10678 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10679 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10680 ut_params->op); 10681 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10682 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10683 ut_params->op, 0, 1, 0, 0); 10684 else 10685 TEST_ASSERT_NOT_NULL( 10686 process_crypto_request(ts_params->valid_devs[0], 10687 ut_params->op), 10688 "failed to process sym crypto op"); 10689 10690 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10691 "HMAC_MD5 crypto op processing failed"); 10692 10693 return TEST_SUCCESS; 10694 } 10695 10696 static int 10697 test_MD5_HMAC_generate_case_1(void) 10698 { 10699 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 10700 } 10701 10702 static int 10703 test_MD5_HMAC_verify_case_1(void) 10704 { 10705 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 10706 } 10707 10708 static int 10709 test_MD5_HMAC_generate_case_2(void) 10710 { 10711 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 10712 } 10713 10714 static int 10715 test_MD5_HMAC_verify_case_2(void) 10716 { 10717 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 10718 } 10719 10720 static int 10721 test_multi_session(void) 10722 { 10723 struct crypto_testsuite_params *ts_params = &testsuite_params; 10724 struct crypto_unittest_params *ut_params = &unittest_params; 10725 10726 struct rte_cryptodev_info dev_info; 10727 struct rte_cryptodev_sym_session **sessions; 10728 10729 uint16_t i; 10730 10731 /* Verify the capabilities */ 10732 struct rte_cryptodev_sym_capability_idx cap_idx; 10733 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10734 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10735 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10736 &cap_idx) == NULL) 10737 return TEST_SKIPPED; 10738 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10739 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10740 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10741 &cap_idx) == NULL) 10742 return TEST_SKIPPED; 10743 10744 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 10745 aes_cbc_key, hmac_sha512_key); 10746 10747 10748 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10749 10750 sessions = rte_malloc(NULL, 10751 sizeof(struct rte_cryptodev_sym_session *) * 10752 (MAX_NB_SESSIONS + 1), 0); 10753 10754 /* Create multiple crypto sessions*/ 10755 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10756 10757 sessions[i] = rte_cryptodev_sym_session_create( 10758 ts_params->session_mpool); 10759 10760 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10761 sessions[i], &ut_params->auth_xform, 10762 ts_params->session_priv_mpool); 10763 TEST_ASSERT_NOT_NULL(sessions[i], 10764 "Session creation failed at session number %u", 10765 i); 10766 10767 /* Attempt to send a request on each session */ 10768 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 10769 sessions[i], 10770 ut_params, 10771 ts_params, 10772 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 10773 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 10774 aes_cbc_iv), 10775 "Failed to perform decrypt on request number %u.", i); 10776 /* free crypto operation structure */ 10777 if (ut_params->op) 10778 rte_crypto_op_free(ut_params->op); 10779 10780 /* 10781 * free mbuf - both obuf and ibuf are usually the same, 10782 * so check if they point at the same address is necessary, 10783 * to avoid freeing the mbuf twice. 10784 */ 10785 if (ut_params->obuf) { 10786 rte_pktmbuf_free(ut_params->obuf); 10787 if (ut_params->ibuf == ut_params->obuf) 10788 ut_params->ibuf = 0; 10789 ut_params->obuf = 0; 10790 } 10791 if (ut_params->ibuf) { 10792 rte_pktmbuf_free(ut_params->ibuf); 10793 ut_params->ibuf = 0; 10794 } 10795 } 10796 10797 sessions[i] = NULL; 10798 /* Next session create should fail */ 10799 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10800 sessions[i], &ut_params->auth_xform, 10801 ts_params->session_priv_mpool); 10802 TEST_ASSERT_NULL(sessions[i], 10803 "Session creation succeeded unexpectedly!"); 10804 10805 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10806 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10807 sessions[i]); 10808 rte_cryptodev_sym_session_free(sessions[i]); 10809 } 10810 10811 rte_free(sessions); 10812 10813 return TEST_SUCCESS; 10814 } 10815 10816 struct multi_session_params { 10817 struct crypto_unittest_params ut_params; 10818 uint8_t *cipher_key; 10819 uint8_t *hmac_key; 10820 const uint8_t *cipher; 10821 const uint8_t *digest; 10822 uint8_t *iv; 10823 }; 10824 10825 #define MB_SESSION_NUMBER 3 10826 10827 static int 10828 test_multi_session_random_usage(void) 10829 { 10830 struct crypto_testsuite_params *ts_params = &testsuite_params; 10831 struct rte_cryptodev_info dev_info; 10832 struct rte_cryptodev_sym_session **sessions; 10833 uint32_t i, j; 10834 struct multi_session_params ut_paramz[] = { 10835 10836 { 10837 .cipher_key = ms_aes_cbc_key0, 10838 .hmac_key = ms_hmac_key0, 10839 .cipher = ms_aes_cbc_cipher0, 10840 .digest = ms_hmac_digest0, 10841 .iv = ms_aes_cbc_iv0 10842 }, 10843 { 10844 .cipher_key = ms_aes_cbc_key1, 10845 .hmac_key = ms_hmac_key1, 10846 .cipher = ms_aes_cbc_cipher1, 10847 .digest = ms_hmac_digest1, 10848 .iv = ms_aes_cbc_iv1 10849 }, 10850 { 10851 .cipher_key = ms_aes_cbc_key2, 10852 .hmac_key = ms_hmac_key2, 10853 .cipher = ms_aes_cbc_cipher2, 10854 .digest = ms_hmac_digest2, 10855 .iv = ms_aes_cbc_iv2 10856 }, 10857 10858 }; 10859 10860 /* Verify the capabilities */ 10861 struct rte_cryptodev_sym_capability_idx cap_idx; 10862 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10863 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10864 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10865 &cap_idx) == NULL) 10866 return TEST_SKIPPED; 10867 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10868 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10869 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10870 &cap_idx) == NULL) 10871 return TEST_SKIPPED; 10872 10873 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10874 10875 sessions = rte_malloc(NULL, 10876 (sizeof(struct rte_cryptodev_sym_session *) 10877 * MAX_NB_SESSIONS) + 1, 0); 10878 10879 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10880 sessions[i] = rte_cryptodev_sym_session_create( 10881 ts_params->session_mpool); 10882 10883 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 10884 sizeof(struct crypto_unittest_params)); 10885 10886 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 10887 &ut_paramz[i].ut_params, 10888 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 10889 10890 /* Create multiple crypto sessions*/ 10891 rte_cryptodev_sym_session_init( 10892 ts_params->valid_devs[0], 10893 sessions[i], 10894 &ut_paramz[i].ut_params.auth_xform, 10895 ts_params->session_priv_mpool); 10896 10897 TEST_ASSERT_NOT_NULL(sessions[i], 10898 "Session creation failed at session number %u", 10899 i); 10900 10901 } 10902 10903 srand(time(NULL)); 10904 for (i = 0; i < 40000; i++) { 10905 10906 j = rand() % MB_SESSION_NUMBER; 10907 10908 TEST_ASSERT_SUCCESS( 10909 test_AES_CBC_HMAC_SHA512_decrypt_perform( 10910 sessions[j], 10911 &ut_paramz[j].ut_params, 10912 ts_params, ut_paramz[j].cipher, 10913 ut_paramz[j].digest, 10914 ut_paramz[j].iv), 10915 "Failed to perform decrypt on request number %u.", i); 10916 10917 if (ut_paramz[j].ut_params.op) 10918 rte_crypto_op_free(ut_paramz[j].ut_params.op); 10919 10920 /* 10921 * free mbuf - both obuf and ibuf are usually the same, 10922 * so check if they point at the same address is necessary, 10923 * to avoid freeing the mbuf twice. 10924 */ 10925 if (ut_paramz[j].ut_params.obuf) { 10926 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 10927 if (ut_paramz[j].ut_params.ibuf 10928 == ut_paramz[j].ut_params.obuf) 10929 ut_paramz[j].ut_params.ibuf = 0; 10930 ut_paramz[j].ut_params.obuf = 0; 10931 } 10932 if (ut_paramz[j].ut_params.ibuf) { 10933 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 10934 ut_paramz[j].ut_params.ibuf = 0; 10935 } 10936 } 10937 10938 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10939 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10940 sessions[i]); 10941 rte_cryptodev_sym_session_free(sessions[i]); 10942 } 10943 10944 rte_free(sessions); 10945 10946 return TEST_SUCCESS; 10947 } 10948 10949 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 10950 0xab, 0xab, 0xab, 0xab, 10951 0xab, 0xab, 0xab, 0xab, 10952 0xab, 0xab, 0xab, 0xab}; 10953 10954 static int 10955 test_null_invalid_operation(void) 10956 { 10957 struct crypto_testsuite_params *ts_params = &testsuite_params; 10958 struct crypto_unittest_params *ut_params = &unittest_params; 10959 int ret; 10960 10961 /* This test is for NULL PMD only */ 10962 if (gbl_driver_id != rte_cryptodev_driver_id_get( 10963 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 10964 return TEST_SKIPPED; 10965 10966 /* Setup Cipher Parameters */ 10967 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10968 ut_params->cipher_xform.next = NULL; 10969 10970 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 10971 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10972 10973 ut_params->sess = rte_cryptodev_sym_session_create( 10974 ts_params->session_mpool); 10975 10976 /* Create Crypto session*/ 10977 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10978 ut_params->sess, &ut_params->cipher_xform, 10979 ts_params->session_priv_mpool); 10980 TEST_ASSERT(ret < 0, 10981 "Session creation succeeded unexpectedly"); 10982 10983 10984 /* Setup HMAC Parameters */ 10985 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10986 ut_params->auth_xform.next = NULL; 10987 10988 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 10989 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 10990 10991 ut_params->sess = rte_cryptodev_sym_session_create( 10992 ts_params->session_mpool); 10993 10994 /* Create Crypto session*/ 10995 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10996 ut_params->sess, &ut_params->auth_xform, 10997 ts_params->session_priv_mpool); 10998 TEST_ASSERT(ret < 0, 10999 "Session creation succeeded unexpectedly"); 11000 11001 return TEST_SUCCESS; 11002 } 11003 11004 11005 #define NULL_BURST_LENGTH (32) 11006 11007 static int 11008 test_null_burst_operation(void) 11009 { 11010 struct crypto_testsuite_params *ts_params = &testsuite_params; 11011 struct crypto_unittest_params *ut_params = &unittest_params; 11012 11013 unsigned i, burst_len = NULL_BURST_LENGTH; 11014 11015 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 11016 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 11017 11018 /* This test is for NULL PMD only */ 11019 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11020 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11021 return TEST_SKIPPED; 11022 11023 /* Setup Cipher Parameters */ 11024 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11025 ut_params->cipher_xform.next = &ut_params->auth_xform; 11026 11027 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 11028 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11029 11030 /* Setup HMAC Parameters */ 11031 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11032 ut_params->auth_xform.next = NULL; 11033 11034 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 11035 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11036 11037 ut_params->sess = rte_cryptodev_sym_session_create( 11038 ts_params->session_mpool); 11039 11040 /* Create Crypto session*/ 11041 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11042 ut_params->sess, &ut_params->cipher_xform, 11043 ts_params->session_priv_mpool); 11044 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11045 11046 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 11047 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 11048 burst_len, "failed to generate burst of crypto ops"); 11049 11050 /* Generate an operation for each mbuf in burst */ 11051 for (i = 0; i < burst_len; i++) { 11052 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11053 11054 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 11055 11056 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 11057 sizeof(unsigned)); 11058 *data = i; 11059 11060 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 11061 11062 burst[i]->sym->m_src = m; 11063 } 11064 11065 /* Process crypto operation */ 11066 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 11067 0, burst, burst_len), 11068 burst_len, 11069 "Error enqueuing burst"); 11070 11071 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 11072 0, burst_dequeued, burst_len), 11073 burst_len, 11074 "Error dequeuing burst"); 11075 11076 11077 for (i = 0; i < burst_len; i++) { 11078 TEST_ASSERT_EQUAL( 11079 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 11080 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 11081 uint32_t *), 11082 "data not as expected"); 11083 11084 rte_pktmbuf_free(burst[i]->sym->m_src); 11085 rte_crypto_op_free(burst[i]); 11086 } 11087 11088 return TEST_SUCCESS; 11089 } 11090 11091 static uint16_t 11092 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11093 uint16_t nb_ops, void *user_param) 11094 { 11095 RTE_SET_USED(dev_id); 11096 RTE_SET_USED(qp_id); 11097 RTE_SET_USED(ops); 11098 RTE_SET_USED(user_param); 11099 11100 printf("crypto enqueue callback called\n"); 11101 return nb_ops; 11102 } 11103 11104 static uint16_t 11105 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11106 uint16_t nb_ops, void *user_param) 11107 { 11108 RTE_SET_USED(dev_id); 11109 RTE_SET_USED(qp_id); 11110 RTE_SET_USED(ops); 11111 RTE_SET_USED(user_param); 11112 11113 printf("crypto dequeue callback called\n"); 11114 return nb_ops; 11115 } 11116 11117 /* 11118 * Thread using enqueue/dequeue callback with RCU. 11119 */ 11120 static int 11121 test_enqdeq_callback_thread(void *arg) 11122 { 11123 RTE_SET_USED(arg); 11124 /* DP thread calls rte_cryptodev_enqueue_burst()/ 11125 * rte_cryptodev_dequeue_burst() and invokes callback. 11126 */ 11127 test_null_burst_operation(); 11128 return 0; 11129 } 11130 11131 static int 11132 test_enq_callback_setup(void) 11133 { 11134 struct crypto_testsuite_params *ts_params = &testsuite_params; 11135 struct rte_cryptodev_info dev_info; 11136 struct rte_cryptodev_qp_conf qp_conf = { 11137 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11138 }; 11139 11140 struct rte_cryptodev_cb *cb; 11141 uint16_t qp_id = 0; 11142 11143 /* Stop the device in case it's started so it can be configured */ 11144 rte_cryptodev_stop(ts_params->valid_devs[0]); 11145 11146 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11147 11148 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11149 &ts_params->conf), 11150 "Failed to configure cryptodev %u", 11151 ts_params->valid_devs[0]); 11152 11153 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11154 qp_conf.mp_session = ts_params->session_mpool; 11155 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11156 11157 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11158 ts_params->valid_devs[0], qp_id, &qp_conf, 11159 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11160 "Failed test for " 11161 "rte_cryptodev_queue_pair_setup: num_inflights " 11162 "%u on qp %u on cryptodev %u", 11163 qp_conf.nb_descriptors, qp_id, 11164 ts_params->valid_devs[0]); 11165 11166 /* Test with invalid crypto device */ 11167 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS, 11168 qp_id, test_enq_callback, NULL); 11169 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11170 "cryptodev %u did not fail", 11171 qp_id, RTE_CRYPTO_MAX_DEVS); 11172 11173 /* Test with invalid queue pair */ 11174 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11175 dev_info.max_nb_queue_pairs + 1, 11176 test_enq_callback, NULL); 11177 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11178 "cryptodev %u did not fail", 11179 dev_info.max_nb_queue_pairs + 1, 11180 ts_params->valid_devs[0]); 11181 11182 /* Test with NULL callback */ 11183 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11184 qp_id, NULL, NULL); 11185 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11186 "cryptodev %u did not fail", 11187 qp_id, ts_params->valid_devs[0]); 11188 11189 /* Test with valid configuration */ 11190 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11191 qp_id, test_enq_callback, NULL); 11192 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11193 "qp %u on cryptodev %u", 11194 qp_id, ts_params->valid_devs[0]); 11195 11196 rte_cryptodev_start(ts_params->valid_devs[0]); 11197 11198 /* Launch a thread */ 11199 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11200 rte_get_next_lcore(-1, 1, 0)); 11201 11202 /* Wait until reader exited. */ 11203 rte_eal_mp_wait_lcore(); 11204 11205 /* Test with invalid crypto device */ 11206 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11207 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11208 "Expected call to fail as crypto device is invalid"); 11209 11210 /* Test with invalid queue pair */ 11211 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11212 ts_params->valid_devs[0], 11213 dev_info.max_nb_queue_pairs + 1, cb), 11214 "Expected call to fail as queue pair is invalid"); 11215 11216 /* Test with NULL callback */ 11217 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11218 ts_params->valid_devs[0], qp_id, NULL), 11219 "Expected call to fail as callback is NULL"); 11220 11221 /* Test with valid configuration */ 11222 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback( 11223 ts_params->valid_devs[0], qp_id, cb), 11224 "Failed test to remove callback on " 11225 "qp %u on cryptodev %u", 11226 qp_id, ts_params->valid_devs[0]); 11227 11228 return TEST_SUCCESS; 11229 } 11230 11231 static int 11232 test_deq_callback_setup(void) 11233 { 11234 struct crypto_testsuite_params *ts_params = &testsuite_params; 11235 struct rte_cryptodev_info dev_info; 11236 struct rte_cryptodev_qp_conf qp_conf = { 11237 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11238 }; 11239 11240 struct rte_cryptodev_cb *cb; 11241 uint16_t qp_id = 0; 11242 11243 /* Stop the device in case it's started so it can be configured */ 11244 rte_cryptodev_stop(ts_params->valid_devs[0]); 11245 11246 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11247 11248 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11249 &ts_params->conf), 11250 "Failed to configure cryptodev %u", 11251 ts_params->valid_devs[0]); 11252 11253 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11254 qp_conf.mp_session = ts_params->session_mpool; 11255 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11256 11257 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11258 ts_params->valid_devs[0], qp_id, &qp_conf, 11259 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11260 "Failed test for " 11261 "rte_cryptodev_queue_pair_setup: num_inflights " 11262 "%u on qp %u on cryptodev %u", 11263 qp_conf.nb_descriptors, qp_id, 11264 ts_params->valid_devs[0]); 11265 11266 /* Test with invalid crypto device */ 11267 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS, 11268 qp_id, test_deq_callback, NULL); 11269 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11270 "cryptodev %u did not fail", 11271 qp_id, RTE_CRYPTO_MAX_DEVS); 11272 11273 /* Test with invalid queue pair */ 11274 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11275 dev_info.max_nb_queue_pairs + 1, 11276 test_deq_callback, NULL); 11277 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11278 "cryptodev %u did not fail", 11279 dev_info.max_nb_queue_pairs + 1, 11280 ts_params->valid_devs[0]); 11281 11282 /* Test with NULL callback */ 11283 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11284 qp_id, NULL, NULL); 11285 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11286 "cryptodev %u did not fail", 11287 qp_id, ts_params->valid_devs[0]); 11288 11289 /* Test with valid configuration */ 11290 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11291 qp_id, test_deq_callback, NULL); 11292 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11293 "qp %u on cryptodev %u", 11294 qp_id, ts_params->valid_devs[0]); 11295 11296 rte_cryptodev_start(ts_params->valid_devs[0]); 11297 11298 /* Launch a thread */ 11299 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11300 rte_get_next_lcore(-1, 1, 0)); 11301 11302 /* Wait until reader exited. */ 11303 rte_eal_mp_wait_lcore(); 11304 11305 /* Test with invalid crypto device */ 11306 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11307 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11308 "Expected call to fail as crypto device is invalid"); 11309 11310 /* Test with invalid queue pair */ 11311 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11312 ts_params->valid_devs[0], 11313 dev_info.max_nb_queue_pairs + 1, cb), 11314 "Expected call to fail as queue pair is invalid"); 11315 11316 /* Test with NULL callback */ 11317 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11318 ts_params->valid_devs[0], qp_id, NULL), 11319 "Expected call to fail as callback is NULL"); 11320 11321 /* Test with valid configuration */ 11322 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback( 11323 ts_params->valid_devs[0], qp_id, cb), 11324 "Failed test to remove callback on " 11325 "qp %u on cryptodev %u", 11326 qp_id, ts_params->valid_devs[0]); 11327 11328 return TEST_SUCCESS; 11329 } 11330 11331 static void 11332 generate_gmac_large_plaintext(uint8_t *data) 11333 { 11334 uint16_t i; 11335 11336 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 11337 memcpy(&data[i], &data[0], 32); 11338 } 11339 11340 static int 11341 create_gmac_operation(enum rte_crypto_auth_operation op, 11342 const struct gmac_test_data *tdata) 11343 { 11344 struct crypto_testsuite_params *ts_params = &testsuite_params; 11345 struct crypto_unittest_params *ut_params = &unittest_params; 11346 struct rte_crypto_sym_op *sym_op; 11347 11348 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11349 11350 /* Generate Crypto op data structure */ 11351 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11352 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11353 TEST_ASSERT_NOT_NULL(ut_params->op, 11354 "Failed to allocate symmetric crypto operation struct"); 11355 11356 sym_op = ut_params->op->sym; 11357 11358 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11359 ut_params->ibuf, tdata->gmac_tag.len); 11360 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11361 "no room to append digest"); 11362 11363 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11364 ut_params->ibuf, plaintext_pad_len); 11365 11366 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11367 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11368 tdata->gmac_tag.len); 11369 debug_hexdump(stdout, "digest:", 11370 sym_op->auth.digest.data, 11371 tdata->gmac_tag.len); 11372 } 11373 11374 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11375 uint8_t *, IV_OFFSET); 11376 11377 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11378 11379 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11380 11381 sym_op->cipher.data.length = 0; 11382 sym_op->cipher.data.offset = 0; 11383 11384 sym_op->auth.data.offset = 0; 11385 sym_op->auth.data.length = tdata->plaintext.len; 11386 11387 return 0; 11388 } 11389 11390 static int 11391 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 11392 const struct gmac_test_data *tdata, 11393 void *digest_mem, uint64_t digest_phys) 11394 { 11395 struct crypto_testsuite_params *ts_params = &testsuite_params; 11396 struct crypto_unittest_params *ut_params = &unittest_params; 11397 struct rte_crypto_sym_op *sym_op; 11398 11399 /* Generate Crypto op data structure */ 11400 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11401 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11402 TEST_ASSERT_NOT_NULL(ut_params->op, 11403 "Failed to allocate symmetric crypto operation struct"); 11404 11405 sym_op = ut_params->op->sym; 11406 11407 sym_op->auth.digest.data = digest_mem; 11408 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11409 "no room to append digest"); 11410 11411 sym_op->auth.digest.phys_addr = digest_phys; 11412 11413 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11414 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11415 tdata->gmac_tag.len); 11416 debug_hexdump(stdout, "digest:", 11417 sym_op->auth.digest.data, 11418 tdata->gmac_tag.len); 11419 } 11420 11421 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11422 uint8_t *, IV_OFFSET); 11423 11424 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11425 11426 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11427 11428 sym_op->cipher.data.length = 0; 11429 sym_op->cipher.data.offset = 0; 11430 11431 sym_op->auth.data.offset = 0; 11432 sym_op->auth.data.length = tdata->plaintext.len; 11433 11434 return 0; 11435 } 11436 11437 static int create_gmac_session(uint8_t dev_id, 11438 const struct gmac_test_data *tdata, 11439 enum rte_crypto_auth_operation auth_op) 11440 { 11441 uint8_t auth_key[tdata->key.len]; 11442 11443 struct crypto_testsuite_params *ts_params = &testsuite_params; 11444 struct crypto_unittest_params *ut_params = &unittest_params; 11445 11446 memcpy(auth_key, tdata->key.data, tdata->key.len); 11447 11448 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11449 ut_params->auth_xform.next = NULL; 11450 11451 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 11452 ut_params->auth_xform.auth.op = auth_op; 11453 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 11454 ut_params->auth_xform.auth.key.length = tdata->key.len; 11455 ut_params->auth_xform.auth.key.data = auth_key; 11456 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 11457 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 11458 11459 11460 ut_params->sess = rte_cryptodev_sym_session_create( 11461 ts_params->session_mpool); 11462 11463 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 11464 &ut_params->auth_xform, 11465 ts_params->session_priv_mpool); 11466 11467 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11468 11469 return 0; 11470 } 11471 11472 static int 11473 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 11474 { 11475 struct crypto_testsuite_params *ts_params = &testsuite_params; 11476 struct crypto_unittest_params *ut_params = &unittest_params; 11477 struct rte_cryptodev_info dev_info; 11478 11479 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11480 uint64_t feat_flags = dev_info.feature_flags; 11481 11482 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11483 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11484 printf("Device doesn't support RAW data-path APIs.\n"); 11485 return TEST_SKIPPED; 11486 } 11487 11488 int retval; 11489 11490 uint8_t *auth_tag, *plaintext; 11491 uint16_t plaintext_pad_len; 11492 11493 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11494 "No GMAC length in the source data"); 11495 11496 /* Verify the capabilities */ 11497 struct rte_cryptodev_sym_capability_idx cap_idx; 11498 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11499 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11500 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11501 &cap_idx) == NULL) 11502 return TEST_SKIPPED; 11503 11504 retval = create_gmac_session(ts_params->valid_devs[0], 11505 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11506 11507 if (retval < 0) 11508 return retval; 11509 11510 if (tdata->plaintext.len > MBUF_SIZE) 11511 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11512 else 11513 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11514 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11515 "Failed to allocate input buffer in mempool"); 11516 11517 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11518 rte_pktmbuf_tailroom(ut_params->ibuf)); 11519 11520 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11521 /* 11522 * Runtime generate the large plain text instead of use hard code 11523 * plain text vector. It is done to avoid create huge source file 11524 * with the test vector. 11525 */ 11526 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11527 generate_gmac_large_plaintext(tdata->plaintext.data); 11528 11529 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11530 plaintext_pad_len); 11531 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11532 11533 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11534 debug_hexdump(stdout, "plaintext:", plaintext, 11535 tdata->plaintext.len); 11536 11537 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 11538 tdata); 11539 11540 if (retval < 0) 11541 return retval; 11542 11543 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11544 11545 ut_params->op->sym->m_src = ut_params->ibuf; 11546 11547 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11548 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11549 ut_params->op); 11550 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11551 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11552 ut_params->op, 0, 1, 0, 0); 11553 else 11554 TEST_ASSERT_NOT_NULL( 11555 process_crypto_request(ts_params->valid_devs[0], 11556 ut_params->op), "failed to process sym crypto op"); 11557 11558 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11559 "crypto op processing failed"); 11560 11561 if (ut_params->op->sym->m_dst) { 11562 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11563 uint8_t *, plaintext_pad_len); 11564 } else { 11565 auth_tag = plaintext + plaintext_pad_len; 11566 } 11567 11568 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11569 11570 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11571 auth_tag, 11572 tdata->gmac_tag.data, 11573 tdata->gmac_tag.len, 11574 "GMAC Generated auth tag not as expected"); 11575 11576 return 0; 11577 } 11578 11579 static int 11580 test_AES_GMAC_authentication_test_case_1(void) 11581 { 11582 return test_AES_GMAC_authentication(&gmac_test_case_1); 11583 } 11584 11585 static int 11586 test_AES_GMAC_authentication_test_case_2(void) 11587 { 11588 return test_AES_GMAC_authentication(&gmac_test_case_2); 11589 } 11590 11591 static int 11592 test_AES_GMAC_authentication_test_case_3(void) 11593 { 11594 return test_AES_GMAC_authentication(&gmac_test_case_3); 11595 } 11596 11597 static int 11598 test_AES_GMAC_authentication_test_case_4(void) 11599 { 11600 return test_AES_GMAC_authentication(&gmac_test_case_4); 11601 } 11602 11603 static int 11604 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 11605 { 11606 struct crypto_testsuite_params *ts_params = &testsuite_params; 11607 struct crypto_unittest_params *ut_params = &unittest_params; 11608 int retval; 11609 uint32_t plaintext_pad_len; 11610 uint8_t *plaintext; 11611 struct rte_cryptodev_info dev_info; 11612 11613 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11614 uint64_t feat_flags = dev_info.feature_flags; 11615 11616 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11617 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11618 printf("Device doesn't support RAW data-path APIs.\n"); 11619 return TEST_SKIPPED; 11620 } 11621 11622 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11623 "No GMAC length in the source data"); 11624 11625 /* Verify the capabilities */ 11626 struct rte_cryptodev_sym_capability_idx cap_idx; 11627 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11628 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11629 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11630 &cap_idx) == NULL) 11631 return TEST_SKIPPED; 11632 11633 retval = create_gmac_session(ts_params->valid_devs[0], 11634 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 11635 11636 if (retval < 0) 11637 return retval; 11638 11639 if (tdata->plaintext.len > MBUF_SIZE) 11640 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11641 else 11642 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11643 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11644 "Failed to allocate input buffer in mempool"); 11645 11646 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11647 rte_pktmbuf_tailroom(ut_params->ibuf)); 11648 11649 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11650 11651 /* 11652 * Runtime generate the large plain text instead of use hard code 11653 * plain text vector. It is done to avoid create huge source file 11654 * with the test vector. 11655 */ 11656 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11657 generate_gmac_large_plaintext(tdata->plaintext.data); 11658 11659 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11660 plaintext_pad_len); 11661 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11662 11663 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11664 debug_hexdump(stdout, "plaintext:", plaintext, 11665 tdata->plaintext.len); 11666 11667 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 11668 tdata); 11669 11670 if (retval < 0) 11671 return retval; 11672 11673 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11674 11675 ut_params->op->sym->m_src = ut_params->ibuf; 11676 11677 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11678 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11679 ut_params->op); 11680 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11681 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11682 ut_params->op, 0, 1, 0, 0); 11683 else 11684 TEST_ASSERT_NOT_NULL( 11685 process_crypto_request(ts_params->valid_devs[0], 11686 ut_params->op), "failed to process sym crypto op"); 11687 11688 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11689 "crypto op processing failed"); 11690 11691 return 0; 11692 11693 } 11694 11695 static int 11696 test_AES_GMAC_authentication_verify_test_case_1(void) 11697 { 11698 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 11699 } 11700 11701 static int 11702 test_AES_GMAC_authentication_verify_test_case_2(void) 11703 { 11704 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 11705 } 11706 11707 static int 11708 test_AES_GMAC_authentication_verify_test_case_3(void) 11709 { 11710 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 11711 } 11712 11713 static int 11714 test_AES_GMAC_authentication_verify_test_case_4(void) 11715 { 11716 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 11717 } 11718 11719 static int 11720 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 11721 uint32_t fragsz) 11722 { 11723 struct crypto_testsuite_params *ts_params = &testsuite_params; 11724 struct crypto_unittest_params *ut_params = &unittest_params; 11725 struct rte_cryptodev_info dev_info; 11726 uint64_t feature_flags; 11727 unsigned int trn_data = 0; 11728 void *digest_mem = NULL; 11729 uint32_t segs = 1; 11730 unsigned int to_trn = 0; 11731 struct rte_mbuf *buf = NULL; 11732 uint8_t *auth_tag, *plaintext; 11733 int retval; 11734 11735 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11736 "No GMAC length in the source data"); 11737 11738 /* Verify the capabilities */ 11739 struct rte_cryptodev_sym_capability_idx cap_idx; 11740 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11741 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11742 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11743 &cap_idx) == NULL) 11744 return TEST_SKIPPED; 11745 11746 /* Check for any input SGL support */ 11747 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11748 feature_flags = dev_info.feature_flags; 11749 11750 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 11751 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 11752 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 11753 return TEST_SKIPPED; 11754 11755 if (fragsz > tdata->plaintext.len) 11756 fragsz = tdata->plaintext.len; 11757 11758 uint16_t plaintext_len = fragsz; 11759 11760 retval = create_gmac_session(ts_params->valid_devs[0], 11761 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11762 11763 if (retval < 0) 11764 return retval; 11765 11766 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11767 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11768 "Failed to allocate input buffer in mempool"); 11769 11770 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11771 rte_pktmbuf_tailroom(ut_params->ibuf)); 11772 11773 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11774 plaintext_len); 11775 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11776 11777 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 11778 11779 trn_data += plaintext_len; 11780 11781 buf = ut_params->ibuf; 11782 11783 /* 11784 * Loop until no more fragments 11785 */ 11786 11787 while (trn_data < tdata->plaintext.len) { 11788 ++segs; 11789 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 11790 (tdata->plaintext.len - trn_data) : fragsz; 11791 11792 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11793 buf = buf->next; 11794 11795 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 11796 rte_pktmbuf_tailroom(buf)); 11797 11798 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 11799 to_trn); 11800 11801 memcpy(plaintext, tdata->plaintext.data + trn_data, 11802 to_trn); 11803 trn_data += to_trn; 11804 if (trn_data == tdata->plaintext.len) 11805 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 11806 tdata->gmac_tag.len); 11807 } 11808 ut_params->ibuf->nb_segs = segs; 11809 11810 /* 11811 * Place digest at the end of the last buffer 11812 */ 11813 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 11814 11815 if (!digest_mem) { 11816 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11817 + tdata->gmac_tag.len); 11818 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 11819 tdata->plaintext.len); 11820 } 11821 11822 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 11823 tdata, digest_mem, digest_phys); 11824 11825 if (retval < 0) 11826 return retval; 11827 11828 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11829 11830 ut_params->op->sym->m_src = ut_params->ibuf; 11831 11832 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11833 return TEST_SKIPPED; 11834 11835 TEST_ASSERT_NOT_NULL( 11836 process_crypto_request(ts_params->valid_devs[0], 11837 ut_params->op), "failed to process sym crypto op"); 11838 11839 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11840 "crypto op processing failed"); 11841 11842 auth_tag = digest_mem; 11843 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11844 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11845 auth_tag, 11846 tdata->gmac_tag.data, 11847 tdata->gmac_tag.len, 11848 "GMAC Generated auth tag not as expected"); 11849 11850 return 0; 11851 } 11852 11853 /* Segment size not multiple of block size (16B) */ 11854 static int 11855 test_AES_GMAC_authentication_SGL_40B(void) 11856 { 11857 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 11858 } 11859 11860 static int 11861 test_AES_GMAC_authentication_SGL_80B(void) 11862 { 11863 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 11864 } 11865 11866 static int 11867 test_AES_GMAC_authentication_SGL_2048B(void) 11868 { 11869 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 11870 } 11871 11872 /* Segment size not multiple of block size (16B) */ 11873 static int 11874 test_AES_GMAC_authentication_SGL_2047B(void) 11875 { 11876 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 11877 } 11878 11879 struct test_crypto_vector { 11880 enum rte_crypto_cipher_algorithm crypto_algo; 11881 unsigned int cipher_offset; 11882 unsigned int cipher_len; 11883 11884 struct { 11885 uint8_t data[64]; 11886 unsigned int len; 11887 } cipher_key; 11888 11889 struct { 11890 uint8_t data[64]; 11891 unsigned int len; 11892 } iv; 11893 11894 struct { 11895 const uint8_t *data; 11896 unsigned int len; 11897 } plaintext; 11898 11899 struct { 11900 const uint8_t *data; 11901 unsigned int len; 11902 } ciphertext; 11903 11904 enum rte_crypto_auth_algorithm auth_algo; 11905 unsigned int auth_offset; 11906 11907 struct { 11908 uint8_t data[128]; 11909 unsigned int len; 11910 } auth_key; 11911 11912 struct { 11913 const uint8_t *data; 11914 unsigned int len; 11915 } aad; 11916 11917 struct { 11918 uint8_t data[128]; 11919 unsigned int len; 11920 } digest; 11921 }; 11922 11923 static const struct test_crypto_vector 11924 hmac_sha1_test_crypto_vector = { 11925 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 11926 .plaintext = { 11927 .data = plaintext_hash, 11928 .len = 512 11929 }, 11930 .auth_key = { 11931 .data = { 11932 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 11933 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 11934 0xDE, 0xF4, 0xDE, 0xAD 11935 }, 11936 .len = 20 11937 }, 11938 .digest = { 11939 .data = { 11940 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 11941 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 11942 0x3F, 0x91, 0x64, 0x59 11943 }, 11944 .len = 20 11945 } 11946 }; 11947 11948 static const struct test_crypto_vector 11949 aes128_gmac_test_vector = { 11950 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 11951 .plaintext = { 11952 .data = plaintext_hash, 11953 .len = 512 11954 }, 11955 .iv = { 11956 .data = { 11957 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11958 0x08, 0x09, 0x0A, 0x0B 11959 }, 11960 .len = 12 11961 }, 11962 .auth_key = { 11963 .data = { 11964 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 11965 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 11966 }, 11967 .len = 16 11968 }, 11969 .digest = { 11970 .data = { 11971 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 11972 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 11973 }, 11974 .len = 16 11975 } 11976 }; 11977 11978 static const struct test_crypto_vector 11979 aes128cbc_hmac_sha1_test_vector = { 11980 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 11981 .cipher_offset = 0, 11982 .cipher_len = 512, 11983 .cipher_key = { 11984 .data = { 11985 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 11986 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 11987 }, 11988 .len = 16 11989 }, 11990 .iv = { 11991 .data = { 11992 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11993 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 11994 }, 11995 .len = 16 11996 }, 11997 .plaintext = { 11998 .data = plaintext_hash, 11999 .len = 512 12000 }, 12001 .ciphertext = { 12002 .data = ciphertext512_aes128cbc, 12003 .len = 512 12004 }, 12005 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12006 .auth_offset = 0, 12007 .auth_key = { 12008 .data = { 12009 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12010 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12011 0xDE, 0xF4, 0xDE, 0xAD 12012 }, 12013 .len = 20 12014 }, 12015 .digest = { 12016 .data = { 12017 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 12018 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12019 0x18, 0x8C, 0x1D, 0x32 12020 }, 12021 .len = 20 12022 } 12023 }; 12024 12025 static const struct test_crypto_vector 12026 aes128cbc_hmac_sha1_aad_test_vector = { 12027 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12028 .cipher_offset = 8, 12029 .cipher_len = 496, 12030 .cipher_key = { 12031 .data = { 12032 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12033 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12034 }, 12035 .len = 16 12036 }, 12037 .iv = { 12038 .data = { 12039 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12040 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12041 }, 12042 .len = 16 12043 }, 12044 .plaintext = { 12045 .data = plaintext_hash, 12046 .len = 512 12047 }, 12048 .ciphertext = { 12049 .data = ciphertext512_aes128cbc_aad, 12050 .len = 512 12051 }, 12052 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12053 .auth_offset = 0, 12054 .auth_key = { 12055 .data = { 12056 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12057 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12058 0xDE, 0xF4, 0xDE, 0xAD 12059 }, 12060 .len = 20 12061 }, 12062 .digest = { 12063 .data = { 12064 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 12065 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 12066 0x62, 0x0F, 0xFB, 0x10 12067 }, 12068 .len = 20 12069 } 12070 }; 12071 12072 static void 12073 data_corruption(uint8_t *data) 12074 { 12075 data[0] += 1; 12076 } 12077 12078 static void 12079 tag_corruption(uint8_t *data, unsigned int tag_offset) 12080 { 12081 data[tag_offset] += 1; 12082 } 12083 12084 static int 12085 create_auth_session(struct crypto_unittest_params *ut_params, 12086 uint8_t dev_id, 12087 const struct test_crypto_vector *reference, 12088 enum rte_crypto_auth_operation auth_op) 12089 { 12090 struct crypto_testsuite_params *ts_params = &testsuite_params; 12091 uint8_t auth_key[reference->auth_key.len + 1]; 12092 12093 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12094 12095 /* Setup Authentication Parameters */ 12096 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12097 ut_params->auth_xform.auth.op = auth_op; 12098 ut_params->auth_xform.next = NULL; 12099 ut_params->auth_xform.auth.algo = reference->auth_algo; 12100 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12101 ut_params->auth_xform.auth.key.data = auth_key; 12102 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12103 12104 /* Create Crypto session*/ 12105 ut_params->sess = rte_cryptodev_sym_session_create( 12106 ts_params->session_mpool); 12107 12108 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12109 &ut_params->auth_xform, 12110 ts_params->session_priv_mpool); 12111 12112 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12113 12114 return 0; 12115 } 12116 12117 static int 12118 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 12119 uint8_t dev_id, 12120 const struct test_crypto_vector *reference, 12121 enum rte_crypto_auth_operation auth_op, 12122 enum rte_crypto_cipher_operation cipher_op) 12123 { 12124 struct crypto_testsuite_params *ts_params = &testsuite_params; 12125 uint8_t cipher_key[reference->cipher_key.len + 1]; 12126 uint8_t auth_key[reference->auth_key.len + 1]; 12127 12128 memcpy(cipher_key, reference->cipher_key.data, 12129 reference->cipher_key.len); 12130 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12131 12132 /* Setup Authentication Parameters */ 12133 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12134 ut_params->auth_xform.auth.op = auth_op; 12135 ut_params->auth_xform.auth.algo = reference->auth_algo; 12136 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12137 ut_params->auth_xform.auth.key.data = auth_key; 12138 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12139 12140 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 12141 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 12142 ut_params->auth_xform.auth.iv.length = reference->iv.len; 12143 } else { 12144 ut_params->auth_xform.next = &ut_params->cipher_xform; 12145 12146 /* Setup Cipher Parameters */ 12147 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12148 ut_params->cipher_xform.next = NULL; 12149 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12150 ut_params->cipher_xform.cipher.op = cipher_op; 12151 ut_params->cipher_xform.cipher.key.data = cipher_key; 12152 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12153 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12154 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12155 } 12156 12157 /* Create Crypto session*/ 12158 ut_params->sess = rte_cryptodev_sym_session_create( 12159 ts_params->session_mpool); 12160 12161 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12162 &ut_params->auth_xform, 12163 ts_params->session_priv_mpool); 12164 12165 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12166 12167 return 0; 12168 } 12169 12170 static int 12171 create_auth_operation(struct crypto_testsuite_params *ts_params, 12172 struct crypto_unittest_params *ut_params, 12173 const struct test_crypto_vector *reference, 12174 unsigned int auth_generate) 12175 { 12176 /* Generate Crypto op data structure */ 12177 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12178 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12179 TEST_ASSERT_NOT_NULL(ut_params->op, 12180 "Failed to allocate pktmbuf offload"); 12181 12182 /* Set crypto operation data parameters */ 12183 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12184 12185 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12186 12187 /* set crypto operation source mbuf */ 12188 sym_op->m_src = ut_params->ibuf; 12189 12190 /* digest */ 12191 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12192 ut_params->ibuf, reference->digest.len); 12193 12194 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12195 "no room to append auth tag"); 12196 12197 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12198 ut_params->ibuf, reference->plaintext.len); 12199 12200 if (auth_generate) 12201 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12202 else 12203 memcpy(sym_op->auth.digest.data, 12204 reference->digest.data, 12205 reference->digest.len); 12206 12207 debug_hexdump(stdout, "digest:", 12208 sym_op->auth.digest.data, 12209 reference->digest.len); 12210 12211 sym_op->auth.data.length = reference->plaintext.len; 12212 sym_op->auth.data.offset = 0; 12213 12214 return 0; 12215 } 12216 12217 static int 12218 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 12219 struct crypto_unittest_params *ut_params, 12220 const struct test_crypto_vector *reference, 12221 unsigned int auth_generate) 12222 { 12223 /* Generate Crypto op data structure */ 12224 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12225 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12226 TEST_ASSERT_NOT_NULL(ut_params->op, 12227 "Failed to allocate pktmbuf offload"); 12228 12229 /* Set crypto operation data parameters */ 12230 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12231 12232 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12233 12234 /* set crypto operation source mbuf */ 12235 sym_op->m_src = ut_params->ibuf; 12236 12237 /* digest */ 12238 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12239 ut_params->ibuf, reference->digest.len); 12240 12241 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12242 "no room to append auth tag"); 12243 12244 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12245 ut_params->ibuf, reference->ciphertext.len); 12246 12247 if (auth_generate) 12248 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12249 else 12250 memcpy(sym_op->auth.digest.data, 12251 reference->digest.data, 12252 reference->digest.len); 12253 12254 debug_hexdump(stdout, "digest:", 12255 sym_op->auth.digest.data, 12256 reference->digest.len); 12257 12258 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12259 reference->iv.data, reference->iv.len); 12260 12261 sym_op->cipher.data.length = 0; 12262 sym_op->cipher.data.offset = 0; 12263 12264 sym_op->auth.data.length = reference->plaintext.len; 12265 sym_op->auth.data.offset = 0; 12266 12267 return 0; 12268 } 12269 12270 static int 12271 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 12272 struct crypto_unittest_params *ut_params, 12273 const struct test_crypto_vector *reference, 12274 unsigned int auth_generate) 12275 { 12276 /* Generate Crypto op data structure */ 12277 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12278 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12279 TEST_ASSERT_NOT_NULL(ut_params->op, 12280 "Failed to allocate pktmbuf offload"); 12281 12282 /* Set crypto operation data parameters */ 12283 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12284 12285 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12286 12287 /* set crypto operation source mbuf */ 12288 sym_op->m_src = ut_params->ibuf; 12289 12290 /* digest */ 12291 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12292 ut_params->ibuf, reference->digest.len); 12293 12294 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12295 "no room to append auth tag"); 12296 12297 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12298 ut_params->ibuf, reference->ciphertext.len); 12299 12300 if (auth_generate) 12301 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12302 else 12303 memcpy(sym_op->auth.digest.data, 12304 reference->digest.data, 12305 reference->digest.len); 12306 12307 debug_hexdump(stdout, "digest:", 12308 sym_op->auth.digest.data, 12309 reference->digest.len); 12310 12311 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12312 reference->iv.data, reference->iv.len); 12313 12314 sym_op->cipher.data.length = reference->cipher_len; 12315 sym_op->cipher.data.offset = reference->cipher_offset; 12316 12317 sym_op->auth.data.length = reference->plaintext.len; 12318 sym_op->auth.data.offset = reference->auth_offset; 12319 12320 return 0; 12321 } 12322 12323 static int 12324 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12325 struct crypto_unittest_params *ut_params, 12326 const struct test_crypto_vector *reference) 12327 { 12328 return create_auth_operation(ts_params, ut_params, reference, 0); 12329 } 12330 12331 static int 12332 create_auth_verify_GMAC_operation( 12333 struct crypto_testsuite_params *ts_params, 12334 struct crypto_unittest_params *ut_params, 12335 const struct test_crypto_vector *reference) 12336 { 12337 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 12338 } 12339 12340 static int 12341 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12342 struct crypto_unittest_params *ut_params, 12343 const struct test_crypto_vector *reference) 12344 { 12345 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 12346 } 12347 12348 static int 12349 test_authentication_verify_fail_when_data_corruption( 12350 struct crypto_testsuite_params *ts_params, 12351 struct crypto_unittest_params *ut_params, 12352 const struct test_crypto_vector *reference, 12353 unsigned int data_corrupted) 12354 { 12355 int retval; 12356 12357 uint8_t *plaintext; 12358 struct rte_cryptodev_info dev_info; 12359 12360 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12361 uint64_t feat_flags = dev_info.feature_flags; 12362 12363 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12364 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12365 printf("Device doesn't support RAW data-path APIs.\n"); 12366 return TEST_SKIPPED; 12367 } 12368 12369 /* Verify the capabilities */ 12370 struct rte_cryptodev_sym_capability_idx cap_idx; 12371 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12372 cap_idx.algo.auth = reference->auth_algo; 12373 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12374 &cap_idx) == NULL) 12375 return TEST_SKIPPED; 12376 12377 12378 /* Create session */ 12379 retval = create_auth_session(ut_params, 12380 ts_params->valid_devs[0], 12381 reference, 12382 RTE_CRYPTO_AUTH_OP_VERIFY); 12383 if (retval < 0) 12384 return retval; 12385 12386 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12387 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12388 "Failed to allocate input buffer in mempool"); 12389 12390 /* clear mbuf payload */ 12391 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12392 rte_pktmbuf_tailroom(ut_params->ibuf)); 12393 12394 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12395 reference->plaintext.len); 12396 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12397 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12398 12399 debug_hexdump(stdout, "plaintext:", plaintext, 12400 reference->plaintext.len); 12401 12402 /* Create operation */ 12403 retval = create_auth_verify_operation(ts_params, ut_params, reference); 12404 12405 if (retval < 0) 12406 return retval; 12407 12408 if (data_corrupted) 12409 data_corruption(plaintext); 12410 else 12411 tag_corruption(plaintext, reference->plaintext.len); 12412 12413 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12414 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12415 ut_params->op); 12416 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12417 RTE_CRYPTO_OP_STATUS_SUCCESS, 12418 "authentication not failed"); 12419 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12420 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12421 ut_params->op, 0, 1, 0, 0); 12422 else { 12423 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12424 ut_params->op); 12425 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12426 } 12427 12428 return 0; 12429 } 12430 12431 static int 12432 test_authentication_verify_GMAC_fail_when_corruption( 12433 struct crypto_testsuite_params *ts_params, 12434 struct crypto_unittest_params *ut_params, 12435 const struct test_crypto_vector *reference, 12436 unsigned int data_corrupted) 12437 { 12438 int retval; 12439 uint8_t *plaintext; 12440 struct rte_cryptodev_info dev_info; 12441 12442 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12443 uint64_t feat_flags = dev_info.feature_flags; 12444 12445 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12446 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12447 printf("Device doesn't support RAW data-path APIs.\n"); 12448 return TEST_SKIPPED; 12449 } 12450 12451 /* Verify the capabilities */ 12452 struct rte_cryptodev_sym_capability_idx cap_idx; 12453 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12454 cap_idx.algo.auth = reference->auth_algo; 12455 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12456 &cap_idx) == NULL) 12457 return TEST_SKIPPED; 12458 12459 /* Create session */ 12460 retval = create_auth_cipher_session(ut_params, 12461 ts_params->valid_devs[0], 12462 reference, 12463 RTE_CRYPTO_AUTH_OP_VERIFY, 12464 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12465 if (retval < 0) 12466 return retval; 12467 12468 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12469 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12470 "Failed to allocate input buffer in mempool"); 12471 12472 /* clear mbuf payload */ 12473 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12474 rte_pktmbuf_tailroom(ut_params->ibuf)); 12475 12476 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12477 reference->plaintext.len); 12478 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12479 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12480 12481 debug_hexdump(stdout, "plaintext:", plaintext, 12482 reference->plaintext.len); 12483 12484 /* Create operation */ 12485 retval = create_auth_verify_GMAC_operation(ts_params, 12486 ut_params, 12487 reference); 12488 12489 if (retval < 0) 12490 return retval; 12491 12492 if (data_corrupted) 12493 data_corruption(plaintext); 12494 else 12495 tag_corruption(plaintext, reference->aad.len); 12496 12497 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12498 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12499 ut_params->op); 12500 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12501 RTE_CRYPTO_OP_STATUS_SUCCESS, 12502 "authentication not failed"); 12503 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12504 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12505 ut_params->op, 0, 1, 0, 0); 12506 else { 12507 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12508 ut_params->op); 12509 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12510 } 12511 12512 return 0; 12513 } 12514 12515 static int 12516 test_authenticated_decryption_fail_when_corruption( 12517 struct crypto_testsuite_params *ts_params, 12518 struct crypto_unittest_params *ut_params, 12519 const struct test_crypto_vector *reference, 12520 unsigned int data_corrupted) 12521 { 12522 int retval; 12523 12524 uint8_t *ciphertext; 12525 struct rte_cryptodev_info dev_info; 12526 12527 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12528 uint64_t feat_flags = dev_info.feature_flags; 12529 12530 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12531 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12532 printf("Device doesn't support RAW data-path APIs.\n"); 12533 return TEST_SKIPPED; 12534 } 12535 12536 /* Verify the capabilities */ 12537 struct rte_cryptodev_sym_capability_idx cap_idx; 12538 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12539 cap_idx.algo.auth = reference->auth_algo; 12540 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12541 &cap_idx) == NULL) 12542 return TEST_SKIPPED; 12543 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12544 cap_idx.algo.cipher = reference->crypto_algo; 12545 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12546 &cap_idx) == NULL) 12547 return TEST_SKIPPED; 12548 12549 /* Create session */ 12550 retval = create_auth_cipher_session(ut_params, 12551 ts_params->valid_devs[0], 12552 reference, 12553 RTE_CRYPTO_AUTH_OP_VERIFY, 12554 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12555 if (retval < 0) 12556 return retval; 12557 12558 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12559 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12560 "Failed to allocate input buffer in mempool"); 12561 12562 /* clear mbuf payload */ 12563 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12564 rte_pktmbuf_tailroom(ut_params->ibuf)); 12565 12566 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12567 reference->ciphertext.len); 12568 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12569 memcpy(ciphertext, reference->ciphertext.data, 12570 reference->ciphertext.len); 12571 12572 /* Create operation */ 12573 retval = create_cipher_auth_verify_operation(ts_params, 12574 ut_params, 12575 reference); 12576 12577 if (retval < 0) 12578 return retval; 12579 12580 if (data_corrupted) 12581 data_corruption(ciphertext); 12582 else 12583 tag_corruption(ciphertext, reference->ciphertext.len); 12584 12585 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12586 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12587 ut_params->op); 12588 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12589 RTE_CRYPTO_OP_STATUS_SUCCESS, 12590 "authentication not failed"); 12591 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12592 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12593 ut_params->op, 1, 1, 0, 0); 12594 else { 12595 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12596 ut_params->op); 12597 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12598 } 12599 12600 return 0; 12601 } 12602 12603 static int 12604 test_authenticated_encryt_with_esn( 12605 struct crypto_testsuite_params *ts_params, 12606 struct crypto_unittest_params *ut_params, 12607 const struct test_crypto_vector *reference) 12608 { 12609 int retval; 12610 12611 uint8_t *authciphertext, *plaintext, *auth_tag; 12612 uint16_t plaintext_pad_len; 12613 uint8_t cipher_key[reference->cipher_key.len + 1]; 12614 uint8_t auth_key[reference->auth_key.len + 1]; 12615 struct rte_cryptodev_info dev_info; 12616 12617 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12618 uint64_t feat_flags = dev_info.feature_flags; 12619 12620 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12621 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12622 printf("Device doesn't support RAW data-path APIs.\n"); 12623 return TEST_SKIPPED; 12624 } 12625 12626 /* Verify the capabilities */ 12627 struct rte_cryptodev_sym_capability_idx cap_idx; 12628 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12629 cap_idx.algo.auth = reference->auth_algo; 12630 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12631 &cap_idx) == NULL) 12632 return TEST_SKIPPED; 12633 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12634 cap_idx.algo.cipher = reference->crypto_algo; 12635 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12636 &cap_idx) == NULL) 12637 return TEST_SKIPPED; 12638 12639 /* Create session */ 12640 memcpy(cipher_key, reference->cipher_key.data, 12641 reference->cipher_key.len); 12642 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12643 12644 /* Setup Cipher Parameters */ 12645 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12646 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12647 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 12648 ut_params->cipher_xform.cipher.key.data = cipher_key; 12649 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12650 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12651 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12652 12653 ut_params->cipher_xform.next = &ut_params->auth_xform; 12654 12655 /* Setup Authentication Parameters */ 12656 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12657 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 12658 ut_params->auth_xform.auth.algo = reference->auth_algo; 12659 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12660 ut_params->auth_xform.auth.key.data = auth_key; 12661 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12662 ut_params->auth_xform.next = NULL; 12663 12664 /* Create Crypto session*/ 12665 ut_params->sess = rte_cryptodev_sym_session_create( 12666 ts_params->session_mpool); 12667 12668 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12669 ut_params->sess, 12670 &ut_params->cipher_xform, 12671 ts_params->session_priv_mpool); 12672 12673 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12674 12675 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12676 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12677 "Failed to allocate input buffer in mempool"); 12678 12679 /* clear mbuf payload */ 12680 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12681 rte_pktmbuf_tailroom(ut_params->ibuf)); 12682 12683 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12684 reference->plaintext.len); 12685 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12686 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12687 12688 /* Create operation */ 12689 retval = create_cipher_auth_operation(ts_params, 12690 ut_params, 12691 reference, 0); 12692 12693 if (retval < 0) 12694 return retval; 12695 12696 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12697 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12698 ut_params->op); 12699 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12700 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12701 ut_params->op, 1, 1, 0, 0); 12702 else 12703 ut_params->op = process_crypto_request( 12704 ts_params->valid_devs[0], ut_params->op); 12705 12706 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 12707 12708 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12709 "crypto op processing failed"); 12710 12711 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 12712 12713 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 12714 ut_params->op->sym->auth.data.offset); 12715 auth_tag = authciphertext + plaintext_pad_len; 12716 debug_hexdump(stdout, "ciphertext:", authciphertext, 12717 reference->ciphertext.len); 12718 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 12719 12720 /* Validate obuf */ 12721 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12722 authciphertext, 12723 reference->ciphertext.data, 12724 reference->ciphertext.len, 12725 "Ciphertext data not as expected"); 12726 12727 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12728 auth_tag, 12729 reference->digest.data, 12730 reference->digest.len, 12731 "Generated digest not as expected"); 12732 12733 return TEST_SUCCESS; 12734 12735 } 12736 12737 static int 12738 test_authenticated_decrypt_with_esn( 12739 struct crypto_testsuite_params *ts_params, 12740 struct crypto_unittest_params *ut_params, 12741 const struct test_crypto_vector *reference) 12742 { 12743 int retval; 12744 12745 uint8_t *ciphertext; 12746 uint8_t cipher_key[reference->cipher_key.len + 1]; 12747 uint8_t auth_key[reference->auth_key.len + 1]; 12748 struct rte_cryptodev_info dev_info; 12749 12750 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12751 uint64_t feat_flags = dev_info.feature_flags; 12752 12753 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12754 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12755 printf("Device doesn't support RAW data-path APIs.\n"); 12756 return TEST_SKIPPED; 12757 } 12758 12759 /* Verify the capabilities */ 12760 struct rte_cryptodev_sym_capability_idx cap_idx; 12761 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12762 cap_idx.algo.auth = reference->auth_algo; 12763 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12764 &cap_idx) == NULL) 12765 return TEST_SKIPPED; 12766 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12767 cap_idx.algo.cipher = reference->crypto_algo; 12768 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12769 &cap_idx) == NULL) 12770 return TEST_SKIPPED; 12771 12772 /* Create session */ 12773 memcpy(cipher_key, reference->cipher_key.data, 12774 reference->cipher_key.len); 12775 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12776 12777 /* Setup Authentication Parameters */ 12778 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12779 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 12780 ut_params->auth_xform.auth.algo = reference->auth_algo; 12781 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12782 ut_params->auth_xform.auth.key.data = auth_key; 12783 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12784 ut_params->auth_xform.next = &ut_params->cipher_xform; 12785 12786 /* Setup Cipher Parameters */ 12787 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12788 ut_params->cipher_xform.next = NULL; 12789 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12790 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 12791 ut_params->cipher_xform.cipher.key.data = cipher_key; 12792 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12793 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12794 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12795 12796 /* Create Crypto session*/ 12797 ut_params->sess = rte_cryptodev_sym_session_create( 12798 ts_params->session_mpool); 12799 12800 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12801 ut_params->sess, 12802 &ut_params->auth_xform, 12803 ts_params->session_priv_mpool); 12804 12805 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12806 12807 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12808 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12809 "Failed to allocate input buffer in mempool"); 12810 12811 /* clear mbuf payload */ 12812 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12813 rte_pktmbuf_tailroom(ut_params->ibuf)); 12814 12815 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12816 reference->ciphertext.len); 12817 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12818 memcpy(ciphertext, reference->ciphertext.data, 12819 reference->ciphertext.len); 12820 12821 /* Create operation */ 12822 retval = create_cipher_auth_verify_operation(ts_params, 12823 ut_params, 12824 reference); 12825 12826 if (retval < 0) 12827 return retval; 12828 12829 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12830 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12831 ut_params->op); 12832 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12833 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12834 ut_params->op, 1, 1, 0, 0); 12835 else 12836 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12837 ut_params->op); 12838 12839 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 12840 TEST_ASSERT_EQUAL(ut_params->op->status, 12841 RTE_CRYPTO_OP_STATUS_SUCCESS, 12842 "crypto op processing passed"); 12843 12844 ut_params->obuf = ut_params->op->sym->m_src; 12845 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 12846 12847 return 0; 12848 } 12849 12850 static int 12851 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 12852 const struct aead_test_data *tdata, 12853 void *digest_mem, uint64_t digest_phys) 12854 { 12855 struct crypto_testsuite_params *ts_params = &testsuite_params; 12856 struct crypto_unittest_params *ut_params = &unittest_params; 12857 12858 const unsigned int auth_tag_len = tdata->auth_tag.len; 12859 const unsigned int iv_len = tdata->iv.len; 12860 unsigned int aad_len = tdata->aad.len; 12861 unsigned int aad_len_pad = 0; 12862 12863 /* Generate Crypto op data structure */ 12864 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12865 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12866 TEST_ASSERT_NOT_NULL(ut_params->op, 12867 "Failed to allocate symmetric crypto operation struct"); 12868 12869 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12870 12871 sym_op->aead.digest.data = digest_mem; 12872 12873 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 12874 "no room to append digest"); 12875 12876 sym_op->aead.digest.phys_addr = digest_phys; 12877 12878 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 12879 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 12880 auth_tag_len); 12881 debug_hexdump(stdout, "digest:", 12882 sym_op->aead.digest.data, 12883 auth_tag_len); 12884 } 12885 12886 /* Append aad data */ 12887 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 12888 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12889 uint8_t *, IV_OFFSET); 12890 12891 /* Copy IV 1 byte after the IV pointer, according to the API */ 12892 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 12893 12894 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 12895 12896 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12897 ut_params->ibuf, aad_len); 12898 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12899 "no room to prepend aad"); 12900 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12901 ut_params->ibuf); 12902 12903 memset(sym_op->aead.aad.data, 0, aad_len); 12904 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 12905 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12906 12907 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12908 debug_hexdump(stdout, "aad:", 12909 sym_op->aead.aad.data, aad_len); 12910 } else { 12911 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12912 uint8_t *, IV_OFFSET); 12913 12914 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 12915 12916 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 12917 12918 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12919 ut_params->ibuf, aad_len_pad); 12920 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12921 "no room to prepend aad"); 12922 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12923 ut_params->ibuf); 12924 12925 memset(sym_op->aead.aad.data, 0, aad_len); 12926 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12927 12928 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12929 debug_hexdump(stdout, "aad:", 12930 sym_op->aead.aad.data, aad_len); 12931 } 12932 12933 sym_op->aead.data.length = tdata->plaintext.len; 12934 sym_op->aead.data.offset = aad_len_pad; 12935 12936 return 0; 12937 } 12938 12939 #define SGL_MAX_NO 16 12940 12941 static int 12942 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 12943 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 12944 { 12945 struct crypto_testsuite_params *ts_params = &testsuite_params; 12946 struct crypto_unittest_params *ut_params = &unittest_params; 12947 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 12948 int retval; 12949 int to_trn = 0; 12950 int to_trn_tbl[SGL_MAX_NO]; 12951 int segs = 1; 12952 unsigned int trn_data = 0; 12953 uint8_t *plaintext, *ciphertext, *auth_tag; 12954 struct rte_cryptodev_info dev_info; 12955 12956 /* Verify the capabilities */ 12957 struct rte_cryptodev_sym_capability_idx cap_idx; 12958 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 12959 cap_idx.algo.aead = tdata->algo; 12960 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12961 &cap_idx) == NULL) 12962 return TEST_SKIPPED; 12963 12964 /* OOP not supported with CPU crypto */ 12965 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12966 return TEST_SKIPPED; 12967 12968 /* Detailed check for the particular SGL support flag */ 12969 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12970 if (!oop) { 12971 unsigned int sgl_in = fragsz < tdata->plaintext.len; 12972 if (sgl_in && (!(dev_info.feature_flags & 12973 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 12974 return TEST_SKIPPED; 12975 12976 uint64_t feat_flags = dev_info.feature_flags; 12977 12978 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12979 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12980 printf("Device doesn't support RAW data-path APIs.\n"); 12981 return TEST_SKIPPED; 12982 } 12983 } else { 12984 unsigned int sgl_in = fragsz < tdata->plaintext.len; 12985 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 12986 tdata->plaintext.len; 12987 /* Raw data path API does not support OOP */ 12988 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12989 return TEST_SKIPPED; 12990 if (sgl_in && !sgl_out) { 12991 if (!(dev_info.feature_flags & 12992 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 12993 return TEST_SKIPPED; 12994 } else if (!sgl_in && sgl_out) { 12995 if (!(dev_info.feature_flags & 12996 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 12997 return TEST_SKIPPED; 12998 } else if (sgl_in && sgl_out) { 12999 if (!(dev_info.feature_flags & 13000 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 13001 return TEST_SKIPPED; 13002 } 13003 } 13004 13005 if (fragsz > tdata->plaintext.len) 13006 fragsz = tdata->plaintext.len; 13007 13008 uint16_t plaintext_len = fragsz; 13009 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 13010 13011 if (fragsz_oop > tdata->plaintext.len) 13012 frag_size_oop = tdata->plaintext.len; 13013 13014 int ecx = 0; 13015 void *digest_mem = NULL; 13016 13017 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 13018 13019 if (tdata->plaintext.len % fragsz != 0) { 13020 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 13021 return 1; 13022 } else { 13023 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 13024 return 1; 13025 } 13026 13027 /* 13028 * For out-op-place we need to alloc another mbuf 13029 */ 13030 if (oop) { 13031 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13032 rte_pktmbuf_append(ut_params->obuf, 13033 frag_size_oop + prepend_len); 13034 buf_oop = ut_params->obuf; 13035 } 13036 13037 /* Create AEAD session */ 13038 retval = create_aead_session(ts_params->valid_devs[0], 13039 tdata->algo, 13040 RTE_CRYPTO_AEAD_OP_ENCRYPT, 13041 tdata->key.data, tdata->key.len, 13042 tdata->aad.len, tdata->auth_tag.len, 13043 tdata->iv.len); 13044 if (retval < 0) 13045 return retval; 13046 13047 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13048 13049 /* clear mbuf payload */ 13050 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13051 rte_pktmbuf_tailroom(ut_params->ibuf)); 13052 13053 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13054 plaintext_len); 13055 13056 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 13057 13058 trn_data += plaintext_len; 13059 13060 buf = ut_params->ibuf; 13061 13062 /* 13063 * Loop until no more fragments 13064 */ 13065 13066 while (trn_data < tdata->plaintext.len) { 13067 ++segs; 13068 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 13069 (tdata->plaintext.len - trn_data) : fragsz; 13070 13071 to_trn_tbl[ecx++] = to_trn; 13072 13073 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13074 buf = buf->next; 13075 13076 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 13077 rte_pktmbuf_tailroom(buf)); 13078 13079 /* OOP */ 13080 if (oop && !fragsz_oop) { 13081 buf_last_oop = buf_oop->next = 13082 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13083 buf_oop = buf_oop->next; 13084 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13085 0, rte_pktmbuf_tailroom(buf_oop)); 13086 rte_pktmbuf_append(buf_oop, to_trn); 13087 } 13088 13089 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 13090 to_trn); 13091 13092 memcpy(plaintext, tdata->plaintext.data + trn_data, 13093 to_trn); 13094 trn_data += to_trn; 13095 if (trn_data == tdata->plaintext.len) { 13096 if (oop) { 13097 if (!fragsz_oop) 13098 digest_mem = rte_pktmbuf_append(buf_oop, 13099 tdata->auth_tag.len); 13100 } else 13101 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 13102 tdata->auth_tag.len); 13103 } 13104 } 13105 13106 uint64_t digest_phys = 0; 13107 13108 ut_params->ibuf->nb_segs = segs; 13109 13110 segs = 1; 13111 if (fragsz_oop && oop) { 13112 to_trn = 0; 13113 ecx = 0; 13114 13115 if (frag_size_oop == tdata->plaintext.len) { 13116 digest_mem = rte_pktmbuf_append(ut_params->obuf, 13117 tdata->auth_tag.len); 13118 13119 digest_phys = rte_pktmbuf_iova_offset( 13120 ut_params->obuf, 13121 tdata->plaintext.len + prepend_len); 13122 } 13123 13124 trn_data = frag_size_oop; 13125 while (trn_data < tdata->plaintext.len) { 13126 ++segs; 13127 to_trn = 13128 (tdata->plaintext.len - trn_data < 13129 frag_size_oop) ? 13130 (tdata->plaintext.len - trn_data) : 13131 frag_size_oop; 13132 13133 to_trn_tbl[ecx++] = to_trn; 13134 13135 buf_last_oop = buf_oop->next = 13136 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13137 buf_oop = buf_oop->next; 13138 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13139 0, rte_pktmbuf_tailroom(buf_oop)); 13140 rte_pktmbuf_append(buf_oop, to_trn); 13141 13142 trn_data += to_trn; 13143 13144 if (trn_data == tdata->plaintext.len) { 13145 digest_mem = rte_pktmbuf_append(buf_oop, 13146 tdata->auth_tag.len); 13147 } 13148 } 13149 13150 ut_params->obuf->nb_segs = segs; 13151 } 13152 13153 /* 13154 * Place digest at the end of the last buffer 13155 */ 13156 if (!digest_phys) 13157 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 13158 if (oop && buf_last_oop) 13159 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 13160 13161 if (!digest_mem && !oop) { 13162 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13163 + tdata->auth_tag.len); 13164 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 13165 tdata->plaintext.len); 13166 } 13167 13168 /* Create AEAD operation */ 13169 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 13170 tdata, digest_mem, digest_phys); 13171 13172 if (retval < 0) 13173 return retval; 13174 13175 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13176 13177 ut_params->op->sym->m_src = ut_params->ibuf; 13178 if (oop) 13179 ut_params->op->sym->m_dst = ut_params->obuf; 13180 13181 /* Process crypto operation */ 13182 if (oop == IN_PLACE && 13183 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13184 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 13185 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13186 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13187 ut_params->op, 0, 0, 0, 0); 13188 else 13189 TEST_ASSERT_NOT_NULL( 13190 process_crypto_request(ts_params->valid_devs[0], 13191 ut_params->op), "failed to process sym crypto op"); 13192 13193 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13194 "crypto op processing failed"); 13195 13196 13197 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 13198 uint8_t *, prepend_len); 13199 if (oop) { 13200 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 13201 uint8_t *, prepend_len); 13202 } 13203 13204 if (fragsz_oop) 13205 fragsz = fragsz_oop; 13206 13207 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13208 ciphertext, 13209 tdata->ciphertext.data, 13210 fragsz, 13211 "Ciphertext data not as expected"); 13212 13213 buf = ut_params->op->sym->m_src->next; 13214 if (oop) 13215 buf = ut_params->op->sym->m_dst->next; 13216 13217 unsigned int off = fragsz; 13218 13219 ecx = 0; 13220 while (buf) { 13221 ciphertext = rte_pktmbuf_mtod(buf, 13222 uint8_t *); 13223 13224 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13225 ciphertext, 13226 tdata->ciphertext.data + off, 13227 to_trn_tbl[ecx], 13228 "Ciphertext data not as expected"); 13229 13230 off += to_trn_tbl[ecx++]; 13231 buf = buf->next; 13232 } 13233 13234 auth_tag = digest_mem; 13235 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13236 auth_tag, 13237 tdata->auth_tag.data, 13238 tdata->auth_tag.len, 13239 "Generated auth tag not as expected"); 13240 13241 return 0; 13242 } 13243 13244 static int 13245 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 13246 { 13247 return test_authenticated_encryption_SGL( 13248 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 13249 } 13250 13251 static int 13252 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 13253 { 13254 return test_authenticated_encryption_SGL( 13255 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 13256 } 13257 13258 static int 13259 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 13260 { 13261 return test_authenticated_encryption_SGL( 13262 &gcm_test_case_8, OUT_OF_PLACE, 400, 13263 gcm_test_case_8.plaintext.len); 13264 } 13265 13266 static int 13267 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 13268 { 13269 /* This test is not for OPENSSL PMD */ 13270 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13271 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 13272 return TEST_SKIPPED; 13273 13274 return test_authenticated_encryption_SGL( 13275 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 13276 } 13277 13278 static int 13279 test_authentication_verify_fail_when_data_corrupted( 13280 struct crypto_testsuite_params *ts_params, 13281 struct crypto_unittest_params *ut_params, 13282 const struct test_crypto_vector *reference) 13283 { 13284 return test_authentication_verify_fail_when_data_corruption( 13285 ts_params, ut_params, reference, 1); 13286 } 13287 13288 static int 13289 test_authentication_verify_fail_when_tag_corrupted( 13290 struct crypto_testsuite_params *ts_params, 13291 struct crypto_unittest_params *ut_params, 13292 const struct test_crypto_vector *reference) 13293 { 13294 return test_authentication_verify_fail_when_data_corruption( 13295 ts_params, ut_params, reference, 0); 13296 } 13297 13298 static int 13299 test_authentication_verify_GMAC_fail_when_data_corrupted( 13300 struct crypto_testsuite_params *ts_params, 13301 struct crypto_unittest_params *ut_params, 13302 const struct test_crypto_vector *reference) 13303 { 13304 return test_authentication_verify_GMAC_fail_when_corruption( 13305 ts_params, ut_params, reference, 1); 13306 } 13307 13308 static int 13309 test_authentication_verify_GMAC_fail_when_tag_corrupted( 13310 struct crypto_testsuite_params *ts_params, 13311 struct crypto_unittest_params *ut_params, 13312 const struct test_crypto_vector *reference) 13313 { 13314 return test_authentication_verify_GMAC_fail_when_corruption( 13315 ts_params, ut_params, reference, 0); 13316 } 13317 13318 static int 13319 test_authenticated_decryption_fail_when_data_corrupted( 13320 struct crypto_testsuite_params *ts_params, 13321 struct crypto_unittest_params *ut_params, 13322 const struct test_crypto_vector *reference) 13323 { 13324 return test_authenticated_decryption_fail_when_corruption( 13325 ts_params, ut_params, reference, 1); 13326 } 13327 13328 static int 13329 test_authenticated_decryption_fail_when_tag_corrupted( 13330 struct crypto_testsuite_params *ts_params, 13331 struct crypto_unittest_params *ut_params, 13332 const struct test_crypto_vector *reference) 13333 { 13334 return test_authenticated_decryption_fail_when_corruption( 13335 ts_params, ut_params, reference, 0); 13336 } 13337 13338 static int 13339 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 13340 { 13341 return test_authentication_verify_fail_when_data_corrupted( 13342 &testsuite_params, &unittest_params, 13343 &hmac_sha1_test_crypto_vector); 13344 } 13345 13346 static int 13347 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 13348 { 13349 return test_authentication_verify_fail_when_tag_corrupted( 13350 &testsuite_params, &unittest_params, 13351 &hmac_sha1_test_crypto_vector); 13352 } 13353 13354 static int 13355 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 13356 { 13357 return test_authentication_verify_GMAC_fail_when_data_corrupted( 13358 &testsuite_params, &unittest_params, 13359 &aes128_gmac_test_vector); 13360 } 13361 13362 static int 13363 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 13364 { 13365 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 13366 &testsuite_params, &unittest_params, 13367 &aes128_gmac_test_vector); 13368 } 13369 13370 static int 13371 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 13372 { 13373 return test_authenticated_decryption_fail_when_data_corrupted( 13374 &testsuite_params, 13375 &unittest_params, 13376 &aes128cbc_hmac_sha1_test_vector); 13377 } 13378 13379 static int 13380 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 13381 { 13382 return test_authenticated_decryption_fail_when_tag_corrupted( 13383 &testsuite_params, 13384 &unittest_params, 13385 &aes128cbc_hmac_sha1_test_vector); 13386 } 13387 13388 static int 13389 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13390 { 13391 return test_authenticated_encryt_with_esn( 13392 &testsuite_params, 13393 &unittest_params, 13394 &aes128cbc_hmac_sha1_aad_test_vector); 13395 } 13396 13397 static int 13398 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13399 { 13400 return test_authenticated_decrypt_with_esn( 13401 &testsuite_params, 13402 &unittest_params, 13403 &aes128cbc_hmac_sha1_aad_test_vector); 13404 } 13405 13406 static int 13407 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 13408 { 13409 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 13410 } 13411 13412 static int 13413 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 13414 { 13415 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 13416 } 13417 13418 #ifdef RTE_CRYPTO_SCHEDULER 13419 13420 /* global AESNI worker IDs for the scheduler test */ 13421 uint8_t aesni_ids[2]; 13422 13423 static int 13424 scheduler_testsuite_setup(void) 13425 { 13426 uint32_t i = 0; 13427 int32_t nb_devs, ret; 13428 char vdev_args[VDEV_ARGS_SIZE] = {""}; 13429 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 13430 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 13431 uint16_t worker_core_count = 0; 13432 uint16_t socket_id = 0; 13433 13434 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13435 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 13436 13437 /* Identify the Worker Cores 13438 * Use 2 worker cores for the device args 13439 */ 13440 RTE_LCORE_FOREACH_WORKER(i) { 13441 if (worker_core_count > 1) 13442 break; 13443 snprintf(vdev_args, sizeof(vdev_args), 13444 "%s%d", temp_str, i); 13445 strcpy(temp_str, vdev_args); 13446 strlcat(temp_str, ";", sizeof(temp_str)); 13447 worker_core_count++; 13448 socket_id = rte_lcore_to_socket_id(i); 13449 } 13450 if (worker_core_count != 2) { 13451 RTE_LOG(ERR, USER1, 13452 "Cryptodev scheduler test require at least " 13453 "two worker cores to run. " 13454 "Please use the correct coremask.\n"); 13455 return TEST_FAILED; 13456 } 13457 strcpy(temp_str, vdev_args); 13458 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 13459 temp_str, socket_id); 13460 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 13461 nb_devs = rte_cryptodev_device_count_by_driver( 13462 rte_cryptodev_driver_id_get( 13463 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 13464 if (nb_devs < 1) { 13465 ret = rte_vdev_init( 13466 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 13467 vdev_args); 13468 TEST_ASSERT(ret == 0, 13469 "Failed to create instance %u of pmd : %s", 13470 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 13471 } 13472 } 13473 return testsuite_setup(); 13474 } 13475 13476 static int 13477 test_scheduler_attach_slave_op(void) 13478 { 13479 struct crypto_testsuite_params *ts_params = &testsuite_params; 13480 uint8_t sched_id = ts_params->valid_devs[0]; 13481 uint32_t nb_devs, i, nb_devs_attached = 0; 13482 int ret; 13483 char vdev_name[32]; 13484 13485 /* create 2 AESNI_MB if necessary */ 13486 nb_devs = rte_cryptodev_device_count_by_driver( 13487 rte_cryptodev_driver_id_get( 13488 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))); 13489 if (nb_devs < 2) { 13490 for (i = nb_devs; i < 2; i++) { 13491 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 13492 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 13493 i); 13494 ret = rte_vdev_init(vdev_name, NULL); 13495 13496 TEST_ASSERT(ret == 0, 13497 "Failed to create instance %u of" 13498 " pmd : %s", 13499 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13500 } 13501 } 13502 13503 /* attach 2 AESNI_MB cdevs */ 13504 for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2; 13505 i++) { 13506 struct rte_cryptodev_info info; 13507 unsigned int session_size; 13508 13509 rte_cryptodev_info_get(i, &info); 13510 if (info.driver_id != rte_cryptodev_driver_id_get( 13511 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 13512 continue; 13513 13514 session_size = rte_cryptodev_sym_get_private_session_size(i); 13515 /* 13516 * Create the session mempool again, since now there are new devices 13517 * to use the mempool. 13518 */ 13519 if (ts_params->session_mpool) { 13520 rte_mempool_free(ts_params->session_mpool); 13521 ts_params->session_mpool = NULL; 13522 } 13523 if (ts_params->session_priv_mpool) { 13524 rte_mempool_free(ts_params->session_priv_mpool); 13525 ts_params->session_priv_mpool = NULL; 13526 } 13527 13528 if (info.sym.max_nb_sessions != 0 && 13529 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 13530 RTE_LOG(ERR, USER1, 13531 "Device does not support " 13532 "at least %u sessions\n", 13533 MAX_NB_SESSIONS); 13534 return TEST_FAILED; 13535 } 13536 /* 13537 * Create mempool with maximum number of sessions, 13538 * to include the session headers 13539 */ 13540 if (ts_params->session_mpool == NULL) { 13541 ts_params->session_mpool = 13542 rte_cryptodev_sym_session_pool_create( 13543 "test_sess_mp", 13544 MAX_NB_SESSIONS, 0, 0, 0, 13545 SOCKET_ID_ANY); 13546 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 13547 "session mempool allocation failed"); 13548 } 13549 13550 /* 13551 * Create mempool with maximum number of sessions, 13552 * to include device specific session private data 13553 */ 13554 if (ts_params->session_priv_mpool == NULL) { 13555 ts_params->session_priv_mpool = rte_mempool_create( 13556 "test_sess_mp_priv", 13557 MAX_NB_SESSIONS, 13558 session_size, 13559 0, 0, NULL, NULL, NULL, 13560 NULL, SOCKET_ID_ANY, 13561 0); 13562 13563 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 13564 "session mempool allocation failed"); 13565 } 13566 13567 ts_params->qp_conf.mp_session = ts_params->session_mpool; 13568 ts_params->qp_conf.mp_session_private = 13569 ts_params->session_priv_mpool; 13570 13571 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 13572 (uint8_t)i); 13573 13574 TEST_ASSERT(ret == 0, 13575 "Failed to attach device %u of pmd : %s", i, 13576 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13577 13578 aesni_ids[nb_devs_attached] = (uint8_t)i; 13579 13580 nb_devs_attached++; 13581 } 13582 13583 return 0; 13584 } 13585 13586 static int 13587 test_scheduler_detach_slave_op(void) 13588 { 13589 struct crypto_testsuite_params *ts_params = &testsuite_params; 13590 uint8_t sched_id = ts_params->valid_devs[0]; 13591 uint32_t i; 13592 int ret; 13593 13594 for (i = 0; i < 2; i++) { 13595 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 13596 aesni_ids[i]); 13597 TEST_ASSERT(ret == 0, 13598 "Failed to detach device %u", aesni_ids[i]); 13599 } 13600 13601 return 0; 13602 } 13603 13604 static int 13605 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 13606 { 13607 struct crypto_testsuite_params *ts_params = &testsuite_params; 13608 uint8_t sched_id = ts_params->valid_devs[0]; 13609 /* set mode */ 13610 return rte_cryptodev_scheduler_mode_set(sched_id, 13611 scheduler_mode); 13612 } 13613 13614 static int 13615 test_scheduler_mode_roundrobin_op(void) 13616 { 13617 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 13618 0, "Failed to set roundrobin mode"); 13619 return 0; 13620 13621 } 13622 13623 static int 13624 test_scheduler_mode_multicore_op(void) 13625 { 13626 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 13627 0, "Failed to set multicore mode"); 13628 13629 return 0; 13630 } 13631 13632 static int 13633 test_scheduler_mode_failover_op(void) 13634 { 13635 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 13636 0, "Failed to set failover mode"); 13637 13638 return 0; 13639 } 13640 13641 static int 13642 test_scheduler_mode_pkt_size_distr_op(void) 13643 { 13644 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 13645 0, "Failed to set pktsize mode"); 13646 13647 return 0; 13648 } 13649 13650 static int 13651 scheduler_multicore_testsuite_setup(void) 13652 { 13653 if (test_scheduler_attach_slave_op() < 0) 13654 return TEST_SKIPPED; 13655 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0) 13656 return TEST_SKIPPED; 13657 return 0; 13658 } 13659 13660 static int 13661 scheduler_roundrobin_testsuite_setup(void) 13662 { 13663 if (test_scheduler_attach_slave_op() < 0) 13664 return TEST_SKIPPED; 13665 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0) 13666 return TEST_SKIPPED; 13667 return 0; 13668 } 13669 13670 static int 13671 scheduler_failover_testsuite_setup(void) 13672 { 13673 if (test_scheduler_attach_slave_op() < 0) 13674 return TEST_SKIPPED; 13675 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0) 13676 return TEST_SKIPPED; 13677 return 0; 13678 } 13679 13680 static int 13681 scheduler_pkt_size_distr_testsuite_setup(void) 13682 { 13683 if (test_scheduler_attach_slave_op() < 0) 13684 return TEST_SKIPPED; 13685 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0) 13686 return TEST_SKIPPED; 13687 return 0; 13688 } 13689 13690 static void 13691 scheduler_mode_testsuite_teardown(void) 13692 { 13693 test_scheduler_detach_slave_op(); 13694 } 13695 13696 #endif /* RTE_CRYPTO_SCHEDULER */ 13697 13698 static struct unit_test_suite end_testsuite = { 13699 .suite_name = NULL, 13700 .setup = NULL, 13701 .teardown = NULL, 13702 .unit_test_suites = NULL 13703 }; 13704 13705 #ifdef RTE_LIB_SECURITY 13706 static struct unit_test_suite pdcp_proto_testsuite = { 13707 .suite_name = "PDCP Proto Unit Test Suite", 13708 .setup = pdcp_proto_testsuite_setup, 13709 .unit_test_cases = { 13710 TEST_CASE_ST(ut_setup_security, ut_teardown, 13711 test_PDCP_PROTO_all), 13712 TEST_CASES_END() /**< NULL terminate unit test array */ 13713 } 13714 }; 13715 13716 static struct unit_test_suite docsis_proto_testsuite = { 13717 .suite_name = "Docsis Proto Unit Test Suite", 13718 .setup = docsis_proto_testsuite_setup, 13719 .unit_test_cases = { 13720 TEST_CASE_ST(ut_setup_security, ut_teardown, 13721 test_DOCSIS_PROTO_all), 13722 TEST_CASES_END() /**< NULL terminate unit test array */ 13723 } 13724 }; 13725 #endif 13726 13727 static struct unit_test_suite cryptodev_gen_testsuite = { 13728 .suite_name = "Crypto General Unit Test Suite", 13729 .setup = crypto_gen_testsuite_setup, 13730 .unit_test_cases = { 13731 TEST_CASE_ST(ut_setup, ut_teardown, 13732 test_device_configure_invalid_dev_id), 13733 TEST_CASE_ST(ut_setup, ut_teardown, 13734 test_queue_pair_descriptor_setup), 13735 TEST_CASE_ST(ut_setup, ut_teardown, 13736 test_device_configure_invalid_queue_pair_ids), 13737 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 13738 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup), 13739 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup), 13740 TEST_CASES_END() /**< NULL terminate unit test array */ 13741 } 13742 }; 13743 13744 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = { 13745 .suite_name = "Negative HMAC SHA1 Unit Test Suite", 13746 .setup = negative_hmac_sha1_testsuite_setup, 13747 .unit_test_cases = { 13748 /** Negative tests */ 13749 TEST_CASE_ST(ut_setup, ut_teardown, 13750 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13751 TEST_CASE_ST(ut_setup, ut_teardown, 13752 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13753 TEST_CASE_ST(ut_setup, ut_teardown, 13754 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13755 TEST_CASE_ST(ut_setup, ut_teardown, 13756 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13757 13758 TEST_CASES_END() /**< NULL terminate unit test array */ 13759 } 13760 }; 13761 13762 static struct unit_test_suite cryptodev_multi_session_testsuite = { 13763 .suite_name = "Multi Session Unit Test Suite", 13764 .setup = multi_session_testsuite_setup, 13765 .unit_test_cases = { 13766 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 13767 TEST_CASE_ST(ut_setup, ut_teardown, 13768 test_multi_session_random_usage), 13769 13770 TEST_CASES_END() /**< NULL terminate unit test array */ 13771 } 13772 }; 13773 13774 static struct unit_test_suite cryptodev_null_testsuite = { 13775 .suite_name = "NULL Test Suite", 13776 .setup = null_testsuite_setup, 13777 .unit_test_cases = { 13778 TEST_CASE_ST(ut_setup, ut_teardown, 13779 test_null_invalid_operation), 13780 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 13781 TEST_CASES_END() 13782 } 13783 }; 13784 13785 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = { 13786 .suite_name = "AES CCM Authenticated Test Suite", 13787 .setup = aes_ccm_auth_testsuite_setup, 13788 .unit_test_cases = { 13789 /** AES CCM Authenticated Encryption 128 bits key*/ 13790 TEST_CASE_ST(ut_setup, ut_teardown, 13791 test_AES_CCM_authenticated_encryption_test_case_128_1), 13792 TEST_CASE_ST(ut_setup, ut_teardown, 13793 test_AES_CCM_authenticated_encryption_test_case_128_2), 13794 TEST_CASE_ST(ut_setup, ut_teardown, 13795 test_AES_CCM_authenticated_encryption_test_case_128_3), 13796 13797 /** AES CCM Authenticated Decryption 128 bits key*/ 13798 TEST_CASE_ST(ut_setup, ut_teardown, 13799 test_AES_CCM_authenticated_decryption_test_case_128_1), 13800 TEST_CASE_ST(ut_setup, ut_teardown, 13801 test_AES_CCM_authenticated_decryption_test_case_128_2), 13802 TEST_CASE_ST(ut_setup, ut_teardown, 13803 test_AES_CCM_authenticated_decryption_test_case_128_3), 13804 13805 /** AES CCM Authenticated Encryption 192 bits key */ 13806 TEST_CASE_ST(ut_setup, ut_teardown, 13807 test_AES_CCM_authenticated_encryption_test_case_192_1), 13808 TEST_CASE_ST(ut_setup, ut_teardown, 13809 test_AES_CCM_authenticated_encryption_test_case_192_2), 13810 TEST_CASE_ST(ut_setup, ut_teardown, 13811 test_AES_CCM_authenticated_encryption_test_case_192_3), 13812 13813 /** AES CCM Authenticated Decryption 192 bits key*/ 13814 TEST_CASE_ST(ut_setup, ut_teardown, 13815 test_AES_CCM_authenticated_decryption_test_case_192_1), 13816 TEST_CASE_ST(ut_setup, ut_teardown, 13817 test_AES_CCM_authenticated_decryption_test_case_192_2), 13818 TEST_CASE_ST(ut_setup, ut_teardown, 13819 test_AES_CCM_authenticated_decryption_test_case_192_3), 13820 13821 /** AES CCM Authenticated Encryption 256 bits key */ 13822 TEST_CASE_ST(ut_setup, ut_teardown, 13823 test_AES_CCM_authenticated_encryption_test_case_256_1), 13824 TEST_CASE_ST(ut_setup, ut_teardown, 13825 test_AES_CCM_authenticated_encryption_test_case_256_2), 13826 TEST_CASE_ST(ut_setup, ut_teardown, 13827 test_AES_CCM_authenticated_encryption_test_case_256_3), 13828 13829 /** AES CCM Authenticated Decryption 256 bits key*/ 13830 TEST_CASE_ST(ut_setup, ut_teardown, 13831 test_AES_CCM_authenticated_decryption_test_case_256_1), 13832 TEST_CASE_ST(ut_setup, ut_teardown, 13833 test_AES_CCM_authenticated_decryption_test_case_256_2), 13834 TEST_CASE_ST(ut_setup, ut_teardown, 13835 test_AES_CCM_authenticated_decryption_test_case_256_3), 13836 TEST_CASES_END() 13837 } 13838 }; 13839 13840 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = { 13841 .suite_name = "AES GCM Authenticated Test Suite", 13842 .setup = aes_gcm_auth_testsuite_setup, 13843 .unit_test_cases = { 13844 /** AES GCM Authenticated Encryption */ 13845 TEST_CASE_ST(ut_setup, ut_teardown, 13846 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 13847 TEST_CASE_ST(ut_setup, ut_teardown, 13848 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 13849 TEST_CASE_ST(ut_setup, ut_teardown, 13850 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 13851 TEST_CASE_ST(ut_setup, ut_teardown, 13852 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 13853 TEST_CASE_ST(ut_setup, ut_teardown, 13854 test_AES_GCM_authenticated_encryption_test_case_1), 13855 TEST_CASE_ST(ut_setup, ut_teardown, 13856 test_AES_GCM_authenticated_encryption_test_case_2), 13857 TEST_CASE_ST(ut_setup, ut_teardown, 13858 test_AES_GCM_authenticated_encryption_test_case_3), 13859 TEST_CASE_ST(ut_setup, ut_teardown, 13860 test_AES_GCM_authenticated_encryption_test_case_4), 13861 TEST_CASE_ST(ut_setup, ut_teardown, 13862 test_AES_GCM_authenticated_encryption_test_case_5), 13863 TEST_CASE_ST(ut_setup, ut_teardown, 13864 test_AES_GCM_authenticated_encryption_test_case_6), 13865 TEST_CASE_ST(ut_setup, ut_teardown, 13866 test_AES_GCM_authenticated_encryption_test_case_7), 13867 TEST_CASE_ST(ut_setup, ut_teardown, 13868 test_AES_GCM_authenticated_encryption_test_case_8), 13869 TEST_CASE_ST(ut_setup, ut_teardown, 13870 test_AES_GCM_J0_authenticated_encryption_test_case_1), 13871 13872 /** AES GCM Authenticated Decryption */ 13873 TEST_CASE_ST(ut_setup, ut_teardown, 13874 test_AES_GCM_authenticated_decryption_test_case_1), 13875 TEST_CASE_ST(ut_setup, ut_teardown, 13876 test_AES_GCM_authenticated_decryption_test_case_2), 13877 TEST_CASE_ST(ut_setup, ut_teardown, 13878 test_AES_GCM_authenticated_decryption_test_case_3), 13879 TEST_CASE_ST(ut_setup, ut_teardown, 13880 test_AES_GCM_authenticated_decryption_test_case_4), 13881 TEST_CASE_ST(ut_setup, ut_teardown, 13882 test_AES_GCM_authenticated_decryption_test_case_5), 13883 TEST_CASE_ST(ut_setup, ut_teardown, 13884 test_AES_GCM_authenticated_decryption_test_case_6), 13885 TEST_CASE_ST(ut_setup, ut_teardown, 13886 test_AES_GCM_authenticated_decryption_test_case_7), 13887 TEST_CASE_ST(ut_setup, ut_teardown, 13888 test_AES_GCM_authenticated_decryption_test_case_8), 13889 TEST_CASE_ST(ut_setup, ut_teardown, 13890 test_AES_GCM_J0_authenticated_decryption_test_case_1), 13891 13892 /** AES GCM Authenticated Encryption 192 bits key */ 13893 TEST_CASE_ST(ut_setup, ut_teardown, 13894 test_AES_GCM_auth_encryption_test_case_192_1), 13895 TEST_CASE_ST(ut_setup, ut_teardown, 13896 test_AES_GCM_auth_encryption_test_case_192_2), 13897 TEST_CASE_ST(ut_setup, ut_teardown, 13898 test_AES_GCM_auth_encryption_test_case_192_3), 13899 TEST_CASE_ST(ut_setup, ut_teardown, 13900 test_AES_GCM_auth_encryption_test_case_192_4), 13901 TEST_CASE_ST(ut_setup, ut_teardown, 13902 test_AES_GCM_auth_encryption_test_case_192_5), 13903 TEST_CASE_ST(ut_setup, ut_teardown, 13904 test_AES_GCM_auth_encryption_test_case_192_6), 13905 TEST_CASE_ST(ut_setup, ut_teardown, 13906 test_AES_GCM_auth_encryption_test_case_192_7), 13907 13908 /** AES GCM Authenticated Decryption 192 bits key */ 13909 TEST_CASE_ST(ut_setup, ut_teardown, 13910 test_AES_GCM_auth_decryption_test_case_192_1), 13911 TEST_CASE_ST(ut_setup, ut_teardown, 13912 test_AES_GCM_auth_decryption_test_case_192_2), 13913 TEST_CASE_ST(ut_setup, ut_teardown, 13914 test_AES_GCM_auth_decryption_test_case_192_3), 13915 TEST_CASE_ST(ut_setup, ut_teardown, 13916 test_AES_GCM_auth_decryption_test_case_192_4), 13917 TEST_CASE_ST(ut_setup, ut_teardown, 13918 test_AES_GCM_auth_decryption_test_case_192_5), 13919 TEST_CASE_ST(ut_setup, ut_teardown, 13920 test_AES_GCM_auth_decryption_test_case_192_6), 13921 TEST_CASE_ST(ut_setup, ut_teardown, 13922 test_AES_GCM_auth_decryption_test_case_192_7), 13923 13924 /** AES GCM Authenticated Encryption 256 bits key */ 13925 TEST_CASE_ST(ut_setup, ut_teardown, 13926 test_AES_GCM_auth_encryption_test_case_256_1), 13927 TEST_CASE_ST(ut_setup, ut_teardown, 13928 test_AES_GCM_auth_encryption_test_case_256_2), 13929 TEST_CASE_ST(ut_setup, ut_teardown, 13930 test_AES_GCM_auth_encryption_test_case_256_3), 13931 TEST_CASE_ST(ut_setup, ut_teardown, 13932 test_AES_GCM_auth_encryption_test_case_256_4), 13933 TEST_CASE_ST(ut_setup, ut_teardown, 13934 test_AES_GCM_auth_encryption_test_case_256_5), 13935 TEST_CASE_ST(ut_setup, ut_teardown, 13936 test_AES_GCM_auth_encryption_test_case_256_6), 13937 TEST_CASE_ST(ut_setup, ut_teardown, 13938 test_AES_GCM_auth_encryption_test_case_256_7), 13939 13940 /** AES GCM Authenticated Decryption 256 bits key */ 13941 TEST_CASE_ST(ut_setup, ut_teardown, 13942 test_AES_GCM_auth_decryption_test_case_256_1), 13943 TEST_CASE_ST(ut_setup, ut_teardown, 13944 test_AES_GCM_auth_decryption_test_case_256_2), 13945 TEST_CASE_ST(ut_setup, ut_teardown, 13946 test_AES_GCM_auth_decryption_test_case_256_3), 13947 TEST_CASE_ST(ut_setup, ut_teardown, 13948 test_AES_GCM_auth_decryption_test_case_256_4), 13949 TEST_CASE_ST(ut_setup, ut_teardown, 13950 test_AES_GCM_auth_decryption_test_case_256_5), 13951 TEST_CASE_ST(ut_setup, ut_teardown, 13952 test_AES_GCM_auth_decryption_test_case_256_6), 13953 TEST_CASE_ST(ut_setup, ut_teardown, 13954 test_AES_GCM_auth_decryption_test_case_256_7), 13955 13956 /** AES GCM Authenticated Encryption big aad size */ 13957 TEST_CASE_ST(ut_setup, ut_teardown, 13958 test_AES_GCM_auth_encryption_test_case_aad_1), 13959 TEST_CASE_ST(ut_setup, ut_teardown, 13960 test_AES_GCM_auth_encryption_test_case_aad_2), 13961 13962 /** AES GCM Authenticated Decryption big aad size */ 13963 TEST_CASE_ST(ut_setup, ut_teardown, 13964 test_AES_GCM_auth_decryption_test_case_aad_1), 13965 TEST_CASE_ST(ut_setup, ut_teardown, 13966 test_AES_GCM_auth_decryption_test_case_aad_2), 13967 13968 /** Out of place tests */ 13969 TEST_CASE_ST(ut_setup, ut_teardown, 13970 test_AES_GCM_authenticated_encryption_oop_test_case_1), 13971 TEST_CASE_ST(ut_setup, ut_teardown, 13972 test_AES_GCM_authenticated_decryption_oop_test_case_1), 13973 13974 /** Session-less tests */ 13975 TEST_CASE_ST(ut_setup, ut_teardown, 13976 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 13977 TEST_CASE_ST(ut_setup, ut_teardown, 13978 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 13979 13980 TEST_CASES_END() 13981 } 13982 }; 13983 13984 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = { 13985 .suite_name = "AES GMAC Authentication Test Suite", 13986 .setup = aes_gmac_auth_testsuite_setup, 13987 .unit_test_cases = { 13988 TEST_CASE_ST(ut_setup, ut_teardown, 13989 test_AES_GMAC_authentication_test_case_1), 13990 TEST_CASE_ST(ut_setup, ut_teardown, 13991 test_AES_GMAC_authentication_verify_test_case_1), 13992 TEST_CASE_ST(ut_setup, ut_teardown, 13993 test_AES_GMAC_authentication_test_case_2), 13994 TEST_CASE_ST(ut_setup, ut_teardown, 13995 test_AES_GMAC_authentication_verify_test_case_2), 13996 TEST_CASE_ST(ut_setup, ut_teardown, 13997 test_AES_GMAC_authentication_test_case_3), 13998 TEST_CASE_ST(ut_setup, ut_teardown, 13999 test_AES_GMAC_authentication_verify_test_case_3), 14000 TEST_CASE_ST(ut_setup, ut_teardown, 14001 test_AES_GMAC_authentication_test_case_4), 14002 TEST_CASE_ST(ut_setup, ut_teardown, 14003 test_AES_GMAC_authentication_verify_test_case_4), 14004 TEST_CASE_ST(ut_setup, ut_teardown, 14005 test_AES_GMAC_authentication_SGL_40B), 14006 TEST_CASE_ST(ut_setup, ut_teardown, 14007 test_AES_GMAC_authentication_SGL_80B), 14008 TEST_CASE_ST(ut_setup, ut_teardown, 14009 test_AES_GMAC_authentication_SGL_2048B), 14010 TEST_CASE_ST(ut_setup, ut_teardown, 14011 test_AES_GMAC_authentication_SGL_2047B), 14012 14013 TEST_CASES_END() 14014 } 14015 }; 14016 14017 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = { 14018 .suite_name = "Chacha20-Poly1305 Test Suite", 14019 .setup = chacha20_poly1305_testsuite_setup, 14020 .unit_test_cases = { 14021 TEST_CASE_ST(ut_setup, ut_teardown, 14022 test_chacha20_poly1305_encrypt_test_case_rfc8439), 14023 TEST_CASE_ST(ut_setup, ut_teardown, 14024 test_chacha20_poly1305_decrypt_test_case_rfc8439), 14025 TEST_CASES_END() 14026 } 14027 }; 14028 14029 static struct unit_test_suite cryptodev_snow3g_testsuite = { 14030 .suite_name = "SNOW 3G Test Suite", 14031 .setup = snow3g_testsuite_setup, 14032 .unit_test_cases = { 14033 /** SNOW 3G encrypt only (UEA2) */ 14034 TEST_CASE_ST(ut_setup, ut_teardown, 14035 test_snow3g_encryption_test_case_1), 14036 TEST_CASE_ST(ut_setup, ut_teardown, 14037 test_snow3g_encryption_test_case_2), 14038 TEST_CASE_ST(ut_setup, ut_teardown, 14039 test_snow3g_encryption_test_case_3), 14040 TEST_CASE_ST(ut_setup, ut_teardown, 14041 test_snow3g_encryption_test_case_4), 14042 TEST_CASE_ST(ut_setup, ut_teardown, 14043 test_snow3g_encryption_test_case_5), 14044 14045 TEST_CASE_ST(ut_setup, ut_teardown, 14046 test_snow3g_encryption_test_case_1_oop), 14047 TEST_CASE_ST(ut_setup, ut_teardown, 14048 test_snow3g_encryption_test_case_1_oop_sgl), 14049 TEST_CASE_ST(ut_setup, ut_teardown, 14050 test_snow3g_encryption_test_case_1_offset_oop), 14051 TEST_CASE_ST(ut_setup, ut_teardown, 14052 test_snow3g_decryption_test_case_1_oop), 14053 14054 /** SNOW 3G generate auth, then encrypt (UEA2) */ 14055 TEST_CASE_ST(ut_setup, ut_teardown, 14056 test_snow3g_auth_cipher_test_case_1), 14057 TEST_CASE_ST(ut_setup, ut_teardown, 14058 test_snow3g_auth_cipher_test_case_2), 14059 TEST_CASE_ST(ut_setup, ut_teardown, 14060 test_snow3g_auth_cipher_test_case_2_oop), 14061 TEST_CASE_ST(ut_setup, ut_teardown, 14062 test_snow3g_auth_cipher_part_digest_enc), 14063 TEST_CASE_ST(ut_setup, ut_teardown, 14064 test_snow3g_auth_cipher_part_digest_enc_oop), 14065 TEST_CASE_ST(ut_setup, ut_teardown, 14066 test_snow3g_auth_cipher_test_case_3_sgl), 14067 TEST_CASE_ST(ut_setup, ut_teardown, 14068 test_snow3g_auth_cipher_test_case_3_oop_sgl), 14069 TEST_CASE_ST(ut_setup, ut_teardown, 14070 test_snow3g_auth_cipher_part_digest_enc_sgl), 14071 TEST_CASE_ST(ut_setup, ut_teardown, 14072 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 14073 14074 /** SNOW 3G decrypt (UEA2), then verify auth */ 14075 TEST_CASE_ST(ut_setup, ut_teardown, 14076 test_snow3g_auth_cipher_verify_test_case_1), 14077 TEST_CASE_ST(ut_setup, ut_teardown, 14078 test_snow3g_auth_cipher_verify_test_case_2), 14079 TEST_CASE_ST(ut_setup, ut_teardown, 14080 test_snow3g_auth_cipher_verify_test_case_2_oop), 14081 TEST_CASE_ST(ut_setup, ut_teardown, 14082 test_snow3g_auth_cipher_verify_part_digest_enc), 14083 TEST_CASE_ST(ut_setup, ut_teardown, 14084 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 14085 TEST_CASE_ST(ut_setup, ut_teardown, 14086 test_snow3g_auth_cipher_verify_test_case_3_sgl), 14087 TEST_CASE_ST(ut_setup, ut_teardown, 14088 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 14089 TEST_CASE_ST(ut_setup, ut_teardown, 14090 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 14091 TEST_CASE_ST(ut_setup, ut_teardown, 14092 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 14093 14094 /** SNOW 3G decrypt only (UEA2) */ 14095 TEST_CASE_ST(ut_setup, ut_teardown, 14096 test_snow3g_decryption_test_case_1), 14097 TEST_CASE_ST(ut_setup, ut_teardown, 14098 test_snow3g_decryption_test_case_2), 14099 TEST_CASE_ST(ut_setup, ut_teardown, 14100 test_snow3g_decryption_test_case_3), 14101 TEST_CASE_ST(ut_setup, ut_teardown, 14102 test_snow3g_decryption_test_case_4), 14103 TEST_CASE_ST(ut_setup, ut_teardown, 14104 test_snow3g_decryption_test_case_5), 14105 TEST_CASE_ST(ut_setup, ut_teardown, 14106 test_snow3g_decryption_with_digest_test_case_1), 14107 TEST_CASE_ST(ut_setup, ut_teardown, 14108 test_snow3g_hash_generate_test_case_1), 14109 TEST_CASE_ST(ut_setup, ut_teardown, 14110 test_snow3g_hash_generate_test_case_2), 14111 TEST_CASE_ST(ut_setup, ut_teardown, 14112 test_snow3g_hash_generate_test_case_3), 14113 14114 /* Tests with buffers which length is not byte-aligned */ 14115 TEST_CASE_ST(ut_setup, ut_teardown, 14116 test_snow3g_hash_generate_test_case_4), 14117 TEST_CASE_ST(ut_setup, ut_teardown, 14118 test_snow3g_hash_generate_test_case_5), 14119 TEST_CASE_ST(ut_setup, ut_teardown, 14120 test_snow3g_hash_generate_test_case_6), 14121 TEST_CASE_ST(ut_setup, ut_teardown, 14122 test_snow3g_hash_verify_test_case_1), 14123 TEST_CASE_ST(ut_setup, ut_teardown, 14124 test_snow3g_hash_verify_test_case_2), 14125 TEST_CASE_ST(ut_setup, ut_teardown, 14126 test_snow3g_hash_verify_test_case_3), 14127 14128 /* Tests with buffers which length is not byte-aligned */ 14129 TEST_CASE_ST(ut_setup, ut_teardown, 14130 test_snow3g_hash_verify_test_case_4), 14131 TEST_CASE_ST(ut_setup, ut_teardown, 14132 test_snow3g_hash_verify_test_case_5), 14133 TEST_CASE_ST(ut_setup, ut_teardown, 14134 test_snow3g_hash_verify_test_case_6), 14135 TEST_CASE_ST(ut_setup, ut_teardown, 14136 test_snow3g_cipher_auth_test_case_1), 14137 TEST_CASE_ST(ut_setup, ut_teardown, 14138 test_snow3g_auth_cipher_with_digest_test_case_1), 14139 TEST_CASES_END() 14140 } 14141 }; 14142 14143 static struct unit_test_suite cryptodev_zuc_testsuite = { 14144 .suite_name = "ZUC Test Suite", 14145 .setup = zuc_testsuite_setup, 14146 .unit_test_cases = { 14147 /** ZUC encrypt only (EEA3) */ 14148 TEST_CASE_ST(ut_setup, ut_teardown, 14149 test_zuc_encryption_test_case_1), 14150 TEST_CASE_ST(ut_setup, ut_teardown, 14151 test_zuc_encryption_test_case_2), 14152 TEST_CASE_ST(ut_setup, ut_teardown, 14153 test_zuc_encryption_test_case_3), 14154 TEST_CASE_ST(ut_setup, ut_teardown, 14155 test_zuc_encryption_test_case_4), 14156 TEST_CASE_ST(ut_setup, ut_teardown, 14157 test_zuc_encryption_test_case_5), 14158 TEST_CASE_ST(ut_setup, ut_teardown, 14159 test_zuc_encryption_test_case_6_sgl), 14160 14161 /** ZUC authenticate (EIA3) */ 14162 TEST_CASE_ST(ut_setup, ut_teardown, 14163 test_zuc_hash_generate_test_case_1), 14164 TEST_CASE_ST(ut_setup, ut_teardown, 14165 test_zuc_hash_generate_test_case_2), 14166 TEST_CASE_ST(ut_setup, ut_teardown, 14167 test_zuc_hash_generate_test_case_3), 14168 TEST_CASE_ST(ut_setup, ut_teardown, 14169 test_zuc_hash_generate_test_case_4), 14170 TEST_CASE_ST(ut_setup, ut_teardown, 14171 test_zuc_hash_generate_test_case_5), 14172 TEST_CASE_ST(ut_setup, ut_teardown, 14173 test_zuc_hash_generate_test_case_6), 14174 TEST_CASE_ST(ut_setup, ut_teardown, 14175 test_zuc_hash_generate_test_case_7), 14176 TEST_CASE_ST(ut_setup, ut_teardown, 14177 test_zuc_hash_generate_test_case_8), 14178 14179 /** ZUC alg-chain (EEA3/EIA3) */ 14180 TEST_CASE_ST(ut_setup, ut_teardown, 14181 test_zuc_cipher_auth_test_case_1), 14182 TEST_CASE_ST(ut_setup, ut_teardown, 14183 test_zuc_cipher_auth_test_case_2), 14184 14185 /** ZUC generate auth, then encrypt (EEA3) */ 14186 TEST_CASE_ST(ut_setup, ut_teardown, 14187 test_zuc_auth_cipher_test_case_1), 14188 TEST_CASE_ST(ut_setup, ut_teardown, 14189 test_zuc_auth_cipher_test_case_1_oop), 14190 TEST_CASE_ST(ut_setup, ut_teardown, 14191 test_zuc_auth_cipher_test_case_1_sgl), 14192 TEST_CASE_ST(ut_setup, ut_teardown, 14193 test_zuc_auth_cipher_test_case_1_oop_sgl), 14194 14195 /** ZUC decrypt (EEA3), then verify auth */ 14196 TEST_CASE_ST(ut_setup, ut_teardown, 14197 test_zuc_auth_cipher_verify_test_case_1), 14198 TEST_CASE_ST(ut_setup, ut_teardown, 14199 test_zuc_auth_cipher_verify_test_case_1_oop), 14200 TEST_CASE_ST(ut_setup, ut_teardown, 14201 test_zuc_auth_cipher_verify_test_case_1_sgl), 14202 TEST_CASE_ST(ut_setup, ut_teardown, 14203 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 14204 TEST_CASES_END() 14205 } 14206 }; 14207 14208 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = { 14209 .suite_name = "HMAC_MD5 Authentication Test Suite", 14210 .setup = hmac_md5_auth_testsuite_setup, 14211 .unit_test_cases = { 14212 TEST_CASE_ST(ut_setup, ut_teardown, 14213 test_MD5_HMAC_generate_case_1), 14214 TEST_CASE_ST(ut_setup, ut_teardown, 14215 test_MD5_HMAC_verify_case_1), 14216 TEST_CASE_ST(ut_setup, ut_teardown, 14217 test_MD5_HMAC_generate_case_2), 14218 TEST_CASE_ST(ut_setup, ut_teardown, 14219 test_MD5_HMAC_verify_case_2), 14220 TEST_CASES_END() 14221 } 14222 }; 14223 14224 static struct unit_test_suite cryptodev_kasumi_testsuite = { 14225 .suite_name = "Kasumi Test Suite", 14226 .setup = kasumi_testsuite_setup, 14227 .unit_test_cases = { 14228 /** KASUMI hash only (UIA1) */ 14229 TEST_CASE_ST(ut_setup, ut_teardown, 14230 test_kasumi_hash_generate_test_case_1), 14231 TEST_CASE_ST(ut_setup, ut_teardown, 14232 test_kasumi_hash_generate_test_case_2), 14233 TEST_CASE_ST(ut_setup, ut_teardown, 14234 test_kasumi_hash_generate_test_case_3), 14235 TEST_CASE_ST(ut_setup, ut_teardown, 14236 test_kasumi_hash_generate_test_case_4), 14237 TEST_CASE_ST(ut_setup, ut_teardown, 14238 test_kasumi_hash_generate_test_case_5), 14239 TEST_CASE_ST(ut_setup, ut_teardown, 14240 test_kasumi_hash_generate_test_case_6), 14241 14242 TEST_CASE_ST(ut_setup, ut_teardown, 14243 test_kasumi_hash_verify_test_case_1), 14244 TEST_CASE_ST(ut_setup, ut_teardown, 14245 test_kasumi_hash_verify_test_case_2), 14246 TEST_CASE_ST(ut_setup, ut_teardown, 14247 test_kasumi_hash_verify_test_case_3), 14248 TEST_CASE_ST(ut_setup, ut_teardown, 14249 test_kasumi_hash_verify_test_case_4), 14250 TEST_CASE_ST(ut_setup, ut_teardown, 14251 test_kasumi_hash_verify_test_case_5), 14252 14253 /** KASUMI encrypt only (UEA1) */ 14254 TEST_CASE_ST(ut_setup, ut_teardown, 14255 test_kasumi_encryption_test_case_1), 14256 TEST_CASE_ST(ut_setup, ut_teardown, 14257 test_kasumi_encryption_test_case_1_sgl), 14258 TEST_CASE_ST(ut_setup, ut_teardown, 14259 test_kasumi_encryption_test_case_1_oop), 14260 TEST_CASE_ST(ut_setup, ut_teardown, 14261 test_kasumi_encryption_test_case_1_oop_sgl), 14262 TEST_CASE_ST(ut_setup, ut_teardown, 14263 test_kasumi_encryption_test_case_2), 14264 TEST_CASE_ST(ut_setup, ut_teardown, 14265 test_kasumi_encryption_test_case_3), 14266 TEST_CASE_ST(ut_setup, ut_teardown, 14267 test_kasumi_encryption_test_case_4), 14268 TEST_CASE_ST(ut_setup, ut_teardown, 14269 test_kasumi_encryption_test_case_5), 14270 14271 /** KASUMI decrypt only (UEA1) */ 14272 TEST_CASE_ST(ut_setup, ut_teardown, 14273 test_kasumi_decryption_test_case_1), 14274 TEST_CASE_ST(ut_setup, ut_teardown, 14275 test_kasumi_decryption_test_case_2), 14276 TEST_CASE_ST(ut_setup, ut_teardown, 14277 test_kasumi_decryption_test_case_3), 14278 TEST_CASE_ST(ut_setup, ut_teardown, 14279 test_kasumi_decryption_test_case_4), 14280 TEST_CASE_ST(ut_setup, ut_teardown, 14281 test_kasumi_decryption_test_case_5), 14282 TEST_CASE_ST(ut_setup, ut_teardown, 14283 test_kasumi_decryption_test_case_1_oop), 14284 14285 TEST_CASE_ST(ut_setup, ut_teardown, 14286 test_kasumi_cipher_auth_test_case_1), 14287 14288 /** KASUMI generate auth, then encrypt (F8) */ 14289 TEST_CASE_ST(ut_setup, ut_teardown, 14290 test_kasumi_auth_cipher_test_case_1), 14291 TEST_CASE_ST(ut_setup, ut_teardown, 14292 test_kasumi_auth_cipher_test_case_2), 14293 TEST_CASE_ST(ut_setup, ut_teardown, 14294 test_kasumi_auth_cipher_test_case_2_oop), 14295 TEST_CASE_ST(ut_setup, ut_teardown, 14296 test_kasumi_auth_cipher_test_case_2_sgl), 14297 TEST_CASE_ST(ut_setup, ut_teardown, 14298 test_kasumi_auth_cipher_test_case_2_oop_sgl), 14299 14300 /** KASUMI decrypt (F8), then verify auth */ 14301 TEST_CASE_ST(ut_setup, ut_teardown, 14302 test_kasumi_auth_cipher_verify_test_case_1), 14303 TEST_CASE_ST(ut_setup, ut_teardown, 14304 test_kasumi_auth_cipher_verify_test_case_2), 14305 TEST_CASE_ST(ut_setup, ut_teardown, 14306 test_kasumi_auth_cipher_verify_test_case_2_oop), 14307 TEST_CASE_ST(ut_setup, ut_teardown, 14308 test_kasumi_auth_cipher_verify_test_case_2_sgl), 14309 TEST_CASE_ST(ut_setup, ut_teardown, 14310 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 14311 14312 TEST_CASES_END() 14313 } 14314 }; 14315 14316 static struct unit_test_suite cryptodev_esn_testsuite = { 14317 .suite_name = "ESN Test Suite", 14318 .setup = esn_testsuite_setup, 14319 .unit_test_cases = { 14320 TEST_CASE_ST(ut_setup, ut_teardown, 14321 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 14322 TEST_CASE_ST(ut_setup, ut_teardown, 14323 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 14324 TEST_CASES_END() 14325 } 14326 }; 14327 14328 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = { 14329 .suite_name = "Negative AES GCM Test Suite", 14330 .setup = negative_aes_gcm_testsuite_setup, 14331 .unit_test_cases = { 14332 TEST_CASE_ST(ut_setup, ut_teardown, 14333 test_AES_GCM_auth_encryption_fail_iv_corrupt), 14334 TEST_CASE_ST(ut_setup, ut_teardown, 14335 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 14336 TEST_CASE_ST(ut_setup, ut_teardown, 14337 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 14338 TEST_CASE_ST(ut_setup, ut_teardown, 14339 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 14340 TEST_CASE_ST(ut_setup, ut_teardown, 14341 test_AES_GCM_auth_encryption_fail_aad_corrupt), 14342 TEST_CASE_ST(ut_setup, ut_teardown, 14343 test_AES_GCM_auth_encryption_fail_tag_corrupt), 14344 TEST_CASE_ST(ut_setup, ut_teardown, 14345 test_AES_GCM_auth_decryption_fail_iv_corrupt), 14346 TEST_CASE_ST(ut_setup, ut_teardown, 14347 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 14348 TEST_CASE_ST(ut_setup, ut_teardown, 14349 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 14350 TEST_CASE_ST(ut_setup, ut_teardown, 14351 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 14352 TEST_CASE_ST(ut_setup, ut_teardown, 14353 test_AES_GCM_auth_decryption_fail_aad_corrupt), 14354 TEST_CASE_ST(ut_setup, ut_teardown, 14355 test_AES_GCM_auth_decryption_fail_tag_corrupt), 14356 14357 TEST_CASES_END() 14358 } 14359 }; 14360 14361 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = { 14362 .suite_name = "Negative AES GMAC Test Suite", 14363 .setup = negative_aes_gmac_testsuite_setup, 14364 .unit_test_cases = { 14365 TEST_CASE_ST(ut_setup, ut_teardown, 14366 authentication_verify_AES128_GMAC_fail_data_corrupt), 14367 TEST_CASE_ST(ut_setup, ut_teardown, 14368 authentication_verify_AES128_GMAC_fail_tag_corrupt), 14369 14370 TEST_CASES_END() 14371 } 14372 }; 14373 14374 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = { 14375 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite", 14376 .setup = mixed_cipher_hash_testsuite_setup, 14377 .unit_test_cases = { 14378 /** AUTH AES CMAC + CIPHER AES CTR */ 14379 TEST_CASE_ST(ut_setup, ut_teardown, 14380 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 14381 TEST_CASE_ST(ut_setup, ut_teardown, 14382 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14383 TEST_CASE_ST(ut_setup, ut_teardown, 14384 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14385 TEST_CASE_ST(ut_setup, ut_teardown, 14386 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14387 TEST_CASE_ST(ut_setup, ut_teardown, 14388 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 14389 TEST_CASE_ST(ut_setup, ut_teardown, 14390 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14391 TEST_CASE_ST(ut_setup, ut_teardown, 14392 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14393 TEST_CASE_ST(ut_setup, ut_teardown, 14394 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14395 14396 /** AUTH ZUC + CIPHER SNOW3G */ 14397 TEST_CASE_ST(ut_setup, ut_teardown, 14398 test_auth_zuc_cipher_snow_test_case_1), 14399 TEST_CASE_ST(ut_setup, ut_teardown, 14400 test_verify_auth_zuc_cipher_snow_test_case_1), 14401 /** AUTH AES CMAC + CIPHER SNOW3G */ 14402 TEST_CASE_ST(ut_setup, ut_teardown, 14403 test_auth_aes_cmac_cipher_snow_test_case_1), 14404 TEST_CASE_ST(ut_setup, ut_teardown, 14405 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 14406 /** AUTH ZUC + CIPHER AES CTR */ 14407 TEST_CASE_ST(ut_setup, ut_teardown, 14408 test_auth_zuc_cipher_aes_ctr_test_case_1), 14409 TEST_CASE_ST(ut_setup, ut_teardown, 14410 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 14411 /** AUTH SNOW3G + CIPHER AES CTR */ 14412 TEST_CASE_ST(ut_setup, ut_teardown, 14413 test_auth_snow_cipher_aes_ctr_test_case_1), 14414 TEST_CASE_ST(ut_setup, ut_teardown, 14415 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 14416 /** AUTH SNOW3G + CIPHER ZUC */ 14417 TEST_CASE_ST(ut_setup, ut_teardown, 14418 test_auth_snow_cipher_zuc_test_case_1), 14419 TEST_CASE_ST(ut_setup, ut_teardown, 14420 test_verify_auth_snow_cipher_zuc_test_case_1), 14421 /** AUTH AES CMAC + CIPHER ZUC */ 14422 TEST_CASE_ST(ut_setup, ut_teardown, 14423 test_auth_aes_cmac_cipher_zuc_test_case_1), 14424 TEST_CASE_ST(ut_setup, ut_teardown, 14425 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 14426 14427 /** AUTH NULL + CIPHER SNOW3G */ 14428 TEST_CASE_ST(ut_setup, ut_teardown, 14429 test_auth_null_cipher_snow_test_case_1), 14430 TEST_CASE_ST(ut_setup, ut_teardown, 14431 test_verify_auth_null_cipher_snow_test_case_1), 14432 /** AUTH NULL + CIPHER ZUC */ 14433 TEST_CASE_ST(ut_setup, ut_teardown, 14434 test_auth_null_cipher_zuc_test_case_1), 14435 TEST_CASE_ST(ut_setup, ut_teardown, 14436 test_verify_auth_null_cipher_zuc_test_case_1), 14437 /** AUTH SNOW3G + CIPHER NULL */ 14438 TEST_CASE_ST(ut_setup, ut_teardown, 14439 test_auth_snow_cipher_null_test_case_1), 14440 TEST_CASE_ST(ut_setup, ut_teardown, 14441 test_verify_auth_snow_cipher_null_test_case_1), 14442 /** AUTH ZUC + CIPHER NULL */ 14443 TEST_CASE_ST(ut_setup, ut_teardown, 14444 test_auth_zuc_cipher_null_test_case_1), 14445 TEST_CASE_ST(ut_setup, ut_teardown, 14446 test_verify_auth_zuc_cipher_null_test_case_1), 14447 /** AUTH NULL + CIPHER AES CTR */ 14448 TEST_CASE_ST(ut_setup, ut_teardown, 14449 test_auth_null_cipher_aes_ctr_test_case_1), 14450 TEST_CASE_ST(ut_setup, ut_teardown, 14451 test_verify_auth_null_cipher_aes_ctr_test_case_1), 14452 /** AUTH AES CMAC + CIPHER NULL */ 14453 TEST_CASE_ST(ut_setup, ut_teardown, 14454 test_auth_aes_cmac_cipher_null_test_case_1), 14455 TEST_CASE_ST(ut_setup, ut_teardown, 14456 test_verify_auth_aes_cmac_cipher_null_test_case_1), 14457 TEST_CASES_END() 14458 } 14459 }; 14460 14461 static int 14462 run_cryptodev_testsuite(const char *pmd_name) 14463 { 14464 uint8_t ret, j, i = 0, blk_start_idx = 0; 14465 const enum blockcipher_test_type blk_suites[] = { 14466 BLKCIPHER_AES_CHAIN_TYPE, 14467 BLKCIPHER_AES_CIPHERONLY_TYPE, 14468 BLKCIPHER_AES_DOCSIS_TYPE, 14469 BLKCIPHER_3DES_CHAIN_TYPE, 14470 BLKCIPHER_3DES_CIPHERONLY_TYPE, 14471 BLKCIPHER_DES_CIPHERONLY_TYPE, 14472 BLKCIPHER_DES_DOCSIS_TYPE, 14473 BLKCIPHER_AUTHONLY_TYPE}; 14474 struct unit_test_suite *static_suites[] = { 14475 &cryptodev_multi_session_testsuite, 14476 &cryptodev_null_testsuite, 14477 &cryptodev_aes_ccm_auth_testsuite, 14478 &cryptodev_aes_gcm_auth_testsuite, 14479 &cryptodev_aes_gmac_auth_testsuite, 14480 &cryptodev_snow3g_testsuite, 14481 &cryptodev_chacha20_poly1305_testsuite, 14482 &cryptodev_zuc_testsuite, 14483 &cryptodev_hmac_md5_auth_testsuite, 14484 &cryptodev_kasumi_testsuite, 14485 &cryptodev_esn_testsuite, 14486 &cryptodev_negative_aes_gcm_testsuite, 14487 &cryptodev_negative_aes_gmac_testsuite, 14488 &cryptodev_mixed_cipher_hash_testsuite, 14489 &cryptodev_negative_hmac_sha1_testsuite, 14490 &cryptodev_gen_testsuite, 14491 #ifdef RTE_LIB_SECURITY 14492 &pdcp_proto_testsuite, 14493 &docsis_proto_testsuite, 14494 #endif 14495 &end_testsuite 14496 }; 14497 static struct unit_test_suite ts = { 14498 .suite_name = "Cryptodev Unit Test Suite", 14499 .setup = testsuite_setup, 14500 .teardown = testsuite_teardown, 14501 .unit_test_cases = {TEST_CASES_END()} 14502 }; 14503 14504 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name); 14505 14506 if (gbl_driver_id == -1) { 14507 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name); 14508 return TEST_SKIPPED; 14509 } 14510 14511 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 14512 (RTE_DIM(blk_suites) + RTE_DIM(static_suites))); 14513 14514 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites)); 14515 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 14516 ret = unit_test_suite_runner(&ts); 14517 14518 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites)); 14519 free(ts.unit_test_suites); 14520 return ret; 14521 } 14522 14523 static int 14524 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/) 14525 { 14526 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 14527 } 14528 14529 static int 14530 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/) 14531 { 14532 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 14533 } 14534 14535 static int 14536 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/) 14537 { 14538 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14539 } 14540 14541 static int 14542 test_cryptodev_cpu_aesni_mb(void) 14543 { 14544 int32_t rc; 14545 enum rte_security_session_action_type at = gbl_action_type; 14546 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 14547 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14548 gbl_action_type = at; 14549 return rc; 14550 } 14551 14552 static int 14553 test_cryptodev_openssl(void) 14554 { 14555 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 14556 } 14557 14558 static int 14559 test_cryptodev_aesni_gcm(void) 14560 { 14561 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 14562 } 14563 14564 static int 14565 test_cryptodev_cpu_aesni_gcm(void) 14566 { 14567 int32_t rc; 14568 enum rte_security_session_action_type at = gbl_action_type; 14569 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 14570 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 14571 gbl_action_type = at; 14572 return rc; 14573 } 14574 14575 static int 14576 test_cryptodev_null(void) 14577 { 14578 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 14579 } 14580 14581 static int 14582 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/) 14583 { 14584 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 14585 } 14586 14587 static int 14588 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/) 14589 { 14590 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 14591 } 14592 14593 static int 14594 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/) 14595 { 14596 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 14597 } 14598 14599 static int 14600 test_cryptodev_armv8(void) 14601 { 14602 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 14603 } 14604 14605 static int 14606 test_cryptodev_mrvl(void) 14607 { 14608 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 14609 } 14610 14611 #ifdef RTE_CRYPTO_SCHEDULER 14612 14613 static int 14614 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/) 14615 { 14616 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0; 14617 const enum blockcipher_test_type blk_suites[] = { 14618 BLKCIPHER_AES_CHAIN_TYPE, 14619 BLKCIPHER_AES_CIPHERONLY_TYPE, 14620 BLKCIPHER_AUTHONLY_TYPE 14621 }; 14622 static struct unit_test_suite scheduler_multicore = { 14623 .suite_name = "Scheduler Multicore Unit Test Suite", 14624 .setup = scheduler_multicore_testsuite_setup, 14625 .teardown = scheduler_mode_testsuite_teardown, 14626 .unit_test_cases = {TEST_CASES_END()} 14627 }; 14628 static struct unit_test_suite scheduler_round_robin = { 14629 .suite_name = "Scheduler Round Robin Unit Test Suite", 14630 .setup = scheduler_roundrobin_testsuite_setup, 14631 .teardown = scheduler_mode_testsuite_teardown, 14632 .unit_test_cases = {TEST_CASES_END()} 14633 }; 14634 static struct unit_test_suite scheduler_failover = { 14635 .suite_name = "Scheduler Failover Unit Test Suite", 14636 .setup = scheduler_failover_testsuite_setup, 14637 .teardown = scheduler_mode_testsuite_teardown, 14638 .unit_test_cases = {TEST_CASES_END()} 14639 }; 14640 static struct unit_test_suite scheduler_pkt_size_distr = { 14641 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite", 14642 .setup = scheduler_pkt_size_distr_testsuite_setup, 14643 .teardown = scheduler_mode_testsuite_teardown, 14644 .unit_test_cases = {TEST_CASES_END()} 14645 }; 14646 struct unit_test_suite *sched_mode_suites[] = { 14647 &scheduler_multicore, 14648 &scheduler_round_robin, 14649 &scheduler_failover, 14650 &scheduler_pkt_size_distr 14651 }; 14652 static struct unit_test_suite scheduler_config = { 14653 .suite_name = "Crypto Device Scheduler Config Unit Test Suite", 14654 .unit_test_cases = { 14655 TEST_CASE(test_scheduler_attach_slave_op), 14656 TEST_CASE(test_scheduler_mode_multicore_op), 14657 TEST_CASE(test_scheduler_mode_roundrobin_op), 14658 TEST_CASE(test_scheduler_mode_failover_op), 14659 TEST_CASE(test_scheduler_mode_pkt_size_distr_op), 14660 TEST_CASE(test_scheduler_detach_slave_op), 14661 14662 TEST_CASES_END() /**< NULL terminate array */ 14663 } 14664 }; 14665 struct unit_test_suite *static_suites[] = { 14666 &scheduler_config, 14667 &end_testsuite 14668 }; 14669 static struct unit_test_suite ts = { 14670 .suite_name = "Scheduler Unit Test Suite", 14671 .setup = scheduler_testsuite_setup, 14672 .teardown = testsuite_teardown, 14673 .unit_test_cases = {TEST_CASES_END()} 14674 }; 14675 14676 gbl_driver_id = rte_cryptodev_driver_id_get( 14677 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 14678 14679 if (gbl_driver_id == -1) { 14680 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 14681 return TEST_SKIPPED; 14682 } 14683 14684 if (rte_cryptodev_driver_id_get( 14685 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 14686 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 14687 return TEST_SKIPPED; 14688 } 14689 14690 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 14691 uint8_t blk_i = 0; 14692 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof 14693 (struct unit_test_suite *) * 14694 (RTE_DIM(blk_suites) + 1)); 14695 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]), 14696 blk_suites, RTE_DIM(blk_suites)); 14697 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite; 14698 } 14699 14700 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 14701 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites))); 14702 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites, 14703 RTE_DIM(sched_mode_suites)); 14704 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 14705 ret = unit_test_suite_runner(&ts); 14706 14707 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 14708 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, 14709 (*sched_mode_suites[sched_i]), 14710 RTE_DIM(blk_suites)); 14711 free(sched_mode_suites[sched_i]->unit_test_suites); 14712 } 14713 free(ts.unit_test_suites); 14714 return ret; 14715 } 14716 14717 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 14718 14719 #endif 14720 14721 static int 14722 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/) 14723 { 14724 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 14725 } 14726 14727 static int 14728 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/) 14729 { 14730 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 14731 } 14732 14733 static int 14734 test_cryptodev_ccp(void) 14735 { 14736 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 14737 } 14738 14739 static int 14740 test_cryptodev_octeontx(void) 14741 { 14742 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 14743 } 14744 14745 static int 14746 test_cryptodev_octeontx2(void) 14747 { 14748 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)); 14749 } 14750 14751 static int 14752 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/) 14753 { 14754 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 14755 } 14756 14757 static int 14758 test_cryptodev_nitrox(void) 14759 { 14760 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 14761 } 14762 14763 static int 14764 test_cryptodev_bcmfs(void) 14765 { 14766 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 14767 } 14768 14769 static int 14770 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/) 14771 { 14772 int ret; 14773 14774 global_api_test_type = CRYPTODEV_RAW_API_TEST; 14775 ret = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 14776 global_api_test_type = CRYPTODEV_API_TEST; 14777 14778 return ret; 14779 } 14780 14781 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 14782 test_cryptodev_qat_raw_api); 14783 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 14784 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 14785 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 14786 test_cryptodev_cpu_aesni_mb); 14787 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 14788 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 14789 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 14790 test_cryptodev_cpu_aesni_gcm); 14791 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 14792 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 14793 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 14794 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 14795 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 14796 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 14797 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 14798 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 14799 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 14800 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 14801 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 14802 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2); 14803 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 14804 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 14805 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 14806