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_ip.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_ipsec.h" 46 #include "test_cryptodev_security_ipsec_test_vectors.h" 47 #include "test_cryptodev_security_pdcp_test_vectors.h" 48 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 49 #include "test_cryptodev_security_pdcp_test_func.h" 50 #include "test_cryptodev_security_docsis_test_vectors.h" 51 52 #define SDAP_DISABLED 0 53 #define SDAP_ENABLED 1 54 #endif 55 56 #define VDEV_ARGS_SIZE 100 57 #define MAX_NB_SESSIONS 4 58 59 #define MAX_DRV_SERVICE_CTX_SIZE 256 60 61 #define MAX_RAW_DEQUEUE_COUNT 65535 62 63 #define IN_PLACE 0 64 #define OUT_OF_PLACE 1 65 66 static int gbl_driver_id; 67 68 static enum rte_security_session_action_type gbl_action_type = 69 RTE_SECURITY_ACTION_TYPE_NONE; 70 71 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 72 73 struct crypto_unittest_params { 74 struct rte_crypto_sym_xform cipher_xform; 75 struct rte_crypto_sym_xform auth_xform; 76 struct rte_crypto_sym_xform aead_xform; 77 #ifdef RTE_LIB_SECURITY 78 struct rte_security_docsis_xform docsis_xform; 79 #endif 80 81 union { 82 struct rte_cryptodev_sym_session *sess; 83 #ifdef RTE_LIB_SECURITY 84 struct rte_security_session *sec_session; 85 #endif 86 }; 87 #ifdef RTE_LIB_SECURITY 88 enum rte_security_session_action_type type; 89 #endif 90 struct rte_crypto_op *op; 91 92 struct rte_mbuf *obuf, *ibuf; 93 94 uint8_t *digest; 95 }; 96 97 #define ALIGN_POW2_ROUNDUP(num, align) \ 98 (((num) + (align) - 1) & ~((align) - 1)) 99 100 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \ 101 for (j = 0; j < num_child_ts; index++, j++) \ 102 parent_ts.unit_test_suites[index] = child_ts[j] 103 104 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \ 105 for (j = 0; j < num_blk_types; index++, j++) \ 106 parent_ts.unit_test_suites[index] = \ 107 build_blockcipher_test_suite(blk_types[j]) 108 109 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \ 110 for (j = index; j < index + num_blk_types; j++) \ 111 free_blockcipher_test_suite(parent_ts.unit_test_suites[j]) 112 113 /* 114 * Forward declarations. 115 */ 116 static int 117 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 118 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 119 uint8_t *hmac_key); 120 121 static int 122 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 123 struct crypto_unittest_params *ut_params, 124 struct crypto_testsuite_params *ts_param, 125 const uint8_t *cipher, 126 const uint8_t *digest, 127 const uint8_t *iv); 128 129 static int 130 security_proto_supported(enum rte_security_session_action_type action, 131 enum rte_security_session_protocol proto); 132 133 static int 134 dev_configure_and_start(uint64_t ff_disable); 135 136 static struct rte_mbuf * 137 setup_test_string(struct rte_mempool *mpool, 138 const char *string, size_t len, uint8_t blocksize) 139 { 140 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 141 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 142 143 if (m) { 144 char *dst; 145 146 memset(m->buf_addr, 0, m->buf_len); 147 dst = rte_pktmbuf_append(m, t_len); 148 if (!dst) { 149 rte_pktmbuf_free(m); 150 return NULL; 151 } 152 if (string != NULL) 153 rte_memcpy(dst, string, t_len); 154 else 155 memset(dst, 0, t_len); 156 } 157 158 return m; 159 } 160 161 /* Get number of bytes in X bits (rounding up) */ 162 static uint32_t 163 ceil_byte_length(uint32_t num_bits) 164 { 165 if (num_bits % 8) 166 return ((num_bits >> 3) + 1); 167 else 168 return (num_bits >> 3); 169 } 170 171 static void 172 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 173 uint8_t is_op_success) 174 { 175 struct rte_crypto_op *op = user_data; 176 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 177 RTE_CRYPTO_OP_STATUS_ERROR; 178 } 179 180 void 181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 182 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 183 uint8_t len_in_bits, uint8_t cipher_iv_len) 184 { 185 struct rte_crypto_sym_op *sop = op->sym; 186 struct rte_crypto_op *ret_op = NULL; 187 struct rte_crypto_vec data_vec[UINT8_MAX]; 188 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 189 union rte_crypto_sym_ofs ofs; 190 struct rte_crypto_sym_vec vec; 191 struct rte_crypto_sgl sgl; 192 uint32_t max_len; 193 union rte_cryptodev_session_ctx sess; 194 uint32_t count = 0; 195 struct rte_crypto_raw_dp_ctx *ctx; 196 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 197 auth_len = 0; 198 int32_t n; 199 uint32_t n_success; 200 int ctx_service_size; 201 int32_t status = 0; 202 int enqueue_status, dequeue_status; 203 204 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id); 205 if (ctx_service_size < 0) { 206 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 207 return; 208 } 209 210 ctx = malloc(ctx_service_size); 211 if (!ctx) { 212 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 213 return; 214 } 215 216 /* Both are enums, setting crypto_sess will suit any session type */ 217 sess.crypto_sess = op->sym->session; 218 219 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, 220 op->sess_type, sess, 0) < 0) { 221 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 222 goto exit; 223 } 224 225 cipher_iv.iova = 0; 226 cipher_iv.va = NULL; 227 aad_auth_iv.iova = 0; 228 aad_auth_iv.va = NULL; 229 digest.iova = 0; 230 digest.va = NULL; 231 sgl.vec = data_vec; 232 vec.num = 1; 233 vec.sgl = &sgl; 234 vec.iv = &cipher_iv; 235 vec.digest = &digest; 236 vec.aad = &aad_auth_iv; 237 vec.status = &status; 238 239 ofs.raw = 0; 240 241 if (is_cipher && is_auth) { 242 cipher_offset = sop->cipher.data.offset; 243 cipher_len = sop->cipher.data.length; 244 auth_offset = sop->auth.data.offset; 245 auth_len = sop->auth.data.length; 246 max_len = RTE_MAX(cipher_offset + cipher_len, 247 auth_offset + auth_len); 248 if (len_in_bits) { 249 max_len = max_len >> 3; 250 cipher_offset = cipher_offset >> 3; 251 auth_offset = auth_offset >> 3; 252 cipher_len = cipher_len >> 3; 253 auth_len = auth_len >> 3; 254 } 255 ofs.ofs.cipher.head = cipher_offset; 256 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 257 ofs.ofs.auth.head = auth_offset; 258 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 259 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 260 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 261 aad_auth_iv.va = rte_crypto_op_ctod_offset( 262 op, void *, IV_OFFSET + cipher_iv_len); 263 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 264 cipher_iv_len); 265 digest.va = (void *)sop->auth.digest.data; 266 digest.iova = sop->auth.digest.phys_addr; 267 268 } else if (is_cipher) { 269 cipher_offset = sop->cipher.data.offset; 270 cipher_len = sop->cipher.data.length; 271 max_len = cipher_len + cipher_offset; 272 if (len_in_bits) { 273 max_len = max_len >> 3; 274 cipher_offset = cipher_offset >> 3; 275 cipher_len = cipher_len >> 3; 276 } 277 ofs.ofs.cipher.head = cipher_offset; 278 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 279 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 280 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 281 282 } else if (is_auth) { 283 auth_offset = sop->auth.data.offset; 284 auth_len = sop->auth.data.length; 285 max_len = auth_len + auth_offset; 286 if (len_in_bits) { 287 max_len = max_len >> 3; 288 auth_offset = auth_offset >> 3; 289 auth_len = auth_len >> 3; 290 } 291 ofs.ofs.auth.head = auth_offset; 292 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 293 aad_auth_iv.va = rte_crypto_op_ctod_offset( 294 op, void *, IV_OFFSET + cipher_iv_len); 295 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 296 cipher_iv_len); 297 digest.va = (void *)sop->auth.digest.data; 298 digest.iova = sop->auth.digest.phys_addr; 299 300 } else { /* aead */ 301 cipher_offset = sop->aead.data.offset; 302 cipher_len = sop->aead.data.length; 303 max_len = cipher_len + cipher_offset; 304 if (len_in_bits) { 305 max_len = max_len >> 3; 306 cipher_offset = cipher_offset >> 3; 307 cipher_len = cipher_len >> 3; 308 } 309 ofs.ofs.cipher.head = cipher_offset; 310 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 311 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 312 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 313 aad_auth_iv.va = (void *)sop->aead.aad.data; 314 aad_auth_iv.iova = sop->aead.aad.phys_addr; 315 digest.va = (void *)sop->aead.digest.data; 316 digest.iova = sop->aead.digest.phys_addr; 317 } 318 319 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 320 data_vec, RTE_DIM(data_vec)); 321 if (n < 0 || n > sop->m_src->nb_segs) { 322 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 323 goto exit; 324 } 325 326 sgl.num = n; 327 328 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 329 &enqueue_status) < 1) { 330 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 331 goto exit; 332 } 333 334 if (enqueue_status == 0) { 335 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 336 if (status < 0) { 337 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 338 goto exit; 339 } 340 } else if (enqueue_status < 0) { 341 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 342 goto exit; 343 } 344 345 n = n_success = 0; 346 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 347 n = rte_cryptodev_raw_dequeue_burst(ctx, 348 NULL, 1, post_process_raw_dp_op, 349 (void **)&ret_op, 0, &n_success, 350 &dequeue_status); 351 if (dequeue_status < 0) { 352 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 353 goto exit; 354 } 355 if (n == 0) 356 rte_pause(); 357 } 358 359 if (n == 1 && dequeue_status == 0) { 360 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 361 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 362 goto exit; 363 } 364 } 365 366 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 367 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 368 RTE_CRYPTO_OP_STATUS_SUCCESS; 369 370 exit: 371 free(ctx); 372 } 373 374 static void 375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 376 { 377 int32_t n, st; 378 struct rte_crypto_sym_op *sop; 379 union rte_crypto_sym_ofs ofs; 380 struct rte_crypto_sgl sgl; 381 struct rte_crypto_sym_vec symvec; 382 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 383 struct rte_crypto_vec vec[UINT8_MAX]; 384 385 sop = op->sym; 386 387 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 388 sop->aead.data.length, vec, RTE_DIM(vec)); 389 390 if (n < 0 || n != sop->m_src->nb_segs) { 391 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 392 return; 393 } 394 395 sgl.vec = vec; 396 sgl.num = n; 397 symvec.sgl = &sgl; 398 symvec.iv = &iv_ptr; 399 symvec.digest = &digest_ptr; 400 symvec.aad = &aad_ptr; 401 symvec.status = &st; 402 symvec.num = 1; 403 404 /* for CPU crypto the IOVA address is not required */ 405 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 406 digest_ptr.va = (void *)sop->aead.digest.data; 407 aad_ptr.va = (void *)sop->aead.aad.data; 408 409 ofs.raw = 0; 410 411 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 412 &symvec); 413 414 if (n != 1) 415 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 416 else 417 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 418 } 419 420 static void 421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 422 { 423 int32_t n, st; 424 struct rte_crypto_sym_op *sop; 425 union rte_crypto_sym_ofs ofs; 426 struct rte_crypto_sgl sgl; 427 struct rte_crypto_sym_vec symvec; 428 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 429 struct rte_crypto_vec vec[UINT8_MAX]; 430 431 sop = op->sym; 432 433 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 434 sop->auth.data.length, vec, RTE_DIM(vec)); 435 436 if (n < 0 || n != sop->m_src->nb_segs) { 437 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 438 return; 439 } 440 441 sgl.vec = vec; 442 sgl.num = n; 443 symvec.sgl = &sgl; 444 symvec.iv = &iv_ptr; 445 symvec.digest = &digest_ptr; 446 symvec.status = &st; 447 symvec.num = 1; 448 449 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 450 digest_ptr.va = (void *)sop->auth.digest.data; 451 452 ofs.raw = 0; 453 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 454 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 455 (sop->cipher.data.offset + sop->cipher.data.length); 456 457 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 458 &symvec); 459 460 if (n != 1) 461 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 462 else 463 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 464 } 465 466 static struct rte_crypto_op * 467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 468 { 469 470 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 471 472 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 473 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 474 return NULL; 475 } 476 477 op = NULL; 478 479 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 480 rte_pause(); 481 482 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 483 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 484 return NULL; 485 } 486 487 return op; 488 } 489 490 static struct crypto_testsuite_params testsuite_params = { NULL }; 491 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; 492 static struct crypto_unittest_params unittest_params; 493 494 static int 495 testsuite_setup(void) 496 { 497 struct crypto_testsuite_params *ts_params = &testsuite_params; 498 struct rte_cryptodev_info info; 499 uint32_t i = 0, nb_devs, dev_id; 500 uint16_t qp_id; 501 502 memset(ts_params, 0, sizeof(*ts_params)); 503 504 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 505 if (ts_params->mbuf_pool == NULL) { 506 /* Not already created so create */ 507 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 508 "CRYPTO_MBUFPOOL", 509 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 510 rte_socket_id()); 511 if (ts_params->mbuf_pool == NULL) { 512 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 513 return TEST_FAILED; 514 } 515 } 516 517 ts_params->large_mbuf_pool = rte_mempool_lookup( 518 "CRYPTO_LARGE_MBUFPOOL"); 519 if (ts_params->large_mbuf_pool == NULL) { 520 /* Not already created so create */ 521 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 522 "CRYPTO_LARGE_MBUFPOOL", 523 1, 0, 0, UINT16_MAX, 524 rte_socket_id()); 525 if (ts_params->large_mbuf_pool == NULL) { 526 RTE_LOG(ERR, USER1, 527 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 528 return TEST_FAILED; 529 } 530 } 531 532 ts_params->op_mpool = rte_crypto_op_pool_create( 533 "MBUF_CRYPTO_SYM_OP_POOL", 534 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 535 NUM_MBUFS, MBUF_CACHE_SIZE, 536 DEFAULT_NUM_XFORMS * 537 sizeof(struct rte_crypto_sym_xform) + 538 MAXIMUM_IV_LENGTH, 539 rte_socket_id()); 540 if (ts_params->op_mpool == NULL) { 541 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 542 return TEST_FAILED; 543 } 544 545 nb_devs = rte_cryptodev_count(); 546 if (nb_devs < 1) { 547 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 548 return TEST_SKIPPED; 549 } 550 551 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) { 552 RTE_LOG(WARNING, USER1, "No %s devices found?\n", 553 rte_cryptodev_driver_name_get(gbl_driver_id)); 554 return TEST_SKIPPED; 555 } 556 557 /* Create list of valid crypto devs */ 558 for (i = 0; i < nb_devs; i++) { 559 rte_cryptodev_info_get(i, &info); 560 if (info.driver_id == gbl_driver_id) 561 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 562 } 563 564 if (ts_params->valid_dev_count < 1) 565 return TEST_FAILED; 566 567 /* Set up all the qps on the first of the valid devices found */ 568 569 dev_id = ts_params->valid_devs[0]; 570 571 rte_cryptodev_info_get(dev_id, &info); 572 573 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 574 ts_params->conf.socket_id = SOCKET_ID_ANY; 575 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 576 577 unsigned int session_size = 578 rte_cryptodev_sym_get_private_session_size(dev_id); 579 580 #ifdef RTE_LIB_SECURITY 581 unsigned int security_session_size = rte_security_session_get_size( 582 rte_cryptodev_get_sec_ctx(dev_id)); 583 584 if (session_size < security_session_size) 585 session_size = security_session_size; 586 #endif 587 /* 588 * Create mempool with maximum number of sessions. 589 */ 590 if (info.sym.max_nb_sessions != 0 && 591 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 592 RTE_LOG(ERR, USER1, "Device does not support " 593 "at least %u sessions\n", 594 MAX_NB_SESSIONS); 595 return TEST_FAILED; 596 } 597 598 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 599 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 600 SOCKET_ID_ANY); 601 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 602 "session mempool allocation failed"); 603 604 ts_params->session_priv_mpool = rte_mempool_create( 605 "test_sess_mp_priv", 606 MAX_NB_SESSIONS, 607 session_size, 608 0, 0, NULL, NULL, NULL, 609 NULL, SOCKET_ID_ANY, 610 0); 611 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 612 "session mempool allocation failed"); 613 614 615 616 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 617 &ts_params->conf), 618 "Failed to configure cryptodev %u with %u qps", 619 dev_id, ts_params->conf.nb_queue_pairs); 620 621 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 622 ts_params->qp_conf.mp_session = ts_params->session_mpool; 623 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 624 625 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 626 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 627 dev_id, qp_id, &ts_params->qp_conf, 628 rte_cryptodev_socket_id(dev_id)), 629 "Failed to setup queue pair %u on cryptodev %u", 630 qp_id, dev_id); 631 } 632 633 return TEST_SUCCESS; 634 } 635 636 static void 637 testsuite_teardown(void) 638 { 639 struct crypto_testsuite_params *ts_params = &testsuite_params; 640 int res; 641 642 if (ts_params->mbuf_pool != NULL) { 643 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 644 rte_mempool_avail_count(ts_params->mbuf_pool)); 645 } 646 647 if (ts_params->op_mpool != NULL) { 648 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 649 rte_mempool_avail_count(ts_params->op_mpool)); 650 } 651 652 /* Free session mempools */ 653 if (ts_params->session_priv_mpool != NULL) { 654 rte_mempool_free(ts_params->session_priv_mpool); 655 ts_params->session_priv_mpool = NULL; 656 } 657 658 if (ts_params->session_mpool != NULL) { 659 rte_mempool_free(ts_params->session_mpool); 660 ts_params->session_mpool = NULL; 661 } 662 663 res = rte_cryptodev_close(ts_params->valid_devs[0]); 664 if (res) 665 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res); 666 } 667 668 static int 669 check_capabilities_supported(enum rte_crypto_sym_xform_type type, 670 const int *algs, uint16_t num_algs) 671 { 672 uint8_t dev_id = testsuite_params.valid_devs[0]; 673 bool some_alg_supported = FALSE; 674 uint16_t i; 675 676 for (i = 0; i < num_algs && !some_alg_supported; i++) { 677 struct rte_cryptodev_sym_capability_idx alg = { 678 type, {algs[i]} 679 }; 680 if (rte_cryptodev_sym_capability_get(dev_id, 681 &alg) != NULL) 682 some_alg_supported = TRUE; 683 } 684 if (!some_alg_supported) 685 return TEST_SKIPPED; 686 687 return 0; 688 } 689 690 int 691 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 692 uint16_t num_ciphers) 693 { 694 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, 695 (const int *) ciphers, num_ciphers); 696 } 697 698 int 699 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 700 uint16_t num_auths) 701 { 702 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, 703 (const int *) auths, num_auths); 704 } 705 706 int 707 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 708 uint16_t num_aeads) 709 { 710 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, 711 (const int *) aeads, num_aeads); 712 } 713 714 static int 715 null_testsuite_setup(void) 716 { 717 struct crypto_testsuite_params *ts_params = &testsuite_params; 718 uint8_t dev_id = ts_params->valid_devs[0]; 719 struct rte_cryptodev_info dev_info; 720 const enum rte_crypto_cipher_algorithm ciphers[] = { 721 RTE_CRYPTO_CIPHER_NULL 722 }; 723 const enum rte_crypto_auth_algorithm auths[] = { 724 RTE_CRYPTO_AUTH_NULL 725 }; 726 727 rte_cryptodev_info_get(dev_id, &dev_info); 728 729 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 730 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL " 731 "testsuite not met\n"); 732 return TEST_SKIPPED; 733 } 734 735 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 736 && check_auth_capabilities_supported(auths, 737 RTE_DIM(auths)) != 0) { 738 RTE_LOG(INFO, USER1, "Capability requirements for NULL " 739 "testsuite not met\n"); 740 return TEST_SKIPPED; 741 } 742 743 return 0; 744 } 745 746 static int 747 crypto_gen_testsuite_setup(void) 748 { 749 struct crypto_testsuite_params *ts_params = &testsuite_params; 750 uint8_t dev_id = ts_params->valid_devs[0]; 751 struct rte_cryptodev_info dev_info; 752 753 rte_cryptodev_info_get(dev_id, &dev_info); 754 755 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 756 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen " 757 "testsuite not met\n"); 758 return TEST_SKIPPED; 759 } 760 761 return 0; 762 } 763 764 #ifdef RTE_LIB_SECURITY 765 static int 766 ipsec_proto_testsuite_setup(void) 767 { 768 struct crypto_testsuite_params *ts_params = &testsuite_params; 769 struct crypto_unittest_params *ut_params = &unittest_params; 770 struct rte_cryptodev_info dev_info; 771 int ret = 0; 772 773 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 774 775 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) { 776 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto " 777 "testsuite not met\n"); 778 return TEST_SKIPPED; 779 } 780 781 /* Reconfigure to enable security */ 782 ret = dev_configure_and_start(0); 783 if (ret != TEST_SUCCESS) 784 return ret; 785 786 /* Set action type */ 787 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 788 789 if (security_proto_supported( 790 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL, 791 RTE_SECURITY_PROTOCOL_IPSEC) < 0) { 792 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto " 793 "test not met\n"); 794 ret = TEST_SKIPPED; 795 } 796 797 /* 798 * Stop the device. Device would be started again by individual test 799 * case setup routine. 800 */ 801 rte_cryptodev_stop(ts_params->valid_devs[0]); 802 803 return ret; 804 } 805 806 static int 807 pdcp_proto_testsuite_setup(void) 808 { 809 struct crypto_testsuite_params *ts_params = &testsuite_params; 810 uint8_t dev_id = ts_params->valid_devs[0]; 811 struct rte_cryptodev_info dev_info; 812 const enum rte_crypto_cipher_algorithm ciphers[] = { 813 RTE_CRYPTO_CIPHER_NULL, 814 RTE_CRYPTO_CIPHER_AES_CTR, 815 RTE_CRYPTO_CIPHER_ZUC_EEA3, 816 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 817 }; 818 const enum rte_crypto_auth_algorithm auths[] = { 819 RTE_CRYPTO_AUTH_NULL, 820 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 821 RTE_CRYPTO_AUTH_AES_CMAC, 822 RTE_CRYPTO_AUTH_ZUC_EIA3 823 }; 824 825 rte_cryptodev_info_get(dev_id, &dev_info); 826 827 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 828 !(dev_info.feature_flags & 829 RTE_CRYPTODEV_FF_SECURITY)) { 830 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto " 831 "testsuite not met\n"); 832 return TEST_SKIPPED; 833 } 834 835 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 836 && check_auth_capabilities_supported(auths, 837 RTE_DIM(auths)) != 0) { 838 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto " 839 "testsuite not met\n"); 840 return TEST_SKIPPED; 841 } 842 843 return 0; 844 } 845 846 static int 847 docsis_proto_testsuite_setup(void) 848 { 849 struct crypto_testsuite_params *ts_params = &testsuite_params; 850 uint8_t dev_id = ts_params->valid_devs[0]; 851 struct rte_cryptodev_info dev_info; 852 const enum rte_crypto_cipher_algorithm ciphers[] = { 853 RTE_CRYPTO_CIPHER_AES_DOCSISBPI 854 }; 855 856 rte_cryptodev_info_get(dev_id, &dev_info); 857 858 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 859 !(dev_info.feature_flags & 860 RTE_CRYPTODEV_FF_SECURITY)) { 861 RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis " 862 "Proto testsuite not met\n"); 863 return TEST_SKIPPED; 864 } 865 866 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 867 RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto " 868 "testsuite not met\n"); 869 return TEST_SKIPPED; 870 } 871 872 return 0; 873 } 874 #endif 875 876 static int 877 aes_ccm_auth_testsuite_setup(void) 878 { 879 struct crypto_testsuite_params *ts_params = &testsuite_params; 880 uint8_t dev_id = ts_params->valid_devs[0]; 881 struct rte_cryptodev_info dev_info; 882 const enum rte_crypto_aead_algorithm aeads[] = { 883 RTE_CRYPTO_AEAD_AES_CCM 884 }; 885 886 rte_cryptodev_info_get(dev_id, &dev_info); 887 888 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 889 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 890 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 891 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM " 892 "testsuite not met\n"); 893 return TEST_SKIPPED; 894 } 895 896 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 897 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM " 898 "testsuite not met\n"); 899 return TEST_SKIPPED; 900 } 901 902 return 0; 903 } 904 905 static int 906 aes_gcm_auth_testsuite_setup(void) 907 { 908 struct crypto_testsuite_params *ts_params = &testsuite_params; 909 uint8_t dev_id = ts_params->valid_devs[0]; 910 struct rte_cryptodev_info dev_info; 911 const enum rte_crypto_aead_algorithm aeads[] = { 912 RTE_CRYPTO_AEAD_AES_GCM 913 }; 914 915 rte_cryptodev_info_get(dev_id, &dev_info); 916 917 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 918 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM " 919 "testsuite not met\n"); 920 return TEST_SKIPPED; 921 } 922 923 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 924 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM " 925 "testsuite not met\n"); 926 return TEST_SKIPPED; 927 } 928 929 return 0; 930 } 931 932 static int 933 aes_gmac_auth_testsuite_setup(void) 934 { 935 struct crypto_testsuite_params *ts_params = &testsuite_params; 936 uint8_t dev_id = ts_params->valid_devs[0]; 937 struct rte_cryptodev_info dev_info; 938 const enum rte_crypto_auth_algorithm auths[] = { 939 RTE_CRYPTO_AUTH_AES_GMAC 940 }; 941 942 rte_cryptodev_info_get(dev_id, &dev_info); 943 944 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 945 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 946 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 947 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC " 948 "testsuite not met\n"); 949 return TEST_SKIPPED; 950 } 951 952 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 953 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC " 954 "testsuite not met\n"); 955 return TEST_SKIPPED; 956 } 957 958 return 0; 959 } 960 961 static int 962 chacha20_poly1305_testsuite_setup(void) 963 { 964 struct crypto_testsuite_params *ts_params = &testsuite_params; 965 uint8_t dev_id = ts_params->valid_devs[0]; 966 struct rte_cryptodev_info dev_info; 967 const enum rte_crypto_aead_algorithm aeads[] = { 968 RTE_CRYPTO_AEAD_CHACHA20_POLY1305 969 }; 970 971 rte_cryptodev_info_get(dev_id, &dev_info); 972 973 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 974 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 975 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 976 RTE_LOG(INFO, USER1, "Feature flag requirements for " 977 "Chacha20-Poly1305 testsuite not met\n"); 978 return TEST_SKIPPED; 979 } 980 981 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 982 RTE_LOG(INFO, USER1, "Capability requirements for " 983 "Chacha20-Poly1305 testsuite not met\n"); 984 return TEST_SKIPPED; 985 } 986 987 return 0; 988 } 989 990 static int 991 snow3g_testsuite_setup(void) 992 { 993 struct crypto_testsuite_params *ts_params = &testsuite_params; 994 uint8_t dev_id = ts_params->valid_devs[0]; 995 struct rte_cryptodev_info dev_info; 996 const enum rte_crypto_cipher_algorithm ciphers[] = { 997 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 998 999 }; 1000 const enum rte_crypto_auth_algorithm auths[] = { 1001 RTE_CRYPTO_AUTH_SNOW3G_UIA2 1002 }; 1003 1004 rte_cryptodev_info_get(dev_id, &dev_info); 1005 1006 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1007 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G " 1008 "testsuite not met\n"); 1009 return TEST_SKIPPED; 1010 } 1011 1012 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1013 && check_auth_capabilities_supported(auths, 1014 RTE_DIM(auths)) != 0) { 1015 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G " 1016 "testsuite not met\n"); 1017 return TEST_SKIPPED; 1018 } 1019 1020 return 0; 1021 } 1022 1023 static int 1024 zuc_testsuite_setup(void) 1025 { 1026 struct crypto_testsuite_params *ts_params = &testsuite_params; 1027 uint8_t dev_id = ts_params->valid_devs[0]; 1028 struct rte_cryptodev_info dev_info; 1029 const enum rte_crypto_cipher_algorithm ciphers[] = { 1030 RTE_CRYPTO_CIPHER_ZUC_EEA3 1031 }; 1032 const enum rte_crypto_auth_algorithm auths[] = { 1033 RTE_CRYPTO_AUTH_ZUC_EIA3 1034 }; 1035 1036 rte_cryptodev_info_get(dev_id, &dev_info); 1037 1038 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1039 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " 1040 "testsuite not met\n"); 1041 return TEST_SKIPPED; 1042 } 1043 1044 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1045 && check_auth_capabilities_supported(auths, 1046 RTE_DIM(auths)) != 0) { 1047 RTE_LOG(INFO, USER1, "Capability requirements for ZUC " 1048 "testsuite not met\n"); 1049 return TEST_SKIPPED; 1050 } 1051 1052 return 0; 1053 } 1054 1055 static int 1056 hmac_md5_auth_testsuite_setup(void) 1057 { 1058 struct crypto_testsuite_params *ts_params = &testsuite_params; 1059 uint8_t dev_id = ts_params->valid_devs[0]; 1060 struct rte_cryptodev_info dev_info; 1061 const enum rte_crypto_auth_algorithm auths[] = { 1062 RTE_CRYPTO_AUTH_MD5_HMAC 1063 }; 1064 1065 rte_cryptodev_info_get(dev_id, &dev_info); 1066 1067 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1068 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1069 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1070 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 " 1071 "Auth testsuite not met\n"); 1072 return TEST_SKIPPED; 1073 } 1074 1075 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1076 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 " 1077 "testsuite not met\n"); 1078 return TEST_SKIPPED; 1079 } 1080 1081 return 0; 1082 } 1083 1084 static int 1085 kasumi_testsuite_setup(void) 1086 { 1087 struct crypto_testsuite_params *ts_params = &testsuite_params; 1088 uint8_t dev_id = ts_params->valid_devs[0]; 1089 struct rte_cryptodev_info dev_info; 1090 const enum rte_crypto_cipher_algorithm ciphers[] = { 1091 RTE_CRYPTO_CIPHER_KASUMI_F8 1092 }; 1093 const enum rte_crypto_auth_algorithm auths[] = { 1094 RTE_CRYPTO_AUTH_KASUMI_F9 1095 }; 1096 1097 rte_cryptodev_info_get(dev_id, &dev_info); 1098 1099 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1100 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1101 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1102 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi " 1103 "testsuite not met\n"); 1104 return TEST_SKIPPED; 1105 } 1106 1107 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1108 && check_auth_capabilities_supported(auths, 1109 RTE_DIM(auths)) != 0) { 1110 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi " 1111 "testsuite not met\n"); 1112 return TEST_SKIPPED; 1113 } 1114 1115 return 0; 1116 } 1117 1118 static int 1119 negative_aes_gcm_testsuite_setup(void) 1120 { 1121 struct crypto_testsuite_params *ts_params = &testsuite_params; 1122 uint8_t dev_id = ts_params->valid_devs[0]; 1123 struct rte_cryptodev_info dev_info; 1124 const enum rte_crypto_aead_algorithm aeads[] = { 1125 RTE_CRYPTO_AEAD_AES_GCM 1126 }; 1127 1128 rte_cryptodev_info_get(dev_id, &dev_info); 1129 1130 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1131 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1132 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1133 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1134 "AES GCM testsuite not met\n"); 1135 return TEST_SKIPPED; 1136 } 1137 1138 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1139 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1140 "AES GCM testsuite not met\n"); 1141 return TEST_SKIPPED; 1142 } 1143 1144 return 0; 1145 } 1146 1147 static int 1148 negative_aes_gmac_testsuite_setup(void) 1149 { 1150 struct crypto_testsuite_params *ts_params = &testsuite_params; 1151 uint8_t dev_id = ts_params->valid_devs[0]; 1152 struct rte_cryptodev_info dev_info; 1153 const enum rte_crypto_auth_algorithm auths[] = { 1154 RTE_CRYPTO_AUTH_AES_GMAC 1155 }; 1156 1157 rte_cryptodev_info_get(dev_id, &dev_info); 1158 1159 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1160 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1161 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1162 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1163 "AES GMAC testsuite not met\n"); 1164 return TEST_SKIPPED; 1165 } 1166 1167 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1168 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1169 "AES GMAC testsuite not met\n"); 1170 return TEST_SKIPPED; 1171 } 1172 1173 return 0; 1174 } 1175 1176 static int 1177 mixed_cipher_hash_testsuite_setup(void) 1178 { 1179 struct crypto_testsuite_params *ts_params = &testsuite_params; 1180 uint8_t dev_id = ts_params->valid_devs[0]; 1181 struct rte_cryptodev_info dev_info; 1182 uint64_t feat_flags; 1183 const enum rte_crypto_cipher_algorithm ciphers[] = { 1184 RTE_CRYPTO_CIPHER_NULL, 1185 RTE_CRYPTO_CIPHER_AES_CTR, 1186 RTE_CRYPTO_CIPHER_ZUC_EEA3, 1187 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1188 }; 1189 const enum rte_crypto_auth_algorithm auths[] = { 1190 RTE_CRYPTO_AUTH_NULL, 1191 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 1192 RTE_CRYPTO_AUTH_AES_CMAC, 1193 RTE_CRYPTO_AUTH_ZUC_EIA3 1194 }; 1195 1196 rte_cryptodev_info_get(dev_id, &dev_info); 1197 feat_flags = dev_info.feature_flags; 1198 1199 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1200 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1201 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed " 1202 "Cipher Hash testsuite not met\n"); 1203 return TEST_SKIPPED; 1204 } 1205 1206 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1207 && check_auth_capabilities_supported(auths, 1208 RTE_DIM(auths)) != 0) { 1209 RTE_LOG(INFO, USER1, "Capability requirements for Mixed " 1210 "Cipher Hash testsuite not met\n"); 1211 return TEST_SKIPPED; 1212 } 1213 1214 return 0; 1215 } 1216 1217 static int 1218 esn_testsuite_setup(void) 1219 { 1220 struct crypto_testsuite_params *ts_params = &testsuite_params; 1221 uint8_t dev_id = ts_params->valid_devs[0]; 1222 struct rte_cryptodev_info dev_info; 1223 const enum rte_crypto_cipher_algorithm ciphers[] = { 1224 RTE_CRYPTO_CIPHER_AES_CBC 1225 }; 1226 const enum rte_crypto_auth_algorithm auths[] = { 1227 RTE_CRYPTO_AUTH_SHA1_HMAC 1228 }; 1229 1230 rte_cryptodev_info_get(dev_id, &dev_info); 1231 1232 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1233 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1234 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1235 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " 1236 "testsuite not met\n"); 1237 return TEST_SKIPPED; 1238 } 1239 1240 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1241 && check_auth_capabilities_supported(auths, 1242 RTE_DIM(auths)) != 0) { 1243 RTE_LOG(INFO, USER1, "Capability requirements for ESN " 1244 "testsuite not met\n"); 1245 return TEST_SKIPPED; 1246 } 1247 1248 return 0; 1249 } 1250 1251 static int 1252 multi_session_testsuite_setup(void) 1253 { 1254 struct crypto_testsuite_params *ts_params = &testsuite_params; 1255 uint8_t dev_id = ts_params->valid_devs[0]; 1256 struct rte_cryptodev_info dev_info; 1257 const enum rte_crypto_cipher_algorithm ciphers[] = { 1258 RTE_CRYPTO_CIPHER_AES_CBC 1259 }; 1260 const enum rte_crypto_auth_algorithm auths[] = { 1261 RTE_CRYPTO_AUTH_SHA512_HMAC 1262 }; 1263 1264 rte_cryptodev_info_get(dev_id, &dev_info); 1265 1266 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1267 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi " 1268 "Session testsuite not met\n"); 1269 return TEST_SKIPPED; 1270 } 1271 1272 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1273 && check_auth_capabilities_supported(auths, 1274 RTE_DIM(auths)) != 0) { 1275 RTE_LOG(INFO, USER1, "Capability requirements for Multi " 1276 "Session testsuite not met\n"); 1277 return TEST_SKIPPED; 1278 } 1279 1280 return 0; 1281 } 1282 1283 static int 1284 negative_hmac_sha1_testsuite_setup(void) 1285 { 1286 struct crypto_testsuite_params *ts_params = &testsuite_params; 1287 uint8_t dev_id = ts_params->valid_devs[0]; 1288 struct rte_cryptodev_info dev_info; 1289 const enum rte_crypto_cipher_algorithm ciphers[] = { 1290 RTE_CRYPTO_CIPHER_AES_CBC 1291 }; 1292 const enum rte_crypto_auth_algorithm auths[] = { 1293 RTE_CRYPTO_AUTH_SHA1_HMAC 1294 }; 1295 1296 rte_cryptodev_info_get(dev_id, &dev_info); 1297 1298 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1299 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1300 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1301 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1302 "HMAC SHA1 testsuite not met\n"); 1303 return TEST_SKIPPED; 1304 } 1305 1306 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1307 && check_auth_capabilities_supported(auths, 1308 RTE_DIM(auths)) != 0) { 1309 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1310 "HMAC SHA1 testsuite not met\n"); 1311 return TEST_SKIPPED; 1312 } 1313 1314 return 0; 1315 } 1316 1317 static int 1318 dev_configure_and_start(uint64_t ff_disable) 1319 { 1320 struct crypto_testsuite_params *ts_params = &testsuite_params; 1321 struct crypto_unittest_params *ut_params = &unittest_params; 1322 1323 uint16_t qp_id; 1324 1325 /* Clear unit test parameters before running test */ 1326 memset(ut_params, 0, sizeof(*ut_params)); 1327 1328 /* Reconfigure device to default parameters */ 1329 ts_params->conf.socket_id = SOCKET_ID_ANY; 1330 ts_params->conf.ff_disable = ff_disable; 1331 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 1332 ts_params->qp_conf.mp_session = ts_params->session_mpool; 1333 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 1334 1335 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1336 &ts_params->conf), 1337 "Failed to configure cryptodev %u", 1338 ts_params->valid_devs[0]); 1339 1340 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 1341 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1342 ts_params->valid_devs[0], qp_id, 1343 &ts_params->qp_conf, 1344 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1345 "Failed to setup queue pair %u on cryptodev %u", 1346 qp_id, ts_params->valid_devs[0]); 1347 } 1348 1349 1350 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 1351 1352 /* Start the device */ 1353 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 1354 "Failed to start cryptodev %u", 1355 ts_params->valid_devs[0]); 1356 1357 return TEST_SUCCESS; 1358 } 1359 1360 int 1361 ut_setup(void) 1362 { 1363 /* Configure and start the device with security feature disabled */ 1364 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 1365 } 1366 1367 static int 1368 ut_setup_security(void) 1369 { 1370 /* Configure and start the device with no features disabled */ 1371 return dev_configure_and_start(0); 1372 } 1373 1374 void 1375 ut_teardown(void) 1376 { 1377 struct crypto_testsuite_params *ts_params = &testsuite_params; 1378 struct crypto_unittest_params *ut_params = &unittest_params; 1379 struct rte_cryptodev_stats stats; 1380 1381 /* free crypto session structure */ 1382 #ifdef RTE_LIB_SECURITY 1383 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 1384 if (ut_params->sec_session) { 1385 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 1386 (ts_params->valid_devs[0]), 1387 ut_params->sec_session); 1388 ut_params->sec_session = NULL; 1389 } 1390 } else 1391 #endif 1392 { 1393 if (ut_params->sess) { 1394 rte_cryptodev_sym_session_clear( 1395 ts_params->valid_devs[0], 1396 ut_params->sess); 1397 rte_cryptodev_sym_session_free(ut_params->sess); 1398 ut_params->sess = NULL; 1399 } 1400 } 1401 1402 /* free crypto operation structure */ 1403 if (ut_params->op) 1404 rte_crypto_op_free(ut_params->op); 1405 1406 /* 1407 * free mbuf - both obuf and ibuf are usually the same, 1408 * so check if they point at the same address is necessary, 1409 * to avoid freeing the mbuf twice. 1410 */ 1411 if (ut_params->obuf) { 1412 rte_pktmbuf_free(ut_params->obuf); 1413 if (ut_params->ibuf == ut_params->obuf) 1414 ut_params->ibuf = 0; 1415 ut_params->obuf = 0; 1416 } 1417 if (ut_params->ibuf) { 1418 rte_pktmbuf_free(ut_params->ibuf); 1419 ut_params->ibuf = 0; 1420 } 1421 1422 if (ts_params->mbuf_pool != NULL) 1423 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 1424 rte_mempool_avail_count(ts_params->mbuf_pool)); 1425 1426 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); 1427 1428 /* Stop the device */ 1429 rte_cryptodev_stop(ts_params->valid_devs[0]); 1430 } 1431 1432 static int 1433 test_device_configure_invalid_dev_id(void) 1434 { 1435 struct crypto_testsuite_params *ts_params = &testsuite_params; 1436 uint16_t dev_id, num_devs = 0; 1437 1438 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 1439 "Need at least %d devices for test", 1); 1440 1441 /* valid dev_id values */ 1442 dev_id = ts_params->valid_devs[0]; 1443 1444 /* Stop the device in case it's started so it can be configured */ 1445 rte_cryptodev_stop(dev_id); 1446 1447 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 1448 "Failed test for rte_cryptodev_configure: " 1449 "invalid dev_num %u", dev_id); 1450 1451 /* invalid dev_id values */ 1452 dev_id = num_devs; 1453 1454 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1455 "Failed test for rte_cryptodev_configure: " 1456 "invalid dev_num %u", dev_id); 1457 1458 dev_id = 0xff; 1459 1460 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1461 "Failed test for rte_cryptodev_configure:" 1462 "invalid dev_num %u", dev_id); 1463 1464 return TEST_SUCCESS; 1465 } 1466 1467 static int 1468 test_device_configure_invalid_queue_pair_ids(void) 1469 { 1470 struct crypto_testsuite_params *ts_params = &testsuite_params; 1471 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1472 1473 /* Stop the device in case it's started so it can be configured */ 1474 rte_cryptodev_stop(ts_params->valid_devs[0]); 1475 1476 /* valid - max value queue pairs */ 1477 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1478 1479 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1480 &ts_params->conf), 1481 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1482 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1483 1484 /* valid - one queue pairs */ 1485 ts_params->conf.nb_queue_pairs = 1; 1486 1487 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1488 &ts_params->conf), 1489 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1490 ts_params->valid_devs[0], 1491 ts_params->conf.nb_queue_pairs); 1492 1493 1494 /* invalid - zero queue pairs */ 1495 ts_params->conf.nb_queue_pairs = 0; 1496 1497 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1498 &ts_params->conf), 1499 "Failed test for rte_cryptodev_configure, dev_id %u," 1500 " invalid qps: %u", 1501 ts_params->valid_devs[0], 1502 ts_params->conf.nb_queue_pairs); 1503 1504 1505 /* invalid - max value supported by field queue pairs */ 1506 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1507 1508 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1509 &ts_params->conf), 1510 "Failed test for rte_cryptodev_configure, dev_id %u," 1511 " invalid qps: %u", 1512 ts_params->valid_devs[0], 1513 ts_params->conf.nb_queue_pairs); 1514 1515 1516 /* invalid - max value + 1 queue pairs */ 1517 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1518 1519 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1520 &ts_params->conf), 1521 "Failed test for rte_cryptodev_configure, dev_id %u," 1522 " invalid qps: %u", 1523 ts_params->valid_devs[0], 1524 ts_params->conf.nb_queue_pairs); 1525 1526 /* revert to original testsuite value */ 1527 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1528 1529 return TEST_SUCCESS; 1530 } 1531 1532 static int 1533 test_queue_pair_descriptor_setup(void) 1534 { 1535 struct crypto_testsuite_params *ts_params = &testsuite_params; 1536 struct rte_cryptodev_qp_conf qp_conf = { 1537 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1538 }; 1539 uint16_t qp_id; 1540 1541 /* Stop the device in case it's started so it can be configured */ 1542 rte_cryptodev_stop(ts_params->valid_devs[0]); 1543 1544 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1545 &ts_params->conf), 1546 "Failed to configure cryptodev %u", 1547 ts_params->valid_devs[0]); 1548 1549 /* 1550 * Test various ring sizes on this device. memzones can't be 1551 * freed so are re-used if ring is released and re-created. 1552 */ 1553 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1554 qp_conf.mp_session = ts_params->session_mpool; 1555 qp_conf.mp_session_private = ts_params->session_priv_mpool; 1556 1557 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1558 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1559 ts_params->valid_devs[0], qp_id, &qp_conf, 1560 rte_cryptodev_socket_id( 1561 ts_params->valid_devs[0])), 1562 "Failed test for " 1563 "rte_cryptodev_queue_pair_setup: num_inflights " 1564 "%u on qp %u on cryptodev %u", 1565 qp_conf.nb_descriptors, qp_id, 1566 ts_params->valid_devs[0]); 1567 } 1568 1569 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1570 1571 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1572 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1573 ts_params->valid_devs[0], qp_id, &qp_conf, 1574 rte_cryptodev_socket_id( 1575 ts_params->valid_devs[0])), 1576 "Failed test for" 1577 " rte_cryptodev_queue_pair_setup: num_inflights" 1578 " %u on qp %u on cryptodev %u", 1579 qp_conf.nb_descriptors, qp_id, 1580 ts_params->valid_devs[0]); 1581 } 1582 1583 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1584 1585 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1586 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1587 ts_params->valid_devs[0], qp_id, &qp_conf, 1588 rte_cryptodev_socket_id( 1589 ts_params->valid_devs[0])), 1590 "Failed test for " 1591 "rte_cryptodev_queue_pair_setup: num_inflights" 1592 " %u on qp %u on cryptodev %u", 1593 qp_conf.nb_descriptors, qp_id, 1594 ts_params->valid_devs[0]); 1595 } 1596 1597 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1598 1599 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1600 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1601 ts_params->valid_devs[0], qp_id, &qp_conf, 1602 rte_cryptodev_socket_id( 1603 ts_params->valid_devs[0])), 1604 "Failed test for" 1605 " rte_cryptodev_queue_pair_setup:" 1606 "num_inflights %u on qp %u on cryptodev %u", 1607 qp_conf.nb_descriptors, qp_id, 1608 ts_params->valid_devs[0]); 1609 } 1610 1611 /* test invalid queue pair id */ 1612 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1613 1614 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1615 1616 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1617 ts_params->valid_devs[0], 1618 qp_id, &qp_conf, 1619 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1620 "Failed test for rte_cryptodev_queue_pair_setup:" 1621 "invalid qp %u on cryptodev %u", 1622 qp_id, ts_params->valid_devs[0]); 1623 1624 qp_id = 0xffff; /*invalid*/ 1625 1626 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1627 ts_params->valid_devs[0], 1628 qp_id, &qp_conf, 1629 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1630 "Failed test for rte_cryptodev_queue_pair_setup:" 1631 "invalid qp %u on cryptodev %u", 1632 qp_id, ts_params->valid_devs[0]); 1633 1634 return TEST_SUCCESS; 1635 } 1636 1637 /* ***** Plaintext data for tests ***** */ 1638 1639 const char catch_22_quote_1[] = 1640 "There was only one catch and that was Catch-22, which " 1641 "specified that a concern for one's safety in the face of " 1642 "dangers that were real and immediate was the process of a " 1643 "rational mind. Orr was crazy and could be grounded. All he " 1644 "had to do was ask; and as soon as he did, he would no longer " 1645 "be crazy and would have to fly more missions. Orr would be " 1646 "crazy to fly more missions and sane if he didn't, but if he " 1647 "was sane he had to fly them. If he flew them he was crazy " 1648 "and didn't have to; but if he didn't want to he was sane and " 1649 "had to. Yossarian was moved very deeply by the absolute " 1650 "simplicity of this clause of Catch-22 and let out a " 1651 "respectful whistle. \"That's some catch, that Catch-22\", he " 1652 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1653 1654 const char catch_22_quote[] = 1655 "What a lousy earth! He wondered how many people were " 1656 "destitute that same night even in his own prosperous country, " 1657 "how many homes were shanties, how many husbands were drunk " 1658 "and wives socked, and how many children were bullied, abused, " 1659 "or abandoned. How many families hungered for food they could " 1660 "not afford to buy? How many hearts were broken? How many " 1661 "suicides would take place that same night, how many people " 1662 "would go insane? How many cockroaches and landlords would " 1663 "triumph? How many winners were losers, successes failures, " 1664 "and rich men poor men? How many wise guys were stupid? How " 1665 "many happy endings were unhappy endings? How many honest men " 1666 "were liars, brave men cowards, loyal men traitors, how many " 1667 "sainted men were corrupt, how many people in positions of " 1668 "trust had sold their souls to bodyguards, how many had never " 1669 "had souls? How many straight-and-narrow paths were crooked " 1670 "paths? How many best families were worst families and how " 1671 "many good people were bad people? When you added them all up " 1672 "and then subtracted, you might be left with only the children, " 1673 "and perhaps with Albert Einstein and an old violinist or " 1674 "sculptor somewhere."; 1675 1676 #define QUOTE_480_BYTES (480) 1677 #define QUOTE_512_BYTES (512) 1678 #define QUOTE_768_BYTES (768) 1679 #define QUOTE_1024_BYTES (1024) 1680 1681 1682 1683 /* ***** SHA1 Hash Tests ***** */ 1684 1685 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1686 1687 static uint8_t hmac_sha1_key[] = { 1688 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1689 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1690 0xDE, 0xF4, 0xDE, 0xAD }; 1691 1692 /* ***** SHA224 Hash Tests ***** */ 1693 1694 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1695 1696 1697 /* ***** AES-CBC Cipher Tests ***** */ 1698 1699 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1700 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1701 1702 static uint8_t aes_cbc_key[] = { 1703 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1704 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1705 1706 static uint8_t aes_cbc_iv[] = { 1707 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1708 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1709 1710 1711 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1712 1713 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1714 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1715 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1716 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1717 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1718 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1719 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1720 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1721 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1722 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1723 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1724 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1725 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1726 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1727 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1728 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1729 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1730 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1731 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1732 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1733 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1734 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1735 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1736 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1737 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1738 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1739 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1740 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1741 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1742 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1743 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1744 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1745 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1746 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1747 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1748 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1749 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1750 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1751 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1752 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1753 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1754 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1755 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1756 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1757 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1758 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1759 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1760 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1761 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1762 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1763 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1764 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1765 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1766 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1767 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1768 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1769 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1770 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1771 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1772 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1773 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1774 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1775 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1776 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1777 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1778 }; 1779 1780 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1781 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1782 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1783 0x18, 0x8c, 0x1d, 0x32 1784 }; 1785 1786 1787 /* Multisession Vector context Test */ 1788 /*Begin Session 0 */ 1789 static uint8_t ms_aes_cbc_key0[] = { 1790 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1791 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1792 }; 1793 1794 static uint8_t ms_aes_cbc_iv0[] = { 1795 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1796 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1797 }; 1798 1799 static const uint8_t ms_aes_cbc_cipher0[] = { 1800 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1801 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1802 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1803 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1804 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1805 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1806 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1807 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1808 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1809 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1810 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1811 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1812 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1813 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1814 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1815 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1816 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1817 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1818 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1819 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1820 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1821 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1822 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1823 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1824 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1825 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1826 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1827 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1828 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1829 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1830 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1831 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1832 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1833 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1834 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1835 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1836 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1837 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1838 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1839 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1840 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1841 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1842 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1843 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1844 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1845 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1846 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1847 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1848 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1849 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1850 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1851 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1852 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1853 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1854 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1855 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1856 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1857 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1858 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1859 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1860 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1861 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1862 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1863 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1864 }; 1865 1866 1867 static uint8_t ms_hmac_key0[] = { 1868 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1869 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1870 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1871 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1872 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1873 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1874 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1875 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1876 }; 1877 1878 static const uint8_t ms_hmac_digest0[] = { 1879 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1880 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1881 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1882 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1883 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1884 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1885 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1886 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1887 }; 1888 1889 /* End Session 0 */ 1890 /* Begin session 1 */ 1891 1892 static uint8_t ms_aes_cbc_key1[] = { 1893 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1894 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1895 }; 1896 1897 static uint8_t ms_aes_cbc_iv1[] = { 1898 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1899 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1900 }; 1901 1902 static const uint8_t ms_aes_cbc_cipher1[] = { 1903 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1904 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1905 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1906 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1907 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1908 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1909 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1910 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1911 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1912 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1913 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1914 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1915 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1916 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1917 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1918 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1919 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1920 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1921 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1922 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1923 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1924 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1925 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1926 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1927 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1928 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1929 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1930 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1931 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1932 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1933 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1934 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1935 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1936 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1937 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1938 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1939 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1940 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1941 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1942 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1943 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1944 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1945 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1946 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1947 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1948 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1949 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1950 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1951 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1952 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1953 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1954 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1955 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1956 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1957 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1958 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1959 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1960 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1961 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1962 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1963 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 1964 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 1965 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 1966 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 1967 1968 }; 1969 1970 static uint8_t ms_hmac_key1[] = { 1971 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1972 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1973 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1974 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1975 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1976 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1977 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1978 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1979 }; 1980 1981 static const uint8_t ms_hmac_digest1[] = { 1982 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 1983 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 1984 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 1985 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 1986 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 1987 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 1988 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 1989 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 1990 }; 1991 /* End Session 1 */ 1992 /* Begin Session 2 */ 1993 static uint8_t ms_aes_cbc_key2[] = { 1994 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1995 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1996 }; 1997 1998 static uint8_t ms_aes_cbc_iv2[] = { 1999 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 2000 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 2001 }; 2002 2003 static const uint8_t ms_aes_cbc_cipher2[] = { 2004 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 2005 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 2006 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 2007 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 2008 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 2009 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 2010 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 2011 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 2012 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 2013 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 2014 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 2015 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 2016 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 2017 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 2018 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 2019 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 2020 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 2021 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 2022 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 2023 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 2024 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 2025 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 2026 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 2027 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 2028 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 2029 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 2030 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 2031 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 2032 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 2033 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 2034 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 2035 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 2036 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 2037 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 2038 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 2039 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 2040 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 2041 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 2042 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 2043 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 2044 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 2045 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 2046 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 2047 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 2048 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 2049 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 2050 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 2051 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 2052 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 2053 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 2054 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 2055 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 2056 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 2057 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 2058 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 2059 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 2060 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 2061 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 2062 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 2063 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 2064 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 2065 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 2066 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 2067 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 2068 }; 2069 2070 static uint8_t ms_hmac_key2[] = { 2071 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2072 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2073 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2074 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2075 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2076 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2077 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2078 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2079 }; 2080 2081 static const uint8_t ms_hmac_digest2[] = { 2082 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 2083 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 2084 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 2085 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 2086 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 2087 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 2088 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 2089 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 2090 }; 2091 2092 /* End Session 2 */ 2093 2094 2095 static int 2096 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 2097 { 2098 struct crypto_testsuite_params *ts_params = &testsuite_params; 2099 struct crypto_unittest_params *ut_params = &unittest_params; 2100 2101 /* Verify the capabilities */ 2102 struct rte_cryptodev_sym_capability_idx cap_idx; 2103 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2104 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 2105 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2106 &cap_idx) == NULL) 2107 return TEST_SKIPPED; 2108 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2109 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 2110 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2111 &cap_idx) == NULL) 2112 return TEST_SKIPPED; 2113 2114 /* Generate test mbuf data and space for digest */ 2115 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2116 catch_22_quote, QUOTE_512_BYTES, 0); 2117 2118 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2119 DIGEST_BYTE_LENGTH_SHA1); 2120 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2121 2122 /* Setup Cipher Parameters */ 2123 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2124 ut_params->cipher_xform.next = &ut_params->auth_xform; 2125 2126 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2127 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 2128 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 2129 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2130 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2131 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2132 2133 /* Setup HMAC Parameters */ 2134 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2135 2136 ut_params->auth_xform.next = NULL; 2137 2138 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 2139 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 2140 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 2141 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 2142 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 2143 2144 ut_params->sess = rte_cryptodev_sym_session_create( 2145 ts_params->session_mpool); 2146 2147 /* Create crypto session*/ 2148 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 2149 ut_params->sess, &ut_params->cipher_xform, 2150 ts_params->session_priv_mpool); 2151 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2152 2153 /* Generate crypto op data structure */ 2154 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2155 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2156 TEST_ASSERT_NOT_NULL(ut_params->op, 2157 "Failed to allocate symmetric crypto operation struct"); 2158 2159 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2160 2161 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2162 2163 /* set crypto operation source mbuf */ 2164 sym_op->m_src = ut_params->ibuf; 2165 2166 /* Set crypto operation authentication parameters */ 2167 sym_op->auth.digest.data = ut_params->digest; 2168 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2169 ut_params->ibuf, QUOTE_512_BYTES); 2170 2171 sym_op->auth.data.offset = 0; 2172 sym_op->auth.data.length = QUOTE_512_BYTES; 2173 2174 /* Copy IV at the end of the crypto operation */ 2175 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2176 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 2177 2178 /* Set crypto operation cipher parameters */ 2179 sym_op->cipher.data.offset = 0; 2180 sym_op->cipher.data.length = QUOTE_512_BYTES; 2181 2182 /* Process crypto operation */ 2183 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2184 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2185 ut_params->op); 2186 else 2187 TEST_ASSERT_NOT_NULL( 2188 process_crypto_request(ts_params->valid_devs[0], 2189 ut_params->op), 2190 "failed to process sym crypto op"); 2191 2192 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2193 "crypto op processing failed"); 2194 2195 /* Validate obuf */ 2196 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 2197 uint8_t *); 2198 2199 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 2200 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 2201 QUOTE_512_BYTES, 2202 "ciphertext data not as expected"); 2203 2204 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 2205 2206 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 2207 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 2208 gbl_driver_id == rte_cryptodev_driver_id_get( 2209 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 2210 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 2211 DIGEST_BYTE_LENGTH_SHA1, 2212 "Generated digest data not as expected"); 2213 2214 return TEST_SUCCESS; 2215 } 2216 2217 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 2218 2219 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 2220 2221 static uint8_t hmac_sha512_key[] = { 2222 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 2223 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2224 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2225 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 2226 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 2227 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2228 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 2229 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 2230 2231 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 2232 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 2233 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 2234 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 2235 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 2236 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 2237 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 2238 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 2239 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 2240 2241 2242 2243 static int 2244 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2245 struct crypto_unittest_params *ut_params, 2246 uint8_t *cipher_key, 2247 uint8_t *hmac_key); 2248 2249 static int 2250 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2251 struct crypto_unittest_params *ut_params, 2252 struct crypto_testsuite_params *ts_params, 2253 const uint8_t *cipher, 2254 const uint8_t *digest, 2255 const uint8_t *iv); 2256 2257 2258 static int 2259 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2260 struct crypto_unittest_params *ut_params, 2261 uint8_t *cipher_key, 2262 uint8_t *hmac_key) 2263 { 2264 2265 /* Setup Cipher Parameters */ 2266 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2267 ut_params->cipher_xform.next = NULL; 2268 2269 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2270 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 2271 ut_params->cipher_xform.cipher.key.data = cipher_key; 2272 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2273 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2274 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2275 2276 /* Setup HMAC Parameters */ 2277 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2278 ut_params->auth_xform.next = &ut_params->cipher_xform; 2279 2280 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 2281 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 2282 ut_params->auth_xform.auth.key.data = hmac_key; 2283 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 2284 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 2285 2286 return TEST_SUCCESS; 2287 } 2288 2289 2290 static int 2291 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2292 struct crypto_unittest_params *ut_params, 2293 struct crypto_testsuite_params *ts_params, 2294 const uint8_t *cipher, 2295 const uint8_t *digest, 2296 const uint8_t *iv) 2297 { 2298 /* Generate test mbuf data and digest */ 2299 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2300 (const char *) 2301 cipher, 2302 QUOTE_512_BYTES, 0); 2303 2304 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2305 DIGEST_BYTE_LENGTH_SHA512); 2306 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2307 2308 rte_memcpy(ut_params->digest, 2309 digest, 2310 DIGEST_BYTE_LENGTH_SHA512); 2311 2312 /* Generate Crypto op data structure */ 2313 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2314 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2315 TEST_ASSERT_NOT_NULL(ut_params->op, 2316 "Failed to allocate symmetric crypto operation struct"); 2317 2318 rte_crypto_op_attach_sym_session(ut_params->op, sess); 2319 2320 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2321 2322 /* set crypto operation source mbuf */ 2323 sym_op->m_src = ut_params->ibuf; 2324 2325 sym_op->auth.digest.data = ut_params->digest; 2326 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2327 ut_params->ibuf, QUOTE_512_BYTES); 2328 2329 sym_op->auth.data.offset = 0; 2330 sym_op->auth.data.length = QUOTE_512_BYTES; 2331 2332 /* Copy IV at the end of the crypto operation */ 2333 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2334 iv, CIPHER_IV_LENGTH_AES_CBC); 2335 2336 sym_op->cipher.data.offset = 0; 2337 sym_op->cipher.data.length = QUOTE_512_BYTES; 2338 2339 /* Process crypto operation */ 2340 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2341 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2342 ut_params->op); 2343 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2344 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2345 ut_params->op, 1, 1, 0, 0); 2346 else 2347 TEST_ASSERT_NOT_NULL( 2348 process_crypto_request(ts_params->valid_devs[0], 2349 ut_params->op), 2350 "failed to process sym crypto op"); 2351 2352 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2353 "crypto op processing failed"); 2354 2355 ut_params->obuf = ut_params->op->sym->m_src; 2356 2357 /* Validate obuf */ 2358 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2359 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 2360 catch_22_quote, 2361 QUOTE_512_BYTES, 2362 "Plaintext data not as expected"); 2363 2364 /* Validate obuf */ 2365 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2366 "Digest verification failed"); 2367 2368 return TEST_SUCCESS; 2369 } 2370 2371 /* ***** SNOW 3G Tests ***** */ 2372 static int 2373 create_wireless_algo_hash_session(uint8_t dev_id, 2374 const uint8_t *key, const uint8_t key_len, 2375 const uint8_t iv_len, const uint8_t auth_len, 2376 enum rte_crypto_auth_operation op, 2377 enum rte_crypto_auth_algorithm algo) 2378 { 2379 uint8_t hash_key[key_len]; 2380 int status; 2381 2382 struct crypto_testsuite_params *ts_params = &testsuite_params; 2383 struct crypto_unittest_params *ut_params = &unittest_params; 2384 2385 memcpy(hash_key, key, key_len); 2386 2387 debug_hexdump(stdout, "key:", key, key_len); 2388 2389 /* Setup Authentication Parameters */ 2390 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2391 ut_params->auth_xform.next = NULL; 2392 2393 ut_params->auth_xform.auth.op = op; 2394 ut_params->auth_xform.auth.algo = algo; 2395 ut_params->auth_xform.auth.key.length = key_len; 2396 ut_params->auth_xform.auth.key.data = hash_key; 2397 ut_params->auth_xform.auth.digest_length = auth_len; 2398 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2399 ut_params->auth_xform.auth.iv.length = iv_len; 2400 ut_params->sess = rte_cryptodev_sym_session_create( 2401 ts_params->session_mpool); 2402 2403 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2404 &ut_params->auth_xform, 2405 ts_params->session_priv_mpool); 2406 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2407 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2408 return 0; 2409 } 2410 2411 static int 2412 create_wireless_algo_cipher_session(uint8_t dev_id, 2413 enum rte_crypto_cipher_operation op, 2414 enum rte_crypto_cipher_algorithm algo, 2415 const uint8_t *key, const uint8_t key_len, 2416 uint8_t iv_len) 2417 { 2418 uint8_t cipher_key[key_len]; 2419 int status; 2420 struct crypto_testsuite_params *ts_params = &testsuite_params; 2421 struct crypto_unittest_params *ut_params = &unittest_params; 2422 2423 memcpy(cipher_key, key, key_len); 2424 2425 /* Setup Cipher Parameters */ 2426 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2427 ut_params->cipher_xform.next = NULL; 2428 2429 ut_params->cipher_xform.cipher.algo = algo; 2430 ut_params->cipher_xform.cipher.op = op; 2431 ut_params->cipher_xform.cipher.key.data = cipher_key; 2432 ut_params->cipher_xform.cipher.key.length = key_len; 2433 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2434 ut_params->cipher_xform.cipher.iv.length = iv_len; 2435 2436 debug_hexdump(stdout, "key:", key, key_len); 2437 2438 /* Create Crypto session */ 2439 ut_params->sess = rte_cryptodev_sym_session_create( 2440 ts_params->session_mpool); 2441 2442 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2443 &ut_params->cipher_xform, 2444 ts_params->session_priv_mpool); 2445 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2446 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2447 return 0; 2448 } 2449 2450 static int 2451 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2452 unsigned int cipher_len, 2453 unsigned int cipher_offset) 2454 { 2455 struct crypto_testsuite_params *ts_params = &testsuite_params; 2456 struct crypto_unittest_params *ut_params = &unittest_params; 2457 2458 /* Generate Crypto op data structure */ 2459 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2460 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2461 TEST_ASSERT_NOT_NULL(ut_params->op, 2462 "Failed to allocate pktmbuf offload"); 2463 2464 /* Set crypto operation data parameters */ 2465 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2466 2467 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2468 2469 /* set crypto operation source mbuf */ 2470 sym_op->m_src = ut_params->ibuf; 2471 2472 /* iv */ 2473 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2474 iv, iv_len); 2475 sym_op->cipher.data.length = cipher_len; 2476 sym_op->cipher.data.offset = cipher_offset; 2477 return 0; 2478 } 2479 2480 static int 2481 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2482 unsigned int cipher_len, 2483 unsigned int cipher_offset) 2484 { 2485 struct crypto_testsuite_params *ts_params = &testsuite_params; 2486 struct crypto_unittest_params *ut_params = &unittest_params; 2487 2488 /* Generate Crypto op data structure */ 2489 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2490 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2491 TEST_ASSERT_NOT_NULL(ut_params->op, 2492 "Failed to allocate pktmbuf offload"); 2493 2494 /* Set crypto operation data parameters */ 2495 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2496 2497 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2498 2499 /* set crypto operation source mbuf */ 2500 sym_op->m_src = ut_params->ibuf; 2501 sym_op->m_dst = ut_params->obuf; 2502 2503 /* iv */ 2504 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2505 iv, iv_len); 2506 sym_op->cipher.data.length = cipher_len; 2507 sym_op->cipher.data.offset = cipher_offset; 2508 return 0; 2509 } 2510 2511 static int 2512 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2513 enum rte_crypto_cipher_operation cipher_op, 2514 enum rte_crypto_auth_operation auth_op, 2515 enum rte_crypto_auth_algorithm auth_algo, 2516 enum rte_crypto_cipher_algorithm cipher_algo, 2517 const uint8_t *key, uint8_t key_len, 2518 uint8_t auth_iv_len, uint8_t auth_len, 2519 uint8_t cipher_iv_len) 2520 2521 { 2522 uint8_t cipher_auth_key[key_len]; 2523 int status; 2524 2525 struct crypto_testsuite_params *ts_params = &testsuite_params; 2526 struct crypto_unittest_params *ut_params = &unittest_params; 2527 2528 memcpy(cipher_auth_key, key, key_len); 2529 2530 /* Setup Authentication Parameters */ 2531 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2532 ut_params->auth_xform.next = NULL; 2533 2534 ut_params->auth_xform.auth.op = auth_op; 2535 ut_params->auth_xform.auth.algo = auth_algo; 2536 ut_params->auth_xform.auth.key.length = key_len; 2537 /* Hash key = cipher key */ 2538 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2539 ut_params->auth_xform.auth.digest_length = auth_len; 2540 /* Auth IV will be after cipher IV */ 2541 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2542 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2543 2544 /* Setup Cipher Parameters */ 2545 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2546 ut_params->cipher_xform.next = &ut_params->auth_xform; 2547 2548 ut_params->cipher_xform.cipher.algo = cipher_algo; 2549 ut_params->cipher_xform.cipher.op = cipher_op; 2550 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2551 ut_params->cipher_xform.cipher.key.length = key_len; 2552 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2553 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2554 2555 debug_hexdump(stdout, "key:", key, key_len); 2556 2557 /* Create Crypto session*/ 2558 ut_params->sess = rte_cryptodev_sym_session_create( 2559 ts_params->session_mpool); 2560 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2561 2562 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2563 &ut_params->cipher_xform, 2564 ts_params->session_priv_mpool); 2565 if (status == -ENOTSUP) 2566 return TEST_SKIPPED; 2567 2568 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2569 return 0; 2570 } 2571 2572 static int 2573 create_wireless_cipher_auth_session(uint8_t dev_id, 2574 enum rte_crypto_cipher_operation cipher_op, 2575 enum rte_crypto_auth_operation auth_op, 2576 enum rte_crypto_auth_algorithm auth_algo, 2577 enum rte_crypto_cipher_algorithm cipher_algo, 2578 const struct wireless_test_data *tdata) 2579 { 2580 const uint8_t key_len = tdata->key.len; 2581 uint8_t cipher_auth_key[key_len]; 2582 int status; 2583 2584 struct crypto_testsuite_params *ts_params = &testsuite_params; 2585 struct crypto_unittest_params *ut_params = &unittest_params; 2586 const uint8_t *key = tdata->key.data; 2587 const uint8_t auth_len = tdata->digest.len; 2588 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2589 uint8_t auth_iv_len = tdata->auth_iv.len; 2590 2591 memcpy(cipher_auth_key, key, key_len); 2592 2593 /* Setup Authentication Parameters */ 2594 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2595 ut_params->auth_xform.next = NULL; 2596 2597 ut_params->auth_xform.auth.op = auth_op; 2598 ut_params->auth_xform.auth.algo = auth_algo; 2599 ut_params->auth_xform.auth.key.length = key_len; 2600 /* Hash key = cipher key */ 2601 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2602 ut_params->auth_xform.auth.digest_length = auth_len; 2603 /* Auth IV will be after cipher IV */ 2604 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2605 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2606 2607 /* Setup Cipher Parameters */ 2608 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2609 ut_params->cipher_xform.next = &ut_params->auth_xform; 2610 2611 ut_params->cipher_xform.cipher.algo = cipher_algo; 2612 ut_params->cipher_xform.cipher.op = cipher_op; 2613 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2614 ut_params->cipher_xform.cipher.key.length = key_len; 2615 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2616 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2617 2618 2619 debug_hexdump(stdout, "key:", key, key_len); 2620 2621 /* Create Crypto session*/ 2622 ut_params->sess = rte_cryptodev_sym_session_create( 2623 ts_params->session_mpool); 2624 2625 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2626 &ut_params->cipher_xform, 2627 ts_params->session_priv_mpool); 2628 if (status == -ENOTSUP) 2629 return TEST_SKIPPED; 2630 2631 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2632 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2633 return 0; 2634 } 2635 2636 static int 2637 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2638 const struct wireless_test_data *tdata) 2639 { 2640 return create_wireless_cipher_auth_session(dev_id, 2641 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2642 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2643 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2644 } 2645 2646 static int 2647 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2648 enum rte_crypto_cipher_operation cipher_op, 2649 enum rte_crypto_auth_operation auth_op, 2650 enum rte_crypto_auth_algorithm auth_algo, 2651 enum rte_crypto_cipher_algorithm cipher_algo, 2652 const uint8_t *key, const uint8_t key_len, 2653 uint8_t auth_iv_len, uint8_t auth_len, 2654 uint8_t cipher_iv_len) 2655 { 2656 uint8_t auth_cipher_key[key_len]; 2657 int status; 2658 struct crypto_testsuite_params *ts_params = &testsuite_params; 2659 struct crypto_unittest_params *ut_params = &unittest_params; 2660 2661 memcpy(auth_cipher_key, key, key_len); 2662 2663 /* Setup Authentication Parameters */ 2664 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2665 ut_params->auth_xform.auth.op = auth_op; 2666 ut_params->auth_xform.next = &ut_params->cipher_xform; 2667 ut_params->auth_xform.auth.algo = auth_algo; 2668 ut_params->auth_xform.auth.key.length = key_len; 2669 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2670 ut_params->auth_xform.auth.digest_length = auth_len; 2671 /* Auth IV will be after cipher IV */ 2672 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2673 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2674 2675 /* Setup Cipher Parameters */ 2676 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2677 ut_params->cipher_xform.next = NULL; 2678 ut_params->cipher_xform.cipher.algo = cipher_algo; 2679 ut_params->cipher_xform.cipher.op = cipher_op; 2680 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2681 ut_params->cipher_xform.cipher.key.length = key_len; 2682 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2683 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2684 2685 debug_hexdump(stdout, "key:", key, key_len); 2686 2687 /* Create Crypto session*/ 2688 ut_params->sess = rte_cryptodev_sym_session_create( 2689 ts_params->session_mpool); 2690 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2691 2692 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2693 ut_params->auth_xform.next = NULL; 2694 ut_params->cipher_xform.next = &ut_params->auth_xform; 2695 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2696 &ut_params->cipher_xform, 2697 ts_params->session_priv_mpool); 2698 2699 } else 2700 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2701 &ut_params->auth_xform, 2702 ts_params->session_priv_mpool); 2703 2704 if (status == -ENOTSUP) 2705 return TEST_SKIPPED; 2706 2707 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2708 2709 return 0; 2710 } 2711 2712 static int 2713 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2714 unsigned int auth_tag_len, 2715 const uint8_t *iv, unsigned int iv_len, 2716 unsigned int data_pad_len, 2717 enum rte_crypto_auth_operation op, 2718 unsigned int auth_len, unsigned int auth_offset) 2719 { 2720 struct crypto_testsuite_params *ts_params = &testsuite_params; 2721 2722 struct crypto_unittest_params *ut_params = &unittest_params; 2723 2724 /* Generate Crypto op data structure */ 2725 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2726 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2727 TEST_ASSERT_NOT_NULL(ut_params->op, 2728 "Failed to allocate pktmbuf offload"); 2729 2730 /* Set crypto operation data parameters */ 2731 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2732 2733 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2734 2735 /* set crypto operation source mbuf */ 2736 sym_op->m_src = ut_params->ibuf; 2737 2738 /* iv */ 2739 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2740 iv, iv_len); 2741 /* digest */ 2742 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2743 ut_params->ibuf, auth_tag_len); 2744 2745 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2746 "no room to append auth tag"); 2747 ut_params->digest = sym_op->auth.digest.data; 2748 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2749 ut_params->ibuf, data_pad_len); 2750 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2751 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2752 else 2753 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2754 2755 debug_hexdump(stdout, "digest:", 2756 sym_op->auth.digest.data, 2757 auth_tag_len); 2758 2759 sym_op->auth.data.length = auth_len; 2760 sym_op->auth.data.offset = auth_offset; 2761 2762 return 0; 2763 } 2764 2765 static int 2766 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2767 enum rte_crypto_auth_operation op) 2768 { 2769 struct crypto_testsuite_params *ts_params = &testsuite_params; 2770 struct crypto_unittest_params *ut_params = &unittest_params; 2771 2772 const uint8_t *auth_tag = tdata->digest.data; 2773 const unsigned int auth_tag_len = tdata->digest.len; 2774 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2775 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2776 2777 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2778 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2779 const uint8_t *auth_iv = tdata->auth_iv.data; 2780 const uint8_t auth_iv_len = tdata->auth_iv.len; 2781 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2782 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2783 2784 /* Generate Crypto op data structure */ 2785 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2786 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2787 TEST_ASSERT_NOT_NULL(ut_params->op, 2788 "Failed to allocate pktmbuf offload"); 2789 /* Set crypto operation data parameters */ 2790 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2791 2792 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2793 2794 /* set crypto operation source mbuf */ 2795 sym_op->m_src = ut_params->ibuf; 2796 2797 /* digest */ 2798 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2799 ut_params->ibuf, auth_tag_len); 2800 2801 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2802 "no room to append auth tag"); 2803 ut_params->digest = sym_op->auth.digest.data; 2804 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2805 ut_params->ibuf, data_pad_len); 2806 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2807 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2808 else 2809 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2810 2811 debug_hexdump(stdout, "digest:", 2812 sym_op->auth.digest.data, 2813 auth_tag_len); 2814 2815 /* Copy cipher and auth IVs at the end of the crypto operation */ 2816 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2817 IV_OFFSET); 2818 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2819 iv_ptr += cipher_iv_len; 2820 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2821 2822 sym_op->cipher.data.length = cipher_len; 2823 sym_op->cipher.data.offset = 0; 2824 sym_op->auth.data.length = auth_len; 2825 sym_op->auth.data.offset = 0; 2826 2827 return 0; 2828 } 2829 2830 static int 2831 create_zuc_cipher_hash_generate_operation( 2832 const struct wireless_test_data *tdata) 2833 { 2834 return create_wireless_cipher_hash_operation(tdata, 2835 RTE_CRYPTO_AUTH_OP_GENERATE); 2836 } 2837 2838 static int 2839 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2840 const unsigned auth_tag_len, 2841 const uint8_t *auth_iv, uint8_t auth_iv_len, 2842 unsigned data_pad_len, 2843 enum rte_crypto_auth_operation op, 2844 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2845 const unsigned cipher_len, const unsigned cipher_offset, 2846 const unsigned auth_len, const unsigned auth_offset) 2847 { 2848 struct crypto_testsuite_params *ts_params = &testsuite_params; 2849 struct crypto_unittest_params *ut_params = &unittest_params; 2850 2851 enum rte_crypto_cipher_algorithm cipher_algo = 2852 ut_params->cipher_xform.cipher.algo; 2853 enum rte_crypto_auth_algorithm auth_algo = 2854 ut_params->auth_xform.auth.algo; 2855 2856 /* Generate Crypto op data structure */ 2857 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2858 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2859 TEST_ASSERT_NOT_NULL(ut_params->op, 2860 "Failed to allocate pktmbuf offload"); 2861 /* Set crypto operation data parameters */ 2862 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2863 2864 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2865 2866 /* set crypto operation source mbuf */ 2867 sym_op->m_src = ut_params->ibuf; 2868 2869 /* digest */ 2870 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2871 ut_params->ibuf, auth_tag_len); 2872 2873 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2874 "no room to append auth tag"); 2875 ut_params->digest = sym_op->auth.digest.data; 2876 2877 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2878 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2879 ut_params->ibuf, data_pad_len); 2880 } else { 2881 struct rte_mbuf *m = ut_params->ibuf; 2882 unsigned int offset = data_pad_len; 2883 2884 while (offset > m->data_len && m->next != NULL) { 2885 offset -= m->data_len; 2886 m = m->next; 2887 } 2888 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2889 m, offset); 2890 } 2891 2892 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2893 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2894 else 2895 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2896 2897 debug_hexdump(stdout, "digest:", 2898 sym_op->auth.digest.data, 2899 auth_tag_len); 2900 2901 /* Copy cipher and auth IVs at the end of the crypto operation */ 2902 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2903 IV_OFFSET); 2904 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2905 iv_ptr += cipher_iv_len; 2906 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2907 2908 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2909 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2910 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2911 sym_op->cipher.data.length = cipher_len; 2912 sym_op->cipher.data.offset = cipher_offset; 2913 } else { 2914 sym_op->cipher.data.length = cipher_len >> 3; 2915 sym_op->cipher.data.offset = cipher_offset >> 3; 2916 } 2917 2918 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2919 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2920 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2921 sym_op->auth.data.length = auth_len; 2922 sym_op->auth.data.offset = auth_offset; 2923 } else { 2924 sym_op->auth.data.length = auth_len >> 3; 2925 sym_op->auth.data.offset = auth_offset >> 3; 2926 } 2927 2928 return 0; 2929 } 2930 2931 static int 2932 create_wireless_algo_auth_cipher_operation( 2933 const uint8_t *auth_tag, unsigned int auth_tag_len, 2934 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2935 const uint8_t *auth_iv, uint8_t auth_iv_len, 2936 unsigned int data_pad_len, 2937 unsigned int cipher_len, unsigned int cipher_offset, 2938 unsigned int auth_len, unsigned int auth_offset, 2939 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2940 { 2941 struct crypto_testsuite_params *ts_params = &testsuite_params; 2942 struct crypto_unittest_params *ut_params = &unittest_params; 2943 2944 enum rte_crypto_cipher_algorithm cipher_algo = 2945 ut_params->cipher_xform.cipher.algo; 2946 enum rte_crypto_auth_algorithm auth_algo = 2947 ut_params->auth_xform.auth.algo; 2948 2949 /* Generate Crypto op data structure */ 2950 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2951 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2952 TEST_ASSERT_NOT_NULL(ut_params->op, 2953 "Failed to allocate pktmbuf offload"); 2954 2955 /* Set crypto operation data parameters */ 2956 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2957 2958 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2959 2960 /* set crypto operation mbufs */ 2961 sym_op->m_src = ut_params->ibuf; 2962 if (op_mode == OUT_OF_PLACE) 2963 sym_op->m_dst = ut_params->obuf; 2964 2965 /* digest */ 2966 if (!do_sgl) { 2967 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2968 (op_mode == IN_PLACE ? 2969 ut_params->ibuf : ut_params->obuf), 2970 uint8_t *, data_pad_len); 2971 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2972 (op_mode == IN_PLACE ? 2973 ut_params->ibuf : ut_params->obuf), 2974 data_pad_len); 2975 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2976 } else { 2977 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2978 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2979 sym_op->m_src : sym_op->m_dst); 2980 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2981 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2982 sgl_buf = sgl_buf->next; 2983 } 2984 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 2985 uint8_t *, remaining_off); 2986 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 2987 remaining_off); 2988 memset(sym_op->auth.digest.data, 0, remaining_off); 2989 while (sgl_buf->next != NULL) { 2990 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 2991 0, rte_pktmbuf_data_len(sgl_buf)); 2992 sgl_buf = sgl_buf->next; 2993 } 2994 } 2995 2996 /* Copy digest for the verification */ 2997 if (verify) 2998 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2999 3000 /* Copy cipher and auth IVs at the end of the crypto operation */ 3001 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 3002 ut_params->op, uint8_t *, IV_OFFSET); 3003 3004 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 3005 iv_ptr += cipher_iv_len; 3006 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 3007 3008 /* Only copy over the offset data needed from src to dst in OOP, 3009 * if the auth and cipher offsets are not aligned 3010 */ 3011 if (op_mode == OUT_OF_PLACE) { 3012 if (cipher_offset > auth_offset) 3013 rte_memcpy( 3014 rte_pktmbuf_mtod_offset( 3015 sym_op->m_dst, 3016 uint8_t *, auth_offset >> 3), 3017 rte_pktmbuf_mtod_offset( 3018 sym_op->m_src, 3019 uint8_t *, auth_offset >> 3), 3020 ((cipher_offset >> 3) - (auth_offset >> 3))); 3021 } 3022 3023 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 3024 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 3025 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 3026 sym_op->cipher.data.length = cipher_len; 3027 sym_op->cipher.data.offset = cipher_offset; 3028 } else { 3029 sym_op->cipher.data.length = cipher_len >> 3; 3030 sym_op->cipher.data.offset = cipher_offset >> 3; 3031 } 3032 3033 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 3034 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 3035 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 3036 sym_op->auth.data.length = auth_len; 3037 sym_op->auth.data.offset = auth_offset; 3038 } else { 3039 sym_op->auth.data.length = auth_len >> 3; 3040 sym_op->auth.data.offset = auth_offset >> 3; 3041 } 3042 3043 return 0; 3044 } 3045 3046 static int 3047 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 3048 { 3049 struct crypto_testsuite_params *ts_params = &testsuite_params; 3050 struct crypto_unittest_params *ut_params = &unittest_params; 3051 3052 int retval; 3053 unsigned plaintext_pad_len; 3054 unsigned plaintext_len; 3055 uint8_t *plaintext; 3056 struct rte_cryptodev_info dev_info; 3057 3058 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3059 uint64_t feat_flags = dev_info.feature_flags; 3060 3061 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3062 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3063 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3064 return TEST_SKIPPED; 3065 } 3066 3067 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3068 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3069 printf("Device doesn't support RAW data-path APIs.\n"); 3070 return TEST_SKIPPED; 3071 } 3072 3073 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3074 return TEST_SKIPPED; 3075 3076 /* Verify the capabilities */ 3077 struct rte_cryptodev_sym_capability_idx cap_idx; 3078 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3079 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3080 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3081 &cap_idx) == NULL) 3082 return TEST_SKIPPED; 3083 3084 /* Create SNOW 3G session */ 3085 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3086 tdata->key.data, tdata->key.len, 3087 tdata->auth_iv.len, tdata->digest.len, 3088 RTE_CRYPTO_AUTH_OP_GENERATE, 3089 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3090 if (retval < 0) 3091 return retval; 3092 3093 /* alloc mbuf and set payload */ 3094 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3095 3096 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3097 rte_pktmbuf_tailroom(ut_params->ibuf)); 3098 3099 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3100 /* Append data which is padded to a multiple of */ 3101 /* the algorithms block size */ 3102 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3103 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3104 plaintext_pad_len); 3105 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3106 3107 /* Create SNOW 3G operation */ 3108 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3109 tdata->auth_iv.data, tdata->auth_iv.len, 3110 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3111 tdata->validAuthLenInBits.len, 3112 0); 3113 if (retval < 0) 3114 return retval; 3115 3116 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3117 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3118 ut_params->op, 0, 1, 1, 0); 3119 else 3120 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3121 ut_params->op); 3122 ut_params->obuf = ut_params->op->sym->m_src; 3123 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3124 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3125 + plaintext_pad_len; 3126 3127 /* Validate obuf */ 3128 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3129 ut_params->digest, 3130 tdata->digest.data, 3131 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 3132 "SNOW 3G Generated auth tag not as expected"); 3133 3134 return 0; 3135 } 3136 3137 static int 3138 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 3139 { 3140 struct crypto_testsuite_params *ts_params = &testsuite_params; 3141 struct crypto_unittest_params *ut_params = &unittest_params; 3142 3143 int retval; 3144 unsigned plaintext_pad_len; 3145 unsigned plaintext_len; 3146 uint8_t *plaintext; 3147 struct rte_cryptodev_info dev_info; 3148 3149 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3150 uint64_t feat_flags = dev_info.feature_flags; 3151 3152 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3153 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3154 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3155 return TEST_SKIPPED; 3156 } 3157 3158 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3159 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3160 printf("Device doesn't support RAW data-path APIs.\n"); 3161 return TEST_SKIPPED; 3162 } 3163 3164 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3165 return TEST_SKIPPED; 3166 3167 /* Verify the capabilities */ 3168 struct rte_cryptodev_sym_capability_idx cap_idx; 3169 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3170 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3171 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3172 &cap_idx) == NULL) 3173 return TEST_SKIPPED; 3174 3175 /* Create SNOW 3G session */ 3176 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3177 tdata->key.data, tdata->key.len, 3178 tdata->auth_iv.len, tdata->digest.len, 3179 RTE_CRYPTO_AUTH_OP_VERIFY, 3180 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3181 if (retval < 0) 3182 return retval; 3183 /* alloc mbuf and set payload */ 3184 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3185 3186 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3187 rte_pktmbuf_tailroom(ut_params->ibuf)); 3188 3189 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3190 /* Append data which is padded to a multiple of */ 3191 /* the algorithms block size */ 3192 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3193 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3194 plaintext_pad_len); 3195 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3196 3197 /* Create SNOW 3G operation */ 3198 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3199 tdata->digest.len, 3200 tdata->auth_iv.data, tdata->auth_iv.len, 3201 plaintext_pad_len, 3202 RTE_CRYPTO_AUTH_OP_VERIFY, 3203 tdata->validAuthLenInBits.len, 3204 0); 3205 if (retval < 0) 3206 return retval; 3207 3208 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3209 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3210 ut_params->op, 0, 1, 1, 0); 3211 else 3212 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3213 ut_params->op); 3214 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3215 ut_params->obuf = ut_params->op->sym->m_src; 3216 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3217 + plaintext_pad_len; 3218 3219 /* Validate obuf */ 3220 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3221 return 0; 3222 else 3223 return -1; 3224 3225 return 0; 3226 } 3227 3228 static int 3229 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 3230 { 3231 struct crypto_testsuite_params *ts_params = &testsuite_params; 3232 struct crypto_unittest_params *ut_params = &unittest_params; 3233 3234 int retval; 3235 unsigned plaintext_pad_len; 3236 unsigned plaintext_len; 3237 uint8_t *plaintext; 3238 struct rte_cryptodev_info dev_info; 3239 3240 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3241 uint64_t feat_flags = dev_info.feature_flags; 3242 3243 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3244 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3245 printf("Device doesn't support RAW data-path APIs.\n"); 3246 return TEST_SKIPPED; 3247 } 3248 3249 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3250 return TEST_SKIPPED; 3251 3252 /* Verify the capabilities */ 3253 struct rte_cryptodev_sym_capability_idx cap_idx; 3254 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3255 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3256 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3257 &cap_idx) == NULL) 3258 return TEST_SKIPPED; 3259 3260 /* Create KASUMI session */ 3261 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3262 tdata->key.data, tdata->key.len, 3263 0, tdata->digest.len, 3264 RTE_CRYPTO_AUTH_OP_GENERATE, 3265 RTE_CRYPTO_AUTH_KASUMI_F9); 3266 if (retval < 0) 3267 return retval; 3268 3269 /* alloc mbuf and set payload */ 3270 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3271 3272 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3273 rte_pktmbuf_tailroom(ut_params->ibuf)); 3274 3275 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3276 /* Append data which is padded to a multiple of */ 3277 /* the algorithms block size */ 3278 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3279 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3280 plaintext_pad_len); 3281 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3282 3283 /* Create KASUMI operation */ 3284 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3285 NULL, 0, 3286 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3287 tdata->plaintext.len, 3288 0); 3289 if (retval < 0) 3290 return retval; 3291 3292 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3293 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 3294 ut_params->op); 3295 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3296 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3297 ut_params->op, 0, 1, 1, 0); 3298 else 3299 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3300 ut_params->op); 3301 3302 ut_params->obuf = ut_params->op->sym->m_src; 3303 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3304 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3305 + plaintext_pad_len; 3306 3307 /* Validate obuf */ 3308 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3309 ut_params->digest, 3310 tdata->digest.data, 3311 DIGEST_BYTE_LENGTH_KASUMI_F9, 3312 "KASUMI Generated auth tag not as expected"); 3313 3314 return 0; 3315 } 3316 3317 static int 3318 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 3319 { 3320 struct crypto_testsuite_params *ts_params = &testsuite_params; 3321 struct crypto_unittest_params *ut_params = &unittest_params; 3322 3323 int retval; 3324 unsigned plaintext_pad_len; 3325 unsigned plaintext_len; 3326 uint8_t *plaintext; 3327 struct rte_cryptodev_info dev_info; 3328 3329 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3330 uint64_t feat_flags = dev_info.feature_flags; 3331 3332 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3333 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3334 printf("Device doesn't support RAW data-path APIs.\n"); 3335 return TEST_SKIPPED; 3336 } 3337 3338 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3339 return TEST_SKIPPED; 3340 3341 /* Verify the capabilities */ 3342 struct rte_cryptodev_sym_capability_idx cap_idx; 3343 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3344 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3345 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3346 &cap_idx) == NULL) 3347 return TEST_SKIPPED; 3348 3349 /* Create KASUMI session */ 3350 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3351 tdata->key.data, tdata->key.len, 3352 0, tdata->digest.len, 3353 RTE_CRYPTO_AUTH_OP_VERIFY, 3354 RTE_CRYPTO_AUTH_KASUMI_F9); 3355 if (retval < 0) 3356 return retval; 3357 /* alloc mbuf and set payload */ 3358 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3359 3360 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3361 rte_pktmbuf_tailroom(ut_params->ibuf)); 3362 3363 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3364 /* Append data which is padded to a multiple */ 3365 /* of the algorithms block size */ 3366 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3367 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3368 plaintext_pad_len); 3369 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3370 3371 /* Create KASUMI operation */ 3372 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3373 tdata->digest.len, 3374 NULL, 0, 3375 plaintext_pad_len, 3376 RTE_CRYPTO_AUTH_OP_VERIFY, 3377 tdata->plaintext.len, 3378 0); 3379 if (retval < 0) 3380 return retval; 3381 3382 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3383 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3384 ut_params->op, 0, 1, 1, 0); 3385 else 3386 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3387 ut_params->op); 3388 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3389 ut_params->obuf = ut_params->op->sym->m_src; 3390 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3391 + plaintext_pad_len; 3392 3393 /* Validate obuf */ 3394 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3395 return 0; 3396 else 3397 return -1; 3398 3399 return 0; 3400 } 3401 3402 static int 3403 test_snow3g_hash_generate_test_case_1(void) 3404 { 3405 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3406 } 3407 3408 static int 3409 test_snow3g_hash_generate_test_case_2(void) 3410 { 3411 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3412 } 3413 3414 static int 3415 test_snow3g_hash_generate_test_case_3(void) 3416 { 3417 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3418 } 3419 3420 static int 3421 test_snow3g_hash_generate_test_case_4(void) 3422 { 3423 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3424 } 3425 3426 static int 3427 test_snow3g_hash_generate_test_case_5(void) 3428 { 3429 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3430 } 3431 3432 static int 3433 test_snow3g_hash_generate_test_case_6(void) 3434 { 3435 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3436 } 3437 3438 static int 3439 test_snow3g_hash_verify_test_case_1(void) 3440 { 3441 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3442 3443 } 3444 3445 static int 3446 test_snow3g_hash_verify_test_case_2(void) 3447 { 3448 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3449 } 3450 3451 static int 3452 test_snow3g_hash_verify_test_case_3(void) 3453 { 3454 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3455 } 3456 3457 static int 3458 test_snow3g_hash_verify_test_case_4(void) 3459 { 3460 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3461 } 3462 3463 static int 3464 test_snow3g_hash_verify_test_case_5(void) 3465 { 3466 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3467 } 3468 3469 static int 3470 test_snow3g_hash_verify_test_case_6(void) 3471 { 3472 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3473 } 3474 3475 static int 3476 test_kasumi_hash_generate_test_case_1(void) 3477 { 3478 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3479 } 3480 3481 static int 3482 test_kasumi_hash_generate_test_case_2(void) 3483 { 3484 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3485 } 3486 3487 static int 3488 test_kasumi_hash_generate_test_case_3(void) 3489 { 3490 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3491 } 3492 3493 static int 3494 test_kasumi_hash_generate_test_case_4(void) 3495 { 3496 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3497 } 3498 3499 static int 3500 test_kasumi_hash_generate_test_case_5(void) 3501 { 3502 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3503 } 3504 3505 static int 3506 test_kasumi_hash_generate_test_case_6(void) 3507 { 3508 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3509 } 3510 3511 static int 3512 test_kasumi_hash_verify_test_case_1(void) 3513 { 3514 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3515 } 3516 3517 static int 3518 test_kasumi_hash_verify_test_case_2(void) 3519 { 3520 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3521 } 3522 3523 static int 3524 test_kasumi_hash_verify_test_case_3(void) 3525 { 3526 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3527 } 3528 3529 static int 3530 test_kasumi_hash_verify_test_case_4(void) 3531 { 3532 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3533 } 3534 3535 static int 3536 test_kasumi_hash_verify_test_case_5(void) 3537 { 3538 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3539 } 3540 3541 static int 3542 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3543 { 3544 struct crypto_testsuite_params *ts_params = &testsuite_params; 3545 struct crypto_unittest_params *ut_params = &unittest_params; 3546 3547 int retval; 3548 uint8_t *plaintext, *ciphertext; 3549 unsigned plaintext_pad_len; 3550 unsigned plaintext_len; 3551 struct rte_cryptodev_info dev_info; 3552 3553 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3554 uint64_t feat_flags = dev_info.feature_flags; 3555 3556 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3557 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3558 printf("Device doesn't support RAW data-path APIs.\n"); 3559 return TEST_SKIPPED; 3560 } 3561 3562 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3563 return TEST_SKIPPED; 3564 3565 /* Verify the capabilities */ 3566 struct rte_cryptodev_sym_capability_idx cap_idx; 3567 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3568 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3569 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3570 &cap_idx) == NULL) 3571 return TEST_SKIPPED; 3572 3573 /* Create KASUMI session */ 3574 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3575 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3576 RTE_CRYPTO_CIPHER_KASUMI_F8, 3577 tdata->key.data, tdata->key.len, 3578 tdata->cipher_iv.len); 3579 if (retval < 0) 3580 return retval; 3581 3582 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3583 3584 /* Clear mbuf payload */ 3585 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3586 rte_pktmbuf_tailroom(ut_params->ibuf)); 3587 3588 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3589 /* Append data which is padded to a multiple */ 3590 /* of the algorithms block size */ 3591 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3592 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3593 plaintext_pad_len); 3594 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3595 3596 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3597 3598 /* Create KASUMI operation */ 3599 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3600 tdata->cipher_iv.len, 3601 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3602 tdata->validCipherOffsetInBits.len); 3603 if (retval < 0) 3604 return retval; 3605 3606 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3607 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3608 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3609 else 3610 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3611 ut_params->op); 3612 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3613 3614 ut_params->obuf = ut_params->op->sym->m_dst; 3615 if (ut_params->obuf) 3616 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3617 else 3618 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3619 3620 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3621 3622 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3623 (tdata->validCipherOffsetInBits.len >> 3); 3624 /* Validate obuf */ 3625 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3626 ciphertext, 3627 reference_ciphertext, 3628 tdata->validCipherLenInBits.len, 3629 "KASUMI Ciphertext data not as expected"); 3630 return 0; 3631 } 3632 3633 static int 3634 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3635 { 3636 struct crypto_testsuite_params *ts_params = &testsuite_params; 3637 struct crypto_unittest_params *ut_params = &unittest_params; 3638 3639 int retval; 3640 3641 unsigned int plaintext_pad_len; 3642 unsigned int plaintext_len; 3643 3644 uint8_t buffer[10000]; 3645 const uint8_t *ciphertext; 3646 3647 struct rte_cryptodev_info dev_info; 3648 3649 /* Verify the capabilities */ 3650 struct rte_cryptodev_sym_capability_idx cap_idx; 3651 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3652 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3653 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3654 &cap_idx) == NULL) 3655 return TEST_SKIPPED; 3656 3657 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3658 3659 uint64_t feat_flags = dev_info.feature_flags; 3660 3661 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3662 printf("Device doesn't support in-place scatter-gather. " 3663 "Test Skipped.\n"); 3664 return TEST_SKIPPED; 3665 } 3666 3667 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3668 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3669 printf("Device doesn't support RAW data-path APIs.\n"); 3670 return TEST_SKIPPED; 3671 } 3672 3673 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3674 return TEST_SKIPPED; 3675 3676 /* Create KASUMI session */ 3677 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3678 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3679 RTE_CRYPTO_CIPHER_KASUMI_F8, 3680 tdata->key.data, tdata->key.len, 3681 tdata->cipher_iv.len); 3682 if (retval < 0) 3683 return retval; 3684 3685 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3686 3687 3688 /* Append data which is padded to a multiple */ 3689 /* of the algorithms block size */ 3690 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3691 3692 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3693 plaintext_pad_len, 10, 0); 3694 3695 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3696 3697 /* Create KASUMI operation */ 3698 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3699 tdata->cipher_iv.len, 3700 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3701 tdata->validCipherOffsetInBits.len); 3702 if (retval < 0) 3703 return retval; 3704 3705 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3706 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3707 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3708 else 3709 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3710 ut_params->op); 3711 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3712 3713 ut_params->obuf = ut_params->op->sym->m_dst; 3714 3715 if (ut_params->obuf) 3716 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3717 plaintext_len, buffer); 3718 else 3719 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3720 tdata->validCipherOffsetInBits.len >> 3, 3721 plaintext_len, buffer); 3722 3723 /* Validate obuf */ 3724 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3725 3726 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3727 (tdata->validCipherOffsetInBits.len >> 3); 3728 /* Validate obuf */ 3729 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3730 ciphertext, 3731 reference_ciphertext, 3732 tdata->validCipherLenInBits.len, 3733 "KASUMI Ciphertext data not as expected"); 3734 return 0; 3735 } 3736 3737 static int 3738 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3739 { 3740 struct crypto_testsuite_params *ts_params = &testsuite_params; 3741 struct crypto_unittest_params *ut_params = &unittest_params; 3742 3743 int retval; 3744 uint8_t *plaintext, *ciphertext; 3745 unsigned plaintext_pad_len; 3746 unsigned plaintext_len; 3747 3748 /* Verify the capabilities */ 3749 struct rte_cryptodev_sym_capability_idx cap_idx; 3750 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3751 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3752 /* Data-path service does not support OOP */ 3753 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3754 &cap_idx) == NULL) 3755 return TEST_SKIPPED; 3756 3757 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3758 return TEST_SKIPPED; 3759 3760 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3761 return TEST_SKIPPED; 3762 3763 /* Create KASUMI session */ 3764 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3765 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3766 RTE_CRYPTO_CIPHER_KASUMI_F8, 3767 tdata->key.data, tdata->key.len, 3768 tdata->cipher_iv.len); 3769 if (retval < 0) 3770 return retval; 3771 3772 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3773 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3774 3775 /* Clear mbuf payload */ 3776 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3777 rte_pktmbuf_tailroom(ut_params->ibuf)); 3778 3779 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3780 /* Append data which is padded to a multiple */ 3781 /* of the algorithms block size */ 3782 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3783 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3784 plaintext_pad_len); 3785 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3786 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3787 3788 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3789 3790 /* Create KASUMI operation */ 3791 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3792 tdata->cipher_iv.len, 3793 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3794 tdata->validCipherOffsetInBits.len); 3795 if (retval < 0) 3796 return retval; 3797 3798 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3799 ut_params->op); 3800 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3801 3802 ut_params->obuf = ut_params->op->sym->m_dst; 3803 if (ut_params->obuf) 3804 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3805 else 3806 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3807 3808 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3809 3810 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3811 (tdata->validCipherOffsetInBits.len >> 3); 3812 /* Validate obuf */ 3813 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3814 ciphertext, 3815 reference_ciphertext, 3816 tdata->validCipherLenInBits.len, 3817 "KASUMI Ciphertext data not as expected"); 3818 return 0; 3819 } 3820 3821 static int 3822 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3823 { 3824 struct crypto_testsuite_params *ts_params = &testsuite_params; 3825 struct crypto_unittest_params *ut_params = &unittest_params; 3826 3827 int retval; 3828 unsigned int plaintext_pad_len; 3829 unsigned int plaintext_len; 3830 3831 const uint8_t *ciphertext; 3832 uint8_t buffer[2048]; 3833 3834 struct rte_cryptodev_info dev_info; 3835 3836 /* Verify the capabilities */ 3837 struct rte_cryptodev_sym_capability_idx cap_idx; 3838 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3839 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3840 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3841 &cap_idx) == NULL) 3842 return TEST_SKIPPED; 3843 3844 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3845 return TEST_SKIPPED; 3846 3847 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3848 return TEST_SKIPPED; 3849 3850 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3851 3852 uint64_t feat_flags = dev_info.feature_flags; 3853 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3854 printf("Device doesn't support out-of-place scatter-gather " 3855 "in both input and output mbufs. " 3856 "Test Skipped.\n"); 3857 return TEST_SKIPPED; 3858 } 3859 3860 /* Create KASUMI session */ 3861 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3862 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3863 RTE_CRYPTO_CIPHER_KASUMI_F8, 3864 tdata->key.data, tdata->key.len, 3865 tdata->cipher_iv.len); 3866 if (retval < 0) 3867 return retval; 3868 3869 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3870 /* Append data which is padded to a multiple */ 3871 /* of the algorithms block size */ 3872 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3873 3874 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3875 plaintext_pad_len, 10, 0); 3876 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3877 plaintext_pad_len, 3, 0); 3878 3879 /* Append data which is padded to a multiple */ 3880 /* of the algorithms block size */ 3881 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3882 3883 /* Create KASUMI operation */ 3884 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3885 tdata->cipher_iv.len, 3886 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3887 tdata->validCipherOffsetInBits.len); 3888 if (retval < 0) 3889 return retval; 3890 3891 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3892 ut_params->op); 3893 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3894 3895 ut_params->obuf = ut_params->op->sym->m_dst; 3896 if (ut_params->obuf) 3897 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3898 plaintext_pad_len, buffer); 3899 else 3900 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3901 tdata->validCipherOffsetInBits.len >> 3, 3902 plaintext_pad_len, buffer); 3903 3904 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3905 (tdata->validCipherOffsetInBits.len >> 3); 3906 /* Validate obuf */ 3907 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3908 ciphertext, 3909 reference_ciphertext, 3910 tdata->validCipherLenInBits.len, 3911 "KASUMI Ciphertext data not as expected"); 3912 return 0; 3913 } 3914 3915 3916 static int 3917 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3918 { 3919 struct crypto_testsuite_params *ts_params = &testsuite_params; 3920 struct crypto_unittest_params *ut_params = &unittest_params; 3921 3922 int retval; 3923 uint8_t *ciphertext, *plaintext; 3924 unsigned ciphertext_pad_len; 3925 unsigned ciphertext_len; 3926 3927 /* Verify the capabilities */ 3928 struct rte_cryptodev_sym_capability_idx cap_idx; 3929 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3930 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3931 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3932 &cap_idx) == NULL) 3933 return TEST_SKIPPED; 3934 3935 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3936 return TEST_SKIPPED; 3937 3938 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3939 return TEST_SKIPPED; 3940 3941 /* Create KASUMI session */ 3942 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3943 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3944 RTE_CRYPTO_CIPHER_KASUMI_F8, 3945 tdata->key.data, tdata->key.len, 3946 tdata->cipher_iv.len); 3947 if (retval < 0) 3948 return retval; 3949 3950 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3951 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3952 3953 /* Clear mbuf payload */ 3954 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3955 rte_pktmbuf_tailroom(ut_params->ibuf)); 3956 3957 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3958 /* Append data which is padded to a multiple */ 3959 /* of the algorithms block size */ 3960 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3961 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3962 ciphertext_pad_len); 3963 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3964 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3965 3966 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3967 3968 /* Create KASUMI operation */ 3969 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3970 tdata->cipher_iv.len, 3971 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3972 tdata->validCipherOffsetInBits.len); 3973 if (retval < 0) 3974 return retval; 3975 3976 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3977 ut_params->op); 3978 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3979 3980 ut_params->obuf = ut_params->op->sym->m_dst; 3981 if (ut_params->obuf) 3982 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3983 else 3984 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3985 3986 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3987 3988 const uint8_t *reference_plaintext = tdata->plaintext.data + 3989 (tdata->validCipherOffsetInBits.len >> 3); 3990 /* Validate obuf */ 3991 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3992 plaintext, 3993 reference_plaintext, 3994 tdata->validCipherLenInBits.len, 3995 "KASUMI Plaintext data not as expected"); 3996 return 0; 3997 } 3998 3999 static int 4000 test_kasumi_decryption(const struct kasumi_test_data *tdata) 4001 { 4002 struct crypto_testsuite_params *ts_params = &testsuite_params; 4003 struct crypto_unittest_params *ut_params = &unittest_params; 4004 4005 int retval; 4006 uint8_t *ciphertext, *plaintext; 4007 unsigned ciphertext_pad_len; 4008 unsigned ciphertext_len; 4009 struct rte_cryptodev_info dev_info; 4010 4011 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4012 uint64_t feat_flags = dev_info.feature_flags; 4013 4014 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4015 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4016 printf("Device doesn't support RAW data-path APIs.\n"); 4017 return TEST_SKIPPED; 4018 } 4019 4020 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4021 return TEST_SKIPPED; 4022 4023 /* Verify the capabilities */ 4024 struct rte_cryptodev_sym_capability_idx cap_idx; 4025 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4026 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4027 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4028 &cap_idx) == NULL) 4029 return TEST_SKIPPED; 4030 4031 /* Create KASUMI session */ 4032 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4033 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4034 RTE_CRYPTO_CIPHER_KASUMI_F8, 4035 tdata->key.data, tdata->key.len, 4036 tdata->cipher_iv.len); 4037 if (retval < 0) 4038 return retval; 4039 4040 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4041 4042 /* Clear mbuf payload */ 4043 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4044 rte_pktmbuf_tailroom(ut_params->ibuf)); 4045 4046 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4047 /* Append data which is padded to a multiple */ 4048 /* of the algorithms block size */ 4049 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 4050 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4051 ciphertext_pad_len); 4052 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4053 4054 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4055 4056 /* Create KASUMI operation */ 4057 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4058 tdata->cipher_iv.len, 4059 tdata->ciphertext.len, 4060 tdata->validCipherOffsetInBits.len); 4061 if (retval < 0) 4062 return retval; 4063 4064 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4065 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4066 ut_params->op, 1, 0, 1, 0); 4067 else 4068 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4069 ut_params->op); 4070 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4071 4072 ut_params->obuf = ut_params->op->sym->m_dst; 4073 if (ut_params->obuf) 4074 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4075 else 4076 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4077 4078 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4079 4080 const uint8_t *reference_plaintext = tdata->plaintext.data + 4081 (tdata->validCipherOffsetInBits.len >> 3); 4082 /* Validate obuf */ 4083 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4084 plaintext, 4085 reference_plaintext, 4086 tdata->validCipherLenInBits.len, 4087 "KASUMI Plaintext data not as expected"); 4088 return 0; 4089 } 4090 4091 static int 4092 test_snow3g_encryption(const struct snow3g_test_data *tdata) 4093 { 4094 struct crypto_testsuite_params *ts_params = &testsuite_params; 4095 struct crypto_unittest_params *ut_params = &unittest_params; 4096 4097 int retval; 4098 uint8_t *plaintext, *ciphertext; 4099 unsigned plaintext_pad_len; 4100 unsigned plaintext_len; 4101 struct rte_cryptodev_info dev_info; 4102 4103 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4104 uint64_t feat_flags = dev_info.feature_flags; 4105 4106 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4107 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4108 printf("Device doesn't support RAW data-path APIs.\n"); 4109 return TEST_SKIPPED; 4110 } 4111 4112 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4113 return TEST_SKIPPED; 4114 4115 /* Verify the capabilities */ 4116 struct rte_cryptodev_sym_capability_idx cap_idx; 4117 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4118 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4119 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4120 &cap_idx) == NULL) 4121 return TEST_SKIPPED; 4122 4123 /* Create SNOW 3G session */ 4124 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4125 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4126 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4127 tdata->key.data, tdata->key.len, 4128 tdata->cipher_iv.len); 4129 if (retval < 0) 4130 return retval; 4131 4132 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4133 4134 /* Clear mbuf payload */ 4135 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4136 rte_pktmbuf_tailroom(ut_params->ibuf)); 4137 4138 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4139 /* Append data which is padded to a multiple of */ 4140 /* the algorithms block size */ 4141 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4142 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4143 plaintext_pad_len); 4144 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4145 4146 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4147 4148 /* Create SNOW 3G operation */ 4149 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4150 tdata->cipher_iv.len, 4151 tdata->validCipherLenInBits.len, 4152 0); 4153 if (retval < 0) 4154 return retval; 4155 4156 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4157 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4158 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4159 else 4160 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4161 ut_params->op); 4162 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4163 4164 ut_params->obuf = ut_params->op->sym->m_dst; 4165 if (ut_params->obuf) 4166 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4167 else 4168 ciphertext = plaintext; 4169 4170 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4171 4172 /* Validate obuf */ 4173 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4174 ciphertext, 4175 tdata->ciphertext.data, 4176 tdata->validDataLenInBits.len, 4177 "SNOW 3G Ciphertext data not as expected"); 4178 return 0; 4179 } 4180 4181 4182 static int 4183 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 4184 { 4185 struct crypto_testsuite_params *ts_params = &testsuite_params; 4186 struct crypto_unittest_params *ut_params = &unittest_params; 4187 uint8_t *plaintext, *ciphertext; 4188 4189 int retval; 4190 unsigned plaintext_pad_len; 4191 unsigned plaintext_len; 4192 4193 /* Verify the capabilities */ 4194 struct rte_cryptodev_sym_capability_idx cap_idx; 4195 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4196 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4197 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4198 &cap_idx) == NULL) 4199 return TEST_SKIPPED; 4200 4201 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4202 return TEST_SKIPPED; 4203 4204 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4205 return TEST_SKIPPED; 4206 4207 /* Create SNOW 3G session */ 4208 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4209 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4210 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4211 tdata->key.data, tdata->key.len, 4212 tdata->cipher_iv.len); 4213 if (retval < 0) 4214 return retval; 4215 4216 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4217 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4218 4219 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4220 "Failed to allocate input buffer in mempool"); 4221 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4222 "Failed to allocate output buffer in mempool"); 4223 4224 /* Clear mbuf payload */ 4225 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4226 rte_pktmbuf_tailroom(ut_params->ibuf)); 4227 4228 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4229 /* Append data which is padded to a multiple of */ 4230 /* the algorithms block size */ 4231 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4232 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4233 plaintext_pad_len); 4234 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4235 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4236 4237 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4238 4239 /* Create SNOW 3G operation */ 4240 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4241 tdata->cipher_iv.len, 4242 tdata->validCipherLenInBits.len, 4243 0); 4244 if (retval < 0) 4245 return retval; 4246 4247 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4248 ut_params->op); 4249 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4250 4251 ut_params->obuf = ut_params->op->sym->m_dst; 4252 if (ut_params->obuf) 4253 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4254 else 4255 ciphertext = plaintext; 4256 4257 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4258 4259 /* Validate obuf */ 4260 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4261 ciphertext, 4262 tdata->ciphertext.data, 4263 tdata->validDataLenInBits.len, 4264 "SNOW 3G Ciphertext data not as expected"); 4265 return 0; 4266 } 4267 4268 static int 4269 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 4270 { 4271 struct crypto_testsuite_params *ts_params = &testsuite_params; 4272 struct crypto_unittest_params *ut_params = &unittest_params; 4273 4274 int retval; 4275 unsigned int plaintext_pad_len; 4276 unsigned int plaintext_len; 4277 uint8_t buffer[10000]; 4278 const uint8_t *ciphertext; 4279 4280 struct rte_cryptodev_info dev_info; 4281 4282 /* Verify the capabilities */ 4283 struct rte_cryptodev_sym_capability_idx cap_idx; 4284 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4285 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4286 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4287 &cap_idx) == NULL) 4288 return TEST_SKIPPED; 4289 4290 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4291 return TEST_SKIPPED; 4292 4293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4294 return TEST_SKIPPED; 4295 4296 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4297 4298 uint64_t feat_flags = dev_info.feature_flags; 4299 4300 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4301 printf("Device doesn't support out-of-place scatter-gather " 4302 "in both input and output mbufs. " 4303 "Test Skipped.\n"); 4304 return TEST_SKIPPED; 4305 } 4306 4307 /* Create SNOW 3G session */ 4308 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4309 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4310 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4311 tdata->key.data, tdata->key.len, 4312 tdata->cipher_iv.len); 4313 if (retval < 0) 4314 return retval; 4315 4316 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4317 /* Append data which is padded to a multiple of */ 4318 /* the algorithms block size */ 4319 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4320 4321 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4322 plaintext_pad_len, 10, 0); 4323 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4324 plaintext_pad_len, 3, 0); 4325 4326 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4327 "Failed to allocate input buffer in mempool"); 4328 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4329 "Failed to allocate output buffer in mempool"); 4330 4331 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 4332 4333 /* Create SNOW 3G operation */ 4334 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4335 tdata->cipher_iv.len, 4336 tdata->validCipherLenInBits.len, 4337 0); 4338 if (retval < 0) 4339 return retval; 4340 4341 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4342 ut_params->op); 4343 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4344 4345 ut_params->obuf = ut_params->op->sym->m_dst; 4346 if (ut_params->obuf) 4347 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4348 plaintext_len, buffer); 4349 else 4350 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4351 plaintext_len, buffer); 4352 4353 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4354 4355 /* Validate obuf */ 4356 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4357 ciphertext, 4358 tdata->ciphertext.data, 4359 tdata->validDataLenInBits.len, 4360 "SNOW 3G Ciphertext data not as expected"); 4361 4362 return 0; 4363 } 4364 4365 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 4366 static void 4367 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 4368 { 4369 uint8_t curr_byte, prev_byte; 4370 uint32_t length_in_bytes = ceil_byte_length(length + offset); 4371 uint8_t lower_byte_mask = (1 << offset) - 1; 4372 unsigned i; 4373 4374 prev_byte = buffer[0]; 4375 buffer[0] >>= offset; 4376 4377 for (i = 1; i < length_in_bytes; i++) { 4378 curr_byte = buffer[i]; 4379 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 4380 (curr_byte >> offset); 4381 prev_byte = curr_byte; 4382 } 4383 } 4384 4385 static int 4386 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 4387 { 4388 struct crypto_testsuite_params *ts_params = &testsuite_params; 4389 struct crypto_unittest_params *ut_params = &unittest_params; 4390 uint8_t *plaintext, *ciphertext; 4391 int retval; 4392 uint32_t plaintext_len; 4393 uint32_t plaintext_pad_len; 4394 uint8_t extra_offset = 4; 4395 uint8_t *expected_ciphertext_shifted; 4396 struct rte_cryptodev_info dev_info; 4397 4398 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4399 uint64_t feat_flags = dev_info.feature_flags; 4400 4401 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4402 ((tdata->validDataLenInBits.len % 8) != 0)) { 4403 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4404 return TEST_SKIPPED; 4405 } 4406 4407 /* Verify the capabilities */ 4408 struct rte_cryptodev_sym_capability_idx cap_idx; 4409 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4410 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4411 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4412 &cap_idx) == NULL) 4413 return TEST_SKIPPED; 4414 4415 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4416 return TEST_SKIPPED; 4417 4418 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4419 return TEST_SKIPPED; 4420 4421 /* Create SNOW 3G session */ 4422 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4423 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4424 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4425 tdata->key.data, tdata->key.len, 4426 tdata->cipher_iv.len); 4427 if (retval < 0) 4428 return retval; 4429 4430 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4431 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4432 4433 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4434 "Failed to allocate input buffer in mempool"); 4435 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4436 "Failed to allocate output buffer in mempool"); 4437 4438 /* Clear mbuf payload */ 4439 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4440 rte_pktmbuf_tailroom(ut_params->ibuf)); 4441 4442 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4443 /* 4444 * Append data which is padded to a 4445 * multiple of the algorithms block size 4446 */ 4447 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4448 4449 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4450 plaintext_pad_len); 4451 4452 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4453 4454 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4455 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4456 4457 #ifdef RTE_APP_TEST_DEBUG 4458 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4459 #endif 4460 /* Create SNOW 3G operation */ 4461 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4462 tdata->cipher_iv.len, 4463 tdata->validCipherLenInBits.len, 4464 extra_offset); 4465 if (retval < 0) 4466 return retval; 4467 4468 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4469 ut_params->op); 4470 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4471 4472 ut_params->obuf = ut_params->op->sym->m_dst; 4473 if (ut_params->obuf) 4474 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4475 else 4476 ciphertext = plaintext; 4477 4478 #ifdef RTE_APP_TEST_DEBUG 4479 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4480 #endif 4481 4482 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4483 4484 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4485 "failed to reserve memory for ciphertext shifted\n"); 4486 4487 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4488 ceil_byte_length(tdata->ciphertext.len)); 4489 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4490 extra_offset); 4491 /* Validate obuf */ 4492 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4493 ciphertext, 4494 expected_ciphertext_shifted, 4495 tdata->validDataLenInBits.len, 4496 extra_offset, 4497 "SNOW 3G Ciphertext data not as expected"); 4498 return 0; 4499 } 4500 4501 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4502 { 4503 struct crypto_testsuite_params *ts_params = &testsuite_params; 4504 struct crypto_unittest_params *ut_params = &unittest_params; 4505 4506 int retval; 4507 4508 uint8_t *plaintext, *ciphertext; 4509 unsigned ciphertext_pad_len; 4510 unsigned ciphertext_len; 4511 struct rte_cryptodev_info dev_info; 4512 4513 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4514 uint64_t feat_flags = dev_info.feature_flags; 4515 4516 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4517 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4518 printf("Device doesn't support RAW data-path APIs.\n"); 4519 return TEST_SKIPPED; 4520 } 4521 4522 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4523 return TEST_SKIPPED; 4524 4525 /* Verify the capabilities */ 4526 struct rte_cryptodev_sym_capability_idx cap_idx; 4527 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4528 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4529 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4530 &cap_idx) == NULL) 4531 return TEST_SKIPPED; 4532 4533 /* Create SNOW 3G session */ 4534 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4535 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4536 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4537 tdata->key.data, tdata->key.len, 4538 tdata->cipher_iv.len); 4539 if (retval < 0) 4540 return retval; 4541 4542 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4543 4544 /* Clear mbuf payload */ 4545 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4546 rte_pktmbuf_tailroom(ut_params->ibuf)); 4547 4548 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4549 /* Append data which is padded to a multiple of */ 4550 /* the algorithms block size */ 4551 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4552 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4553 ciphertext_pad_len); 4554 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4555 4556 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4557 4558 /* Create SNOW 3G operation */ 4559 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4560 tdata->cipher_iv.len, 4561 tdata->validCipherLenInBits.len, 4562 tdata->cipher.offset_bits); 4563 if (retval < 0) 4564 return retval; 4565 4566 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4567 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4568 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4569 else 4570 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4571 ut_params->op); 4572 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4573 ut_params->obuf = ut_params->op->sym->m_dst; 4574 if (ut_params->obuf) 4575 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4576 else 4577 plaintext = ciphertext; 4578 4579 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4580 4581 /* Validate obuf */ 4582 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4583 tdata->plaintext.data, 4584 tdata->validDataLenInBits.len, 4585 "SNOW 3G Plaintext data not as expected"); 4586 return 0; 4587 } 4588 4589 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4590 { 4591 struct crypto_testsuite_params *ts_params = &testsuite_params; 4592 struct crypto_unittest_params *ut_params = &unittest_params; 4593 4594 int retval; 4595 4596 uint8_t *plaintext, *ciphertext; 4597 unsigned ciphertext_pad_len; 4598 unsigned ciphertext_len; 4599 4600 /* Verify the capabilities */ 4601 struct rte_cryptodev_sym_capability_idx cap_idx; 4602 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4603 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4604 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4605 &cap_idx) == NULL) 4606 return TEST_SKIPPED; 4607 4608 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4609 return TEST_SKIPPED; 4610 4611 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4612 return TEST_SKIPPED; 4613 4614 /* Create SNOW 3G session */ 4615 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4616 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4617 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4618 tdata->key.data, tdata->key.len, 4619 tdata->cipher_iv.len); 4620 if (retval < 0) 4621 return retval; 4622 4623 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4624 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4625 4626 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4627 "Failed to allocate input buffer"); 4628 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4629 "Failed to allocate output buffer"); 4630 4631 /* Clear mbuf payload */ 4632 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4633 rte_pktmbuf_tailroom(ut_params->ibuf)); 4634 4635 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4636 rte_pktmbuf_tailroom(ut_params->obuf)); 4637 4638 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4639 /* Append data which is padded to a multiple of */ 4640 /* the algorithms block size */ 4641 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4642 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4643 ciphertext_pad_len); 4644 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4645 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4646 4647 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4648 4649 /* Create SNOW 3G operation */ 4650 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4651 tdata->cipher_iv.len, 4652 tdata->validCipherLenInBits.len, 4653 0); 4654 if (retval < 0) 4655 return retval; 4656 4657 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4658 ut_params->op); 4659 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4660 ut_params->obuf = ut_params->op->sym->m_dst; 4661 if (ut_params->obuf) 4662 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4663 else 4664 plaintext = ciphertext; 4665 4666 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4667 4668 /* Validate obuf */ 4669 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4670 tdata->plaintext.data, 4671 tdata->validDataLenInBits.len, 4672 "SNOW 3G Plaintext data not as expected"); 4673 return 0; 4674 } 4675 4676 static int 4677 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4678 { 4679 struct crypto_testsuite_params *ts_params = &testsuite_params; 4680 struct crypto_unittest_params *ut_params = &unittest_params; 4681 4682 int retval; 4683 4684 uint8_t *plaintext, *ciphertext; 4685 unsigned int plaintext_pad_len; 4686 unsigned int plaintext_len; 4687 4688 struct rte_cryptodev_info dev_info; 4689 struct rte_cryptodev_sym_capability_idx cap_idx; 4690 4691 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4692 uint64_t feat_flags = dev_info.feature_flags; 4693 4694 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4695 ((tdata->validAuthLenInBits.len % 8 != 0) || 4696 (tdata->validDataLenInBits.len % 8 != 0))) { 4697 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4698 return TEST_SKIPPED; 4699 } 4700 4701 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4702 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4703 printf("Device doesn't support RAW data-path APIs.\n"); 4704 return TEST_SKIPPED; 4705 } 4706 4707 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4708 return TEST_SKIPPED; 4709 4710 /* Check if device supports ZUC EEA3 */ 4711 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4712 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4713 4714 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4715 &cap_idx) == NULL) 4716 return TEST_SKIPPED; 4717 4718 /* Check if device supports ZUC EIA3 */ 4719 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4720 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4721 4722 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4723 &cap_idx) == NULL) 4724 return TEST_SKIPPED; 4725 4726 /* Create ZUC session */ 4727 retval = create_zuc_cipher_auth_encrypt_generate_session( 4728 ts_params->valid_devs[0], 4729 tdata); 4730 if (retval != 0) 4731 return retval; 4732 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4733 4734 /* clear mbuf payload */ 4735 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4736 rte_pktmbuf_tailroom(ut_params->ibuf)); 4737 4738 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4739 /* Append data which is padded to a multiple of */ 4740 /* the algorithms block size */ 4741 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4742 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4743 plaintext_pad_len); 4744 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4745 4746 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4747 4748 /* Create ZUC operation */ 4749 retval = create_zuc_cipher_hash_generate_operation(tdata); 4750 if (retval < 0) 4751 return retval; 4752 4753 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4754 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4755 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4756 else 4757 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4758 ut_params->op); 4759 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4760 ut_params->obuf = ut_params->op->sym->m_src; 4761 if (ut_params->obuf) 4762 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4763 else 4764 ciphertext = plaintext; 4765 4766 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4767 /* Validate obuf */ 4768 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4769 ciphertext, 4770 tdata->ciphertext.data, 4771 tdata->validDataLenInBits.len, 4772 "ZUC Ciphertext data not as expected"); 4773 4774 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4775 + plaintext_pad_len; 4776 4777 /* Validate obuf */ 4778 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4779 ut_params->digest, 4780 tdata->digest.data, 4781 4, 4782 "ZUC Generated auth tag not as expected"); 4783 return 0; 4784 } 4785 4786 static int 4787 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4788 { 4789 struct crypto_testsuite_params *ts_params = &testsuite_params; 4790 struct crypto_unittest_params *ut_params = &unittest_params; 4791 4792 int retval; 4793 4794 uint8_t *plaintext, *ciphertext; 4795 unsigned plaintext_pad_len; 4796 unsigned plaintext_len; 4797 struct rte_cryptodev_info dev_info; 4798 4799 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4800 uint64_t feat_flags = dev_info.feature_flags; 4801 4802 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4803 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4804 printf("Device doesn't support RAW data-path APIs.\n"); 4805 return TEST_SKIPPED; 4806 } 4807 4808 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4809 return TEST_SKIPPED; 4810 4811 /* Verify the capabilities */ 4812 struct rte_cryptodev_sym_capability_idx cap_idx; 4813 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4814 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4815 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4816 &cap_idx) == NULL) 4817 return TEST_SKIPPED; 4818 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4819 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4820 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4821 &cap_idx) == NULL) 4822 return TEST_SKIPPED; 4823 4824 /* Create SNOW 3G session */ 4825 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4826 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4827 RTE_CRYPTO_AUTH_OP_GENERATE, 4828 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4829 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4830 tdata->key.data, tdata->key.len, 4831 tdata->auth_iv.len, tdata->digest.len, 4832 tdata->cipher_iv.len); 4833 if (retval != 0) 4834 return retval; 4835 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4836 4837 /* clear mbuf payload */ 4838 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4839 rte_pktmbuf_tailroom(ut_params->ibuf)); 4840 4841 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4842 /* Append data which is padded to a multiple of */ 4843 /* the algorithms block size */ 4844 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4845 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4846 plaintext_pad_len); 4847 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4848 4849 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4850 4851 /* Create SNOW 3G operation */ 4852 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4853 tdata->digest.len, tdata->auth_iv.data, 4854 tdata->auth_iv.len, 4855 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4856 tdata->cipher_iv.data, tdata->cipher_iv.len, 4857 tdata->validCipherLenInBits.len, 4858 0, 4859 tdata->validAuthLenInBits.len, 4860 0 4861 ); 4862 if (retval < 0) 4863 return retval; 4864 4865 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4866 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4867 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4868 else 4869 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4870 ut_params->op); 4871 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4872 ut_params->obuf = ut_params->op->sym->m_src; 4873 if (ut_params->obuf) 4874 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4875 else 4876 ciphertext = plaintext; 4877 4878 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4879 /* Validate obuf */ 4880 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4881 ciphertext, 4882 tdata->ciphertext.data, 4883 tdata->validDataLenInBits.len, 4884 "SNOW 3G Ciphertext data not as expected"); 4885 4886 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4887 + plaintext_pad_len; 4888 4889 /* Validate obuf */ 4890 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4891 ut_params->digest, 4892 tdata->digest.data, 4893 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4894 "SNOW 3G Generated auth tag not as expected"); 4895 return 0; 4896 } 4897 4898 static int 4899 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4900 uint8_t op_mode, uint8_t verify) 4901 { 4902 struct crypto_testsuite_params *ts_params = &testsuite_params; 4903 struct crypto_unittest_params *ut_params = &unittest_params; 4904 4905 int retval; 4906 4907 uint8_t *plaintext = NULL, *ciphertext = NULL; 4908 unsigned int plaintext_pad_len; 4909 unsigned int plaintext_len; 4910 unsigned int ciphertext_pad_len; 4911 unsigned int ciphertext_len; 4912 4913 struct rte_cryptodev_info dev_info; 4914 4915 /* Verify the capabilities */ 4916 struct rte_cryptodev_sym_capability_idx cap_idx; 4917 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4918 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4919 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4920 &cap_idx) == NULL) 4921 return TEST_SKIPPED; 4922 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4923 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4924 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4925 &cap_idx) == NULL) 4926 return TEST_SKIPPED; 4927 4928 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4929 return TEST_SKIPPED; 4930 4931 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4932 4933 uint64_t feat_flags = dev_info.feature_flags; 4934 4935 if (op_mode == OUT_OF_PLACE) { 4936 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4937 printf("Device doesn't support digest encrypted.\n"); 4938 return TEST_SKIPPED; 4939 } 4940 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4941 return TEST_SKIPPED; 4942 } 4943 4944 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4945 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4946 printf("Device doesn't support RAW data-path APIs.\n"); 4947 return TEST_SKIPPED; 4948 } 4949 4950 /* Create SNOW 3G session */ 4951 retval = create_wireless_algo_auth_cipher_session( 4952 ts_params->valid_devs[0], 4953 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4954 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4955 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4956 : RTE_CRYPTO_AUTH_OP_GENERATE), 4957 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4958 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4959 tdata->key.data, tdata->key.len, 4960 tdata->auth_iv.len, tdata->digest.len, 4961 tdata->cipher_iv.len); 4962 if (retval != 0) 4963 return retval; 4964 4965 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4966 if (op_mode == OUT_OF_PLACE) 4967 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4968 4969 /* clear mbuf payload */ 4970 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4971 rte_pktmbuf_tailroom(ut_params->ibuf)); 4972 if (op_mode == OUT_OF_PLACE) 4973 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4974 rte_pktmbuf_tailroom(ut_params->obuf)); 4975 4976 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4977 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4978 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4979 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4980 4981 if (verify) { 4982 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4983 ciphertext_pad_len); 4984 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4985 if (op_mode == OUT_OF_PLACE) 4986 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4987 debug_hexdump(stdout, "ciphertext:", ciphertext, 4988 ciphertext_len); 4989 } else { 4990 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4991 plaintext_pad_len); 4992 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4993 if (op_mode == OUT_OF_PLACE) 4994 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4995 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4996 } 4997 4998 /* Create SNOW 3G operation */ 4999 retval = create_wireless_algo_auth_cipher_operation( 5000 tdata->digest.data, tdata->digest.len, 5001 tdata->cipher_iv.data, tdata->cipher_iv.len, 5002 tdata->auth_iv.data, tdata->auth_iv.len, 5003 (tdata->digest.offset_bytes == 0 ? 5004 (verify ? ciphertext_pad_len : plaintext_pad_len) 5005 : tdata->digest.offset_bytes), 5006 tdata->validCipherLenInBits.len, 5007 tdata->cipher.offset_bits, 5008 tdata->validAuthLenInBits.len, 5009 tdata->auth.offset_bits, 5010 op_mode, 0, verify); 5011 5012 if (retval < 0) 5013 return retval; 5014 5015 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5016 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5017 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5018 else 5019 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5020 ut_params->op); 5021 5022 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5023 5024 ut_params->obuf = (op_mode == IN_PLACE ? 5025 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5026 5027 if (verify) { 5028 if (ut_params->obuf) 5029 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5030 uint8_t *); 5031 else 5032 plaintext = ciphertext + 5033 (tdata->cipher.offset_bits >> 3); 5034 5035 debug_hexdump(stdout, "plaintext:", plaintext, 5036 (tdata->plaintext.len >> 3) - tdata->digest.len); 5037 debug_hexdump(stdout, "plaintext expected:", 5038 tdata->plaintext.data, 5039 (tdata->plaintext.len >> 3) - tdata->digest.len); 5040 } else { 5041 if (ut_params->obuf) 5042 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5043 uint8_t *); 5044 else 5045 ciphertext = plaintext; 5046 5047 debug_hexdump(stdout, "ciphertext:", ciphertext, 5048 ciphertext_len); 5049 debug_hexdump(stdout, "ciphertext expected:", 5050 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5051 5052 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5053 + (tdata->digest.offset_bytes == 0 ? 5054 plaintext_pad_len : tdata->digest.offset_bytes); 5055 5056 debug_hexdump(stdout, "digest:", ut_params->digest, 5057 tdata->digest.len); 5058 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 5059 tdata->digest.len); 5060 } 5061 5062 /* Validate obuf */ 5063 if (verify) { 5064 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5065 plaintext, 5066 tdata->plaintext.data, 5067 (tdata->plaintext.len - tdata->cipher.offset_bits - 5068 (tdata->digest.len << 3)), 5069 tdata->cipher.offset_bits, 5070 "SNOW 3G Plaintext data not as expected"); 5071 } else { 5072 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5073 ciphertext, 5074 tdata->ciphertext.data, 5075 (tdata->validDataLenInBits.len - 5076 tdata->cipher.offset_bits), 5077 tdata->cipher.offset_bits, 5078 "SNOW 3G Ciphertext data not as expected"); 5079 5080 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5081 ut_params->digest, 5082 tdata->digest.data, 5083 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5084 "SNOW 3G Generated auth tag not as expected"); 5085 } 5086 return 0; 5087 } 5088 5089 static int 5090 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 5091 uint8_t op_mode, uint8_t verify) 5092 { 5093 struct crypto_testsuite_params *ts_params = &testsuite_params; 5094 struct crypto_unittest_params *ut_params = &unittest_params; 5095 5096 int retval; 5097 5098 const uint8_t *plaintext = NULL; 5099 const uint8_t *ciphertext = NULL; 5100 const uint8_t *digest = NULL; 5101 unsigned int plaintext_pad_len; 5102 unsigned int plaintext_len; 5103 unsigned int ciphertext_pad_len; 5104 unsigned int ciphertext_len; 5105 uint8_t buffer[10000]; 5106 uint8_t digest_buffer[10000]; 5107 5108 struct rte_cryptodev_info dev_info; 5109 5110 /* Verify the capabilities */ 5111 struct rte_cryptodev_sym_capability_idx cap_idx; 5112 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5113 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5114 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5115 &cap_idx) == NULL) 5116 return TEST_SKIPPED; 5117 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5118 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5119 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5120 &cap_idx) == NULL) 5121 return TEST_SKIPPED; 5122 5123 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5124 return TEST_SKIPPED; 5125 5126 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5127 5128 uint64_t feat_flags = dev_info.feature_flags; 5129 5130 if (op_mode == IN_PLACE) { 5131 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5132 printf("Device doesn't support in-place scatter-gather " 5133 "in both input and output mbufs.\n"); 5134 return TEST_SKIPPED; 5135 } 5136 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5137 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5138 printf("Device doesn't support RAW data-path APIs.\n"); 5139 return TEST_SKIPPED; 5140 } 5141 } else { 5142 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5143 return TEST_SKIPPED; 5144 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5145 printf("Device doesn't support out-of-place scatter-gather " 5146 "in both input and output mbufs.\n"); 5147 return TEST_SKIPPED; 5148 } 5149 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5150 printf("Device doesn't support digest encrypted.\n"); 5151 return TEST_SKIPPED; 5152 } 5153 } 5154 5155 /* Create SNOW 3G session */ 5156 retval = create_wireless_algo_auth_cipher_session( 5157 ts_params->valid_devs[0], 5158 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5159 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5160 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5161 : RTE_CRYPTO_AUTH_OP_GENERATE), 5162 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5163 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5164 tdata->key.data, tdata->key.len, 5165 tdata->auth_iv.len, tdata->digest.len, 5166 tdata->cipher_iv.len); 5167 5168 if (retval != 0) 5169 return retval; 5170 5171 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5172 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5173 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5174 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5175 5176 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5177 plaintext_pad_len, 15, 0); 5178 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5179 "Failed to allocate input buffer in mempool"); 5180 5181 if (op_mode == OUT_OF_PLACE) { 5182 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5183 plaintext_pad_len, 15, 0); 5184 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5185 "Failed to allocate output buffer in mempool"); 5186 } 5187 5188 if (verify) { 5189 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5190 tdata->ciphertext.data); 5191 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5192 ciphertext_len, buffer); 5193 debug_hexdump(stdout, "ciphertext:", ciphertext, 5194 ciphertext_len); 5195 } else { 5196 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5197 tdata->plaintext.data); 5198 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5199 plaintext_len, buffer); 5200 debug_hexdump(stdout, "plaintext:", plaintext, 5201 plaintext_len); 5202 } 5203 memset(buffer, 0, sizeof(buffer)); 5204 5205 /* Create SNOW 3G operation */ 5206 retval = create_wireless_algo_auth_cipher_operation( 5207 tdata->digest.data, tdata->digest.len, 5208 tdata->cipher_iv.data, tdata->cipher_iv.len, 5209 tdata->auth_iv.data, tdata->auth_iv.len, 5210 (tdata->digest.offset_bytes == 0 ? 5211 (verify ? ciphertext_pad_len : plaintext_pad_len) 5212 : tdata->digest.offset_bytes), 5213 tdata->validCipherLenInBits.len, 5214 tdata->cipher.offset_bits, 5215 tdata->validAuthLenInBits.len, 5216 tdata->auth.offset_bits, 5217 op_mode, 1, verify); 5218 5219 if (retval < 0) 5220 return retval; 5221 5222 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5223 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5224 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5225 else 5226 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5227 ut_params->op); 5228 5229 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5230 5231 ut_params->obuf = (op_mode == IN_PLACE ? 5232 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5233 5234 if (verify) { 5235 if (ut_params->obuf) 5236 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5237 plaintext_len, buffer); 5238 else 5239 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5240 plaintext_len, buffer); 5241 5242 debug_hexdump(stdout, "plaintext:", plaintext, 5243 (tdata->plaintext.len >> 3) - tdata->digest.len); 5244 debug_hexdump(stdout, "plaintext expected:", 5245 tdata->plaintext.data, 5246 (tdata->plaintext.len >> 3) - tdata->digest.len); 5247 } else { 5248 if (ut_params->obuf) 5249 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5250 ciphertext_len, buffer); 5251 else 5252 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5253 ciphertext_len, buffer); 5254 5255 debug_hexdump(stdout, "ciphertext:", ciphertext, 5256 ciphertext_len); 5257 debug_hexdump(stdout, "ciphertext expected:", 5258 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5259 5260 if (ut_params->obuf) 5261 digest = rte_pktmbuf_read(ut_params->obuf, 5262 (tdata->digest.offset_bytes == 0 ? 5263 plaintext_pad_len : tdata->digest.offset_bytes), 5264 tdata->digest.len, digest_buffer); 5265 else 5266 digest = rte_pktmbuf_read(ut_params->ibuf, 5267 (tdata->digest.offset_bytes == 0 ? 5268 plaintext_pad_len : tdata->digest.offset_bytes), 5269 tdata->digest.len, digest_buffer); 5270 5271 debug_hexdump(stdout, "digest:", digest, 5272 tdata->digest.len); 5273 debug_hexdump(stdout, "digest expected:", 5274 tdata->digest.data, tdata->digest.len); 5275 } 5276 5277 /* Validate obuf */ 5278 if (verify) { 5279 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5280 plaintext, 5281 tdata->plaintext.data, 5282 (tdata->plaintext.len - tdata->cipher.offset_bits - 5283 (tdata->digest.len << 3)), 5284 tdata->cipher.offset_bits, 5285 "SNOW 3G Plaintext data not as expected"); 5286 } else { 5287 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5288 ciphertext, 5289 tdata->ciphertext.data, 5290 (tdata->validDataLenInBits.len - 5291 tdata->cipher.offset_bits), 5292 tdata->cipher.offset_bits, 5293 "SNOW 3G Ciphertext data not as expected"); 5294 5295 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5296 digest, 5297 tdata->digest.data, 5298 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5299 "SNOW 3G Generated auth tag not as expected"); 5300 } 5301 return 0; 5302 } 5303 5304 static int 5305 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 5306 uint8_t op_mode, uint8_t verify) 5307 { 5308 struct crypto_testsuite_params *ts_params = &testsuite_params; 5309 struct crypto_unittest_params *ut_params = &unittest_params; 5310 5311 int retval; 5312 5313 uint8_t *plaintext = NULL, *ciphertext = NULL; 5314 unsigned int plaintext_pad_len; 5315 unsigned int plaintext_len; 5316 unsigned int ciphertext_pad_len; 5317 unsigned int ciphertext_len; 5318 5319 struct rte_cryptodev_info dev_info; 5320 5321 /* Verify the capabilities */ 5322 struct rte_cryptodev_sym_capability_idx cap_idx; 5323 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5324 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5325 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5326 &cap_idx) == NULL) 5327 return TEST_SKIPPED; 5328 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5329 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5330 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5331 &cap_idx) == NULL) 5332 return TEST_SKIPPED; 5333 5334 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5335 5336 uint64_t feat_flags = dev_info.feature_flags; 5337 5338 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5339 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5340 printf("Device doesn't support RAW data-path APIs.\n"); 5341 return TEST_SKIPPED; 5342 } 5343 5344 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5345 return TEST_SKIPPED; 5346 5347 if (op_mode == OUT_OF_PLACE) { 5348 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5349 return TEST_SKIPPED; 5350 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5351 printf("Device doesn't support digest encrypted.\n"); 5352 return TEST_SKIPPED; 5353 } 5354 } 5355 5356 /* Create KASUMI session */ 5357 retval = create_wireless_algo_auth_cipher_session( 5358 ts_params->valid_devs[0], 5359 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5360 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5361 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5362 : RTE_CRYPTO_AUTH_OP_GENERATE), 5363 RTE_CRYPTO_AUTH_KASUMI_F9, 5364 RTE_CRYPTO_CIPHER_KASUMI_F8, 5365 tdata->key.data, tdata->key.len, 5366 0, tdata->digest.len, 5367 tdata->cipher_iv.len); 5368 5369 if (retval != 0) 5370 return retval; 5371 5372 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5373 if (op_mode == OUT_OF_PLACE) 5374 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5375 5376 /* clear mbuf payload */ 5377 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5378 rte_pktmbuf_tailroom(ut_params->ibuf)); 5379 if (op_mode == OUT_OF_PLACE) 5380 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5381 rte_pktmbuf_tailroom(ut_params->obuf)); 5382 5383 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5384 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5385 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5386 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5387 5388 if (verify) { 5389 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5390 ciphertext_pad_len); 5391 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5392 if (op_mode == OUT_OF_PLACE) 5393 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5394 debug_hexdump(stdout, "ciphertext:", ciphertext, 5395 ciphertext_len); 5396 } else { 5397 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5398 plaintext_pad_len); 5399 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5400 if (op_mode == OUT_OF_PLACE) 5401 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5402 debug_hexdump(stdout, "plaintext:", plaintext, 5403 plaintext_len); 5404 } 5405 5406 /* Create KASUMI operation */ 5407 retval = create_wireless_algo_auth_cipher_operation( 5408 tdata->digest.data, tdata->digest.len, 5409 tdata->cipher_iv.data, tdata->cipher_iv.len, 5410 NULL, 0, 5411 (tdata->digest.offset_bytes == 0 ? 5412 (verify ? ciphertext_pad_len : plaintext_pad_len) 5413 : tdata->digest.offset_bytes), 5414 tdata->validCipherLenInBits.len, 5415 tdata->validCipherOffsetInBits.len, 5416 tdata->validAuthLenInBits.len, 5417 0, 5418 op_mode, 0, verify); 5419 5420 if (retval < 0) 5421 return retval; 5422 5423 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5424 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5425 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5426 else 5427 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5428 ut_params->op); 5429 5430 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5431 5432 ut_params->obuf = (op_mode == IN_PLACE ? 5433 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5434 5435 5436 if (verify) { 5437 if (ut_params->obuf) 5438 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5439 uint8_t *); 5440 else 5441 plaintext = ciphertext; 5442 5443 debug_hexdump(stdout, "plaintext:", plaintext, 5444 (tdata->plaintext.len >> 3) - tdata->digest.len); 5445 debug_hexdump(stdout, "plaintext expected:", 5446 tdata->plaintext.data, 5447 (tdata->plaintext.len >> 3) - tdata->digest.len); 5448 } else { 5449 if (ut_params->obuf) 5450 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5451 uint8_t *); 5452 else 5453 ciphertext = plaintext; 5454 5455 debug_hexdump(stdout, "ciphertext:", ciphertext, 5456 ciphertext_len); 5457 debug_hexdump(stdout, "ciphertext expected:", 5458 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5459 5460 ut_params->digest = rte_pktmbuf_mtod( 5461 ut_params->obuf, uint8_t *) + 5462 (tdata->digest.offset_bytes == 0 ? 5463 plaintext_pad_len : tdata->digest.offset_bytes); 5464 5465 debug_hexdump(stdout, "digest:", ut_params->digest, 5466 tdata->digest.len); 5467 debug_hexdump(stdout, "digest expected:", 5468 tdata->digest.data, tdata->digest.len); 5469 } 5470 5471 /* Validate obuf */ 5472 if (verify) { 5473 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5474 plaintext, 5475 tdata->plaintext.data, 5476 tdata->plaintext.len >> 3, 5477 "KASUMI Plaintext data not as expected"); 5478 } else { 5479 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5480 ciphertext, 5481 tdata->ciphertext.data, 5482 tdata->ciphertext.len >> 3, 5483 "KASUMI Ciphertext data not as expected"); 5484 5485 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5486 ut_params->digest, 5487 tdata->digest.data, 5488 DIGEST_BYTE_LENGTH_KASUMI_F9, 5489 "KASUMI Generated auth tag not as expected"); 5490 } 5491 return 0; 5492 } 5493 5494 static int 5495 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5496 uint8_t op_mode, uint8_t verify) 5497 { 5498 struct crypto_testsuite_params *ts_params = &testsuite_params; 5499 struct crypto_unittest_params *ut_params = &unittest_params; 5500 5501 int retval; 5502 5503 const uint8_t *plaintext = NULL; 5504 const uint8_t *ciphertext = NULL; 5505 const uint8_t *digest = NULL; 5506 unsigned int plaintext_pad_len; 5507 unsigned int plaintext_len; 5508 unsigned int ciphertext_pad_len; 5509 unsigned int ciphertext_len; 5510 uint8_t buffer[10000]; 5511 uint8_t digest_buffer[10000]; 5512 5513 struct rte_cryptodev_info dev_info; 5514 5515 /* Verify the capabilities */ 5516 struct rte_cryptodev_sym_capability_idx cap_idx; 5517 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5518 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5519 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5520 &cap_idx) == NULL) 5521 return TEST_SKIPPED; 5522 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5523 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5524 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5525 &cap_idx) == NULL) 5526 return TEST_SKIPPED; 5527 5528 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5529 return TEST_SKIPPED; 5530 5531 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5532 5533 uint64_t feat_flags = dev_info.feature_flags; 5534 5535 if (op_mode == IN_PLACE) { 5536 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5537 printf("Device doesn't support in-place scatter-gather " 5538 "in both input and output mbufs.\n"); 5539 return TEST_SKIPPED; 5540 } 5541 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5542 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5543 printf("Device doesn't support RAW data-path APIs.\n"); 5544 return TEST_SKIPPED; 5545 } 5546 } else { 5547 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5548 return TEST_SKIPPED; 5549 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5550 printf("Device doesn't support out-of-place scatter-gather " 5551 "in both input and output mbufs.\n"); 5552 return TEST_SKIPPED; 5553 } 5554 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5555 printf("Device doesn't support digest encrypted.\n"); 5556 return TEST_SKIPPED; 5557 } 5558 } 5559 5560 /* Create KASUMI session */ 5561 retval = create_wireless_algo_auth_cipher_session( 5562 ts_params->valid_devs[0], 5563 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5564 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5565 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5566 : RTE_CRYPTO_AUTH_OP_GENERATE), 5567 RTE_CRYPTO_AUTH_KASUMI_F9, 5568 RTE_CRYPTO_CIPHER_KASUMI_F8, 5569 tdata->key.data, tdata->key.len, 5570 0, tdata->digest.len, 5571 tdata->cipher_iv.len); 5572 5573 if (retval != 0) 5574 return retval; 5575 5576 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5577 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5578 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5579 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5580 5581 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5582 plaintext_pad_len, 15, 0); 5583 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5584 "Failed to allocate input buffer in mempool"); 5585 5586 if (op_mode == OUT_OF_PLACE) { 5587 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5588 plaintext_pad_len, 15, 0); 5589 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5590 "Failed to allocate output buffer in mempool"); 5591 } 5592 5593 if (verify) { 5594 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5595 tdata->ciphertext.data); 5596 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5597 ciphertext_len, buffer); 5598 debug_hexdump(stdout, "ciphertext:", ciphertext, 5599 ciphertext_len); 5600 } else { 5601 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5602 tdata->plaintext.data); 5603 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5604 plaintext_len, buffer); 5605 debug_hexdump(stdout, "plaintext:", plaintext, 5606 plaintext_len); 5607 } 5608 memset(buffer, 0, sizeof(buffer)); 5609 5610 /* Create KASUMI operation */ 5611 retval = create_wireless_algo_auth_cipher_operation( 5612 tdata->digest.data, tdata->digest.len, 5613 tdata->cipher_iv.data, tdata->cipher_iv.len, 5614 NULL, 0, 5615 (tdata->digest.offset_bytes == 0 ? 5616 (verify ? ciphertext_pad_len : plaintext_pad_len) 5617 : tdata->digest.offset_bytes), 5618 tdata->validCipherLenInBits.len, 5619 tdata->validCipherOffsetInBits.len, 5620 tdata->validAuthLenInBits.len, 5621 0, 5622 op_mode, 1, verify); 5623 5624 if (retval < 0) 5625 return retval; 5626 5627 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5628 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5629 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5630 else 5631 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5632 ut_params->op); 5633 5634 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5635 5636 ut_params->obuf = (op_mode == IN_PLACE ? 5637 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5638 5639 if (verify) { 5640 if (ut_params->obuf) 5641 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5642 plaintext_len, buffer); 5643 else 5644 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5645 plaintext_len, buffer); 5646 5647 debug_hexdump(stdout, "plaintext:", plaintext, 5648 (tdata->plaintext.len >> 3) - tdata->digest.len); 5649 debug_hexdump(stdout, "plaintext expected:", 5650 tdata->plaintext.data, 5651 (tdata->plaintext.len >> 3) - tdata->digest.len); 5652 } else { 5653 if (ut_params->obuf) 5654 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5655 ciphertext_len, buffer); 5656 else 5657 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5658 ciphertext_len, buffer); 5659 5660 debug_hexdump(stdout, "ciphertext:", ciphertext, 5661 ciphertext_len); 5662 debug_hexdump(stdout, "ciphertext expected:", 5663 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5664 5665 if (ut_params->obuf) 5666 digest = rte_pktmbuf_read(ut_params->obuf, 5667 (tdata->digest.offset_bytes == 0 ? 5668 plaintext_pad_len : tdata->digest.offset_bytes), 5669 tdata->digest.len, digest_buffer); 5670 else 5671 digest = rte_pktmbuf_read(ut_params->ibuf, 5672 (tdata->digest.offset_bytes == 0 ? 5673 plaintext_pad_len : tdata->digest.offset_bytes), 5674 tdata->digest.len, digest_buffer); 5675 5676 debug_hexdump(stdout, "digest:", digest, 5677 tdata->digest.len); 5678 debug_hexdump(stdout, "digest expected:", 5679 tdata->digest.data, tdata->digest.len); 5680 } 5681 5682 /* Validate obuf */ 5683 if (verify) { 5684 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5685 plaintext, 5686 tdata->plaintext.data, 5687 tdata->plaintext.len >> 3, 5688 "KASUMI Plaintext data not as expected"); 5689 } else { 5690 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5691 ciphertext, 5692 tdata->ciphertext.data, 5693 tdata->validDataLenInBits.len, 5694 "KASUMI Ciphertext data not as expected"); 5695 5696 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5697 digest, 5698 tdata->digest.data, 5699 DIGEST_BYTE_LENGTH_KASUMI_F9, 5700 "KASUMI Generated auth tag not as expected"); 5701 } 5702 return 0; 5703 } 5704 5705 static int 5706 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5707 { 5708 struct crypto_testsuite_params *ts_params = &testsuite_params; 5709 struct crypto_unittest_params *ut_params = &unittest_params; 5710 5711 int retval; 5712 5713 uint8_t *plaintext, *ciphertext; 5714 unsigned plaintext_pad_len; 5715 unsigned plaintext_len; 5716 struct rte_cryptodev_info dev_info; 5717 5718 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5719 uint64_t feat_flags = dev_info.feature_flags; 5720 5721 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5722 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5723 printf("Device doesn't support RAW data-path APIs.\n"); 5724 return TEST_SKIPPED; 5725 } 5726 5727 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5728 return TEST_SKIPPED; 5729 5730 /* Verify the capabilities */ 5731 struct rte_cryptodev_sym_capability_idx cap_idx; 5732 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5733 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5734 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5735 &cap_idx) == NULL) 5736 return TEST_SKIPPED; 5737 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5738 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5739 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5740 &cap_idx) == NULL) 5741 return TEST_SKIPPED; 5742 5743 /* Create KASUMI session */ 5744 retval = create_wireless_algo_cipher_auth_session( 5745 ts_params->valid_devs[0], 5746 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5747 RTE_CRYPTO_AUTH_OP_GENERATE, 5748 RTE_CRYPTO_AUTH_KASUMI_F9, 5749 RTE_CRYPTO_CIPHER_KASUMI_F8, 5750 tdata->key.data, tdata->key.len, 5751 0, tdata->digest.len, 5752 tdata->cipher_iv.len); 5753 if (retval != 0) 5754 return retval; 5755 5756 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5757 5758 /* clear mbuf payload */ 5759 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5760 rte_pktmbuf_tailroom(ut_params->ibuf)); 5761 5762 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5763 /* Append data which is padded to a multiple of */ 5764 /* the algorithms block size */ 5765 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5766 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5767 plaintext_pad_len); 5768 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5769 5770 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5771 5772 /* Create KASUMI operation */ 5773 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5774 tdata->digest.len, NULL, 0, 5775 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5776 tdata->cipher_iv.data, tdata->cipher_iv.len, 5777 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5778 tdata->validCipherOffsetInBits.len, 5779 tdata->validAuthLenInBits.len, 5780 0 5781 ); 5782 if (retval < 0) 5783 return retval; 5784 5785 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5786 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5787 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5788 else 5789 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5790 ut_params->op); 5791 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5792 5793 if (ut_params->op->sym->m_dst) 5794 ut_params->obuf = ut_params->op->sym->m_dst; 5795 else 5796 ut_params->obuf = ut_params->op->sym->m_src; 5797 5798 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5799 tdata->validCipherOffsetInBits.len >> 3); 5800 5801 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5802 + plaintext_pad_len; 5803 5804 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5805 (tdata->validCipherOffsetInBits.len >> 3); 5806 /* Validate obuf */ 5807 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5808 ciphertext, 5809 reference_ciphertext, 5810 tdata->validCipherLenInBits.len, 5811 "KASUMI Ciphertext data not as expected"); 5812 5813 /* Validate obuf */ 5814 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5815 ut_params->digest, 5816 tdata->digest.data, 5817 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5818 "KASUMI Generated auth tag not as expected"); 5819 return 0; 5820 } 5821 5822 static int 5823 test_zuc_encryption(const struct wireless_test_data *tdata) 5824 { 5825 struct crypto_testsuite_params *ts_params = &testsuite_params; 5826 struct crypto_unittest_params *ut_params = &unittest_params; 5827 5828 int retval; 5829 uint8_t *plaintext, *ciphertext; 5830 unsigned plaintext_pad_len; 5831 unsigned plaintext_len; 5832 struct rte_cryptodev_info dev_info; 5833 5834 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5835 uint64_t feat_flags = dev_info.feature_flags; 5836 5837 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5838 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5839 printf("Device doesn't support RAW data-path APIs.\n"); 5840 return TEST_SKIPPED; 5841 } 5842 5843 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5844 return TEST_SKIPPED; 5845 5846 struct rte_cryptodev_sym_capability_idx cap_idx; 5847 5848 /* Check if device supports ZUC EEA3 */ 5849 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5850 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5851 5852 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5853 &cap_idx) == NULL) 5854 return TEST_SKIPPED; 5855 5856 /* Create ZUC session */ 5857 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5858 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5859 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5860 tdata->key.data, tdata->key.len, 5861 tdata->cipher_iv.len); 5862 if (retval < 0) 5863 return retval; 5864 5865 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5866 5867 /* Clear mbuf payload */ 5868 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5869 rte_pktmbuf_tailroom(ut_params->ibuf)); 5870 5871 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5872 /* Append data which is padded to a multiple */ 5873 /* of the algorithms block size */ 5874 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5875 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5876 plaintext_pad_len); 5877 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5878 5879 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5880 5881 /* Create ZUC operation */ 5882 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5883 tdata->cipher_iv.len, 5884 tdata->plaintext.len, 5885 0); 5886 if (retval < 0) 5887 return retval; 5888 5889 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5890 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5891 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5892 else 5893 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5894 ut_params->op); 5895 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5896 5897 ut_params->obuf = ut_params->op->sym->m_dst; 5898 if (ut_params->obuf) 5899 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 5900 else 5901 ciphertext = plaintext; 5902 5903 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5904 5905 /* Validate obuf */ 5906 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5907 ciphertext, 5908 tdata->ciphertext.data, 5909 tdata->validCipherLenInBits.len, 5910 "ZUC Ciphertext data not as expected"); 5911 return 0; 5912 } 5913 5914 static int 5915 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 5916 { 5917 struct crypto_testsuite_params *ts_params = &testsuite_params; 5918 struct crypto_unittest_params *ut_params = &unittest_params; 5919 5920 int retval; 5921 5922 unsigned int plaintext_pad_len; 5923 unsigned int plaintext_len; 5924 const uint8_t *ciphertext; 5925 uint8_t ciphertext_buffer[2048]; 5926 struct rte_cryptodev_info dev_info; 5927 5928 struct rte_cryptodev_sym_capability_idx cap_idx; 5929 5930 /* Check if device supports ZUC EEA3 */ 5931 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5932 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5933 5934 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5935 &cap_idx) == NULL) 5936 return TEST_SKIPPED; 5937 5938 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5939 return TEST_SKIPPED; 5940 5941 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5942 5943 uint64_t feat_flags = dev_info.feature_flags; 5944 5945 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5946 printf("Device doesn't support in-place scatter-gather. " 5947 "Test Skipped.\n"); 5948 return TEST_SKIPPED; 5949 } 5950 5951 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5952 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5953 printf("Device doesn't support RAW data-path APIs.\n"); 5954 return TEST_SKIPPED; 5955 } 5956 5957 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5958 5959 /* Append data which is padded to a multiple */ 5960 /* of the algorithms block size */ 5961 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5962 5963 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5964 plaintext_pad_len, 10, 0); 5965 5966 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5967 tdata->plaintext.data); 5968 5969 /* Create ZUC session */ 5970 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5971 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5972 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5973 tdata->key.data, tdata->key.len, 5974 tdata->cipher_iv.len); 5975 if (retval < 0) 5976 return retval; 5977 5978 /* Clear mbuf payload */ 5979 5980 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 5981 5982 /* Create ZUC operation */ 5983 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5984 tdata->cipher_iv.len, tdata->plaintext.len, 5985 0); 5986 if (retval < 0) 5987 return retval; 5988 5989 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5990 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5991 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5992 else 5993 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5994 ut_params->op); 5995 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5996 5997 ut_params->obuf = ut_params->op->sym->m_dst; 5998 if (ut_params->obuf) 5999 ciphertext = rte_pktmbuf_read(ut_params->obuf, 6000 0, plaintext_len, ciphertext_buffer); 6001 else 6002 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 6003 0, plaintext_len, ciphertext_buffer); 6004 6005 /* Validate obuf */ 6006 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 6007 6008 /* Validate obuf */ 6009 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6010 ciphertext, 6011 tdata->ciphertext.data, 6012 tdata->validCipherLenInBits.len, 6013 "ZUC Ciphertext data not as expected"); 6014 6015 return 0; 6016 } 6017 6018 static int 6019 test_zuc_authentication(const struct wireless_test_data *tdata) 6020 { 6021 struct crypto_testsuite_params *ts_params = &testsuite_params; 6022 struct crypto_unittest_params *ut_params = &unittest_params; 6023 6024 int retval; 6025 unsigned plaintext_pad_len; 6026 unsigned plaintext_len; 6027 uint8_t *plaintext; 6028 6029 struct rte_cryptodev_sym_capability_idx cap_idx; 6030 struct rte_cryptodev_info dev_info; 6031 6032 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6033 uint64_t feat_flags = dev_info.feature_flags; 6034 6035 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 6036 (tdata->validAuthLenInBits.len % 8 != 0)) { 6037 printf("Device doesn't support NON-Byte Aligned Data.\n"); 6038 return TEST_SKIPPED; 6039 } 6040 6041 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6042 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6043 printf("Device doesn't support RAW data-path APIs.\n"); 6044 return TEST_SKIPPED; 6045 } 6046 6047 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 6048 return TEST_SKIPPED; 6049 6050 /* Check if device supports ZUC EIA3 */ 6051 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6052 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6053 6054 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6055 &cap_idx) == NULL) 6056 return TEST_SKIPPED; 6057 6058 /* Create ZUC session */ 6059 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 6060 tdata->key.data, tdata->key.len, 6061 tdata->auth_iv.len, tdata->digest.len, 6062 RTE_CRYPTO_AUTH_OP_GENERATE, 6063 RTE_CRYPTO_AUTH_ZUC_EIA3); 6064 if (retval < 0) 6065 return retval; 6066 6067 /* alloc mbuf and set payload */ 6068 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6069 6070 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6071 rte_pktmbuf_tailroom(ut_params->ibuf)); 6072 6073 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6074 /* Append data which is padded to a multiple of */ 6075 /* the algorithms block size */ 6076 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6077 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6078 plaintext_pad_len); 6079 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6080 6081 /* Create ZUC operation */ 6082 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 6083 tdata->auth_iv.data, tdata->auth_iv.len, 6084 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 6085 tdata->validAuthLenInBits.len, 6086 0); 6087 if (retval < 0) 6088 return retval; 6089 6090 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6091 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6092 ut_params->op, 0, 1, 1, 0); 6093 else 6094 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6095 ut_params->op); 6096 ut_params->obuf = ut_params->op->sym->m_src; 6097 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6098 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6099 + plaintext_pad_len; 6100 6101 /* Validate obuf */ 6102 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6103 ut_params->digest, 6104 tdata->digest.data, 6105 tdata->digest.len, 6106 "ZUC Generated auth tag not as expected"); 6107 6108 return 0; 6109 } 6110 6111 static int 6112 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 6113 uint8_t op_mode, uint8_t verify) 6114 { 6115 struct crypto_testsuite_params *ts_params = &testsuite_params; 6116 struct crypto_unittest_params *ut_params = &unittest_params; 6117 6118 int retval; 6119 6120 uint8_t *plaintext = NULL, *ciphertext = NULL; 6121 unsigned int plaintext_pad_len; 6122 unsigned int plaintext_len; 6123 unsigned int ciphertext_pad_len; 6124 unsigned int ciphertext_len; 6125 6126 struct rte_cryptodev_info dev_info; 6127 struct rte_cryptodev_sym_capability_idx cap_idx; 6128 6129 /* Check if device supports ZUC EIA3 */ 6130 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6131 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6132 6133 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6134 &cap_idx) == NULL) 6135 return TEST_SKIPPED; 6136 6137 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6138 6139 uint64_t feat_flags = dev_info.feature_flags; 6140 6141 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6142 printf("Device doesn't support digest encrypted.\n"); 6143 return TEST_SKIPPED; 6144 } 6145 if (op_mode == IN_PLACE) { 6146 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6147 printf("Device doesn't support in-place scatter-gather " 6148 "in both input and output mbufs.\n"); 6149 return TEST_SKIPPED; 6150 } 6151 6152 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6153 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6154 printf("Device doesn't support RAW data-path APIs.\n"); 6155 return TEST_SKIPPED; 6156 } 6157 } else { 6158 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6159 return TEST_SKIPPED; 6160 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6161 printf("Device doesn't support out-of-place scatter-gather " 6162 "in both input and output mbufs.\n"); 6163 return TEST_SKIPPED; 6164 } 6165 } 6166 6167 /* Create ZUC session */ 6168 retval = create_wireless_algo_auth_cipher_session( 6169 ts_params->valid_devs[0], 6170 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6171 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6172 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6173 : RTE_CRYPTO_AUTH_OP_GENERATE), 6174 RTE_CRYPTO_AUTH_ZUC_EIA3, 6175 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6176 tdata->key.data, tdata->key.len, 6177 tdata->auth_iv.len, tdata->digest.len, 6178 tdata->cipher_iv.len); 6179 6180 if (retval != 0) 6181 return retval; 6182 6183 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6184 if (op_mode == OUT_OF_PLACE) 6185 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6186 6187 /* clear mbuf payload */ 6188 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6189 rte_pktmbuf_tailroom(ut_params->ibuf)); 6190 if (op_mode == OUT_OF_PLACE) 6191 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6192 rte_pktmbuf_tailroom(ut_params->obuf)); 6193 6194 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6195 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6196 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6197 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6198 6199 if (verify) { 6200 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6201 ciphertext_pad_len); 6202 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6203 if (op_mode == OUT_OF_PLACE) 6204 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6205 debug_hexdump(stdout, "ciphertext:", ciphertext, 6206 ciphertext_len); 6207 } else { 6208 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6209 plaintext_pad_len); 6210 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6211 if (op_mode == OUT_OF_PLACE) 6212 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 6213 debug_hexdump(stdout, "plaintext:", plaintext, 6214 plaintext_len); 6215 } 6216 6217 /* Create ZUC operation */ 6218 retval = create_wireless_algo_auth_cipher_operation( 6219 tdata->digest.data, tdata->digest.len, 6220 tdata->cipher_iv.data, tdata->cipher_iv.len, 6221 tdata->auth_iv.data, tdata->auth_iv.len, 6222 (tdata->digest.offset_bytes == 0 ? 6223 (verify ? ciphertext_pad_len : plaintext_pad_len) 6224 : tdata->digest.offset_bytes), 6225 tdata->validCipherLenInBits.len, 6226 tdata->validCipherOffsetInBits.len, 6227 tdata->validAuthLenInBits.len, 6228 0, 6229 op_mode, 0, verify); 6230 6231 if (retval < 0) 6232 return retval; 6233 6234 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6235 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6236 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6237 else 6238 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6239 ut_params->op); 6240 6241 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6242 6243 ut_params->obuf = (op_mode == IN_PLACE ? 6244 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6245 6246 6247 if (verify) { 6248 if (ut_params->obuf) 6249 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6250 uint8_t *); 6251 else 6252 plaintext = ciphertext; 6253 6254 debug_hexdump(stdout, "plaintext:", plaintext, 6255 (tdata->plaintext.len >> 3) - tdata->digest.len); 6256 debug_hexdump(stdout, "plaintext expected:", 6257 tdata->plaintext.data, 6258 (tdata->plaintext.len >> 3) - tdata->digest.len); 6259 } else { 6260 if (ut_params->obuf) 6261 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6262 uint8_t *); 6263 else 6264 ciphertext = plaintext; 6265 6266 debug_hexdump(stdout, "ciphertext:", ciphertext, 6267 ciphertext_len); 6268 debug_hexdump(stdout, "ciphertext expected:", 6269 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6270 6271 ut_params->digest = rte_pktmbuf_mtod( 6272 ut_params->obuf, uint8_t *) + 6273 (tdata->digest.offset_bytes == 0 ? 6274 plaintext_pad_len : tdata->digest.offset_bytes); 6275 6276 debug_hexdump(stdout, "digest:", ut_params->digest, 6277 tdata->digest.len); 6278 debug_hexdump(stdout, "digest expected:", 6279 tdata->digest.data, tdata->digest.len); 6280 } 6281 6282 /* Validate obuf */ 6283 if (verify) { 6284 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6285 plaintext, 6286 tdata->plaintext.data, 6287 tdata->plaintext.len >> 3, 6288 "ZUC Plaintext data not as expected"); 6289 } else { 6290 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6291 ciphertext, 6292 tdata->ciphertext.data, 6293 tdata->ciphertext.len >> 3, 6294 "ZUC Ciphertext data not as expected"); 6295 6296 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6297 ut_params->digest, 6298 tdata->digest.data, 6299 DIGEST_BYTE_LENGTH_KASUMI_F9, 6300 "ZUC Generated auth tag not as expected"); 6301 } 6302 return 0; 6303 } 6304 6305 static int 6306 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 6307 uint8_t op_mode, uint8_t verify) 6308 { 6309 struct crypto_testsuite_params *ts_params = &testsuite_params; 6310 struct crypto_unittest_params *ut_params = &unittest_params; 6311 6312 int retval; 6313 6314 const uint8_t *plaintext = NULL; 6315 const uint8_t *ciphertext = NULL; 6316 const uint8_t *digest = NULL; 6317 unsigned int plaintext_pad_len; 6318 unsigned int plaintext_len; 6319 unsigned int ciphertext_pad_len; 6320 unsigned int ciphertext_len; 6321 uint8_t buffer[10000]; 6322 uint8_t digest_buffer[10000]; 6323 6324 struct rte_cryptodev_info dev_info; 6325 struct rte_cryptodev_sym_capability_idx cap_idx; 6326 6327 /* Check if device supports ZUC EIA3 */ 6328 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6329 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6330 6331 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6332 &cap_idx) == NULL) 6333 return TEST_SKIPPED; 6334 6335 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6336 6337 uint64_t feat_flags = dev_info.feature_flags; 6338 6339 if (op_mode == IN_PLACE) { 6340 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6341 printf("Device doesn't support in-place scatter-gather " 6342 "in both input and output mbufs.\n"); 6343 return TEST_SKIPPED; 6344 } 6345 6346 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6347 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6348 printf("Device doesn't support RAW data-path APIs.\n"); 6349 return TEST_SKIPPED; 6350 } 6351 } else { 6352 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6353 return TEST_SKIPPED; 6354 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6355 printf("Device doesn't support out-of-place scatter-gather " 6356 "in both input and output mbufs.\n"); 6357 return TEST_SKIPPED; 6358 } 6359 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6360 printf("Device doesn't support digest encrypted.\n"); 6361 return TEST_SKIPPED; 6362 } 6363 } 6364 6365 /* Create ZUC session */ 6366 retval = create_wireless_algo_auth_cipher_session( 6367 ts_params->valid_devs[0], 6368 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6369 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6370 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6371 : RTE_CRYPTO_AUTH_OP_GENERATE), 6372 RTE_CRYPTO_AUTH_ZUC_EIA3, 6373 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6374 tdata->key.data, tdata->key.len, 6375 tdata->auth_iv.len, tdata->digest.len, 6376 tdata->cipher_iv.len); 6377 6378 if (retval != 0) 6379 return retval; 6380 6381 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6382 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6383 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6384 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6385 6386 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6387 plaintext_pad_len, 15, 0); 6388 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6389 "Failed to allocate input buffer in mempool"); 6390 6391 if (op_mode == OUT_OF_PLACE) { 6392 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6393 plaintext_pad_len, 15, 0); 6394 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6395 "Failed to allocate output buffer in mempool"); 6396 } 6397 6398 if (verify) { 6399 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6400 tdata->ciphertext.data); 6401 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6402 ciphertext_len, buffer); 6403 debug_hexdump(stdout, "ciphertext:", ciphertext, 6404 ciphertext_len); 6405 } else { 6406 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6407 tdata->plaintext.data); 6408 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6409 plaintext_len, buffer); 6410 debug_hexdump(stdout, "plaintext:", plaintext, 6411 plaintext_len); 6412 } 6413 memset(buffer, 0, sizeof(buffer)); 6414 6415 /* Create ZUC operation */ 6416 retval = create_wireless_algo_auth_cipher_operation( 6417 tdata->digest.data, tdata->digest.len, 6418 tdata->cipher_iv.data, tdata->cipher_iv.len, 6419 NULL, 0, 6420 (tdata->digest.offset_bytes == 0 ? 6421 (verify ? ciphertext_pad_len : plaintext_pad_len) 6422 : tdata->digest.offset_bytes), 6423 tdata->validCipherLenInBits.len, 6424 tdata->validCipherOffsetInBits.len, 6425 tdata->validAuthLenInBits.len, 6426 0, 6427 op_mode, 1, verify); 6428 6429 if (retval < 0) 6430 return retval; 6431 6432 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6433 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6434 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6435 else 6436 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6437 ut_params->op); 6438 6439 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6440 6441 ut_params->obuf = (op_mode == IN_PLACE ? 6442 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6443 6444 if (verify) { 6445 if (ut_params->obuf) 6446 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6447 plaintext_len, buffer); 6448 else 6449 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6450 plaintext_len, buffer); 6451 6452 debug_hexdump(stdout, "plaintext:", plaintext, 6453 (tdata->plaintext.len >> 3) - tdata->digest.len); 6454 debug_hexdump(stdout, "plaintext expected:", 6455 tdata->plaintext.data, 6456 (tdata->plaintext.len >> 3) - tdata->digest.len); 6457 } else { 6458 if (ut_params->obuf) 6459 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6460 ciphertext_len, buffer); 6461 else 6462 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6463 ciphertext_len, buffer); 6464 6465 debug_hexdump(stdout, "ciphertext:", ciphertext, 6466 ciphertext_len); 6467 debug_hexdump(stdout, "ciphertext expected:", 6468 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6469 6470 if (ut_params->obuf) 6471 digest = rte_pktmbuf_read(ut_params->obuf, 6472 (tdata->digest.offset_bytes == 0 ? 6473 plaintext_pad_len : tdata->digest.offset_bytes), 6474 tdata->digest.len, digest_buffer); 6475 else 6476 digest = rte_pktmbuf_read(ut_params->ibuf, 6477 (tdata->digest.offset_bytes == 0 ? 6478 plaintext_pad_len : tdata->digest.offset_bytes), 6479 tdata->digest.len, digest_buffer); 6480 6481 debug_hexdump(stdout, "digest:", digest, 6482 tdata->digest.len); 6483 debug_hexdump(stdout, "digest expected:", 6484 tdata->digest.data, tdata->digest.len); 6485 } 6486 6487 /* Validate obuf */ 6488 if (verify) { 6489 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6490 plaintext, 6491 tdata->plaintext.data, 6492 tdata->plaintext.len >> 3, 6493 "ZUC Plaintext data not as expected"); 6494 } else { 6495 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6496 ciphertext, 6497 tdata->ciphertext.data, 6498 tdata->validDataLenInBits.len, 6499 "ZUC Ciphertext data not as expected"); 6500 6501 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6502 digest, 6503 tdata->digest.data, 6504 DIGEST_BYTE_LENGTH_KASUMI_F9, 6505 "ZUC Generated auth tag not as expected"); 6506 } 6507 return 0; 6508 } 6509 6510 static int 6511 test_kasumi_encryption_test_case_1(void) 6512 { 6513 return test_kasumi_encryption(&kasumi_test_case_1); 6514 } 6515 6516 static int 6517 test_kasumi_encryption_test_case_1_sgl(void) 6518 { 6519 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6520 } 6521 6522 static int 6523 test_kasumi_encryption_test_case_1_oop(void) 6524 { 6525 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6526 } 6527 6528 static int 6529 test_kasumi_encryption_test_case_1_oop_sgl(void) 6530 { 6531 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6532 } 6533 6534 static int 6535 test_kasumi_encryption_test_case_2(void) 6536 { 6537 return test_kasumi_encryption(&kasumi_test_case_2); 6538 } 6539 6540 static int 6541 test_kasumi_encryption_test_case_3(void) 6542 { 6543 return test_kasumi_encryption(&kasumi_test_case_3); 6544 } 6545 6546 static int 6547 test_kasumi_encryption_test_case_4(void) 6548 { 6549 return test_kasumi_encryption(&kasumi_test_case_4); 6550 } 6551 6552 static int 6553 test_kasumi_encryption_test_case_5(void) 6554 { 6555 return test_kasumi_encryption(&kasumi_test_case_5); 6556 } 6557 6558 static int 6559 test_kasumi_decryption_test_case_1(void) 6560 { 6561 return test_kasumi_decryption(&kasumi_test_case_1); 6562 } 6563 6564 static int 6565 test_kasumi_decryption_test_case_1_oop(void) 6566 { 6567 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6568 } 6569 6570 static int 6571 test_kasumi_decryption_test_case_2(void) 6572 { 6573 return test_kasumi_decryption(&kasumi_test_case_2); 6574 } 6575 6576 static int 6577 test_kasumi_decryption_test_case_3(void) 6578 { 6579 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6580 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6581 return TEST_SKIPPED; 6582 return test_kasumi_decryption(&kasumi_test_case_3); 6583 } 6584 6585 static int 6586 test_kasumi_decryption_test_case_4(void) 6587 { 6588 return test_kasumi_decryption(&kasumi_test_case_4); 6589 } 6590 6591 static int 6592 test_kasumi_decryption_test_case_5(void) 6593 { 6594 return test_kasumi_decryption(&kasumi_test_case_5); 6595 } 6596 static int 6597 test_snow3g_encryption_test_case_1(void) 6598 { 6599 return test_snow3g_encryption(&snow3g_test_case_1); 6600 } 6601 6602 static int 6603 test_snow3g_encryption_test_case_1_oop(void) 6604 { 6605 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6606 } 6607 6608 static int 6609 test_snow3g_encryption_test_case_1_oop_sgl(void) 6610 { 6611 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 6612 } 6613 6614 6615 static int 6616 test_snow3g_encryption_test_case_1_offset_oop(void) 6617 { 6618 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6619 } 6620 6621 static int 6622 test_snow3g_encryption_test_case_2(void) 6623 { 6624 return test_snow3g_encryption(&snow3g_test_case_2); 6625 } 6626 6627 static int 6628 test_snow3g_encryption_test_case_3(void) 6629 { 6630 return test_snow3g_encryption(&snow3g_test_case_3); 6631 } 6632 6633 static int 6634 test_snow3g_encryption_test_case_4(void) 6635 { 6636 return test_snow3g_encryption(&snow3g_test_case_4); 6637 } 6638 6639 static int 6640 test_snow3g_encryption_test_case_5(void) 6641 { 6642 return test_snow3g_encryption(&snow3g_test_case_5); 6643 } 6644 6645 static int 6646 test_snow3g_decryption_test_case_1(void) 6647 { 6648 return test_snow3g_decryption(&snow3g_test_case_1); 6649 } 6650 6651 static int 6652 test_snow3g_decryption_test_case_1_oop(void) 6653 { 6654 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6655 } 6656 6657 static int 6658 test_snow3g_decryption_test_case_2(void) 6659 { 6660 return test_snow3g_decryption(&snow3g_test_case_2); 6661 } 6662 6663 static int 6664 test_snow3g_decryption_test_case_3(void) 6665 { 6666 return test_snow3g_decryption(&snow3g_test_case_3); 6667 } 6668 6669 static int 6670 test_snow3g_decryption_test_case_4(void) 6671 { 6672 return test_snow3g_decryption(&snow3g_test_case_4); 6673 } 6674 6675 static int 6676 test_snow3g_decryption_test_case_5(void) 6677 { 6678 return test_snow3g_decryption(&snow3g_test_case_5); 6679 } 6680 6681 /* 6682 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6683 * Pattern digest from snow3g_test_data must be allocated as 6684 * 4 last bytes in plaintext. 6685 */ 6686 static void 6687 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6688 struct snow3g_hash_test_data *output) 6689 { 6690 if ((pattern != NULL) && (output != NULL)) { 6691 output->key.len = pattern->key.len; 6692 6693 memcpy(output->key.data, 6694 pattern->key.data, pattern->key.len); 6695 6696 output->auth_iv.len = pattern->auth_iv.len; 6697 6698 memcpy(output->auth_iv.data, 6699 pattern->auth_iv.data, pattern->auth_iv.len); 6700 6701 output->plaintext.len = pattern->plaintext.len; 6702 6703 memcpy(output->plaintext.data, 6704 pattern->plaintext.data, pattern->plaintext.len >> 3); 6705 6706 output->digest.len = pattern->digest.len; 6707 6708 memcpy(output->digest.data, 6709 &pattern->plaintext.data[pattern->digest.offset_bytes], 6710 pattern->digest.len); 6711 6712 output->validAuthLenInBits.len = 6713 pattern->validAuthLenInBits.len; 6714 } 6715 } 6716 6717 /* 6718 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6719 */ 6720 static int 6721 test_snow3g_decryption_with_digest_test_case_1(void) 6722 { 6723 struct snow3g_hash_test_data snow3g_hash_data; 6724 struct rte_cryptodev_info dev_info; 6725 struct crypto_testsuite_params *ts_params = &testsuite_params; 6726 6727 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6728 uint64_t feat_flags = dev_info.feature_flags; 6729 6730 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6731 printf("Device doesn't support encrypted digest operations.\n"); 6732 return TEST_SKIPPED; 6733 } 6734 6735 /* 6736 * Function prepare data for hash veryfication test case. 6737 * Digest is allocated in 4 last bytes in plaintext, pattern. 6738 */ 6739 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6740 6741 return test_snow3g_decryption(&snow3g_test_case_7) & 6742 test_snow3g_authentication_verify(&snow3g_hash_data); 6743 } 6744 6745 static int 6746 test_snow3g_cipher_auth_test_case_1(void) 6747 { 6748 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6749 } 6750 6751 static int 6752 test_snow3g_auth_cipher_test_case_1(void) 6753 { 6754 return test_snow3g_auth_cipher( 6755 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6756 } 6757 6758 static int 6759 test_snow3g_auth_cipher_test_case_2(void) 6760 { 6761 return test_snow3g_auth_cipher( 6762 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6763 } 6764 6765 static int 6766 test_snow3g_auth_cipher_test_case_2_oop(void) 6767 { 6768 return test_snow3g_auth_cipher( 6769 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6770 } 6771 6772 static int 6773 test_snow3g_auth_cipher_part_digest_enc(void) 6774 { 6775 return test_snow3g_auth_cipher( 6776 &snow3g_auth_cipher_partial_digest_encryption, 6777 IN_PLACE, 0); 6778 } 6779 6780 static int 6781 test_snow3g_auth_cipher_part_digest_enc_oop(void) 6782 { 6783 return test_snow3g_auth_cipher( 6784 &snow3g_auth_cipher_partial_digest_encryption, 6785 OUT_OF_PLACE, 0); 6786 } 6787 6788 static int 6789 test_snow3g_auth_cipher_test_case_3_sgl(void) 6790 { 6791 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6792 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6793 return TEST_SKIPPED; 6794 return test_snow3g_auth_cipher_sgl( 6795 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 6796 } 6797 6798 static int 6799 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 6800 { 6801 return test_snow3g_auth_cipher_sgl( 6802 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 6803 } 6804 6805 static int 6806 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 6807 { 6808 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6809 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6810 return TEST_SKIPPED; 6811 return test_snow3g_auth_cipher_sgl( 6812 &snow3g_auth_cipher_partial_digest_encryption, 6813 IN_PLACE, 0); 6814 } 6815 6816 static int 6817 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 6818 { 6819 return test_snow3g_auth_cipher_sgl( 6820 &snow3g_auth_cipher_partial_digest_encryption, 6821 OUT_OF_PLACE, 0); 6822 } 6823 6824 static int 6825 test_snow3g_auth_cipher_verify_test_case_1(void) 6826 { 6827 return test_snow3g_auth_cipher( 6828 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 6829 } 6830 6831 static int 6832 test_snow3g_auth_cipher_verify_test_case_2(void) 6833 { 6834 return test_snow3g_auth_cipher( 6835 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 6836 } 6837 6838 static int 6839 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 6840 { 6841 return test_snow3g_auth_cipher( 6842 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6843 } 6844 6845 static int 6846 test_snow3g_auth_cipher_verify_part_digest_enc(void) 6847 { 6848 return test_snow3g_auth_cipher( 6849 &snow3g_auth_cipher_partial_digest_encryption, 6850 IN_PLACE, 1); 6851 } 6852 6853 static int 6854 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 6855 { 6856 return test_snow3g_auth_cipher( 6857 &snow3g_auth_cipher_partial_digest_encryption, 6858 OUT_OF_PLACE, 1); 6859 } 6860 6861 static int 6862 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 6863 { 6864 return test_snow3g_auth_cipher_sgl( 6865 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 6866 } 6867 6868 static int 6869 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 6870 { 6871 return test_snow3g_auth_cipher_sgl( 6872 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 6873 } 6874 6875 static int 6876 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 6877 { 6878 return test_snow3g_auth_cipher_sgl( 6879 &snow3g_auth_cipher_partial_digest_encryption, 6880 IN_PLACE, 1); 6881 } 6882 6883 static int 6884 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 6885 { 6886 return test_snow3g_auth_cipher_sgl( 6887 &snow3g_auth_cipher_partial_digest_encryption, 6888 OUT_OF_PLACE, 1); 6889 } 6890 6891 static int 6892 test_snow3g_auth_cipher_with_digest_test_case_1(void) 6893 { 6894 return test_snow3g_auth_cipher( 6895 &snow3g_test_case_7, IN_PLACE, 0); 6896 } 6897 6898 static int 6899 test_kasumi_auth_cipher_test_case_1(void) 6900 { 6901 return test_kasumi_auth_cipher( 6902 &kasumi_test_case_3, IN_PLACE, 0); 6903 } 6904 6905 static int 6906 test_kasumi_auth_cipher_test_case_2(void) 6907 { 6908 return test_kasumi_auth_cipher( 6909 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6910 } 6911 6912 static int 6913 test_kasumi_auth_cipher_test_case_2_oop(void) 6914 { 6915 return test_kasumi_auth_cipher( 6916 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6917 } 6918 6919 static int 6920 test_kasumi_auth_cipher_test_case_2_sgl(void) 6921 { 6922 return test_kasumi_auth_cipher_sgl( 6923 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6924 } 6925 6926 static int 6927 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 6928 { 6929 return test_kasumi_auth_cipher_sgl( 6930 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6931 } 6932 6933 static int 6934 test_kasumi_auth_cipher_verify_test_case_1(void) 6935 { 6936 return test_kasumi_auth_cipher( 6937 &kasumi_test_case_3, IN_PLACE, 1); 6938 } 6939 6940 static int 6941 test_kasumi_auth_cipher_verify_test_case_2(void) 6942 { 6943 return test_kasumi_auth_cipher( 6944 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6945 } 6946 6947 static int 6948 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 6949 { 6950 return test_kasumi_auth_cipher( 6951 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6952 } 6953 6954 static int 6955 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 6956 { 6957 return test_kasumi_auth_cipher_sgl( 6958 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6959 } 6960 6961 static int 6962 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 6963 { 6964 return test_kasumi_auth_cipher_sgl( 6965 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6966 } 6967 6968 static int 6969 test_kasumi_cipher_auth_test_case_1(void) 6970 { 6971 return test_kasumi_cipher_auth(&kasumi_test_case_6); 6972 } 6973 6974 static int 6975 test_zuc_encryption_test_case_1(void) 6976 { 6977 return test_zuc_encryption(&zuc_test_case_cipher_193b); 6978 } 6979 6980 static int 6981 test_zuc_encryption_test_case_2(void) 6982 { 6983 return test_zuc_encryption(&zuc_test_case_cipher_800b); 6984 } 6985 6986 static int 6987 test_zuc_encryption_test_case_3(void) 6988 { 6989 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 6990 } 6991 6992 static int 6993 test_zuc_encryption_test_case_4(void) 6994 { 6995 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 6996 } 6997 6998 static int 6999 test_zuc_encryption_test_case_5(void) 7000 { 7001 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 7002 } 7003 7004 static int 7005 test_zuc_encryption_test_case_6_sgl(void) 7006 { 7007 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 7008 } 7009 7010 static int 7011 test_zuc_hash_generate_test_case_1(void) 7012 { 7013 return test_zuc_authentication(&zuc_test_case_auth_1b); 7014 } 7015 7016 static int 7017 test_zuc_hash_generate_test_case_2(void) 7018 { 7019 return test_zuc_authentication(&zuc_test_case_auth_90b); 7020 } 7021 7022 static int 7023 test_zuc_hash_generate_test_case_3(void) 7024 { 7025 return test_zuc_authentication(&zuc_test_case_auth_577b); 7026 } 7027 7028 static int 7029 test_zuc_hash_generate_test_case_4(void) 7030 { 7031 return test_zuc_authentication(&zuc_test_case_auth_2079b); 7032 } 7033 7034 static int 7035 test_zuc_hash_generate_test_case_5(void) 7036 { 7037 return test_zuc_authentication(&zuc_test_auth_5670b); 7038 } 7039 7040 static int 7041 test_zuc_hash_generate_test_case_6(void) 7042 { 7043 return test_zuc_authentication(&zuc_test_case_auth_128b); 7044 } 7045 7046 static int 7047 test_zuc_hash_generate_test_case_7(void) 7048 { 7049 return test_zuc_authentication(&zuc_test_case_auth_2080b); 7050 } 7051 7052 static int 7053 test_zuc_hash_generate_test_case_8(void) 7054 { 7055 return test_zuc_authentication(&zuc_test_case_auth_584b); 7056 } 7057 7058 static int 7059 test_zuc_cipher_auth_test_case_1(void) 7060 { 7061 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 7062 } 7063 7064 static int 7065 test_zuc_cipher_auth_test_case_2(void) 7066 { 7067 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 7068 } 7069 7070 static int 7071 test_zuc_auth_cipher_test_case_1(void) 7072 { 7073 return test_zuc_auth_cipher( 7074 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7075 } 7076 7077 static int 7078 test_zuc_auth_cipher_test_case_1_oop(void) 7079 { 7080 return test_zuc_auth_cipher( 7081 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7082 } 7083 7084 static int 7085 test_zuc_auth_cipher_test_case_1_sgl(void) 7086 { 7087 return test_zuc_auth_cipher_sgl( 7088 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7089 } 7090 7091 static int 7092 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 7093 { 7094 return test_zuc_auth_cipher_sgl( 7095 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7096 } 7097 7098 static int 7099 test_zuc_auth_cipher_verify_test_case_1(void) 7100 { 7101 return test_zuc_auth_cipher( 7102 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7103 } 7104 7105 static int 7106 test_zuc_auth_cipher_verify_test_case_1_oop(void) 7107 { 7108 return test_zuc_auth_cipher( 7109 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7110 } 7111 7112 static int 7113 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 7114 { 7115 return test_zuc_auth_cipher_sgl( 7116 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7117 } 7118 7119 static int 7120 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 7121 { 7122 return test_zuc_auth_cipher_sgl( 7123 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7124 } 7125 7126 static int 7127 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 7128 { 7129 uint8_t dev_id = testsuite_params.valid_devs[0]; 7130 7131 struct rte_cryptodev_sym_capability_idx cap_idx; 7132 7133 /* Check if device supports particular cipher algorithm */ 7134 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7135 cap_idx.algo.cipher = tdata->cipher_algo; 7136 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7137 return TEST_SKIPPED; 7138 7139 /* Check if device supports particular hash algorithm */ 7140 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7141 cap_idx.algo.auth = tdata->auth_algo; 7142 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7143 return TEST_SKIPPED; 7144 7145 return 0; 7146 } 7147 7148 static int 7149 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 7150 uint8_t op_mode, uint8_t verify) 7151 { 7152 struct crypto_testsuite_params *ts_params = &testsuite_params; 7153 struct crypto_unittest_params *ut_params = &unittest_params; 7154 7155 int retval; 7156 7157 uint8_t *plaintext = NULL, *ciphertext = NULL; 7158 unsigned int plaintext_pad_len; 7159 unsigned int plaintext_len; 7160 unsigned int ciphertext_pad_len; 7161 unsigned int ciphertext_len; 7162 7163 struct rte_cryptodev_info dev_info; 7164 struct rte_crypto_op *op; 7165 7166 /* Check if device supports particular algorithms separately */ 7167 if (test_mixed_check_if_unsupported(tdata)) 7168 return TEST_SKIPPED; 7169 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7170 return TEST_SKIPPED; 7171 7172 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7173 7174 uint64_t feat_flags = dev_info.feature_flags; 7175 7176 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7177 printf("Device doesn't support digest encrypted.\n"); 7178 return TEST_SKIPPED; 7179 } 7180 7181 /* Create the session */ 7182 if (verify) 7183 retval = create_wireless_algo_cipher_auth_session( 7184 ts_params->valid_devs[0], 7185 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7186 RTE_CRYPTO_AUTH_OP_VERIFY, 7187 tdata->auth_algo, 7188 tdata->cipher_algo, 7189 tdata->auth_key.data, tdata->auth_key.len, 7190 tdata->auth_iv.len, tdata->digest_enc.len, 7191 tdata->cipher_iv.len); 7192 else 7193 retval = create_wireless_algo_auth_cipher_session( 7194 ts_params->valid_devs[0], 7195 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7196 RTE_CRYPTO_AUTH_OP_GENERATE, 7197 tdata->auth_algo, 7198 tdata->cipher_algo, 7199 tdata->auth_key.data, tdata->auth_key.len, 7200 tdata->auth_iv.len, tdata->digest_enc.len, 7201 tdata->cipher_iv.len); 7202 if (retval != 0) 7203 return retval; 7204 7205 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7206 if (op_mode == OUT_OF_PLACE) 7207 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7208 7209 /* clear mbuf payload */ 7210 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7211 rte_pktmbuf_tailroom(ut_params->ibuf)); 7212 if (op_mode == OUT_OF_PLACE) { 7213 7214 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 7215 rte_pktmbuf_tailroom(ut_params->obuf)); 7216 } 7217 7218 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7219 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7220 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7221 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7222 7223 if (verify) { 7224 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7225 ciphertext_pad_len); 7226 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 7227 if (op_mode == OUT_OF_PLACE) 7228 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 7229 debug_hexdump(stdout, "ciphertext:", ciphertext, 7230 ciphertext_len); 7231 } else { 7232 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7233 plaintext_pad_len); 7234 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 7235 if (op_mode == OUT_OF_PLACE) 7236 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 7237 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 7238 } 7239 7240 /* Create the operation */ 7241 retval = create_wireless_algo_auth_cipher_operation( 7242 tdata->digest_enc.data, tdata->digest_enc.len, 7243 tdata->cipher_iv.data, tdata->cipher_iv.len, 7244 tdata->auth_iv.data, tdata->auth_iv.len, 7245 (tdata->digest_enc.offset == 0 ? 7246 plaintext_pad_len 7247 : tdata->digest_enc.offset), 7248 tdata->validCipherLen.len_bits, 7249 tdata->cipher.offset_bits, 7250 tdata->validAuthLen.len_bits, 7251 tdata->auth.offset_bits, 7252 op_mode, 0, verify); 7253 7254 if (retval < 0) 7255 return retval; 7256 7257 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7258 7259 /* Check if the op failed because the device doesn't */ 7260 /* support this particular combination of algorithms */ 7261 if (op == NULL && ut_params->op->status == 7262 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7263 printf("Device doesn't support this mixed combination. " 7264 "Test Skipped.\n"); 7265 return TEST_SKIPPED; 7266 } 7267 ut_params->op = op; 7268 7269 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7270 7271 ut_params->obuf = (op_mode == IN_PLACE ? 7272 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7273 7274 if (verify) { 7275 if (ut_params->obuf) 7276 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 7277 uint8_t *); 7278 else 7279 plaintext = ciphertext + 7280 (tdata->cipher.offset_bits >> 3); 7281 7282 debug_hexdump(stdout, "plaintext:", plaintext, 7283 tdata->plaintext.len_bits >> 3); 7284 debug_hexdump(stdout, "plaintext expected:", 7285 tdata->plaintext.data, 7286 tdata->plaintext.len_bits >> 3); 7287 } else { 7288 if (ut_params->obuf) 7289 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 7290 uint8_t *); 7291 else 7292 ciphertext = plaintext; 7293 7294 debug_hexdump(stdout, "ciphertext:", ciphertext, 7295 ciphertext_len); 7296 debug_hexdump(stdout, "ciphertext expected:", 7297 tdata->ciphertext.data, 7298 tdata->ciphertext.len_bits >> 3); 7299 7300 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 7301 + (tdata->digest_enc.offset == 0 ? 7302 plaintext_pad_len : tdata->digest_enc.offset); 7303 7304 debug_hexdump(stdout, "digest:", ut_params->digest, 7305 tdata->digest_enc.len); 7306 debug_hexdump(stdout, "digest expected:", 7307 tdata->digest_enc.data, 7308 tdata->digest_enc.len); 7309 } 7310 7311 /* Validate obuf */ 7312 if (verify) { 7313 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7314 plaintext, 7315 tdata->plaintext.data, 7316 tdata->plaintext.len_bits >> 3, 7317 "Plaintext data not as expected"); 7318 } else { 7319 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7320 ciphertext, 7321 tdata->ciphertext.data, 7322 tdata->validDataLen.len_bits, 7323 "Ciphertext data not as expected"); 7324 7325 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7326 ut_params->digest, 7327 tdata->digest_enc.data, 7328 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 7329 "Generated auth tag not as expected"); 7330 } 7331 7332 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7333 "crypto op processing failed"); 7334 7335 return 0; 7336 } 7337 7338 static int 7339 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 7340 uint8_t op_mode, uint8_t verify) 7341 { 7342 struct crypto_testsuite_params *ts_params = &testsuite_params; 7343 struct crypto_unittest_params *ut_params = &unittest_params; 7344 7345 int retval; 7346 7347 const uint8_t *plaintext = NULL; 7348 const uint8_t *ciphertext = NULL; 7349 const uint8_t *digest = NULL; 7350 unsigned int plaintext_pad_len; 7351 unsigned int plaintext_len; 7352 unsigned int ciphertext_pad_len; 7353 unsigned int ciphertext_len; 7354 uint8_t buffer[10000]; 7355 uint8_t digest_buffer[10000]; 7356 7357 struct rte_cryptodev_info dev_info; 7358 struct rte_crypto_op *op; 7359 7360 /* Check if device supports particular algorithms */ 7361 if (test_mixed_check_if_unsupported(tdata)) 7362 return TEST_SKIPPED; 7363 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7364 return TEST_SKIPPED; 7365 7366 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7367 7368 uint64_t feat_flags = dev_info.feature_flags; 7369 7370 if (op_mode == IN_PLACE) { 7371 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 7372 printf("Device doesn't support in-place scatter-gather " 7373 "in both input and output mbufs.\n"); 7374 return TEST_SKIPPED; 7375 } 7376 } else { 7377 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 7378 printf("Device doesn't support out-of-place scatter-gather " 7379 "in both input and output mbufs.\n"); 7380 return TEST_SKIPPED; 7381 } 7382 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7383 printf("Device doesn't support digest encrypted.\n"); 7384 return TEST_SKIPPED; 7385 } 7386 } 7387 7388 /* Create the session */ 7389 if (verify) 7390 retval = create_wireless_algo_cipher_auth_session( 7391 ts_params->valid_devs[0], 7392 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7393 RTE_CRYPTO_AUTH_OP_VERIFY, 7394 tdata->auth_algo, 7395 tdata->cipher_algo, 7396 tdata->auth_key.data, tdata->auth_key.len, 7397 tdata->auth_iv.len, tdata->digest_enc.len, 7398 tdata->cipher_iv.len); 7399 else 7400 retval = create_wireless_algo_auth_cipher_session( 7401 ts_params->valid_devs[0], 7402 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7403 RTE_CRYPTO_AUTH_OP_GENERATE, 7404 tdata->auth_algo, 7405 tdata->cipher_algo, 7406 tdata->auth_key.data, tdata->auth_key.len, 7407 tdata->auth_iv.len, tdata->digest_enc.len, 7408 tdata->cipher_iv.len); 7409 if (retval != 0) 7410 return retval; 7411 7412 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7413 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7414 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7415 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7416 7417 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7418 ciphertext_pad_len, 15, 0); 7419 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7420 "Failed to allocate input buffer in mempool"); 7421 7422 if (op_mode == OUT_OF_PLACE) { 7423 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7424 plaintext_pad_len, 15, 0); 7425 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7426 "Failed to allocate output buffer in mempool"); 7427 } 7428 7429 if (verify) { 7430 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7431 tdata->ciphertext.data); 7432 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7433 ciphertext_len, buffer); 7434 debug_hexdump(stdout, "ciphertext:", ciphertext, 7435 ciphertext_len); 7436 } else { 7437 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7438 tdata->plaintext.data); 7439 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7440 plaintext_len, buffer); 7441 debug_hexdump(stdout, "plaintext:", plaintext, 7442 plaintext_len); 7443 } 7444 memset(buffer, 0, sizeof(buffer)); 7445 7446 /* Create the operation */ 7447 retval = create_wireless_algo_auth_cipher_operation( 7448 tdata->digest_enc.data, tdata->digest_enc.len, 7449 tdata->cipher_iv.data, tdata->cipher_iv.len, 7450 tdata->auth_iv.data, tdata->auth_iv.len, 7451 (tdata->digest_enc.offset == 0 ? 7452 plaintext_pad_len 7453 : tdata->digest_enc.offset), 7454 tdata->validCipherLen.len_bits, 7455 tdata->cipher.offset_bits, 7456 tdata->validAuthLen.len_bits, 7457 tdata->auth.offset_bits, 7458 op_mode, 1, verify); 7459 7460 if (retval < 0) 7461 return retval; 7462 7463 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7464 7465 /* Check if the op failed because the device doesn't */ 7466 /* support this particular combination of algorithms */ 7467 if (op == NULL && ut_params->op->status == 7468 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7469 printf("Device doesn't support this mixed combination. " 7470 "Test Skipped.\n"); 7471 return TEST_SKIPPED; 7472 } 7473 ut_params->op = op; 7474 7475 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7476 7477 ut_params->obuf = (op_mode == IN_PLACE ? 7478 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7479 7480 if (verify) { 7481 if (ut_params->obuf) 7482 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7483 plaintext_len, buffer); 7484 else 7485 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7486 plaintext_len, buffer); 7487 7488 debug_hexdump(stdout, "plaintext:", plaintext, 7489 (tdata->plaintext.len_bits >> 3) - 7490 tdata->digest_enc.len); 7491 debug_hexdump(stdout, "plaintext expected:", 7492 tdata->plaintext.data, 7493 (tdata->plaintext.len_bits >> 3) - 7494 tdata->digest_enc.len); 7495 } else { 7496 if (ut_params->obuf) 7497 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 7498 ciphertext_len, buffer); 7499 else 7500 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7501 ciphertext_len, buffer); 7502 7503 debug_hexdump(stdout, "ciphertext:", ciphertext, 7504 ciphertext_len); 7505 debug_hexdump(stdout, "ciphertext expected:", 7506 tdata->ciphertext.data, 7507 tdata->ciphertext.len_bits >> 3); 7508 7509 if (ut_params->obuf) 7510 digest = rte_pktmbuf_read(ut_params->obuf, 7511 (tdata->digest_enc.offset == 0 ? 7512 plaintext_pad_len : 7513 tdata->digest_enc.offset), 7514 tdata->digest_enc.len, digest_buffer); 7515 else 7516 digest = rte_pktmbuf_read(ut_params->ibuf, 7517 (tdata->digest_enc.offset == 0 ? 7518 plaintext_pad_len : 7519 tdata->digest_enc.offset), 7520 tdata->digest_enc.len, digest_buffer); 7521 7522 debug_hexdump(stdout, "digest:", digest, 7523 tdata->digest_enc.len); 7524 debug_hexdump(stdout, "digest expected:", 7525 tdata->digest_enc.data, tdata->digest_enc.len); 7526 } 7527 7528 /* Validate obuf */ 7529 if (verify) { 7530 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7531 plaintext, 7532 tdata->plaintext.data, 7533 tdata->plaintext.len_bits >> 3, 7534 "Plaintext data not as expected"); 7535 } else { 7536 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7537 ciphertext, 7538 tdata->ciphertext.data, 7539 tdata->validDataLen.len_bits, 7540 "Ciphertext data not as expected"); 7541 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7542 digest, 7543 tdata->digest_enc.data, 7544 tdata->digest_enc.len, 7545 "Generated auth tag not as expected"); 7546 } 7547 7548 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7549 "crypto op processing failed"); 7550 7551 return 0; 7552 } 7553 7554 /** AUTH AES CMAC + CIPHER AES CTR */ 7555 7556 static int 7557 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7558 { 7559 return test_mixed_auth_cipher( 7560 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7561 } 7562 7563 static int 7564 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7565 { 7566 return test_mixed_auth_cipher( 7567 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7568 } 7569 7570 static int 7571 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7572 { 7573 return test_mixed_auth_cipher_sgl( 7574 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7575 } 7576 7577 static int 7578 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7579 { 7580 return test_mixed_auth_cipher_sgl( 7581 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7582 } 7583 7584 static int 7585 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7586 { 7587 return test_mixed_auth_cipher( 7588 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7589 } 7590 7591 static int 7592 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7593 { 7594 return test_mixed_auth_cipher( 7595 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7596 } 7597 7598 static int 7599 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7600 { 7601 return test_mixed_auth_cipher_sgl( 7602 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7603 } 7604 7605 static int 7606 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7607 { 7608 return test_mixed_auth_cipher_sgl( 7609 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7610 } 7611 7612 /** MIXED AUTH + CIPHER */ 7613 7614 static int 7615 test_auth_zuc_cipher_snow_test_case_1(void) 7616 { 7617 return test_mixed_auth_cipher( 7618 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7619 } 7620 7621 static int 7622 test_verify_auth_zuc_cipher_snow_test_case_1(void) 7623 { 7624 return test_mixed_auth_cipher( 7625 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7626 } 7627 7628 static int 7629 test_auth_aes_cmac_cipher_snow_test_case_1(void) 7630 { 7631 return test_mixed_auth_cipher( 7632 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7633 } 7634 7635 static int 7636 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 7637 { 7638 return test_mixed_auth_cipher( 7639 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7640 } 7641 7642 static int 7643 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 7644 { 7645 return test_mixed_auth_cipher( 7646 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7647 } 7648 7649 static int 7650 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 7651 { 7652 return test_mixed_auth_cipher( 7653 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7654 } 7655 7656 static int 7657 test_auth_snow_cipher_aes_ctr_test_case_1(void) 7658 { 7659 return test_mixed_auth_cipher( 7660 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7661 } 7662 7663 static int 7664 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 7665 { 7666 return test_mixed_auth_cipher( 7667 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7668 } 7669 7670 static int 7671 test_auth_snow_cipher_zuc_test_case_1(void) 7672 { 7673 return test_mixed_auth_cipher( 7674 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7675 } 7676 7677 static int 7678 test_verify_auth_snow_cipher_zuc_test_case_1(void) 7679 { 7680 return test_mixed_auth_cipher( 7681 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7682 } 7683 7684 static int 7685 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 7686 { 7687 return test_mixed_auth_cipher( 7688 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7689 } 7690 7691 static int 7692 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 7693 { 7694 return test_mixed_auth_cipher( 7695 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7696 } 7697 7698 static int 7699 test_auth_null_cipher_snow_test_case_1(void) 7700 { 7701 return test_mixed_auth_cipher( 7702 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7703 } 7704 7705 static int 7706 test_verify_auth_null_cipher_snow_test_case_1(void) 7707 { 7708 return test_mixed_auth_cipher( 7709 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7710 } 7711 7712 static int 7713 test_auth_null_cipher_zuc_test_case_1(void) 7714 { 7715 return test_mixed_auth_cipher( 7716 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7717 } 7718 7719 static int 7720 test_verify_auth_null_cipher_zuc_test_case_1(void) 7721 { 7722 return test_mixed_auth_cipher( 7723 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7724 } 7725 7726 static int 7727 test_auth_snow_cipher_null_test_case_1(void) 7728 { 7729 return test_mixed_auth_cipher( 7730 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7731 } 7732 7733 static int 7734 test_verify_auth_snow_cipher_null_test_case_1(void) 7735 { 7736 return test_mixed_auth_cipher( 7737 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7738 } 7739 7740 static int 7741 test_auth_zuc_cipher_null_test_case_1(void) 7742 { 7743 return test_mixed_auth_cipher( 7744 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7745 } 7746 7747 static int 7748 test_verify_auth_zuc_cipher_null_test_case_1(void) 7749 { 7750 return test_mixed_auth_cipher( 7751 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7752 } 7753 7754 static int 7755 test_auth_null_cipher_aes_ctr_test_case_1(void) 7756 { 7757 return test_mixed_auth_cipher( 7758 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7759 } 7760 7761 static int 7762 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 7763 { 7764 return test_mixed_auth_cipher( 7765 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7766 } 7767 7768 static int 7769 test_auth_aes_cmac_cipher_null_test_case_1(void) 7770 { 7771 return test_mixed_auth_cipher( 7772 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7773 } 7774 7775 static int 7776 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 7777 { 7778 return test_mixed_auth_cipher( 7779 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7780 } 7781 7782 /* ***** AEAD algorithm Tests ***** */ 7783 7784 static int 7785 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 7786 enum rte_crypto_aead_operation op, 7787 const uint8_t *key, const uint8_t key_len, 7788 const uint16_t aad_len, const uint8_t auth_len, 7789 uint8_t iv_len) 7790 { 7791 uint8_t aead_key[key_len]; 7792 7793 struct crypto_testsuite_params *ts_params = &testsuite_params; 7794 struct crypto_unittest_params *ut_params = &unittest_params; 7795 7796 memcpy(aead_key, key, key_len); 7797 7798 /* Setup AEAD Parameters */ 7799 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7800 ut_params->aead_xform.next = NULL; 7801 ut_params->aead_xform.aead.algo = algo; 7802 ut_params->aead_xform.aead.op = op; 7803 ut_params->aead_xform.aead.key.data = aead_key; 7804 ut_params->aead_xform.aead.key.length = key_len; 7805 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 7806 ut_params->aead_xform.aead.iv.length = iv_len; 7807 ut_params->aead_xform.aead.digest_length = auth_len; 7808 ut_params->aead_xform.aead.aad_length = aad_len; 7809 7810 debug_hexdump(stdout, "key:", key, key_len); 7811 7812 /* Create Crypto session*/ 7813 ut_params->sess = rte_cryptodev_sym_session_create( 7814 ts_params->session_mpool); 7815 7816 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 7817 &ut_params->aead_xform, 7818 ts_params->session_priv_mpool); 7819 7820 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 7821 7822 return 0; 7823 } 7824 7825 static int 7826 create_aead_xform(struct rte_crypto_op *op, 7827 enum rte_crypto_aead_algorithm algo, 7828 enum rte_crypto_aead_operation aead_op, 7829 uint8_t *key, const uint8_t key_len, 7830 const uint8_t aad_len, const uint8_t auth_len, 7831 uint8_t iv_len) 7832 { 7833 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 7834 "failed to allocate space for crypto transform"); 7835 7836 struct rte_crypto_sym_op *sym_op = op->sym; 7837 7838 /* Setup AEAD Parameters */ 7839 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 7840 sym_op->xform->next = NULL; 7841 sym_op->xform->aead.algo = algo; 7842 sym_op->xform->aead.op = aead_op; 7843 sym_op->xform->aead.key.data = key; 7844 sym_op->xform->aead.key.length = key_len; 7845 sym_op->xform->aead.iv.offset = IV_OFFSET; 7846 sym_op->xform->aead.iv.length = iv_len; 7847 sym_op->xform->aead.digest_length = auth_len; 7848 sym_op->xform->aead.aad_length = aad_len; 7849 7850 debug_hexdump(stdout, "key:", key, key_len); 7851 7852 return 0; 7853 } 7854 7855 static int 7856 create_aead_operation(enum rte_crypto_aead_operation op, 7857 const struct aead_test_data *tdata) 7858 { 7859 struct crypto_testsuite_params *ts_params = &testsuite_params; 7860 struct crypto_unittest_params *ut_params = &unittest_params; 7861 7862 uint8_t *plaintext, *ciphertext; 7863 unsigned int aad_pad_len, plaintext_pad_len; 7864 7865 /* Generate Crypto op data structure */ 7866 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7867 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7868 TEST_ASSERT_NOT_NULL(ut_params->op, 7869 "Failed to allocate symmetric crypto operation struct"); 7870 7871 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 7872 7873 /* Append aad data */ 7874 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 7875 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 7876 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7877 aad_pad_len); 7878 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7879 "no room to append aad"); 7880 7881 sym_op->aead.aad.phys_addr = 7882 rte_pktmbuf_iova(ut_params->ibuf); 7883 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 7884 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 7885 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7886 tdata->aad.len); 7887 7888 /* Append IV at the end of the crypto operation*/ 7889 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7890 uint8_t *, IV_OFFSET); 7891 7892 /* Copy IV 1 byte after the IV pointer, according to the API */ 7893 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 7894 debug_hexdump(stdout, "iv:", iv_ptr, 7895 tdata->iv.len); 7896 } else { 7897 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 7898 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7899 aad_pad_len); 7900 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7901 "no room to append aad"); 7902 7903 sym_op->aead.aad.phys_addr = 7904 rte_pktmbuf_iova(ut_params->ibuf); 7905 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 7906 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7907 tdata->aad.len); 7908 7909 /* Append IV at the end of the crypto operation*/ 7910 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7911 uint8_t *, IV_OFFSET); 7912 7913 if (tdata->iv.len == 0) { 7914 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 7915 debug_hexdump(stdout, "iv:", iv_ptr, 7916 AES_GCM_J0_LENGTH); 7917 } else { 7918 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 7919 debug_hexdump(stdout, "iv:", iv_ptr, 7920 tdata->iv.len); 7921 } 7922 } 7923 7924 /* Append plaintext/ciphertext */ 7925 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7926 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7927 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7928 plaintext_pad_len); 7929 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 7930 7931 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 7932 debug_hexdump(stdout, "plaintext:", plaintext, 7933 tdata->plaintext.len); 7934 7935 if (ut_params->obuf) { 7936 ciphertext = (uint8_t *)rte_pktmbuf_append( 7937 ut_params->obuf, 7938 plaintext_pad_len + aad_pad_len); 7939 TEST_ASSERT_NOT_NULL(ciphertext, 7940 "no room to append ciphertext"); 7941 7942 memset(ciphertext + aad_pad_len, 0, 7943 tdata->ciphertext.len); 7944 } 7945 } else { 7946 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 7947 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7948 plaintext_pad_len); 7949 TEST_ASSERT_NOT_NULL(ciphertext, 7950 "no room to append ciphertext"); 7951 7952 memcpy(ciphertext, tdata->ciphertext.data, 7953 tdata->ciphertext.len); 7954 debug_hexdump(stdout, "ciphertext:", ciphertext, 7955 tdata->ciphertext.len); 7956 7957 if (ut_params->obuf) { 7958 plaintext = (uint8_t *)rte_pktmbuf_append( 7959 ut_params->obuf, 7960 plaintext_pad_len + aad_pad_len); 7961 TEST_ASSERT_NOT_NULL(plaintext, 7962 "no room to append plaintext"); 7963 7964 memset(plaintext + aad_pad_len, 0, 7965 tdata->plaintext.len); 7966 } 7967 } 7968 7969 /* Append digest data */ 7970 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7971 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7972 ut_params->obuf ? ut_params->obuf : 7973 ut_params->ibuf, 7974 tdata->auth_tag.len); 7975 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7976 "no room to append digest"); 7977 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 7978 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7979 ut_params->obuf ? ut_params->obuf : 7980 ut_params->ibuf, 7981 plaintext_pad_len + 7982 aad_pad_len); 7983 } else { 7984 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7985 ut_params->ibuf, tdata->auth_tag.len); 7986 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7987 "no room to append digest"); 7988 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7989 ut_params->ibuf, 7990 plaintext_pad_len + aad_pad_len); 7991 7992 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 7993 tdata->auth_tag.len); 7994 debug_hexdump(stdout, "digest:", 7995 sym_op->aead.digest.data, 7996 tdata->auth_tag.len); 7997 } 7998 7999 sym_op->aead.data.length = tdata->plaintext.len; 8000 sym_op->aead.data.offset = aad_pad_len; 8001 8002 return 0; 8003 } 8004 8005 static int 8006 test_authenticated_encryption(const struct aead_test_data *tdata) 8007 { 8008 struct crypto_testsuite_params *ts_params = &testsuite_params; 8009 struct crypto_unittest_params *ut_params = &unittest_params; 8010 8011 int retval; 8012 uint8_t *ciphertext, *auth_tag; 8013 uint16_t plaintext_pad_len; 8014 uint32_t i; 8015 struct rte_cryptodev_info dev_info; 8016 8017 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8018 uint64_t feat_flags = dev_info.feature_flags; 8019 8020 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 8021 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 8022 printf("Device doesn't support RAW data-path APIs.\n"); 8023 return TEST_SKIPPED; 8024 } 8025 8026 /* Verify the capabilities */ 8027 struct rte_cryptodev_sym_capability_idx cap_idx; 8028 const struct rte_cryptodev_symmetric_capability *capability; 8029 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 8030 cap_idx.algo.aead = tdata->algo; 8031 capability = rte_cryptodev_sym_capability_get( 8032 ts_params->valid_devs[0], &cap_idx); 8033 if (capability == NULL) 8034 return TEST_SKIPPED; 8035 if (rte_cryptodev_sym_capability_check_aead( 8036 capability, tdata->key.len, tdata->auth_tag.len, 8037 tdata->aad.len, tdata->iv.len)) 8038 return TEST_SKIPPED; 8039 8040 /* Create AEAD session */ 8041 retval = create_aead_session(ts_params->valid_devs[0], 8042 tdata->algo, 8043 RTE_CRYPTO_AEAD_OP_ENCRYPT, 8044 tdata->key.data, tdata->key.len, 8045 tdata->aad.len, tdata->auth_tag.len, 8046 tdata->iv.len); 8047 if (retval < 0) 8048 return retval; 8049 8050 if (tdata->aad.len > MBUF_SIZE) { 8051 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 8052 /* Populate full size of add data */ 8053 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 8054 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 8055 } else 8056 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8057 8058 /* clear mbuf payload */ 8059 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8060 rte_pktmbuf_tailroom(ut_params->ibuf)); 8061 8062 /* Create AEAD operation */ 8063 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8064 if (retval < 0) 8065 return retval; 8066 8067 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8068 8069 ut_params->op->sym->m_src = ut_params->ibuf; 8070 8071 /* Process crypto operation */ 8072 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8073 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 8074 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 8075 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8076 ut_params->op, 0, 0, 0, 0); 8077 else 8078 TEST_ASSERT_NOT_NULL( 8079 process_crypto_request(ts_params->valid_devs[0], 8080 ut_params->op), "failed to process sym crypto op"); 8081 8082 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8083 "crypto op processing failed"); 8084 8085 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8086 8087 if (ut_params->op->sym->m_dst) { 8088 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8089 uint8_t *); 8090 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8091 uint8_t *, plaintext_pad_len); 8092 } else { 8093 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8094 uint8_t *, 8095 ut_params->op->sym->cipher.data.offset); 8096 auth_tag = ciphertext + plaintext_pad_len; 8097 } 8098 8099 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8100 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8101 8102 /* Validate obuf */ 8103 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8104 ciphertext, 8105 tdata->ciphertext.data, 8106 tdata->ciphertext.len, 8107 "Ciphertext data not as expected"); 8108 8109 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8110 auth_tag, 8111 tdata->auth_tag.data, 8112 tdata->auth_tag.len, 8113 "Generated auth tag not as expected"); 8114 8115 return 0; 8116 8117 } 8118 8119 #ifdef RTE_LIB_SECURITY 8120 static int 8121 security_proto_supported(enum rte_security_session_action_type action, 8122 enum rte_security_session_protocol proto) 8123 { 8124 struct crypto_testsuite_params *ts_params = &testsuite_params; 8125 8126 const struct rte_security_capability *capabilities; 8127 const struct rte_security_capability *capability; 8128 uint16_t i = 0; 8129 8130 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8131 rte_cryptodev_get_sec_ctx( 8132 ts_params->valid_devs[0]); 8133 8134 8135 capabilities = rte_security_capabilities_get(ctx); 8136 8137 if (capabilities == NULL) 8138 return -ENOTSUP; 8139 8140 while ((capability = &capabilities[i++])->action != 8141 RTE_SECURITY_ACTION_TYPE_NONE) { 8142 if (capability->action == action && 8143 capability->protocol == proto) 8144 return 0; 8145 } 8146 8147 return -ENOTSUP; 8148 } 8149 8150 /* Basic algorithm run function for async inplace mode. 8151 * Creates a session from input parameters and runs one operation 8152 * on input_vec. Checks the output of the crypto operation against 8153 * output_vec. 8154 */ 8155 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 8156 enum rte_crypto_auth_operation opa, 8157 const uint8_t *input_vec, unsigned int input_vec_len, 8158 const uint8_t *output_vec, 8159 unsigned int output_vec_len, 8160 enum rte_crypto_cipher_algorithm cipher_alg, 8161 const uint8_t *cipher_key, uint32_t cipher_key_len, 8162 enum rte_crypto_auth_algorithm auth_alg, 8163 const uint8_t *auth_key, uint32_t auth_key_len, 8164 uint8_t bearer, enum rte_security_pdcp_domain domain, 8165 uint8_t packet_direction, uint8_t sn_size, 8166 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 8167 { 8168 struct crypto_testsuite_params *ts_params = &testsuite_params; 8169 struct crypto_unittest_params *ut_params = &unittest_params; 8170 uint8_t *plaintext; 8171 int ret = TEST_SUCCESS; 8172 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8173 rte_cryptodev_get_sec_ctx( 8174 ts_params->valid_devs[0]); 8175 8176 /* Verify the capabilities */ 8177 struct rte_security_capability_idx sec_cap_idx; 8178 8179 sec_cap_idx.action = ut_params->type; 8180 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8181 sec_cap_idx.pdcp.domain = domain; 8182 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8183 return TEST_SKIPPED; 8184 8185 /* Generate test mbuf data */ 8186 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8187 8188 /* clear mbuf payload */ 8189 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8190 rte_pktmbuf_tailroom(ut_params->ibuf)); 8191 8192 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8193 input_vec_len); 8194 memcpy(plaintext, input_vec, input_vec_len); 8195 8196 /* Out of place support */ 8197 if (oop) { 8198 /* 8199 * For out-op-place we need to alloc another mbuf 8200 */ 8201 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8202 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 8203 } 8204 8205 /* Setup Cipher Parameters */ 8206 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8207 ut_params->cipher_xform.cipher.algo = cipher_alg; 8208 ut_params->cipher_xform.cipher.op = opc; 8209 ut_params->cipher_xform.cipher.key.data = cipher_key; 8210 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 8211 ut_params->cipher_xform.cipher.iv.length = 8212 packet_direction ? 4 : 0; 8213 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8214 8215 /* Setup HMAC Parameters if ICV header is required */ 8216 if (auth_alg != 0) { 8217 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8218 ut_params->auth_xform.next = NULL; 8219 ut_params->auth_xform.auth.algo = auth_alg; 8220 ut_params->auth_xform.auth.op = opa; 8221 ut_params->auth_xform.auth.key.data = auth_key; 8222 ut_params->auth_xform.auth.key.length = auth_key_len; 8223 8224 ut_params->cipher_xform.next = &ut_params->auth_xform; 8225 } else { 8226 ut_params->cipher_xform.next = NULL; 8227 } 8228 8229 struct rte_security_session_conf sess_conf = { 8230 .action_type = ut_params->type, 8231 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8232 {.pdcp = { 8233 .bearer = bearer, 8234 .domain = domain, 8235 .pkt_dir = packet_direction, 8236 .sn_size = sn_size, 8237 .hfn = packet_direction ? 0 : hfn, 8238 /** 8239 * hfn can be set as pdcp_test_hfn[i] 8240 * if hfn_ovrd is not set. Here, PDCP 8241 * packet direction is just used to 8242 * run half of the cases with session 8243 * HFN and other half with per packet 8244 * HFN. 8245 */ 8246 .hfn_threshold = hfn_threshold, 8247 .hfn_ovrd = packet_direction ? 1 : 0, 8248 .sdap_enabled = sdap, 8249 } }, 8250 .crypto_xform = &ut_params->cipher_xform 8251 }; 8252 8253 /* Create security session */ 8254 ut_params->sec_session = rte_security_session_create(ctx, 8255 &sess_conf, ts_params->session_mpool, 8256 ts_params->session_priv_mpool); 8257 8258 if (!ut_params->sec_session) { 8259 printf("TestCase %s()-%d line %d failed %s: ", 8260 __func__, i, __LINE__, "Failed to allocate session"); 8261 ret = TEST_FAILED; 8262 goto on_err; 8263 } 8264 8265 /* Generate crypto op data structure */ 8266 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8267 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8268 if (!ut_params->op) { 8269 printf("TestCase %s()-%d line %d failed %s: ", 8270 __func__, i, __LINE__, 8271 "Failed to allocate symmetric crypto operation struct"); 8272 ret = TEST_FAILED; 8273 goto on_err; 8274 } 8275 8276 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 8277 uint32_t *, IV_OFFSET); 8278 *per_pkt_hfn = packet_direction ? hfn : 0; 8279 8280 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8281 8282 /* set crypto operation source mbuf */ 8283 ut_params->op->sym->m_src = ut_params->ibuf; 8284 if (oop) 8285 ut_params->op->sym->m_dst = ut_params->obuf; 8286 8287 /* Process crypto operation */ 8288 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8289 == NULL) { 8290 printf("TestCase %s()-%d line %d failed %s: ", 8291 __func__, i, __LINE__, 8292 "failed to process sym crypto op"); 8293 ret = TEST_FAILED; 8294 goto on_err; 8295 } 8296 8297 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8298 printf("TestCase %s()-%d line %d failed %s: ", 8299 __func__, i, __LINE__, "crypto op processing failed"); 8300 ret = TEST_FAILED; 8301 goto on_err; 8302 } 8303 8304 /* Validate obuf */ 8305 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8306 uint8_t *); 8307 if (oop) { 8308 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8309 uint8_t *); 8310 } 8311 8312 if (memcmp(ciphertext, output_vec, output_vec_len)) { 8313 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8314 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 8315 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 8316 ret = TEST_FAILED; 8317 goto on_err; 8318 } 8319 8320 on_err: 8321 rte_crypto_op_free(ut_params->op); 8322 ut_params->op = NULL; 8323 8324 if (ut_params->sec_session) 8325 rte_security_session_destroy(ctx, ut_params->sec_session); 8326 ut_params->sec_session = NULL; 8327 8328 rte_pktmbuf_free(ut_params->ibuf); 8329 ut_params->ibuf = NULL; 8330 if (oop) { 8331 rte_pktmbuf_free(ut_params->obuf); 8332 ut_params->obuf = NULL; 8333 } 8334 8335 return ret; 8336 } 8337 8338 static int 8339 test_pdcp_proto_SGL(int i, int oop, 8340 enum rte_crypto_cipher_operation opc, 8341 enum rte_crypto_auth_operation opa, 8342 uint8_t *input_vec, 8343 unsigned int input_vec_len, 8344 uint8_t *output_vec, 8345 unsigned int output_vec_len, 8346 uint32_t fragsz, 8347 uint32_t fragsz_oop) 8348 { 8349 struct crypto_testsuite_params *ts_params = &testsuite_params; 8350 struct crypto_unittest_params *ut_params = &unittest_params; 8351 uint8_t *plaintext; 8352 struct rte_mbuf *buf, *buf_oop = NULL; 8353 int ret = TEST_SUCCESS; 8354 int to_trn = 0; 8355 int to_trn_tbl[16]; 8356 int segs = 1; 8357 unsigned int trn_data = 0; 8358 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8359 rte_cryptodev_get_sec_ctx( 8360 ts_params->valid_devs[0]); 8361 8362 /* Verify the capabilities */ 8363 struct rte_security_capability_idx sec_cap_idx; 8364 8365 sec_cap_idx.action = ut_params->type; 8366 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8367 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 8368 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8369 return TEST_SKIPPED; 8370 8371 if (fragsz > input_vec_len) 8372 fragsz = input_vec_len; 8373 8374 uint16_t plaintext_len = fragsz; 8375 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 8376 8377 if (fragsz_oop > output_vec_len) 8378 frag_size_oop = output_vec_len; 8379 8380 int ecx = 0; 8381 if (input_vec_len % fragsz != 0) { 8382 if (input_vec_len / fragsz + 1 > 16) 8383 return 1; 8384 } else if (input_vec_len / fragsz > 16) 8385 return 1; 8386 8387 /* Out of place support */ 8388 if (oop) { 8389 /* 8390 * For out-op-place we need to alloc another mbuf 8391 */ 8392 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8393 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 8394 buf_oop = ut_params->obuf; 8395 } 8396 8397 /* Generate test mbuf data */ 8398 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8399 8400 /* clear mbuf payload */ 8401 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8402 rte_pktmbuf_tailroom(ut_params->ibuf)); 8403 8404 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8405 plaintext_len); 8406 memcpy(plaintext, input_vec, plaintext_len); 8407 trn_data += plaintext_len; 8408 8409 buf = ut_params->ibuf; 8410 8411 /* 8412 * Loop until no more fragments 8413 */ 8414 8415 while (trn_data < input_vec_len) { 8416 ++segs; 8417 to_trn = (input_vec_len - trn_data < fragsz) ? 8418 (input_vec_len - trn_data) : fragsz; 8419 8420 to_trn_tbl[ecx++] = to_trn; 8421 8422 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8423 buf = buf->next; 8424 8425 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 8426 rte_pktmbuf_tailroom(buf)); 8427 8428 /* OOP */ 8429 if (oop && !fragsz_oop) { 8430 buf_oop->next = 8431 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8432 buf_oop = buf_oop->next; 8433 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8434 0, rte_pktmbuf_tailroom(buf_oop)); 8435 rte_pktmbuf_append(buf_oop, to_trn); 8436 } 8437 8438 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 8439 to_trn); 8440 8441 memcpy(plaintext, input_vec + trn_data, to_trn); 8442 trn_data += to_trn; 8443 } 8444 8445 ut_params->ibuf->nb_segs = segs; 8446 8447 segs = 1; 8448 if (fragsz_oop && oop) { 8449 to_trn = 0; 8450 ecx = 0; 8451 8452 trn_data = frag_size_oop; 8453 while (trn_data < output_vec_len) { 8454 ++segs; 8455 to_trn = 8456 (output_vec_len - trn_data < 8457 frag_size_oop) ? 8458 (output_vec_len - trn_data) : 8459 frag_size_oop; 8460 8461 to_trn_tbl[ecx++] = to_trn; 8462 8463 buf_oop->next = 8464 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8465 buf_oop = buf_oop->next; 8466 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8467 0, rte_pktmbuf_tailroom(buf_oop)); 8468 rte_pktmbuf_append(buf_oop, to_trn); 8469 8470 trn_data += to_trn; 8471 } 8472 ut_params->obuf->nb_segs = segs; 8473 } 8474 8475 /* Setup Cipher Parameters */ 8476 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8477 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 8478 ut_params->cipher_xform.cipher.op = opc; 8479 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 8480 ut_params->cipher_xform.cipher.key.length = 8481 pdcp_test_params[i].cipher_key_len; 8482 ut_params->cipher_xform.cipher.iv.length = 0; 8483 8484 /* Setup HMAC Parameters if ICV header is required */ 8485 if (pdcp_test_params[i].auth_alg != 0) { 8486 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8487 ut_params->auth_xform.next = NULL; 8488 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 8489 ut_params->auth_xform.auth.op = opa; 8490 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 8491 ut_params->auth_xform.auth.key.length = 8492 pdcp_test_params[i].auth_key_len; 8493 8494 ut_params->cipher_xform.next = &ut_params->auth_xform; 8495 } else { 8496 ut_params->cipher_xform.next = NULL; 8497 } 8498 8499 struct rte_security_session_conf sess_conf = { 8500 .action_type = ut_params->type, 8501 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8502 {.pdcp = { 8503 .bearer = pdcp_test_bearer[i], 8504 .domain = pdcp_test_params[i].domain, 8505 .pkt_dir = pdcp_test_packet_direction[i], 8506 .sn_size = pdcp_test_data_sn_size[i], 8507 .hfn = pdcp_test_hfn[i], 8508 .hfn_threshold = pdcp_test_hfn_threshold[i], 8509 .hfn_ovrd = 0, 8510 } }, 8511 .crypto_xform = &ut_params->cipher_xform 8512 }; 8513 8514 /* Create security session */ 8515 ut_params->sec_session = rte_security_session_create(ctx, 8516 &sess_conf, ts_params->session_mpool, 8517 ts_params->session_priv_mpool); 8518 8519 if (!ut_params->sec_session) { 8520 printf("TestCase %s()-%d line %d failed %s: ", 8521 __func__, i, __LINE__, "Failed to allocate session"); 8522 ret = TEST_FAILED; 8523 goto on_err; 8524 } 8525 8526 /* Generate crypto op data structure */ 8527 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8528 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8529 if (!ut_params->op) { 8530 printf("TestCase %s()-%d line %d failed %s: ", 8531 __func__, i, __LINE__, 8532 "Failed to allocate symmetric crypto operation struct"); 8533 ret = TEST_FAILED; 8534 goto on_err; 8535 } 8536 8537 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8538 8539 /* set crypto operation source mbuf */ 8540 ut_params->op->sym->m_src = ut_params->ibuf; 8541 if (oop) 8542 ut_params->op->sym->m_dst = ut_params->obuf; 8543 8544 /* Process crypto operation */ 8545 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8546 == NULL) { 8547 printf("TestCase %s()-%d line %d failed %s: ", 8548 __func__, i, __LINE__, 8549 "failed to process sym crypto op"); 8550 ret = TEST_FAILED; 8551 goto on_err; 8552 } 8553 8554 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8555 printf("TestCase %s()-%d line %d failed %s: ", 8556 __func__, i, __LINE__, "crypto op processing failed"); 8557 ret = TEST_FAILED; 8558 goto on_err; 8559 } 8560 8561 /* Validate obuf */ 8562 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8563 uint8_t *); 8564 if (oop) { 8565 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8566 uint8_t *); 8567 } 8568 if (fragsz_oop) 8569 fragsz = frag_size_oop; 8570 if (memcmp(ciphertext, output_vec, fragsz)) { 8571 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8572 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 8573 rte_hexdump(stdout, "reference", output_vec, fragsz); 8574 ret = TEST_FAILED; 8575 goto on_err; 8576 } 8577 8578 buf = ut_params->op->sym->m_src->next; 8579 if (oop) 8580 buf = ut_params->op->sym->m_dst->next; 8581 8582 unsigned int off = fragsz; 8583 8584 ecx = 0; 8585 while (buf) { 8586 ciphertext = rte_pktmbuf_mtod(buf, 8587 uint8_t *); 8588 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 8589 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8590 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 8591 rte_hexdump(stdout, "reference", output_vec + off, 8592 to_trn_tbl[ecx]); 8593 ret = TEST_FAILED; 8594 goto on_err; 8595 } 8596 off += to_trn_tbl[ecx++]; 8597 buf = buf->next; 8598 } 8599 on_err: 8600 rte_crypto_op_free(ut_params->op); 8601 ut_params->op = NULL; 8602 8603 if (ut_params->sec_session) 8604 rte_security_session_destroy(ctx, ut_params->sec_session); 8605 ut_params->sec_session = NULL; 8606 8607 rte_pktmbuf_free(ut_params->ibuf); 8608 ut_params->ibuf = NULL; 8609 if (oop) { 8610 rte_pktmbuf_free(ut_params->obuf); 8611 ut_params->obuf = NULL; 8612 } 8613 8614 return ret; 8615 } 8616 8617 int 8618 test_pdcp_proto_cplane_encap(int i) 8619 { 8620 return test_pdcp_proto( 8621 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8622 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8623 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8624 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8625 pdcp_test_params[i].cipher_key_len, 8626 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8627 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8628 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8629 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8630 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8631 } 8632 8633 int 8634 test_pdcp_proto_uplane_encap(int i) 8635 { 8636 return test_pdcp_proto( 8637 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8638 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8639 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8640 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8641 pdcp_test_params[i].cipher_key_len, 8642 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8643 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8644 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8645 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8646 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8647 } 8648 8649 int 8650 test_pdcp_proto_uplane_encap_with_int(int i) 8651 { 8652 return test_pdcp_proto( 8653 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8654 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8655 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8656 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8657 pdcp_test_params[i].cipher_key_len, 8658 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8659 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8660 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8661 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8662 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8663 } 8664 8665 int 8666 test_pdcp_proto_cplane_decap(int i) 8667 { 8668 return test_pdcp_proto( 8669 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8670 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8671 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8672 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8673 pdcp_test_params[i].cipher_key_len, 8674 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8675 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8676 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8677 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8678 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8679 } 8680 8681 int 8682 test_pdcp_proto_uplane_decap(int i) 8683 { 8684 return test_pdcp_proto( 8685 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8686 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8687 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8688 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8689 pdcp_test_params[i].cipher_key_len, 8690 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8691 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8692 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8693 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8694 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8695 } 8696 8697 int 8698 test_pdcp_proto_uplane_decap_with_int(int i) 8699 { 8700 return test_pdcp_proto( 8701 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8702 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8703 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8704 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8705 pdcp_test_params[i].cipher_key_len, 8706 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8707 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8708 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8709 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8710 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8711 } 8712 8713 static int 8714 test_PDCP_PROTO_SGL_in_place_32B(void) 8715 { 8716 /* i can be used for running any PDCP case 8717 * In this case it is uplane 12-bit AES-SNOW DL encap 8718 */ 8719 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 8720 return test_pdcp_proto_SGL(i, IN_PLACE, 8721 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8722 RTE_CRYPTO_AUTH_OP_GENERATE, 8723 pdcp_test_data_in[i], 8724 pdcp_test_data_in_len[i], 8725 pdcp_test_data_out[i], 8726 pdcp_test_data_in_len[i]+4, 8727 32, 0); 8728 } 8729 static int 8730 test_PDCP_PROTO_SGL_oop_32B_128B(void) 8731 { 8732 /* i can be used for running any PDCP case 8733 * In this case it is uplane 18-bit NULL-NULL DL encap 8734 */ 8735 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 8736 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8737 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8738 RTE_CRYPTO_AUTH_OP_GENERATE, 8739 pdcp_test_data_in[i], 8740 pdcp_test_data_in_len[i], 8741 pdcp_test_data_out[i], 8742 pdcp_test_data_in_len[i]+4, 8743 32, 128); 8744 } 8745 static int 8746 test_PDCP_PROTO_SGL_oop_32B_40B(void) 8747 { 8748 /* i can be used for running any PDCP case 8749 * In this case it is uplane 18-bit AES DL encap 8750 */ 8751 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 8752 + DOWNLINK; 8753 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8754 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8755 RTE_CRYPTO_AUTH_OP_GENERATE, 8756 pdcp_test_data_in[i], 8757 pdcp_test_data_in_len[i], 8758 pdcp_test_data_out[i], 8759 pdcp_test_data_in_len[i], 8760 32, 40); 8761 } 8762 static int 8763 test_PDCP_PROTO_SGL_oop_128B_32B(void) 8764 { 8765 /* i can be used for running any PDCP case 8766 * In this case it is cplane 12-bit AES-ZUC DL encap 8767 */ 8768 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 8769 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8770 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8771 RTE_CRYPTO_AUTH_OP_GENERATE, 8772 pdcp_test_data_in[i], 8773 pdcp_test_data_in_len[i], 8774 pdcp_test_data_out[i], 8775 pdcp_test_data_in_len[i]+4, 8776 128, 32); 8777 } 8778 8779 static int 8780 test_PDCP_SDAP_PROTO_encap_all(void) 8781 { 8782 int i = 0, size = 0; 8783 int err, all_err = TEST_SUCCESS; 8784 const struct pdcp_sdap_test *cur_test; 8785 8786 size = RTE_DIM(list_pdcp_sdap_tests); 8787 8788 for (i = 0; i < size; i++) { 8789 cur_test = &list_pdcp_sdap_tests[i]; 8790 err = test_pdcp_proto( 8791 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8792 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8793 cur_test->in_len, cur_test->data_out, 8794 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8795 cur_test->param.cipher_alg, cur_test->cipher_key, 8796 cur_test->param.cipher_key_len, 8797 cur_test->param.auth_alg, 8798 cur_test->auth_key, cur_test->param.auth_key_len, 8799 cur_test->bearer, cur_test->param.domain, 8800 cur_test->packet_direction, cur_test->sn_size, 8801 cur_test->hfn, 8802 cur_test->hfn_threshold, SDAP_ENABLED); 8803 if (err) { 8804 printf("\t%d) %s: Encapsulation failed\n", 8805 cur_test->test_idx, 8806 cur_test->param.name); 8807 err = TEST_FAILED; 8808 } else { 8809 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 8810 cur_test->param.name); 8811 err = TEST_SUCCESS; 8812 } 8813 all_err += err; 8814 } 8815 8816 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8817 8818 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8819 } 8820 8821 static int 8822 test_PDCP_PROTO_short_mac(void) 8823 { 8824 int i = 0, size = 0; 8825 int err, all_err = TEST_SUCCESS; 8826 const struct pdcp_short_mac_test *cur_test; 8827 8828 size = RTE_DIM(list_pdcp_smac_tests); 8829 8830 for (i = 0; i < size; i++) { 8831 cur_test = &list_pdcp_smac_tests[i]; 8832 err = test_pdcp_proto( 8833 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8834 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8835 cur_test->in_len, cur_test->data_out, 8836 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8837 RTE_CRYPTO_CIPHER_NULL, NULL, 8838 0, cur_test->param.auth_alg, 8839 cur_test->auth_key, cur_test->param.auth_key_len, 8840 0, cur_test->param.domain, 0, 0, 8841 0, 0, 0); 8842 if (err) { 8843 printf("\t%d) %s: Short MAC test failed\n", 8844 cur_test->test_idx, 8845 cur_test->param.name); 8846 err = TEST_FAILED; 8847 } else { 8848 printf("\t%d) %s: Short MAC test PASS\n", 8849 cur_test->test_idx, 8850 cur_test->param.name); 8851 rte_hexdump(stdout, "MAC I", 8852 cur_test->data_out + cur_test->in_len + 2, 8853 2); 8854 err = TEST_SUCCESS; 8855 } 8856 all_err += err; 8857 } 8858 8859 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8860 8861 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8862 8863 } 8864 8865 static int 8866 test_PDCP_SDAP_PROTO_decap_all(void) 8867 { 8868 int i = 0, size = 0; 8869 int err, all_err = TEST_SUCCESS; 8870 const struct pdcp_sdap_test *cur_test; 8871 8872 size = RTE_DIM(list_pdcp_sdap_tests); 8873 8874 for (i = 0; i < size; i++) { 8875 cur_test = &list_pdcp_sdap_tests[i]; 8876 err = test_pdcp_proto( 8877 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 8878 RTE_CRYPTO_AUTH_OP_VERIFY, 8879 cur_test->data_out, 8880 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8881 cur_test->data_in, cur_test->in_len, 8882 cur_test->param.cipher_alg, 8883 cur_test->cipher_key, cur_test->param.cipher_key_len, 8884 cur_test->param.auth_alg, cur_test->auth_key, 8885 cur_test->param.auth_key_len, cur_test->bearer, 8886 cur_test->param.domain, cur_test->packet_direction, 8887 cur_test->sn_size, cur_test->hfn, 8888 cur_test->hfn_threshold, SDAP_ENABLED); 8889 if (err) { 8890 printf("\t%d) %s: Decapsulation failed\n", 8891 cur_test->test_idx, 8892 cur_test->param.name); 8893 err = TEST_FAILED; 8894 } else { 8895 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 8896 cur_test->param.name); 8897 err = TEST_SUCCESS; 8898 } 8899 all_err += err; 8900 } 8901 8902 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8903 8904 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8905 } 8906 8907 static int 8908 test_ipsec_proto_process(const struct ipsec_test_data td[], 8909 struct ipsec_test_data res_d[], 8910 int nb_td, 8911 bool silent, 8912 const struct ipsec_test_flags *flags) 8913 { 8914 struct crypto_testsuite_params *ts_params = &testsuite_params; 8915 struct crypto_unittest_params *ut_params = &unittest_params; 8916 struct rte_security_capability_idx sec_cap_idx; 8917 const struct rte_security_capability *sec_cap; 8918 struct rte_security_ipsec_xform ipsec_xform; 8919 uint8_t dev_id = ts_params->valid_devs[0]; 8920 enum rte_security_ipsec_sa_direction dir; 8921 struct ipsec_test_data *res_d_tmp = NULL; 8922 uint32_t src = RTE_IPV4(192, 168, 1, 0); 8923 uint32_t dst = RTE_IPV4(192, 168, 1, 1); 8924 int salt_len, i, ret = TEST_SUCCESS; 8925 struct rte_security_ctx *ctx; 8926 uint8_t *input_text; 8927 8928 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 8929 gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL; 8930 8931 /* Use first test data to create session */ 8932 8933 /* Copy IPsec xform */ 8934 memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform)); 8935 8936 memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src)); 8937 memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst)); 8938 8939 dir = ipsec_xform.direction; 8940 8941 ctx = rte_cryptodev_get_sec_ctx(dev_id); 8942 8943 sec_cap_idx.action = ut_params->type; 8944 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC; 8945 sec_cap_idx.ipsec.proto = ipsec_xform.proto; 8946 sec_cap_idx.ipsec.mode = ipsec_xform.mode; 8947 sec_cap_idx.ipsec.direction = ipsec_xform.direction; 8948 8949 if (flags->udp_encap) 8950 ipsec_xform.options.udp_encap = 1; 8951 8952 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 8953 if (sec_cap == NULL) 8954 return TEST_SKIPPED; 8955 8956 /* Copy cipher session parameters */ 8957 if (td[0].aead) { 8958 memcpy(&ut_params->aead_xform, &td[0].xform.aead, 8959 sizeof(ut_params->aead_xform)); 8960 ut_params->aead_xform.aead.key.data = td[0].key.data; 8961 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 8962 8963 /* Verify crypto capabilities */ 8964 if (test_ipsec_crypto_caps_aead_verify( 8965 sec_cap, 8966 &ut_params->aead_xform) != 0) { 8967 if (!silent) 8968 RTE_LOG(INFO, USER1, 8969 "Crypto capabilities not supported\n"); 8970 return TEST_SKIPPED; 8971 } 8972 } else { 8973 /* Only AEAD supported now */ 8974 return TEST_SKIPPED; 8975 } 8976 8977 if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0) 8978 return TEST_SKIPPED; 8979 8980 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len); 8981 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len); 8982 8983 struct rte_security_session_conf sess_conf = { 8984 .action_type = ut_params->type, 8985 .protocol = RTE_SECURITY_PROTOCOL_IPSEC, 8986 .ipsec = ipsec_xform, 8987 .crypto_xform = &ut_params->aead_xform, 8988 }; 8989 8990 /* Create security session */ 8991 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 8992 ts_params->session_mpool, 8993 ts_params->session_priv_mpool); 8994 8995 if (ut_params->sec_session == NULL) 8996 return TEST_SKIPPED; 8997 8998 for (i = 0; i < nb_td; i++) { 8999 /* Setup source mbuf payload */ 9000 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9001 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9002 rte_pktmbuf_tailroom(ut_params->ibuf)); 9003 9004 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9005 td[i].input_text.len); 9006 9007 memcpy(input_text, td[i].input_text.data, 9008 td[i].input_text.len); 9009 9010 /* Generate crypto op data structure */ 9011 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9012 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9013 if (!ut_params->op) { 9014 printf("TestCase %s line %d: %s\n", 9015 __func__, __LINE__, 9016 "failed to allocate crypto op"); 9017 ret = TEST_FAILED; 9018 goto crypto_op_free; 9019 } 9020 9021 /* Attach session to operation */ 9022 rte_security_attach_session(ut_params->op, 9023 ut_params->sec_session); 9024 9025 /* Set crypto operation mbufs */ 9026 ut_params->op->sym->m_src = ut_params->ibuf; 9027 ut_params->op->sym->m_dst = NULL; 9028 9029 /* Copy IV in crypto operation when IV generation is disabled */ 9030 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS && 9031 ipsec_xform.options.iv_gen_disable == 1) { 9032 uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op, 9033 uint8_t *, 9034 IV_OFFSET); 9035 int len; 9036 9037 if (td[i].aead) 9038 len = td[i].xform.aead.aead.iv.length; 9039 else 9040 len = td[i].xform.chain.cipher.cipher.iv.length; 9041 9042 memcpy(iv, td[i].iv.data, len); 9043 } 9044 9045 /* Process crypto operation */ 9046 process_crypto_request(dev_id, ut_params->op); 9047 9048 ret = test_ipsec_status_check(ut_params->op, flags, dir); 9049 if (ret != TEST_SUCCESS) 9050 goto crypto_op_free; 9051 9052 if (res_d != NULL) 9053 res_d_tmp = &res_d[i]; 9054 9055 ret = test_ipsec_post_process(ut_params->ibuf, &td[i], 9056 res_d_tmp, silent, flags); 9057 if (ret != TEST_SUCCESS) 9058 goto crypto_op_free; 9059 9060 rte_crypto_op_free(ut_params->op); 9061 ut_params->op = NULL; 9062 9063 rte_pktmbuf_free(ut_params->ibuf); 9064 ut_params->ibuf = NULL; 9065 } 9066 9067 crypto_op_free: 9068 rte_crypto_op_free(ut_params->op); 9069 ut_params->op = NULL; 9070 9071 rte_pktmbuf_free(ut_params->ibuf); 9072 ut_params->ibuf = NULL; 9073 9074 if (ut_params->sec_session) 9075 rte_security_session_destroy(ctx, ut_params->sec_session); 9076 ut_params->sec_session = NULL; 9077 9078 return ret; 9079 } 9080 9081 static int 9082 test_ipsec_proto_known_vec(const void *test_data) 9083 { 9084 struct ipsec_test_data td_outb; 9085 struct ipsec_test_flags flags; 9086 9087 memset(&flags, 0, sizeof(flags)); 9088 9089 memcpy(&td_outb, test_data, sizeof(td_outb)); 9090 9091 /* Disable IV gen to be able to test with known vectors */ 9092 td_outb.ipsec_xform.options.iv_gen_disable = 1; 9093 9094 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags); 9095 } 9096 9097 static int 9098 test_ipsec_proto_known_vec_inb(const void *td_outb) 9099 { 9100 struct ipsec_test_flags flags; 9101 struct ipsec_test_data td_inb; 9102 9103 memset(&flags, 0, sizeof(flags)); 9104 9105 test_ipsec_td_in_from_out(td_outb, &td_inb); 9106 9107 return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags); 9108 } 9109 9110 static int 9111 test_ipsec_proto_all(const struct ipsec_test_flags *flags) 9112 { 9113 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX]; 9114 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX]; 9115 unsigned int i, nb_pkts = 1, pass_cnt = 0; 9116 int ret; 9117 9118 if (flags->iv_gen) 9119 nb_pkts = IPSEC_TEST_PACKETS_MAX; 9120 9121 for (i = 0; i < RTE_DIM(aead_list); i++) { 9122 test_ipsec_td_prepare(&aead_list[i], 9123 NULL, 9124 flags, 9125 td_outb, 9126 nb_pkts); 9127 9128 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true, 9129 flags); 9130 if (ret == TEST_SKIPPED) 9131 continue; 9132 9133 if (ret == TEST_FAILED) 9134 return TEST_FAILED; 9135 9136 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags); 9137 9138 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true, 9139 flags); 9140 if (ret == TEST_SKIPPED) 9141 continue; 9142 9143 if (ret == TEST_FAILED) 9144 return TEST_FAILED; 9145 9146 if (flags->display_alg) 9147 test_ipsec_display_alg(&aead_list[i], NULL); 9148 9149 pass_cnt++; 9150 } 9151 9152 if (pass_cnt > 0) 9153 return TEST_SUCCESS; 9154 else 9155 return TEST_SKIPPED; 9156 } 9157 9158 static int 9159 test_ipsec_proto_display_list(const void *data __rte_unused) 9160 { 9161 struct ipsec_test_flags flags; 9162 9163 memset(&flags, 0, sizeof(flags)); 9164 9165 flags.display_alg = true; 9166 9167 return test_ipsec_proto_all(&flags); 9168 } 9169 9170 static int 9171 test_ipsec_proto_iv_gen(const void *data __rte_unused) 9172 { 9173 struct ipsec_test_flags flags; 9174 9175 memset(&flags, 0, sizeof(flags)); 9176 9177 flags.iv_gen = true; 9178 9179 return test_ipsec_proto_all(&flags); 9180 } 9181 9182 static int 9183 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused) 9184 { 9185 struct ipsec_test_flags flags; 9186 9187 memset(&flags, 0, sizeof(flags)); 9188 9189 flags.icv_corrupt = true; 9190 9191 return test_ipsec_proto_all(&flags); 9192 } 9193 9194 static int 9195 test_ipsec_proto_udp_encap(const void *data __rte_unused) 9196 { 9197 struct ipsec_test_flags flags; 9198 9199 memset(&flags, 0, sizeof(flags)); 9200 9201 flags.udp_encap = true; 9202 9203 return test_ipsec_proto_all(&flags); 9204 } 9205 9206 static int 9207 test_PDCP_PROTO_all(void) 9208 { 9209 struct crypto_testsuite_params *ts_params = &testsuite_params; 9210 struct crypto_unittest_params *ut_params = &unittest_params; 9211 struct rte_cryptodev_info dev_info; 9212 int status; 9213 9214 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9215 uint64_t feat_flags = dev_info.feature_flags; 9216 9217 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 9218 return TEST_SKIPPED; 9219 9220 /* Set action type */ 9221 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9222 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9223 gbl_action_type; 9224 9225 if (security_proto_supported(ut_params->type, 9226 RTE_SECURITY_PROTOCOL_PDCP) < 0) 9227 return TEST_SKIPPED; 9228 9229 status = test_PDCP_PROTO_cplane_encap_all(); 9230 status += test_PDCP_PROTO_cplane_decap_all(); 9231 status += test_PDCP_PROTO_uplane_encap_all(); 9232 status += test_PDCP_PROTO_uplane_decap_all(); 9233 status += test_PDCP_PROTO_SGL_in_place_32B(); 9234 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 9235 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 9236 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 9237 status += test_PDCP_SDAP_PROTO_encap_all(); 9238 status += test_PDCP_SDAP_PROTO_decap_all(); 9239 status += test_PDCP_PROTO_short_mac(); 9240 9241 if (status) 9242 return TEST_FAILED; 9243 else 9244 return TEST_SUCCESS; 9245 } 9246 9247 static int 9248 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td) 9249 { 9250 struct crypto_testsuite_params *ts_params = &testsuite_params; 9251 struct crypto_unittest_params *ut_params = &unittest_params; 9252 uint8_t *plaintext, *ciphertext; 9253 uint8_t *iv_ptr; 9254 int32_t cipher_len, crc_len; 9255 uint32_t crc_data_len; 9256 int ret = TEST_SUCCESS; 9257 9258 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9259 rte_cryptodev_get_sec_ctx( 9260 ts_params->valid_devs[0]); 9261 9262 /* Verify the capabilities */ 9263 struct rte_security_capability_idx sec_cap_idx; 9264 const struct rte_security_capability *sec_cap; 9265 const struct rte_cryptodev_capabilities *crypto_cap; 9266 const struct rte_cryptodev_symmetric_capability *sym_cap; 9267 int j = 0; 9268 9269 sec_cap_idx.action = ut_params->type; 9270 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 9271 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 9272 9273 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9274 if (sec_cap == NULL) 9275 return TEST_SKIPPED; 9276 9277 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 9278 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 9279 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 9280 crypto_cap->sym.xform_type == 9281 RTE_CRYPTO_SYM_XFORM_CIPHER && 9282 crypto_cap->sym.cipher.algo == 9283 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 9284 sym_cap = &crypto_cap->sym; 9285 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 9286 d_td->key.len, 9287 d_td->iv.len) == 0) 9288 break; 9289 } 9290 } 9291 9292 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 9293 return TEST_SKIPPED; 9294 9295 /* Setup source mbuf payload */ 9296 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9297 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9298 rte_pktmbuf_tailroom(ut_params->ibuf)); 9299 9300 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9301 d_td->ciphertext.len); 9302 9303 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 9304 9305 /* Setup cipher session parameters */ 9306 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9307 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 9308 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 9309 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 9310 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 9311 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 9312 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9313 ut_params->cipher_xform.next = NULL; 9314 9315 /* Setup DOCSIS session parameters */ 9316 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 9317 9318 struct rte_security_session_conf sess_conf = { 9319 .action_type = ut_params->type, 9320 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 9321 .docsis = ut_params->docsis_xform, 9322 .crypto_xform = &ut_params->cipher_xform, 9323 }; 9324 9325 /* Create security session */ 9326 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9327 ts_params->session_mpool, 9328 ts_params->session_priv_mpool); 9329 9330 if (!ut_params->sec_session) { 9331 printf("TestCase %s(%d) line %d: %s\n", 9332 __func__, i, __LINE__, "failed to allocate session"); 9333 ret = TEST_FAILED; 9334 goto on_err; 9335 } 9336 9337 /* Generate crypto op data structure */ 9338 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9339 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9340 if (!ut_params->op) { 9341 printf("TestCase %s(%d) line %d: %s\n", 9342 __func__, i, __LINE__, 9343 "failed to allocate symmetric crypto operation"); 9344 ret = TEST_FAILED; 9345 goto on_err; 9346 } 9347 9348 /* Setup CRC operation parameters */ 9349 crc_len = d_td->ciphertext.no_crc == false ? 9350 (d_td->ciphertext.len - 9351 d_td->ciphertext.crc_offset - 9352 RTE_ETHER_CRC_LEN) : 9353 0; 9354 crc_len = crc_len > 0 ? crc_len : 0; 9355 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 9356 ut_params->op->sym->auth.data.length = crc_len; 9357 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 9358 9359 /* Setup cipher operation parameters */ 9360 cipher_len = d_td->ciphertext.no_cipher == false ? 9361 (d_td->ciphertext.len - 9362 d_td->ciphertext.cipher_offset) : 9363 0; 9364 cipher_len = cipher_len > 0 ? cipher_len : 0; 9365 ut_params->op->sym->cipher.data.length = cipher_len; 9366 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 9367 9368 /* Setup cipher IV */ 9369 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9370 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9371 9372 /* Attach session to operation */ 9373 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9374 9375 /* Set crypto operation mbufs */ 9376 ut_params->op->sym->m_src = ut_params->ibuf; 9377 ut_params->op->sym->m_dst = NULL; 9378 9379 /* Process crypto operation */ 9380 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9381 NULL) { 9382 printf("TestCase %s(%d) line %d: %s\n", 9383 __func__, i, __LINE__, 9384 "failed to process security crypto op"); 9385 ret = TEST_FAILED; 9386 goto on_err; 9387 } 9388 9389 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9390 printf("TestCase %s(%d) line %d: %s\n", 9391 __func__, i, __LINE__, "crypto op processing failed"); 9392 ret = TEST_FAILED; 9393 goto on_err; 9394 } 9395 9396 /* Validate plaintext */ 9397 plaintext = ciphertext; 9398 9399 if (memcmp(plaintext, d_td->plaintext.data, 9400 d_td->plaintext.len - crc_data_len)) { 9401 printf("TestCase %s(%d) line %d: %s\n", 9402 __func__, i, __LINE__, "plaintext not as expected\n"); 9403 rte_hexdump(stdout, "expected", d_td->plaintext.data, 9404 d_td->plaintext.len); 9405 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 9406 ret = TEST_FAILED; 9407 goto on_err; 9408 } 9409 9410 on_err: 9411 rte_crypto_op_free(ut_params->op); 9412 ut_params->op = NULL; 9413 9414 if (ut_params->sec_session) 9415 rte_security_session_destroy(ctx, ut_params->sec_session); 9416 ut_params->sec_session = NULL; 9417 9418 rte_pktmbuf_free(ut_params->ibuf); 9419 ut_params->ibuf = NULL; 9420 9421 return ret; 9422 } 9423 9424 static int 9425 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td) 9426 { 9427 struct crypto_testsuite_params *ts_params = &testsuite_params; 9428 struct crypto_unittest_params *ut_params = &unittest_params; 9429 uint8_t *plaintext, *ciphertext; 9430 uint8_t *iv_ptr; 9431 int32_t cipher_len, crc_len; 9432 int ret = TEST_SUCCESS; 9433 9434 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9435 rte_cryptodev_get_sec_ctx( 9436 ts_params->valid_devs[0]); 9437 9438 /* Verify the capabilities */ 9439 struct rte_security_capability_idx sec_cap_idx; 9440 const struct rte_security_capability *sec_cap; 9441 const struct rte_cryptodev_capabilities *crypto_cap; 9442 const struct rte_cryptodev_symmetric_capability *sym_cap; 9443 int j = 0; 9444 9445 sec_cap_idx.action = ut_params->type; 9446 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 9447 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9448 9449 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9450 if (sec_cap == NULL) 9451 return TEST_SKIPPED; 9452 9453 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 9454 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 9455 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 9456 crypto_cap->sym.xform_type == 9457 RTE_CRYPTO_SYM_XFORM_CIPHER && 9458 crypto_cap->sym.cipher.algo == 9459 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 9460 sym_cap = &crypto_cap->sym; 9461 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 9462 d_td->key.len, 9463 d_td->iv.len) == 0) 9464 break; 9465 } 9466 } 9467 9468 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 9469 return TEST_SKIPPED; 9470 9471 /* Setup source mbuf payload */ 9472 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9473 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9474 rte_pktmbuf_tailroom(ut_params->ibuf)); 9475 9476 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9477 d_td->plaintext.len); 9478 9479 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 9480 9481 /* Setup cipher session parameters */ 9482 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9483 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 9484 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9485 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 9486 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 9487 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 9488 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9489 ut_params->cipher_xform.next = NULL; 9490 9491 /* Setup DOCSIS session parameters */ 9492 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9493 9494 struct rte_security_session_conf sess_conf = { 9495 .action_type = ut_params->type, 9496 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 9497 .docsis = ut_params->docsis_xform, 9498 .crypto_xform = &ut_params->cipher_xform, 9499 }; 9500 9501 /* Create security session */ 9502 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9503 ts_params->session_mpool, 9504 ts_params->session_priv_mpool); 9505 9506 if (!ut_params->sec_session) { 9507 printf("TestCase %s(%d) line %d: %s\n", 9508 __func__, i, __LINE__, "failed to allocate session"); 9509 ret = TEST_FAILED; 9510 goto on_err; 9511 } 9512 9513 /* Generate crypto op data structure */ 9514 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9515 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9516 if (!ut_params->op) { 9517 printf("TestCase %s(%d) line %d: %s\n", 9518 __func__, i, __LINE__, 9519 "failed to allocate security crypto operation"); 9520 ret = TEST_FAILED; 9521 goto on_err; 9522 } 9523 9524 /* Setup CRC operation parameters */ 9525 crc_len = d_td->plaintext.no_crc == false ? 9526 (d_td->plaintext.len - 9527 d_td->plaintext.crc_offset - 9528 RTE_ETHER_CRC_LEN) : 9529 0; 9530 crc_len = crc_len > 0 ? crc_len : 0; 9531 ut_params->op->sym->auth.data.length = crc_len; 9532 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 9533 9534 /* Setup cipher operation parameters */ 9535 cipher_len = d_td->plaintext.no_cipher == false ? 9536 (d_td->plaintext.len - 9537 d_td->plaintext.cipher_offset) : 9538 0; 9539 cipher_len = cipher_len > 0 ? cipher_len : 0; 9540 ut_params->op->sym->cipher.data.length = cipher_len; 9541 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 9542 9543 /* Setup cipher IV */ 9544 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9545 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9546 9547 /* Attach session to operation */ 9548 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9549 9550 /* Set crypto operation mbufs */ 9551 ut_params->op->sym->m_src = ut_params->ibuf; 9552 ut_params->op->sym->m_dst = NULL; 9553 9554 /* Process crypto operation */ 9555 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9556 NULL) { 9557 printf("TestCase %s(%d) line %d: %s\n", 9558 __func__, i, __LINE__, 9559 "failed to process security crypto op"); 9560 ret = TEST_FAILED; 9561 goto on_err; 9562 } 9563 9564 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9565 printf("TestCase %s(%d) line %d: %s\n", 9566 __func__, i, __LINE__, "crypto op processing failed"); 9567 ret = TEST_FAILED; 9568 goto on_err; 9569 } 9570 9571 /* Validate ciphertext */ 9572 ciphertext = plaintext; 9573 9574 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 9575 printf("TestCase %s(%d) line %d: %s\n", 9576 __func__, i, __LINE__, "ciphertext not as expected\n"); 9577 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 9578 d_td->ciphertext.len); 9579 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 9580 ret = TEST_FAILED; 9581 goto on_err; 9582 } 9583 9584 on_err: 9585 rte_crypto_op_free(ut_params->op); 9586 ut_params->op = NULL; 9587 9588 if (ut_params->sec_session) 9589 rte_security_session_destroy(ctx, ut_params->sec_session); 9590 ut_params->sec_session = NULL; 9591 9592 rte_pktmbuf_free(ut_params->ibuf); 9593 ut_params->ibuf = NULL; 9594 9595 return ret; 9596 } 9597 9598 #define TEST_DOCSIS_COUNT(func) do { \ 9599 int ret = func; \ 9600 if (ret == TEST_SUCCESS) { \ 9601 printf("\t%2d)", n++); \ 9602 printf("+++++ PASSED:" #func"\n"); \ 9603 p++; \ 9604 } else if (ret == TEST_SKIPPED) { \ 9605 printf("\t%2d)", n++); \ 9606 printf("~~~~~ SKIPPED:" #func"\n"); \ 9607 s++; \ 9608 } else { \ 9609 printf("\t%2d)", n++); \ 9610 printf("----- FAILED:" #func"\n"); \ 9611 f++; \ 9612 } \ 9613 } while (0) 9614 9615 static int 9616 test_DOCSIS_PROTO_uplink_all(void) 9617 { 9618 int p = 0, s = 0, f = 0, n = 0; 9619 9620 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1)); 9621 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2)); 9622 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3)); 9623 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4)); 9624 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5)); 9625 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6)); 9626 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7)); 9627 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8)); 9628 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9)); 9629 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10)); 9630 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11)); 9631 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12)); 9632 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13)); 9633 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14)); 9634 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15)); 9635 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16)); 9636 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17)); 9637 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18)); 9638 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19)); 9639 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20)); 9640 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21)); 9641 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22)); 9642 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23)); 9643 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24)); 9644 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25)); 9645 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26)); 9646 9647 if (f) 9648 printf("## %s: %d passed out of %d (%d skipped)\n", 9649 __func__, p, n, s); 9650 9651 return f; 9652 }; 9653 9654 static int 9655 test_DOCSIS_PROTO_downlink_all(void) 9656 { 9657 int p = 0, s = 0, f = 0, n = 0; 9658 9659 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1)); 9660 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2)); 9661 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3)); 9662 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4)); 9663 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5)); 9664 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6)); 9665 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7)); 9666 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8)); 9667 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9)); 9668 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10)); 9669 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11)); 9670 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12)); 9671 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13)); 9672 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14)); 9673 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15)); 9674 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16)); 9675 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17)); 9676 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18)); 9677 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19)); 9678 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20)); 9679 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21)); 9680 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22)); 9681 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23)); 9682 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24)); 9683 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25)); 9684 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26)); 9685 9686 if (f) 9687 printf("## %s: %d passed out of %d (%d skipped)\n", 9688 __func__, p, n, s); 9689 9690 return f; 9691 }; 9692 9693 static int 9694 test_DOCSIS_PROTO_all(void) 9695 { 9696 struct crypto_testsuite_params *ts_params = &testsuite_params; 9697 struct crypto_unittest_params *ut_params = &unittest_params; 9698 struct rte_cryptodev_info dev_info; 9699 int status; 9700 9701 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9702 uint64_t feat_flags = dev_info.feature_flags; 9703 9704 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 9705 return TEST_SKIPPED; 9706 9707 /* Set action type */ 9708 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9709 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9710 gbl_action_type; 9711 9712 if (security_proto_supported(ut_params->type, 9713 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 9714 return TEST_SKIPPED; 9715 9716 status = test_DOCSIS_PROTO_uplink_all(); 9717 status += test_DOCSIS_PROTO_downlink_all(); 9718 9719 if (status) 9720 return TEST_FAILED; 9721 else 9722 return TEST_SUCCESS; 9723 } 9724 #endif 9725 9726 static int 9727 test_AES_GCM_authenticated_encryption_test_case_1(void) 9728 { 9729 return test_authenticated_encryption(&gcm_test_case_1); 9730 } 9731 9732 static int 9733 test_AES_GCM_authenticated_encryption_test_case_2(void) 9734 { 9735 return test_authenticated_encryption(&gcm_test_case_2); 9736 } 9737 9738 static int 9739 test_AES_GCM_authenticated_encryption_test_case_3(void) 9740 { 9741 return test_authenticated_encryption(&gcm_test_case_3); 9742 } 9743 9744 static int 9745 test_AES_GCM_authenticated_encryption_test_case_4(void) 9746 { 9747 return test_authenticated_encryption(&gcm_test_case_4); 9748 } 9749 9750 static int 9751 test_AES_GCM_authenticated_encryption_test_case_5(void) 9752 { 9753 return test_authenticated_encryption(&gcm_test_case_5); 9754 } 9755 9756 static int 9757 test_AES_GCM_authenticated_encryption_test_case_6(void) 9758 { 9759 return test_authenticated_encryption(&gcm_test_case_6); 9760 } 9761 9762 static int 9763 test_AES_GCM_authenticated_encryption_test_case_7(void) 9764 { 9765 return test_authenticated_encryption(&gcm_test_case_7); 9766 } 9767 9768 static int 9769 test_AES_GCM_authenticated_encryption_test_case_8(void) 9770 { 9771 return test_authenticated_encryption(&gcm_test_case_8); 9772 } 9773 9774 static int 9775 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 9776 { 9777 return test_authenticated_encryption(&gcm_J0_test_case_1); 9778 } 9779 9780 static int 9781 test_AES_GCM_auth_encryption_test_case_192_1(void) 9782 { 9783 return test_authenticated_encryption(&gcm_test_case_192_1); 9784 } 9785 9786 static int 9787 test_AES_GCM_auth_encryption_test_case_192_2(void) 9788 { 9789 return test_authenticated_encryption(&gcm_test_case_192_2); 9790 } 9791 9792 static int 9793 test_AES_GCM_auth_encryption_test_case_192_3(void) 9794 { 9795 return test_authenticated_encryption(&gcm_test_case_192_3); 9796 } 9797 9798 static int 9799 test_AES_GCM_auth_encryption_test_case_192_4(void) 9800 { 9801 return test_authenticated_encryption(&gcm_test_case_192_4); 9802 } 9803 9804 static int 9805 test_AES_GCM_auth_encryption_test_case_192_5(void) 9806 { 9807 return test_authenticated_encryption(&gcm_test_case_192_5); 9808 } 9809 9810 static int 9811 test_AES_GCM_auth_encryption_test_case_192_6(void) 9812 { 9813 return test_authenticated_encryption(&gcm_test_case_192_6); 9814 } 9815 9816 static int 9817 test_AES_GCM_auth_encryption_test_case_192_7(void) 9818 { 9819 return test_authenticated_encryption(&gcm_test_case_192_7); 9820 } 9821 9822 static int 9823 test_AES_GCM_auth_encryption_test_case_256_1(void) 9824 { 9825 return test_authenticated_encryption(&gcm_test_case_256_1); 9826 } 9827 9828 static int 9829 test_AES_GCM_auth_encryption_test_case_256_2(void) 9830 { 9831 return test_authenticated_encryption(&gcm_test_case_256_2); 9832 } 9833 9834 static int 9835 test_AES_GCM_auth_encryption_test_case_256_3(void) 9836 { 9837 return test_authenticated_encryption(&gcm_test_case_256_3); 9838 } 9839 9840 static int 9841 test_AES_GCM_auth_encryption_test_case_256_4(void) 9842 { 9843 return test_authenticated_encryption(&gcm_test_case_256_4); 9844 } 9845 9846 static int 9847 test_AES_GCM_auth_encryption_test_case_256_5(void) 9848 { 9849 return test_authenticated_encryption(&gcm_test_case_256_5); 9850 } 9851 9852 static int 9853 test_AES_GCM_auth_encryption_test_case_256_6(void) 9854 { 9855 return test_authenticated_encryption(&gcm_test_case_256_6); 9856 } 9857 9858 static int 9859 test_AES_GCM_auth_encryption_test_case_256_7(void) 9860 { 9861 return test_authenticated_encryption(&gcm_test_case_256_7); 9862 } 9863 9864 static int 9865 test_AES_GCM_auth_encryption_test_case_aad_1(void) 9866 { 9867 return test_authenticated_encryption(&gcm_test_case_aad_1); 9868 } 9869 9870 static int 9871 test_AES_GCM_auth_encryption_test_case_aad_2(void) 9872 { 9873 return test_authenticated_encryption(&gcm_test_case_aad_2); 9874 } 9875 9876 static int 9877 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 9878 { 9879 struct aead_test_data tdata; 9880 int res; 9881 9882 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9883 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9884 tdata.iv.data[0] += 1; 9885 res = test_authenticated_encryption(&tdata); 9886 if (res == TEST_SKIPPED) 9887 return res; 9888 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9889 return TEST_SUCCESS; 9890 } 9891 9892 static int 9893 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 9894 { 9895 struct aead_test_data tdata; 9896 int res; 9897 9898 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9899 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9900 tdata.plaintext.data[0] += 1; 9901 res = test_authenticated_encryption(&tdata); 9902 if (res == TEST_SKIPPED) 9903 return res; 9904 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9905 return TEST_SUCCESS; 9906 } 9907 9908 static int 9909 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 9910 { 9911 struct aead_test_data tdata; 9912 int res; 9913 9914 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9915 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9916 tdata.ciphertext.data[0] += 1; 9917 res = test_authenticated_encryption(&tdata); 9918 if (res == TEST_SKIPPED) 9919 return res; 9920 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9921 return TEST_SUCCESS; 9922 } 9923 9924 static int 9925 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 9926 { 9927 struct aead_test_data tdata; 9928 int res; 9929 9930 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9931 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9932 tdata.aad.len += 1; 9933 res = test_authenticated_encryption(&tdata); 9934 if (res == TEST_SKIPPED) 9935 return res; 9936 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9937 return TEST_SUCCESS; 9938 } 9939 9940 static int 9941 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 9942 { 9943 struct aead_test_data tdata; 9944 uint8_t aad[gcm_test_case_7.aad.len]; 9945 int res; 9946 9947 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9948 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9949 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9950 aad[0] += 1; 9951 tdata.aad.data = aad; 9952 res = test_authenticated_encryption(&tdata); 9953 if (res == TEST_SKIPPED) 9954 return res; 9955 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9956 return TEST_SUCCESS; 9957 } 9958 9959 static int 9960 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 9961 { 9962 struct aead_test_data tdata; 9963 int res; 9964 9965 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9966 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9967 tdata.auth_tag.data[0] += 1; 9968 res = test_authenticated_encryption(&tdata); 9969 if (res == TEST_SKIPPED) 9970 return res; 9971 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9972 return TEST_SUCCESS; 9973 } 9974 9975 static int 9976 test_authenticated_decryption(const struct aead_test_data *tdata) 9977 { 9978 struct crypto_testsuite_params *ts_params = &testsuite_params; 9979 struct crypto_unittest_params *ut_params = &unittest_params; 9980 9981 int retval; 9982 uint8_t *plaintext; 9983 uint32_t i; 9984 struct rte_cryptodev_info dev_info; 9985 9986 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9987 uint64_t feat_flags = dev_info.feature_flags; 9988 9989 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9990 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9991 printf("Device doesn't support RAW data-path APIs.\n"); 9992 return TEST_SKIPPED; 9993 } 9994 9995 /* Verify the capabilities */ 9996 struct rte_cryptodev_sym_capability_idx cap_idx; 9997 const struct rte_cryptodev_symmetric_capability *capability; 9998 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9999 cap_idx.algo.aead = tdata->algo; 10000 capability = rte_cryptodev_sym_capability_get( 10001 ts_params->valid_devs[0], &cap_idx); 10002 if (capability == NULL) 10003 return TEST_SKIPPED; 10004 if (rte_cryptodev_sym_capability_check_aead( 10005 capability, tdata->key.len, tdata->auth_tag.len, 10006 tdata->aad.len, tdata->iv.len)) 10007 return TEST_SKIPPED; 10008 10009 /* Create AEAD session */ 10010 retval = create_aead_session(ts_params->valid_devs[0], 10011 tdata->algo, 10012 RTE_CRYPTO_AEAD_OP_DECRYPT, 10013 tdata->key.data, tdata->key.len, 10014 tdata->aad.len, tdata->auth_tag.len, 10015 tdata->iv.len); 10016 if (retval < 0) 10017 return retval; 10018 10019 /* alloc mbuf and set payload */ 10020 if (tdata->aad.len > MBUF_SIZE) { 10021 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 10022 /* Populate full size of add data */ 10023 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 10024 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 10025 } else 10026 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10027 10028 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10029 rte_pktmbuf_tailroom(ut_params->ibuf)); 10030 10031 /* Create AEAD operation */ 10032 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10033 if (retval < 0) 10034 return retval; 10035 10036 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10037 10038 ut_params->op->sym->m_src = ut_params->ibuf; 10039 10040 /* Process crypto operation */ 10041 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10042 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 10043 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10044 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10045 ut_params->op, 0, 0, 0, 0); 10046 else 10047 TEST_ASSERT_NOT_NULL( 10048 process_crypto_request(ts_params->valid_devs[0], 10049 ut_params->op), "failed to process sym crypto op"); 10050 10051 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10052 "crypto op processing failed"); 10053 10054 if (ut_params->op->sym->m_dst) 10055 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 10056 uint8_t *); 10057 else 10058 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 10059 uint8_t *, 10060 ut_params->op->sym->cipher.data.offset); 10061 10062 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10063 10064 /* Validate obuf */ 10065 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10066 plaintext, 10067 tdata->plaintext.data, 10068 tdata->plaintext.len, 10069 "Plaintext data not as expected"); 10070 10071 TEST_ASSERT_EQUAL(ut_params->op->status, 10072 RTE_CRYPTO_OP_STATUS_SUCCESS, 10073 "Authentication failed"); 10074 10075 return 0; 10076 } 10077 10078 static int 10079 test_AES_GCM_authenticated_decryption_test_case_1(void) 10080 { 10081 return test_authenticated_decryption(&gcm_test_case_1); 10082 } 10083 10084 static int 10085 test_AES_GCM_authenticated_decryption_test_case_2(void) 10086 { 10087 return test_authenticated_decryption(&gcm_test_case_2); 10088 } 10089 10090 static int 10091 test_AES_GCM_authenticated_decryption_test_case_3(void) 10092 { 10093 return test_authenticated_decryption(&gcm_test_case_3); 10094 } 10095 10096 static int 10097 test_AES_GCM_authenticated_decryption_test_case_4(void) 10098 { 10099 return test_authenticated_decryption(&gcm_test_case_4); 10100 } 10101 10102 static int 10103 test_AES_GCM_authenticated_decryption_test_case_5(void) 10104 { 10105 return test_authenticated_decryption(&gcm_test_case_5); 10106 } 10107 10108 static int 10109 test_AES_GCM_authenticated_decryption_test_case_6(void) 10110 { 10111 return test_authenticated_decryption(&gcm_test_case_6); 10112 } 10113 10114 static int 10115 test_AES_GCM_authenticated_decryption_test_case_7(void) 10116 { 10117 return test_authenticated_decryption(&gcm_test_case_7); 10118 } 10119 10120 static int 10121 test_AES_GCM_authenticated_decryption_test_case_8(void) 10122 { 10123 return test_authenticated_decryption(&gcm_test_case_8); 10124 } 10125 10126 static int 10127 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 10128 { 10129 return test_authenticated_decryption(&gcm_J0_test_case_1); 10130 } 10131 10132 static int 10133 test_AES_GCM_auth_decryption_test_case_192_1(void) 10134 { 10135 return test_authenticated_decryption(&gcm_test_case_192_1); 10136 } 10137 10138 static int 10139 test_AES_GCM_auth_decryption_test_case_192_2(void) 10140 { 10141 return test_authenticated_decryption(&gcm_test_case_192_2); 10142 } 10143 10144 static int 10145 test_AES_GCM_auth_decryption_test_case_192_3(void) 10146 { 10147 return test_authenticated_decryption(&gcm_test_case_192_3); 10148 } 10149 10150 static int 10151 test_AES_GCM_auth_decryption_test_case_192_4(void) 10152 { 10153 return test_authenticated_decryption(&gcm_test_case_192_4); 10154 } 10155 10156 static int 10157 test_AES_GCM_auth_decryption_test_case_192_5(void) 10158 { 10159 return test_authenticated_decryption(&gcm_test_case_192_5); 10160 } 10161 10162 static int 10163 test_AES_GCM_auth_decryption_test_case_192_6(void) 10164 { 10165 return test_authenticated_decryption(&gcm_test_case_192_6); 10166 } 10167 10168 static int 10169 test_AES_GCM_auth_decryption_test_case_192_7(void) 10170 { 10171 return test_authenticated_decryption(&gcm_test_case_192_7); 10172 } 10173 10174 static int 10175 test_AES_GCM_auth_decryption_test_case_256_1(void) 10176 { 10177 return test_authenticated_decryption(&gcm_test_case_256_1); 10178 } 10179 10180 static int 10181 test_AES_GCM_auth_decryption_test_case_256_2(void) 10182 { 10183 return test_authenticated_decryption(&gcm_test_case_256_2); 10184 } 10185 10186 static int 10187 test_AES_GCM_auth_decryption_test_case_256_3(void) 10188 { 10189 return test_authenticated_decryption(&gcm_test_case_256_3); 10190 } 10191 10192 static int 10193 test_AES_GCM_auth_decryption_test_case_256_4(void) 10194 { 10195 return test_authenticated_decryption(&gcm_test_case_256_4); 10196 } 10197 10198 static int 10199 test_AES_GCM_auth_decryption_test_case_256_5(void) 10200 { 10201 return test_authenticated_decryption(&gcm_test_case_256_5); 10202 } 10203 10204 static int 10205 test_AES_GCM_auth_decryption_test_case_256_6(void) 10206 { 10207 return test_authenticated_decryption(&gcm_test_case_256_6); 10208 } 10209 10210 static int 10211 test_AES_GCM_auth_decryption_test_case_256_7(void) 10212 { 10213 return test_authenticated_decryption(&gcm_test_case_256_7); 10214 } 10215 10216 static int 10217 test_AES_GCM_auth_decryption_test_case_aad_1(void) 10218 { 10219 return test_authenticated_decryption(&gcm_test_case_aad_1); 10220 } 10221 10222 static int 10223 test_AES_GCM_auth_decryption_test_case_aad_2(void) 10224 { 10225 return test_authenticated_decryption(&gcm_test_case_aad_2); 10226 } 10227 10228 static int 10229 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 10230 { 10231 struct aead_test_data tdata; 10232 int res; 10233 10234 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10235 tdata.iv.data[0] += 1; 10236 res = test_authenticated_decryption(&tdata); 10237 if (res == TEST_SKIPPED) 10238 return res; 10239 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10240 return TEST_SUCCESS; 10241 } 10242 10243 static int 10244 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 10245 { 10246 struct aead_test_data tdata; 10247 int res; 10248 10249 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 10250 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10251 tdata.plaintext.data[0] += 1; 10252 res = test_authenticated_decryption(&tdata); 10253 if (res == TEST_SKIPPED) 10254 return res; 10255 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10256 return TEST_SUCCESS; 10257 } 10258 10259 static int 10260 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 10261 { 10262 struct aead_test_data tdata; 10263 int res; 10264 10265 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10266 tdata.ciphertext.data[0] += 1; 10267 res = test_authenticated_decryption(&tdata); 10268 if (res == TEST_SKIPPED) 10269 return res; 10270 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10271 return TEST_SUCCESS; 10272 } 10273 10274 static int 10275 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 10276 { 10277 struct aead_test_data tdata; 10278 int res; 10279 10280 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10281 tdata.aad.len += 1; 10282 res = test_authenticated_decryption(&tdata); 10283 if (res == TEST_SKIPPED) 10284 return res; 10285 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10286 return TEST_SUCCESS; 10287 } 10288 10289 static int 10290 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 10291 { 10292 struct aead_test_data tdata; 10293 uint8_t aad[gcm_test_case_7.aad.len]; 10294 int res; 10295 10296 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10297 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 10298 aad[0] += 1; 10299 tdata.aad.data = aad; 10300 res = test_authenticated_decryption(&tdata); 10301 if (res == TEST_SKIPPED) 10302 return res; 10303 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 10304 return TEST_SUCCESS; 10305 } 10306 10307 static int 10308 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 10309 { 10310 struct aead_test_data tdata; 10311 int res; 10312 10313 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 10314 tdata.auth_tag.data[0] += 1; 10315 res = test_authenticated_decryption(&tdata); 10316 if (res == TEST_SKIPPED) 10317 return res; 10318 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 10319 return TEST_SUCCESS; 10320 } 10321 10322 static int 10323 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 10324 { 10325 struct crypto_testsuite_params *ts_params = &testsuite_params; 10326 struct crypto_unittest_params *ut_params = &unittest_params; 10327 10328 int retval; 10329 uint8_t *ciphertext, *auth_tag; 10330 uint16_t plaintext_pad_len; 10331 10332 /* Verify the capabilities */ 10333 struct rte_cryptodev_sym_capability_idx cap_idx; 10334 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10335 cap_idx.algo.aead = tdata->algo; 10336 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10337 &cap_idx) == NULL) 10338 return TEST_SKIPPED; 10339 10340 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10341 return TEST_SKIPPED; 10342 10343 /* not supported with CPU crypto */ 10344 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10345 return TEST_SKIPPED; 10346 10347 /* Create AEAD session */ 10348 retval = create_aead_session(ts_params->valid_devs[0], 10349 tdata->algo, 10350 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10351 tdata->key.data, tdata->key.len, 10352 tdata->aad.len, tdata->auth_tag.len, 10353 tdata->iv.len); 10354 if (retval < 0) 10355 return retval; 10356 10357 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10358 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10359 10360 /* clear mbuf payload */ 10361 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10362 rte_pktmbuf_tailroom(ut_params->ibuf)); 10363 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10364 rte_pktmbuf_tailroom(ut_params->obuf)); 10365 10366 /* Create AEAD operation */ 10367 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10368 if (retval < 0) 10369 return retval; 10370 10371 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10372 10373 ut_params->op->sym->m_src = ut_params->ibuf; 10374 ut_params->op->sym->m_dst = ut_params->obuf; 10375 10376 /* Process crypto operation */ 10377 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10378 ut_params->op), "failed to process sym crypto op"); 10379 10380 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10381 "crypto op processing failed"); 10382 10383 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10384 10385 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10386 ut_params->op->sym->cipher.data.offset); 10387 auth_tag = ciphertext + plaintext_pad_len; 10388 10389 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10390 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10391 10392 /* Validate obuf */ 10393 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10394 ciphertext, 10395 tdata->ciphertext.data, 10396 tdata->ciphertext.len, 10397 "Ciphertext data not as expected"); 10398 10399 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10400 auth_tag, 10401 tdata->auth_tag.data, 10402 tdata->auth_tag.len, 10403 "Generated auth tag not as expected"); 10404 10405 return 0; 10406 10407 } 10408 10409 static int 10410 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 10411 { 10412 return test_authenticated_encryption_oop(&gcm_test_case_5); 10413 } 10414 10415 static int 10416 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 10417 { 10418 struct crypto_testsuite_params *ts_params = &testsuite_params; 10419 struct crypto_unittest_params *ut_params = &unittest_params; 10420 10421 int retval; 10422 uint8_t *plaintext; 10423 10424 /* Verify the capabilities */ 10425 struct rte_cryptodev_sym_capability_idx cap_idx; 10426 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10427 cap_idx.algo.aead = tdata->algo; 10428 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10429 &cap_idx) == NULL) 10430 return TEST_SKIPPED; 10431 10432 /* not supported with CPU crypto and raw data-path APIs*/ 10433 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 10434 global_api_test_type == CRYPTODEV_RAW_API_TEST) 10435 return TEST_SKIPPED; 10436 10437 /* Create AEAD session */ 10438 retval = create_aead_session(ts_params->valid_devs[0], 10439 tdata->algo, 10440 RTE_CRYPTO_AEAD_OP_DECRYPT, 10441 tdata->key.data, tdata->key.len, 10442 tdata->aad.len, tdata->auth_tag.len, 10443 tdata->iv.len); 10444 if (retval < 0) 10445 return retval; 10446 10447 /* alloc mbuf and set payload */ 10448 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10449 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10450 10451 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10452 rte_pktmbuf_tailroom(ut_params->ibuf)); 10453 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10454 rte_pktmbuf_tailroom(ut_params->obuf)); 10455 10456 /* Create AEAD operation */ 10457 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10458 if (retval < 0) 10459 return retval; 10460 10461 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10462 10463 ut_params->op->sym->m_src = ut_params->ibuf; 10464 ut_params->op->sym->m_dst = ut_params->obuf; 10465 10466 /* Process crypto operation */ 10467 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10468 ut_params->op), "failed to process sym crypto op"); 10469 10470 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10471 "crypto op processing failed"); 10472 10473 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10474 ut_params->op->sym->cipher.data.offset); 10475 10476 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10477 10478 /* Validate obuf */ 10479 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10480 plaintext, 10481 tdata->plaintext.data, 10482 tdata->plaintext.len, 10483 "Plaintext data not as expected"); 10484 10485 TEST_ASSERT_EQUAL(ut_params->op->status, 10486 RTE_CRYPTO_OP_STATUS_SUCCESS, 10487 "Authentication failed"); 10488 return 0; 10489 } 10490 10491 static int 10492 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 10493 { 10494 return test_authenticated_decryption_oop(&gcm_test_case_5); 10495 } 10496 10497 static int 10498 test_authenticated_encryption_sessionless( 10499 const struct aead_test_data *tdata) 10500 { 10501 struct crypto_testsuite_params *ts_params = &testsuite_params; 10502 struct crypto_unittest_params *ut_params = &unittest_params; 10503 10504 int retval; 10505 uint8_t *ciphertext, *auth_tag; 10506 uint16_t plaintext_pad_len; 10507 uint8_t key[tdata->key.len + 1]; 10508 struct rte_cryptodev_info dev_info; 10509 10510 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10511 uint64_t feat_flags = dev_info.feature_flags; 10512 10513 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10514 printf("Device doesn't support Sessionless ops.\n"); 10515 return TEST_SKIPPED; 10516 } 10517 10518 /* not supported with CPU crypto */ 10519 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10520 return TEST_SKIPPED; 10521 10522 /* Verify the capabilities */ 10523 struct rte_cryptodev_sym_capability_idx cap_idx; 10524 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10525 cap_idx.algo.aead = tdata->algo; 10526 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10527 &cap_idx) == NULL) 10528 return TEST_SKIPPED; 10529 10530 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10531 10532 /* clear mbuf payload */ 10533 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10534 rte_pktmbuf_tailroom(ut_params->ibuf)); 10535 10536 /* Create AEAD operation */ 10537 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10538 if (retval < 0) 10539 return retval; 10540 10541 /* Create GCM xform */ 10542 memcpy(key, tdata->key.data, tdata->key.len); 10543 retval = create_aead_xform(ut_params->op, 10544 tdata->algo, 10545 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10546 key, tdata->key.len, 10547 tdata->aad.len, tdata->auth_tag.len, 10548 tdata->iv.len); 10549 if (retval < 0) 10550 return retval; 10551 10552 ut_params->op->sym->m_src = ut_params->ibuf; 10553 10554 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10555 RTE_CRYPTO_OP_SESSIONLESS, 10556 "crypto op session type not sessionless"); 10557 10558 /* Process crypto operation */ 10559 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10560 ut_params->op), "failed to process sym crypto op"); 10561 10562 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10563 10564 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10565 "crypto op status not success"); 10566 10567 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10568 10569 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10570 ut_params->op->sym->cipher.data.offset); 10571 auth_tag = ciphertext + plaintext_pad_len; 10572 10573 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10574 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10575 10576 /* Validate obuf */ 10577 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10578 ciphertext, 10579 tdata->ciphertext.data, 10580 tdata->ciphertext.len, 10581 "Ciphertext data not as expected"); 10582 10583 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10584 auth_tag, 10585 tdata->auth_tag.data, 10586 tdata->auth_tag.len, 10587 "Generated auth tag not as expected"); 10588 10589 return 0; 10590 10591 } 10592 10593 static int 10594 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 10595 { 10596 return test_authenticated_encryption_sessionless( 10597 &gcm_test_case_5); 10598 } 10599 10600 static int 10601 test_authenticated_decryption_sessionless( 10602 const struct aead_test_data *tdata) 10603 { 10604 struct crypto_testsuite_params *ts_params = &testsuite_params; 10605 struct crypto_unittest_params *ut_params = &unittest_params; 10606 10607 int retval; 10608 uint8_t *plaintext; 10609 uint8_t key[tdata->key.len + 1]; 10610 struct rte_cryptodev_info dev_info; 10611 10612 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10613 uint64_t feat_flags = dev_info.feature_flags; 10614 10615 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10616 printf("Device doesn't support Sessionless ops.\n"); 10617 return TEST_SKIPPED; 10618 } 10619 10620 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10621 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10622 printf("Device doesn't support RAW data-path APIs.\n"); 10623 return TEST_SKIPPED; 10624 } 10625 10626 /* not supported with CPU crypto */ 10627 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10628 return TEST_SKIPPED; 10629 10630 /* Verify the capabilities */ 10631 struct rte_cryptodev_sym_capability_idx cap_idx; 10632 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10633 cap_idx.algo.aead = tdata->algo; 10634 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10635 &cap_idx) == NULL) 10636 return TEST_SKIPPED; 10637 10638 /* alloc mbuf and set payload */ 10639 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10640 10641 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10642 rte_pktmbuf_tailroom(ut_params->ibuf)); 10643 10644 /* Create AEAD operation */ 10645 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10646 if (retval < 0) 10647 return retval; 10648 10649 /* Create AEAD xform */ 10650 memcpy(key, tdata->key.data, tdata->key.len); 10651 retval = create_aead_xform(ut_params->op, 10652 tdata->algo, 10653 RTE_CRYPTO_AEAD_OP_DECRYPT, 10654 key, tdata->key.len, 10655 tdata->aad.len, tdata->auth_tag.len, 10656 tdata->iv.len); 10657 if (retval < 0) 10658 return retval; 10659 10660 ut_params->op->sym->m_src = ut_params->ibuf; 10661 10662 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10663 RTE_CRYPTO_OP_SESSIONLESS, 10664 "crypto op session type not sessionless"); 10665 10666 /* Process crypto operation */ 10667 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10668 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10669 ut_params->op, 0, 0, 0, 0); 10670 else 10671 TEST_ASSERT_NOT_NULL(process_crypto_request( 10672 ts_params->valid_devs[0], ut_params->op), 10673 "failed to process sym crypto op"); 10674 10675 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10676 10677 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10678 "crypto op status not success"); 10679 10680 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10681 ut_params->op->sym->cipher.data.offset); 10682 10683 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10684 10685 /* Validate obuf */ 10686 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10687 plaintext, 10688 tdata->plaintext.data, 10689 tdata->plaintext.len, 10690 "Plaintext data not as expected"); 10691 10692 TEST_ASSERT_EQUAL(ut_params->op->status, 10693 RTE_CRYPTO_OP_STATUS_SUCCESS, 10694 "Authentication failed"); 10695 return 0; 10696 } 10697 10698 static int 10699 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 10700 { 10701 return test_authenticated_decryption_sessionless( 10702 &gcm_test_case_5); 10703 } 10704 10705 static int 10706 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 10707 { 10708 return test_authenticated_encryption(&ccm_test_case_128_1); 10709 } 10710 10711 static int 10712 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 10713 { 10714 return test_authenticated_encryption(&ccm_test_case_128_2); 10715 } 10716 10717 static int 10718 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 10719 { 10720 return test_authenticated_encryption(&ccm_test_case_128_3); 10721 } 10722 10723 static int 10724 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 10725 { 10726 return test_authenticated_decryption(&ccm_test_case_128_1); 10727 } 10728 10729 static int 10730 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 10731 { 10732 return test_authenticated_decryption(&ccm_test_case_128_2); 10733 } 10734 10735 static int 10736 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 10737 { 10738 return test_authenticated_decryption(&ccm_test_case_128_3); 10739 } 10740 10741 static int 10742 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 10743 { 10744 return test_authenticated_encryption(&ccm_test_case_192_1); 10745 } 10746 10747 static int 10748 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 10749 { 10750 return test_authenticated_encryption(&ccm_test_case_192_2); 10751 } 10752 10753 static int 10754 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 10755 { 10756 return test_authenticated_encryption(&ccm_test_case_192_3); 10757 } 10758 10759 static int 10760 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 10761 { 10762 return test_authenticated_decryption(&ccm_test_case_192_1); 10763 } 10764 10765 static int 10766 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 10767 { 10768 return test_authenticated_decryption(&ccm_test_case_192_2); 10769 } 10770 10771 static int 10772 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 10773 { 10774 return test_authenticated_decryption(&ccm_test_case_192_3); 10775 } 10776 10777 static int 10778 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 10779 { 10780 return test_authenticated_encryption(&ccm_test_case_256_1); 10781 } 10782 10783 static int 10784 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 10785 { 10786 return test_authenticated_encryption(&ccm_test_case_256_2); 10787 } 10788 10789 static int 10790 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 10791 { 10792 return test_authenticated_encryption(&ccm_test_case_256_3); 10793 } 10794 10795 static int 10796 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 10797 { 10798 return test_authenticated_decryption(&ccm_test_case_256_1); 10799 } 10800 10801 static int 10802 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 10803 { 10804 return test_authenticated_decryption(&ccm_test_case_256_2); 10805 } 10806 10807 static int 10808 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 10809 { 10810 return test_authenticated_decryption(&ccm_test_case_256_3); 10811 } 10812 10813 static int 10814 test_stats(void) 10815 { 10816 struct crypto_testsuite_params *ts_params = &testsuite_params; 10817 struct rte_cryptodev_stats stats; 10818 10819 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10820 return TEST_SKIPPED; 10821 10822 /* Verify the capabilities */ 10823 struct rte_cryptodev_sym_capability_idx cap_idx; 10824 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10825 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 10826 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10827 &cap_idx) == NULL) 10828 return TEST_SKIPPED; 10829 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10830 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10831 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10832 &cap_idx) == NULL) 10833 return TEST_SKIPPED; 10834 10835 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 10836 == -ENOTSUP) 10837 return TEST_SKIPPED; 10838 10839 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10840 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 10841 &stats) == -ENODEV), 10842 "rte_cryptodev_stats_get invalid dev failed"); 10843 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 10844 "rte_cryptodev_stats_get invalid Param failed"); 10845 10846 /* Test expected values */ 10847 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 10848 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10849 &stats), 10850 "rte_cryptodev_stats_get failed"); 10851 TEST_ASSERT((stats.enqueued_count == 1), 10852 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10853 TEST_ASSERT((stats.dequeued_count == 1), 10854 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10855 TEST_ASSERT((stats.enqueue_err_count == 0), 10856 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10857 TEST_ASSERT((stats.dequeue_err_count == 0), 10858 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10859 10860 /* invalid device but should ignore and not reset device stats*/ 10861 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 10862 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10863 &stats), 10864 "rte_cryptodev_stats_get failed"); 10865 TEST_ASSERT((stats.enqueued_count == 1), 10866 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10867 10868 /* check that a valid reset clears stats */ 10869 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10870 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10871 &stats), 10872 "rte_cryptodev_stats_get failed"); 10873 TEST_ASSERT((stats.enqueued_count == 0), 10874 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10875 TEST_ASSERT((stats.dequeued_count == 0), 10876 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10877 10878 return TEST_SUCCESS; 10879 } 10880 10881 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 10882 struct crypto_unittest_params *ut_params, 10883 enum rte_crypto_auth_operation op, 10884 const struct HMAC_MD5_vector *test_case) 10885 { 10886 uint8_t key[64]; 10887 10888 memcpy(key, test_case->key.data, test_case->key.len); 10889 10890 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10891 ut_params->auth_xform.next = NULL; 10892 ut_params->auth_xform.auth.op = op; 10893 10894 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 10895 10896 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 10897 ut_params->auth_xform.auth.key.length = test_case->key.len; 10898 ut_params->auth_xform.auth.key.data = key; 10899 10900 ut_params->sess = rte_cryptodev_sym_session_create( 10901 ts_params->session_mpool); 10902 10903 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10904 ut_params->sess, &ut_params->auth_xform, 10905 ts_params->session_priv_mpool); 10906 10907 if (ut_params->sess == NULL) 10908 return TEST_FAILED; 10909 10910 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10911 10912 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10913 rte_pktmbuf_tailroom(ut_params->ibuf)); 10914 10915 return 0; 10916 } 10917 10918 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 10919 const struct HMAC_MD5_vector *test_case, 10920 uint8_t **plaintext) 10921 { 10922 uint16_t plaintext_pad_len; 10923 10924 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10925 10926 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10927 16); 10928 10929 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10930 plaintext_pad_len); 10931 memcpy(*plaintext, test_case->plaintext.data, 10932 test_case->plaintext.len); 10933 10934 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10935 ut_params->ibuf, MD5_DIGEST_LEN); 10936 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10937 "no room to append digest"); 10938 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10939 ut_params->ibuf, plaintext_pad_len); 10940 10941 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10942 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 10943 test_case->auth_tag.len); 10944 } 10945 10946 sym_op->auth.data.offset = 0; 10947 sym_op->auth.data.length = test_case->plaintext.len; 10948 10949 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10950 ut_params->op->sym->m_src = ut_params->ibuf; 10951 10952 return 0; 10953 } 10954 10955 static int 10956 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 10957 { 10958 uint16_t plaintext_pad_len; 10959 uint8_t *plaintext, *auth_tag; 10960 10961 struct crypto_testsuite_params *ts_params = &testsuite_params; 10962 struct crypto_unittest_params *ut_params = &unittest_params; 10963 struct rte_cryptodev_info dev_info; 10964 10965 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10966 uint64_t feat_flags = dev_info.feature_flags; 10967 10968 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10969 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10970 printf("Device doesn't support RAW data-path APIs.\n"); 10971 return TEST_SKIPPED; 10972 } 10973 10974 /* Verify the capabilities */ 10975 struct rte_cryptodev_sym_capability_idx cap_idx; 10976 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10977 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10978 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10979 &cap_idx) == NULL) 10980 return TEST_SKIPPED; 10981 10982 if (MD5_HMAC_create_session(ts_params, ut_params, 10983 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 10984 return TEST_FAILED; 10985 10986 /* Generate Crypto op data structure */ 10987 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10988 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10989 TEST_ASSERT_NOT_NULL(ut_params->op, 10990 "Failed to allocate symmetric crypto operation struct"); 10991 10992 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10993 16); 10994 10995 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10996 return TEST_FAILED; 10997 10998 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10999 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11000 ut_params->op); 11001 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11002 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11003 ut_params->op, 0, 1, 0, 0); 11004 else 11005 TEST_ASSERT_NOT_NULL( 11006 process_crypto_request(ts_params->valid_devs[0], 11007 ut_params->op), 11008 "failed to process sym crypto op"); 11009 11010 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11011 "crypto op processing failed"); 11012 11013 if (ut_params->op->sym->m_dst) { 11014 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11015 uint8_t *, plaintext_pad_len); 11016 } else { 11017 auth_tag = plaintext + plaintext_pad_len; 11018 } 11019 11020 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11021 auth_tag, 11022 test_case->auth_tag.data, 11023 test_case->auth_tag.len, 11024 "HMAC_MD5 generated tag not as expected"); 11025 11026 return TEST_SUCCESS; 11027 } 11028 11029 static int 11030 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 11031 { 11032 uint8_t *plaintext; 11033 11034 struct crypto_testsuite_params *ts_params = &testsuite_params; 11035 struct crypto_unittest_params *ut_params = &unittest_params; 11036 struct rte_cryptodev_info dev_info; 11037 11038 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11039 uint64_t feat_flags = dev_info.feature_flags; 11040 11041 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11042 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11043 printf("Device doesn't support RAW data-path APIs.\n"); 11044 return TEST_SKIPPED; 11045 } 11046 11047 /* Verify the capabilities */ 11048 struct rte_cryptodev_sym_capability_idx cap_idx; 11049 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11050 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 11051 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11052 &cap_idx) == NULL) 11053 return TEST_SKIPPED; 11054 11055 if (MD5_HMAC_create_session(ts_params, ut_params, 11056 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 11057 return TEST_FAILED; 11058 } 11059 11060 /* Generate Crypto op data structure */ 11061 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11062 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11063 TEST_ASSERT_NOT_NULL(ut_params->op, 11064 "Failed to allocate symmetric crypto operation struct"); 11065 11066 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 11067 return TEST_FAILED; 11068 11069 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11070 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11071 ut_params->op); 11072 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11073 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11074 ut_params->op, 0, 1, 0, 0); 11075 else 11076 TEST_ASSERT_NOT_NULL( 11077 process_crypto_request(ts_params->valid_devs[0], 11078 ut_params->op), 11079 "failed to process sym crypto op"); 11080 11081 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11082 "HMAC_MD5 crypto op processing failed"); 11083 11084 return TEST_SUCCESS; 11085 } 11086 11087 static int 11088 test_MD5_HMAC_generate_case_1(void) 11089 { 11090 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 11091 } 11092 11093 static int 11094 test_MD5_HMAC_verify_case_1(void) 11095 { 11096 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 11097 } 11098 11099 static int 11100 test_MD5_HMAC_generate_case_2(void) 11101 { 11102 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 11103 } 11104 11105 static int 11106 test_MD5_HMAC_verify_case_2(void) 11107 { 11108 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 11109 } 11110 11111 static int 11112 test_multi_session(void) 11113 { 11114 struct crypto_testsuite_params *ts_params = &testsuite_params; 11115 struct crypto_unittest_params *ut_params = &unittest_params; 11116 11117 struct rte_cryptodev_info dev_info; 11118 struct rte_cryptodev_sym_session **sessions; 11119 11120 uint16_t i; 11121 11122 /* Verify the capabilities */ 11123 struct rte_cryptodev_sym_capability_idx cap_idx; 11124 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11125 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 11126 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11127 &cap_idx) == NULL) 11128 return TEST_SKIPPED; 11129 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11130 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 11131 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11132 &cap_idx) == NULL) 11133 return TEST_SKIPPED; 11134 11135 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 11136 aes_cbc_key, hmac_sha512_key); 11137 11138 11139 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11140 11141 sessions = rte_malloc(NULL, 11142 sizeof(struct rte_cryptodev_sym_session *) * 11143 (MAX_NB_SESSIONS + 1), 0); 11144 11145 /* Create multiple crypto sessions*/ 11146 for (i = 0; i < MAX_NB_SESSIONS; i++) { 11147 11148 sessions[i] = rte_cryptodev_sym_session_create( 11149 ts_params->session_mpool); 11150 11151 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11152 sessions[i], &ut_params->auth_xform, 11153 ts_params->session_priv_mpool); 11154 TEST_ASSERT_NOT_NULL(sessions[i], 11155 "Session creation failed at session number %u", 11156 i); 11157 11158 /* Attempt to send a request on each session */ 11159 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 11160 sessions[i], 11161 ut_params, 11162 ts_params, 11163 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 11164 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 11165 aes_cbc_iv), 11166 "Failed to perform decrypt on request number %u.", i); 11167 /* free crypto operation structure */ 11168 if (ut_params->op) 11169 rte_crypto_op_free(ut_params->op); 11170 11171 /* 11172 * free mbuf - both obuf and ibuf are usually the same, 11173 * so check if they point at the same address is necessary, 11174 * to avoid freeing the mbuf twice. 11175 */ 11176 if (ut_params->obuf) { 11177 rte_pktmbuf_free(ut_params->obuf); 11178 if (ut_params->ibuf == ut_params->obuf) 11179 ut_params->ibuf = 0; 11180 ut_params->obuf = 0; 11181 } 11182 if (ut_params->ibuf) { 11183 rte_pktmbuf_free(ut_params->ibuf); 11184 ut_params->ibuf = 0; 11185 } 11186 } 11187 11188 sessions[i] = NULL; 11189 /* Next session create should fail */ 11190 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11191 sessions[i], &ut_params->auth_xform, 11192 ts_params->session_priv_mpool); 11193 TEST_ASSERT_NULL(sessions[i], 11194 "Session creation succeeded unexpectedly!"); 11195 11196 for (i = 0; i < MAX_NB_SESSIONS; i++) { 11197 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 11198 sessions[i]); 11199 rte_cryptodev_sym_session_free(sessions[i]); 11200 } 11201 11202 rte_free(sessions); 11203 11204 return TEST_SUCCESS; 11205 } 11206 11207 struct multi_session_params { 11208 struct crypto_unittest_params ut_params; 11209 uint8_t *cipher_key; 11210 uint8_t *hmac_key; 11211 const uint8_t *cipher; 11212 const uint8_t *digest; 11213 uint8_t *iv; 11214 }; 11215 11216 #define MB_SESSION_NUMBER 3 11217 11218 static int 11219 test_multi_session_random_usage(void) 11220 { 11221 struct crypto_testsuite_params *ts_params = &testsuite_params; 11222 struct rte_cryptodev_info dev_info; 11223 struct rte_cryptodev_sym_session **sessions; 11224 uint32_t i, j; 11225 struct multi_session_params ut_paramz[] = { 11226 11227 { 11228 .cipher_key = ms_aes_cbc_key0, 11229 .hmac_key = ms_hmac_key0, 11230 .cipher = ms_aes_cbc_cipher0, 11231 .digest = ms_hmac_digest0, 11232 .iv = ms_aes_cbc_iv0 11233 }, 11234 { 11235 .cipher_key = ms_aes_cbc_key1, 11236 .hmac_key = ms_hmac_key1, 11237 .cipher = ms_aes_cbc_cipher1, 11238 .digest = ms_hmac_digest1, 11239 .iv = ms_aes_cbc_iv1 11240 }, 11241 { 11242 .cipher_key = ms_aes_cbc_key2, 11243 .hmac_key = ms_hmac_key2, 11244 .cipher = ms_aes_cbc_cipher2, 11245 .digest = ms_hmac_digest2, 11246 .iv = ms_aes_cbc_iv2 11247 }, 11248 11249 }; 11250 11251 /* Verify the capabilities */ 11252 struct rte_cryptodev_sym_capability_idx cap_idx; 11253 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11254 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 11255 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11256 &cap_idx) == NULL) 11257 return TEST_SKIPPED; 11258 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11259 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 11260 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11261 &cap_idx) == NULL) 11262 return TEST_SKIPPED; 11263 11264 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11265 11266 sessions = rte_malloc(NULL, 11267 (sizeof(struct rte_cryptodev_sym_session *) 11268 * MAX_NB_SESSIONS) + 1, 0); 11269 11270 for (i = 0; i < MB_SESSION_NUMBER; i++) { 11271 sessions[i] = rte_cryptodev_sym_session_create( 11272 ts_params->session_mpool); 11273 11274 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 11275 sizeof(struct crypto_unittest_params)); 11276 11277 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 11278 &ut_paramz[i].ut_params, 11279 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 11280 11281 /* Create multiple crypto sessions*/ 11282 rte_cryptodev_sym_session_init( 11283 ts_params->valid_devs[0], 11284 sessions[i], 11285 &ut_paramz[i].ut_params.auth_xform, 11286 ts_params->session_priv_mpool); 11287 11288 TEST_ASSERT_NOT_NULL(sessions[i], 11289 "Session creation failed at session number %u", 11290 i); 11291 11292 } 11293 11294 srand(time(NULL)); 11295 for (i = 0; i < 40000; i++) { 11296 11297 j = rand() % MB_SESSION_NUMBER; 11298 11299 TEST_ASSERT_SUCCESS( 11300 test_AES_CBC_HMAC_SHA512_decrypt_perform( 11301 sessions[j], 11302 &ut_paramz[j].ut_params, 11303 ts_params, ut_paramz[j].cipher, 11304 ut_paramz[j].digest, 11305 ut_paramz[j].iv), 11306 "Failed to perform decrypt on request number %u.", i); 11307 11308 if (ut_paramz[j].ut_params.op) 11309 rte_crypto_op_free(ut_paramz[j].ut_params.op); 11310 11311 /* 11312 * free mbuf - both obuf and ibuf are usually the same, 11313 * so check if they point at the same address is necessary, 11314 * to avoid freeing the mbuf twice. 11315 */ 11316 if (ut_paramz[j].ut_params.obuf) { 11317 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 11318 if (ut_paramz[j].ut_params.ibuf 11319 == ut_paramz[j].ut_params.obuf) 11320 ut_paramz[j].ut_params.ibuf = 0; 11321 ut_paramz[j].ut_params.obuf = 0; 11322 } 11323 if (ut_paramz[j].ut_params.ibuf) { 11324 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 11325 ut_paramz[j].ut_params.ibuf = 0; 11326 } 11327 } 11328 11329 for (i = 0; i < MB_SESSION_NUMBER; i++) { 11330 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 11331 sessions[i]); 11332 rte_cryptodev_sym_session_free(sessions[i]); 11333 } 11334 11335 rte_free(sessions); 11336 11337 return TEST_SUCCESS; 11338 } 11339 11340 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 11341 0xab, 0xab, 0xab, 0xab, 11342 0xab, 0xab, 0xab, 0xab, 11343 0xab, 0xab, 0xab, 0xab}; 11344 11345 static int 11346 test_null_invalid_operation(void) 11347 { 11348 struct crypto_testsuite_params *ts_params = &testsuite_params; 11349 struct crypto_unittest_params *ut_params = &unittest_params; 11350 int ret; 11351 11352 /* This test is for NULL PMD only */ 11353 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11354 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11355 return TEST_SKIPPED; 11356 11357 /* Setup Cipher Parameters */ 11358 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11359 ut_params->cipher_xform.next = NULL; 11360 11361 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 11362 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11363 11364 ut_params->sess = rte_cryptodev_sym_session_create( 11365 ts_params->session_mpool); 11366 11367 /* Create Crypto session*/ 11368 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11369 ut_params->sess, &ut_params->cipher_xform, 11370 ts_params->session_priv_mpool); 11371 TEST_ASSERT(ret < 0, 11372 "Session creation succeeded unexpectedly"); 11373 11374 11375 /* Setup HMAC Parameters */ 11376 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11377 ut_params->auth_xform.next = NULL; 11378 11379 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 11380 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11381 11382 ut_params->sess = rte_cryptodev_sym_session_create( 11383 ts_params->session_mpool); 11384 11385 /* Create Crypto session*/ 11386 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11387 ut_params->sess, &ut_params->auth_xform, 11388 ts_params->session_priv_mpool); 11389 TEST_ASSERT(ret < 0, 11390 "Session creation succeeded unexpectedly"); 11391 11392 return TEST_SUCCESS; 11393 } 11394 11395 11396 #define NULL_BURST_LENGTH (32) 11397 11398 static int 11399 test_null_burst_operation(void) 11400 { 11401 struct crypto_testsuite_params *ts_params = &testsuite_params; 11402 struct crypto_unittest_params *ut_params = &unittest_params; 11403 11404 unsigned i, burst_len = NULL_BURST_LENGTH; 11405 11406 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 11407 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 11408 11409 /* This test is for NULL PMD only */ 11410 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11411 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11412 return TEST_SKIPPED; 11413 11414 /* Setup Cipher Parameters */ 11415 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11416 ut_params->cipher_xform.next = &ut_params->auth_xform; 11417 11418 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 11419 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11420 11421 /* Setup HMAC Parameters */ 11422 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11423 ut_params->auth_xform.next = NULL; 11424 11425 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 11426 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11427 11428 ut_params->sess = rte_cryptodev_sym_session_create( 11429 ts_params->session_mpool); 11430 11431 /* Create Crypto session*/ 11432 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11433 ut_params->sess, &ut_params->cipher_xform, 11434 ts_params->session_priv_mpool); 11435 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11436 11437 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 11438 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 11439 burst_len, "failed to generate burst of crypto ops"); 11440 11441 /* Generate an operation for each mbuf in burst */ 11442 for (i = 0; i < burst_len; i++) { 11443 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11444 11445 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 11446 11447 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 11448 sizeof(unsigned)); 11449 *data = i; 11450 11451 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 11452 11453 burst[i]->sym->m_src = m; 11454 } 11455 11456 /* Process crypto operation */ 11457 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 11458 0, burst, burst_len), 11459 burst_len, 11460 "Error enqueuing burst"); 11461 11462 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 11463 0, burst_dequeued, burst_len), 11464 burst_len, 11465 "Error dequeuing burst"); 11466 11467 11468 for (i = 0; i < burst_len; i++) { 11469 TEST_ASSERT_EQUAL( 11470 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 11471 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 11472 uint32_t *), 11473 "data not as expected"); 11474 11475 rte_pktmbuf_free(burst[i]->sym->m_src); 11476 rte_crypto_op_free(burst[i]); 11477 } 11478 11479 return TEST_SUCCESS; 11480 } 11481 11482 static uint16_t 11483 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11484 uint16_t nb_ops, void *user_param) 11485 { 11486 RTE_SET_USED(dev_id); 11487 RTE_SET_USED(qp_id); 11488 RTE_SET_USED(ops); 11489 RTE_SET_USED(user_param); 11490 11491 printf("crypto enqueue callback called\n"); 11492 return nb_ops; 11493 } 11494 11495 static uint16_t 11496 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11497 uint16_t nb_ops, void *user_param) 11498 { 11499 RTE_SET_USED(dev_id); 11500 RTE_SET_USED(qp_id); 11501 RTE_SET_USED(ops); 11502 RTE_SET_USED(user_param); 11503 11504 printf("crypto dequeue callback called\n"); 11505 return nb_ops; 11506 } 11507 11508 /* 11509 * Thread using enqueue/dequeue callback with RCU. 11510 */ 11511 static int 11512 test_enqdeq_callback_thread(void *arg) 11513 { 11514 RTE_SET_USED(arg); 11515 /* DP thread calls rte_cryptodev_enqueue_burst()/ 11516 * rte_cryptodev_dequeue_burst() and invokes callback. 11517 */ 11518 test_null_burst_operation(); 11519 return 0; 11520 } 11521 11522 static int 11523 test_enq_callback_setup(void) 11524 { 11525 struct crypto_testsuite_params *ts_params = &testsuite_params; 11526 struct rte_cryptodev_info dev_info; 11527 struct rte_cryptodev_qp_conf qp_conf = { 11528 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11529 }; 11530 11531 struct rte_cryptodev_cb *cb; 11532 uint16_t qp_id = 0; 11533 11534 /* Stop the device in case it's started so it can be configured */ 11535 rte_cryptodev_stop(ts_params->valid_devs[0]); 11536 11537 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11538 11539 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11540 &ts_params->conf), 11541 "Failed to configure cryptodev %u", 11542 ts_params->valid_devs[0]); 11543 11544 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11545 qp_conf.mp_session = ts_params->session_mpool; 11546 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11547 11548 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11549 ts_params->valid_devs[0], qp_id, &qp_conf, 11550 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11551 "Failed test for " 11552 "rte_cryptodev_queue_pair_setup: num_inflights " 11553 "%u on qp %u on cryptodev %u", 11554 qp_conf.nb_descriptors, qp_id, 11555 ts_params->valid_devs[0]); 11556 11557 /* Test with invalid crypto device */ 11558 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS, 11559 qp_id, test_enq_callback, NULL); 11560 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11561 "cryptodev %u did not fail", 11562 qp_id, RTE_CRYPTO_MAX_DEVS); 11563 11564 /* Test with invalid queue pair */ 11565 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11566 dev_info.max_nb_queue_pairs + 1, 11567 test_enq_callback, NULL); 11568 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11569 "cryptodev %u did not fail", 11570 dev_info.max_nb_queue_pairs + 1, 11571 ts_params->valid_devs[0]); 11572 11573 /* Test with NULL callback */ 11574 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11575 qp_id, NULL, NULL); 11576 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11577 "cryptodev %u did not fail", 11578 qp_id, ts_params->valid_devs[0]); 11579 11580 /* Test with valid configuration */ 11581 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11582 qp_id, test_enq_callback, NULL); 11583 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11584 "qp %u on cryptodev %u", 11585 qp_id, ts_params->valid_devs[0]); 11586 11587 rte_cryptodev_start(ts_params->valid_devs[0]); 11588 11589 /* Launch a thread */ 11590 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11591 rte_get_next_lcore(-1, 1, 0)); 11592 11593 /* Wait until reader exited. */ 11594 rte_eal_mp_wait_lcore(); 11595 11596 /* Test with invalid crypto device */ 11597 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11598 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11599 "Expected call to fail as crypto device is invalid"); 11600 11601 /* Test with invalid queue pair */ 11602 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11603 ts_params->valid_devs[0], 11604 dev_info.max_nb_queue_pairs + 1, cb), 11605 "Expected call to fail as queue pair is invalid"); 11606 11607 /* Test with NULL callback */ 11608 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11609 ts_params->valid_devs[0], qp_id, NULL), 11610 "Expected call to fail as callback is NULL"); 11611 11612 /* Test with valid configuration */ 11613 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback( 11614 ts_params->valid_devs[0], qp_id, cb), 11615 "Failed test to remove callback on " 11616 "qp %u on cryptodev %u", 11617 qp_id, ts_params->valid_devs[0]); 11618 11619 return TEST_SUCCESS; 11620 } 11621 11622 static int 11623 test_deq_callback_setup(void) 11624 { 11625 struct crypto_testsuite_params *ts_params = &testsuite_params; 11626 struct rte_cryptodev_info dev_info; 11627 struct rte_cryptodev_qp_conf qp_conf = { 11628 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11629 }; 11630 11631 struct rte_cryptodev_cb *cb; 11632 uint16_t qp_id = 0; 11633 11634 /* Stop the device in case it's started so it can be configured */ 11635 rte_cryptodev_stop(ts_params->valid_devs[0]); 11636 11637 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11638 11639 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11640 &ts_params->conf), 11641 "Failed to configure cryptodev %u", 11642 ts_params->valid_devs[0]); 11643 11644 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11645 qp_conf.mp_session = ts_params->session_mpool; 11646 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11647 11648 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11649 ts_params->valid_devs[0], qp_id, &qp_conf, 11650 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11651 "Failed test for " 11652 "rte_cryptodev_queue_pair_setup: num_inflights " 11653 "%u on qp %u on cryptodev %u", 11654 qp_conf.nb_descriptors, qp_id, 11655 ts_params->valid_devs[0]); 11656 11657 /* Test with invalid crypto device */ 11658 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS, 11659 qp_id, test_deq_callback, NULL); 11660 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11661 "cryptodev %u did not fail", 11662 qp_id, RTE_CRYPTO_MAX_DEVS); 11663 11664 /* Test with invalid queue pair */ 11665 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11666 dev_info.max_nb_queue_pairs + 1, 11667 test_deq_callback, NULL); 11668 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11669 "cryptodev %u did not fail", 11670 dev_info.max_nb_queue_pairs + 1, 11671 ts_params->valid_devs[0]); 11672 11673 /* Test with NULL callback */ 11674 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11675 qp_id, NULL, NULL); 11676 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11677 "cryptodev %u did not fail", 11678 qp_id, ts_params->valid_devs[0]); 11679 11680 /* Test with valid configuration */ 11681 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11682 qp_id, test_deq_callback, NULL); 11683 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11684 "qp %u on cryptodev %u", 11685 qp_id, ts_params->valid_devs[0]); 11686 11687 rte_cryptodev_start(ts_params->valid_devs[0]); 11688 11689 /* Launch a thread */ 11690 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11691 rte_get_next_lcore(-1, 1, 0)); 11692 11693 /* Wait until reader exited. */ 11694 rte_eal_mp_wait_lcore(); 11695 11696 /* Test with invalid crypto device */ 11697 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11698 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11699 "Expected call to fail as crypto device is invalid"); 11700 11701 /* Test with invalid queue pair */ 11702 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11703 ts_params->valid_devs[0], 11704 dev_info.max_nb_queue_pairs + 1, cb), 11705 "Expected call to fail as queue pair is invalid"); 11706 11707 /* Test with NULL callback */ 11708 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11709 ts_params->valid_devs[0], qp_id, NULL), 11710 "Expected call to fail as callback is NULL"); 11711 11712 /* Test with valid configuration */ 11713 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback( 11714 ts_params->valid_devs[0], qp_id, cb), 11715 "Failed test to remove callback on " 11716 "qp %u on cryptodev %u", 11717 qp_id, ts_params->valid_devs[0]); 11718 11719 return TEST_SUCCESS; 11720 } 11721 11722 static void 11723 generate_gmac_large_plaintext(uint8_t *data) 11724 { 11725 uint16_t i; 11726 11727 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 11728 memcpy(&data[i], &data[0], 32); 11729 } 11730 11731 static int 11732 create_gmac_operation(enum rte_crypto_auth_operation op, 11733 const struct gmac_test_data *tdata) 11734 { 11735 struct crypto_testsuite_params *ts_params = &testsuite_params; 11736 struct crypto_unittest_params *ut_params = &unittest_params; 11737 struct rte_crypto_sym_op *sym_op; 11738 11739 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11740 11741 /* Generate Crypto op data structure */ 11742 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11743 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11744 TEST_ASSERT_NOT_NULL(ut_params->op, 11745 "Failed to allocate symmetric crypto operation struct"); 11746 11747 sym_op = ut_params->op->sym; 11748 11749 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11750 ut_params->ibuf, tdata->gmac_tag.len); 11751 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11752 "no room to append digest"); 11753 11754 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11755 ut_params->ibuf, plaintext_pad_len); 11756 11757 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11758 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11759 tdata->gmac_tag.len); 11760 debug_hexdump(stdout, "digest:", 11761 sym_op->auth.digest.data, 11762 tdata->gmac_tag.len); 11763 } 11764 11765 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11766 uint8_t *, IV_OFFSET); 11767 11768 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11769 11770 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11771 11772 sym_op->cipher.data.length = 0; 11773 sym_op->cipher.data.offset = 0; 11774 11775 sym_op->auth.data.offset = 0; 11776 sym_op->auth.data.length = tdata->plaintext.len; 11777 11778 return 0; 11779 } 11780 11781 static int 11782 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 11783 const struct gmac_test_data *tdata, 11784 void *digest_mem, uint64_t digest_phys) 11785 { 11786 struct crypto_testsuite_params *ts_params = &testsuite_params; 11787 struct crypto_unittest_params *ut_params = &unittest_params; 11788 struct rte_crypto_sym_op *sym_op; 11789 11790 /* Generate Crypto op data structure */ 11791 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11792 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11793 TEST_ASSERT_NOT_NULL(ut_params->op, 11794 "Failed to allocate symmetric crypto operation struct"); 11795 11796 sym_op = ut_params->op->sym; 11797 11798 sym_op->auth.digest.data = digest_mem; 11799 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11800 "no room to append digest"); 11801 11802 sym_op->auth.digest.phys_addr = digest_phys; 11803 11804 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11805 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11806 tdata->gmac_tag.len); 11807 debug_hexdump(stdout, "digest:", 11808 sym_op->auth.digest.data, 11809 tdata->gmac_tag.len); 11810 } 11811 11812 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11813 uint8_t *, IV_OFFSET); 11814 11815 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11816 11817 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11818 11819 sym_op->cipher.data.length = 0; 11820 sym_op->cipher.data.offset = 0; 11821 11822 sym_op->auth.data.offset = 0; 11823 sym_op->auth.data.length = tdata->plaintext.len; 11824 11825 return 0; 11826 } 11827 11828 static int create_gmac_session(uint8_t dev_id, 11829 const struct gmac_test_data *tdata, 11830 enum rte_crypto_auth_operation auth_op) 11831 { 11832 uint8_t auth_key[tdata->key.len]; 11833 11834 struct crypto_testsuite_params *ts_params = &testsuite_params; 11835 struct crypto_unittest_params *ut_params = &unittest_params; 11836 11837 memcpy(auth_key, tdata->key.data, tdata->key.len); 11838 11839 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11840 ut_params->auth_xform.next = NULL; 11841 11842 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 11843 ut_params->auth_xform.auth.op = auth_op; 11844 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 11845 ut_params->auth_xform.auth.key.length = tdata->key.len; 11846 ut_params->auth_xform.auth.key.data = auth_key; 11847 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 11848 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 11849 11850 11851 ut_params->sess = rte_cryptodev_sym_session_create( 11852 ts_params->session_mpool); 11853 11854 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 11855 &ut_params->auth_xform, 11856 ts_params->session_priv_mpool); 11857 11858 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11859 11860 return 0; 11861 } 11862 11863 static int 11864 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 11865 { 11866 struct crypto_testsuite_params *ts_params = &testsuite_params; 11867 struct crypto_unittest_params *ut_params = &unittest_params; 11868 struct rte_cryptodev_info dev_info; 11869 11870 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11871 uint64_t feat_flags = dev_info.feature_flags; 11872 11873 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11874 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11875 printf("Device doesn't support RAW data-path APIs.\n"); 11876 return TEST_SKIPPED; 11877 } 11878 11879 int retval; 11880 11881 uint8_t *auth_tag, *plaintext; 11882 uint16_t plaintext_pad_len; 11883 11884 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11885 "No GMAC length in the source data"); 11886 11887 /* Verify the capabilities */ 11888 struct rte_cryptodev_sym_capability_idx cap_idx; 11889 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11890 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11891 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11892 &cap_idx) == NULL) 11893 return TEST_SKIPPED; 11894 11895 retval = create_gmac_session(ts_params->valid_devs[0], 11896 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11897 11898 if (retval < 0) 11899 return retval; 11900 11901 if (tdata->plaintext.len > MBUF_SIZE) 11902 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11903 else 11904 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11905 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11906 "Failed to allocate input buffer in mempool"); 11907 11908 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11909 rte_pktmbuf_tailroom(ut_params->ibuf)); 11910 11911 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11912 /* 11913 * Runtime generate the large plain text instead of use hard code 11914 * plain text vector. It is done to avoid create huge source file 11915 * with the test vector. 11916 */ 11917 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11918 generate_gmac_large_plaintext(tdata->plaintext.data); 11919 11920 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11921 plaintext_pad_len); 11922 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11923 11924 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11925 debug_hexdump(stdout, "plaintext:", plaintext, 11926 tdata->plaintext.len); 11927 11928 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 11929 tdata); 11930 11931 if (retval < 0) 11932 return retval; 11933 11934 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11935 11936 ut_params->op->sym->m_src = ut_params->ibuf; 11937 11938 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11939 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11940 ut_params->op); 11941 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11942 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11943 ut_params->op, 0, 1, 0, 0); 11944 else 11945 TEST_ASSERT_NOT_NULL( 11946 process_crypto_request(ts_params->valid_devs[0], 11947 ut_params->op), "failed to process sym crypto op"); 11948 11949 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11950 "crypto op processing failed"); 11951 11952 if (ut_params->op->sym->m_dst) { 11953 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11954 uint8_t *, plaintext_pad_len); 11955 } else { 11956 auth_tag = plaintext + plaintext_pad_len; 11957 } 11958 11959 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11960 11961 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11962 auth_tag, 11963 tdata->gmac_tag.data, 11964 tdata->gmac_tag.len, 11965 "GMAC Generated auth tag not as expected"); 11966 11967 return 0; 11968 } 11969 11970 static int 11971 test_AES_GMAC_authentication_test_case_1(void) 11972 { 11973 return test_AES_GMAC_authentication(&gmac_test_case_1); 11974 } 11975 11976 static int 11977 test_AES_GMAC_authentication_test_case_2(void) 11978 { 11979 return test_AES_GMAC_authentication(&gmac_test_case_2); 11980 } 11981 11982 static int 11983 test_AES_GMAC_authentication_test_case_3(void) 11984 { 11985 return test_AES_GMAC_authentication(&gmac_test_case_3); 11986 } 11987 11988 static int 11989 test_AES_GMAC_authentication_test_case_4(void) 11990 { 11991 return test_AES_GMAC_authentication(&gmac_test_case_4); 11992 } 11993 11994 static int 11995 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 11996 { 11997 struct crypto_testsuite_params *ts_params = &testsuite_params; 11998 struct crypto_unittest_params *ut_params = &unittest_params; 11999 int retval; 12000 uint32_t plaintext_pad_len; 12001 uint8_t *plaintext; 12002 struct rte_cryptodev_info dev_info; 12003 12004 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12005 uint64_t feat_flags = dev_info.feature_flags; 12006 12007 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12008 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12009 printf("Device doesn't support RAW data-path APIs.\n"); 12010 return TEST_SKIPPED; 12011 } 12012 12013 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 12014 "No GMAC length in the source data"); 12015 12016 /* Verify the capabilities */ 12017 struct rte_cryptodev_sym_capability_idx cap_idx; 12018 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12019 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 12020 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12021 &cap_idx) == NULL) 12022 return TEST_SKIPPED; 12023 12024 retval = create_gmac_session(ts_params->valid_devs[0], 12025 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 12026 12027 if (retval < 0) 12028 return retval; 12029 12030 if (tdata->plaintext.len > MBUF_SIZE) 12031 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 12032 else 12033 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12034 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12035 "Failed to allocate input buffer in mempool"); 12036 12037 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12038 rte_pktmbuf_tailroom(ut_params->ibuf)); 12039 12040 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 12041 12042 /* 12043 * Runtime generate the large plain text instead of use hard code 12044 * plain text vector. It is done to avoid create huge source file 12045 * with the test vector. 12046 */ 12047 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 12048 generate_gmac_large_plaintext(tdata->plaintext.data); 12049 12050 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12051 plaintext_pad_len); 12052 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12053 12054 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 12055 debug_hexdump(stdout, "plaintext:", plaintext, 12056 tdata->plaintext.len); 12057 12058 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 12059 tdata); 12060 12061 if (retval < 0) 12062 return retval; 12063 12064 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12065 12066 ut_params->op->sym->m_src = ut_params->ibuf; 12067 12068 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12069 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12070 ut_params->op); 12071 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12072 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12073 ut_params->op, 0, 1, 0, 0); 12074 else 12075 TEST_ASSERT_NOT_NULL( 12076 process_crypto_request(ts_params->valid_devs[0], 12077 ut_params->op), "failed to process sym crypto op"); 12078 12079 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12080 "crypto op processing failed"); 12081 12082 return 0; 12083 12084 } 12085 12086 static int 12087 test_AES_GMAC_authentication_verify_test_case_1(void) 12088 { 12089 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 12090 } 12091 12092 static int 12093 test_AES_GMAC_authentication_verify_test_case_2(void) 12094 { 12095 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 12096 } 12097 12098 static int 12099 test_AES_GMAC_authentication_verify_test_case_3(void) 12100 { 12101 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 12102 } 12103 12104 static int 12105 test_AES_GMAC_authentication_verify_test_case_4(void) 12106 { 12107 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 12108 } 12109 12110 static int 12111 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 12112 uint32_t fragsz) 12113 { 12114 struct crypto_testsuite_params *ts_params = &testsuite_params; 12115 struct crypto_unittest_params *ut_params = &unittest_params; 12116 struct rte_cryptodev_info dev_info; 12117 uint64_t feature_flags; 12118 unsigned int trn_data = 0; 12119 void *digest_mem = NULL; 12120 uint32_t segs = 1; 12121 unsigned int to_trn = 0; 12122 struct rte_mbuf *buf = NULL; 12123 uint8_t *auth_tag, *plaintext; 12124 int retval; 12125 12126 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 12127 "No GMAC length in the source data"); 12128 12129 /* Verify the capabilities */ 12130 struct rte_cryptodev_sym_capability_idx cap_idx; 12131 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12132 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 12133 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12134 &cap_idx) == NULL) 12135 return TEST_SKIPPED; 12136 12137 /* Check for any input SGL support */ 12138 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12139 feature_flags = dev_info.feature_flags; 12140 12141 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 12142 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 12143 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 12144 return TEST_SKIPPED; 12145 12146 if (fragsz > tdata->plaintext.len) 12147 fragsz = tdata->plaintext.len; 12148 12149 uint16_t plaintext_len = fragsz; 12150 12151 retval = create_gmac_session(ts_params->valid_devs[0], 12152 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 12153 12154 if (retval < 0) 12155 return retval; 12156 12157 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12158 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12159 "Failed to allocate input buffer in mempool"); 12160 12161 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12162 rte_pktmbuf_tailroom(ut_params->ibuf)); 12163 12164 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12165 plaintext_len); 12166 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12167 12168 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 12169 12170 trn_data += plaintext_len; 12171 12172 buf = ut_params->ibuf; 12173 12174 /* 12175 * Loop until no more fragments 12176 */ 12177 12178 while (trn_data < tdata->plaintext.len) { 12179 ++segs; 12180 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 12181 (tdata->plaintext.len - trn_data) : fragsz; 12182 12183 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12184 buf = buf->next; 12185 12186 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 12187 rte_pktmbuf_tailroom(buf)); 12188 12189 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 12190 to_trn); 12191 12192 memcpy(plaintext, tdata->plaintext.data + trn_data, 12193 to_trn); 12194 trn_data += to_trn; 12195 if (trn_data == tdata->plaintext.len) 12196 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 12197 tdata->gmac_tag.len); 12198 } 12199 ut_params->ibuf->nb_segs = segs; 12200 12201 /* 12202 * Place digest at the end of the last buffer 12203 */ 12204 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 12205 12206 if (!digest_mem) { 12207 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12208 + tdata->gmac_tag.len); 12209 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 12210 tdata->plaintext.len); 12211 } 12212 12213 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 12214 tdata, digest_mem, digest_phys); 12215 12216 if (retval < 0) 12217 return retval; 12218 12219 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12220 12221 ut_params->op->sym->m_src = ut_params->ibuf; 12222 12223 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12224 return TEST_SKIPPED; 12225 12226 TEST_ASSERT_NOT_NULL( 12227 process_crypto_request(ts_params->valid_devs[0], 12228 ut_params->op), "failed to process sym crypto op"); 12229 12230 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12231 "crypto op processing failed"); 12232 12233 auth_tag = digest_mem; 12234 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 12235 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12236 auth_tag, 12237 tdata->gmac_tag.data, 12238 tdata->gmac_tag.len, 12239 "GMAC Generated auth tag not as expected"); 12240 12241 return 0; 12242 } 12243 12244 /* Segment size not multiple of block size (16B) */ 12245 static int 12246 test_AES_GMAC_authentication_SGL_40B(void) 12247 { 12248 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 12249 } 12250 12251 static int 12252 test_AES_GMAC_authentication_SGL_80B(void) 12253 { 12254 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 12255 } 12256 12257 static int 12258 test_AES_GMAC_authentication_SGL_2048B(void) 12259 { 12260 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 12261 } 12262 12263 /* Segment size not multiple of block size (16B) */ 12264 static int 12265 test_AES_GMAC_authentication_SGL_2047B(void) 12266 { 12267 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 12268 } 12269 12270 struct test_crypto_vector { 12271 enum rte_crypto_cipher_algorithm crypto_algo; 12272 unsigned int cipher_offset; 12273 unsigned int cipher_len; 12274 12275 struct { 12276 uint8_t data[64]; 12277 unsigned int len; 12278 } cipher_key; 12279 12280 struct { 12281 uint8_t data[64]; 12282 unsigned int len; 12283 } iv; 12284 12285 struct { 12286 const uint8_t *data; 12287 unsigned int len; 12288 } plaintext; 12289 12290 struct { 12291 const uint8_t *data; 12292 unsigned int len; 12293 } ciphertext; 12294 12295 enum rte_crypto_auth_algorithm auth_algo; 12296 unsigned int auth_offset; 12297 12298 struct { 12299 uint8_t data[128]; 12300 unsigned int len; 12301 } auth_key; 12302 12303 struct { 12304 const uint8_t *data; 12305 unsigned int len; 12306 } aad; 12307 12308 struct { 12309 uint8_t data[128]; 12310 unsigned int len; 12311 } digest; 12312 }; 12313 12314 static const struct test_crypto_vector 12315 hmac_sha1_test_crypto_vector = { 12316 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12317 .plaintext = { 12318 .data = plaintext_hash, 12319 .len = 512 12320 }, 12321 .auth_key = { 12322 .data = { 12323 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12324 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12325 0xDE, 0xF4, 0xDE, 0xAD 12326 }, 12327 .len = 20 12328 }, 12329 .digest = { 12330 .data = { 12331 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 12332 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 12333 0x3F, 0x91, 0x64, 0x59 12334 }, 12335 .len = 20 12336 } 12337 }; 12338 12339 static const struct test_crypto_vector 12340 aes128_gmac_test_vector = { 12341 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 12342 .plaintext = { 12343 .data = plaintext_hash, 12344 .len = 512 12345 }, 12346 .iv = { 12347 .data = { 12348 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12349 0x08, 0x09, 0x0A, 0x0B 12350 }, 12351 .len = 12 12352 }, 12353 .auth_key = { 12354 .data = { 12355 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12356 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 12357 }, 12358 .len = 16 12359 }, 12360 .digest = { 12361 .data = { 12362 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 12363 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 12364 }, 12365 .len = 16 12366 } 12367 }; 12368 12369 static const struct test_crypto_vector 12370 aes128cbc_hmac_sha1_test_vector = { 12371 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12372 .cipher_offset = 0, 12373 .cipher_len = 512, 12374 .cipher_key = { 12375 .data = { 12376 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12377 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12378 }, 12379 .len = 16 12380 }, 12381 .iv = { 12382 .data = { 12383 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12384 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12385 }, 12386 .len = 16 12387 }, 12388 .plaintext = { 12389 .data = plaintext_hash, 12390 .len = 512 12391 }, 12392 .ciphertext = { 12393 .data = ciphertext512_aes128cbc, 12394 .len = 512 12395 }, 12396 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12397 .auth_offset = 0, 12398 .auth_key = { 12399 .data = { 12400 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12401 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12402 0xDE, 0xF4, 0xDE, 0xAD 12403 }, 12404 .len = 20 12405 }, 12406 .digest = { 12407 .data = { 12408 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 12409 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12410 0x18, 0x8C, 0x1D, 0x32 12411 }, 12412 .len = 20 12413 } 12414 }; 12415 12416 static const struct test_crypto_vector 12417 aes128cbc_hmac_sha1_aad_test_vector = { 12418 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12419 .cipher_offset = 8, 12420 .cipher_len = 496, 12421 .cipher_key = { 12422 .data = { 12423 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12424 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12425 }, 12426 .len = 16 12427 }, 12428 .iv = { 12429 .data = { 12430 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12431 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12432 }, 12433 .len = 16 12434 }, 12435 .plaintext = { 12436 .data = plaintext_hash, 12437 .len = 512 12438 }, 12439 .ciphertext = { 12440 .data = ciphertext512_aes128cbc_aad, 12441 .len = 512 12442 }, 12443 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12444 .auth_offset = 0, 12445 .auth_key = { 12446 .data = { 12447 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12448 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12449 0xDE, 0xF4, 0xDE, 0xAD 12450 }, 12451 .len = 20 12452 }, 12453 .digest = { 12454 .data = { 12455 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 12456 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 12457 0x62, 0x0F, 0xFB, 0x10 12458 }, 12459 .len = 20 12460 } 12461 }; 12462 12463 static void 12464 data_corruption(uint8_t *data) 12465 { 12466 data[0] += 1; 12467 } 12468 12469 static void 12470 tag_corruption(uint8_t *data, unsigned int tag_offset) 12471 { 12472 data[tag_offset] += 1; 12473 } 12474 12475 static int 12476 create_auth_session(struct crypto_unittest_params *ut_params, 12477 uint8_t dev_id, 12478 const struct test_crypto_vector *reference, 12479 enum rte_crypto_auth_operation auth_op) 12480 { 12481 struct crypto_testsuite_params *ts_params = &testsuite_params; 12482 uint8_t auth_key[reference->auth_key.len + 1]; 12483 12484 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12485 12486 /* Setup Authentication Parameters */ 12487 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12488 ut_params->auth_xform.auth.op = auth_op; 12489 ut_params->auth_xform.next = NULL; 12490 ut_params->auth_xform.auth.algo = reference->auth_algo; 12491 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12492 ut_params->auth_xform.auth.key.data = auth_key; 12493 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12494 12495 /* Create Crypto session*/ 12496 ut_params->sess = rte_cryptodev_sym_session_create( 12497 ts_params->session_mpool); 12498 12499 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12500 &ut_params->auth_xform, 12501 ts_params->session_priv_mpool); 12502 12503 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12504 12505 return 0; 12506 } 12507 12508 static int 12509 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 12510 uint8_t dev_id, 12511 const struct test_crypto_vector *reference, 12512 enum rte_crypto_auth_operation auth_op, 12513 enum rte_crypto_cipher_operation cipher_op) 12514 { 12515 struct crypto_testsuite_params *ts_params = &testsuite_params; 12516 uint8_t cipher_key[reference->cipher_key.len + 1]; 12517 uint8_t auth_key[reference->auth_key.len + 1]; 12518 12519 memcpy(cipher_key, reference->cipher_key.data, 12520 reference->cipher_key.len); 12521 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12522 12523 /* Setup Authentication Parameters */ 12524 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12525 ut_params->auth_xform.auth.op = auth_op; 12526 ut_params->auth_xform.auth.algo = reference->auth_algo; 12527 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12528 ut_params->auth_xform.auth.key.data = auth_key; 12529 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12530 12531 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 12532 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 12533 ut_params->auth_xform.auth.iv.length = reference->iv.len; 12534 } else { 12535 ut_params->auth_xform.next = &ut_params->cipher_xform; 12536 12537 /* Setup Cipher Parameters */ 12538 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12539 ut_params->cipher_xform.next = NULL; 12540 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12541 ut_params->cipher_xform.cipher.op = cipher_op; 12542 ut_params->cipher_xform.cipher.key.data = cipher_key; 12543 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12544 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12545 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12546 } 12547 12548 /* Create Crypto session*/ 12549 ut_params->sess = rte_cryptodev_sym_session_create( 12550 ts_params->session_mpool); 12551 12552 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12553 &ut_params->auth_xform, 12554 ts_params->session_priv_mpool); 12555 12556 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12557 12558 return 0; 12559 } 12560 12561 static int 12562 create_auth_operation(struct crypto_testsuite_params *ts_params, 12563 struct crypto_unittest_params *ut_params, 12564 const struct test_crypto_vector *reference, 12565 unsigned int auth_generate) 12566 { 12567 /* Generate Crypto op data structure */ 12568 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12569 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12570 TEST_ASSERT_NOT_NULL(ut_params->op, 12571 "Failed to allocate pktmbuf offload"); 12572 12573 /* Set crypto operation data parameters */ 12574 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12575 12576 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12577 12578 /* set crypto operation source mbuf */ 12579 sym_op->m_src = ut_params->ibuf; 12580 12581 /* digest */ 12582 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12583 ut_params->ibuf, reference->digest.len); 12584 12585 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12586 "no room to append auth tag"); 12587 12588 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12589 ut_params->ibuf, reference->plaintext.len); 12590 12591 if (auth_generate) 12592 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12593 else 12594 memcpy(sym_op->auth.digest.data, 12595 reference->digest.data, 12596 reference->digest.len); 12597 12598 debug_hexdump(stdout, "digest:", 12599 sym_op->auth.digest.data, 12600 reference->digest.len); 12601 12602 sym_op->auth.data.length = reference->plaintext.len; 12603 sym_op->auth.data.offset = 0; 12604 12605 return 0; 12606 } 12607 12608 static int 12609 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 12610 struct crypto_unittest_params *ut_params, 12611 const struct test_crypto_vector *reference, 12612 unsigned int auth_generate) 12613 { 12614 /* Generate Crypto op data structure */ 12615 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12616 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12617 TEST_ASSERT_NOT_NULL(ut_params->op, 12618 "Failed to allocate pktmbuf offload"); 12619 12620 /* Set crypto operation data parameters */ 12621 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12622 12623 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12624 12625 /* set crypto operation source mbuf */ 12626 sym_op->m_src = ut_params->ibuf; 12627 12628 /* digest */ 12629 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12630 ut_params->ibuf, reference->digest.len); 12631 12632 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12633 "no room to append auth tag"); 12634 12635 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12636 ut_params->ibuf, reference->ciphertext.len); 12637 12638 if (auth_generate) 12639 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12640 else 12641 memcpy(sym_op->auth.digest.data, 12642 reference->digest.data, 12643 reference->digest.len); 12644 12645 debug_hexdump(stdout, "digest:", 12646 sym_op->auth.digest.data, 12647 reference->digest.len); 12648 12649 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12650 reference->iv.data, reference->iv.len); 12651 12652 sym_op->cipher.data.length = 0; 12653 sym_op->cipher.data.offset = 0; 12654 12655 sym_op->auth.data.length = reference->plaintext.len; 12656 sym_op->auth.data.offset = 0; 12657 12658 return 0; 12659 } 12660 12661 static int 12662 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 12663 struct crypto_unittest_params *ut_params, 12664 const struct test_crypto_vector *reference, 12665 unsigned int auth_generate) 12666 { 12667 /* Generate Crypto op data structure */ 12668 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12669 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12670 TEST_ASSERT_NOT_NULL(ut_params->op, 12671 "Failed to allocate pktmbuf offload"); 12672 12673 /* Set crypto operation data parameters */ 12674 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12675 12676 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12677 12678 /* set crypto operation source mbuf */ 12679 sym_op->m_src = ut_params->ibuf; 12680 12681 /* digest */ 12682 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12683 ut_params->ibuf, reference->digest.len); 12684 12685 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12686 "no room to append auth tag"); 12687 12688 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12689 ut_params->ibuf, reference->ciphertext.len); 12690 12691 if (auth_generate) 12692 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12693 else 12694 memcpy(sym_op->auth.digest.data, 12695 reference->digest.data, 12696 reference->digest.len); 12697 12698 debug_hexdump(stdout, "digest:", 12699 sym_op->auth.digest.data, 12700 reference->digest.len); 12701 12702 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12703 reference->iv.data, reference->iv.len); 12704 12705 sym_op->cipher.data.length = reference->cipher_len; 12706 sym_op->cipher.data.offset = reference->cipher_offset; 12707 12708 sym_op->auth.data.length = reference->plaintext.len; 12709 sym_op->auth.data.offset = reference->auth_offset; 12710 12711 return 0; 12712 } 12713 12714 static int 12715 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12716 struct crypto_unittest_params *ut_params, 12717 const struct test_crypto_vector *reference) 12718 { 12719 return create_auth_operation(ts_params, ut_params, reference, 0); 12720 } 12721 12722 static int 12723 create_auth_verify_GMAC_operation( 12724 struct crypto_testsuite_params *ts_params, 12725 struct crypto_unittest_params *ut_params, 12726 const struct test_crypto_vector *reference) 12727 { 12728 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 12729 } 12730 12731 static int 12732 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12733 struct crypto_unittest_params *ut_params, 12734 const struct test_crypto_vector *reference) 12735 { 12736 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 12737 } 12738 12739 static int 12740 test_authentication_verify_fail_when_data_corruption( 12741 struct crypto_testsuite_params *ts_params, 12742 struct crypto_unittest_params *ut_params, 12743 const struct test_crypto_vector *reference, 12744 unsigned int data_corrupted) 12745 { 12746 int retval; 12747 12748 uint8_t *plaintext; 12749 struct rte_cryptodev_info dev_info; 12750 12751 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12752 uint64_t feat_flags = dev_info.feature_flags; 12753 12754 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12755 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12756 printf("Device doesn't support RAW data-path APIs.\n"); 12757 return TEST_SKIPPED; 12758 } 12759 12760 /* Verify the capabilities */ 12761 struct rte_cryptodev_sym_capability_idx cap_idx; 12762 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12763 cap_idx.algo.auth = reference->auth_algo; 12764 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12765 &cap_idx) == NULL) 12766 return TEST_SKIPPED; 12767 12768 12769 /* Create session */ 12770 retval = create_auth_session(ut_params, 12771 ts_params->valid_devs[0], 12772 reference, 12773 RTE_CRYPTO_AUTH_OP_VERIFY); 12774 if (retval < 0) 12775 return retval; 12776 12777 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12778 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12779 "Failed to allocate input buffer in mempool"); 12780 12781 /* clear mbuf payload */ 12782 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12783 rte_pktmbuf_tailroom(ut_params->ibuf)); 12784 12785 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12786 reference->plaintext.len); 12787 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12788 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12789 12790 debug_hexdump(stdout, "plaintext:", plaintext, 12791 reference->plaintext.len); 12792 12793 /* Create operation */ 12794 retval = create_auth_verify_operation(ts_params, ut_params, reference); 12795 12796 if (retval < 0) 12797 return retval; 12798 12799 if (data_corrupted) 12800 data_corruption(plaintext); 12801 else 12802 tag_corruption(plaintext, reference->plaintext.len); 12803 12804 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12805 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12806 ut_params->op); 12807 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12808 RTE_CRYPTO_OP_STATUS_SUCCESS, 12809 "authentication not failed"); 12810 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12811 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12812 ut_params->op, 0, 1, 0, 0); 12813 else { 12814 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12815 ut_params->op); 12816 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12817 } 12818 12819 return 0; 12820 } 12821 12822 static int 12823 test_authentication_verify_GMAC_fail_when_corruption( 12824 struct crypto_testsuite_params *ts_params, 12825 struct crypto_unittest_params *ut_params, 12826 const struct test_crypto_vector *reference, 12827 unsigned int data_corrupted) 12828 { 12829 int retval; 12830 uint8_t *plaintext; 12831 struct rte_cryptodev_info dev_info; 12832 12833 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12834 uint64_t feat_flags = dev_info.feature_flags; 12835 12836 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12837 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12838 printf("Device doesn't support RAW data-path APIs.\n"); 12839 return TEST_SKIPPED; 12840 } 12841 12842 /* Verify the capabilities */ 12843 struct rte_cryptodev_sym_capability_idx cap_idx; 12844 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12845 cap_idx.algo.auth = reference->auth_algo; 12846 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12847 &cap_idx) == NULL) 12848 return TEST_SKIPPED; 12849 12850 /* Create session */ 12851 retval = create_auth_cipher_session(ut_params, 12852 ts_params->valid_devs[0], 12853 reference, 12854 RTE_CRYPTO_AUTH_OP_VERIFY, 12855 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12856 if (retval < 0) 12857 return retval; 12858 12859 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12860 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12861 "Failed to allocate input buffer in mempool"); 12862 12863 /* clear mbuf payload */ 12864 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12865 rte_pktmbuf_tailroom(ut_params->ibuf)); 12866 12867 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12868 reference->plaintext.len); 12869 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12870 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12871 12872 debug_hexdump(stdout, "plaintext:", plaintext, 12873 reference->plaintext.len); 12874 12875 /* Create operation */ 12876 retval = create_auth_verify_GMAC_operation(ts_params, 12877 ut_params, 12878 reference); 12879 12880 if (retval < 0) 12881 return retval; 12882 12883 if (data_corrupted) 12884 data_corruption(plaintext); 12885 else 12886 tag_corruption(plaintext, reference->aad.len); 12887 12888 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12889 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12890 ut_params->op); 12891 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12892 RTE_CRYPTO_OP_STATUS_SUCCESS, 12893 "authentication not failed"); 12894 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12895 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12896 ut_params->op, 0, 1, 0, 0); 12897 else { 12898 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12899 ut_params->op); 12900 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12901 } 12902 12903 return 0; 12904 } 12905 12906 static int 12907 test_authenticated_decryption_fail_when_corruption( 12908 struct crypto_testsuite_params *ts_params, 12909 struct crypto_unittest_params *ut_params, 12910 const struct test_crypto_vector *reference, 12911 unsigned int data_corrupted) 12912 { 12913 int retval; 12914 12915 uint8_t *ciphertext; 12916 struct rte_cryptodev_info dev_info; 12917 12918 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12919 uint64_t feat_flags = dev_info.feature_flags; 12920 12921 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12922 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12923 printf("Device doesn't support RAW data-path APIs.\n"); 12924 return TEST_SKIPPED; 12925 } 12926 12927 /* Verify the capabilities */ 12928 struct rte_cryptodev_sym_capability_idx cap_idx; 12929 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12930 cap_idx.algo.auth = reference->auth_algo; 12931 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12932 &cap_idx) == NULL) 12933 return TEST_SKIPPED; 12934 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12935 cap_idx.algo.cipher = reference->crypto_algo; 12936 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12937 &cap_idx) == NULL) 12938 return TEST_SKIPPED; 12939 12940 /* Create session */ 12941 retval = create_auth_cipher_session(ut_params, 12942 ts_params->valid_devs[0], 12943 reference, 12944 RTE_CRYPTO_AUTH_OP_VERIFY, 12945 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12946 if (retval < 0) 12947 return retval; 12948 12949 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12950 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12951 "Failed to allocate input buffer in mempool"); 12952 12953 /* clear mbuf payload */ 12954 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12955 rte_pktmbuf_tailroom(ut_params->ibuf)); 12956 12957 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12958 reference->ciphertext.len); 12959 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12960 memcpy(ciphertext, reference->ciphertext.data, 12961 reference->ciphertext.len); 12962 12963 /* Create operation */ 12964 retval = create_cipher_auth_verify_operation(ts_params, 12965 ut_params, 12966 reference); 12967 12968 if (retval < 0) 12969 return retval; 12970 12971 if (data_corrupted) 12972 data_corruption(ciphertext); 12973 else 12974 tag_corruption(ciphertext, reference->ciphertext.len); 12975 12976 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12977 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12978 ut_params->op); 12979 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12980 RTE_CRYPTO_OP_STATUS_SUCCESS, 12981 "authentication not failed"); 12982 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12983 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12984 ut_params->op, 1, 1, 0, 0); 12985 else { 12986 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12987 ut_params->op); 12988 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12989 } 12990 12991 return 0; 12992 } 12993 12994 static int 12995 test_authenticated_encrypt_with_esn( 12996 struct crypto_testsuite_params *ts_params, 12997 struct crypto_unittest_params *ut_params, 12998 const struct test_crypto_vector *reference) 12999 { 13000 int retval; 13001 13002 uint8_t *authciphertext, *plaintext, *auth_tag; 13003 uint16_t plaintext_pad_len; 13004 uint8_t cipher_key[reference->cipher_key.len + 1]; 13005 uint8_t auth_key[reference->auth_key.len + 1]; 13006 struct rte_cryptodev_info dev_info; 13007 13008 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13009 uint64_t feat_flags = dev_info.feature_flags; 13010 13011 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13012 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13013 printf("Device doesn't support RAW data-path APIs.\n"); 13014 return TEST_SKIPPED; 13015 } 13016 13017 /* Verify the capabilities */ 13018 struct rte_cryptodev_sym_capability_idx cap_idx; 13019 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13020 cap_idx.algo.auth = reference->auth_algo; 13021 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13022 &cap_idx) == NULL) 13023 return TEST_SKIPPED; 13024 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13025 cap_idx.algo.cipher = reference->crypto_algo; 13026 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13027 &cap_idx) == NULL) 13028 return TEST_SKIPPED; 13029 13030 /* Create session */ 13031 memcpy(cipher_key, reference->cipher_key.data, 13032 reference->cipher_key.len); 13033 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13034 13035 /* Setup Cipher Parameters */ 13036 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13037 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13038 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 13039 ut_params->cipher_xform.cipher.key.data = cipher_key; 13040 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13041 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13042 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13043 13044 ut_params->cipher_xform.next = &ut_params->auth_xform; 13045 13046 /* Setup Authentication Parameters */ 13047 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13048 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 13049 ut_params->auth_xform.auth.algo = reference->auth_algo; 13050 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13051 ut_params->auth_xform.auth.key.data = auth_key; 13052 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13053 ut_params->auth_xform.next = NULL; 13054 13055 /* Create Crypto session*/ 13056 ut_params->sess = rte_cryptodev_sym_session_create( 13057 ts_params->session_mpool); 13058 13059 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 13060 ut_params->sess, 13061 &ut_params->cipher_xform, 13062 ts_params->session_priv_mpool); 13063 13064 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13065 13066 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13067 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13068 "Failed to allocate input buffer in mempool"); 13069 13070 /* clear mbuf payload */ 13071 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13072 rte_pktmbuf_tailroom(ut_params->ibuf)); 13073 13074 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13075 reference->plaintext.len); 13076 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 13077 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 13078 13079 /* Create operation */ 13080 retval = create_cipher_auth_operation(ts_params, 13081 ut_params, 13082 reference, 0); 13083 13084 if (retval < 0) 13085 return retval; 13086 13087 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13088 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13089 ut_params->op); 13090 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13091 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13092 ut_params->op, 1, 1, 0, 0); 13093 else 13094 ut_params->op = process_crypto_request( 13095 ts_params->valid_devs[0], ut_params->op); 13096 13097 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 13098 13099 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13100 "crypto op processing failed"); 13101 13102 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 13103 13104 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 13105 ut_params->op->sym->auth.data.offset); 13106 auth_tag = authciphertext + plaintext_pad_len; 13107 debug_hexdump(stdout, "ciphertext:", authciphertext, 13108 reference->ciphertext.len); 13109 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 13110 13111 /* Validate obuf */ 13112 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13113 authciphertext, 13114 reference->ciphertext.data, 13115 reference->ciphertext.len, 13116 "Ciphertext data not as expected"); 13117 13118 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13119 auth_tag, 13120 reference->digest.data, 13121 reference->digest.len, 13122 "Generated digest not as expected"); 13123 13124 return TEST_SUCCESS; 13125 13126 } 13127 13128 static int 13129 test_authenticated_decrypt_with_esn( 13130 struct crypto_testsuite_params *ts_params, 13131 struct crypto_unittest_params *ut_params, 13132 const struct test_crypto_vector *reference) 13133 { 13134 int retval; 13135 13136 uint8_t *ciphertext; 13137 uint8_t cipher_key[reference->cipher_key.len + 1]; 13138 uint8_t auth_key[reference->auth_key.len + 1]; 13139 struct rte_cryptodev_info dev_info; 13140 13141 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13142 uint64_t feat_flags = dev_info.feature_flags; 13143 13144 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13145 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13146 printf("Device doesn't support RAW data-path APIs.\n"); 13147 return TEST_SKIPPED; 13148 } 13149 13150 /* Verify the capabilities */ 13151 struct rte_cryptodev_sym_capability_idx cap_idx; 13152 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13153 cap_idx.algo.auth = reference->auth_algo; 13154 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13155 &cap_idx) == NULL) 13156 return TEST_SKIPPED; 13157 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13158 cap_idx.algo.cipher = reference->crypto_algo; 13159 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13160 &cap_idx) == NULL) 13161 return TEST_SKIPPED; 13162 13163 /* Create session */ 13164 memcpy(cipher_key, reference->cipher_key.data, 13165 reference->cipher_key.len); 13166 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 13167 13168 /* Setup Authentication Parameters */ 13169 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 13170 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 13171 ut_params->auth_xform.auth.algo = reference->auth_algo; 13172 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 13173 ut_params->auth_xform.auth.key.data = auth_key; 13174 ut_params->auth_xform.auth.digest_length = reference->digest.len; 13175 ut_params->auth_xform.next = &ut_params->cipher_xform; 13176 13177 /* Setup Cipher Parameters */ 13178 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 13179 ut_params->cipher_xform.next = NULL; 13180 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 13181 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 13182 ut_params->cipher_xform.cipher.key.data = cipher_key; 13183 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 13184 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 13185 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 13186 13187 /* Create Crypto session*/ 13188 ut_params->sess = rte_cryptodev_sym_session_create( 13189 ts_params->session_mpool); 13190 13191 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 13192 ut_params->sess, 13193 &ut_params->auth_xform, 13194 ts_params->session_priv_mpool); 13195 13196 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 13197 13198 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13199 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 13200 "Failed to allocate input buffer in mempool"); 13201 13202 /* clear mbuf payload */ 13203 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13204 rte_pktmbuf_tailroom(ut_params->ibuf)); 13205 13206 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13207 reference->ciphertext.len); 13208 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 13209 memcpy(ciphertext, reference->ciphertext.data, 13210 reference->ciphertext.len); 13211 13212 /* Create operation */ 13213 retval = create_cipher_auth_verify_operation(ts_params, 13214 ut_params, 13215 reference); 13216 13217 if (retval < 0) 13218 return retval; 13219 13220 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13221 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 13222 ut_params->op); 13223 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13224 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13225 ut_params->op, 1, 1, 0, 0); 13226 else 13227 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 13228 ut_params->op); 13229 13230 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 13231 TEST_ASSERT_EQUAL(ut_params->op->status, 13232 RTE_CRYPTO_OP_STATUS_SUCCESS, 13233 "crypto op processing passed"); 13234 13235 ut_params->obuf = ut_params->op->sym->m_src; 13236 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 13237 13238 return 0; 13239 } 13240 13241 static int 13242 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 13243 const struct aead_test_data *tdata, 13244 void *digest_mem, uint64_t digest_phys) 13245 { 13246 struct crypto_testsuite_params *ts_params = &testsuite_params; 13247 struct crypto_unittest_params *ut_params = &unittest_params; 13248 13249 const unsigned int auth_tag_len = tdata->auth_tag.len; 13250 const unsigned int iv_len = tdata->iv.len; 13251 unsigned int aad_len = tdata->aad.len; 13252 unsigned int aad_len_pad = 0; 13253 13254 /* Generate Crypto op data structure */ 13255 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 13256 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 13257 TEST_ASSERT_NOT_NULL(ut_params->op, 13258 "Failed to allocate symmetric crypto operation struct"); 13259 13260 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 13261 13262 sym_op->aead.digest.data = digest_mem; 13263 13264 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 13265 "no room to append digest"); 13266 13267 sym_op->aead.digest.phys_addr = digest_phys; 13268 13269 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 13270 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 13271 auth_tag_len); 13272 debug_hexdump(stdout, "digest:", 13273 sym_op->aead.digest.data, 13274 auth_tag_len); 13275 } 13276 13277 /* Append aad data */ 13278 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 13279 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13280 uint8_t *, IV_OFFSET); 13281 13282 /* Copy IV 1 byte after the IV pointer, according to the API */ 13283 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 13284 13285 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 13286 13287 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 13288 ut_params->ibuf, aad_len); 13289 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 13290 "no room to prepend aad"); 13291 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 13292 ut_params->ibuf); 13293 13294 memset(sym_op->aead.aad.data, 0, aad_len); 13295 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 13296 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 13297 13298 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 13299 debug_hexdump(stdout, "aad:", 13300 sym_op->aead.aad.data, aad_len); 13301 } else { 13302 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 13303 uint8_t *, IV_OFFSET); 13304 13305 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 13306 13307 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 13308 13309 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 13310 ut_params->ibuf, aad_len_pad); 13311 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 13312 "no room to prepend aad"); 13313 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 13314 ut_params->ibuf); 13315 13316 memset(sym_op->aead.aad.data, 0, aad_len); 13317 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 13318 13319 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 13320 debug_hexdump(stdout, "aad:", 13321 sym_op->aead.aad.data, aad_len); 13322 } 13323 13324 sym_op->aead.data.length = tdata->plaintext.len; 13325 sym_op->aead.data.offset = aad_len_pad; 13326 13327 return 0; 13328 } 13329 13330 #define SGL_MAX_NO 16 13331 13332 static int 13333 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 13334 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 13335 { 13336 struct crypto_testsuite_params *ts_params = &testsuite_params; 13337 struct crypto_unittest_params *ut_params = &unittest_params; 13338 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 13339 int retval; 13340 int to_trn = 0; 13341 int to_trn_tbl[SGL_MAX_NO]; 13342 int segs = 1; 13343 unsigned int trn_data = 0; 13344 uint8_t *plaintext, *ciphertext, *auth_tag; 13345 struct rte_cryptodev_info dev_info; 13346 13347 /* Verify the capabilities */ 13348 struct rte_cryptodev_sym_capability_idx cap_idx; 13349 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 13350 cap_idx.algo.aead = tdata->algo; 13351 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13352 &cap_idx) == NULL) 13353 return TEST_SKIPPED; 13354 13355 /* OOP not supported with CPU crypto */ 13356 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13357 return TEST_SKIPPED; 13358 13359 /* Detailed check for the particular SGL support flag */ 13360 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13361 if (!oop) { 13362 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13363 if (sgl_in && (!(dev_info.feature_flags & 13364 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 13365 return TEST_SKIPPED; 13366 13367 uint64_t feat_flags = dev_info.feature_flags; 13368 13369 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13370 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13371 printf("Device doesn't support RAW data-path APIs.\n"); 13372 return TEST_SKIPPED; 13373 } 13374 } else { 13375 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13376 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 13377 tdata->plaintext.len; 13378 /* Raw data path API does not support OOP */ 13379 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13380 return TEST_SKIPPED; 13381 if (sgl_in && !sgl_out) { 13382 if (!(dev_info.feature_flags & 13383 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 13384 return TEST_SKIPPED; 13385 } else if (!sgl_in && sgl_out) { 13386 if (!(dev_info.feature_flags & 13387 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 13388 return TEST_SKIPPED; 13389 } else if (sgl_in && sgl_out) { 13390 if (!(dev_info.feature_flags & 13391 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 13392 return TEST_SKIPPED; 13393 } 13394 } 13395 13396 if (fragsz > tdata->plaintext.len) 13397 fragsz = tdata->plaintext.len; 13398 13399 uint16_t plaintext_len = fragsz; 13400 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 13401 13402 if (fragsz_oop > tdata->plaintext.len) 13403 frag_size_oop = tdata->plaintext.len; 13404 13405 int ecx = 0; 13406 void *digest_mem = NULL; 13407 13408 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 13409 13410 if (tdata->plaintext.len % fragsz != 0) { 13411 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 13412 return 1; 13413 } else { 13414 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 13415 return 1; 13416 } 13417 13418 /* 13419 * For out-op-place we need to alloc another mbuf 13420 */ 13421 if (oop) { 13422 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13423 rte_pktmbuf_append(ut_params->obuf, 13424 frag_size_oop + prepend_len); 13425 buf_oop = ut_params->obuf; 13426 } 13427 13428 /* Create AEAD session */ 13429 retval = create_aead_session(ts_params->valid_devs[0], 13430 tdata->algo, 13431 RTE_CRYPTO_AEAD_OP_ENCRYPT, 13432 tdata->key.data, tdata->key.len, 13433 tdata->aad.len, tdata->auth_tag.len, 13434 tdata->iv.len); 13435 if (retval < 0) 13436 return retval; 13437 13438 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13439 13440 /* clear mbuf payload */ 13441 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13442 rte_pktmbuf_tailroom(ut_params->ibuf)); 13443 13444 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13445 plaintext_len); 13446 13447 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 13448 13449 trn_data += plaintext_len; 13450 13451 buf = ut_params->ibuf; 13452 13453 /* 13454 * Loop until no more fragments 13455 */ 13456 13457 while (trn_data < tdata->plaintext.len) { 13458 ++segs; 13459 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 13460 (tdata->plaintext.len - trn_data) : fragsz; 13461 13462 to_trn_tbl[ecx++] = to_trn; 13463 13464 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13465 buf = buf->next; 13466 13467 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 13468 rte_pktmbuf_tailroom(buf)); 13469 13470 /* OOP */ 13471 if (oop && !fragsz_oop) { 13472 buf_last_oop = buf_oop->next = 13473 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13474 buf_oop = buf_oop->next; 13475 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13476 0, rte_pktmbuf_tailroom(buf_oop)); 13477 rte_pktmbuf_append(buf_oop, to_trn); 13478 } 13479 13480 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 13481 to_trn); 13482 13483 memcpy(plaintext, tdata->plaintext.data + trn_data, 13484 to_trn); 13485 trn_data += to_trn; 13486 if (trn_data == tdata->plaintext.len) { 13487 if (oop) { 13488 if (!fragsz_oop) 13489 digest_mem = rte_pktmbuf_append(buf_oop, 13490 tdata->auth_tag.len); 13491 } else 13492 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 13493 tdata->auth_tag.len); 13494 } 13495 } 13496 13497 uint64_t digest_phys = 0; 13498 13499 ut_params->ibuf->nb_segs = segs; 13500 13501 segs = 1; 13502 if (fragsz_oop && oop) { 13503 to_trn = 0; 13504 ecx = 0; 13505 13506 if (frag_size_oop == tdata->plaintext.len) { 13507 digest_mem = rte_pktmbuf_append(ut_params->obuf, 13508 tdata->auth_tag.len); 13509 13510 digest_phys = rte_pktmbuf_iova_offset( 13511 ut_params->obuf, 13512 tdata->plaintext.len + prepend_len); 13513 } 13514 13515 trn_data = frag_size_oop; 13516 while (trn_data < tdata->plaintext.len) { 13517 ++segs; 13518 to_trn = 13519 (tdata->plaintext.len - trn_data < 13520 frag_size_oop) ? 13521 (tdata->plaintext.len - trn_data) : 13522 frag_size_oop; 13523 13524 to_trn_tbl[ecx++] = to_trn; 13525 13526 buf_last_oop = buf_oop->next = 13527 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13528 buf_oop = buf_oop->next; 13529 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13530 0, rte_pktmbuf_tailroom(buf_oop)); 13531 rte_pktmbuf_append(buf_oop, to_trn); 13532 13533 trn_data += to_trn; 13534 13535 if (trn_data == tdata->plaintext.len) { 13536 digest_mem = rte_pktmbuf_append(buf_oop, 13537 tdata->auth_tag.len); 13538 } 13539 } 13540 13541 ut_params->obuf->nb_segs = segs; 13542 } 13543 13544 /* 13545 * Place digest at the end of the last buffer 13546 */ 13547 if (!digest_phys) 13548 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 13549 if (oop && buf_last_oop) 13550 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 13551 13552 if (!digest_mem && !oop) { 13553 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13554 + tdata->auth_tag.len); 13555 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 13556 tdata->plaintext.len); 13557 } 13558 13559 /* Create AEAD operation */ 13560 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 13561 tdata, digest_mem, digest_phys); 13562 13563 if (retval < 0) 13564 return retval; 13565 13566 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13567 13568 ut_params->op->sym->m_src = ut_params->ibuf; 13569 if (oop) 13570 ut_params->op->sym->m_dst = ut_params->obuf; 13571 13572 /* Process crypto operation */ 13573 if (oop == IN_PLACE && 13574 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13575 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 13576 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13577 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13578 ut_params->op, 0, 0, 0, 0); 13579 else 13580 TEST_ASSERT_NOT_NULL( 13581 process_crypto_request(ts_params->valid_devs[0], 13582 ut_params->op), "failed to process sym crypto op"); 13583 13584 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13585 "crypto op processing failed"); 13586 13587 13588 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 13589 uint8_t *, prepend_len); 13590 if (oop) { 13591 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 13592 uint8_t *, prepend_len); 13593 } 13594 13595 if (fragsz_oop) 13596 fragsz = fragsz_oop; 13597 13598 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13599 ciphertext, 13600 tdata->ciphertext.data, 13601 fragsz, 13602 "Ciphertext data not as expected"); 13603 13604 buf = ut_params->op->sym->m_src->next; 13605 if (oop) 13606 buf = ut_params->op->sym->m_dst->next; 13607 13608 unsigned int off = fragsz; 13609 13610 ecx = 0; 13611 while (buf) { 13612 ciphertext = rte_pktmbuf_mtod(buf, 13613 uint8_t *); 13614 13615 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13616 ciphertext, 13617 tdata->ciphertext.data + off, 13618 to_trn_tbl[ecx], 13619 "Ciphertext data not as expected"); 13620 13621 off += to_trn_tbl[ecx++]; 13622 buf = buf->next; 13623 } 13624 13625 auth_tag = digest_mem; 13626 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13627 auth_tag, 13628 tdata->auth_tag.data, 13629 tdata->auth_tag.len, 13630 "Generated auth tag not as expected"); 13631 13632 return 0; 13633 } 13634 13635 static int 13636 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 13637 { 13638 return test_authenticated_encryption_SGL( 13639 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 13640 } 13641 13642 static int 13643 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 13644 { 13645 return test_authenticated_encryption_SGL( 13646 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 13647 } 13648 13649 static int 13650 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 13651 { 13652 return test_authenticated_encryption_SGL( 13653 &gcm_test_case_8, OUT_OF_PLACE, 400, 13654 gcm_test_case_8.plaintext.len); 13655 } 13656 13657 static int 13658 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 13659 { 13660 /* This test is not for OPENSSL PMD */ 13661 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13662 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 13663 return TEST_SKIPPED; 13664 13665 return test_authenticated_encryption_SGL( 13666 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 13667 } 13668 13669 static int 13670 test_authentication_verify_fail_when_data_corrupted( 13671 struct crypto_testsuite_params *ts_params, 13672 struct crypto_unittest_params *ut_params, 13673 const struct test_crypto_vector *reference) 13674 { 13675 return test_authentication_verify_fail_when_data_corruption( 13676 ts_params, ut_params, reference, 1); 13677 } 13678 13679 static int 13680 test_authentication_verify_fail_when_tag_corrupted( 13681 struct crypto_testsuite_params *ts_params, 13682 struct crypto_unittest_params *ut_params, 13683 const struct test_crypto_vector *reference) 13684 { 13685 return test_authentication_verify_fail_when_data_corruption( 13686 ts_params, ut_params, reference, 0); 13687 } 13688 13689 static int 13690 test_authentication_verify_GMAC_fail_when_data_corrupted( 13691 struct crypto_testsuite_params *ts_params, 13692 struct crypto_unittest_params *ut_params, 13693 const struct test_crypto_vector *reference) 13694 { 13695 return test_authentication_verify_GMAC_fail_when_corruption( 13696 ts_params, ut_params, reference, 1); 13697 } 13698 13699 static int 13700 test_authentication_verify_GMAC_fail_when_tag_corrupted( 13701 struct crypto_testsuite_params *ts_params, 13702 struct crypto_unittest_params *ut_params, 13703 const struct test_crypto_vector *reference) 13704 { 13705 return test_authentication_verify_GMAC_fail_when_corruption( 13706 ts_params, ut_params, reference, 0); 13707 } 13708 13709 static int 13710 test_authenticated_decryption_fail_when_data_corrupted( 13711 struct crypto_testsuite_params *ts_params, 13712 struct crypto_unittest_params *ut_params, 13713 const struct test_crypto_vector *reference) 13714 { 13715 return test_authenticated_decryption_fail_when_corruption( 13716 ts_params, ut_params, reference, 1); 13717 } 13718 13719 static int 13720 test_authenticated_decryption_fail_when_tag_corrupted( 13721 struct crypto_testsuite_params *ts_params, 13722 struct crypto_unittest_params *ut_params, 13723 const struct test_crypto_vector *reference) 13724 { 13725 return test_authenticated_decryption_fail_when_corruption( 13726 ts_params, ut_params, reference, 0); 13727 } 13728 13729 static int 13730 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 13731 { 13732 return test_authentication_verify_fail_when_data_corrupted( 13733 &testsuite_params, &unittest_params, 13734 &hmac_sha1_test_crypto_vector); 13735 } 13736 13737 static int 13738 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 13739 { 13740 return test_authentication_verify_fail_when_tag_corrupted( 13741 &testsuite_params, &unittest_params, 13742 &hmac_sha1_test_crypto_vector); 13743 } 13744 13745 static int 13746 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 13747 { 13748 return test_authentication_verify_GMAC_fail_when_data_corrupted( 13749 &testsuite_params, &unittest_params, 13750 &aes128_gmac_test_vector); 13751 } 13752 13753 static int 13754 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 13755 { 13756 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 13757 &testsuite_params, &unittest_params, 13758 &aes128_gmac_test_vector); 13759 } 13760 13761 static int 13762 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 13763 { 13764 return test_authenticated_decryption_fail_when_data_corrupted( 13765 &testsuite_params, 13766 &unittest_params, 13767 &aes128cbc_hmac_sha1_test_vector); 13768 } 13769 13770 static int 13771 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 13772 { 13773 return test_authenticated_decryption_fail_when_tag_corrupted( 13774 &testsuite_params, 13775 &unittest_params, 13776 &aes128cbc_hmac_sha1_test_vector); 13777 } 13778 13779 static int 13780 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13781 { 13782 return test_authenticated_encrypt_with_esn( 13783 &testsuite_params, 13784 &unittest_params, 13785 &aes128cbc_hmac_sha1_aad_test_vector); 13786 } 13787 13788 static int 13789 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13790 { 13791 return test_authenticated_decrypt_with_esn( 13792 &testsuite_params, 13793 &unittest_params, 13794 &aes128cbc_hmac_sha1_aad_test_vector); 13795 } 13796 13797 static int 13798 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 13799 { 13800 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 13801 } 13802 13803 static int 13804 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 13805 { 13806 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 13807 } 13808 13809 #ifdef RTE_CRYPTO_SCHEDULER 13810 13811 /* global AESNI worker IDs for the scheduler test */ 13812 uint8_t aesni_ids[2]; 13813 13814 static int 13815 scheduler_testsuite_setup(void) 13816 { 13817 uint32_t i = 0; 13818 int32_t nb_devs, ret; 13819 char vdev_args[VDEV_ARGS_SIZE] = {""}; 13820 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 13821 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 13822 uint16_t worker_core_count = 0; 13823 uint16_t socket_id = 0; 13824 13825 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13826 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 13827 13828 /* Identify the Worker Cores 13829 * Use 2 worker cores for the device args 13830 */ 13831 RTE_LCORE_FOREACH_WORKER(i) { 13832 if (worker_core_count > 1) 13833 break; 13834 snprintf(vdev_args, sizeof(vdev_args), 13835 "%s%d", temp_str, i); 13836 strcpy(temp_str, vdev_args); 13837 strlcat(temp_str, ";", sizeof(temp_str)); 13838 worker_core_count++; 13839 socket_id = rte_lcore_to_socket_id(i); 13840 } 13841 if (worker_core_count != 2) { 13842 RTE_LOG(ERR, USER1, 13843 "Cryptodev scheduler test require at least " 13844 "two worker cores to run. " 13845 "Please use the correct coremask.\n"); 13846 return TEST_FAILED; 13847 } 13848 strcpy(temp_str, vdev_args); 13849 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 13850 temp_str, socket_id); 13851 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 13852 nb_devs = rte_cryptodev_device_count_by_driver( 13853 rte_cryptodev_driver_id_get( 13854 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 13855 if (nb_devs < 1) { 13856 ret = rte_vdev_init( 13857 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 13858 vdev_args); 13859 TEST_ASSERT(ret == 0, 13860 "Failed to create instance %u of pmd : %s", 13861 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 13862 } 13863 } 13864 return testsuite_setup(); 13865 } 13866 13867 static int 13868 test_scheduler_attach_worker_op(void) 13869 { 13870 struct crypto_testsuite_params *ts_params = &testsuite_params; 13871 uint8_t sched_id = ts_params->valid_devs[0]; 13872 uint32_t i, nb_devs_attached = 0; 13873 int ret; 13874 char vdev_name[32]; 13875 unsigned int count = rte_cryptodev_count(); 13876 13877 /* create 2 AESNI_MB vdevs on top of existing devices */ 13878 for (i = count; i < count + 2; i++) { 13879 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 13880 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 13881 i); 13882 ret = rte_vdev_init(vdev_name, NULL); 13883 13884 TEST_ASSERT(ret == 0, 13885 "Failed to create instance %u of" 13886 " pmd : %s", 13887 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13888 13889 if (ret < 0) { 13890 RTE_LOG(ERR, USER1, 13891 "Failed to create 2 AESNI MB PMDs.\n"); 13892 return TEST_SKIPPED; 13893 } 13894 } 13895 13896 /* attach 2 AESNI_MB cdevs */ 13897 for (i = count; i < count + 2; i++) { 13898 struct rte_cryptodev_info info; 13899 unsigned int session_size; 13900 13901 rte_cryptodev_info_get(i, &info); 13902 if (info.driver_id != rte_cryptodev_driver_id_get( 13903 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 13904 continue; 13905 13906 session_size = rte_cryptodev_sym_get_private_session_size(i); 13907 /* 13908 * Create the session mempool again, since now there are new devices 13909 * to use the mempool. 13910 */ 13911 if (ts_params->session_mpool) { 13912 rte_mempool_free(ts_params->session_mpool); 13913 ts_params->session_mpool = NULL; 13914 } 13915 if (ts_params->session_priv_mpool) { 13916 rte_mempool_free(ts_params->session_priv_mpool); 13917 ts_params->session_priv_mpool = NULL; 13918 } 13919 13920 if (info.sym.max_nb_sessions != 0 && 13921 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 13922 RTE_LOG(ERR, USER1, 13923 "Device does not support " 13924 "at least %u sessions\n", 13925 MAX_NB_SESSIONS); 13926 return TEST_FAILED; 13927 } 13928 /* 13929 * Create mempool with maximum number of sessions, 13930 * to include the session headers 13931 */ 13932 if (ts_params->session_mpool == NULL) { 13933 ts_params->session_mpool = 13934 rte_cryptodev_sym_session_pool_create( 13935 "test_sess_mp", 13936 MAX_NB_SESSIONS, 0, 0, 0, 13937 SOCKET_ID_ANY); 13938 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 13939 "session mempool allocation failed"); 13940 } 13941 13942 /* 13943 * Create mempool with maximum number of sessions, 13944 * to include device specific session private data 13945 */ 13946 if (ts_params->session_priv_mpool == NULL) { 13947 ts_params->session_priv_mpool = rte_mempool_create( 13948 "test_sess_mp_priv", 13949 MAX_NB_SESSIONS, 13950 session_size, 13951 0, 0, NULL, NULL, NULL, 13952 NULL, SOCKET_ID_ANY, 13953 0); 13954 13955 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 13956 "session mempool allocation failed"); 13957 } 13958 13959 ts_params->qp_conf.mp_session = ts_params->session_mpool; 13960 ts_params->qp_conf.mp_session_private = 13961 ts_params->session_priv_mpool; 13962 13963 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 13964 (uint8_t)i); 13965 13966 TEST_ASSERT(ret == 0, 13967 "Failed to attach device %u of pmd : %s", i, 13968 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13969 13970 aesni_ids[nb_devs_attached] = (uint8_t)i; 13971 13972 nb_devs_attached++; 13973 } 13974 13975 return 0; 13976 } 13977 13978 static int 13979 test_scheduler_detach_worker_op(void) 13980 { 13981 struct crypto_testsuite_params *ts_params = &testsuite_params; 13982 uint8_t sched_id = ts_params->valid_devs[0]; 13983 uint32_t i; 13984 int ret; 13985 13986 for (i = 0; i < 2; i++) { 13987 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 13988 aesni_ids[i]); 13989 TEST_ASSERT(ret == 0, 13990 "Failed to detach device %u", aesni_ids[i]); 13991 } 13992 13993 return 0; 13994 } 13995 13996 static int 13997 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 13998 { 13999 struct crypto_testsuite_params *ts_params = &testsuite_params; 14000 uint8_t sched_id = ts_params->valid_devs[0]; 14001 /* set mode */ 14002 return rte_cryptodev_scheduler_mode_set(sched_id, 14003 scheduler_mode); 14004 } 14005 14006 static int 14007 test_scheduler_mode_roundrobin_op(void) 14008 { 14009 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 14010 0, "Failed to set roundrobin mode"); 14011 return 0; 14012 14013 } 14014 14015 static int 14016 test_scheduler_mode_multicore_op(void) 14017 { 14018 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 14019 0, "Failed to set multicore mode"); 14020 14021 return 0; 14022 } 14023 14024 static int 14025 test_scheduler_mode_failover_op(void) 14026 { 14027 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 14028 0, "Failed to set failover mode"); 14029 14030 return 0; 14031 } 14032 14033 static int 14034 test_scheduler_mode_pkt_size_distr_op(void) 14035 { 14036 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 14037 0, "Failed to set pktsize mode"); 14038 14039 return 0; 14040 } 14041 14042 static int 14043 scheduler_multicore_testsuite_setup(void) 14044 { 14045 if (test_scheduler_attach_worker_op() < 0) 14046 return TEST_SKIPPED; 14047 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0) 14048 return TEST_SKIPPED; 14049 return 0; 14050 } 14051 14052 static int 14053 scheduler_roundrobin_testsuite_setup(void) 14054 { 14055 if (test_scheduler_attach_worker_op() < 0) 14056 return TEST_SKIPPED; 14057 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0) 14058 return TEST_SKIPPED; 14059 return 0; 14060 } 14061 14062 static int 14063 scheduler_failover_testsuite_setup(void) 14064 { 14065 if (test_scheduler_attach_worker_op() < 0) 14066 return TEST_SKIPPED; 14067 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0) 14068 return TEST_SKIPPED; 14069 return 0; 14070 } 14071 14072 static int 14073 scheduler_pkt_size_distr_testsuite_setup(void) 14074 { 14075 if (test_scheduler_attach_worker_op() < 0) 14076 return TEST_SKIPPED; 14077 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0) 14078 return TEST_SKIPPED; 14079 return 0; 14080 } 14081 14082 static void 14083 scheduler_mode_testsuite_teardown(void) 14084 { 14085 test_scheduler_detach_worker_op(); 14086 } 14087 14088 #endif /* RTE_CRYPTO_SCHEDULER */ 14089 14090 static struct unit_test_suite end_testsuite = { 14091 .suite_name = NULL, 14092 .setup = NULL, 14093 .teardown = NULL, 14094 .unit_test_suites = NULL 14095 }; 14096 14097 #ifdef RTE_LIB_SECURITY 14098 static struct unit_test_suite ipsec_proto_testsuite = { 14099 .suite_name = "IPsec Proto Unit Test Suite", 14100 .setup = ipsec_proto_testsuite_setup, 14101 .unit_test_cases = { 14102 TEST_CASE_NAMED_WITH_DATA( 14103 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 14104 ut_setup_security, ut_teardown, 14105 test_ipsec_proto_known_vec, &pkt_aes_128_gcm), 14106 TEST_CASE_NAMED_WITH_DATA( 14107 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 14108 ut_setup_security, ut_teardown, 14109 test_ipsec_proto_known_vec, &pkt_aes_192_gcm), 14110 TEST_CASE_NAMED_WITH_DATA( 14111 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 14112 ut_setup_security, ut_teardown, 14113 test_ipsec_proto_known_vec, &pkt_aes_256_gcm), 14114 TEST_CASE_NAMED_WITH_DATA( 14115 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)", 14116 ut_setup_security, ut_teardown, 14117 test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm), 14118 TEST_CASE_NAMED_WITH_DATA( 14119 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)", 14120 ut_setup_security, ut_teardown, 14121 test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm), 14122 TEST_CASE_NAMED_WITH_DATA( 14123 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)", 14124 ut_setup_security, ut_teardown, 14125 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm), 14126 TEST_CASE_NAMED_ST( 14127 "Combined test alg list", 14128 ut_setup_security, ut_teardown, 14129 test_ipsec_proto_display_list), 14130 TEST_CASE_NAMED_ST( 14131 "IV generation", 14132 ut_setup_security, ut_teardown, 14133 test_ipsec_proto_iv_gen), 14134 TEST_CASE_NAMED_ST( 14135 "UDP encapsulation", 14136 ut_setup_security, ut_teardown, 14137 test_ipsec_proto_udp_encap), 14138 TEST_CASE_NAMED_ST( 14139 "Negative test: ICV corruption", 14140 ut_setup_security, ut_teardown, 14141 test_ipsec_proto_err_icv_corrupt), 14142 TEST_CASES_END() /**< NULL terminate unit test array */ 14143 } 14144 }; 14145 14146 static struct unit_test_suite pdcp_proto_testsuite = { 14147 .suite_name = "PDCP Proto Unit Test Suite", 14148 .setup = pdcp_proto_testsuite_setup, 14149 .unit_test_cases = { 14150 TEST_CASE_ST(ut_setup_security, ut_teardown, 14151 test_PDCP_PROTO_all), 14152 TEST_CASES_END() /**< NULL terminate unit test array */ 14153 } 14154 }; 14155 14156 static struct unit_test_suite docsis_proto_testsuite = { 14157 .suite_name = "Docsis Proto Unit Test Suite", 14158 .setup = docsis_proto_testsuite_setup, 14159 .unit_test_cases = { 14160 TEST_CASE_ST(ut_setup_security, ut_teardown, 14161 test_DOCSIS_PROTO_all), 14162 TEST_CASES_END() /**< NULL terminate unit test array */ 14163 } 14164 }; 14165 #endif 14166 14167 static struct unit_test_suite cryptodev_gen_testsuite = { 14168 .suite_name = "Crypto General Unit Test Suite", 14169 .setup = crypto_gen_testsuite_setup, 14170 .unit_test_cases = { 14171 TEST_CASE_ST(ut_setup, ut_teardown, 14172 test_device_configure_invalid_dev_id), 14173 TEST_CASE_ST(ut_setup, ut_teardown, 14174 test_queue_pair_descriptor_setup), 14175 TEST_CASE_ST(ut_setup, ut_teardown, 14176 test_device_configure_invalid_queue_pair_ids), 14177 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 14178 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup), 14179 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup), 14180 TEST_CASES_END() /**< NULL terminate unit test array */ 14181 } 14182 }; 14183 14184 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = { 14185 .suite_name = "Negative HMAC SHA1 Unit Test Suite", 14186 .setup = negative_hmac_sha1_testsuite_setup, 14187 .unit_test_cases = { 14188 /** Negative tests */ 14189 TEST_CASE_ST(ut_setup, ut_teardown, 14190 authentication_verify_HMAC_SHA1_fail_data_corrupt), 14191 TEST_CASE_ST(ut_setup, ut_teardown, 14192 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 14193 TEST_CASE_ST(ut_setup, ut_teardown, 14194 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 14195 TEST_CASE_ST(ut_setup, ut_teardown, 14196 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 14197 14198 TEST_CASES_END() /**< NULL terminate unit test array */ 14199 } 14200 }; 14201 14202 static struct unit_test_suite cryptodev_multi_session_testsuite = { 14203 .suite_name = "Multi Session Unit Test Suite", 14204 .setup = multi_session_testsuite_setup, 14205 .unit_test_cases = { 14206 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 14207 TEST_CASE_ST(ut_setup, ut_teardown, 14208 test_multi_session_random_usage), 14209 14210 TEST_CASES_END() /**< NULL terminate unit test array */ 14211 } 14212 }; 14213 14214 static struct unit_test_suite cryptodev_null_testsuite = { 14215 .suite_name = "NULL Test Suite", 14216 .setup = null_testsuite_setup, 14217 .unit_test_cases = { 14218 TEST_CASE_ST(ut_setup, ut_teardown, 14219 test_null_invalid_operation), 14220 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 14221 TEST_CASES_END() 14222 } 14223 }; 14224 14225 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = { 14226 .suite_name = "AES CCM Authenticated Test Suite", 14227 .setup = aes_ccm_auth_testsuite_setup, 14228 .unit_test_cases = { 14229 /** AES CCM Authenticated Encryption 128 bits key*/ 14230 TEST_CASE_ST(ut_setup, ut_teardown, 14231 test_AES_CCM_authenticated_encryption_test_case_128_1), 14232 TEST_CASE_ST(ut_setup, ut_teardown, 14233 test_AES_CCM_authenticated_encryption_test_case_128_2), 14234 TEST_CASE_ST(ut_setup, ut_teardown, 14235 test_AES_CCM_authenticated_encryption_test_case_128_3), 14236 14237 /** AES CCM Authenticated Decryption 128 bits key*/ 14238 TEST_CASE_ST(ut_setup, ut_teardown, 14239 test_AES_CCM_authenticated_decryption_test_case_128_1), 14240 TEST_CASE_ST(ut_setup, ut_teardown, 14241 test_AES_CCM_authenticated_decryption_test_case_128_2), 14242 TEST_CASE_ST(ut_setup, ut_teardown, 14243 test_AES_CCM_authenticated_decryption_test_case_128_3), 14244 14245 /** AES CCM Authenticated Encryption 192 bits key */ 14246 TEST_CASE_ST(ut_setup, ut_teardown, 14247 test_AES_CCM_authenticated_encryption_test_case_192_1), 14248 TEST_CASE_ST(ut_setup, ut_teardown, 14249 test_AES_CCM_authenticated_encryption_test_case_192_2), 14250 TEST_CASE_ST(ut_setup, ut_teardown, 14251 test_AES_CCM_authenticated_encryption_test_case_192_3), 14252 14253 /** AES CCM Authenticated Decryption 192 bits key*/ 14254 TEST_CASE_ST(ut_setup, ut_teardown, 14255 test_AES_CCM_authenticated_decryption_test_case_192_1), 14256 TEST_CASE_ST(ut_setup, ut_teardown, 14257 test_AES_CCM_authenticated_decryption_test_case_192_2), 14258 TEST_CASE_ST(ut_setup, ut_teardown, 14259 test_AES_CCM_authenticated_decryption_test_case_192_3), 14260 14261 /** AES CCM Authenticated Encryption 256 bits key */ 14262 TEST_CASE_ST(ut_setup, ut_teardown, 14263 test_AES_CCM_authenticated_encryption_test_case_256_1), 14264 TEST_CASE_ST(ut_setup, ut_teardown, 14265 test_AES_CCM_authenticated_encryption_test_case_256_2), 14266 TEST_CASE_ST(ut_setup, ut_teardown, 14267 test_AES_CCM_authenticated_encryption_test_case_256_3), 14268 14269 /** AES CCM Authenticated Decryption 256 bits key*/ 14270 TEST_CASE_ST(ut_setup, ut_teardown, 14271 test_AES_CCM_authenticated_decryption_test_case_256_1), 14272 TEST_CASE_ST(ut_setup, ut_teardown, 14273 test_AES_CCM_authenticated_decryption_test_case_256_2), 14274 TEST_CASE_ST(ut_setup, ut_teardown, 14275 test_AES_CCM_authenticated_decryption_test_case_256_3), 14276 TEST_CASES_END() 14277 } 14278 }; 14279 14280 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = { 14281 .suite_name = "AES GCM Authenticated Test Suite", 14282 .setup = aes_gcm_auth_testsuite_setup, 14283 .unit_test_cases = { 14284 /** AES GCM Authenticated Encryption */ 14285 TEST_CASE_ST(ut_setup, ut_teardown, 14286 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 14287 TEST_CASE_ST(ut_setup, ut_teardown, 14288 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 14289 TEST_CASE_ST(ut_setup, ut_teardown, 14290 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 14291 TEST_CASE_ST(ut_setup, ut_teardown, 14292 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 14293 TEST_CASE_ST(ut_setup, ut_teardown, 14294 test_AES_GCM_authenticated_encryption_test_case_1), 14295 TEST_CASE_ST(ut_setup, ut_teardown, 14296 test_AES_GCM_authenticated_encryption_test_case_2), 14297 TEST_CASE_ST(ut_setup, ut_teardown, 14298 test_AES_GCM_authenticated_encryption_test_case_3), 14299 TEST_CASE_ST(ut_setup, ut_teardown, 14300 test_AES_GCM_authenticated_encryption_test_case_4), 14301 TEST_CASE_ST(ut_setup, ut_teardown, 14302 test_AES_GCM_authenticated_encryption_test_case_5), 14303 TEST_CASE_ST(ut_setup, ut_teardown, 14304 test_AES_GCM_authenticated_encryption_test_case_6), 14305 TEST_CASE_ST(ut_setup, ut_teardown, 14306 test_AES_GCM_authenticated_encryption_test_case_7), 14307 TEST_CASE_ST(ut_setup, ut_teardown, 14308 test_AES_GCM_authenticated_encryption_test_case_8), 14309 TEST_CASE_ST(ut_setup, ut_teardown, 14310 test_AES_GCM_J0_authenticated_encryption_test_case_1), 14311 14312 /** AES GCM Authenticated Decryption */ 14313 TEST_CASE_ST(ut_setup, ut_teardown, 14314 test_AES_GCM_authenticated_decryption_test_case_1), 14315 TEST_CASE_ST(ut_setup, ut_teardown, 14316 test_AES_GCM_authenticated_decryption_test_case_2), 14317 TEST_CASE_ST(ut_setup, ut_teardown, 14318 test_AES_GCM_authenticated_decryption_test_case_3), 14319 TEST_CASE_ST(ut_setup, ut_teardown, 14320 test_AES_GCM_authenticated_decryption_test_case_4), 14321 TEST_CASE_ST(ut_setup, ut_teardown, 14322 test_AES_GCM_authenticated_decryption_test_case_5), 14323 TEST_CASE_ST(ut_setup, ut_teardown, 14324 test_AES_GCM_authenticated_decryption_test_case_6), 14325 TEST_CASE_ST(ut_setup, ut_teardown, 14326 test_AES_GCM_authenticated_decryption_test_case_7), 14327 TEST_CASE_ST(ut_setup, ut_teardown, 14328 test_AES_GCM_authenticated_decryption_test_case_8), 14329 TEST_CASE_ST(ut_setup, ut_teardown, 14330 test_AES_GCM_J0_authenticated_decryption_test_case_1), 14331 14332 /** AES GCM Authenticated Encryption 192 bits key */ 14333 TEST_CASE_ST(ut_setup, ut_teardown, 14334 test_AES_GCM_auth_encryption_test_case_192_1), 14335 TEST_CASE_ST(ut_setup, ut_teardown, 14336 test_AES_GCM_auth_encryption_test_case_192_2), 14337 TEST_CASE_ST(ut_setup, ut_teardown, 14338 test_AES_GCM_auth_encryption_test_case_192_3), 14339 TEST_CASE_ST(ut_setup, ut_teardown, 14340 test_AES_GCM_auth_encryption_test_case_192_4), 14341 TEST_CASE_ST(ut_setup, ut_teardown, 14342 test_AES_GCM_auth_encryption_test_case_192_5), 14343 TEST_CASE_ST(ut_setup, ut_teardown, 14344 test_AES_GCM_auth_encryption_test_case_192_6), 14345 TEST_CASE_ST(ut_setup, ut_teardown, 14346 test_AES_GCM_auth_encryption_test_case_192_7), 14347 14348 /** AES GCM Authenticated Decryption 192 bits key */ 14349 TEST_CASE_ST(ut_setup, ut_teardown, 14350 test_AES_GCM_auth_decryption_test_case_192_1), 14351 TEST_CASE_ST(ut_setup, ut_teardown, 14352 test_AES_GCM_auth_decryption_test_case_192_2), 14353 TEST_CASE_ST(ut_setup, ut_teardown, 14354 test_AES_GCM_auth_decryption_test_case_192_3), 14355 TEST_CASE_ST(ut_setup, ut_teardown, 14356 test_AES_GCM_auth_decryption_test_case_192_4), 14357 TEST_CASE_ST(ut_setup, ut_teardown, 14358 test_AES_GCM_auth_decryption_test_case_192_5), 14359 TEST_CASE_ST(ut_setup, ut_teardown, 14360 test_AES_GCM_auth_decryption_test_case_192_6), 14361 TEST_CASE_ST(ut_setup, ut_teardown, 14362 test_AES_GCM_auth_decryption_test_case_192_7), 14363 14364 /** AES GCM Authenticated Encryption 256 bits key */ 14365 TEST_CASE_ST(ut_setup, ut_teardown, 14366 test_AES_GCM_auth_encryption_test_case_256_1), 14367 TEST_CASE_ST(ut_setup, ut_teardown, 14368 test_AES_GCM_auth_encryption_test_case_256_2), 14369 TEST_CASE_ST(ut_setup, ut_teardown, 14370 test_AES_GCM_auth_encryption_test_case_256_3), 14371 TEST_CASE_ST(ut_setup, ut_teardown, 14372 test_AES_GCM_auth_encryption_test_case_256_4), 14373 TEST_CASE_ST(ut_setup, ut_teardown, 14374 test_AES_GCM_auth_encryption_test_case_256_5), 14375 TEST_CASE_ST(ut_setup, ut_teardown, 14376 test_AES_GCM_auth_encryption_test_case_256_6), 14377 TEST_CASE_ST(ut_setup, ut_teardown, 14378 test_AES_GCM_auth_encryption_test_case_256_7), 14379 14380 /** AES GCM Authenticated Decryption 256 bits key */ 14381 TEST_CASE_ST(ut_setup, ut_teardown, 14382 test_AES_GCM_auth_decryption_test_case_256_1), 14383 TEST_CASE_ST(ut_setup, ut_teardown, 14384 test_AES_GCM_auth_decryption_test_case_256_2), 14385 TEST_CASE_ST(ut_setup, ut_teardown, 14386 test_AES_GCM_auth_decryption_test_case_256_3), 14387 TEST_CASE_ST(ut_setup, ut_teardown, 14388 test_AES_GCM_auth_decryption_test_case_256_4), 14389 TEST_CASE_ST(ut_setup, ut_teardown, 14390 test_AES_GCM_auth_decryption_test_case_256_5), 14391 TEST_CASE_ST(ut_setup, ut_teardown, 14392 test_AES_GCM_auth_decryption_test_case_256_6), 14393 TEST_CASE_ST(ut_setup, ut_teardown, 14394 test_AES_GCM_auth_decryption_test_case_256_7), 14395 14396 /** AES GCM Authenticated Encryption big aad size */ 14397 TEST_CASE_ST(ut_setup, ut_teardown, 14398 test_AES_GCM_auth_encryption_test_case_aad_1), 14399 TEST_CASE_ST(ut_setup, ut_teardown, 14400 test_AES_GCM_auth_encryption_test_case_aad_2), 14401 14402 /** AES GCM Authenticated Decryption big aad size */ 14403 TEST_CASE_ST(ut_setup, ut_teardown, 14404 test_AES_GCM_auth_decryption_test_case_aad_1), 14405 TEST_CASE_ST(ut_setup, ut_teardown, 14406 test_AES_GCM_auth_decryption_test_case_aad_2), 14407 14408 /** Out of place tests */ 14409 TEST_CASE_ST(ut_setup, ut_teardown, 14410 test_AES_GCM_authenticated_encryption_oop_test_case_1), 14411 TEST_CASE_ST(ut_setup, ut_teardown, 14412 test_AES_GCM_authenticated_decryption_oop_test_case_1), 14413 14414 /** Session-less tests */ 14415 TEST_CASE_ST(ut_setup, ut_teardown, 14416 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 14417 TEST_CASE_ST(ut_setup, ut_teardown, 14418 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 14419 14420 TEST_CASES_END() 14421 } 14422 }; 14423 14424 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = { 14425 .suite_name = "AES GMAC Authentication Test Suite", 14426 .setup = aes_gmac_auth_testsuite_setup, 14427 .unit_test_cases = { 14428 TEST_CASE_ST(ut_setup, ut_teardown, 14429 test_AES_GMAC_authentication_test_case_1), 14430 TEST_CASE_ST(ut_setup, ut_teardown, 14431 test_AES_GMAC_authentication_verify_test_case_1), 14432 TEST_CASE_ST(ut_setup, ut_teardown, 14433 test_AES_GMAC_authentication_test_case_2), 14434 TEST_CASE_ST(ut_setup, ut_teardown, 14435 test_AES_GMAC_authentication_verify_test_case_2), 14436 TEST_CASE_ST(ut_setup, ut_teardown, 14437 test_AES_GMAC_authentication_test_case_3), 14438 TEST_CASE_ST(ut_setup, ut_teardown, 14439 test_AES_GMAC_authentication_verify_test_case_3), 14440 TEST_CASE_ST(ut_setup, ut_teardown, 14441 test_AES_GMAC_authentication_test_case_4), 14442 TEST_CASE_ST(ut_setup, ut_teardown, 14443 test_AES_GMAC_authentication_verify_test_case_4), 14444 TEST_CASE_ST(ut_setup, ut_teardown, 14445 test_AES_GMAC_authentication_SGL_40B), 14446 TEST_CASE_ST(ut_setup, ut_teardown, 14447 test_AES_GMAC_authentication_SGL_80B), 14448 TEST_CASE_ST(ut_setup, ut_teardown, 14449 test_AES_GMAC_authentication_SGL_2048B), 14450 TEST_CASE_ST(ut_setup, ut_teardown, 14451 test_AES_GMAC_authentication_SGL_2047B), 14452 14453 TEST_CASES_END() 14454 } 14455 }; 14456 14457 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = { 14458 .suite_name = "Chacha20-Poly1305 Test Suite", 14459 .setup = chacha20_poly1305_testsuite_setup, 14460 .unit_test_cases = { 14461 TEST_CASE_ST(ut_setup, ut_teardown, 14462 test_chacha20_poly1305_encrypt_test_case_rfc8439), 14463 TEST_CASE_ST(ut_setup, ut_teardown, 14464 test_chacha20_poly1305_decrypt_test_case_rfc8439), 14465 TEST_CASES_END() 14466 } 14467 }; 14468 14469 static struct unit_test_suite cryptodev_snow3g_testsuite = { 14470 .suite_name = "SNOW 3G Test Suite", 14471 .setup = snow3g_testsuite_setup, 14472 .unit_test_cases = { 14473 /** SNOW 3G encrypt only (UEA2) */ 14474 TEST_CASE_ST(ut_setup, ut_teardown, 14475 test_snow3g_encryption_test_case_1), 14476 TEST_CASE_ST(ut_setup, ut_teardown, 14477 test_snow3g_encryption_test_case_2), 14478 TEST_CASE_ST(ut_setup, ut_teardown, 14479 test_snow3g_encryption_test_case_3), 14480 TEST_CASE_ST(ut_setup, ut_teardown, 14481 test_snow3g_encryption_test_case_4), 14482 TEST_CASE_ST(ut_setup, ut_teardown, 14483 test_snow3g_encryption_test_case_5), 14484 14485 TEST_CASE_ST(ut_setup, ut_teardown, 14486 test_snow3g_encryption_test_case_1_oop), 14487 TEST_CASE_ST(ut_setup, ut_teardown, 14488 test_snow3g_encryption_test_case_1_oop_sgl), 14489 TEST_CASE_ST(ut_setup, ut_teardown, 14490 test_snow3g_encryption_test_case_1_offset_oop), 14491 TEST_CASE_ST(ut_setup, ut_teardown, 14492 test_snow3g_decryption_test_case_1_oop), 14493 14494 /** SNOW 3G generate auth, then encrypt (UEA2) */ 14495 TEST_CASE_ST(ut_setup, ut_teardown, 14496 test_snow3g_auth_cipher_test_case_1), 14497 TEST_CASE_ST(ut_setup, ut_teardown, 14498 test_snow3g_auth_cipher_test_case_2), 14499 TEST_CASE_ST(ut_setup, ut_teardown, 14500 test_snow3g_auth_cipher_test_case_2_oop), 14501 TEST_CASE_ST(ut_setup, ut_teardown, 14502 test_snow3g_auth_cipher_part_digest_enc), 14503 TEST_CASE_ST(ut_setup, ut_teardown, 14504 test_snow3g_auth_cipher_part_digest_enc_oop), 14505 TEST_CASE_ST(ut_setup, ut_teardown, 14506 test_snow3g_auth_cipher_test_case_3_sgl), 14507 TEST_CASE_ST(ut_setup, ut_teardown, 14508 test_snow3g_auth_cipher_test_case_3_oop_sgl), 14509 TEST_CASE_ST(ut_setup, ut_teardown, 14510 test_snow3g_auth_cipher_part_digest_enc_sgl), 14511 TEST_CASE_ST(ut_setup, ut_teardown, 14512 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 14513 14514 /** SNOW 3G decrypt (UEA2), then verify auth */ 14515 TEST_CASE_ST(ut_setup, ut_teardown, 14516 test_snow3g_auth_cipher_verify_test_case_1), 14517 TEST_CASE_ST(ut_setup, ut_teardown, 14518 test_snow3g_auth_cipher_verify_test_case_2), 14519 TEST_CASE_ST(ut_setup, ut_teardown, 14520 test_snow3g_auth_cipher_verify_test_case_2_oop), 14521 TEST_CASE_ST(ut_setup, ut_teardown, 14522 test_snow3g_auth_cipher_verify_part_digest_enc), 14523 TEST_CASE_ST(ut_setup, ut_teardown, 14524 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 14525 TEST_CASE_ST(ut_setup, ut_teardown, 14526 test_snow3g_auth_cipher_verify_test_case_3_sgl), 14527 TEST_CASE_ST(ut_setup, ut_teardown, 14528 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 14529 TEST_CASE_ST(ut_setup, ut_teardown, 14530 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 14531 TEST_CASE_ST(ut_setup, ut_teardown, 14532 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 14533 14534 /** SNOW 3G decrypt only (UEA2) */ 14535 TEST_CASE_ST(ut_setup, ut_teardown, 14536 test_snow3g_decryption_test_case_1), 14537 TEST_CASE_ST(ut_setup, ut_teardown, 14538 test_snow3g_decryption_test_case_2), 14539 TEST_CASE_ST(ut_setup, ut_teardown, 14540 test_snow3g_decryption_test_case_3), 14541 TEST_CASE_ST(ut_setup, ut_teardown, 14542 test_snow3g_decryption_test_case_4), 14543 TEST_CASE_ST(ut_setup, ut_teardown, 14544 test_snow3g_decryption_test_case_5), 14545 TEST_CASE_ST(ut_setup, ut_teardown, 14546 test_snow3g_decryption_with_digest_test_case_1), 14547 TEST_CASE_ST(ut_setup, ut_teardown, 14548 test_snow3g_hash_generate_test_case_1), 14549 TEST_CASE_ST(ut_setup, ut_teardown, 14550 test_snow3g_hash_generate_test_case_2), 14551 TEST_CASE_ST(ut_setup, ut_teardown, 14552 test_snow3g_hash_generate_test_case_3), 14553 14554 /* Tests with buffers which length is not byte-aligned */ 14555 TEST_CASE_ST(ut_setup, ut_teardown, 14556 test_snow3g_hash_generate_test_case_4), 14557 TEST_CASE_ST(ut_setup, ut_teardown, 14558 test_snow3g_hash_generate_test_case_5), 14559 TEST_CASE_ST(ut_setup, ut_teardown, 14560 test_snow3g_hash_generate_test_case_6), 14561 TEST_CASE_ST(ut_setup, ut_teardown, 14562 test_snow3g_hash_verify_test_case_1), 14563 TEST_CASE_ST(ut_setup, ut_teardown, 14564 test_snow3g_hash_verify_test_case_2), 14565 TEST_CASE_ST(ut_setup, ut_teardown, 14566 test_snow3g_hash_verify_test_case_3), 14567 14568 /* Tests with buffers which length is not byte-aligned */ 14569 TEST_CASE_ST(ut_setup, ut_teardown, 14570 test_snow3g_hash_verify_test_case_4), 14571 TEST_CASE_ST(ut_setup, ut_teardown, 14572 test_snow3g_hash_verify_test_case_5), 14573 TEST_CASE_ST(ut_setup, ut_teardown, 14574 test_snow3g_hash_verify_test_case_6), 14575 TEST_CASE_ST(ut_setup, ut_teardown, 14576 test_snow3g_cipher_auth_test_case_1), 14577 TEST_CASE_ST(ut_setup, ut_teardown, 14578 test_snow3g_auth_cipher_with_digest_test_case_1), 14579 TEST_CASES_END() 14580 } 14581 }; 14582 14583 static struct unit_test_suite cryptodev_zuc_testsuite = { 14584 .suite_name = "ZUC Test Suite", 14585 .setup = zuc_testsuite_setup, 14586 .unit_test_cases = { 14587 /** ZUC encrypt only (EEA3) */ 14588 TEST_CASE_ST(ut_setup, ut_teardown, 14589 test_zuc_encryption_test_case_1), 14590 TEST_CASE_ST(ut_setup, ut_teardown, 14591 test_zuc_encryption_test_case_2), 14592 TEST_CASE_ST(ut_setup, ut_teardown, 14593 test_zuc_encryption_test_case_3), 14594 TEST_CASE_ST(ut_setup, ut_teardown, 14595 test_zuc_encryption_test_case_4), 14596 TEST_CASE_ST(ut_setup, ut_teardown, 14597 test_zuc_encryption_test_case_5), 14598 TEST_CASE_ST(ut_setup, ut_teardown, 14599 test_zuc_encryption_test_case_6_sgl), 14600 14601 /** ZUC authenticate (EIA3) */ 14602 TEST_CASE_ST(ut_setup, ut_teardown, 14603 test_zuc_hash_generate_test_case_1), 14604 TEST_CASE_ST(ut_setup, ut_teardown, 14605 test_zuc_hash_generate_test_case_2), 14606 TEST_CASE_ST(ut_setup, ut_teardown, 14607 test_zuc_hash_generate_test_case_3), 14608 TEST_CASE_ST(ut_setup, ut_teardown, 14609 test_zuc_hash_generate_test_case_4), 14610 TEST_CASE_ST(ut_setup, ut_teardown, 14611 test_zuc_hash_generate_test_case_5), 14612 TEST_CASE_ST(ut_setup, ut_teardown, 14613 test_zuc_hash_generate_test_case_6), 14614 TEST_CASE_ST(ut_setup, ut_teardown, 14615 test_zuc_hash_generate_test_case_7), 14616 TEST_CASE_ST(ut_setup, ut_teardown, 14617 test_zuc_hash_generate_test_case_8), 14618 14619 /** ZUC alg-chain (EEA3/EIA3) */ 14620 TEST_CASE_ST(ut_setup, ut_teardown, 14621 test_zuc_cipher_auth_test_case_1), 14622 TEST_CASE_ST(ut_setup, ut_teardown, 14623 test_zuc_cipher_auth_test_case_2), 14624 14625 /** ZUC generate auth, then encrypt (EEA3) */ 14626 TEST_CASE_ST(ut_setup, ut_teardown, 14627 test_zuc_auth_cipher_test_case_1), 14628 TEST_CASE_ST(ut_setup, ut_teardown, 14629 test_zuc_auth_cipher_test_case_1_oop), 14630 TEST_CASE_ST(ut_setup, ut_teardown, 14631 test_zuc_auth_cipher_test_case_1_sgl), 14632 TEST_CASE_ST(ut_setup, ut_teardown, 14633 test_zuc_auth_cipher_test_case_1_oop_sgl), 14634 14635 /** ZUC decrypt (EEA3), then verify auth */ 14636 TEST_CASE_ST(ut_setup, ut_teardown, 14637 test_zuc_auth_cipher_verify_test_case_1), 14638 TEST_CASE_ST(ut_setup, ut_teardown, 14639 test_zuc_auth_cipher_verify_test_case_1_oop), 14640 TEST_CASE_ST(ut_setup, ut_teardown, 14641 test_zuc_auth_cipher_verify_test_case_1_sgl), 14642 TEST_CASE_ST(ut_setup, ut_teardown, 14643 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 14644 TEST_CASES_END() 14645 } 14646 }; 14647 14648 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = { 14649 .suite_name = "HMAC_MD5 Authentication Test Suite", 14650 .setup = hmac_md5_auth_testsuite_setup, 14651 .unit_test_cases = { 14652 TEST_CASE_ST(ut_setup, ut_teardown, 14653 test_MD5_HMAC_generate_case_1), 14654 TEST_CASE_ST(ut_setup, ut_teardown, 14655 test_MD5_HMAC_verify_case_1), 14656 TEST_CASE_ST(ut_setup, ut_teardown, 14657 test_MD5_HMAC_generate_case_2), 14658 TEST_CASE_ST(ut_setup, ut_teardown, 14659 test_MD5_HMAC_verify_case_2), 14660 TEST_CASES_END() 14661 } 14662 }; 14663 14664 static struct unit_test_suite cryptodev_kasumi_testsuite = { 14665 .suite_name = "Kasumi Test Suite", 14666 .setup = kasumi_testsuite_setup, 14667 .unit_test_cases = { 14668 /** KASUMI hash only (UIA1) */ 14669 TEST_CASE_ST(ut_setup, ut_teardown, 14670 test_kasumi_hash_generate_test_case_1), 14671 TEST_CASE_ST(ut_setup, ut_teardown, 14672 test_kasumi_hash_generate_test_case_2), 14673 TEST_CASE_ST(ut_setup, ut_teardown, 14674 test_kasumi_hash_generate_test_case_3), 14675 TEST_CASE_ST(ut_setup, ut_teardown, 14676 test_kasumi_hash_generate_test_case_4), 14677 TEST_CASE_ST(ut_setup, ut_teardown, 14678 test_kasumi_hash_generate_test_case_5), 14679 TEST_CASE_ST(ut_setup, ut_teardown, 14680 test_kasumi_hash_generate_test_case_6), 14681 14682 TEST_CASE_ST(ut_setup, ut_teardown, 14683 test_kasumi_hash_verify_test_case_1), 14684 TEST_CASE_ST(ut_setup, ut_teardown, 14685 test_kasumi_hash_verify_test_case_2), 14686 TEST_CASE_ST(ut_setup, ut_teardown, 14687 test_kasumi_hash_verify_test_case_3), 14688 TEST_CASE_ST(ut_setup, ut_teardown, 14689 test_kasumi_hash_verify_test_case_4), 14690 TEST_CASE_ST(ut_setup, ut_teardown, 14691 test_kasumi_hash_verify_test_case_5), 14692 14693 /** KASUMI encrypt only (UEA1) */ 14694 TEST_CASE_ST(ut_setup, ut_teardown, 14695 test_kasumi_encryption_test_case_1), 14696 TEST_CASE_ST(ut_setup, ut_teardown, 14697 test_kasumi_encryption_test_case_1_sgl), 14698 TEST_CASE_ST(ut_setup, ut_teardown, 14699 test_kasumi_encryption_test_case_1_oop), 14700 TEST_CASE_ST(ut_setup, ut_teardown, 14701 test_kasumi_encryption_test_case_1_oop_sgl), 14702 TEST_CASE_ST(ut_setup, ut_teardown, 14703 test_kasumi_encryption_test_case_2), 14704 TEST_CASE_ST(ut_setup, ut_teardown, 14705 test_kasumi_encryption_test_case_3), 14706 TEST_CASE_ST(ut_setup, ut_teardown, 14707 test_kasumi_encryption_test_case_4), 14708 TEST_CASE_ST(ut_setup, ut_teardown, 14709 test_kasumi_encryption_test_case_5), 14710 14711 /** KASUMI decrypt only (UEA1) */ 14712 TEST_CASE_ST(ut_setup, ut_teardown, 14713 test_kasumi_decryption_test_case_1), 14714 TEST_CASE_ST(ut_setup, ut_teardown, 14715 test_kasumi_decryption_test_case_2), 14716 TEST_CASE_ST(ut_setup, ut_teardown, 14717 test_kasumi_decryption_test_case_3), 14718 TEST_CASE_ST(ut_setup, ut_teardown, 14719 test_kasumi_decryption_test_case_4), 14720 TEST_CASE_ST(ut_setup, ut_teardown, 14721 test_kasumi_decryption_test_case_5), 14722 TEST_CASE_ST(ut_setup, ut_teardown, 14723 test_kasumi_decryption_test_case_1_oop), 14724 TEST_CASE_ST(ut_setup, ut_teardown, 14725 test_kasumi_cipher_auth_test_case_1), 14726 14727 /** KASUMI generate auth, then encrypt (F8) */ 14728 TEST_CASE_ST(ut_setup, ut_teardown, 14729 test_kasumi_auth_cipher_test_case_1), 14730 TEST_CASE_ST(ut_setup, ut_teardown, 14731 test_kasumi_auth_cipher_test_case_2), 14732 TEST_CASE_ST(ut_setup, ut_teardown, 14733 test_kasumi_auth_cipher_test_case_2_oop), 14734 TEST_CASE_ST(ut_setup, ut_teardown, 14735 test_kasumi_auth_cipher_test_case_2_sgl), 14736 TEST_CASE_ST(ut_setup, ut_teardown, 14737 test_kasumi_auth_cipher_test_case_2_oop_sgl), 14738 14739 /** KASUMI decrypt (F8), then verify auth */ 14740 TEST_CASE_ST(ut_setup, ut_teardown, 14741 test_kasumi_auth_cipher_verify_test_case_1), 14742 TEST_CASE_ST(ut_setup, ut_teardown, 14743 test_kasumi_auth_cipher_verify_test_case_2), 14744 TEST_CASE_ST(ut_setup, ut_teardown, 14745 test_kasumi_auth_cipher_verify_test_case_2_oop), 14746 TEST_CASE_ST(ut_setup, ut_teardown, 14747 test_kasumi_auth_cipher_verify_test_case_2_sgl), 14748 TEST_CASE_ST(ut_setup, ut_teardown, 14749 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 14750 14751 TEST_CASES_END() 14752 } 14753 }; 14754 14755 static struct unit_test_suite cryptodev_esn_testsuite = { 14756 .suite_name = "ESN Test Suite", 14757 .setup = esn_testsuite_setup, 14758 .unit_test_cases = { 14759 TEST_CASE_ST(ut_setup, ut_teardown, 14760 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 14761 TEST_CASE_ST(ut_setup, ut_teardown, 14762 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 14763 TEST_CASES_END() 14764 } 14765 }; 14766 14767 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = { 14768 .suite_name = "Negative AES GCM Test Suite", 14769 .setup = negative_aes_gcm_testsuite_setup, 14770 .unit_test_cases = { 14771 TEST_CASE_ST(ut_setup, ut_teardown, 14772 test_AES_GCM_auth_encryption_fail_iv_corrupt), 14773 TEST_CASE_ST(ut_setup, ut_teardown, 14774 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 14775 TEST_CASE_ST(ut_setup, ut_teardown, 14776 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 14777 TEST_CASE_ST(ut_setup, ut_teardown, 14778 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 14779 TEST_CASE_ST(ut_setup, ut_teardown, 14780 test_AES_GCM_auth_encryption_fail_aad_corrupt), 14781 TEST_CASE_ST(ut_setup, ut_teardown, 14782 test_AES_GCM_auth_encryption_fail_tag_corrupt), 14783 TEST_CASE_ST(ut_setup, ut_teardown, 14784 test_AES_GCM_auth_decryption_fail_iv_corrupt), 14785 TEST_CASE_ST(ut_setup, ut_teardown, 14786 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 14787 TEST_CASE_ST(ut_setup, ut_teardown, 14788 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 14789 TEST_CASE_ST(ut_setup, ut_teardown, 14790 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 14791 TEST_CASE_ST(ut_setup, ut_teardown, 14792 test_AES_GCM_auth_decryption_fail_aad_corrupt), 14793 TEST_CASE_ST(ut_setup, ut_teardown, 14794 test_AES_GCM_auth_decryption_fail_tag_corrupt), 14795 14796 TEST_CASES_END() 14797 } 14798 }; 14799 14800 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = { 14801 .suite_name = "Negative AES GMAC Test Suite", 14802 .setup = negative_aes_gmac_testsuite_setup, 14803 .unit_test_cases = { 14804 TEST_CASE_ST(ut_setup, ut_teardown, 14805 authentication_verify_AES128_GMAC_fail_data_corrupt), 14806 TEST_CASE_ST(ut_setup, ut_teardown, 14807 authentication_verify_AES128_GMAC_fail_tag_corrupt), 14808 14809 TEST_CASES_END() 14810 } 14811 }; 14812 14813 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = { 14814 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite", 14815 .setup = mixed_cipher_hash_testsuite_setup, 14816 .unit_test_cases = { 14817 /** AUTH AES CMAC + CIPHER AES CTR */ 14818 TEST_CASE_ST(ut_setup, ut_teardown, 14819 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 14820 TEST_CASE_ST(ut_setup, ut_teardown, 14821 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14822 TEST_CASE_ST(ut_setup, ut_teardown, 14823 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14824 TEST_CASE_ST(ut_setup, ut_teardown, 14825 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14826 TEST_CASE_ST(ut_setup, ut_teardown, 14827 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 14828 TEST_CASE_ST(ut_setup, ut_teardown, 14829 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14830 TEST_CASE_ST(ut_setup, ut_teardown, 14831 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14832 TEST_CASE_ST(ut_setup, ut_teardown, 14833 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14834 14835 /** AUTH ZUC + CIPHER SNOW3G */ 14836 TEST_CASE_ST(ut_setup, ut_teardown, 14837 test_auth_zuc_cipher_snow_test_case_1), 14838 TEST_CASE_ST(ut_setup, ut_teardown, 14839 test_verify_auth_zuc_cipher_snow_test_case_1), 14840 /** AUTH AES CMAC + CIPHER SNOW3G */ 14841 TEST_CASE_ST(ut_setup, ut_teardown, 14842 test_auth_aes_cmac_cipher_snow_test_case_1), 14843 TEST_CASE_ST(ut_setup, ut_teardown, 14844 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 14845 /** AUTH ZUC + CIPHER AES CTR */ 14846 TEST_CASE_ST(ut_setup, ut_teardown, 14847 test_auth_zuc_cipher_aes_ctr_test_case_1), 14848 TEST_CASE_ST(ut_setup, ut_teardown, 14849 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 14850 /** AUTH SNOW3G + CIPHER AES CTR */ 14851 TEST_CASE_ST(ut_setup, ut_teardown, 14852 test_auth_snow_cipher_aes_ctr_test_case_1), 14853 TEST_CASE_ST(ut_setup, ut_teardown, 14854 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 14855 /** AUTH SNOW3G + CIPHER ZUC */ 14856 TEST_CASE_ST(ut_setup, ut_teardown, 14857 test_auth_snow_cipher_zuc_test_case_1), 14858 TEST_CASE_ST(ut_setup, ut_teardown, 14859 test_verify_auth_snow_cipher_zuc_test_case_1), 14860 /** AUTH AES CMAC + CIPHER ZUC */ 14861 TEST_CASE_ST(ut_setup, ut_teardown, 14862 test_auth_aes_cmac_cipher_zuc_test_case_1), 14863 TEST_CASE_ST(ut_setup, ut_teardown, 14864 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 14865 14866 /** AUTH NULL + CIPHER SNOW3G */ 14867 TEST_CASE_ST(ut_setup, ut_teardown, 14868 test_auth_null_cipher_snow_test_case_1), 14869 TEST_CASE_ST(ut_setup, ut_teardown, 14870 test_verify_auth_null_cipher_snow_test_case_1), 14871 /** AUTH NULL + CIPHER ZUC */ 14872 TEST_CASE_ST(ut_setup, ut_teardown, 14873 test_auth_null_cipher_zuc_test_case_1), 14874 TEST_CASE_ST(ut_setup, ut_teardown, 14875 test_verify_auth_null_cipher_zuc_test_case_1), 14876 /** AUTH SNOW3G + CIPHER NULL */ 14877 TEST_CASE_ST(ut_setup, ut_teardown, 14878 test_auth_snow_cipher_null_test_case_1), 14879 TEST_CASE_ST(ut_setup, ut_teardown, 14880 test_verify_auth_snow_cipher_null_test_case_1), 14881 /** AUTH ZUC + CIPHER NULL */ 14882 TEST_CASE_ST(ut_setup, ut_teardown, 14883 test_auth_zuc_cipher_null_test_case_1), 14884 TEST_CASE_ST(ut_setup, ut_teardown, 14885 test_verify_auth_zuc_cipher_null_test_case_1), 14886 /** AUTH NULL + CIPHER AES CTR */ 14887 TEST_CASE_ST(ut_setup, ut_teardown, 14888 test_auth_null_cipher_aes_ctr_test_case_1), 14889 TEST_CASE_ST(ut_setup, ut_teardown, 14890 test_verify_auth_null_cipher_aes_ctr_test_case_1), 14891 /** AUTH AES CMAC + CIPHER NULL */ 14892 TEST_CASE_ST(ut_setup, ut_teardown, 14893 test_auth_aes_cmac_cipher_null_test_case_1), 14894 TEST_CASE_ST(ut_setup, ut_teardown, 14895 test_verify_auth_aes_cmac_cipher_null_test_case_1), 14896 TEST_CASES_END() 14897 } 14898 }; 14899 14900 static int 14901 run_cryptodev_testsuite(const char *pmd_name) 14902 { 14903 uint8_t ret, j, i = 0, blk_start_idx = 0; 14904 const enum blockcipher_test_type blk_suites[] = { 14905 BLKCIPHER_AES_CHAIN_TYPE, 14906 BLKCIPHER_AES_CIPHERONLY_TYPE, 14907 BLKCIPHER_AES_DOCSIS_TYPE, 14908 BLKCIPHER_3DES_CHAIN_TYPE, 14909 BLKCIPHER_3DES_CIPHERONLY_TYPE, 14910 BLKCIPHER_DES_CIPHERONLY_TYPE, 14911 BLKCIPHER_DES_DOCSIS_TYPE, 14912 BLKCIPHER_AUTHONLY_TYPE}; 14913 struct unit_test_suite *static_suites[] = { 14914 &cryptodev_multi_session_testsuite, 14915 &cryptodev_null_testsuite, 14916 &cryptodev_aes_ccm_auth_testsuite, 14917 &cryptodev_aes_gcm_auth_testsuite, 14918 &cryptodev_aes_gmac_auth_testsuite, 14919 &cryptodev_snow3g_testsuite, 14920 &cryptodev_chacha20_poly1305_testsuite, 14921 &cryptodev_zuc_testsuite, 14922 &cryptodev_hmac_md5_auth_testsuite, 14923 &cryptodev_kasumi_testsuite, 14924 &cryptodev_esn_testsuite, 14925 &cryptodev_negative_aes_gcm_testsuite, 14926 &cryptodev_negative_aes_gmac_testsuite, 14927 &cryptodev_mixed_cipher_hash_testsuite, 14928 &cryptodev_negative_hmac_sha1_testsuite, 14929 &cryptodev_gen_testsuite, 14930 #ifdef RTE_LIB_SECURITY 14931 &ipsec_proto_testsuite, 14932 &pdcp_proto_testsuite, 14933 &docsis_proto_testsuite, 14934 #endif 14935 &end_testsuite 14936 }; 14937 static struct unit_test_suite ts = { 14938 .suite_name = "Cryptodev Unit Test Suite", 14939 .setup = testsuite_setup, 14940 .teardown = testsuite_teardown, 14941 .unit_test_cases = {TEST_CASES_END()} 14942 }; 14943 14944 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name); 14945 14946 if (gbl_driver_id == -1) { 14947 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name); 14948 return TEST_SKIPPED; 14949 } 14950 14951 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 14952 (RTE_DIM(blk_suites) + RTE_DIM(static_suites))); 14953 14954 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites)); 14955 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 14956 ret = unit_test_suite_runner(&ts); 14957 14958 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites)); 14959 free(ts.unit_test_suites); 14960 return ret; 14961 } 14962 14963 static int 14964 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name) 14965 { 14966 struct rte_cryptodev_info dev_info; 14967 uint8_t i, nb_devs; 14968 int driver_id; 14969 14970 driver_id = rte_cryptodev_driver_id_get(pmd_name); 14971 if (driver_id == -1) { 14972 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name); 14973 return TEST_SKIPPED; 14974 } 14975 14976 nb_devs = rte_cryptodev_count(); 14977 if (nb_devs < 1) { 14978 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 14979 return TEST_SKIPPED; 14980 } 14981 14982 for (i = 0; i < nb_devs; i++) { 14983 rte_cryptodev_info_get(i, &dev_info); 14984 if (dev_info.driver_id == driver_id) { 14985 if (!(dev_info.feature_flags & flag)) { 14986 RTE_LOG(INFO, USER1, "%s not supported\n", 14987 flag_name); 14988 return TEST_SKIPPED; 14989 } 14990 return 0; /* found */ 14991 } 14992 } 14993 14994 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name); 14995 return TEST_SKIPPED; 14996 } 14997 14998 static int 14999 test_cryptodev_qat(void) 15000 { 15001 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 15002 } 15003 15004 static int 15005 test_cryptodev_virtio(void) 15006 { 15007 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 15008 } 15009 15010 static int 15011 test_cryptodev_aesni_mb(void) 15012 { 15013 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15014 } 15015 15016 static int 15017 test_cryptodev_cpu_aesni_mb(void) 15018 { 15019 int32_t rc; 15020 enum rte_security_session_action_type at = gbl_action_type; 15021 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 15022 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 15023 gbl_action_type = at; 15024 return rc; 15025 } 15026 15027 static int 15028 test_cryptodev_openssl(void) 15029 { 15030 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 15031 } 15032 15033 static int 15034 test_cryptodev_aesni_gcm(void) 15035 { 15036 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 15037 } 15038 15039 static int 15040 test_cryptodev_cpu_aesni_gcm(void) 15041 { 15042 int32_t rc; 15043 enum rte_security_session_action_type at = gbl_action_type; 15044 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 15045 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 15046 gbl_action_type = at; 15047 return rc; 15048 } 15049 15050 static int 15051 test_cryptodev_mlx5(void) 15052 { 15053 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD)); 15054 } 15055 15056 static int 15057 test_cryptodev_null(void) 15058 { 15059 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 15060 } 15061 15062 static int 15063 test_cryptodev_sw_snow3g(void) 15064 { 15065 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 15066 } 15067 15068 static int 15069 test_cryptodev_sw_kasumi(void) 15070 { 15071 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 15072 } 15073 15074 static int 15075 test_cryptodev_sw_zuc(void) 15076 { 15077 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 15078 } 15079 15080 static int 15081 test_cryptodev_armv8(void) 15082 { 15083 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 15084 } 15085 15086 static int 15087 test_cryptodev_mrvl(void) 15088 { 15089 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 15090 } 15091 15092 #ifdef RTE_CRYPTO_SCHEDULER 15093 15094 static int 15095 test_cryptodev_scheduler(void) 15096 { 15097 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0; 15098 const enum blockcipher_test_type blk_suites[] = { 15099 BLKCIPHER_AES_CHAIN_TYPE, 15100 BLKCIPHER_AES_CIPHERONLY_TYPE, 15101 BLKCIPHER_AUTHONLY_TYPE 15102 }; 15103 static struct unit_test_suite scheduler_multicore = { 15104 .suite_name = "Scheduler Multicore Unit Test Suite", 15105 .setup = scheduler_multicore_testsuite_setup, 15106 .teardown = scheduler_mode_testsuite_teardown, 15107 .unit_test_cases = {TEST_CASES_END()} 15108 }; 15109 static struct unit_test_suite scheduler_round_robin = { 15110 .suite_name = "Scheduler Round Robin Unit Test Suite", 15111 .setup = scheduler_roundrobin_testsuite_setup, 15112 .teardown = scheduler_mode_testsuite_teardown, 15113 .unit_test_cases = {TEST_CASES_END()} 15114 }; 15115 static struct unit_test_suite scheduler_failover = { 15116 .suite_name = "Scheduler Failover Unit Test Suite", 15117 .setup = scheduler_failover_testsuite_setup, 15118 .teardown = scheduler_mode_testsuite_teardown, 15119 .unit_test_cases = {TEST_CASES_END()} 15120 }; 15121 static struct unit_test_suite scheduler_pkt_size_distr = { 15122 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite", 15123 .setup = scheduler_pkt_size_distr_testsuite_setup, 15124 .teardown = scheduler_mode_testsuite_teardown, 15125 .unit_test_cases = {TEST_CASES_END()} 15126 }; 15127 struct unit_test_suite *sched_mode_suites[] = { 15128 &scheduler_multicore, 15129 &scheduler_round_robin, 15130 &scheduler_failover, 15131 &scheduler_pkt_size_distr 15132 }; 15133 static struct unit_test_suite scheduler_config = { 15134 .suite_name = "Crypto Device Scheduler Config Unit Test Suite", 15135 .unit_test_cases = { 15136 TEST_CASE(test_scheduler_attach_worker_op), 15137 TEST_CASE(test_scheduler_mode_multicore_op), 15138 TEST_CASE(test_scheduler_mode_roundrobin_op), 15139 TEST_CASE(test_scheduler_mode_failover_op), 15140 TEST_CASE(test_scheduler_mode_pkt_size_distr_op), 15141 TEST_CASE(test_scheduler_detach_worker_op), 15142 15143 TEST_CASES_END() /**< NULL terminate array */ 15144 } 15145 }; 15146 struct unit_test_suite *static_suites[] = { 15147 &scheduler_config, 15148 &end_testsuite 15149 }; 15150 static struct unit_test_suite ts = { 15151 .suite_name = "Scheduler Unit Test Suite", 15152 .setup = scheduler_testsuite_setup, 15153 .teardown = testsuite_teardown, 15154 .unit_test_cases = {TEST_CASES_END()} 15155 }; 15156 15157 gbl_driver_id = rte_cryptodev_driver_id_get( 15158 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 15159 15160 if (gbl_driver_id == -1) { 15161 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 15162 return TEST_SKIPPED; 15163 } 15164 15165 if (rte_cryptodev_driver_id_get( 15166 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 15167 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 15168 return TEST_SKIPPED; 15169 } 15170 15171 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 15172 uint8_t blk_i = 0; 15173 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof 15174 (struct unit_test_suite *) * 15175 (RTE_DIM(blk_suites) + 1)); 15176 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]), 15177 blk_suites, RTE_DIM(blk_suites)); 15178 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite; 15179 } 15180 15181 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 15182 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites))); 15183 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites, 15184 RTE_DIM(sched_mode_suites)); 15185 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 15186 ret = unit_test_suite_runner(&ts); 15187 15188 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 15189 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, 15190 (*sched_mode_suites[sched_i]), 15191 RTE_DIM(blk_suites)); 15192 free(sched_mode_suites[sched_i]->unit_test_suites); 15193 } 15194 free(ts.unit_test_suites); 15195 return ret; 15196 } 15197 15198 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 15199 15200 #endif 15201 15202 static int 15203 test_cryptodev_dpaa2_sec(void) 15204 { 15205 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 15206 } 15207 15208 static int 15209 test_cryptodev_dpaa_sec(void) 15210 { 15211 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 15212 } 15213 15214 static int 15215 test_cryptodev_ccp(void) 15216 { 15217 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 15218 } 15219 15220 static int 15221 test_cryptodev_octeontx(void) 15222 { 15223 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 15224 } 15225 15226 static int 15227 test_cryptodev_octeontx2(void) 15228 { 15229 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)); 15230 } 15231 15232 static int 15233 test_cryptodev_caam_jr(void) 15234 { 15235 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 15236 } 15237 15238 static int 15239 test_cryptodev_nitrox(void) 15240 { 15241 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 15242 } 15243 15244 static int 15245 test_cryptodev_bcmfs(void) 15246 { 15247 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 15248 } 15249 15250 static int 15251 test_cryptodev_qat_raw_api(void) 15252 { 15253 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD); 15254 int ret; 15255 15256 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 15257 "RAW API"); 15258 if (ret) 15259 return ret; 15260 15261 global_api_test_type = CRYPTODEV_RAW_API_TEST; 15262 ret = run_cryptodev_testsuite(pmd_name); 15263 global_api_test_type = CRYPTODEV_API_TEST; 15264 15265 return ret; 15266 } 15267 15268 static int 15269 test_cryptodev_cn9k(void) 15270 { 15271 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD)); 15272 } 15273 15274 static int 15275 test_cryptodev_cn10k(void) 15276 { 15277 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD)); 15278 } 15279 15280 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 15281 test_cryptodev_qat_raw_api); 15282 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 15283 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 15284 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 15285 test_cryptodev_cpu_aesni_mb); 15286 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 15287 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 15288 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 15289 test_cryptodev_cpu_aesni_gcm); 15290 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5); 15291 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 15292 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 15293 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 15294 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 15295 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 15296 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 15297 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 15298 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 15299 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 15300 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 15301 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 15302 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2); 15303 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 15304 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 15305 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 15306 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k); 15307 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k); 15308