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_string_fns.h> 20 21 #ifdef RTE_CRYPTO_SCHEDULER 22 #include <rte_cryptodev_scheduler.h> 23 #include <rte_cryptodev_scheduler_operations.h> 24 #endif 25 26 #include <rte_lcore.h> 27 28 #include "test.h" 29 #include "test_cryptodev.h" 30 31 #include "test_cryptodev_blockcipher.h" 32 #include "test_cryptodev_aes_test_vectors.h" 33 #include "test_cryptodev_des_test_vectors.h" 34 #include "test_cryptodev_hash_test_vectors.h" 35 #include "test_cryptodev_kasumi_test_vectors.h" 36 #include "test_cryptodev_kasumi_hash_test_vectors.h" 37 #include "test_cryptodev_snow3g_test_vectors.h" 38 #include "test_cryptodev_snow3g_hash_test_vectors.h" 39 #include "test_cryptodev_zuc_test_vectors.h" 40 #include "test_cryptodev_aead_test_vectors.h" 41 #include "test_cryptodev_hmac_test_vectors.h" 42 #include "test_cryptodev_mixed_test_vectors.h" 43 #ifdef RTE_LIB_SECURITY 44 #include "test_cryptodev_security_pdcp_test_vectors.h" 45 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 46 #include "test_cryptodev_security_pdcp_test_func.h" 47 #include "test_cryptodev_security_docsis_test_vectors.h" 48 49 #define SDAP_DISABLED 0 50 #define SDAP_ENABLED 1 51 #endif 52 53 #define VDEV_ARGS_SIZE 100 54 #define MAX_NB_SESSIONS 4 55 56 #define MAX_DRV_SERVICE_CTX_SIZE 256 57 58 #define MAX_RAW_DEQUEUE_COUNT 65535 59 60 #define IN_PLACE 0 61 #define OUT_OF_PLACE 1 62 63 static int gbl_driver_id; 64 65 static enum rte_security_session_action_type gbl_action_type = 66 RTE_SECURITY_ACTION_TYPE_NONE; 67 68 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 69 70 struct crypto_unittest_params { 71 struct rte_crypto_sym_xform cipher_xform; 72 struct rte_crypto_sym_xform auth_xform; 73 struct rte_crypto_sym_xform aead_xform; 74 #ifdef RTE_LIB_SECURITY 75 struct rte_security_docsis_xform docsis_xform; 76 #endif 77 78 union { 79 struct rte_cryptodev_sym_session *sess; 80 #ifdef RTE_LIB_SECURITY 81 struct rte_security_session *sec_session; 82 #endif 83 }; 84 #ifdef RTE_LIB_SECURITY 85 enum rte_security_session_action_type type; 86 #endif 87 struct rte_crypto_op *op; 88 89 struct rte_mbuf *obuf, *ibuf; 90 91 uint8_t *digest; 92 }; 93 94 #define ALIGN_POW2_ROUNDUP(num, align) \ 95 (((num) + (align) - 1) & ~((align) - 1)) 96 97 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \ 98 for (j = 0; j < num_child_ts; index++, j++) \ 99 parent_ts.unit_test_suites[index] = child_ts[j] 100 101 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \ 102 for (j = 0; j < num_blk_types; index++, j++) \ 103 parent_ts.unit_test_suites[index] = \ 104 build_blockcipher_test_suite(blk_types[j]) 105 106 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \ 107 for (j = index; j < index + num_blk_types; j++) \ 108 free_blockcipher_test_suite(parent_ts.unit_test_suites[j]) 109 110 /* 111 * Forward declarations. 112 */ 113 static int 114 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 115 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 116 uint8_t *hmac_key); 117 118 static int 119 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 120 struct crypto_unittest_params *ut_params, 121 struct crypto_testsuite_params *ts_param, 122 const uint8_t *cipher, 123 const uint8_t *digest, 124 const uint8_t *iv); 125 126 static struct rte_mbuf * 127 setup_test_string(struct rte_mempool *mpool, 128 const char *string, size_t len, uint8_t blocksize) 129 { 130 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 131 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 132 133 if (m) { 134 char *dst; 135 136 memset(m->buf_addr, 0, m->buf_len); 137 dst = rte_pktmbuf_append(m, t_len); 138 if (!dst) { 139 rte_pktmbuf_free(m); 140 return NULL; 141 } 142 if (string != NULL) 143 rte_memcpy(dst, string, t_len); 144 else 145 memset(dst, 0, t_len); 146 } 147 148 return m; 149 } 150 151 /* Get number of bytes in X bits (rounding up) */ 152 static uint32_t 153 ceil_byte_length(uint32_t num_bits) 154 { 155 if (num_bits % 8) 156 return ((num_bits >> 3) + 1); 157 else 158 return (num_bits >> 3); 159 } 160 161 static void 162 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 163 uint8_t is_op_success) 164 { 165 struct rte_crypto_op *op = user_data; 166 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 167 RTE_CRYPTO_OP_STATUS_ERROR; 168 } 169 170 void 171 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 172 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 173 uint8_t len_in_bits, uint8_t cipher_iv_len) 174 { 175 struct rte_crypto_sym_op *sop = op->sym; 176 struct rte_crypto_op *ret_op = NULL; 177 struct rte_crypto_vec data_vec[UINT8_MAX]; 178 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 179 union rte_crypto_sym_ofs ofs; 180 struct rte_crypto_sym_vec vec; 181 struct rte_crypto_sgl sgl; 182 uint32_t max_len; 183 union rte_cryptodev_session_ctx sess; 184 uint32_t count = 0; 185 struct rte_crypto_raw_dp_ctx *ctx; 186 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 187 auth_len = 0; 188 int32_t n; 189 uint32_t n_success; 190 int ctx_service_size; 191 int32_t status = 0; 192 int enqueue_status, dequeue_status; 193 194 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id); 195 if (ctx_service_size < 0) { 196 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 197 return; 198 } 199 200 ctx = malloc(ctx_service_size); 201 if (!ctx) { 202 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 203 return; 204 } 205 206 /* Both are enums, setting crypto_sess will suit any session type */ 207 sess.crypto_sess = op->sym->session; 208 209 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, 210 op->sess_type, sess, 0) < 0) { 211 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 212 goto exit; 213 } 214 215 cipher_iv.iova = 0; 216 cipher_iv.va = NULL; 217 aad_auth_iv.iova = 0; 218 aad_auth_iv.va = NULL; 219 digest.iova = 0; 220 digest.va = NULL; 221 sgl.vec = data_vec; 222 vec.num = 1; 223 vec.sgl = &sgl; 224 vec.iv = &cipher_iv; 225 vec.digest = &digest; 226 vec.aad = &aad_auth_iv; 227 vec.status = &status; 228 229 ofs.raw = 0; 230 231 if (is_cipher && is_auth) { 232 cipher_offset = sop->cipher.data.offset; 233 cipher_len = sop->cipher.data.length; 234 auth_offset = sop->auth.data.offset; 235 auth_len = sop->auth.data.length; 236 max_len = RTE_MAX(cipher_offset + cipher_len, 237 auth_offset + auth_len); 238 if (len_in_bits) { 239 max_len = max_len >> 3; 240 cipher_offset = cipher_offset >> 3; 241 auth_offset = auth_offset >> 3; 242 cipher_len = cipher_len >> 3; 243 auth_len = auth_len >> 3; 244 } 245 ofs.ofs.cipher.head = cipher_offset; 246 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 247 ofs.ofs.auth.head = auth_offset; 248 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 249 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 250 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 251 aad_auth_iv.va = rte_crypto_op_ctod_offset( 252 op, void *, IV_OFFSET + cipher_iv_len); 253 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 254 cipher_iv_len); 255 digest.va = (void *)sop->auth.digest.data; 256 digest.iova = sop->auth.digest.phys_addr; 257 258 } else if (is_cipher) { 259 cipher_offset = sop->cipher.data.offset; 260 cipher_len = sop->cipher.data.length; 261 max_len = cipher_len + cipher_offset; 262 if (len_in_bits) { 263 max_len = max_len >> 3; 264 cipher_offset = cipher_offset >> 3; 265 cipher_len = cipher_len >> 3; 266 } 267 ofs.ofs.cipher.head = cipher_offset; 268 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 269 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 270 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 271 272 } else if (is_auth) { 273 auth_offset = sop->auth.data.offset; 274 auth_len = sop->auth.data.length; 275 max_len = auth_len + auth_offset; 276 if (len_in_bits) { 277 max_len = max_len >> 3; 278 auth_offset = auth_offset >> 3; 279 auth_len = auth_len >> 3; 280 } 281 ofs.ofs.auth.head = auth_offset; 282 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 283 aad_auth_iv.va = rte_crypto_op_ctod_offset( 284 op, void *, IV_OFFSET + cipher_iv_len); 285 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 286 cipher_iv_len); 287 digest.va = (void *)sop->auth.digest.data; 288 digest.iova = sop->auth.digest.phys_addr; 289 290 } else { /* aead */ 291 cipher_offset = sop->aead.data.offset; 292 cipher_len = sop->aead.data.length; 293 max_len = cipher_len + cipher_offset; 294 if (len_in_bits) { 295 max_len = max_len >> 3; 296 cipher_offset = cipher_offset >> 3; 297 cipher_len = cipher_len >> 3; 298 } 299 ofs.ofs.cipher.head = cipher_offset; 300 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 301 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 302 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 303 aad_auth_iv.va = (void *)sop->aead.aad.data; 304 aad_auth_iv.iova = sop->aead.aad.phys_addr; 305 digest.va = (void *)sop->aead.digest.data; 306 digest.iova = sop->aead.digest.phys_addr; 307 } 308 309 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 310 data_vec, RTE_DIM(data_vec)); 311 if (n < 0 || n > sop->m_src->nb_segs) { 312 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 313 goto exit; 314 } 315 316 sgl.num = n; 317 318 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 319 &enqueue_status) < 1) { 320 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 321 goto exit; 322 } 323 324 if (enqueue_status == 0) { 325 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 326 if (status < 0) { 327 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 328 goto exit; 329 } 330 } else if (enqueue_status < 0) { 331 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 332 goto exit; 333 } 334 335 n = n_success = 0; 336 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 337 n = rte_cryptodev_raw_dequeue_burst(ctx, 338 NULL, 1, post_process_raw_dp_op, 339 (void **)&ret_op, 0, &n_success, 340 &dequeue_status); 341 if (dequeue_status < 0) { 342 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 343 goto exit; 344 } 345 if (n == 0) 346 rte_pause(); 347 } 348 349 if (n == 1 && dequeue_status == 0) { 350 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 351 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 352 goto exit; 353 } 354 } 355 356 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 357 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 358 RTE_CRYPTO_OP_STATUS_SUCCESS; 359 360 exit: 361 free(ctx); 362 } 363 364 static void 365 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 366 { 367 int32_t n, st; 368 struct rte_crypto_sym_op *sop; 369 union rte_crypto_sym_ofs ofs; 370 struct rte_crypto_sgl sgl; 371 struct rte_crypto_sym_vec symvec; 372 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 373 struct rte_crypto_vec vec[UINT8_MAX]; 374 375 sop = op->sym; 376 377 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 378 sop->aead.data.length, vec, RTE_DIM(vec)); 379 380 if (n < 0 || n != sop->m_src->nb_segs) { 381 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 382 return; 383 } 384 385 sgl.vec = vec; 386 sgl.num = n; 387 symvec.sgl = &sgl; 388 symvec.iv = &iv_ptr; 389 symvec.digest = &digest_ptr; 390 symvec.aad = &aad_ptr; 391 symvec.status = &st; 392 symvec.num = 1; 393 394 /* for CPU crypto the IOVA address is not required */ 395 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 396 digest_ptr.va = (void *)sop->aead.digest.data; 397 aad_ptr.va = (void *)sop->aead.aad.data; 398 399 ofs.raw = 0; 400 401 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 402 &symvec); 403 404 if (n != 1) 405 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 406 else 407 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 408 } 409 410 static void 411 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 412 { 413 int32_t n, st; 414 struct rte_crypto_sym_op *sop; 415 union rte_crypto_sym_ofs ofs; 416 struct rte_crypto_sgl sgl; 417 struct rte_crypto_sym_vec symvec; 418 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 419 struct rte_crypto_vec vec[UINT8_MAX]; 420 421 sop = op->sym; 422 423 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 424 sop->auth.data.length, vec, RTE_DIM(vec)); 425 426 if (n < 0 || n != sop->m_src->nb_segs) { 427 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 428 return; 429 } 430 431 sgl.vec = vec; 432 sgl.num = n; 433 symvec.sgl = &sgl; 434 symvec.iv = &iv_ptr; 435 symvec.digest = &digest_ptr; 436 symvec.status = &st; 437 symvec.num = 1; 438 439 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 440 digest_ptr.va = (void *)sop->auth.digest.data; 441 442 ofs.raw = 0; 443 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 444 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 445 (sop->cipher.data.offset + sop->cipher.data.length); 446 447 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 448 &symvec); 449 450 if (n != 1) 451 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 452 else 453 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 454 } 455 456 static struct rte_crypto_op * 457 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 458 { 459 460 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 461 462 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 463 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 464 return NULL; 465 } 466 467 op = NULL; 468 469 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 470 rte_pause(); 471 472 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 473 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 474 return NULL; 475 } 476 477 return op; 478 } 479 480 static struct crypto_testsuite_params testsuite_params = { NULL }; 481 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params; 482 static struct crypto_unittest_params unittest_params; 483 484 static int 485 testsuite_setup(void) 486 { 487 struct crypto_testsuite_params *ts_params = &testsuite_params; 488 struct rte_cryptodev_info info; 489 uint32_t i = 0, nb_devs, dev_id; 490 uint16_t qp_id; 491 492 memset(ts_params, 0, sizeof(*ts_params)); 493 494 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 495 if (ts_params->mbuf_pool == NULL) { 496 /* Not already created so create */ 497 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 498 "CRYPTO_MBUFPOOL", 499 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 500 rte_socket_id()); 501 if (ts_params->mbuf_pool == NULL) { 502 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 503 return TEST_FAILED; 504 } 505 } 506 507 ts_params->large_mbuf_pool = rte_mempool_lookup( 508 "CRYPTO_LARGE_MBUFPOOL"); 509 if (ts_params->large_mbuf_pool == NULL) { 510 /* Not already created so create */ 511 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 512 "CRYPTO_LARGE_MBUFPOOL", 513 1, 0, 0, UINT16_MAX, 514 rte_socket_id()); 515 if (ts_params->large_mbuf_pool == NULL) { 516 RTE_LOG(ERR, USER1, 517 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 518 return TEST_FAILED; 519 } 520 } 521 522 ts_params->op_mpool = rte_crypto_op_pool_create( 523 "MBUF_CRYPTO_SYM_OP_POOL", 524 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 525 NUM_MBUFS, MBUF_CACHE_SIZE, 526 DEFAULT_NUM_XFORMS * 527 sizeof(struct rte_crypto_sym_xform) + 528 MAXIMUM_IV_LENGTH, 529 rte_socket_id()); 530 if (ts_params->op_mpool == NULL) { 531 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 532 return TEST_FAILED; 533 } 534 535 nb_devs = rte_cryptodev_count(); 536 if (nb_devs < 1) { 537 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 538 return TEST_SKIPPED; 539 } 540 541 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) { 542 RTE_LOG(WARNING, USER1, "No %s devices found?\n", 543 rte_cryptodev_driver_name_get(gbl_driver_id)); 544 return TEST_SKIPPED; 545 } 546 547 /* Create list of valid crypto devs */ 548 for (i = 0; i < nb_devs; i++) { 549 rte_cryptodev_info_get(i, &info); 550 if (info.driver_id == gbl_driver_id) 551 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 552 } 553 554 if (ts_params->valid_dev_count < 1) 555 return TEST_FAILED; 556 557 /* Set up all the qps on the first of the valid devices found */ 558 559 dev_id = ts_params->valid_devs[0]; 560 561 rte_cryptodev_info_get(dev_id, &info); 562 563 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 564 ts_params->conf.socket_id = SOCKET_ID_ANY; 565 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 566 567 unsigned int session_size = 568 rte_cryptodev_sym_get_private_session_size(dev_id); 569 570 #ifdef RTE_LIB_SECURITY 571 unsigned int security_session_size = rte_security_session_get_size( 572 rte_cryptodev_get_sec_ctx(dev_id)); 573 574 if (session_size < security_session_size) 575 session_size = security_session_size; 576 #endif 577 /* 578 * Create mempool with maximum number of sessions. 579 */ 580 if (info.sym.max_nb_sessions != 0 && 581 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 582 RTE_LOG(ERR, USER1, "Device does not support " 583 "at least %u sessions\n", 584 MAX_NB_SESSIONS); 585 return TEST_FAILED; 586 } 587 588 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 589 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 590 SOCKET_ID_ANY); 591 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 592 "session mempool allocation failed"); 593 594 ts_params->session_priv_mpool = rte_mempool_create( 595 "test_sess_mp_priv", 596 MAX_NB_SESSIONS, 597 session_size, 598 0, 0, NULL, NULL, NULL, 599 NULL, SOCKET_ID_ANY, 600 0); 601 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 602 "session mempool allocation failed"); 603 604 605 606 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 607 &ts_params->conf), 608 "Failed to configure cryptodev %u with %u qps", 609 dev_id, ts_params->conf.nb_queue_pairs); 610 611 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 612 ts_params->qp_conf.mp_session = ts_params->session_mpool; 613 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 614 615 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 616 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 617 dev_id, qp_id, &ts_params->qp_conf, 618 rte_cryptodev_socket_id(dev_id)), 619 "Failed to setup queue pair %u on cryptodev %u", 620 qp_id, dev_id); 621 } 622 623 return TEST_SUCCESS; 624 } 625 626 static void 627 testsuite_teardown(void) 628 { 629 struct crypto_testsuite_params *ts_params = &testsuite_params; 630 int res; 631 632 if (ts_params->mbuf_pool != NULL) { 633 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 634 rte_mempool_avail_count(ts_params->mbuf_pool)); 635 } 636 637 if (ts_params->op_mpool != NULL) { 638 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 639 rte_mempool_avail_count(ts_params->op_mpool)); 640 } 641 642 /* Free session mempools */ 643 if (ts_params->session_priv_mpool != NULL) { 644 rte_mempool_free(ts_params->session_priv_mpool); 645 ts_params->session_priv_mpool = NULL; 646 } 647 648 if (ts_params->session_mpool != NULL) { 649 rte_mempool_free(ts_params->session_mpool); 650 ts_params->session_mpool = NULL; 651 } 652 653 res = rte_cryptodev_close(ts_params->valid_devs[0]); 654 if (res) 655 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res); 656 } 657 658 static int 659 check_capabilities_supported(enum rte_crypto_sym_xform_type type, 660 const int *algs, uint16_t num_algs) 661 { 662 uint8_t dev_id = testsuite_params.valid_devs[0]; 663 bool some_alg_supported = FALSE; 664 uint16_t i; 665 666 for (i = 0; i < num_algs && !some_alg_supported; i++) { 667 struct rte_cryptodev_sym_capability_idx alg = { 668 type, {algs[i]} 669 }; 670 if (rte_cryptodev_sym_capability_get(dev_id, 671 &alg) != NULL) 672 some_alg_supported = TRUE; 673 } 674 if (!some_alg_supported) 675 return TEST_SKIPPED; 676 677 return 0; 678 } 679 680 int 681 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 682 uint16_t num_ciphers) 683 { 684 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER, 685 (const int *) ciphers, num_ciphers); 686 } 687 688 int 689 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 690 uint16_t num_auths) 691 { 692 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH, 693 (const int *) auths, num_auths); 694 } 695 696 int 697 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 698 uint16_t num_aeads) 699 { 700 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD, 701 (const int *) aeads, num_aeads); 702 } 703 704 static int 705 null_testsuite_setup(void) 706 { 707 struct crypto_testsuite_params *ts_params = &testsuite_params; 708 uint8_t dev_id = ts_params->valid_devs[0]; 709 struct rte_cryptodev_info dev_info; 710 const enum rte_crypto_cipher_algorithm ciphers[] = { 711 RTE_CRYPTO_CIPHER_NULL 712 }; 713 const enum rte_crypto_auth_algorithm auths[] = { 714 RTE_CRYPTO_AUTH_NULL 715 }; 716 717 rte_cryptodev_info_get(dev_id, &dev_info); 718 719 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 720 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL " 721 "testsuite not met\n"); 722 return TEST_SKIPPED; 723 } 724 725 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 726 && check_auth_capabilities_supported(auths, 727 RTE_DIM(auths)) != 0) { 728 RTE_LOG(INFO, USER1, "Capability requirements for NULL " 729 "testsuite not met\n"); 730 return TEST_SKIPPED; 731 } 732 733 return 0; 734 } 735 736 static int 737 crypto_gen_testsuite_setup(void) 738 { 739 struct crypto_testsuite_params *ts_params = &testsuite_params; 740 uint8_t dev_id = ts_params->valid_devs[0]; 741 struct rte_cryptodev_info dev_info; 742 743 rte_cryptodev_info_get(dev_id, &dev_info); 744 745 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 746 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen " 747 "testsuite not met\n"); 748 return TEST_SKIPPED; 749 } 750 751 return 0; 752 } 753 754 #ifdef RTE_LIB_SECURITY 755 static int 756 pdcp_proto_testsuite_setup(void) 757 { 758 struct crypto_testsuite_params *ts_params = &testsuite_params; 759 uint8_t dev_id = ts_params->valid_devs[0]; 760 struct rte_cryptodev_info dev_info; 761 const enum rte_crypto_cipher_algorithm ciphers[] = { 762 RTE_CRYPTO_CIPHER_NULL, 763 RTE_CRYPTO_CIPHER_AES_CTR, 764 RTE_CRYPTO_CIPHER_ZUC_EEA3, 765 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 766 }; 767 const enum rte_crypto_auth_algorithm auths[] = { 768 RTE_CRYPTO_AUTH_NULL, 769 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 770 RTE_CRYPTO_AUTH_AES_CMAC, 771 RTE_CRYPTO_AUTH_ZUC_EIA3 772 }; 773 774 rte_cryptodev_info_get(dev_id, &dev_info); 775 776 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 777 !(dev_info.feature_flags & 778 RTE_CRYPTODEV_FF_SECURITY)) { 779 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto " 780 "testsuite not met\n"); 781 return TEST_SKIPPED; 782 } 783 784 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 785 && check_auth_capabilities_supported(auths, 786 RTE_DIM(auths)) != 0) { 787 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto " 788 "testsuite not met\n"); 789 return TEST_SKIPPED; 790 } 791 792 return 0; 793 } 794 795 static int 796 docsis_proto_testsuite_setup(void) 797 { 798 struct crypto_testsuite_params *ts_params = &testsuite_params; 799 uint8_t dev_id = ts_params->valid_devs[0]; 800 struct rte_cryptodev_info dev_info; 801 const enum rte_crypto_cipher_algorithm ciphers[] = { 802 RTE_CRYPTO_CIPHER_AES_DOCSISBPI 803 }; 804 805 rte_cryptodev_info_get(dev_id, &dev_info); 806 807 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 808 !(dev_info.feature_flags & 809 RTE_CRYPTODEV_FF_SECURITY)) { 810 RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis " 811 "Proto testsuite not met\n"); 812 return TEST_SKIPPED; 813 } 814 815 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) { 816 RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto " 817 "testsuite not met\n"); 818 return TEST_SKIPPED; 819 } 820 821 return 0; 822 } 823 #endif 824 825 static int 826 aes_ccm_auth_testsuite_setup(void) 827 { 828 struct crypto_testsuite_params *ts_params = &testsuite_params; 829 uint8_t dev_id = ts_params->valid_devs[0]; 830 struct rte_cryptodev_info dev_info; 831 const enum rte_crypto_aead_algorithm aeads[] = { 832 RTE_CRYPTO_AEAD_AES_CCM 833 }; 834 835 rte_cryptodev_info_get(dev_id, &dev_info); 836 837 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 838 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 839 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 840 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM " 841 "testsuite not met\n"); 842 return TEST_SKIPPED; 843 } 844 845 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 846 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM " 847 "testsuite not met\n"); 848 return TEST_SKIPPED; 849 } 850 851 return 0; 852 } 853 854 static int 855 aes_gcm_auth_testsuite_setup(void) 856 { 857 struct crypto_testsuite_params *ts_params = &testsuite_params; 858 uint8_t dev_id = ts_params->valid_devs[0]; 859 struct rte_cryptodev_info dev_info; 860 const enum rte_crypto_aead_algorithm aeads[] = { 861 RTE_CRYPTO_AEAD_AES_GCM 862 }; 863 864 rte_cryptodev_info_get(dev_id, &dev_info); 865 866 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 867 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM " 868 "testsuite not met\n"); 869 return TEST_SKIPPED; 870 } 871 872 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 873 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM " 874 "testsuite not met\n"); 875 return TEST_SKIPPED; 876 } 877 878 return 0; 879 } 880 881 static int 882 aes_gmac_auth_testsuite_setup(void) 883 { 884 struct crypto_testsuite_params *ts_params = &testsuite_params; 885 uint8_t dev_id = ts_params->valid_devs[0]; 886 struct rte_cryptodev_info dev_info; 887 const enum rte_crypto_auth_algorithm auths[] = { 888 RTE_CRYPTO_AUTH_AES_GMAC 889 }; 890 891 rte_cryptodev_info_get(dev_id, &dev_info); 892 893 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 894 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 895 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 896 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC " 897 "testsuite not met\n"); 898 return TEST_SKIPPED; 899 } 900 901 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 902 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC " 903 "testsuite not met\n"); 904 return TEST_SKIPPED; 905 } 906 907 return 0; 908 } 909 910 static int 911 chacha20_poly1305_testsuite_setup(void) 912 { 913 struct crypto_testsuite_params *ts_params = &testsuite_params; 914 uint8_t dev_id = ts_params->valid_devs[0]; 915 struct rte_cryptodev_info dev_info; 916 const enum rte_crypto_aead_algorithm aeads[] = { 917 RTE_CRYPTO_AEAD_CHACHA20_POLY1305 918 }; 919 920 rte_cryptodev_info_get(dev_id, &dev_info); 921 922 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 923 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 924 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 925 RTE_LOG(INFO, USER1, "Feature flag requirements for " 926 "Chacha20-Poly1305 testsuite not met\n"); 927 return TEST_SKIPPED; 928 } 929 930 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 931 RTE_LOG(INFO, USER1, "Capability requirements for " 932 "Chacha20-Poly1305 testsuite not met\n"); 933 return TEST_SKIPPED; 934 } 935 936 return 0; 937 } 938 939 static int 940 snow3g_testsuite_setup(void) 941 { 942 struct crypto_testsuite_params *ts_params = &testsuite_params; 943 uint8_t dev_id = ts_params->valid_devs[0]; 944 struct rte_cryptodev_info dev_info; 945 const enum rte_crypto_cipher_algorithm ciphers[] = { 946 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 947 948 }; 949 const enum rte_crypto_auth_algorithm auths[] = { 950 RTE_CRYPTO_AUTH_SNOW3G_UIA2 951 }; 952 953 rte_cryptodev_info_get(dev_id, &dev_info); 954 955 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 956 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G " 957 "testsuite not met\n"); 958 return TEST_SKIPPED; 959 } 960 961 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 962 && check_auth_capabilities_supported(auths, 963 RTE_DIM(auths)) != 0) { 964 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G " 965 "testsuite not met\n"); 966 return TEST_SKIPPED; 967 } 968 969 return 0; 970 } 971 972 static int 973 zuc_testsuite_setup(void) 974 { 975 struct crypto_testsuite_params *ts_params = &testsuite_params; 976 uint8_t dev_id = ts_params->valid_devs[0]; 977 struct rte_cryptodev_info dev_info; 978 const enum rte_crypto_cipher_algorithm ciphers[] = { 979 RTE_CRYPTO_CIPHER_ZUC_EEA3 980 }; 981 const enum rte_crypto_auth_algorithm auths[] = { 982 RTE_CRYPTO_AUTH_ZUC_EIA3 983 }; 984 985 rte_cryptodev_info_get(dev_id, &dev_info); 986 987 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 988 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC " 989 "testsuite not met\n"); 990 return TEST_SKIPPED; 991 } 992 993 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 994 && check_auth_capabilities_supported(auths, 995 RTE_DIM(auths)) != 0) { 996 RTE_LOG(INFO, USER1, "Capability requirements for ZUC " 997 "testsuite not met\n"); 998 return TEST_SKIPPED; 999 } 1000 1001 return 0; 1002 } 1003 1004 static int 1005 hmac_md5_auth_testsuite_setup(void) 1006 { 1007 struct crypto_testsuite_params *ts_params = &testsuite_params; 1008 uint8_t dev_id = ts_params->valid_devs[0]; 1009 struct rte_cryptodev_info dev_info; 1010 const enum rte_crypto_auth_algorithm auths[] = { 1011 RTE_CRYPTO_AUTH_MD5_HMAC 1012 }; 1013 1014 rte_cryptodev_info_get(dev_id, &dev_info); 1015 1016 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1017 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1018 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1019 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 " 1020 "Auth testsuite not met\n"); 1021 return TEST_SKIPPED; 1022 } 1023 1024 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1025 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 " 1026 "testsuite not met\n"); 1027 return TEST_SKIPPED; 1028 } 1029 1030 return 0; 1031 } 1032 1033 static int 1034 kasumi_testsuite_setup(void) 1035 { 1036 struct crypto_testsuite_params *ts_params = &testsuite_params; 1037 uint8_t dev_id = ts_params->valid_devs[0]; 1038 struct rte_cryptodev_info dev_info; 1039 const enum rte_crypto_cipher_algorithm ciphers[] = { 1040 RTE_CRYPTO_CIPHER_KASUMI_F8 1041 }; 1042 const enum rte_crypto_auth_algorithm auths[] = { 1043 RTE_CRYPTO_AUTH_KASUMI_F9 1044 }; 1045 1046 rte_cryptodev_info_get(dev_id, &dev_info); 1047 1048 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1049 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1050 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1051 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi " 1052 "testsuite not met\n"); 1053 return TEST_SKIPPED; 1054 } 1055 1056 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1057 && check_auth_capabilities_supported(auths, 1058 RTE_DIM(auths)) != 0) { 1059 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi " 1060 "testsuite not met\n"); 1061 return TEST_SKIPPED; 1062 } 1063 1064 return 0; 1065 } 1066 1067 static int 1068 negative_aes_gcm_testsuite_setup(void) 1069 { 1070 struct crypto_testsuite_params *ts_params = &testsuite_params; 1071 uint8_t dev_id = ts_params->valid_devs[0]; 1072 struct rte_cryptodev_info dev_info; 1073 const enum rte_crypto_aead_algorithm aeads[] = { 1074 RTE_CRYPTO_AEAD_AES_GCM 1075 }; 1076 1077 rte_cryptodev_info_get(dev_id, &dev_info); 1078 1079 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1080 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1081 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1082 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1083 "AES GCM testsuite not met\n"); 1084 return TEST_SKIPPED; 1085 } 1086 1087 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) { 1088 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1089 "AES GCM testsuite not met\n"); 1090 return TEST_SKIPPED; 1091 } 1092 1093 return 0; 1094 } 1095 1096 static int 1097 negative_aes_gmac_testsuite_setup(void) 1098 { 1099 struct crypto_testsuite_params *ts_params = &testsuite_params; 1100 uint8_t dev_id = ts_params->valid_devs[0]; 1101 struct rte_cryptodev_info dev_info; 1102 const enum rte_crypto_auth_algorithm auths[] = { 1103 RTE_CRYPTO_AUTH_AES_GMAC 1104 }; 1105 1106 rte_cryptodev_info_get(dev_id, &dev_info); 1107 1108 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1109 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1110 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1111 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1112 "AES GMAC testsuite not met\n"); 1113 return TEST_SKIPPED; 1114 } 1115 1116 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) { 1117 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1118 "AES GMAC testsuite not met\n"); 1119 return TEST_SKIPPED; 1120 } 1121 1122 return 0; 1123 } 1124 1125 static int 1126 mixed_cipher_hash_testsuite_setup(void) 1127 { 1128 struct crypto_testsuite_params *ts_params = &testsuite_params; 1129 uint8_t dev_id = ts_params->valid_devs[0]; 1130 struct rte_cryptodev_info dev_info; 1131 uint64_t feat_flags; 1132 const enum rte_crypto_cipher_algorithm ciphers[] = { 1133 RTE_CRYPTO_CIPHER_NULL, 1134 RTE_CRYPTO_CIPHER_AES_CTR, 1135 RTE_CRYPTO_CIPHER_ZUC_EEA3, 1136 RTE_CRYPTO_CIPHER_SNOW3G_UEA2 1137 }; 1138 const enum rte_crypto_auth_algorithm auths[] = { 1139 RTE_CRYPTO_AUTH_NULL, 1140 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 1141 RTE_CRYPTO_AUTH_AES_CMAC, 1142 RTE_CRYPTO_AUTH_ZUC_EIA3 1143 }; 1144 1145 rte_cryptodev_info_get(dev_id, &dev_info); 1146 feat_flags = dev_info.feature_flags; 1147 1148 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1149 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) { 1150 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed " 1151 "Cipher Hash testsuite not met\n"); 1152 return TEST_SKIPPED; 1153 } 1154 1155 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1156 && check_auth_capabilities_supported(auths, 1157 RTE_DIM(auths)) != 0) { 1158 RTE_LOG(INFO, USER1, "Capability requirements for Mixed " 1159 "Cipher Hash testsuite not met\n"); 1160 return TEST_SKIPPED; 1161 } 1162 1163 return 0; 1164 } 1165 1166 static int 1167 esn_testsuite_setup(void) 1168 { 1169 struct crypto_testsuite_params *ts_params = &testsuite_params; 1170 uint8_t dev_id = ts_params->valid_devs[0]; 1171 struct rte_cryptodev_info dev_info; 1172 const enum rte_crypto_cipher_algorithm ciphers[] = { 1173 RTE_CRYPTO_CIPHER_AES_CBC 1174 }; 1175 const enum rte_crypto_auth_algorithm auths[] = { 1176 RTE_CRYPTO_AUTH_SHA1_HMAC 1177 }; 1178 1179 rte_cryptodev_info_get(dev_id, &dev_info); 1180 1181 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1182 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1183 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1184 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN " 1185 "testsuite not met\n"); 1186 return TEST_SKIPPED; 1187 } 1188 1189 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1190 && check_auth_capabilities_supported(auths, 1191 RTE_DIM(auths)) != 0) { 1192 RTE_LOG(INFO, USER1, "Capability requirements for ESN " 1193 "testsuite not met\n"); 1194 return TEST_SKIPPED; 1195 } 1196 1197 return 0; 1198 } 1199 1200 static int 1201 multi_session_testsuite_setup(void) 1202 { 1203 struct crypto_testsuite_params *ts_params = &testsuite_params; 1204 uint8_t dev_id = ts_params->valid_devs[0]; 1205 struct rte_cryptodev_info dev_info; 1206 const enum rte_crypto_cipher_algorithm ciphers[] = { 1207 RTE_CRYPTO_CIPHER_AES_CBC 1208 }; 1209 const enum rte_crypto_auth_algorithm auths[] = { 1210 RTE_CRYPTO_AUTH_SHA512_HMAC 1211 }; 1212 1213 rte_cryptodev_info_get(dev_id, &dev_info); 1214 1215 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) { 1216 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi " 1217 "Session testsuite not met\n"); 1218 return TEST_SKIPPED; 1219 } 1220 1221 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1222 && check_auth_capabilities_supported(auths, 1223 RTE_DIM(auths)) != 0) { 1224 RTE_LOG(INFO, USER1, "Capability requirements for Multi " 1225 "Session testsuite not met\n"); 1226 return TEST_SKIPPED; 1227 } 1228 1229 return 0; 1230 } 1231 1232 static int 1233 negative_hmac_sha1_testsuite_setup(void) 1234 { 1235 struct crypto_testsuite_params *ts_params = &testsuite_params; 1236 uint8_t dev_id = ts_params->valid_devs[0]; 1237 struct rte_cryptodev_info dev_info; 1238 const enum rte_crypto_cipher_algorithm ciphers[] = { 1239 RTE_CRYPTO_CIPHER_AES_CBC 1240 }; 1241 const enum rte_crypto_auth_algorithm auths[] = { 1242 RTE_CRYPTO_AUTH_SHA1_HMAC 1243 }; 1244 1245 rte_cryptodev_info_get(dev_id, &dev_info); 1246 1247 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) || 1248 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 1249 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 1250 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative " 1251 "HMAC SHA1 testsuite not met\n"); 1252 return TEST_SKIPPED; 1253 } 1254 1255 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0 1256 && check_auth_capabilities_supported(auths, 1257 RTE_DIM(auths)) != 0) { 1258 RTE_LOG(INFO, USER1, "Capability requirements for Negative " 1259 "HMAC SHA1 testsuite not met\n"); 1260 return TEST_SKIPPED; 1261 } 1262 1263 return 0; 1264 } 1265 1266 static int 1267 dev_configure_and_start(uint64_t ff_disable) 1268 { 1269 struct crypto_testsuite_params *ts_params = &testsuite_params; 1270 struct crypto_unittest_params *ut_params = &unittest_params; 1271 1272 uint16_t qp_id; 1273 1274 /* Clear unit test parameters before running test */ 1275 memset(ut_params, 0, sizeof(*ut_params)); 1276 1277 /* Reconfigure device to default parameters */ 1278 ts_params->conf.socket_id = SOCKET_ID_ANY; 1279 ts_params->conf.ff_disable = ff_disable; 1280 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 1281 ts_params->qp_conf.mp_session = ts_params->session_mpool; 1282 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 1283 1284 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1285 &ts_params->conf), 1286 "Failed to configure cryptodev %u", 1287 ts_params->valid_devs[0]); 1288 1289 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 1290 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1291 ts_params->valid_devs[0], qp_id, 1292 &ts_params->qp_conf, 1293 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1294 "Failed to setup queue pair %u on cryptodev %u", 1295 qp_id, ts_params->valid_devs[0]); 1296 } 1297 1298 1299 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 1300 1301 /* Start the device */ 1302 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 1303 "Failed to start cryptodev %u", 1304 ts_params->valid_devs[0]); 1305 1306 return TEST_SUCCESS; 1307 } 1308 1309 int 1310 ut_setup(void) 1311 { 1312 /* Configure and start the device with security feature disabled */ 1313 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 1314 } 1315 1316 static int 1317 ut_setup_security(void) 1318 { 1319 /* Configure and start the device with no features disabled */ 1320 return dev_configure_and_start(0); 1321 } 1322 1323 void 1324 ut_teardown(void) 1325 { 1326 struct crypto_testsuite_params *ts_params = &testsuite_params; 1327 struct crypto_unittest_params *ut_params = &unittest_params; 1328 struct rte_cryptodev_stats stats; 1329 1330 /* free crypto session structure */ 1331 #ifdef RTE_LIB_SECURITY 1332 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 1333 if (ut_params->sec_session) { 1334 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 1335 (ts_params->valid_devs[0]), 1336 ut_params->sec_session); 1337 ut_params->sec_session = NULL; 1338 } 1339 } else 1340 #endif 1341 { 1342 if (ut_params->sess) { 1343 rte_cryptodev_sym_session_clear( 1344 ts_params->valid_devs[0], 1345 ut_params->sess); 1346 rte_cryptodev_sym_session_free(ut_params->sess); 1347 ut_params->sess = NULL; 1348 } 1349 } 1350 1351 /* free crypto operation structure */ 1352 if (ut_params->op) 1353 rte_crypto_op_free(ut_params->op); 1354 1355 /* 1356 * free mbuf - both obuf and ibuf are usually the same, 1357 * so check if they point at the same address is necessary, 1358 * to avoid freeing the mbuf twice. 1359 */ 1360 if (ut_params->obuf) { 1361 rte_pktmbuf_free(ut_params->obuf); 1362 if (ut_params->ibuf == ut_params->obuf) 1363 ut_params->ibuf = 0; 1364 ut_params->obuf = 0; 1365 } 1366 if (ut_params->ibuf) { 1367 rte_pktmbuf_free(ut_params->ibuf); 1368 ut_params->ibuf = 0; 1369 } 1370 1371 if (ts_params->mbuf_pool != NULL) 1372 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 1373 rte_mempool_avail_count(ts_params->mbuf_pool)); 1374 1375 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); 1376 1377 /* Stop the device */ 1378 rte_cryptodev_stop(ts_params->valid_devs[0]); 1379 } 1380 1381 static int 1382 test_device_configure_invalid_dev_id(void) 1383 { 1384 struct crypto_testsuite_params *ts_params = &testsuite_params; 1385 uint16_t dev_id, num_devs = 0; 1386 1387 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 1388 "Need at least %d devices for test", 1); 1389 1390 /* valid dev_id values */ 1391 dev_id = ts_params->valid_devs[0]; 1392 1393 /* Stop the device in case it's started so it can be configured */ 1394 rte_cryptodev_stop(dev_id); 1395 1396 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 1397 "Failed test for rte_cryptodev_configure: " 1398 "invalid dev_num %u", dev_id); 1399 1400 /* invalid dev_id values */ 1401 dev_id = num_devs; 1402 1403 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1404 "Failed test for rte_cryptodev_configure: " 1405 "invalid dev_num %u", dev_id); 1406 1407 dev_id = 0xff; 1408 1409 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1410 "Failed test for rte_cryptodev_configure:" 1411 "invalid dev_num %u", dev_id); 1412 1413 return TEST_SUCCESS; 1414 } 1415 1416 static int 1417 test_device_configure_invalid_queue_pair_ids(void) 1418 { 1419 struct crypto_testsuite_params *ts_params = &testsuite_params; 1420 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1421 1422 /* Stop the device in case it's started so it can be configured */ 1423 rte_cryptodev_stop(ts_params->valid_devs[0]); 1424 1425 /* valid - max value queue pairs */ 1426 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1427 1428 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1429 &ts_params->conf), 1430 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1431 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1432 1433 /* valid - one queue pairs */ 1434 ts_params->conf.nb_queue_pairs = 1; 1435 1436 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1437 &ts_params->conf), 1438 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1439 ts_params->valid_devs[0], 1440 ts_params->conf.nb_queue_pairs); 1441 1442 1443 /* invalid - zero queue pairs */ 1444 ts_params->conf.nb_queue_pairs = 0; 1445 1446 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1447 &ts_params->conf), 1448 "Failed test for rte_cryptodev_configure, dev_id %u," 1449 " invalid qps: %u", 1450 ts_params->valid_devs[0], 1451 ts_params->conf.nb_queue_pairs); 1452 1453 1454 /* invalid - max value supported by field queue pairs */ 1455 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1456 1457 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1458 &ts_params->conf), 1459 "Failed test for rte_cryptodev_configure, dev_id %u," 1460 " invalid qps: %u", 1461 ts_params->valid_devs[0], 1462 ts_params->conf.nb_queue_pairs); 1463 1464 1465 /* invalid - max value + 1 queue pairs */ 1466 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1467 1468 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1469 &ts_params->conf), 1470 "Failed test for rte_cryptodev_configure, dev_id %u," 1471 " invalid qps: %u", 1472 ts_params->valid_devs[0], 1473 ts_params->conf.nb_queue_pairs); 1474 1475 /* revert to original testsuite value */ 1476 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1477 1478 return TEST_SUCCESS; 1479 } 1480 1481 static int 1482 test_queue_pair_descriptor_setup(void) 1483 { 1484 struct crypto_testsuite_params *ts_params = &testsuite_params; 1485 struct rte_cryptodev_qp_conf qp_conf = { 1486 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1487 }; 1488 uint16_t qp_id; 1489 1490 /* Stop the device in case it's started so it can be configured */ 1491 rte_cryptodev_stop(ts_params->valid_devs[0]); 1492 1493 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1494 &ts_params->conf), 1495 "Failed to configure cryptodev %u", 1496 ts_params->valid_devs[0]); 1497 1498 /* 1499 * Test various ring sizes on this device. memzones can't be 1500 * freed so are re-used if ring is released and re-created. 1501 */ 1502 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1503 qp_conf.mp_session = ts_params->session_mpool; 1504 qp_conf.mp_session_private = ts_params->session_priv_mpool; 1505 1506 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1507 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1508 ts_params->valid_devs[0], qp_id, &qp_conf, 1509 rte_cryptodev_socket_id( 1510 ts_params->valid_devs[0])), 1511 "Failed test for " 1512 "rte_cryptodev_queue_pair_setup: num_inflights " 1513 "%u on qp %u on cryptodev %u", 1514 qp_conf.nb_descriptors, qp_id, 1515 ts_params->valid_devs[0]); 1516 } 1517 1518 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1519 1520 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1521 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1522 ts_params->valid_devs[0], qp_id, &qp_conf, 1523 rte_cryptodev_socket_id( 1524 ts_params->valid_devs[0])), 1525 "Failed test for" 1526 " rte_cryptodev_queue_pair_setup: num_inflights" 1527 " %u on qp %u on cryptodev %u", 1528 qp_conf.nb_descriptors, qp_id, 1529 ts_params->valid_devs[0]); 1530 } 1531 1532 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1533 1534 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1535 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1536 ts_params->valid_devs[0], qp_id, &qp_conf, 1537 rte_cryptodev_socket_id( 1538 ts_params->valid_devs[0])), 1539 "Failed test for " 1540 "rte_cryptodev_queue_pair_setup: num_inflights" 1541 " %u on qp %u on cryptodev %u", 1542 qp_conf.nb_descriptors, qp_id, 1543 ts_params->valid_devs[0]); 1544 } 1545 1546 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1547 1548 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1549 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1550 ts_params->valid_devs[0], qp_id, &qp_conf, 1551 rte_cryptodev_socket_id( 1552 ts_params->valid_devs[0])), 1553 "Failed test for" 1554 " rte_cryptodev_queue_pair_setup:" 1555 "num_inflights %u on qp %u on cryptodev %u", 1556 qp_conf.nb_descriptors, qp_id, 1557 ts_params->valid_devs[0]); 1558 } 1559 1560 /* test invalid queue pair id */ 1561 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1562 1563 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1564 1565 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1566 ts_params->valid_devs[0], 1567 qp_id, &qp_conf, 1568 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1569 "Failed test for rte_cryptodev_queue_pair_setup:" 1570 "invalid qp %u on cryptodev %u", 1571 qp_id, ts_params->valid_devs[0]); 1572 1573 qp_id = 0xffff; /*invalid*/ 1574 1575 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1576 ts_params->valid_devs[0], 1577 qp_id, &qp_conf, 1578 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1579 "Failed test for rte_cryptodev_queue_pair_setup:" 1580 "invalid qp %u on cryptodev %u", 1581 qp_id, ts_params->valid_devs[0]); 1582 1583 return TEST_SUCCESS; 1584 } 1585 1586 /* ***** Plaintext data for tests ***** */ 1587 1588 const char catch_22_quote_1[] = 1589 "There was only one catch and that was Catch-22, which " 1590 "specified that a concern for one's safety in the face of " 1591 "dangers that were real and immediate was the process of a " 1592 "rational mind. Orr was crazy and could be grounded. All he " 1593 "had to do was ask; and as soon as he did, he would no longer " 1594 "be crazy and would have to fly more missions. Orr would be " 1595 "crazy to fly more missions and sane if he didn't, but if he " 1596 "was sane he had to fly them. If he flew them he was crazy " 1597 "and didn't have to; but if he didn't want to he was sane and " 1598 "had to. Yossarian was moved very deeply by the absolute " 1599 "simplicity of this clause of Catch-22 and let out a " 1600 "respectful whistle. \"That's some catch, that Catch-22\", he " 1601 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1602 1603 const char catch_22_quote[] = 1604 "What a lousy earth! He wondered how many people were " 1605 "destitute that same night even in his own prosperous country, " 1606 "how many homes were shanties, how many husbands were drunk " 1607 "and wives socked, and how many children were bullied, abused, " 1608 "or abandoned. How many families hungered for food they could " 1609 "not afford to buy? How many hearts were broken? How many " 1610 "suicides would take place that same night, how many people " 1611 "would go insane? How many cockroaches and landlords would " 1612 "triumph? How many winners were losers, successes failures, " 1613 "and rich men poor men? How many wise guys were stupid? How " 1614 "many happy endings were unhappy endings? How many honest men " 1615 "were liars, brave men cowards, loyal men traitors, how many " 1616 "sainted men were corrupt, how many people in positions of " 1617 "trust had sold their souls to bodyguards, how many had never " 1618 "had souls? How many straight-and-narrow paths were crooked " 1619 "paths? How many best families were worst families and how " 1620 "many good people were bad people? When you added them all up " 1621 "and then subtracted, you might be left with only the children, " 1622 "and perhaps with Albert Einstein and an old violinist or " 1623 "sculptor somewhere."; 1624 1625 #define QUOTE_480_BYTES (480) 1626 #define QUOTE_512_BYTES (512) 1627 #define QUOTE_768_BYTES (768) 1628 #define QUOTE_1024_BYTES (1024) 1629 1630 1631 1632 /* ***** SHA1 Hash Tests ***** */ 1633 1634 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1635 1636 static uint8_t hmac_sha1_key[] = { 1637 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1638 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1639 0xDE, 0xF4, 0xDE, 0xAD }; 1640 1641 /* ***** SHA224 Hash Tests ***** */ 1642 1643 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1644 1645 1646 /* ***** AES-CBC Cipher Tests ***** */ 1647 1648 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1649 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1650 1651 static uint8_t aes_cbc_key[] = { 1652 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1653 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1654 1655 static uint8_t aes_cbc_iv[] = { 1656 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1657 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1658 1659 1660 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1661 1662 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1663 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1664 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1665 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1666 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1667 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1668 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1669 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1670 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1671 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1672 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1673 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1674 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1675 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1676 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1677 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1678 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1679 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1680 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1681 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1682 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1683 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1684 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1685 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1686 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1687 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1688 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1689 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1690 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1691 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1692 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1693 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1694 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1695 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1696 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1697 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1698 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1699 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1700 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1701 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1702 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1703 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1704 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1705 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1706 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1707 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1708 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1709 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1710 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1711 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1712 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1713 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1714 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1715 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1716 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1717 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1718 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1719 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1720 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1721 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1722 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1723 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1724 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1725 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1726 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1727 }; 1728 1729 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1730 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1731 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1732 0x18, 0x8c, 0x1d, 0x32 1733 }; 1734 1735 1736 /* Multisession Vector context Test */ 1737 /*Begin Session 0 */ 1738 static uint8_t ms_aes_cbc_key0[] = { 1739 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1740 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1741 }; 1742 1743 static uint8_t ms_aes_cbc_iv0[] = { 1744 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1745 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1746 }; 1747 1748 static const uint8_t ms_aes_cbc_cipher0[] = { 1749 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1750 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1751 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1752 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1753 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1754 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1755 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1756 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1757 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1758 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1759 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1760 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1761 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1762 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1763 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1764 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1765 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1766 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1767 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1768 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1769 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1770 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1771 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1772 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1773 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1774 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1775 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1776 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1777 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1778 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1779 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1780 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1781 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1782 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1783 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1784 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1785 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1786 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1787 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1788 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1789 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1790 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1791 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1792 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1793 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1794 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1795 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1796 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1797 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1798 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1799 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1800 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1801 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1802 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1803 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1804 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1805 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1806 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1807 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1808 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1809 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1810 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1811 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1812 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1813 }; 1814 1815 1816 static uint8_t ms_hmac_key0[] = { 1817 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1818 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1819 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1820 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1821 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1822 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1823 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1824 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1825 }; 1826 1827 static const uint8_t ms_hmac_digest0[] = { 1828 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1829 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1830 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1831 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1832 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1833 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1834 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1835 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1836 }; 1837 1838 /* End Session 0 */ 1839 /* Begin session 1 */ 1840 1841 static uint8_t ms_aes_cbc_key1[] = { 1842 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1843 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1844 }; 1845 1846 static uint8_t ms_aes_cbc_iv1[] = { 1847 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1848 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1849 }; 1850 1851 static const uint8_t ms_aes_cbc_cipher1[] = { 1852 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1853 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1854 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1855 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1856 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1857 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1858 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1859 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1860 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1861 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1862 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1863 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1864 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1865 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1866 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1867 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1868 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1869 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1870 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1871 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1872 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1873 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1874 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1875 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1876 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1877 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1878 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1879 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1880 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1881 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1882 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1883 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1884 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1885 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1886 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1887 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1888 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1889 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1890 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1891 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1892 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1893 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1894 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1895 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1896 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1897 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1898 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1899 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1900 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1901 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1902 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1903 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1904 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1905 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1906 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1907 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1908 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1909 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1910 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1911 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1912 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 1913 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 1914 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 1915 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 1916 1917 }; 1918 1919 static uint8_t ms_hmac_key1[] = { 1920 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1921 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1922 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1923 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1924 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1925 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1926 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1927 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1928 }; 1929 1930 static const uint8_t ms_hmac_digest1[] = { 1931 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 1932 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 1933 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 1934 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 1935 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 1936 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 1937 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 1938 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 1939 }; 1940 /* End Session 1 */ 1941 /* Begin Session 2 */ 1942 static uint8_t ms_aes_cbc_key2[] = { 1943 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1944 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1945 }; 1946 1947 static uint8_t ms_aes_cbc_iv2[] = { 1948 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1949 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1950 }; 1951 1952 static const uint8_t ms_aes_cbc_cipher2[] = { 1953 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 1954 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 1955 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 1956 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 1957 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 1958 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 1959 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 1960 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 1961 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 1962 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 1963 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 1964 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 1965 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 1966 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 1967 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 1968 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 1969 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 1970 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 1971 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 1972 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 1973 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 1974 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 1975 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 1976 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 1977 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 1978 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 1979 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 1980 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 1981 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 1982 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 1983 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 1984 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 1985 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 1986 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 1987 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 1988 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 1989 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 1990 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 1991 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 1992 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 1993 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 1994 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 1995 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 1996 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 1997 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 1998 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 1999 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 2000 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 2001 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 2002 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 2003 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 2004 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 2005 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 2006 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 2007 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 2008 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 2009 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 2010 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 2011 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 2012 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 2013 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 2014 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 2015 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 2016 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 2017 }; 2018 2019 static uint8_t ms_hmac_key2[] = { 2020 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 2021 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2022 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2023 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 2024 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 2025 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2026 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 2027 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 2028 }; 2029 2030 static const uint8_t ms_hmac_digest2[] = { 2031 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 2032 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 2033 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 2034 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 2035 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 2036 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 2037 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 2038 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 2039 }; 2040 2041 /* End Session 2 */ 2042 2043 2044 static int 2045 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 2046 { 2047 struct crypto_testsuite_params *ts_params = &testsuite_params; 2048 struct crypto_unittest_params *ut_params = &unittest_params; 2049 2050 /* Verify the capabilities */ 2051 struct rte_cryptodev_sym_capability_idx cap_idx; 2052 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2053 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 2054 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2055 &cap_idx) == NULL) 2056 return TEST_SKIPPED; 2057 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2058 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 2059 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2060 &cap_idx) == NULL) 2061 return TEST_SKIPPED; 2062 2063 /* Generate test mbuf data and space for digest */ 2064 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2065 catch_22_quote, QUOTE_512_BYTES, 0); 2066 2067 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2068 DIGEST_BYTE_LENGTH_SHA1); 2069 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2070 2071 /* Setup Cipher Parameters */ 2072 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2073 ut_params->cipher_xform.next = &ut_params->auth_xform; 2074 2075 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2076 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 2077 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 2078 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2079 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2080 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2081 2082 /* Setup HMAC Parameters */ 2083 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2084 2085 ut_params->auth_xform.next = NULL; 2086 2087 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 2088 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 2089 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 2090 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 2091 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 2092 2093 ut_params->sess = rte_cryptodev_sym_session_create( 2094 ts_params->session_mpool); 2095 2096 /* Create crypto session*/ 2097 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 2098 ut_params->sess, &ut_params->cipher_xform, 2099 ts_params->session_priv_mpool); 2100 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2101 2102 /* Generate crypto op data structure */ 2103 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2104 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2105 TEST_ASSERT_NOT_NULL(ut_params->op, 2106 "Failed to allocate symmetric crypto operation struct"); 2107 2108 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2109 2110 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2111 2112 /* set crypto operation source mbuf */ 2113 sym_op->m_src = ut_params->ibuf; 2114 2115 /* Set crypto operation authentication parameters */ 2116 sym_op->auth.digest.data = ut_params->digest; 2117 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2118 ut_params->ibuf, QUOTE_512_BYTES); 2119 2120 sym_op->auth.data.offset = 0; 2121 sym_op->auth.data.length = QUOTE_512_BYTES; 2122 2123 /* Copy IV at the end of the crypto operation */ 2124 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2125 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 2126 2127 /* Set crypto operation cipher parameters */ 2128 sym_op->cipher.data.offset = 0; 2129 sym_op->cipher.data.length = QUOTE_512_BYTES; 2130 2131 /* Process crypto operation */ 2132 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2133 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2134 ut_params->op); 2135 else 2136 TEST_ASSERT_NOT_NULL( 2137 process_crypto_request(ts_params->valid_devs[0], 2138 ut_params->op), 2139 "failed to process sym crypto op"); 2140 2141 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2142 "crypto op processing failed"); 2143 2144 /* Validate obuf */ 2145 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 2146 uint8_t *); 2147 2148 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 2149 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 2150 QUOTE_512_BYTES, 2151 "ciphertext data not as expected"); 2152 2153 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 2154 2155 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 2156 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 2157 gbl_driver_id == rte_cryptodev_driver_id_get( 2158 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 2159 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 2160 DIGEST_BYTE_LENGTH_SHA1, 2161 "Generated digest data not as expected"); 2162 2163 return TEST_SUCCESS; 2164 } 2165 2166 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 2167 2168 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 2169 2170 static uint8_t hmac_sha512_key[] = { 2171 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 2172 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 2173 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 2174 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 2175 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 2176 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 2177 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 2178 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 2179 2180 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 2181 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 2182 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 2183 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 2184 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 2185 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 2186 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 2187 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 2188 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 2189 2190 2191 2192 static int 2193 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2194 struct crypto_unittest_params *ut_params, 2195 uint8_t *cipher_key, 2196 uint8_t *hmac_key); 2197 2198 static int 2199 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2200 struct crypto_unittest_params *ut_params, 2201 struct crypto_testsuite_params *ts_params, 2202 const uint8_t *cipher, 2203 const uint8_t *digest, 2204 const uint8_t *iv); 2205 2206 2207 static int 2208 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 2209 struct crypto_unittest_params *ut_params, 2210 uint8_t *cipher_key, 2211 uint8_t *hmac_key) 2212 { 2213 2214 /* Setup Cipher Parameters */ 2215 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2216 ut_params->cipher_xform.next = NULL; 2217 2218 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 2219 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 2220 ut_params->cipher_xform.cipher.key.data = cipher_key; 2221 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 2222 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2223 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 2224 2225 /* Setup HMAC Parameters */ 2226 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2227 ut_params->auth_xform.next = &ut_params->cipher_xform; 2228 2229 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 2230 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 2231 ut_params->auth_xform.auth.key.data = hmac_key; 2232 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 2233 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 2234 2235 return TEST_SUCCESS; 2236 } 2237 2238 2239 static int 2240 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 2241 struct crypto_unittest_params *ut_params, 2242 struct crypto_testsuite_params *ts_params, 2243 const uint8_t *cipher, 2244 const uint8_t *digest, 2245 const uint8_t *iv) 2246 { 2247 /* Generate test mbuf data and digest */ 2248 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 2249 (const char *) 2250 cipher, 2251 QUOTE_512_BYTES, 0); 2252 2253 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2254 DIGEST_BYTE_LENGTH_SHA512); 2255 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 2256 2257 rte_memcpy(ut_params->digest, 2258 digest, 2259 DIGEST_BYTE_LENGTH_SHA512); 2260 2261 /* Generate Crypto op data structure */ 2262 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2263 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2264 TEST_ASSERT_NOT_NULL(ut_params->op, 2265 "Failed to allocate symmetric crypto operation struct"); 2266 2267 rte_crypto_op_attach_sym_session(ut_params->op, sess); 2268 2269 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2270 2271 /* set crypto operation source mbuf */ 2272 sym_op->m_src = ut_params->ibuf; 2273 2274 sym_op->auth.digest.data = ut_params->digest; 2275 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2276 ut_params->ibuf, QUOTE_512_BYTES); 2277 2278 sym_op->auth.data.offset = 0; 2279 sym_op->auth.data.length = QUOTE_512_BYTES; 2280 2281 /* Copy IV at the end of the crypto operation */ 2282 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2283 iv, CIPHER_IV_LENGTH_AES_CBC); 2284 2285 sym_op->cipher.data.offset = 0; 2286 sym_op->cipher.data.length = QUOTE_512_BYTES; 2287 2288 /* Process crypto operation */ 2289 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2290 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2291 ut_params->op); 2292 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2293 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2294 ut_params->op, 1, 1, 0, 0); 2295 else 2296 TEST_ASSERT_NOT_NULL( 2297 process_crypto_request(ts_params->valid_devs[0], 2298 ut_params->op), 2299 "failed to process sym crypto op"); 2300 2301 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2302 "crypto op processing failed"); 2303 2304 ut_params->obuf = ut_params->op->sym->m_src; 2305 2306 /* Validate obuf */ 2307 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2308 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 2309 catch_22_quote, 2310 QUOTE_512_BYTES, 2311 "Plaintext data not as expected"); 2312 2313 /* Validate obuf */ 2314 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 2315 "Digest verification failed"); 2316 2317 return TEST_SUCCESS; 2318 } 2319 2320 /* ***** SNOW 3G Tests ***** */ 2321 static int 2322 create_wireless_algo_hash_session(uint8_t dev_id, 2323 const uint8_t *key, const uint8_t key_len, 2324 const uint8_t iv_len, const uint8_t auth_len, 2325 enum rte_crypto_auth_operation op, 2326 enum rte_crypto_auth_algorithm algo) 2327 { 2328 uint8_t hash_key[key_len]; 2329 int status; 2330 2331 struct crypto_testsuite_params *ts_params = &testsuite_params; 2332 struct crypto_unittest_params *ut_params = &unittest_params; 2333 2334 memcpy(hash_key, key, key_len); 2335 2336 debug_hexdump(stdout, "key:", key, key_len); 2337 2338 /* Setup Authentication Parameters */ 2339 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2340 ut_params->auth_xform.next = NULL; 2341 2342 ut_params->auth_xform.auth.op = op; 2343 ut_params->auth_xform.auth.algo = algo; 2344 ut_params->auth_xform.auth.key.length = key_len; 2345 ut_params->auth_xform.auth.key.data = hash_key; 2346 ut_params->auth_xform.auth.digest_length = auth_len; 2347 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2348 ut_params->auth_xform.auth.iv.length = iv_len; 2349 ut_params->sess = rte_cryptodev_sym_session_create( 2350 ts_params->session_mpool); 2351 2352 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2353 &ut_params->auth_xform, 2354 ts_params->session_priv_mpool); 2355 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2356 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2357 return 0; 2358 } 2359 2360 static int 2361 create_wireless_algo_cipher_session(uint8_t dev_id, 2362 enum rte_crypto_cipher_operation op, 2363 enum rte_crypto_cipher_algorithm algo, 2364 const uint8_t *key, const uint8_t key_len, 2365 uint8_t iv_len) 2366 { 2367 uint8_t cipher_key[key_len]; 2368 int status; 2369 struct crypto_testsuite_params *ts_params = &testsuite_params; 2370 struct crypto_unittest_params *ut_params = &unittest_params; 2371 2372 memcpy(cipher_key, key, key_len); 2373 2374 /* Setup Cipher Parameters */ 2375 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2376 ut_params->cipher_xform.next = NULL; 2377 2378 ut_params->cipher_xform.cipher.algo = algo; 2379 ut_params->cipher_xform.cipher.op = op; 2380 ut_params->cipher_xform.cipher.key.data = cipher_key; 2381 ut_params->cipher_xform.cipher.key.length = key_len; 2382 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2383 ut_params->cipher_xform.cipher.iv.length = iv_len; 2384 2385 debug_hexdump(stdout, "key:", key, key_len); 2386 2387 /* Create Crypto session */ 2388 ut_params->sess = rte_cryptodev_sym_session_create( 2389 ts_params->session_mpool); 2390 2391 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2392 &ut_params->cipher_xform, 2393 ts_params->session_priv_mpool); 2394 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2395 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2396 return 0; 2397 } 2398 2399 static int 2400 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2401 unsigned int cipher_len, 2402 unsigned int cipher_offset) 2403 { 2404 struct crypto_testsuite_params *ts_params = &testsuite_params; 2405 struct crypto_unittest_params *ut_params = &unittest_params; 2406 2407 /* Generate Crypto op data structure */ 2408 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2409 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2410 TEST_ASSERT_NOT_NULL(ut_params->op, 2411 "Failed to allocate pktmbuf offload"); 2412 2413 /* Set crypto operation data parameters */ 2414 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2415 2416 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2417 2418 /* set crypto operation source mbuf */ 2419 sym_op->m_src = ut_params->ibuf; 2420 2421 /* iv */ 2422 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2423 iv, iv_len); 2424 sym_op->cipher.data.length = cipher_len; 2425 sym_op->cipher.data.offset = cipher_offset; 2426 return 0; 2427 } 2428 2429 static int 2430 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2431 unsigned int cipher_len, 2432 unsigned int cipher_offset) 2433 { 2434 struct crypto_testsuite_params *ts_params = &testsuite_params; 2435 struct crypto_unittest_params *ut_params = &unittest_params; 2436 2437 /* Generate Crypto op data structure */ 2438 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2439 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2440 TEST_ASSERT_NOT_NULL(ut_params->op, 2441 "Failed to allocate pktmbuf offload"); 2442 2443 /* Set crypto operation data parameters */ 2444 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2445 2446 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2447 2448 /* set crypto operation source mbuf */ 2449 sym_op->m_src = ut_params->ibuf; 2450 sym_op->m_dst = ut_params->obuf; 2451 2452 /* iv */ 2453 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2454 iv, iv_len); 2455 sym_op->cipher.data.length = cipher_len; 2456 sym_op->cipher.data.offset = cipher_offset; 2457 return 0; 2458 } 2459 2460 static int 2461 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2462 enum rte_crypto_cipher_operation cipher_op, 2463 enum rte_crypto_auth_operation auth_op, 2464 enum rte_crypto_auth_algorithm auth_algo, 2465 enum rte_crypto_cipher_algorithm cipher_algo, 2466 const uint8_t *key, uint8_t key_len, 2467 uint8_t auth_iv_len, uint8_t auth_len, 2468 uint8_t cipher_iv_len) 2469 2470 { 2471 uint8_t cipher_auth_key[key_len]; 2472 int status; 2473 2474 struct crypto_testsuite_params *ts_params = &testsuite_params; 2475 struct crypto_unittest_params *ut_params = &unittest_params; 2476 2477 memcpy(cipher_auth_key, key, key_len); 2478 2479 /* Setup Authentication Parameters */ 2480 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2481 ut_params->auth_xform.next = NULL; 2482 2483 ut_params->auth_xform.auth.op = auth_op; 2484 ut_params->auth_xform.auth.algo = auth_algo; 2485 ut_params->auth_xform.auth.key.length = key_len; 2486 /* Hash key = cipher key */ 2487 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2488 ut_params->auth_xform.auth.digest_length = auth_len; 2489 /* Auth IV will be after cipher IV */ 2490 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2491 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2492 2493 /* Setup Cipher Parameters */ 2494 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2495 ut_params->cipher_xform.next = &ut_params->auth_xform; 2496 2497 ut_params->cipher_xform.cipher.algo = cipher_algo; 2498 ut_params->cipher_xform.cipher.op = cipher_op; 2499 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2500 ut_params->cipher_xform.cipher.key.length = key_len; 2501 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2502 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2503 2504 debug_hexdump(stdout, "key:", key, key_len); 2505 2506 /* Create Crypto session*/ 2507 ut_params->sess = rte_cryptodev_sym_session_create( 2508 ts_params->session_mpool); 2509 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2510 2511 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2512 &ut_params->cipher_xform, 2513 ts_params->session_priv_mpool); 2514 if (status == -ENOTSUP) 2515 return TEST_SKIPPED; 2516 2517 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2518 return 0; 2519 } 2520 2521 static int 2522 create_wireless_cipher_auth_session(uint8_t dev_id, 2523 enum rte_crypto_cipher_operation cipher_op, 2524 enum rte_crypto_auth_operation auth_op, 2525 enum rte_crypto_auth_algorithm auth_algo, 2526 enum rte_crypto_cipher_algorithm cipher_algo, 2527 const struct wireless_test_data *tdata) 2528 { 2529 const uint8_t key_len = tdata->key.len; 2530 uint8_t cipher_auth_key[key_len]; 2531 int status; 2532 2533 struct crypto_testsuite_params *ts_params = &testsuite_params; 2534 struct crypto_unittest_params *ut_params = &unittest_params; 2535 const uint8_t *key = tdata->key.data; 2536 const uint8_t auth_len = tdata->digest.len; 2537 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2538 uint8_t auth_iv_len = tdata->auth_iv.len; 2539 2540 memcpy(cipher_auth_key, key, key_len); 2541 2542 /* Setup Authentication Parameters */ 2543 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2544 ut_params->auth_xform.next = NULL; 2545 2546 ut_params->auth_xform.auth.op = auth_op; 2547 ut_params->auth_xform.auth.algo = auth_algo; 2548 ut_params->auth_xform.auth.key.length = key_len; 2549 /* Hash key = cipher key */ 2550 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2551 ut_params->auth_xform.auth.digest_length = auth_len; 2552 /* Auth IV will be after cipher IV */ 2553 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2554 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2555 2556 /* Setup Cipher Parameters */ 2557 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2558 ut_params->cipher_xform.next = &ut_params->auth_xform; 2559 2560 ut_params->cipher_xform.cipher.algo = cipher_algo; 2561 ut_params->cipher_xform.cipher.op = cipher_op; 2562 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2563 ut_params->cipher_xform.cipher.key.length = key_len; 2564 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2565 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2566 2567 2568 debug_hexdump(stdout, "key:", key, key_len); 2569 2570 /* Create Crypto session*/ 2571 ut_params->sess = rte_cryptodev_sym_session_create( 2572 ts_params->session_mpool); 2573 2574 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2575 &ut_params->cipher_xform, 2576 ts_params->session_priv_mpool); 2577 if (status == -ENOTSUP) 2578 return TEST_SKIPPED; 2579 2580 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2581 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2582 return 0; 2583 } 2584 2585 static int 2586 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2587 const struct wireless_test_data *tdata) 2588 { 2589 return create_wireless_cipher_auth_session(dev_id, 2590 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2591 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2592 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2593 } 2594 2595 static int 2596 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2597 enum rte_crypto_cipher_operation cipher_op, 2598 enum rte_crypto_auth_operation auth_op, 2599 enum rte_crypto_auth_algorithm auth_algo, 2600 enum rte_crypto_cipher_algorithm cipher_algo, 2601 const uint8_t *key, const uint8_t key_len, 2602 uint8_t auth_iv_len, uint8_t auth_len, 2603 uint8_t cipher_iv_len) 2604 { 2605 uint8_t auth_cipher_key[key_len]; 2606 int status; 2607 struct crypto_testsuite_params *ts_params = &testsuite_params; 2608 struct crypto_unittest_params *ut_params = &unittest_params; 2609 2610 memcpy(auth_cipher_key, key, key_len); 2611 2612 /* Setup Authentication Parameters */ 2613 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2614 ut_params->auth_xform.auth.op = auth_op; 2615 ut_params->auth_xform.next = &ut_params->cipher_xform; 2616 ut_params->auth_xform.auth.algo = auth_algo; 2617 ut_params->auth_xform.auth.key.length = key_len; 2618 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2619 ut_params->auth_xform.auth.digest_length = auth_len; 2620 /* Auth IV will be after cipher IV */ 2621 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2622 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2623 2624 /* Setup Cipher Parameters */ 2625 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2626 ut_params->cipher_xform.next = NULL; 2627 ut_params->cipher_xform.cipher.algo = cipher_algo; 2628 ut_params->cipher_xform.cipher.op = cipher_op; 2629 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2630 ut_params->cipher_xform.cipher.key.length = key_len; 2631 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2632 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2633 2634 debug_hexdump(stdout, "key:", key, key_len); 2635 2636 /* Create Crypto session*/ 2637 ut_params->sess = rte_cryptodev_sym_session_create( 2638 ts_params->session_mpool); 2639 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2640 2641 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2642 ut_params->auth_xform.next = NULL; 2643 ut_params->cipher_xform.next = &ut_params->auth_xform; 2644 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2645 &ut_params->cipher_xform, 2646 ts_params->session_priv_mpool); 2647 2648 } else 2649 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2650 &ut_params->auth_xform, 2651 ts_params->session_priv_mpool); 2652 2653 if (status == -ENOTSUP) 2654 return TEST_SKIPPED; 2655 2656 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2657 2658 return 0; 2659 } 2660 2661 static int 2662 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2663 unsigned int auth_tag_len, 2664 const uint8_t *iv, unsigned int iv_len, 2665 unsigned int data_pad_len, 2666 enum rte_crypto_auth_operation op, 2667 unsigned int auth_len, unsigned int auth_offset) 2668 { 2669 struct crypto_testsuite_params *ts_params = &testsuite_params; 2670 2671 struct crypto_unittest_params *ut_params = &unittest_params; 2672 2673 /* Generate Crypto op data structure */ 2674 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2675 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2676 TEST_ASSERT_NOT_NULL(ut_params->op, 2677 "Failed to allocate pktmbuf offload"); 2678 2679 /* Set crypto operation data parameters */ 2680 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2681 2682 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2683 2684 /* set crypto operation source mbuf */ 2685 sym_op->m_src = ut_params->ibuf; 2686 2687 /* iv */ 2688 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2689 iv, iv_len); 2690 /* digest */ 2691 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2692 ut_params->ibuf, auth_tag_len); 2693 2694 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2695 "no room to append auth tag"); 2696 ut_params->digest = sym_op->auth.digest.data; 2697 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2698 ut_params->ibuf, data_pad_len); 2699 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2700 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2701 else 2702 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2703 2704 debug_hexdump(stdout, "digest:", 2705 sym_op->auth.digest.data, 2706 auth_tag_len); 2707 2708 sym_op->auth.data.length = auth_len; 2709 sym_op->auth.data.offset = auth_offset; 2710 2711 return 0; 2712 } 2713 2714 static int 2715 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2716 enum rte_crypto_auth_operation op) 2717 { 2718 struct crypto_testsuite_params *ts_params = &testsuite_params; 2719 struct crypto_unittest_params *ut_params = &unittest_params; 2720 2721 const uint8_t *auth_tag = tdata->digest.data; 2722 const unsigned int auth_tag_len = tdata->digest.len; 2723 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2724 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2725 2726 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2727 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2728 const uint8_t *auth_iv = tdata->auth_iv.data; 2729 const uint8_t auth_iv_len = tdata->auth_iv.len; 2730 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2731 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2732 2733 /* Generate Crypto op data structure */ 2734 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2735 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2736 TEST_ASSERT_NOT_NULL(ut_params->op, 2737 "Failed to allocate pktmbuf offload"); 2738 /* Set crypto operation data parameters */ 2739 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2740 2741 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2742 2743 /* set crypto operation source mbuf */ 2744 sym_op->m_src = ut_params->ibuf; 2745 2746 /* digest */ 2747 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2748 ut_params->ibuf, auth_tag_len); 2749 2750 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2751 "no room to append auth tag"); 2752 ut_params->digest = sym_op->auth.digest.data; 2753 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2754 ut_params->ibuf, data_pad_len); 2755 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2756 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2757 else 2758 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2759 2760 debug_hexdump(stdout, "digest:", 2761 sym_op->auth.digest.data, 2762 auth_tag_len); 2763 2764 /* Copy cipher and auth IVs at the end of the crypto operation */ 2765 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2766 IV_OFFSET); 2767 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2768 iv_ptr += cipher_iv_len; 2769 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2770 2771 sym_op->cipher.data.length = cipher_len; 2772 sym_op->cipher.data.offset = 0; 2773 sym_op->auth.data.length = auth_len; 2774 sym_op->auth.data.offset = 0; 2775 2776 return 0; 2777 } 2778 2779 static int 2780 create_zuc_cipher_hash_generate_operation( 2781 const struct wireless_test_data *tdata) 2782 { 2783 return create_wireless_cipher_hash_operation(tdata, 2784 RTE_CRYPTO_AUTH_OP_GENERATE); 2785 } 2786 2787 static int 2788 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2789 const unsigned auth_tag_len, 2790 const uint8_t *auth_iv, uint8_t auth_iv_len, 2791 unsigned data_pad_len, 2792 enum rte_crypto_auth_operation op, 2793 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2794 const unsigned cipher_len, const unsigned cipher_offset, 2795 const unsigned auth_len, const unsigned auth_offset) 2796 { 2797 struct crypto_testsuite_params *ts_params = &testsuite_params; 2798 struct crypto_unittest_params *ut_params = &unittest_params; 2799 2800 enum rte_crypto_cipher_algorithm cipher_algo = 2801 ut_params->cipher_xform.cipher.algo; 2802 enum rte_crypto_auth_algorithm auth_algo = 2803 ut_params->auth_xform.auth.algo; 2804 2805 /* Generate Crypto op data structure */ 2806 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2807 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2808 TEST_ASSERT_NOT_NULL(ut_params->op, 2809 "Failed to allocate pktmbuf offload"); 2810 /* Set crypto operation data parameters */ 2811 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2812 2813 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2814 2815 /* set crypto operation source mbuf */ 2816 sym_op->m_src = ut_params->ibuf; 2817 2818 /* digest */ 2819 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2820 ut_params->ibuf, auth_tag_len); 2821 2822 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2823 "no room to append auth tag"); 2824 ut_params->digest = sym_op->auth.digest.data; 2825 2826 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2827 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2828 ut_params->ibuf, data_pad_len); 2829 } else { 2830 struct rte_mbuf *m = ut_params->ibuf; 2831 unsigned int offset = data_pad_len; 2832 2833 while (offset > m->data_len && m->next != NULL) { 2834 offset -= m->data_len; 2835 m = m->next; 2836 } 2837 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2838 m, offset); 2839 } 2840 2841 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2842 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2843 else 2844 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2845 2846 debug_hexdump(stdout, "digest:", 2847 sym_op->auth.digest.data, 2848 auth_tag_len); 2849 2850 /* Copy cipher and auth IVs at the end of the crypto operation */ 2851 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2852 IV_OFFSET); 2853 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2854 iv_ptr += cipher_iv_len; 2855 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2856 2857 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2858 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2859 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2860 sym_op->cipher.data.length = cipher_len; 2861 sym_op->cipher.data.offset = cipher_offset; 2862 } else { 2863 sym_op->cipher.data.length = cipher_len >> 3; 2864 sym_op->cipher.data.offset = cipher_offset >> 3; 2865 } 2866 2867 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2868 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2869 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2870 sym_op->auth.data.length = auth_len; 2871 sym_op->auth.data.offset = auth_offset; 2872 } else { 2873 sym_op->auth.data.length = auth_len >> 3; 2874 sym_op->auth.data.offset = auth_offset >> 3; 2875 } 2876 2877 return 0; 2878 } 2879 2880 static int 2881 create_wireless_algo_auth_cipher_operation( 2882 const uint8_t *auth_tag, unsigned int auth_tag_len, 2883 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2884 const uint8_t *auth_iv, uint8_t auth_iv_len, 2885 unsigned int data_pad_len, 2886 unsigned int cipher_len, unsigned int cipher_offset, 2887 unsigned int auth_len, unsigned int auth_offset, 2888 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2889 { 2890 struct crypto_testsuite_params *ts_params = &testsuite_params; 2891 struct crypto_unittest_params *ut_params = &unittest_params; 2892 2893 enum rte_crypto_cipher_algorithm cipher_algo = 2894 ut_params->cipher_xform.cipher.algo; 2895 enum rte_crypto_auth_algorithm auth_algo = 2896 ut_params->auth_xform.auth.algo; 2897 2898 /* Generate Crypto op data structure */ 2899 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2900 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2901 TEST_ASSERT_NOT_NULL(ut_params->op, 2902 "Failed to allocate pktmbuf offload"); 2903 2904 /* Set crypto operation data parameters */ 2905 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2906 2907 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2908 2909 /* set crypto operation mbufs */ 2910 sym_op->m_src = ut_params->ibuf; 2911 if (op_mode == OUT_OF_PLACE) 2912 sym_op->m_dst = ut_params->obuf; 2913 2914 /* digest */ 2915 if (!do_sgl) { 2916 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2917 (op_mode == IN_PLACE ? 2918 ut_params->ibuf : ut_params->obuf), 2919 uint8_t *, data_pad_len); 2920 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2921 (op_mode == IN_PLACE ? 2922 ut_params->ibuf : ut_params->obuf), 2923 data_pad_len); 2924 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2925 } else { 2926 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2927 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2928 sym_op->m_src : sym_op->m_dst); 2929 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2930 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2931 sgl_buf = sgl_buf->next; 2932 } 2933 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 2934 uint8_t *, remaining_off); 2935 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 2936 remaining_off); 2937 memset(sym_op->auth.digest.data, 0, remaining_off); 2938 while (sgl_buf->next != NULL) { 2939 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 2940 0, rte_pktmbuf_data_len(sgl_buf)); 2941 sgl_buf = sgl_buf->next; 2942 } 2943 } 2944 2945 /* Copy digest for the verification */ 2946 if (verify) 2947 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2948 2949 /* Copy cipher and auth IVs at the end of the crypto operation */ 2950 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 2951 ut_params->op, uint8_t *, IV_OFFSET); 2952 2953 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2954 iv_ptr += cipher_iv_len; 2955 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2956 2957 /* Only copy over the offset data needed from src to dst in OOP, 2958 * if the auth and cipher offsets are not aligned 2959 */ 2960 if (op_mode == OUT_OF_PLACE) { 2961 if (cipher_offset > auth_offset) 2962 rte_memcpy( 2963 rte_pktmbuf_mtod_offset( 2964 sym_op->m_dst, 2965 uint8_t *, auth_offset >> 3), 2966 rte_pktmbuf_mtod_offset( 2967 sym_op->m_src, 2968 uint8_t *, auth_offset >> 3), 2969 ((cipher_offset >> 3) - (auth_offset >> 3))); 2970 } 2971 2972 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2973 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2974 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2975 sym_op->cipher.data.length = cipher_len; 2976 sym_op->cipher.data.offset = cipher_offset; 2977 } else { 2978 sym_op->cipher.data.length = cipher_len >> 3; 2979 sym_op->cipher.data.offset = cipher_offset >> 3; 2980 } 2981 2982 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2983 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2984 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2985 sym_op->auth.data.length = auth_len; 2986 sym_op->auth.data.offset = auth_offset; 2987 } else { 2988 sym_op->auth.data.length = auth_len >> 3; 2989 sym_op->auth.data.offset = auth_offset >> 3; 2990 } 2991 2992 return 0; 2993 } 2994 2995 static int 2996 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 2997 { 2998 struct crypto_testsuite_params *ts_params = &testsuite_params; 2999 struct crypto_unittest_params *ut_params = &unittest_params; 3000 3001 int retval; 3002 unsigned plaintext_pad_len; 3003 unsigned plaintext_len; 3004 uint8_t *plaintext; 3005 struct rte_cryptodev_info dev_info; 3006 3007 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3008 uint64_t feat_flags = dev_info.feature_flags; 3009 3010 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3011 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3012 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3013 return TEST_SKIPPED; 3014 } 3015 3016 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3017 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3018 printf("Device doesn't support RAW data-path APIs.\n"); 3019 return TEST_SKIPPED; 3020 } 3021 3022 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3023 return TEST_SKIPPED; 3024 3025 /* Verify the capabilities */ 3026 struct rte_cryptodev_sym_capability_idx cap_idx; 3027 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3028 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3029 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3030 &cap_idx) == NULL) 3031 return TEST_SKIPPED; 3032 3033 /* Create SNOW 3G session */ 3034 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3035 tdata->key.data, tdata->key.len, 3036 tdata->auth_iv.len, tdata->digest.len, 3037 RTE_CRYPTO_AUTH_OP_GENERATE, 3038 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3039 if (retval < 0) 3040 return retval; 3041 3042 /* alloc mbuf and set payload */ 3043 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3044 3045 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3046 rte_pktmbuf_tailroom(ut_params->ibuf)); 3047 3048 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3049 /* Append data which is padded to a multiple of */ 3050 /* the algorithms block size */ 3051 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3052 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3053 plaintext_pad_len); 3054 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3055 3056 /* Create SNOW 3G operation */ 3057 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3058 tdata->auth_iv.data, tdata->auth_iv.len, 3059 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3060 tdata->validAuthLenInBits.len, 3061 0); 3062 if (retval < 0) 3063 return retval; 3064 3065 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3066 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3067 ut_params->op, 0, 1, 1, 0); 3068 else 3069 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3070 ut_params->op); 3071 ut_params->obuf = ut_params->op->sym->m_src; 3072 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3073 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3074 + plaintext_pad_len; 3075 3076 /* Validate obuf */ 3077 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3078 ut_params->digest, 3079 tdata->digest.data, 3080 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 3081 "SNOW 3G Generated auth tag not as expected"); 3082 3083 return 0; 3084 } 3085 3086 static int 3087 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 3088 { 3089 struct crypto_testsuite_params *ts_params = &testsuite_params; 3090 struct crypto_unittest_params *ut_params = &unittest_params; 3091 3092 int retval; 3093 unsigned plaintext_pad_len; 3094 unsigned plaintext_len; 3095 uint8_t *plaintext; 3096 struct rte_cryptodev_info dev_info; 3097 3098 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3099 uint64_t feat_flags = dev_info.feature_flags; 3100 3101 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 3102 ((tdata->validAuthLenInBits.len % 8) != 0)) { 3103 printf("Device doesn't support NON-Byte Aligned Data.\n"); 3104 return TEST_SKIPPED; 3105 } 3106 3107 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3108 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3109 printf("Device doesn't support RAW data-path APIs.\n"); 3110 return TEST_SKIPPED; 3111 } 3112 3113 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3114 return TEST_SKIPPED; 3115 3116 /* Verify the capabilities */ 3117 struct rte_cryptodev_sym_capability_idx cap_idx; 3118 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3119 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 3120 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3121 &cap_idx) == NULL) 3122 return TEST_SKIPPED; 3123 3124 /* Create SNOW 3G session */ 3125 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3126 tdata->key.data, tdata->key.len, 3127 tdata->auth_iv.len, tdata->digest.len, 3128 RTE_CRYPTO_AUTH_OP_VERIFY, 3129 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 3130 if (retval < 0) 3131 return retval; 3132 /* alloc mbuf and set payload */ 3133 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3134 3135 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3136 rte_pktmbuf_tailroom(ut_params->ibuf)); 3137 3138 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3139 /* Append data which is padded to a multiple of */ 3140 /* the algorithms block size */ 3141 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3142 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3143 plaintext_pad_len); 3144 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3145 3146 /* Create SNOW 3G operation */ 3147 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3148 tdata->digest.len, 3149 tdata->auth_iv.data, tdata->auth_iv.len, 3150 plaintext_pad_len, 3151 RTE_CRYPTO_AUTH_OP_VERIFY, 3152 tdata->validAuthLenInBits.len, 3153 0); 3154 if (retval < 0) 3155 return retval; 3156 3157 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3158 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3159 ut_params->op, 0, 1, 1, 0); 3160 else 3161 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3162 ut_params->op); 3163 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3164 ut_params->obuf = ut_params->op->sym->m_src; 3165 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3166 + plaintext_pad_len; 3167 3168 /* Validate obuf */ 3169 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3170 return 0; 3171 else 3172 return -1; 3173 3174 return 0; 3175 } 3176 3177 static int 3178 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 3179 { 3180 struct crypto_testsuite_params *ts_params = &testsuite_params; 3181 struct crypto_unittest_params *ut_params = &unittest_params; 3182 3183 int retval; 3184 unsigned plaintext_pad_len; 3185 unsigned plaintext_len; 3186 uint8_t *plaintext; 3187 struct rte_cryptodev_info dev_info; 3188 3189 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3190 uint64_t feat_flags = dev_info.feature_flags; 3191 3192 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3193 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3194 printf("Device doesn't support RAW data-path APIs.\n"); 3195 return TEST_SKIPPED; 3196 } 3197 3198 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3199 return TEST_SKIPPED; 3200 3201 /* Verify the capabilities */ 3202 struct rte_cryptodev_sym_capability_idx cap_idx; 3203 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3204 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3205 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3206 &cap_idx) == NULL) 3207 return TEST_SKIPPED; 3208 3209 /* Create KASUMI session */ 3210 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3211 tdata->key.data, tdata->key.len, 3212 0, tdata->digest.len, 3213 RTE_CRYPTO_AUTH_OP_GENERATE, 3214 RTE_CRYPTO_AUTH_KASUMI_F9); 3215 if (retval < 0) 3216 return retval; 3217 3218 /* alloc mbuf and set payload */ 3219 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3220 3221 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3222 rte_pktmbuf_tailroom(ut_params->ibuf)); 3223 3224 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3225 /* Append data which is padded to a multiple of */ 3226 /* the algorithms block size */ 3227 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3228 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3229 plaintext_pad_len); 3230 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3231 3232 /* Create KASUMI operation */ 3233 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 3234 NULL, 0, 3235 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 3236 tdata->plaintext.len, 3237 0); 3238 if (retval < 0) 3239 return retval; 3240 3241 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3242 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 3243 ut_params->op); 3244 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3245 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3246 ut_params->op, 0, 1, 1, 0); 3247 else 3248 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3249 ut_params->op); 3250 3251 ut_params->obuf = ut_params->op->sym->m_src; 3252 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3253 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3254 + plaintext_pad_len; 3255 3256 /* Validate obuf */ 3257 TEST_ASSERT_BUFFERS_ARE_EQUAL( 3258 ut_params->digest, 3259 tdata->digest.data, 3260 DIGEST_BYTE_LENGTH_KASUMI_F9, 3261 "KASUMI Generated auth tag not as expected"); 3262 3263 return 0; 3264 } 3265 3266 static int 3267 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 3268 { 3269 struct crypto_testsuite_params *ts_params = &testsuite_params; 3270 struct crypto_unittest_params *ut_params = &unittest_params; 3271 3272 int retval; 3273 unsigned plaintext_pad_len; 3274 unsigned plaintext_len; 3275 uint8_t *plaintext; 3276 struct rte_cryptodev_info dev_info; 3277 3278 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3279 uint64_t feat_flags = dev_info.feature_flags; 3280 3281 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3282 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3283 printf("Device doesn't support RAW data-path APIs.\n"); 3284 return TEST_SKIPPED; 3285 } 3286 3287 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3288 return TEST_SKIPPED; 3289 3290 /* Verify the capabilities */ 3291 struct rte_cryptodev_sym_capability_idx cap_idx; 3292 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 3293 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 3294 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3295 &cap_idx) == NULL) 3296 return TEST_SKIPPED; 3297 3298 /* Create KASUMI session */ 3299 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 3300 tdata->key.data, tdata->key.len, 3301 0, tdata->digest.len, 3302 RTE_CRYPTO_AUTH_OP_VERIFY, 3303 RTE_CRYPTO_AUTH_KASUMI_F9); 3304 if (retval < 0) 3305 return retval; 3306 /* alloc mbuf and set payload */ 3307 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3308 3309 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3310 rte_pktmbuf_tailroom(ut_params->ibuf)); 3311 3312 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3313 /* Append data which is padded to a multiple */ 3314 /* of the algorithms block size */ 3315 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3316 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3317 plaintext_pad_len); 3318 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3319 3320 /* Create KASUMI operation */ 3321 retval = create_wireless_algo_hash_operation(tdata->digest.data, 3322 tdata->digest.len, 3323 NULL, 0, 3324 plaintext_pad_len, 3325 RTE_CRYPTO_AUTH_OP_VERIFY, 3326 tdata->plaintext.len, 3327 0); 3328 if (retval < 0) 3329 return retval; 3330 3331 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3332 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3333 ut_params->op, 0, 1, 1, 0); 3334 else 3335 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3336 ut_params->op); 3337 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3338 ut_params->obuf = ut_params->op->sym->m_src; 3339 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3340 + plaintext_pad_len; 3341 3342 /* Validate obuf */ 3343 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3344 return 0; 3345 else 3346 return -1; 3347 3348 return 0; 3349 } 3350 3351 static int 3352 test_snow3g_hash_generate_test_case_1(void) 3353 { 3354 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3355 } 3356 3357 static int 3358 test_snow3g_hash_generate_test_case_2(void) 3359 { 3360 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3361 } 3362 3363 static int 3364 test_snow3g_hash_generate_test_case_3(void) 3365 { 3366 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3367 } 3368 3369 static int 3370 test_snow3g_hash_generate_test_case_4(void) 3371 { 3372 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3373 } 3374 3375 static int 3376 test_snow3g_hash_generate_test_case_5(void) 3377 { 3378 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3379 } 3380 3381 static int 3382 test_snow3g_hash_generate_test_case_6(void) 3383 { 3384 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3385 } 3386 3387 static int 3388 test_snow3g_hash_verify_test_case_1(void) 3389 { 3390 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3391 3392 } 3393 3394 static int 3395 test_snow3g_hash_verify_test_case_2(void) 3396 { 3397 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3398 } 3399 3400 static int 3401 test_snow3g_hash_verify_test_case_3(void) 3402 { 3403 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3404 } 3405 3406 static int 3407 test_snow3g_hash_verify_test_case_4(void) 3408 { 3409 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3410 } 3411 3412 static int 3413 test_snow3g_hash_verify_test_case_5(void) 3414 { 3415 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3416 } 3417 3418 static int 3419 test_snow3g_hash_verify_test_case_6(void) 3420 { 3421 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3422 } 3423 3424 static int 3425 test_kasumi_hash_generate_test_case_1(void) 3426 { 3427 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3428 } 3429 3430 static int 3431 test_kasumi_hash_generate_test_case_2(void) 3432 { 3433 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3434 } 3435 3436 static int 3437 test_kasumi_hash_generate_test_case_3(void) 3438 { 3439 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3440 } 3441 3442 static int 3443 test_kasumi_hash_generate_test_case_4(void) 3444 { 3445 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3446 } 3447 3448 static int 3449 test_kasumi_hash_generate_test_case_5(void) 3450 { 3451 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3452 } 3453 3454 static int 3455 test_kasumi_hash_generate_test_case_6(void) 3456 { 3457 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3458 } 3459 3460 static int 3461 test_kasumi_hash_verify_test_case_1(void) 3462 { 3463 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3464 } 3465 3466 static int 3467 test_kasumi_hash_verify_test_case_2(void) 3468 { 3469 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3470 } 3471 3472 static int 3473 test_kasumi_hash_verify_test_case_3(void) 3474 { 3475 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3476 } 3477 3478 static int 3479 test_kasumi_hash_verify_test_case_4(void) 3480 { 3481 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3482 } 3483 3484 static int 3485 test_kasumi_hash_verify_test_case_5(void) 3486 { 3487 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3488 } 3489 3490 static int 3491 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3492 { 3493 struct crypto_testsuite_params *ts_params = &testsuite_params; 3494 struct crypto_unittest_params *ut_params = &unittest_params; 3495 3496 int retval; 3497 uint8_t *plaintext, *ciphertext; 3498 unsigned plaintext_pad_len; 3499 unsigned plaintext_len; 3500 struct rte_cryptodev_info dev_info; 3501 3502 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3503 uint64_t feat_flags = dev_info.feature_flags; 3504 3505 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3506 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3507 printf("Device doesn't support RAW data-path APIs.\n"); 3508 return TEST_SKIPPED; 3509 } 3510 3511 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3512 return TEST_SKIPPED; 3513 3514 /* Verify the capabilities */ 3515 struct rte_cryptodev_sym_capability_idx cap_idx; 3516 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3517 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3518 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3519 &cap_idx) == NULL) 3520 return TEST_SKIPPED; 3521 3522 /* Create KASUMI session */ 3523 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3524 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3525 RTE_CRYPTO_CIPHER_KASUMI_F8, 3526 tdata->key.data, tdata->key.len, 3527 tdata->cipher_iv.len); 3528 if (retval < 0) 3529 return retval; 3530 3531 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3532 3533 /* Clear mbuf payload */ 3534 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3535 rte_pktmbuf_tailroom(ut_params->ibuf)); 3536 3537 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3538 /* Append data which is padded to a multiple */ 3539 /* of the algorithms block size */ 3540 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3541 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3542 plaintext_pad_len); 3543 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3544 3545 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3546 3547 /* Create KASUMI operation */ 3548 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3549 tdata->cipher_iv.len, 3550 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3551 tdata->validCipherOffsetInBits.len); 3552 if (retval < 0) 3553 return retval; 3554 3555 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3556 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3557 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3558 else 3559 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3560 ut_params->op); 3561 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3562 3563 ut_params->obuf = ut_params->op->sym->m_dst; 3564 if (ut_params->obuf) 3565 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3566 else 3567 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3568 3569 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3570 3571 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3572 (tdata->validCipherOffsetInBits.len >> 3); 3573 /* Validate obuf */ 3574 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3575 ciphertext, 3576 reference_ciphertext, 3577 tdata->validCipherLenInBits.len, 3578 "KASUMI Ciphertext data not as expected"); 3579 return 0; 3580 } 3581 3582 static int 3583 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3584 { 3585 struct crypto_testsuite_params *ts_params = &testsuite_params; 3586 struct crypto_unittest_params *ut_params = &unittest_params; 3587 3588 int retval; 3589 3590 unsigned int plaintext_pad_len; 3591 unsigned int plaintext_len; 3592 3593 uint8_t buffer[10000]; 3594 const uint8_t *ciphertext; 3595 3596 struct rte_cryptodev_info dev_info; 3597 3598 /* Verify the capabilities */ 3599 struct rte_cryptodev_sym_capability_idx cap_idx; 3600 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3601 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3602 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3603 &cap_idx) == NULL) 3604 return TEST_SKIPPED; 3605 3606 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3607 3608 uint64_t feat_flags = dev_info.feature_flags; 3609 3610 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3611 printf("Device doesn't support in-place scatter-gather. " 3612 "Test Skipped.\n"); 3613 return TEST_SKIPPED; 3614 } 3615 3616 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3617 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3618 printf("Device doesn't support RAW data-path APIs.\n"); 3619 return TEST_SKIPPED; 3620 } 3621 3622 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3623 return TEST_SKIPPED; 3624 3625 /* Create KASUMI session */ 3626 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3627 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3628 RTE_CRYPTO_CIPHER_KASUMI_F8, 3629 tdata->key.data, tdata->key.len, 3630 tdata->cipher_iv.len); 3631 if (retval < 0) 3632 return retval; 3633 3634 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3635 3636 3637 /* Append data which is padded to a multiple */ 3638 /* of the algorithms block size */ 3639 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3640 3641 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3642 plaintext_pad_len, 10, 0); 3643 3644 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3645 3646 /* Create KASUMI operation */ 3647 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3648 tdata->cipher_iv.len, 3649 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3650 tdata->validCipherOffsetInBits.len); 3651 if (retval < 0) 3652 return retval; 3653 3654 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3655 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3656 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3657 else 3658 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3659 ut_params->op); 3660 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3661 3662 ut_params->obuf = ut_params->op->sym->m_dst; 3663 3664 if (ut_params->obuf) 3665 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3666 plaintext_len, buffer); 3667 else 3668 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3669 tdata->validCipherOffsetInBits.len >> 3, 3670 plaintext_len, buffer); 3671 3672 /* Validate obuf */ 3673 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3674 3675 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3676 (tdata->validCipherOffsetInBits.len >> 3); 3677 /* Validate obuf */ 3678 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3679 ciphertext, 3680 reference_ciphertext, 3681 tdata->validCipherLenInBits.len, 3682 "KASUMI Ciphertext data not as expected"); 3683 return 0; 3684 } 3685 3686 static int 3687 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3688 { 3689 struct crypto_testsuite_params *ts_params = &testsuite_params; 3690 struct crypto_unittest_params *ut_params = &unittest_params; 3691 3692 int retval; 3693 uint8_t *plaintext, *ciphertext; 3694 unsigned plaintext_pad_len; 3695 unsigned plaintext_len; 3696 3697 /* Verify the capabilities */ 3698 struct rte_cryptodev_sym_capability_idx cap_idx; 3699 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3700 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3701 /* Data-path service does not support OOP */ 3702 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3703 &cap_idx) == NULL) 3704 return TEST_SKIPPED; 3705 3706 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3707 return TEST_SKIPPED; 3708 3709 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3710 return TEST_SKIPPED; 3711 3712 /* Create KASUMI session */ 3713 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3714 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3715 RTE_CRYPTO_CIPHER_KASUMI_F8, 3716 tdata->key.data, tdata->key.len, 3717 tdata->cipher_iv.len); 3718 if (retval < 0) 3719 return retval; 3720 3721 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3722 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3723 3724 /* Clear mbuf payload */ 3725 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3726 rte_pktmbuf_tailroom(ut_params->ibuf)); 3727 3728 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3729 /* Append data which is padded to a multiple */ 3730 /* of the algorithms block size */ 3731 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3732 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3733 plaintext_pad_len); 3734 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3735 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3736 3737 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3738 3739 /* Create KASUMI operation */ 3740 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3741 tdata->cipher_iv.len, 3742 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3743 tdata->validCipherOffsetInBits.len); 3744 if (retval < 0) 3745 return retval; 3746 3747 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3748 ut_params->op); 3749 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3750 3751 ut_params->obuf = ut_params->op->sym->m_dst; 3752 if (ut_params->obuf) 3753 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3754 else 3755 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3756 3757 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3758 3759 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3760 (tdata->validCipherOffsetInBits.len >> 3); 3761 /* Validate obuf */ 3762 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3763 ciphertext, 3764 reference_ciphertext, 3765 tdata->validCipherLenInBits.len, 3766 "KASUMI Ciphertext data not as expected"); 3767 return 0; 3768 } 3769 3770 static int 3771 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3772 { 3773 struct crypto_testsuite_params *ts_params = &testsuite_params; 3774 struct crypto_unittest_params *ut_params = &unittest_params; 3775 3776 int retval; 3777 unsigned int plaintext_pad_len; 3778 unsigned int plaintext_len; 3779 3780 const uint8_t *ciphertext; 3781 uint8_t buffer[2048]; 3782 3783 struct rte_cryptodev_info dev_info; 3784 3785 /* Verify the capabilities */ 3786 struct rte_cryptodev_sym_capability_idx cap_idx; 3787 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3788 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3789 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3790 &cap_idx) == NULL) 3791 return TEST_SKIPPED; 3792 3793 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3794 return TEST_SKIPPED; 3795 3796 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3797 return TEST_SKIPPED; 3798 3799 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3800 3801 uint64_t feat_flags = dev_info.feature_flags; 3802 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3803 printf("Device doesn't support out-of-place scatter-gather " 3804 "in both input and output mbufs. " 3805 "Test Skipped.\n"); 3806 return TEST_SKIPPED; 3807 } 3808 3809 /* Create KASUMI session */ 3810 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3811 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3812 RTE_CRYPTO_CIPHER_KASUMI_F8, 3813 tdata->key.data, tdata->key.len, 3814 tdata->cipher_iv.len); 3815 if (retval < 0) 3816 return retval; 3817 3818 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3819 /* Append data which is padded to a multiple */ 3820 /* of the algorithms block size */ 3821 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3822 3823 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3824 plaintext_pad_len, 10, 0); 3825 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3826 plaintext_pad_len, 3, 0); 3827 3828 /* Append data which is padded to a multiple */ 3829 /* of the algorithms block size */ 3830 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3831 3832 /* Create KASUMI operation */ 3833 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3834 tdata->cipher_iv.len, 3835 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3836 tdata->validCipherOffsetInBits.len); 3837 if (retval < 0) 3838 return retval; 3839 3840 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3841 ut_params->op); 3842 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3843 3844 ut_params->obuf = ut_params->op->sym->m_dst; 3845 if (ut_params->obuf) 3846 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3847 plaintext_pad_len, buffer); 3848 else 3849 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3850 tdata->validCipherOffsetInBits.len >> 3, 3851 plaintext_pad_len, buffer); 3852 3853 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3854 (tdata->validCipherOffsetInBits.len >> 3); 3855 /* Validate obuf */ 3856 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3857 ciphertext, 3858 reference_ciphertext, 3859 tdata->validCipherLenInBits.len, 3860 "KASUMI Ciphertext data not as expected"); 3861 return 0; 3862 } 3863 3864 3865 static int 3866 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3867 { 3868 struct crypto_testsuite_params *ts_params = &testsuite_params; 3869 struct crypto_unittest_params *ut_params = &unittest_params; 3870 3871 int retval; 3872 uint8_t *ciphertext, *plaintext; 3873 unsigned ciphertext_pad_len; 3874 unsigned ciphertext_len; 3875 3876 /* Verify the capabilities */ 3877 struct rte_cryptodev_sym_capability_idx cap_idx; 3878 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3879 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3880 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3881 &cap_idx) == NULL) 3882 return TEST_SKIPPED; 3883 3884 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3885 return TEST_SKIPPED; 3886 3887 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3888 return TEST_SKIPPED; 3889 3890 /* Create KASUMI session */ 3891 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3892 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3893 RTE_CRYPTO_CIPHER_KASUMI_F8, 3894 tdata->key.data, tdata->key.len, 3895 tdata->cipher_iv.len); 3896 if (retval < 0) 3897 return retval; 3898 3899 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3900 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3901 3902 /* Clear mbuf payload */ 3903 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3904 rte_pktmbuf_tailroom(ut_params->ibuf)); 3905 3906 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3907 /* Append data which is padded to a multiple */ 3908 /* of the algorithms block size */ 3909 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3910 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3911 ciphertext_pad_len); 3912 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3913 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3914 3915 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3916 3917 /* Create KASUMI operation */ 3918 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3919 tdata->cipher_iv.len, 3920 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3921 tdata->validCipherOffsetInBits.len); 3922 if (retval < 0) 3923 return retval; 3924 3925 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3926 ut_params->op); 3927 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3928 3929 ut_params->obuf = ut_params->op->sym->m_dst; 3930 if (ut_params->obuf) 3931 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3932 else 3933 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3934 3935 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3936 3937 const uint8_t *reference_plaintext = tdata->plaintext.data + 3938 (tdata->validCipherOffsetInBits.len >> 3); 3939 /* Validate obuf */ 3940 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3941 plaintext, 3942 reference_plaintext, 3943 tdata->validCipherLenInBits.len, 3944 "KASUMI Plaintext data not as expected"); 3945 return 0; 3946 } 3947 3948 static int 3949 test_kasumi_decryption(const struct kasumi_test_data *tdata) 3950 { 3951 struct crypto_testsuite_params *ts_params = &testsuite_params; 3952 struct crypto_unittest_params *ut_params = &unittest_params; 3953 3954 int retval; 3955 uint8_t *ciphertext, *plaintext; 3956 unsigned ciphertext_pad_len; 3957 unsigned ciphertext_len; 3958 struct rte_cryptodev_info dev_info; 3959 3960 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3961 uint64_t feat_flags = dev_info.feature_flags; 3962 3963 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3964 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3965 printf("Device doesn't support RAW data-path APIs.\n"); 3966 return TEST_SKIPPED; 3967 } 3968 3969 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3970 return TEST_SKIPPED; 3971 3972 /* Verify the capabilities */ 3973 struct rte_cryptodev_sym_capability_idx cap_idx; 3974 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3975 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3976 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3977 &cap_idx) == NULL) 3978 return TEST_SKIPPED; 3979 3980 /* Create KASUMI session */ 3981 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3982 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3983 RTE_CRYPTO_CIPHER_KASUMI_F8, 3984 tdata->key.data, tdata->key.len, 3985 tdata->cipher_iv.len); 3986 if (retval < 0) 3987 return retval; 3988 3989 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3990 3991 /* Clear mbuf payload */ 3992 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3993 rte_pktmbuf_tailroom(ut_params->ibuf)); 3994 3995 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3996 /* Append data which is padded to a multiple */ 3997 /* of the algorithms block size */ 3998 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3999 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4000 ciphertext_pad_len); 4001 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4002 4003 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4004 4005 /* Create KASUMI operation */ 4006 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4007 tdata->cipher_iv.len, 4008 tdata->ciphertext.len, 4009 tdata->validCipherOffsetInBits.len); 4010 if (retval < 0) 4011 return retval; 4012 4013 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4014 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4015 ut_params->op, 1, 0, 1, 0); 4016 else 4017 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4018 ut_params->op); 4019 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4020 4021 ut_params->obuf = ut_params->op->sym->m_dst; 4022 if (ut_params->obuf) 4023 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4024 else 4025 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 4026 4027 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4028 4029 const uint8_t *reference_plaintext = tdata->plaintext.data + 4030 (tdata->validCipherOffsetInBits.len >> 3); 4031 /* Validate obuf */ 4032 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4033 plaintext, 4034 reference_plaintext, 4035 tdata->validCipherLenInBits.len, 4036 "KASUMI Plaintext data not as expected"); 4037 return 0; 4038 } 4039 4040 static int 4041 test_snow3g_encryption(const struct snow3g_test_data *tdata) 4042 { 4043 struct crypto_testsuite_params *ts_params = &testsuite_params; 4044 struct crypto_unittest_params *ut_params = &unittest_params; 4045 4046 int retval; 4047 uint8_t *plaintext, *ciphertext; 4048 unsigned plaintext_pad_len; 4049 unsigned plaintext_len; 4050 struct rte_cryptodev_info dev_info; 4051 4052 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4053 uint64_t feat_flags = dev_info.feature_flags; 4054 4055 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4056 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4057 printf("Device doesn't support RAW data-path APIs.\n"); 4058 return TEST_SKIPPED; 4059 } 4060 4061 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4062 return TEST_SKIPPED; 4063 4064 /* Verify the capabilities */ 4065 struct rte_cryptodev_sym_capability_idx cap_idx; 4066 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4067 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4068 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4069 &cap_idx) == NULL) 4070 return TEST_SKIPPED; 4071 4072 /* Create SNOW 3G session */ 4073 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4074 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4075 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4076 tdata->key.data, tdata->key.len, 4077 tdata->cipher_iv.len); 4078 if (retval < 0) 4079 return retval; 4080 4081 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4082 4083 /* Clear mbuf payload */ 4084 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4085 rte_pktmbuf_tailroom(ut_params->ibuf)); 4086 4087 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4088 /* Append data which is padded to a multiple of */ 4089 /* the algorithms block size */ 4090 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4091 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4092 plaintext_pad_len); 4093 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4094 4095 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4096 4097 /* Create SNOW 3G operation */ 4098 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4099 tdata->cipher_iv.len, 4100 tdata->validCipherLenInBits.len, 4101 0); 4102 if (retval < 0) 4103 return retval; 4104 4105 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4106 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4107 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4108 else 4109 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4110 ut_params->op); 4111 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4112 4113 ut_params->obuf = ut_params->op->sym->m_dst; 4114 if (ut_params->obuf) 4115 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4116 else 4117 ciphertext = plaintext; 4118 4119 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4120 4121 /* Validate obuf */ 4122 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4123 ciphertext, 4124 tdata->ciphertext.data, 4125 tdata->validDataLenInBits.len, 4126 "SNOW 3G Ciphertext data not as expected"); 4127 return 0; 4128 } 4129 4130 4131 static int 4132 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 4133 { 4134 struct crypto_testsuite_params *ts_params = &testsuite_params; 4135 struct crypto_unittest_params *ut_params = &unittest_params; 4136 uint8_t *plaintext, *ciphertext; 4137 4138 int retval; 4139 unsigned plaintext_pad_len; 4140 unsigned plaintext_len; 4141 4142 /* Verify the capabilities */ 4143 struct rte_cryptodev_sym_capability_idx cap_idx; 4144 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4145 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4146 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4147 &cap_idx) == NULL) 4148 return TEST_SKIPPED; 4149 4150 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4151 return TEST_SKIPPED; 4152 4153 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4154 return TEST_SKIPPED; 4155 4156 /* Create SNOW 3G session */ 4157 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4158 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4159 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4160 tdata->key.data, tdata->key.len, 4161 tdata->cipher_iv.len); 4162 if (retval < 0) 4163 return retval; 4164 4165 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4166 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4167 4168 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4169 "Failed to allocate input buffer in mempool"); 4170 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4171 "Failed to allocate output buffer in mempool"); 4172 4173 /* Clear mbuf payload */ 4174 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4175 rte_pktmbuf_tailroom(ut_params->ibuf)); 4176 4177 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4178 /* Append data which is padded to a multiple of */ 4179 /* the algorithms block size */ 4180 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4181 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4182 plaintext_pad_len); 4183 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4184 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4185 4186 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4187 4188 /* Create SNOW 3G operation */ 4189 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4190 tdata->cipher_iv.len, 4191 tdata->validCipherLenInBits.len, 4192 0); 4193 if (retval < 0) 4194 return retval; 4195 4196 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4197 ut_params->op); 4198 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4199 4200 ut_params->obuf = ut_params->op->sym->m_dst; 4201 if (ut_params->obuf) 4202 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4203 else 4204 ciphertext = plaintext; 4205 4206 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4207 4208 /* Validate obuf */ 4209 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4210 ciphertext, 4211 tdata->ciphertext.data, 4212 tdata->validDataLenInBits.len, 4213 "SNOW 3G Ciphertext data not as expected"); 4214 return 0; 4215 } 4216 4217 static int 4218 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 4219 { 4220 struct crypto_testsuite_params *ts_params = &testsuite_params; 4221 struct crypto_unittest_params *ut_params = &unittest_params; 4222 4223 int retval; 4224 unsigned int plaintext_pad_len; 4225 unsigned int plaintext_len; 4226 uint8_t buffer[10000]; 4227 const uint8_t *ciphertext; 4228 4229 struct rte_cryptodev_info dev_info; 4230 4231 /* Verify the capabilities */ 4232 struct rte_cryptodev_sym_capability_idx cap_idx; 4233 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4234 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4235 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4236 &cap_idx) == NULL) 4237 return TEST_SKIPPED; 4238 4239 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4240 return TEST_SKIPPED; 4241 4242 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4243 return TEST_SKIPPED; 4244 4245 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4246 4247 uint64_t feat_flags = dev_info.feature_flags; 4248 4249 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4250 printf("Device doesn't support out-of-place scatter-gather " 4251 "in both input and output mbufs. " 4252 "Test Skipped.\n"); 4253 return TEST_SKIPPED; 4254 } 4255 4256 /* Create SNOW 3G session */ 4257 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4258 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4259 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4260 tdata->key.data, tdata->key.len, 4261 tdata->cipher_iv.len); 4262 if (retval < 0) 4263 return retval; 4264 4265 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4266 /* Append data which is padded to a multiple of */ 4267 /* the algorithms block size */ 4268 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4269 4270 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4271 plaintext_pad_len, 10, 0); 4272 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4273 plaintext_pad_len, 3, 0); 4274 4275 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4276 "Failed to allocate input buffer in mempool"); 4277 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4278 "Failed to allocate output buffer in mempool"); 4279 4280 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 4281 4282 /* Create SNOW 3G operation */ 4283 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4284 tdata->cipher_iv.len, 4285 tdata->validCipherLenInBits.len, 4286 0); 4287 if (retval < 0) 4288 return retval; 4289 4290 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4291 ut_params->op); 4292 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4293 4294 ut_params->obuf = ut_params->op->sym->m_dst; 4295 if (ut_params->obuf) 4296 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4297 plaintext_len, buffer); 4298 else 4299 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4300 plaintext_len, buffer); 4301 4302 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4303 4304 /* Validate obuf */ 4305 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4306 ciphertext, 4307 tdata->ciphertext.data, 4308 tdata->validDataLenInBits.len, 4309 "SNOW 3G Ciphertext data not as expected"); 4310 4311 return 0; 4312 } 4313 4314 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 4315 static void 4316 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 4317 { 4318 uint8_t curr_byte, prev_byte; 4319 uint32_t length_in_bytes = ceil_byte_length(length + offset); 4320 uint8_t lower_byte_mask = (1 << offset) - 1; 4321 unsigned i; 4322 4323 prev_byte = buffer[0]; 4324 buffer[0] >>= offset; 4325 4326 for (i = 1; i < length_in_bytes; i++) { 4327 curr_byte = buffer[i]; 4328 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 4329 (curr_byte >> offset); 4330 prev_byte = curr_byte; 4331 } 4332 } 4333 4334 static int 4335 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 4336 { 4337 struct crypto_testsuite_params *ts_params = &testsuite_params; 4338 struct crypto_unittest_params *ut_params = &unittest_params; 4339 uint8_t *plaintext, *ciphertext; 4340 int retval; 4341 uint32_t plaintext_len; 4342 uint32_t plaintext_pad_len; 4343 uint8_t extra_offset = 4; 4344 uint8_t *expected_ciphertext_shifted; 4345 struct rte_cryptodev_info dev_info; 4346 4347 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4348 uint64_t feat_flags = dev_info.feature_flags; 4349 4350 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4351 ((tdata->validDataLenInBits.len % 8) != 0)) { 4352 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4353 return TEST_SKIPPED; 4354 } 4355 4356 /* Verify the capabilities */ 4357 struct rte_cryptodev_sym_capability_idx cap_idx; 4358 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4359 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4360 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4361 &cap_idx) == NULL) 4362 return TEST_SKIPPED; 4363 4364 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4365 return TEST_SKIPPED; 4366 4367 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4368 return TEST_SKIPPED; 4369 4370 /* Create SNOW 3G session */ 4371 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4372 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4373 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4374 tdata->key.data, tdata->key.len, 4375 tdata->cipher_iv.len); 4376 if (retval < 0) 4377 return retval; 4378 4379 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4380 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4381 4382 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4383 "Failed to allocate input buffer in mempool"); 4384 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4385 "Failed to allocate output buffer in mempool"); 4386 4387 /* Clear mbuf payload */ 4388 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4389 rte_pktmbuf_tailroom(ut_params->ibuf)); 4390 4391 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4392 /* 4393 * Append data which is padded to a 4394 * multiple of the algorithms block size 4395 */ 4396 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4397 4398 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4399 plaintext_pad_len); 4400 4401 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4402 4403 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4404 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4405 4406 #ifdef RTE_APP_TEST_DEBUG 4407 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4408 #endif 4409 /* Create SNOW 3G operation */ 4410 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4411 tdata->cipher_iv.len, 4412 tdata->validCipherLenInBits.len, 4413 extra_offset); 4414 if (retval < 0) 4415 return retval; 4416 4417 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4418 ut_params->op); 4419 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4420 4421 ut_params->obuf = ut_params->op->sym->m_dst; 4422 if (ut_params->obuf) 4423 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4424 else 4425 ciphertext = plaintext; 4426 4427 #ifdef RTE_APP_TEST_DEBUG 4428 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4429 #endif 4430 4431 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4432 4433 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4434 "failed to reserve memory for ciphertext shifted\n"); 4435 4436 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4437 ceil_byte_length(tdata->ciphertext.len)); 4438 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4439 extra_offset); 4440 /* Validate obuf */ 4441 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4442 ciphertext, 4443 expected_ciphertext_shifted, 4444 tdata->validDataLenInBits.len, 4445 extra_offset, 4446 "SNOW 3G Ciphertext data not as expected"); 4447 return 0; 4448 } 4449 4450 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4451 { 4452 struct crypto_testsuite_params *ts_params = &testsuite_params; 4453 struct crypto_unittest_params *ut_params = &unittest_params; 4454 4455 int retval; 4456 4457 uint8_t *plaintext, *ciphertext; 4458 unsigned ciphertext_pad_len; 4459 unsigned ciphertext_len; 4460 struct rte_cryptodev_info dev_info; 4461 4462 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4463 uint64_t feat_flags = dev_info.feature_flags; 4464 4465 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4466 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4467 printf("Device doesn't support RAW data-path APIs.\n"); 4468 return TEST_SKIPPED; 4469 } 4470 4471 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4472 return TEST_SKIPPED; 4473 4474 /* Verify the capabilities */ 4475 struct rte_cryptodev_sym_capability_idx cap_idx; 4476 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4477 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4478 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4479 &cap_idx) == NULL) 4480 return TEST_SKIPPED; 4481 4482 /* Create SNOW 3G session */ 4483 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4484 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4485 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4486 tdata->key.data, tdata->key.len, 4487 tdata->cipher_iv.len); 4488 if (retval < 0) 4489 return retval; 4490 4491 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4492 4493 /* Clear mbuf payload */ 4494 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4495 rte_pktmbuf_tailroom(ut_params->ibuf)); 4496 4497 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4498 /* Append data which is padded to a multiple of */ 4499 /* the algorithms block size */ 4500 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4501 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4502 ciphertext_pad_len); 4503 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4504 4505 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4506 4507 /* Create SNOW 3G operation */ 4508 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4509 tdata->cipher_iv.len, 4510 tdata->validCipherLenInBits.len, 4511 tdata->cipher.offset_bits); 4512 if (retval < 0) 4513 return retval; 4514 4515 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4516 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4517 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4518 else 4519 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4520 ut_params->op); 4521 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4522 ut_params->obuf = ut_params->op->sym->m_dst; 4523 if (ut_params->obuf) 4524 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4525 else 4526 plaintext = ciphertext; 4527 4528 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4529 4530 /* Validate obuf */ 4531 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4532 tdata->plaintext.data, 4533 tdata->validDataLenInBits.len, 4534 "SNOW 3G Plaintext data not as expected"); 4535 return 0; 4536 } 4537 4538 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4539 { 4540 struct crypto_testsuite_params *ts_params = &testsuite_params; 4541 struct crypto_unittest_params *ut_params = &unittest_params; 4542 4543 int retval; 4544 4545 uint8_t *plaintext, *ciphertext; 4546 unsigned ciphertext_pad_len; 4547 unsigned ciphertext_len; 4548 4549 /* Verify the capabilities */ 4550 struct rte_cryptodev_sym_capability_idx cap_idx; 4551 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4552 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4553 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4554 &cap_idx) == NULL) 4555 return TEST_SKIPPED; 4556 4557 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4558 return TEST_SKIPPED; 4559 4560 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4561 return TEST_SKIPPED; 4562 4563 /* Create SNOW 3G session */ 4564 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4565 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4566 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4567 tdata->key.data, tdata->key.len, 4568 tdata->cipher_iv.len); 4569 if (retval < 0) 4570 return retval; 4571 4572 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4573 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4574 4575 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4576 "Failed to allocate input buffer"); 4577 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4578 "Failed to allocate output buffer"); 4579 4580 /* Clear mbuf payload */ 4581 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4582 rte_pktmbuf_tailroom(ut_params->ibuf)); 4583 4584 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4585 rte_pktmbuf_tailroom(ut_params->obuf)); 4586 4587 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4588 /* Append data which is padded to a multiple of */ 4589 /* the algorithms block size */ 4590 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4591 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4592 ciphertext_pad_len); 4593 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4594 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4595 4596 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4597 4598 /* Create SNOW 3G operation */ 4599 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4600 tdata->cipher_iv.len, 4601 tdata->validCipherLenInBits.len, 4602 0); 4603 if (retval < 0) 4604 return retval; 4605 4606 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4607 ut_params->op); 4608 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4609 ut_params->obuf = ut_params->op->sym->m_dst; 4610 if (ut_params->obuf) 4611 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4612 else 4613 plaintext = ciphertext; 4614 4615 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4616 4617 /* Validate obuf */ 4618 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4619 tdata->plaintext.data, 4620 tdata->validDataLenInBits.len, 4621 "SNOW 3G Plaintext data not as expected"); 4622 return 0; 4623 } 4624 4625 static int 4626 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4627 { 4628 struct crypto_testsuite_params *ts_params = &testsuite_params; 4629 struct crypto_unittest_params *ut_params = &unittest_params; 4630 4631 int retval; 4632 4633 uint8_t *plaintext, *ciphertext; 4634 unsigned int plaintext_pad_len; 4635 unsigned int plaintext_len; 4636 4637 struct rte_cryptodev_info dev_info; 4638 struct rte_cryptodev_sym_capability_idx cap_idx; 4639 4640 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4641 uint64_t feat_flags = dev_info.feature_flags; 4642 4643 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4644 ((tdata->validAuthLenInBits.len % 8 != 0) || 4645 (tdata->validDataLenInBits.len % 8 != 0))) { 4646 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4647 return TEST_SKIPPED; 4648 } 4649 4650 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4651 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4652 printf("Device doesn't support RAW data-path APIs.\n"); 4653 return TEST_SKIPPED; 4654 } 4655 4656 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4657 return TEST_SKIPPED; 4658 4659 /* Check if device supports ZUC EEA3 */ 4660 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4661 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4662 4663 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4664 &cap_idx) == NULL) 4665 return TEST_SKIPPED; 4666 4667 /* Check if device supports ZUC EIA3 */ 4668 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4669 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4670 4671 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4672 &cap_idx) == NULL) 4673 return TEST_SKIPPED; 4674 4675 /* Create ZUC session */ 4676 retval = create_zuc_cipher_auth_encrypt_generate_session( 4677 ts_params->valid_devs[0], 4678 tdata); 4679 if (retval != 0) 4680 return retval; 4681 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4682 4683 /* clear mbuf payload */ 4684 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4685 rte_pktmbuf_tailroom(ut_params->ibuf)); 4686 4687 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4688 /* Append data which is padded to a multiple of */ 4689 /* the algorithms block size */ 4690 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4691 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4692 plaintext_pad_len); 4693 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4694 4695 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4696 4697 /* Create ZUC operation */ 4698 retval = create_zuc_cipher_hash_generate_operation(tdata); 4699 if (retval < 0) 4700 return retval; 4701 4702 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4703 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4704 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4705 else 4706 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4707 ut_params->op); 4708 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4709 ut_params->obuf = ut_params->op->sym->m_src; 4710 if (ut_params->obuf) 4711 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4712 else 4713 ciphertext = plaintext; 4714 4715 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4716 /* Validate obuf */ 4717 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4718 ciphertext, 4719 tdata->ciphertext.data, 4720 tdata->validDataLenInBits.len, 4721 "ZUC Ciphertext data not as expected"); 4722 4723 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4724 + plaintext_pad_len; 4725 4726 /* Validate obuf */ 4727 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4728 ut_params->digest, 4729 tdata->digest.data, 4730 4, 4731 "ZUC Generated auth tag not as expected"); 4732 return 0; 4733 } 4734 4735 static int 4736 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4737 { 4738 struct crypto_testsuite_params *ts_params = &testsuite_params; 4739 struct crypto_unittest_params *ut_params = &unittest_params; 4740 4741 int retval; 4742 4743 uint8_t *plaintext, *ciphertext; 4744 unsigned plaintext_pad_len; 4745 unsigned plaintext_len; 4746 struct rte_cryptodev_info dev_info; 4747 4748 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4749 uint64_t feat_flags = dev_info.feature_flags; 4750 4751 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4752 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4753 printf("Device doesn't support RAW data-path APIs.\n"); 4754 return TEST_SKIPPED; 4755 } 4756 4757 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4758 return TEST_SKIPPED; 4759 4760 /* Verify the capabilities */ 4761 struct rte_cryptodev_sym_capability_idx cap_idx; 4762 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4763 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4764 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4765 &cap_idx) == NULL) 4766 return TEST_SKIPPED; 4767 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4768 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4769 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4770 &cap_idx) == NULL) 4771 return TEST_SKIPPED; 4772 4773 /* Create SNOW 3G session */ 4774 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4775 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4776 RTE_CRYPTO_AUTH_OP_GENERATE, 4777 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4778 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4779 tdata->key.data, tdata->key.len, 4780 tdata->auth_iv.len, tdata->digest.len, 4781 tdata->cipher_iv.len); 4782 if (retval != 0) 4783 return retval; 4784 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4785 4786 /* clear mbuf payload */ 4787 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4788 rte_pktmbuf_tailroom(ut_params->ibuf)); 4789 4790 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4791 /* Append data which is padded to a multiple of */ 4792 /* the algorithms block size */ 4793 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4794 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4795 plaintext_pad_len); 4796 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4797 4798 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4799 4800 /* Create SNOW 3G operation */ 4801 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4802 tdata->digest.len, tdata->auth_iv.data, 4803 tdata->auth_iv.len, 4804 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4805 tdata->cipher_iv.data, tdata->cipher_iv.len, 4806 tdata->validCipherLenInBits.len, 4807 0, 4808 tdata->validAuthLenInBits.len, 4809 0 4810 ); 4811 if (retval < 0) 4812 return retval; 4813 4814 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4815 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4816 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4817 else 4818 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4819 ut_params->op); 4820 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4821 ut_params->obuf = ut_params->op->sym->m_src; 4822 if (ut_params->obuf) 4823 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4824 else 4825 ciphertext = plaintext; 4826 4827 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4828 /* Validate obuf */ 4829 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4830 ciphertext, 4831 tdata->ciphertext.data, 4832 tdata->validDataLenInBits.len, 4833 "SNOW 3G Ciphertext data not as expected"); 4834 4835 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4836 + plaintext_pad_len; 4837 4838 /* Validate obuf */ 4839 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4840 ut_params->digest, 4841 tdata->digest.data, 4842 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4843 "SNOW 3G Generated auth tag not as expected"); 4844 return 0; 4845 } 4846 4847 static int 4848 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4849 uint8_t op_mode, uint8_t verify) 4850 { 4851 struct crypto_testsuite_params *ts_params = &testsuite_params; 4852 struct crypto_unittest_params *ut_params = &unittest_params; 4853 4854 int retval; 4855 4856 uint8_t *plaintext = NULL, *ciphertext = NULL; 4857 unsigned int plaintext_pad_len; 4858 unsigned int plaintext_len; 4859 unsigned int ciphertext_pad_len; 4860 unsigned int ciphertext_len; 4861 4862 struct rte_cryptodev_info dev_info; 4863 4864 /* Verify the capabilities */ 4865 struct rte_cryptodev_sym_capability_idx cap_idx; 4866 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4867 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4868 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4869 &cap_idx) == NULL) 4870 return TEST_SKIPPED; 4871 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4872 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4873 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4874 &cap_idx) == NULL) 4875 return TEST_SKIPPED; 4876 4877 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4878 return TEST_SKIPPED; 4879 4880 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4881 4882 uint64_t feat_flags = dev_info.feature_flags; 4883 4884 if (op_mode == OUT_OF_PLACE) { 4885 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4886 printf("Device doesn't support digest encrypted.\n"); 4887 return TEST_SKIPPED; 4888 } 4889 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4890 return TEST_SKIPPED; 4891 } 4892 4893 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4894 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4895 printf("Device doesn't support RAW data-path APIs.\n"); 4896 return TEST_SKIPPED; 4897 } 4898 4899 /* Create SNOW 3G session */ 4900 retval = create_wireless_algo_auth_cipher_session( 4901 ts_params->valid_devs[0], 4902 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4903 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4904 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4905 : RTE_CRYPTO_AUTH_OP_GENERATE), 4906 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4907 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4908 tdata->key.data, tdata->key.len, 4909 tdata->auth_iv.len, tdata->digest.len, 4910 tdata->cipher_iv.len); 4911 if (retval != 0) 4912 return retval; 4913 4914 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4915 if (op_mode == OUT_OF_PLACE) 4916 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4917 4918 /* clear mbuf payload */ 4919 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4920 rte_pktmbuf_tailroom(ut_params->ibuf)); 4921 if (op_mode == OUT_OF_PLACE) 4922 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4923 rte_pktmbuf_tailroom(ut_params->obuf)); 4924 4925 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4926 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4927 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4928 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4929 4930 if (verify) { 4931 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4932 ciphertext_pad_len); 4933 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4934 if (op_mode == OUT_OF_PLACE) 4935 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4936 debug_hexdump(stdout, "ciphertext:", ciphertext, 4937 ciphertext_len); 4938 } else { 4939 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4940 plaintext_pad_len); 4941 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4942 if (op_mode == OUT_OF_PLACE) 4943 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4944 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4945 } 4946 4947 /* Create SNOW 3G operation */ 4948 retval = create_wireless_algo_auth_cipher_operation( 4949 tdata->digest.data, tdata->digest.len, 4950 tdata->cipher_iv.data, tdata->cipher_iv.len, 4951 tdata->auth_iv.data, tdata->auth_iv.len, 4952 (tdata->digest.offset_bytes == 0 ? 4953 (verify ? ciphertext_pad_len : plaintext_pad_len) 4954 : tdata->digest.offset_bytes), 4955 tdata->validCipherLenInBits.len, 4956 tdata->cipher.offset_bits, 4957 tdata->validAuthLenInBits.len, 4958 tdata->auth.offset_bits, 4959 op_mode, 0, verify); 4960 4961 if (retval < 0) 4962 return retval; 4963 4964 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4965 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4966 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4967 else 4968 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4969 ut_params->op); 4970 4971 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4972 4973 ut_params->obuf = (op_mode == IN_PLACE ? 4974 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4975 4976 if (verify) { 4977 if (ut_params->obuf) 4978 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 4979 uint8_t *); 4980 else 4981 plaintext = ciphertext + 4982 (tdata->cipher.offset_bits >> 3); 4983 4984 debug_hexdump(stdout, "plaintext:", plaintext, 4985 (tdata->plaintext.len >> 3) - tdata->digest.len); 4986 debug_hexdump(stdout, "plaintext expected:", 4987 tdata->plaintext.data, 4988 (tdata->plaintext.len >> 3) - tdata->digest.len); 4989 } else { 4990 if (ut_params->obuf) 4991 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 4992 uint8_t *); 4993 else 4994 ciphertext = plaintext; 4995 4996 debug_hexdump(stdout, "ciphertext:", ciphertext, 4997 ciphertext_len); 4998 debug_hexdump(stdout, "ciphertext expected:", 4999 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5000 5001 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5002 + (tdata->digest.offset_bytes == 0 ? 5003 plaintext_pad_len : tdata->digest.offset_bytes); 5004 5005 debug_hexdump(stdout, "digest:", ut_params->digest, 5006 tdata->digest.len); 5007 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 5008 tdata->digest.len); 5009 } 5010 5011 /* Validate obuf */ 5012 if (verify) { 5013 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5014 plaintext, 5015 tdata->plaintext.data, 5016 (tdata->plaintext.len - tdata->cipher.offset_bits - 5017 (tdata->digest.len << 3)), 5018 tdata->cipher.offset_bits, 5019 "SNOW 3G Plaintext data not as expected"); 5020 } else { 5021 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5022 ciphertext, 5023 tdata->ciphertext.data, 5024 (tdata->validDataLenInBits.len - 5025 tdata->cipher.offset_bits), 5026 tdata->cipher.offset_bits, 5027 "SNOW 3G Ciphertext data not as expected"); 5028 5029 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5030 ut_params->digest, 5031 tdata->digest.data, 5032 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5033 "SNOW 3G Generated auth tag not as expected"); 5034 } 5035 return 0; 5036 } 5037 5038 static int 5039 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 5040 uint8_t op_mode, uint8_t verify) 5041 { 5042 struct crypto_testsuite_params *ts_params = &testsuite_params; 5043 struct crypto_unittest_params *ut_params = &unittest_params; 5044 5045 int retval; 5046 5047 const uint8_t *plaintext = NULL; 5048 const uint8_t *ciphertext = NULL; 5049 const uint8_t *digest = NULL; 5050 unsigned int plaintext_pad_len; 5051 unsigned int plaintext_len; 5052 unsigned int ciphertext_pad_len; 5053 unsigned int ciphertext_len; 5054 uint8_t buffer[10000]; 5055 uint8_t digest_buffer[10000]; 5056 5057 struct rte_cryptodev_info dev_info; 5058 5059 /* Verify the capabilities */ 5060 struct rte_cryptodev_sym_capability_idx cap_idx; 5061 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5062 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 5063 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5064 &cap_idx) == NULL) 5065 return TEST_SKIPPED; 5066 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5067 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 5068 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5069 &cap_idx) == NULL) 5070 return TEST_SKIPPED; 5071 5072 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5073 return TEST_SKIPPED; 5074 5075 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5076 5077 uint64_t feat_flags = dev_info.feature_flags; 5078 5079 if (op_mode == IN_PLACE) { 5080 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5081 printf("Device doesn't support in-place scatter-gather " 5082 "in both input and output mbufs.\n"); 5083 return TEST_SKIPPED; 5084 } 5085 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5086 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5087 printf("Device doesn't support RAW data-path APIs.\n"); 5088 return TEST_SKIPPED; 5089 } 5090 } else { 5091 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5092 return TEST_SKIPPED; 5093 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5094 printf("Device doesn't support out-of-place scatter-gather " 5095 "in both input and output mbufs.\n"); 5096 return TEST_SKIPPED; 5097 } 5098 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5099 printf("Device doesn't support digest encrypted.\n"); 5100 return TEST_SKIPPED; 5101 } 5102 } 5103 5104 /* Create SNOW 3G session */ 5105 retval = create_wireless_algo_auth_cipher_session( 5106 ts_params->valid_devs[0], 5107 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5108 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5109 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5110 : RTE_CRYPTO_AUTH_OP_GENERATE), 5111 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 5112 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 5113 tdata->key.data, tdata->key.len, 5114 tdata->auth_iv.len, tdata->digest.len, 5115 tdata->cipher_iv.len); 5116 5117 if (retval != 0) 5118 return retval; 5119 5120 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5121 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5122 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5123 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5124 5125 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5126 plaintext_pad_len, 15, 0); 5127 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5128 "Failed to allocate input buffer in mempool"); 5129 5130 if (op_mode == OUT_OF_PLACE) { 5131 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5132 plaintext_pad_len, 15, 0); 5133 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5134 "Failed to allocate output buffer in mempool"); 5135 } 5136 5137 if (verify) { 5138 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5139 tdata->ciphertext.data); 5140 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5141 ciphertext_len, buffer); 5142 debug_hexdump(stdout, "ciphertext:", ciphertext, 5143 ciphertext_len); 5144 } else { 5145 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5146 tdata->plaintext.data); 5147 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5148 plaintext_len, buffer); 5149 debug_hexdump(stdout, "plaintext:", plaintext, 5150 plaintext_len); 5151 } 5152 memset(buffer, 0, sizeof(buffer)); 5153 5154 /* Create SNOW 3G operation */ 5155 retval = create_wireless_algo_auth_cipher_operation( 5156 tdata->digest.data, tdata->digest.len, 5157 tdata->cipher_iv.data, tdata->cipher_iv.len, 5158 tdata->auth_iv.data, tdata->auth_iv.len, 5159 (tdata->digest.offset_bytes == 0 ? 5160 (verify ? ciphertext_pad_len : plaintext_pad_len) 5161 : tdata->digest.offset_bytes), 5162 tdata->validCipherLenInBits.len, 5163 tdata->cipher.offset_bits, 5164 tdata->validAuthLenInBits.len, 5165 tdata->auth.offset_bits, 5166 op_mode, 1, verify); 5167 5168 if (retval < 0) 5169 return retval; 5170 5171 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5172 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5173 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5174 else 5175 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5176 ut_params->op); 5177 5178 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5179 5180 ut_params->obuf = (op_mode == IN_PLACE ? 5181 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5182 5183 if (verify) { 5184 if (ut_params->obuf) 5185 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5186 plaintext_len, buffer); 5187 else 5188 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5189 plaintext_len, buffer); 5190 5191 debug_hexdump(stdout, "plaintext:", plaintext, 5192 (tdata->plaintext.len >> 3) - tdata->digest.len); 5193 debug_hexdump(stdout, "plaintext expected:", 5194 tdata->plaintext.data, 5195 (tdata->plaintext.len >> 3) - tdata->digest.len); 5196 } else { 5197 if (ut_params->obuf) 5198 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5199 ciphertext_len, buffer); 5200 else 5201 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5202 ciphertext_len, buffer); 5203 5204 debug_hexdump(stdout, "ciphertext:", ciphertext, 5205 ciphertext_len); 5206 debug_hexdump(stdout, "ciphertext expected:", 5207 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5208 5209 if (ut_params->obuf) 5210 digest = rte_pktmbuf_read(ut_params->obuf, 5211 (tdata->digest.offset_bytes == 0 ? 5212 plaintext_pad_len : tdata->digest.offset_bytes), 5213 tdata->digest.len, digest_buffer); 5214 else 5215 digest = rte_pktmbuf_read(ut_params->ibuf, 5216 (tdata->digest.offset_bytes == 0 ? 5217 plaintext_pad_len : tdata->digest.offset_bytes), 5218 tdata->digest.len, digest_buffer); 5219 5220 debug_hexdump(stdout, "digest:", digest, 5221 tdata->digest.len); 5222 debug_hexdump(stdout, "digest expected:", 5223 tdata->digest.data, tdata->digest.len); 5224 } 5225 5226 /* Validate obuf */ 5227 if (verify) { 5228 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5229 plaintext, 5230 tdata->plaintext.data, 5231 (tdata->plaintext.len - tdata->cipher.offset_bits - 5232 (tdata->digest.len << 3)), 5233 tdata->cipher.offset_bits, 5234 "SNOW 3G Plaintext data not as expected"); 5235 } else { 5236 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 5237 ciphertext, 5238 tdata->ciphertext.data, 5239 (tdata->validDataLenInBits.len - 5240 tdata->cipher.offset_bits), 5241 tdata->cipher.offset_bits, 5242 "SNOW 3G Ciphertext data not as expected"); 5243 5244 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5245 digest, 5246 tdata->digest.data, 5247 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5248 "SNOW 3G Generated auth tag not as expected"); 5249 } 5250 return 0; 5251 } 5252 5253 static int 5254 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 5255 uint8_t op_mode, uint8_t verify) 5256 { 5257 struct crypto_testsuite_params *ts_params = &testsuite_params; 5258 struct crypto_unittest_params *ut_params = &unittest_params; 5259 5260 int retval; 5261 5262 uint8_t *plaintext = NULL, *ciphertext = NULL; 5263 unsigned int plaintext_pad_len; 5264 unsigned int plaintext_len; 5265 unsigned int ciphertext_pad_len; 5266 unsigned int ciphertext_len; 5267 5268 struct rte_cryptodev_info dev_info; 5269 5270 /* Verify the capabilities */ 5271 struct rte_cryptodev_sym_capability_idx cap_idx; 5272 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5273 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5274 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5275 &cap_idx) == NULL) 5276 return TEST_SKIPPED; 5277 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5278 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5279 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5280 &cap_idx) == NULL) 5281 return TEST_SKIPPED; 5282 5283 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5284 5285 uint64_t feat_flags = dev_info.feature_flags; 5286 5287 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5288 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5289 printf("Device doesn't support RAW data-path APIs.\n"); 5290 return TEST_SKIPPED; 5291 } 5292 5293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5294 return TEST_SKIPPED; 5295 5296 if (op_mode == OUT_OF_PLACE) { 5297 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5298 return TEST_SKIPPED; 5299 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5300 printf("Device doesn't support digest encrypted.\n"); 5301 return TEST_SKIPPED; 5302 } 5303 } 5304 5305 /* Create KASUMI session */ 5306 retval = create_wireless_algo_auth_cipher_session( 5307 ts_params->valid_devs[0], 5308 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5309 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5310 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5311 : RTE_CRYPTO_AUTH_OP_GENERATE), 5312 RTE_CRYPTO_AUTH_KASUMI_F9, 5313 RTE_CRYPTO_CIPHER_KASUMI_F8, 5314 tdata->key.data, tdata->key.len, 5315 0, tdata->digest.len, 5316 tdata->cipher_iv.len); 5317 5318 if (retval != 0) 5319 return retval; 5320 5321 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5322 if (op_mode == OUT_OF_PLACE) 5323 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5324 5325 /* clear mbuf payload */ 5326 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5327 rte_pktmbuf_tailroom(ut_params->ibuf)); 5328 if (op_mode == OUT_OF_PLACE) 5329 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5330 rte_pktmbuf_tailroom(ut_params->obuf)); 5331 5332 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5333 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5334 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5335 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5336 5337 if (verify) { 5338 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5339 ciphertext_pad_len); 5340 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5341 if (op_mode == OUT_OF_PLACE) 5342 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5343 debug_hexdump(stdout, "ciphertext:", ciphertext, 5344 ciphertext_len); 5345 } else { 5346 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5347 plaintext_pad_len); 5348 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5349 if (op_mode == OUT_OF_PLACE) 5350 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5351 debug_hexdump(stdout, "plaintext:", plaintext, 5352 plaintext_len); 5353 } 5354 5355 /* Create KASUMI operation */ 5356 retval = create_wireless_algo_auth_cipher_operation( 5357 tdata->digest.data, tdata->digest.len, 5358 tdata->cipher_iv.data, tdata->cipher_iv.len, 5359 NULL, 0, 5360 (tdata->digest.offset_bytes == 0 ? 5361 (verify ? ciphertext_pad_len : plaintext_pad_len) 5362 : tdata->digest.offset_bytes), 5363 tdata->validCipherLenInBits.len, 5364 tdata->validCipherOffsetInBits.len, 5365 tdata->validAuthLenInBits.len, 5366 0, 5367 op_mode, 0, verify); 5368 5369 if (retval < 0) 5370 return retval; 5371 5372 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5373 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5374 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5375 else 5376 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5377 ut_params->op); 5378 5379 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5380 5381 ut_params->obuf = (op_mode == IN_PLACE ? 5382 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5383 5384 5385 if (verify) { 5386 if (ut_params->obuf) 5387 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5388 uint8_t *); 5389 else 5390 plaintext = ciphertext; 5391 5392 debug_hexdump(stdout, "plaintext:", plaintext, 5393 (tdata->plaintext.len >> 3) - tdata->digest.len); 5394 debug_hexdump(stdout, "plaintext expected:", 5395 tdata->plaintext.data, 5396 (tdata->plaintext.len >> 3) - tdata->digest.len); 5397 } else { 5398 if (ut_params->obuf) 5399 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5400 uint8_t *); 5401 else 5402 ciphertext = plaintext; 5403 5404 debug_hexdump(stdout, "ciphertext:", ciphertext, 5405 ciphertext_len); 5406 debug_hexdump(stdout, "ciphertext expected:", 5407 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5408 5409 ut_params->digest = rte_pktmbuf_mtod( 5410 ut_params->obuf, uint8_t *) + 5411 (tdata->digest.offset_bytes == 0 ? 5412 plaintext_pad_len : tdata->digest.offset_bytes); 5413 5414 debug_hexdump(stdout, "digest:", ut_params->digest, 5415 tdata->digest.len); 5416 debug_hexdump(stdout, "digest expected:", 5417 tdata->digest.data, tdata->digest.len); 5418 } 5419 5420 /* Validate obuf */ 5421 if (verify) { 5422 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5423 plaintext, 5424 tdata->plaintext.data, 5425 tdata->plaintext.len >> 3, 5426 "KASUMI Plaintext data not as expected"); 5427 } else { 5428 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5429 ciphertext, 5430 tdata->ciphertext.data, 5431 tdata->ciphertext.len >> 3, 5432 "KASUMI Ciphertext data not as expected"); 5433 5434 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5435 ut_params->digest, 5436 tdata->digest.data, 5437 DIGEST_BYTE_LENGTH_KASUMI_F9, 5438 "KASUMI Generated auth tag not as expected"); 5439 } 5440 return 0; 5441 } 5442 5443 static int 5444 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5445 uint8_t op_mode, uint8_t verify) 5446 { 5447 struct crypto_testsuite_params *ts_params = &testsuite_params; 5448 struct crypto_unittest_params *ut_params = &unittest_params; 5449 5450 int retval; 5451 5452 const uint8_t *plaintext = NULL; 5453 const uint8_t *ciphertext = NULL; 5454 const uint8_t *digest = NULL; 5455 unsigned int plaintext_pad_len; 5456 unsigned int plaintext_len; 5457 unsigned int ciphertext_pad_len; 5458 unsigned int ciphertext_len; 5459 uint8_t buffer[10000]; 5460 uint8_t digest_buffer[10000]; 5461 5462 struct rte_cryptodev_info dev_info; 5463 5464 /* Verify the capabilities */ 5465 struct rte_cryptodev_sym_capability_idx cap_idx; 5466 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5467 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5468 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5469 &cap_idx) == NULL) 5470 return TEST_SKIPPED; 5471 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5472 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5473 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5474 &cap_idx) == NULL) 5475 return TEST_SKIPPED; 5476 5477 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5478 return TEST_SKIPPED; 5479 5480 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5481 5482 uint64_t feat_flags = dev_info.feature_flags; 5483 5484 if (op_mode == IN_PLACE) { 5485 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5486 printf("Device doesn't support in-place scatter-gather " 5487 "in both input and output mbufs.\n"); 5488 return TEST_SKIPPED; 5489 } 5490 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5491 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5492 printf("Device doesn't support RAW data-path APIs.\n"); 5493 return TEST_SKIPPED; 5494 } 5495 } else { 5496 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5497 return TEST_SKIPPED; 5498 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5499 printf("Device doesn't support out-of-place scatter-gather " 5500 "in both input and output mbufs.\n"); 5501 return TEST_SKIPPED; 5502 } 5503 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5504 printf("Device doesn't support digest encrypted.\n"); 5505 return TEST_SKIPPED; 5506 } 5507 } 5508 5509 /* Create KASUMI session */ 5510 retval = create_wireless_algo_auth_cipher_session( 5511 ts_params->valid_devs[0], 5512 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5513 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5514 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5515 : RTE_CRYPTO_AUTH_OP_GENERATE), 5516 RTE_CRYPTO_AUTH_KASUMI_F9, 5517 RTE_CRYPTO_CIPHER_KASUMI_F8, 5518 tdata->key.data, tdata->key.len, 5519 0, tdata->digest.len, 5520 tdata->cipher_iv.len); 5521 5522 if (retval != 0) 5523 return retval; 5524 5525 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5526 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5527 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5528 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5529 5530 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5531 plaintext_pad_len, 15, 0); 5532 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5533 "Failed to allocate input buffer in mempool"); 5534 5535 if (op_mode == OUT_OF_PLACE) { 5536 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5537 plaintext_pad_len, 15, 0); 5538 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5539 "Failed to allocate output buffer in mempool"); 5540 } 5541 5542 if (verify) { 5543 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5544 tdata->ciphertext.data); 5545 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5546 ciphertext_len, buffer); 5547 debug_hexdump(stdout, "ciphertext:", ciphertext, 5548 ciphertext_len); 5549 } else { 5550 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5551 tdata->plaintext.data); 5552 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5553 plaintext_len, buffer); 5554 debug_hexdump(stdout, "plaintext:", plaintext, 5555 plaintext_len); 5556 } 5557 memset(buffer, 0, sizeof(buffer)); 5558 5559 /* Create KASUMI operation */ 5560 retval = create_wireless_algo_auth_cipher_operation( 5561 tdata->digest.data, tdata->digest.len, 5562 tdata->cipher_iv.data, tdata->cipher_iv.len, 5563 NULL, 0, 5564 (tdata->digest.offset_bytes == 0 ? 5565 (verify ? ciphertext_pad_len : plaintext_pad_len) 5566 : tdata->digest.offset_bytes), 5567 tdata->validCipherLenInBits.len, 5568 tdata->validCipherOffsetInBits.len, 5569 tdata->validAuthLenInBits.len, 5570 0, 5571 op_mode, 1, verify); 5572 5573 if (retval < 0) 5574 return retval; 5575 5576 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5577 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5578 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5579 else 5580 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5581 ut_params->op); 5582 5583 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5584 5585 ut_params->obuf = (op_mode == IN_PLACE ? 5586 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5587 5588 if (verify) { 5589 if (ut_params->obuf) 5590 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5591 plaintext_len, buffer); 5592 else 5593 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5594 plaintext_len, buffer); 5595 5596 debug_hexdump(stdout, "plaintext:", plaintext, 5597 (tdata->plaintext.len >> 3) - tdata->digest.len); 5598 debug_hexdump(stdout, "plaintext expected:", 5599 tdata->plaintext.data, 5600 (tdata->plaintext.len >> 3) - tdata->digest.len); 5601 } else { 5602 if (ut_params->obuf) 5603 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5604 ciphertext_len, buffer); 5605 else 5606 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5607 ciphertext_len, buffer); 5608 5609 debug_hexdump(stdout, "ciphertext:", ciphertext, 5610 ciphertext_len); 5611 debug_hexdump(stdout, "ciphertext expected:", 5612 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5613 5614 if (ut_params->obuf) 5615 digest = rte_pktmbuf_read(ut_params->obuf, 5616 (tdata->digest.offset_bytes == 0 ? 5617 plaintext_pad_len : tdata->digest.offset_bytes), 5618 tdata->digest.len, digest_buffer); 5619 else 5620 digest = rte_pktmbuf_read(ut_params->ibuf, 5621 (tdata->digest.offset_bytes == 0 ? 5622 plaintext_pad_len : tdata->digest.offset_bytes), 5623 tdata->digest.len, digest_buffer); 5624 5625 debug_hexdump(stdout, "digest:", digest, 5626 tdata->digest.len); 5627 debug_hexdump(stdout, "digest expected:", 5628 tdata->digest.data, tdata->digest.len); 5629 } 5630 5631 /* Validate obuf */ 5632 if (verify) { 5633 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5634 plaintext, 5635 tdata->plaintext.data, 5636 tdata->plaintext.len >> 3, 5637 "KASUMI Plaintext data not as expected"); 5638 } else { 5639 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5640 ciphertext, 5641 tdata->ciphertext.data, 5642 tdata->validDataLenInBits.len, 5643 "KASUMI Ciphertext data not as expected"); 5644 5645 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5646 digest, 5647 tdata->digest.data, 5648 DIGEST_BYTE_LENGTH_KASUMI_F9, 5649 "KASUMI Generated auth tag not as expected"); 5650 } 5651 return 0; 5652 } 5653 5654 static int 5655 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5656 { 5657 struct crypto_testsuite_params *ts_params = &testsuite_params; 5658 struct crypto_unittest_params *ut_params = &unittest_params; 5659 5660 int retval; 5661 5662 uint8_t *plaintext, *ciphertext; 5663 unsigned plaintext_pad_len; 5664 unsigned plaintext_len; 5665 struct rte_cryptodev_info dev_info; 5666 5667 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5668 uint64_t feat_flags = dev_info.feature_flags; 5669 5670 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5671 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5672 printf("Device doesn't support RAW data-path APIs.\n"); 5673 return TEST_SKIPPED; 5674 } 5675 5676 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5677 return TEST_SKIPPED; 5678 5679 /* Verify the capabilities */ 5680 struct rte_cryptodev_sym_capability_idx cap_idx; 5681 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5682 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5683 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5684 &cap_idx) == NULL) 5685 return TEST_SKIPPED; 5686 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5687 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5688 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5689 &cap_idx) == NULL) 5690 return TEST_SKIPPED; 5691 5692 /* Create KASUMI session */ 5693 retval = create_wireless_algo_cipher_auth_session( 5694 ts_params->valid_devs[0], 5695 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5696 RTE_CRYPTO_AUTH_OP_GENERATE, 5697 RTE_CRYPTO_AUTH_KASUMI_F9, 5698 RTE_CRYPTO_CIPHER_KASUMI_F8, 5699 tdata->key.data, tdata->key.len, 5700 0, tdata->digest.len, 5701 tdata->cipher_iv.len); 5702 if (retval != 0) 5703 return retval; 5704 5705 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5706 5707 /* clear mbuf payload */ 5708 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5709 rte_pktmbuf_tailroom(ut_params->ibuf)); 5710 5711 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5712 /* Append data which is padded to a multiple of */ 5713 /* the algorithms block size */ 5714 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5715 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5716 plaintext_pad_len); 5717 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5718 5719 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5720 5721 /* Create KASUMI operation */ 5722 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5723 tdata->digest.len, NULL, 0, 5724 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5725 tdata->cipher_iv.data, tdata->cipher_iv.len, 5726 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5727 tdata->validCipherOffsetInBits.len, 5728 tdata->validAuthLenInBits.len, 5729 0 5730 ); 5731 if (retval < 0) 5732 return retval; 5733 5734 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5735 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5736 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5737 else 5738 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5739 ut_params->op); 5740 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5741 5742 if (ut_params->op->sym->m_dst) 5743 ut_params->obuf = ut_params->op->sym->m_dst; 5744 else 5745 ut_params->obuf = ut_params->op->sym->m_src; 5746 5747 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5748 tdata->validCipherOffsetInBits.len >> 3); 5749 5750 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5751 + plaintext_pad_len; 5752 5753 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5754 (tdata->validCipherOffsetInBits.len >> 3); 5755 /* Validate obuf */ 5756 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5757 ciphertext, 5758 reference_ciphertext, 5759 tdata->validCipherLenInBits.len, 5760 "KASUMI Ciphertext data not as expected"); 5761 5762 /* Validate obuf */ 5763 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5764 ut_params->digest, 5765 tdata->digest.data, 5766 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5767 "KASUMI Generated auth tag not as expected"); 5768 return 0; 5769 } 5770 5771 static int 5772 test_zuc_encryption(const struct wireless_test_data *tdata) 5773 { 5774 struct crypto_testsuite_params *ts_params = &testsuite_params; 5775 struct crypto_unittest_params *ut_params = &unittest_params; 5776 5777 int retval; 5778 uint8_t *plaintext, *ciphertext; 5779 unsigned plaintext_pad_len; 5780 unsigned plaintext_len; 5781 struct rte_cryptodev_info dev_info; 5782 5783 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5784 uint64_t feat_flags = dev_info.feature_flags; 5785 5786 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5787 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5788 printf("Device doesn't support RAW data-path APIs.\n"); 5789 return TEST_SKIPPED; 5790 } 5791 5792 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5793 return TEST_SKIPPED; 5794 5795 struct rte_cryptodev_sym_capability_idx cap_idx; 5796 5797 /* Check if device supports ZUC EEA3 */ 5798 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5799 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5800 5801 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5802 &cap_idx) == NULL) 5803 return TEST_SKIPPED; 5804 5805 /* Create ZUC session */ 5806 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5807 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5808 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5809 tdata->key.data, tdata->key.len, 5810 tdata->cipher_iv.len); 5811 if (retval < 0) 5812 return retval; 5813 5814 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5815 5816 /* Clear mbuf payload */ 5817 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5818 rte_pktmbuf_tailroom(ut_params->ibuf)); 5819 5820 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5821 /* Append data which is padded to a multiple */ 5822 /* of the algorithms block size */ 5823 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5824 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5825 plaintext_pad_len); 5826 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5827 5828 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5829 5830 /* Create ZUC operation */ 5831 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5832 tdata->cipher_iv.len, 5833 tdata->plaintext.len, 5834 0); 5835 if (retval < 0) 5836 return retval; 5837 5838 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5839 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5840 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5841 else 5842 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5843 ut_params->op); 5844 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5845 5846 ut_params->obuf = ut_params->op->sym->m_dst; 5847 if (ut_params->obuf) 5848 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 5849 else 5850 ciphertext = plaintext; 5851 5852 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5853 5854 /* Validate obuf */ 5855 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5856 ciphertext, 5857 tdata->ciphertext.data, 5858 tdata->validCipherLenInBits.len, 5859 "ZUC Ciphertext data not as expected"); 5860 return 0; 5861 } 5862 5863 static int 5864 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 5865 { 5866 struct crypto_testsuite_params *ts_params = &testsuite_params; 5867 struct crypto_unittest_params *ut_params = &unittest_params; 5868 5869 int retval; 5870 5871 unsigned int plaintext_pad_len; 5872 unsigned int plaintext_len; 5873 const uint8_t *ciphertext; 5874 uint8_t ciphertext_buffer[2048]; 5875 struct rte_cryptodev_info dev_info; 5876 5877 struct rte_cryptodev_sym_capability_idx cap_idx; 5878 5879 /* Check if device supports ZUC EEA3 */ 5880 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5881 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5882 5883 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5884 &cap_idx) == NULL) 5885 return TEST_SKIPPED; 5886 5887 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5888 return TEST_SKIPPED; 5889 5890 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5891 5892 uint64_t feat_flags = dev_info.feature_flags; 5893 5894 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5895 printf("Device doesn't support in-place scatter-gather. " 5896 "Test Skipped.\n"); 5897 return TEST_SKIPPED; 5898 } 5899 5900 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5901 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5902 printf("Device doesn't support RAW data-path APIs.\n"); 5903 return TEST_SKIPPED; 5904 } 5905 5906 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5907 5908 /* Append data which is padded to a multiple */ 5909 /* of the algorithms block size */ 5910 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5911 5912 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5913 plaintext_pad_len, 10, 0); 5914 5915 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5916 tdata->plaintext.data); 5917 5918 /* Create ZUC session */ 5919 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5920 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5921 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5922 tdata->key.data, tdata->key.len, 5923 tdata->cipher_iv.len); 5924 if (retval < 0) 5925 return retval; 5926 5927 /* Clear mbuf payload */ 5928 5929 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 5930 5931 /* Create ZUC operation */ 5932 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5933 tdata->cipher_iv.len, tdata->plaintext.len, 5934 0); 5935 if (retval < 0) 5936 return retval; 5937 5938 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5939 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5940 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5941 else 5942 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5943 ut_params->op); 5944 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5945 5946 ut_params->obuf = ut_params->op->sym->m_dst; 5947 if (ut_params->obuf) 5948 ciphertext = rte_pktmbuf_read(ut_params->obuf, 5949 0, plaintext_len, ciphertext_buffer); 5950 else 5951 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 5952 0, plaintext_len, ciphertext_buffer); 5953 5954 /* Validate obuf */ 5955 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5956 5957 /* Validate obuf */ 5958 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5959 ciphertext, 5960 tdata->ciphertext.data, 5961 tdata->validCipherLenInBits.len, 5962 "ZUC Ciphertext data not as expected"); 5963 5964 return 0; 5965 } 5966 5967 static int 5968 test_zuc_authentication(const struct wireless_test_data *tdata) 5969 { 5970 struct crypto_testsuite_params *ts_params = &testsuite_params; 5971 struct crypto_unittest_params *ut_params = &unittest_params; 5972 5973 int retval; 5974 unsigned plaintext_pad_len; 5975 unsigned plaintext_len; 5976 uint8_t *plaintext; 5977 5978 struct rte_cryptodev_sym_capability_idx cap_idx; 5979 struct rte_cryptodev_info dev_info; 5980 5981 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5982 uint64_t feat_flags = dev_info.feature_flags; 5983 5984 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 5985 (tdata->validAuthLenInBits.len % 8 != 0)) { 5986 printf("Device doesn't support NON-Byte Aligned Data.\n"); 5987 return TEST_SKIPPED; 5988 } 5989 5990 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5991 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5992 printf("Device doesn't support RAW data-path APIs.\n"); 5993 return TEST_SKIPPED; 5994 } 5995 5996 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5997 return TEST_SKIPPED; 5998 5999 /* Check if device supports ZUC EIA3 */ 6000 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6001 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6002 6003 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6004 &cap_idx) == NULL) 6005 return TEST_SKIPPED; 6006 6007 /* Create ZUC session */ 6008 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 6009 tdata->key.data, tdata->key.len, 6010 tdata->auth_iv.len, tdata->digest.len, 6011 RTE_CRYPTO_AUTH_OP_GENERATE, 6012 RTE_CRYPTO_AUTH_ZUC_EIA3); 6013 if (retval < 0) 6014 return retval; 6015 6016 /* alloc mbuf and set payload */ 6017 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6018 6019 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6020 rte_pktmbuf_tailroom(ut_params->ibuf)); 6021 6022 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6023 /* Append data which is padded to a multiple of */ 6024 /* the algorithms block size */ 6025 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 6026 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6027 plaintext_pad_len); 6028 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6029 6030 /* Create ZUC operation */ 6031 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 6032 tdata->auth_iv.data, tdata->auth_iv.len, 6033 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 6034 tdata->validAuthLenInBits.len, 6035 0); 6036 if (retval < 0) 6037 return retval; 6038 6039 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6040 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6041 ut_params->op, 0, 1, 1, 0); 6042 else 6043 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6044 ut_params->op); 6045 ut_params->obuf = ut_params->op->sym->m_src; 6046 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6047 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6048 + plaintext_pad_len; 6049 6050 /* Validate obuf */ 6051 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6052 ut_params->digest, 6053 tdata->digest.data, 6054 tdata->digest.len, 6055 "ZUC Generated auth tag not as expected"); 6056 6057 return 0; 6058 } 6059 6060 static int 6061 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 6062 uint8_t op_mode, uint8_t verify) 6063 { 6064 struct crypto_testsuite_params *ts_params = &testsuite_params; 6065 struct crypto_unittest_params *ut_params = &unittest_params; 6066 6067 int retval; 6068 6069 uint8_t *plaintext = NULL, *ciphertext = NULL; 6070 unsigned int plaintext_pad_len; 6071 unsigned int plaintext_len; 6072 unsigned int ciphertext_pad_len; 6073 unsigned int ciphertext_len; 6074 6075 struct rte_cryptodev_info dev_info; 6076 struct rte_cryptodev_sym_capability_idx cap_idx; 6077 6078 /* Check if device supports ZUC EIA3 */ 6079 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6080 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6081 6082 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6083 &cap_idx) == NULL) 6084 return TEST_SKIPPED; 6085 6086 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6087 6088 uint64_t feat_flags = dev_info.feature_flags; 6089 6090 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6091 printf("Device doesn't support digest encrypted.\n"); 6092 return TEST_SKIPPED; 6093 } 6094 if (op_mode == IN_PLACE) { 6095 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6096 printf("Device doesn't support in-place scatter-gather " 6097 "in both input and output mbufs.\n"); 6098 return TEST_SKIPPED; 6099 } 6100 6101 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6102 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6103 printf("Device doesn't support RAW data-path APIs.\n"); 6104 return TEST_SKIPPED; 6105 } 6106 } else { 6107 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6108 return TEST_SKIPPED; 6109 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6110 printf("Device doesn't support out-of-place scatter-gather " 6111 "in both input and output mbufs.\n"); 6112 return TEST_SKIPPED; 6113 } 6114 } 6115 6116 /* Create ZUC session */ 6117 retval = create_wireless_algo_auth_cipher_session( 6118 ts_params->valid_devs[0], 6119 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6120 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6121 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6122 : RTE_CRYPTO_AUTH_OP_GENERATE), 6123 RTE_CRYPTO_AUTH_ZUC_EIA3, 6124 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6125 tdata->key.data, tdata->key.len, 6126 tdata->auth_iv.len, tdata->digest.len, 6127 tdata->cipher_iv.len); 6128 6129 if (retval != 0) 6130 return retval; 6131 6132 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6133 if (op_mode == OUT_OF_PLACE) 6134 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6135 6136 /* clear mbuf payload */ 6137 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6138 rte_pktmbuf_tailroom(ut_params->ibuf)); 6139 if (op_mode == OUT_OF_PLACE) 6140 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6141 rte_pktmbuf_tailroom(ut_params->obuf)); 6142 6143 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6144 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6145 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6146 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6147 6148 if (verify) { 6149 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6150 ciphertext_pad_len); 6151 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6152 if (op_mode == OUT_OF_PLACE) 6153 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6154 debug_hexdump(stdout, "ciphertext:", ciphertext, 6155 ciphertext_len); 6156 } else { 6157 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6158 plaintext_pad_len); 6159 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6160 if (op_mode == OUT_OF_PLACE) 6161 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 6162 debug_hexdump(stdout, "plaintext:", plaintext, 6163 plaintext_len); 6164 } 6165 6166 /* Create ZUC operation */ 6167 retval = create_wireless_algo_auth_cipher_operation( 6168 tdata->digest.data, tdata->digest.len, 6169 tdata->cipher_iv.data, tdata->cipher_iv.len, 6170 tdata->auth_iv.data, tdata->auth_iv.len, 6171 (tdata->digest.offset_bytes == 0 ? 6172 (verify ? ciphertext_pad_len : plaintext_pad_len) 6173 : tdata->digest.offset_bytes), 6174 tdata->validCipherLenInBits.len, 6175 tdata->validCipherOffsetInBits.len, 6176 tdata->validAuthLenInBits.len, 6177 0, 6178 op_mode, 0, verify); 6179 6180 if (retval < 0) 6181 return retval; 6182 6183 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6184 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6185 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6186 else 6187 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6188 ut_params->op); 6189 6190 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6191 6192 ut_params->obuf = (op_mode == IN_PLACE ? 6193 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6194 6195 6196 if (verify) { 6197 if (ut_params->obuf) 6198 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6199 uint8_t *); 6200 else 6201 plaintext = ciphertext; 6202 6203 debug_hexdump(stdout, "plaintext:", plaintext, 6204 (tdata->plaintext.len >> 3) - tdata->digest.len); 6205 debug_hexdump(stdout, "plaintext expected:", 6206 tdata->plaintext.data, 6207 (tdata->plaintext.len >> 3) - tdata->digest.len); 6208 } else { 6209 if (ut_params->obuf) 6210 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6211 uint8_t *); 6212 else 6213 ciphertext = plaintext; 6214 6215 debug_hexdump(stdout, "ciphertext:", ciphertext, 6216 ciphertext_len); 6217 debug_hexdump(stdout, "ciphertext expected:", 6218 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6219 6220 ut_params->digest = rte_pktmbuf_mtod( 6221 ut_params->obuf, uint8_t *) + 6222 (tdata->digest.offset_bytes == 0 ? 6223 plaintext_pad_len : tdata->digest.offset_bytes); 6224 6225 debug_hexdump(stdout, "digest:", ut_params->digest, 6226 tdata->digest.len); 6227 debug_hexdump(stdout, "digest expected:", 6228 tdata->digest.data, tdata->digest.len); 6229 } 6230 6231 /* Validate obuf */ 6232 if (verify) { 6233 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6234 plaintext, 6235 tdata->plaintext.data, 6236 tdata->plaintext.len >> 3, 6237 "ZUC Plaintext data not as expected"); 6238 } else { 6239 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6240 ciphertext, 6241 tdata->ciphertext.data, 6242 tdata->ciphertext.len >> 3, 6243 "ZUC Ciphertext data not as expected"); 6244 6245 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6246 ut_params->digest, 6247 tdata->digest.data, 6248 DIGEST_BYTE_LENGTH_KASUMI_F9, 6249 "ZUC Generated auth tag not as expected"); 6250 } 6251 return 0; 6252 } 6253 6254 static int 6255 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 6256 uint8_t op_mode, uint8_t verify) 6257 { 6258 struct crypto_testsuite_params *ts_params = &testsuite_params; 6259 struct crypto_unittest_params *ut_params = &unittest_params; 6260 6261 int retval; 6262 6263 const uint8_t *plaintext = NULL; 6264 const uint8_t *ciphertext = NULL; 6265 const uint8_t *digest = NULL; 6266 unsigned int plaintext_pad_len; 6267 unsigned int plaintext_len; 6268 unsigned int ciphertext_pad_len; 6269 unsigned int ciphertext_len; 6270 uint8_t buffer[10000]; 6271 uint8_t digest_buffer[10000]; 6272 6273 struct rte_cryptodev_info dev_info; 6274 struct rte_cryptodev_sym_capability_idx cap_idx; 6275 6276 /* Check if device supports ZUC EIA3 */ 6277 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6278 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 6279 6280 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 6281 &cap_idx) == NULL) 6282 return TEST_SKIPPED; 6283 6284 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6285 6286 uint64_t feat_flags = dev_info.feature_flags; 6287 6288 if (op_mode == IN_PLACE) { 6289 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6290 printf("Device doesn't support in-place scatter-gather " 6291 "in both input and output mbufs.\n"); 6292 return TEST_SKIPPED; 6293 } 6294 6295 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 6296 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 6297 printf("Device doesn't support RAW data-path APIs.\n"); 6298 return TEST_SKIPPED; 6299 } 6300 } else { 6301 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6302 return TEST_SKIPPED; 6303 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6304 printf("Device doesn't support out-of-place scatter-gather " 6305 "in both input and output mbufs.\n"); 6306 return TEST_SKIPPED; 6307 } 6308 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6309 printf("Device doesn't support digest encrypted.\n"); 6310 return TEST_SKIPPED; 6311 } 6312 } 6313 6314 /* Create ZUC session */ 6315 retval = create_wireless_algo_auth_cipher_session( 6316 ts_params->valid_devs[0], 6317 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 6318 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 6319 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 6320 : RTE_CRYPTO_AUTH_OP_GENERATE), 6321 RTE_CRYPTO_AUTH_ZUC_EIA3, 6322 RTE_CRYPTO_CIPHER_ZUC_EEA3, 6323 tdata->key.data, tdata->key.len, 6324 tdata->auth_iv.len, tdata->digest.len, 6325 tdata->cipher_iv.len); 6326 6327 if (retval != 0) 6328 return retval; 6329 6330 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 6331 plaintext_len = ceil_byte_length(tdata->plaintext.len); 6332 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6333 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6334 6335 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 6336 plaintext_pad_len, 15, 0); 6337 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 6338 "Failed to allocate input buffer in mempool"); 6339 6340 if (op_mode == OUT_OF_PLACE) { 6341 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 6342 plaintext_pad_len, 15, 0); 6343 TEST_ASSERT_NOT_NULL(ut_params->obuf, 6344 "Failed to allocate output buffer in mempool"); 6345 } 6346 6347 if (verify) { 6348 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6349 tdata->ciphertext.data); 6350 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6351 ciphertext_len, buffer); 6352 debug_hexdump(stdout, "ciphertext:", ciphertext, 6353 ciphertext_len); 6354 } else { 6355 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6356 tdata->plaintext.data); 6357 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6358 plaintext_len, buffer); 6359 debug_hexdump(stdout, "plaintext:", plaintext, 6360 plaintext_len); 6361 } 6362 memset(buffer, 0, sizeof(buffer)); 6363 6364 /* Create ZUC operation */ 6365 retval = create_wireless_algo_auth_cipher_operation( 6366 tdata->digest.data, tdata->digest.len, 6367 tdata->cipher_iv.data, tdata->cipher_iv.len, 6368 NULL, 0, 6369 (tdata->digest.offset_bytes == 0 ? 6370 (verify ? ciphertext_pad_len : plaintext_pad_len) 6371 : tdata->digest.offset_bytes), 6372 tdata->validCipherLenInBits.len, 6373 tdata->validCipherOffsetInBits.len, 6374 tdata->validAuthLenInBits.len, 6375 0, 6376 op_mode, 1, verify); 6377 6378 if (retval < 0) 6379 return retval; 6380 6381 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6382 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6383 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6384 else 6385 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6386 ut_params->op); 6387 6388 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6389 6390 ut_params->obuf = (op_mode == IN_PLACE ? 6391 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6392 6393 if (verify) { 6394 if (ut_params->obuf) 6395 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6396 plaintext_len, buffer); 6397 else 6398 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6399 plaintext_len, buffer); 6400 6401 debug_hexdump(stdout, "plaintext:", plaintext, 6402 (tdata->plaintext.len >> 3) - tdata->digest.len); 6403 debug_hexdump(stdout, "plaintext expected:", 6404 tdata->plaintext.data, 6405 (tdata->plaintext.len >> 3) - tdata->digest.len); 6406 } else { 6407 if (ut_params->obuf) 6408 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6409 ciphertext_len, buffer); 6410 else 6411 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6412 ciphertext_len, buffer); 6413 6414 debug_hexdump(stdout, "ciphertext:", ciphertext, 6415 ciphertext_len); 6416 debug_hexdump(stdout, "ciphertext expected:", 6417 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6418 6419 if (ut_params->obuf) 6420 digest = rte_pktmbuf_read(ut_params->obuf, 6421 (tdata->digest.offset_bytes == 0 ? 6422 plaintext_pad_len : tdata->digest.offset_bytes), 6423 tdata->digest.len, digest_buffer); 6424 else 6425 digest = rte_pktmbuf_read(ut_params->ibuf, 6426 (tdata->digest.offset_bytes == 0 ? 6427 plaintext_pad_len : tdata->digest.offset_bytes), 6428 tdata->digest.len, digest_buffer); 6429 6430 debug_hexdump(stdout, "digest:", digest, 6431 tdata->digest.len); 6432 debug_hexdump(stdout, "digest expected:", 6433 tdata->digest.data, tdata->digest.len); 6434 } 6435 6436 /* Validate obuf */ 6437 if (verify) { 6438 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6439 plaintext, 6440 tdata->plaintext.data, 6441 tdata->plaintext.len >> 3, 6442 "ZUC Plaintext data not as expected"); 6443 } else { 6444 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6445 ciphertext, 6446 tdata->ciphertext.data, 6447 tdata->validDataLenInBits.len, 6448 "ZUC Ciphertext data not as expected"); 6449 6450 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6451 digest, 6452 tdata->digest.data, 6453 DIGEST_BYTE_LENGTH_KASUMI_F9, 6454 "ZUC Generated auth tag not as expected"); 6455 } 6456 return 0; 6457 } 6458 6459 static int 6460 test_kasumi_encryption_test_case_1(void) 6461 { 6462 return test_kasumi_encryption(&kasumi_test_case_1); 6463 } 6464 6465 static int 6466 test_kasumi_encryption_test_case_1_sgl(void) 6467 { 6468 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6469 } 6470 6471 static int 6472 test_kasumi_encryption_test_case_1_oop(void) 6473 { 6474 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6475 } 6476 6477 static int 6478 test_kasumi_encryption_test_case_1_oop_sgl(void) 6479 { 6480 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6481 } 6482 6483 static int 6484 test_kasumi_encryption_test_case_2(void) 6485 { 6486 return test_kasumi_encryption(&kasumi_test_case_2); 6487 } 6488 6489 static int 6490 test_kasumi_encryption_test_case_3(void) 6491 { 6492 return test_kasumi_encryption(&kasumi_test_case_3); 6493 } 6494 6495 static int 6496 test_kasumi_encryption_test_case_4(void) 6497 { 6498 return test_kasumi_encryption(&kasumi_test_case_4); 6499 } 6500 6501 static int 6502 test_kasumi_encryption_test_case_5(void) 6503 { 6504 return test_kasumi_encryption(&kasumi_test_case_5); 6505 } 6506 6507 static int 6508 test_kasumi_decryption_test_case_1(void) 6509 { 6510 return test_kasumi_decryption(&kasumi_test_case_1); 6511 } 6512 6513 static int 6514 test_kasumi_decryption_test_case_1_oop(void) 6515 { 6516 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6517 } 6518 6519 static int 6520 test_kasumi_decryption_test_case_2(void) 6521 { 6522 return test_kasumi_decryption(&kasumi_test_case_2); 6523 } 6524 6525 static int 6526 test_kasumi_decryption_test_case_3(void) 6527 { 6528 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6529 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6530 return TEST_SKIPPED; 6531 return test_kasumi_decryption(&kasumi_test_case_3); 6532 } 6533 6534 static int 6535 test_kasumi_decryption_test_case_4(void) 6536 { 6537 return test_kasumi_decryption(&kasumi_test_case_4); 6538 } 6539 6540 static int 6541 test_kasumi_decryption_test_case_5(void) 6542 { 6543 return test_kasumi_decryption(&kasumi_test_case_5); 6544 } 6545 static int 6546 test_snow3g_encryption_test_case_1(void) 6547 { 6548 return test_snow3g_encryption(&snow3g_test_case_1); 6549 } 6550 6551 static int 6552 test_snow3g_encryption_test_case_1_oop(void) 6553 { 6554 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6555 } 6556 6557 static int 6558 test_snow3g_encryption_test_case_1_oop_sgl(void) 6559 { 6560 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 6561 } 6562 6563 6564 static int 6565 test_snow3g_encryption_test_case_1_offset_oop(void) 6566 { 6567 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6568 } 6569 6570 static int 6571 test_snow3g_encryption_test_case_2(void) 6572 { 6573 return test_snow3g_encryption(&snow3g_test_case_2); 6574 } 6575 6576 static int 6577 test_snow3g_encryption_test_case_3(void) 6578 { 6579 return test_snow3g_encryption(&snow3g_test_case_3); 6580 } 6581 6582 static int 6583 test_snow3g_encryption_test_case_4(void) 6584 { 6585 return test_snow3g_encryption(&snow3g_test_case_4); 6586 } 6587 6588 static int 6589 test_snow3g_encryption_test_case_5(void) 6590 { 6591 return test_snow3g_encryption(&snow3g_test_case_5); 6592 } 6593 6594 static int 6595 test_snow3g_decryption_test_case_1(void) 6596 { 6597 return test_snow3g_decryption(&snow3g_test_case_1); 6598 } 6599 6600 static int 6601 test_snow3g_decryption_test_case_1_oop(void) 6602 { 6603 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6604 } 6605 6606 static int 6607 test_snow3g_decryption_test_case_2(void) 6608 { 6609 return test_snow3g_decryption(&snow3g_test_case_2); 6610 } 6611 6612 static int 6613 test_snow3g_decryption_test_case_3(void) 6614 { 6615 return test_snow3g_decryption(&snow3g_test_case_3); 6616 } 6617 6618 static int 6619 test_snow3g_decryption_test_case_4(void) 6620 { 6621 return test_snow3g_decryption(&snow3g_test_case_4); 6622 } 6623 6624 static int 6625 test_snow3g_decryption_test_case_5(void) 6626 { 6627 return test_snow3g_decryption(&snow3g_test_case_5); 6628 } 6629 6630 /* 6631 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6632 * Pattern digest from snow3g_test_data must be allocated as 6633 * 4 last bytes in plaintext. 6634 */ 6635 static void 6636 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6637 struct snow3g_hash_test_data *output) 6638 { 6639 if ((pattern != NULL) && (output != NULL)) { 6640 output->key.len = pattern->key.len; 6641 6642 memcpy(output->key.data, 6643 pattern->key.data, pattern->key.len); 6644 6645 output->auth_iv.len = pattern->auth_iv.len; 6646 6647 memcpy(output->auth_iv.data, 6648 pattern->auth_iv.data, pattern->auth_iv.len); 6649 6650 output->plaintext.len = pattern->plaintext.len; 6651 6652 memcpy(output->plaintext.data, 6653 pattern->plaintext.data, pattern->plaintext.len >> 3); 6654 6655 output->digest.len = pattern->digest.len; 6656 6657 memcpy(output->digest.data, 6658 &pattern->plaintext.data[pattern->digest.offset_bytes], 6659 pattern->digest.len); 6660 6661 output->validAuthLenInBits.len = 6662 pattern->validAuthLenInBits.len; 6663 } 6664 } 6665 6666 /* 6667 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6668 */ 6669 static int 6670 test_snow3g_decryption_with_digest_test_case_1(void) 6671 { 6672 struct snow3g_hash_test_data snow3g_hash_data; 6673 struct rte_cryptodev_info dev_info; 6674 struct crypto_testsuite_params *ts_params = &testsuite_params; 6675 6676 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6677 uint64_t feat_flags = dev_info.feature_flags; 6678 6679 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6680 printf("Device doesn't support encrypted digest operations.\n"); 6681 return TEST_SKIPPED; 6682 } 6683 6684 /* 6685 * Function prepare data for hash veryfication test case. 6686 * Digest is allocated in 4 last bytes in plaintext, pattern. 6687 */ 6688 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6689 6690 return test_snow3g_decryption(&snow3g_test_case_7) & 6691 test_snow3g_authentication_verify(&snow3g_hash_data); 6692 } 6693 6694 static int 6695 test_snow3g_cipher_auth_test_case_1(void) 6696 { 6697 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6698 } 6699 6700 static int 6701 test_snow3g_auth_cipher_test_case_1(void) 6702 { 6703 return test_snow3g_auth_cipher( 6704 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6705 } 6706 6707 static int 6708 test_snow3g_auth_cipher_test_case_2(void) 6709 { 6710 return test_snow3g_auth_cipher( 6711 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6712 } 6713 6714 static int 6715 test_snow3g_auth_cipher_test_case_2_oop(void) 6716 { 6717 return test_snow3g_auth_cipher( 6718 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6719 } 6720 6721 static int 6722 test_snow3g_auth_cipher_part_digest_enc(void) 6723 { 6724 return test_snow3g_auth_cipher( 6725 &snow3g_auth_cipher_partial_digest_encryption, 6726 IN_PLACE, 0); 6727 } 6728 6729 static int 6730 test_snow3g_auth_cipher_part_digest_enc_oop(void) 6731 { 6732 return test_snow3g_auth_cipher( 6733 &snow3g_auth_cipher_partial_digest_encryption, 6734 OUT_OF_PLACE, 0); 6735 } 6736 6737 static int 6738 test_snow3g_auth_cipher_test_case_3_sgl(void) 6739 { 6740 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6741 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6742 return TEST_SKIPPED; 6743 return test_snow3g_auth_cipher_sgl( 6744 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 6745 } 6746 6747 static int 6748 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 6749 { 6750 return test_snow3g_auth_cipher_sgl( 6751 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 6752 } 6753 6754 static int 6755 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 6756 { 6757 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6758 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6759 return TEST_SKIPPED; 6760 return test_snow3g_auth_cipher_sgl( 6761 &snow3g_auth_cipher_partial_digest_encryption, 6762 IN_PLACE, 0); 6763 } 6764 6765 static int 6766 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 6767 { 6768 return test_snow3g_auth_cipher_sgl( 6769 &snow3g_auth_cipher_partial_digest_encryption, 6770 OUT_OF_PLACE, 0); 6771 } 6772 6773 static int 6774 test_snow3g_auth_cipher_verify_test_case_1(void) 6775 { 6776 return test_snow3g_auth_cipher( 6777 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 6778 } 6779 6780 static int 6781 test_snow3g_auth_cipher_verify_test_case_2(void) 6782 { 6783 return test_snow3g_auth_cipher( 6784 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 6785 } 6786 6787 static int 6788 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 6789 { 6790 return test_snow3g_auth_cipher( 6791 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6792 } 6793 6794 static int 6795 test_snow3g_auth_cipher_verify_part_digest_enc(void) 6796 { 6797 return test_snow3g_auth_cipher( 6798 &snow3g_auth_cipher_partial_digest_encryption, 6799 IN_PLACE, 1); 6800 } 6801 6802 static int 6803 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 6804 { 6805 return test_snow3g_auth_cipher( 6806 &snow3g_auth_cipher_partial_digest_encryption, 6807 OUT_OF_PLACE, 1); 6808 } 6809 6810 static int 6811 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 6812 { 6813 return test_snow3g_auth_cipher_sgl( 6814 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 6815 } 6816 6817 static int 6818 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 6819 { 6820 return test_snow3g_auth_cipher_sgl( 6821 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 6822 } 6823 6824 static int 6825 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 6826 { 6827 return test_snow3g_auth_cipher_sgl( 6828 &snow3g_auth_cipher_partial_digest_encryption, 6829 IN_PLACE, 1); 6830 } 6831 6832 static int 6833 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 6834 { 6835 return test_snow3g_auth_cipher_sgl( 6836 &snow3g_auth_cipher_partial_digest_encryption, 6837 OUT_OF_PLACE, 1); 6838 } 6839 6840 static int 6841 test_snow3g_auth_cipher_with_digest_test_case_1(void) 6842 { 6843 return test_snow3g_auth_cipher( 6844 &snow3g_test_case_7, IN_PLACE, 0); 6845 } 6846 6847 static int 6848 test_kasumi_auth_cipher_test_case_1(void) 6849 { 6850 return test_kasumi_auth_cipher( 6851 &kasumi_test_case_3, IN_PLACE, 0); 6852 } 6853 6854 static int 6855 test_kasumi_auth_cipher_test_case_2(void) 6856 { 6857 return test_kasumi_auth_cipher( 6858 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6859 } 6860 6861 static int 6862 test_kasumi_auth_cipher_test_case_2_oop(void) 6863 { 6864 return test_kasumi_auth_cipher( 6865 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6866 } 6867 6868 static int 6869 test_kasumi_auth_cipher_test_case_2_sgl(void) 6870 { 6871 return test_kasumi_auth_cipher_sgl( 6872 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6873 } 6874 6875 static int 6876 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 6877 { 6878 return test_kasumi_auth_cipher_sgl( 6879 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6880 } 6881 6882 static int 6883 test_kasumi_auth_cipher_verify_test_case_1(void) 6884 { 6885 return test_kasumi_auth_cipher( 6886 &kasumi_test_case_3, IN_PLACE, 1); 6887 } 6888 6889 static int 6890 test_kasumi_auth_cipher_verify_test_case_2(void) 6891 { 6892 return test_kasumi_auth_cipher( 6893 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6894 } 6895 6896 static int 6897 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 6898 { 6899 return test_kasumi_auth_cipher( 6900 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6901 } 6902 6903 static int 6904 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 6905 { 6906 return test_kasumi_auth_cipher_sgl( 6907 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6908 } 6909 6910 static int 6911 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 6912 { 6913 return test_kasumi_auth_cipher_sgl( 6914 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6915 } 6916 6917 static int 6918 test_kasumi_cipher_auth_test_case_1(void) 6919 { 6920 return test_kasumi_cipher_auth(&kasumi_test_case_6); 6921 } 6922 6923 static int 6924 test_zuc_encryption_test_case_1(void) 6925 { 6926 return test_zuc_encryption(&zuc_test_case_cipher_193b); 6927 } 6928 6929 static int 6930 test_zuc_encryption_test_case_2(void) 6931 { 6932 return test_zuc_encryption(&zuc_test_case_cipher_800b); 6933 } 6934 6935 static int 6936 test_zuc_encryption_test_case_3(void) 6937 { 6938 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 6939 } 6940 6941 static int 6942 test_zuc_encryption_test_case_4(void) 6943 { 6944 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 6945 } 6946 6947 static int 6948 test_zuc_encryption_test_case_5(void) 6949 { 6950 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 6951 } 6952 6953 static int 6954 test_zuc_encryption_test_case_6_sgl(void) 6955 { 6956 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 6957 } 6958 6959 static int 6960 test_zuc_hash_generate_test_case_1(void) 6961 { 6962 return test_zuc_authentication(&zuc_test_case_auth_1b); 6963 } 6964 6965 static int 6966 test_zuc_hash_generate_test_case_2(void) 6967 { 6968 return test_zuc_authentication(&zuc_test_case_auth_90b); 6969 } 6970 6971 static int 6972 test_zuc_hash_generate_test_case_3(void) 6973 { 6974 return test_zuc_authentication(&zuc_test_case_auth_577b); 6975 } 6976 6977 static int 6978 test_zuc_hash_generate_test_case_4(void) 6979 { 6980 return test_zuc_authentication(&zuc_test_case_auth_2079b); 6981 } 6982 6983 static int 6984 test_zuc_hash_generate_test_case_5(void) 6985 { 6986 return test_zuc_authentication(&zuc_test_auth_5670b); 6987 } 6988 6989 static int 6990 test_zuc_hash_generate_test_case_6(void) 6991 { 6992 return test_zuc_authentication(&zuc_test_case_auth_128b); 6993 } 6994 6995 static int 6996 test_zuc_hash_generate_test_case_7(void) 6997 { 6998 return test_zuc_authentication(&zuc_test_case_auth_2080b); 6999 } 7000 7001 static int 7002 test_zuc_hash_generate_test_case_8(void) 7003 { 7004 return test_zuc_authentication(&zuc_test_case_auth_584b); 7005 } 7006 7007 static int 7008 test_zuc_cipher_auth_test_case_1(void) 7009 { 7010 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 7011 } 7012 7013 static int 7014 test_zuc_cipher_auth_test_case_2(void) 7015 { 7016 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 7017 } 7018 7019 static int 7020 test_zuc_auth_cipher_test_case_1(void) 7021 { 7022 return test_zuc_auth_cipher( 7023 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7024 } 7025 7026 static int 7027 test_zuc_auth_cipher_test_case_1_oop(void) 7028 { 7029 return test_zuc_auth_cipher( 7030 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7031 } 7032 7033 static int 7034 test_zuc_auth_cipher_test_case_1_sgl(void) 7035 { 7036 return test_zuc_auth_cipher_sgl( 7037 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 7038 } 7039 7040 static int 7041 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 7042 { 7043 return test_zuc_auth_cipher_sgl( 7044 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 7045 } 7046 7047 static int 7048 test_zuc_auth_cipher_verify_test_case_1(void) 7049 { 7050 return test_zuc_auth_cipher( 7051 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7052 } 7053 7054 static int 7055 test_zuc_auth_cipher_verify_test_case_1_oop(void) 7056 { 7057 return test_zuc_auth_cipher( 7058 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7059 } 7060 7061 static int 7062 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 7063 { 7064 return test_zuc_auth_cipher_sgl( 7065 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 7066 } 7067 7068 static int 7069 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 7070 { 7071 return test_zuc_auth_cipher_sgl( 7072 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 7073 } 7074 7075 static int 7076 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 7077 { 7078 uint8_t dev_id = testsuite_params.valid_devs[0]; 7079 7080 struct rte_cryptodev_sym_capability_idx cap_idx; 7081 7082 /* Check if device supports particular cipher algorithm */ 7083 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7084 cap_idx.algo.cipher = tdata->cipher_algo; 7085 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7086 return TEST_SKIPPED; 7087 7088 /* Check if device supports particular hash algorithm */ 7089 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7090 cap_idx.algo.auth = tdata->auth_algo; 7091 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 7092 return TEST_SKIPPED; 7093 7094 return 0; 7095 } 7096 7097 static int 7098 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 7099 uint8_t op_mode, uint8_t verify) 7100 { 7101 struct crypto_testsuite_params *ts_params = &testsuite_params; 7102 struct crypto_unittest_params *ut_params = &unittest_params; 7103 7104 int retval; 7105 7106 uint8_t *plaintext = NULL, *ciphertext = NULL; 7107 unsigned int plaintext_pad_len; 7108 unsigned int plaintext_len; 7109 unsigned int ciphertext_pad_len; 7110 unsigned int ciphertext_len; 7111 7112 struct rte_cryptodev_info dev_info; 7113 struct rte_crypto_op *op; 7114 7115 /* Check if device supports particular algorithms separately */ 7116 if (test_mixed_check_if_unsupported(tdata)) 7117 return TEST_SKIPPED; 7118 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7119 return TEST_SKIPPED; 7120 7121 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7122 7123 uint64_t feat_flags = dev_info.feature_flags; 7124 7125 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7126 printf("Device doesn't support digest encrypted.\n"); 7127 return TEST_SKIPPED; 7128 } 7129 7130 /* Create the session */ 7131 if (verify) 7132 retval = create_wireless_algo_cipher_auth_session( 7133 ts_params->valid_devs[0], 7134 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7135 RTE_CRYPTO_AUTH_OP_VERIFY, 7136 tdata->auth_algo, 7137 tdata->cipher_algo, 7138 tdata->auth_key.data, tdata->auth_key.len, 7139 tdata->auth_iv.len, tdata->digest_enc.len, 7140 tdata->cipher_iv.len); 7141 else 7142 retval = create_wireless_algo_auth_cipher_session( 7143 ts_params->valid_devs[0], 7144 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7145 RTE_CRYPTO_AUTH_OP_GENERATE, 7146 tdata->auth_algo, 7147 tdata->cipher_algo, 7148 tdata->auth_key.data, tdata->auth_key.len, 7149 tdata->auth_iv.len, tdata->digest_enc.len, 7150 tdata->cipher_iv.len); 7151 if (retval != 0) 7152 return retval; 7153 7154 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7155 if (op_mode == OUT_OF_PLACE) 7156 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7157 7158 /* clear mbuf payload */ 7159 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7160 rte_pktmbuf_tailroom(ut_params->ibuf)); 7161 if (op_mode == OUT_OF_PLACE) { 7162 7163 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 7164 rte_pktmbuf_tailroom(ut_params->obuf)); 7165 } 7166 7167 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7168 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7169 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7170 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7171 7172 if (verify) { 7173 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7174 ciphertext_pad_len); 7175 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 7176 if (op_mode == OUT_OF_PLACE) 7177 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 7178 debug_hexdump(stdout, "ciphertext:", ciphertext, 7179 ciphertext_len); 7180 } else { 7181 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7182 plaintext_pad_len); 7183 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 7184 if (op_mode == OUT_OF_PLACE) 7185 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 7186 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 7187 } 7188 7189 /* Create the operation */ 7190 retval = create_wireless_algo_auth_cipher_operation( 7191 tdata->digest_enc.data, tdata->digest_enc.len, 7192 tdata->cipher_iv.data, tdata->cipher_iv.len, 7193 tdata->auth_iv.data, tdata->auth_iv.len, 7194 (tdata->digest_enc.offset == 0 ? 7195 plaintext_pad_len 7196 : tdata->digest_enc.offset), 7197 tdata->validCipherLen.len_bits, 7198 tdata->cipher.offset_bits, 7199 tdata->validAuthLen.len_bits, 7200 tdata->auth.offset_bits, 7201 op_mode, 0, verify); 7202 7203 if (retval < 0) 7204 return retval; 7205 7206 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7207 7208 /* Check if the op failed because the device doesn't */ 7209 /* support this particular combination of algorithms */ 7210 if (op == NULL && ut_params->op->status == 7211 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7212 printf("Device doesn't support this mixed combination. " 7213 "Test Skipped.\n"); 7214 return TEST_SKIPPED; 7215 } 7216 ut_params->op = op; 7217 7218 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7219 7220 ut_params->obuf = (op_mode == IN_PLACE ? 7221 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7222 7223 if (verify) { 7224 if (ut_params->obuf) 7225 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 7226 uint8_t *); 7227 else 7228 plaintext = ciphertext + 7229 (tdata->cipher.offset_bits >> 3); 7230 7231 debug_hexdump(stdout, "plaintext:", plaintext, 7232 tdata->plaintext.len_bits >> 3); 7233 debug_hexdump(stdout, "plaintext expected:", 7234 tdata->plaintext.data, 7235 tdata->plaintext.len_bits >> 3); 7236 } else { 7237 if (ut_params->obuf) 7238 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 7239 uint8_t *); 7240 else 7241 ciphertext = plaintext; 7242 7243 debug_hexdump(stdout, "ciphertext:", ciphertext, 7244 ciphertext_len); 7245 debug_hexdump(stdout, "ciphertext expected:", 7246 tdata->ciphertext.data, 7247 tdata->ciphertext.len_bits >> 3); 7248 7249 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 7250 + (tdata->digest_enc.offset == 0 ? 7251 plaintext_pad_len : tdata->digest_enc.offset); 7252 7253 debug_hexdump(stdout, "digest:", ut_params->digest, 7254 tdata->digest_enc.len); 7255 debug_hexdump(stdout, "digest expected:", 7256 tdata->digest_enc.data, 7257 tdata->digest_enc.len); 7258 } 7259 7260 /* Validate obuf */ 7261 if (verify) { 7262 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7263 plaintext, 7264 tdata->plaintext.data, 7265 tdata->plaintext.len_bits >> 3, 7266 "Plaintext data not as expected"); 7267 } else { 7268 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7269 ciphertext, 7270 tdata->ciphertext.data, 7271 tdata->validDataLen.len_bits, 7272 "Ciphertext data not as expected"); 7273 7274 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7275 ut_params->digest, 7276 tdata->digest_enc.data, 7277 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 7278 "Generated auth tag not as expected"); 7279 } 7280 7281 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7282 "crypto op processing failed"); 7283 7284 return 0; 7285 } 7286 7287 static int 7288 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 7289 uint8_t op_mode, uint8_t verify) 7290 { 7291 struct crypto_testsuite_params *ts_params = &testsuite_params; 7292 struct crypto_unittest_params *ut_params = &unittest_params; 7293 7294 int retval; 7295 7296 const uint8_t *plaintext = NULL; 7297 const uint8_t *ciphertext = NULL; 7298 const uint8_t *digest = NULL; 7299 unsigned int plaintext_pad_len; 7300 unsigned int plaintext_len; 7301 unsigned int ciphertext_pad_len; 7302 unsigned int ciphertext_len; 7303 uint8_t buffer[10000]; 7304 uint8_t digest_buffer[10000]; 7305 7306 struct rte_cryptodev_info dev_info; 7307 struct rte_crypto_op *op; 7308 7309 /* Check if device supports particular algorithms */ 7310 if (test_mixed_check_if_unsupported(tdata)) 7311 return TEST_SKIPPED; 7312 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7313 return TEST_SKIPPED; 7314 7315 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7316 7317 uint64_t feat_flags = dev_info.feature_flags; 7318 7319 if (op_mode == IN_PLACE) { 7320 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 7321 printf("Device doesn't support in-place scatter-gather " 7322 "in both input and output mbufs.\n"); 7323 return TEST_SKIPPED; 7324 } 7325 } else { 7326 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 7327 printf("Device doesn't support out-of-place scatter-gather " 7328 "in both input and output mbufs.\n"); 7329 return TEST_SKIPPED; 7330 } 7331 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 7332 printf("Device doesn't support digest encrypted.\n"); 7333 return TEST_SKIPPED; 7334 } 7335 } 7336 7337 /* Create the session */ 7338 if (verify) 7339 retval = create_wireless_algo_cipher_auth_session( 7340 ts_params->valid_devs[0], 7341 RTE_CRYPTO_CIPHER_OP_DECRYPT, 7342 RTE_CRYPTO_AUTH_OP_VERIFY, 7343 tdata->auth_algo, 7344 tdata->cipher_algo, 7345 tdata->auth_key.data, tdata->auth_key.len, 7346 tdata->auth_iv.len, tdata->digest_enc.len, 7347 tdata->cipher_iv.len); 7348 else 7349 retval = create_wireless_algo_auth_cipher_session( 7350 ts_params->valid_devs[0], 7351 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 7352 RTE_CRYPTO_AUTH_OP_GENERATE, 7353 tdata->auth_algo, 7354 tdata->cipher_algo, 7355 tdata->auth_key.data, tdata->auth_key.len, 7356 tdata->auth_iv.len, tdata->digest_enc.len, 7357 tdata->cipher_iv.len); 7358 if (retval != 0) 7359 return retval; 7360 7361 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7362 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7363 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7364 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7365 7366 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7367 ciphertext_pad_len, 15, 0); 7368 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7369 "Failed to allocate input buffer in mempool"); 7370 7371 if (op_mode == OUT_OF_PLACE) { 7372 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7373 plaintext_pad_len, 15, 0); 7374 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7375 "Failed to allocate output buffer in mempool"); 7376 } 7377 7378 if (verify) { 7379 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7380 tdata->ciphertext.data); 7381 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7382 ciphertext_len, buffer); 7383 debug_hexdump(stdout, "ciphertext:", ciphertext, 7384 ciphertext_len); 7385 } else { 7386 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7387 tdata->plaintext.data); 7388 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7389 plaintext_len, buffer); 7390 debug_hexdump(stdout, "plaintext:", plaintext, 7391 plaintext_len); 7392 } 7393 memset(buffer, 0, sizeof(buffer)); 7394 7395 /* Create the operation */ 7396 retval = create_wireless_algo_auth_cipher_operation( 7397 tdata->digest_enc.data, tdata->digest_enc.len, 7398 tdata->cipher_iv.data, tdata->cipher_iv.len, 7399 tdata->auth_iv.data, tdata->auth_iv.len, 7400 (tdata->digest_enc.offset == 0 ? 7401 plaintext_pad_len 7402 : tdata->digest_enc.offset), 7403 tdata->validCipherLen.len_bits, 7404 tdata->cipher.offset_bits, 7405 tdata->validAuthLen.len_bits, 7406 tdata->auth.offset_bits, 7407 op_mode, 1, verify); 7408 7409 if (retval < 0) 7410 return retval; 7411 7412 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7413 7414 /* Check if the op failed because the device doesn't */ 7415 /* support this particular combination of algorithms */ 7416 if (op == NULL && ut_params->op->status == 7417 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7418 printf("Device doesn't support this mixed combination. " 7419 "Test Skipped.\n"); 7420 return TEST_SKIPPED; 7421 } 7422 ut_params->op = op; 7423 7424 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7425 7426 ut_params->obuf = (op_mode == IN_PLACE ? 7427 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7428 7429 if (verify) { 7430 if (ut_params->obuf) 7431 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7432 plaintext_len, buffer); 7433 else 7434 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7435 plaintext_len, buffer); 7436 7437 debug_hexdump(stdout, "plaintext:", plaintext, 7438 (tdata->plaintext.len_bits >> 3) - 7439 tdata->digest_enc.len); 7440 debug_hexdump(stdout, "plaintext expected:", 7441 tdata->plaintext.data, 7442 (tdata->plaintext.len_bits >> 3) - 7443 tdata->digest_enc.len); 7444 } else { 7445 if (ut_params->obuf) 7446 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 7447 ciphertext_len, buffer); 7448 else 7449 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7450 ciphertext_len, buffer); 7451 7452 debug_hexdump(stdout, "ciphertext:", ciphertext, 7453 ciphertext_len); 7454 debug_hexdump(stdout, "ciphertext expected:", 7455 tdata->ciphertext.data, 7456 tdata->ciphertext.len_bits >> 3); 7457 7458 if (ut_params->obuf) 7459 digest = rte_pktmbuf_read(ut_params->obuf, 7460 (tdata->digest_enc.offset == 0 ? 7461 plaintext_pad_len : 7462 tdata->digest_enc.offset), 7463 tdata->digest_enc.len, digest_buffer); 7464 else 7465 digest = rte_pktmbuf_read(ut_params->ibuf, 7466 (tdata->digest_enc.offset == 0 ? 7467 plaintext_pad_len : 7468 tdata->digest_enc.offset), 7469 tdata->digest_enc.len, digest_buffer); 7470 7471 debug_hexdump(stdout, "digest:", digest, 7472 tdata->digest_enc.len); 7473 debug_hexdump(stdout, "digest expected:", 7474 tdata->digest_enc.data, tdata->digest_enc.len); 7475 } 7476 7477 /* Validate obuf */ 7478 if (verify) { 7479 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7480 plaintext, 7481 tdata->plaintext.data, 7482 tdata->plaintext.len_bits >> 3, 7483 "Plaintext data not as expected"); 7484 } else { 7485 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7486 ciphertext, 7487 tdata->ciphertext.data, 7488 tdata->validDataLen.len_bits, 7489 "Ciphertext data not as expected"); 7490 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7491 digest, 7492 tdata->digest_enc.data, 7493 tdata->digest_enc.len, 7494 "Generated auth tag not as expected"); 7495 } 7496 7497 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7498 "crypto op processing failed"); 7499 7500 return 0; 7501 } 7502 7503 /** AUTH AES CMAC + CIPHER AES CTR */ 7504 7505 static int 7506 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7507 { 7508 return test_mixed_auth_cipher( 7509 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7510 } 7511 7512 static int 7513 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7514 { 7515 return test_mixed_auth_cipher( 7516 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7517 } 7518 7519 static int 7520 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7521 { 7522 return test_mixed_auth_cipher_sgl( 7523 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7524 } 7525 7526 static int 7527 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7528 { 7529 return test_mixed_auth_cipher_sgl( 7530 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7531 } 7532 7533 static int 7534 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7535 { 7536 return test_mixed_auth_cipher( 7537 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7538 } 7539 7540 static int 7541 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7542 { 7543 return test_mixed_auth_cipher( 7544 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7545 } 7546 7547 static int 7548 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7549 { 7550 return test_mixed_auth_cipher_sgl( 7551 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7552 } 7553 7554 static int 7555 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7556 { 7557 return test_mixed_auth_cipher_sgl( 7558 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7559 } 7560 7561 /** MIXED AUTH + CIPHER */ 7562 7563 static int 7564 test_auth_zuc_cipher_snow_test_case_1(void) 7565 { 7566 return test_mixed_auth_cipher( 7567 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7568 } 7569 7570 static int 7571 test_verify_auth_zuc_cipher_snow_test_case_1(void) 7572 { 7573 return test_mixed_auth_cipher( 7574 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7575 } 7576 7577 static int 7578 test_auth_aes_cmac_cipher_snow_test_case_1(void) 7579 { 7580 return test_mixed_auth_cipher( 7581 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7582 } 7583 7584 static int 7585 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 7586 { 7587 return test_mixed_auth_cipher( 7588 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7589 } 7590 7591 static int 7592 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 7593 { 7594 return test_mixed_auth_cipher( 7595 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7596 } 7597 7598 static int 7599 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 7600 { 7601 return test_mixed_auth_cipher( 7602 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7603 } 7604 7605 static int 7606 test_auth_snow_cipher_aes_ctr_test_case_1(void) 7607 { 7608 return test_mixed_auth_cipher( 7609 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7610 } 7611 7612 static int 7613 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 7614 { 7615 return test_mixed_auth_cipher( 7616 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7617 } 7618 7619 static int 7620 test_auth_snow_cipher_zuc_test_case_1(void) 7621 { 7622 return test_mixed_auth_cipher( 7623 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7624 } 7625 7626 static int 7627 test_verify_auth_snow_cipher_zuc_test_case_1(void) 7628 { 7629 return test_mixed_auth_cipher( 7630 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7631 } 7632 7633 static int 7634 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 7635 { 7636 return test_mixed_auth_cipher( 7637 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7638 } 7639 7640 static int 7641 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 7642 { 7643 return test_mixed_auth_cipher( 7644 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7645 } 7646 7647 static int 7648 test_auth_null_cipher_snow_test_case_1(void) 7649 { 7650 return test_mixed_auth_cipher( 7651 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7652 } 7653 7654 static int 7655 test_verify_auth_null_cipher_snow_test_case_1(void) 7656 { 7657 return test_mixed_auth_cipher( 7658 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7659 } 7660 7661 static int 7662 test_auth_null_cipher_zuc_test_case_1(void) 7663 { 7664 return test_mixed_auth_cipher( 7665 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7666 } 7667 7668 static int 7669 test_verify_auth_null_cipher_zuc_test_case_1(void) 7670 { 7671 return test_mixed_auth_cipher( 7672 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7673 } 7674 7675 static int 7676 test_auth_snow_cipher_null_test_case_1(void) 7677 { 7678 return test_mixed_auth_cipher( 7679 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7680 } 7681 7682 static int 7683 test_verify_auth_snow_cipher_null_test_case_1(void) 7684 { 7685 return test_mixed_auth_cipher( 7686 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7687 } 7688 7689 static int 7690 test_auth_zuc_cipher_null_test_case_1(void) 7691 { 7692 return test_mixed_auth_cipher( 7693 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7694 } 7695 7696 static int 7697 test_verify_auth_zuc_cipher_null_test_case_1(void) 7698 { 7699 return test_mixed_auth_cipher( 7700 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7701 } 7702 7703 static int 7704 test_auth_null_cipher_aes_ctr_test_case_1(void) 7705 { 7706 return test_mixed_auth_cipher( 7707 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7708 } 7709 7710 static int 7711 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 7712 { 7713 return test_mixed_auth_cipher( 7714 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7715 } 7716 7717 static int 7718 test_auth_aes_cmac_cipher_null_test_case_1(void) 7719 { 7720 return test_mixed_auth_cipher( 7721 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7722 } 7723 7724 static int 7725 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 7726 { 7727 return test_mixed_auth_cipher( 7728 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7729 } 7730 7731 /* ***** AEAD algorithm Tests ***** */ 7732 7733 static int 7734 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 7735 enum rte_crypto_aead_operation op, 7736 const uint8_t *key, const uint8_t key_len, 7737 const uint16_t aad_len, const uint8_t auth_len, 7738 uint8_t iv_len) 7739 { 7740 uint8_t aead_key[key_len]; 7741 7742 struct crypto_testsuite_params *ts_params = &testsuite_params; 7743 struct crypto_unittest_params *ut_params = &unittest_params; 7744 7745 memcpy(aead_key, key, key_len); 7746 7747 /* Setup AEAD Parameters */ 7748 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7749 ut_params->aead_xform.next = NULL; 7750 ut_params->aead_xform.aead.algo = algo; 7751 ut_params->aead_xform.aead.op = op; 7752 ut_params->aead_xform.aead.key.data = aead_key; 7753 ut_params->aead_xform.aead.key.length = key_len; 7754 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 7755 ut_params->aead_xform.aead.iv.length = iv_len; 7756 ut_params->aead_xform.aead.digest_length = auth_len; 7757 ut_params->aead_xform.aead.aad_length = aad_len; 7758 7759 debug_hexdump(stdout, "key:", key, key_len); 7760 7761 /* Create Crypto session*/ 7762 ut_params->sess = rte_cryptodev_sym_session_create( 7763 ts_params->session_mpool); 7764 7765 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 7766 &ut_params->aead_xform, 7767 ts_params->session_priv_mpool); 7768 7769 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 7770 7771 return 0; 7772 } 7773 7774 static int 7775 create_aead_xform(struct rte_crypto_op *op, 7776 enum rte_crypto_aead_algorithm algo, 7777 enum rte_crypto_aead_operation aead_op, 7778 uint8_t *key, const uint8_t key_len, 7779 const uint8_t aad_len, const uint8_t auth_len, 7780 uint8_t iv_len) 7781 { 7782 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 7783 "failed to allocate space for crypto transform"); 7784 7785 struct rte_crypto_sym_op *sym_op = op->sym; 7786 7787 /* Setup AEAD Parameters */ 7788 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 7789 sym_op->xform->next = NULL; 7790 sym_op->xform->aead.algo = algo; 7791 sym_op->xform->aead.op = aead_op; 7792 sym_op->xform->aead.key.data = key; 7793 sym_op->xform->aead.key.length = key_len; 7794 sym_op->xform->aead.iv.offset = IV_OFFSET; 7795 sym_op->xform->aead.iv.length = iv_len; 7796 sym_op->xform->aead.digest_length = auth_len; 7797 sym_op->xform->aead.aad_length = aad_len; 7798 7799 debug_hexdump(stdout, "key:", key, key_len); 7800 7801 return 0; 7802 } 7803 7804 static int 7805 create_aead_operation(enum rte_crypto_aead_operation op, 7806 const struct aead_test_data *tdata) 7807 { 7808 struct crypto_testsuite_params *ts_params = &testsuite_params; 7809 struct crypto_unittest_params *ut_params = &unittest_params; 7810 7811 uint8_t *plaintext, *ciphertext; 7812 unsigned int aad_pad_len, plaintext_pad_len; 7813 7814 /* Generate Crypto op data structure */ 7815 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7816 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7817 TEST_ASSERT_NOT_NULL(ut_params->op, 7818 "Failed to allocate symmetric crypto operation struct"); 7819 7820 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 7821 7822 /* Append aad data */ 7823 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 7824 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 7825 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7826 aad_pad_len); 7827 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7828 "no room to append aad"); 7829 7830 sym_op->aead.aad.phys_addr = 7831 rte_pktmbuf_iova(ut_params->ibuf); 7832 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 7833 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 7834 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7835 tdata->aad.len); 7836 7837 /* Append IV at the end of the crypto operation*/ 7838 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7839 uint8_t *, IV_OFFSET); 7840 7841 /* Copy IV 1 byte after the IV pointer, according to the API */ 7842 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 7843 debug_hexdump(stdout, "iv:", iv_ptr, 7844 tdata->iv.len); 7845 } else { 7846 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 7847 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7848 aad_pad_len); 7849 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7850 "no room to append aad"); 7851 7852 sym_op->aead.aad.phys_addr = 7853 rte_pktmbuf_iova(ut_params->ibuf); 7854 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 7855 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7856 tdata->aad.len); 7857 7858 /* Append IV at the end of the crypto operation*/ 7859 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7860 uint8_t *, IV_OFFSET); 7861 7862 if (tdata->iv.len == 0) { 7863 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 7864 debug_hexdump(stdout, "iv:", iv_ptr, 7865 AES_GCM_J0_LENGTH); 7866 } else { 7867 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 7868 debug_hexdump(stdout, "iv:", iv_ptr, 7869 tdata->iv.len); 7870 } 7871 } 7872 7873 /* Append plaintext/ciphertext */ 7874 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7875 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7876 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7877 plaintext_pad_len); 7878 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 7879 7880 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 7881 debug_hexdump(stdout, "plaintext:", plaintext, 7882 tdata->plaintext.len); 7883 7884 if (ut_params->obuf) { 7885 ciphertext = (uint8_t *)rte_pktmbuf_append( 7886 ut_params->obuf, 7887 plaintext_pad_len + aad_pad_len); 7888 TEST_ASSERT_NOT_NULL(ciphertext, 7889 "no room to append ciphertext"); 7890 7891 memset(ciphertext + aad_pad_len, 0, 7892 tdata->ciphertext.len); 7893 } 7894 } else { 7895 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 7896 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7897 plaintext_pad_len); 7898 TEST_ASSERT_NOT_NULL(ciphertext, 7899 "no room to append ciphertext"); 7900 7901 memcpy(ciphertext, tdata->ciphertext.data, 7902 tdata->ciphertext.len); 7903 debug_hexdump(stdout, "ciphertext:", ciphertext, 7904 tdata->ciphertext.len); 7905 7906 if (ut_params->obuf) { 7907 plaintext = (uint8_t *)rte_pktmbuf_append( 7908 ut_params->obuf, 7909 plaintext_pad_len + aad_pad_len); 7910 TEST_ASSERT_NOT_NULL(plaintext, 7911 "no room to append plaintext"); 7912 7913 memset(plaintext + aad_pad_len, 0, 7914 tdata->plaintext.len); 7915 } 7916 } 7917 7918 /* Append digest data */ 7919 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7920 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7921 ut_params->obuf ? ut_params->obuf : 7922 ut_params->ibuf, 7923 tdata->auth_tag.len); 7924 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7925 "no room to append digest"); 7926 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 7927 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7928 ut_params->obuf ? ut_params->obuf : 7929 ut_params->ibuf, 7930 plaintext_pad_len + 7931 aad_pad_len); 7932 } else { 7933 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7934 ut_params->ibuf, tdata->auth_tag.len); 7935 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7936 "no room to append digest"); 7937 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7938 ut_params->ibuf, 7939 plaintext_pad_len + aad_pad_len); 7940 7941 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 7942 tdata->auth_tag.len); 7943 debug_hexdump(stdout, "digest:", 7944 sym_op->aead.digest.data, 7945 tdata->auth_tag.len); 7946 } 7947 7948 sym_op->aead.data.length = tdata->plaintext.len; 7949 sym_op->aead.data.offset = aad_pad_len; 7950 7951 return 0; 7952 } 7953 7954 static int 7955 test_authenticated_encryption(const struct aead_test_data *tdata) 7956 { 7957 struct crypto_testsuite_params *ts_params = &testsuite_params; 7958 struct crypto_unittest_params *ut_params = &unittest_params; 7959 7960 int retval; 7961 uint8_t *ciphertext, *auth_tag; 7962 uint16_t plaintext_pad_len; 7963 uint32_t i; 7964 struct rte_cryptodev_info dev_info; 7965 7966 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7967 uint64_t feat_flags = dev_info.feature_flags; 7968 7969 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 7970 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 7971 printf("Device doesn't support RAW data-path APIs.\n"); 7972 return TEST_SKIPPED; 7973 } 7974 7975 /* Verify the capabilities */ 7976 struct rte_cryptodev_sym_capability_idx cap_idx; 7977 const struct rte_cryptodev_symmetric_capability *capability; 7978 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7979 cap_idx.algo.aead = tdata->algo; 7980 capability = rte_cryptodev_sym_capability_get( 7981 ts_params->valid_devs[0], &cap_idx); 7982 if (capability == NULL) 7983 return TEST_SKIPPED; 7984 if (rte_cryptodev_sym_capability_check_aead( 7985 capability, tdata->key.len, tdata->auth_tag.len, 7986 tdata->aad.len, tdata->iv.len)) 7987 return TEST_SKIPPED; 7988 7989 /* Create AEAD session */ 7990 retval = create_aead_session(ts_params->valid_devs[0], 7991 tdata->algo, 7992 RTE_CRYPTO_AEAD_OP_ENCRYPT, 7993 tdata->key.data, tdata->key.len, 7994 tdata->aad.len, tdata->auth_tag.len, 7995 tdata->iv.len); 7996 if (retval < 0) 7997 return retval; 7998 7999 if (tdata->aad.len > MBUF_SIZE) { 8000 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 8001 /* Populate full size of add data */ 8002 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 8003 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 8004 } else 8005 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8006 8007 /* clear mbuf payload */ 8008 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8009 rte_pktmbuf_tailroom(ut_params->ibuf)); 8010 8011 /* Create AEAD operation */ 8012 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 8013 if (retval < 0) 8014 return retval; 8015 8016 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 8017 8018 ut_params->op->sym->m_src = ut_params->ibuf; 8019 8020 /* Process crypto operation */ 8021 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 8022 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 8023 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 8024 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 8025 ut_params->op, 0, 0, 0, 0); 8026 else 8027 TEST_ASSERT_NOT_NULL( 8028 process_crypto_request(ts_params->valid_devs[0], 8029 ut_params->op), "failed to process sym crypto op"); 8030 8031 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 8032 "crypto op processing failed"); 8033 8034 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 8035 8036 if (ut_params->op->sym->m_dst) { 8037 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8038 uint8_t *); 8039 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 8040 uint8_t *, plaintext_pad_len); 8041 } else { 8042 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 8043 uint8_t *, 8044 ut_params->op->sym->cipher.data.offset); 8045 auth_tag = ciphertext + plaintext_pad_len; 8046 } 8047 8048 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 8049 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 8050 8051 /* Validate obuf */ 8052 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8053 ciphertext, 8054 tdata->ciphertext.data, 8055 tdata->ciphertext.len, 8056 "Ciphertext data not as expected"); 8057 8058 TEST_ASSERT_BUFFERS_ARE_EQUAL( 8059 auth_tag, 8060 tdata->auth_tag.data, 8061 tdata->auth_tag.len, 8062 "Generated auth tag not as expected"); 8063 8064 return 0; 8065 8066 } 8067 8068 #ifdef RTE_LIB_SECURITY 8069 static int 8070 security_proto_supported(enum rte_security_session_action_type action, 8071 enum rte_security_session_protocol proto) 8072 { 8073 struct crypto_testsuite_params *ts_params = &testsuite_params; 8074 8075 const struct rte_security_capability *capabilities; 8076 const struct rte_security_capability *capability; 8077 uint16_t i = 0; 8078 8079 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8080 rte_cryptodev_get_sec_ctx( 8081 ts_params->valid_devs[0]); 8082 8083 8084 capabilities = rte_security_capabilities_get(ctx); 8085 8086 if (capabilities == NULL) 8087 return -ENOTSUP; 8088 8089 while ((capability = &capabilities[i++])->action != 8090 RTE_SECURITY_ACTION_TYPE_NONE) { 8091 if (capability->action == action && 8092 capability->protocol == proto) 8093 return 0; 8094 } 8095 8096 return -ENOTSUP; 8097 } 8098 8099 /* Basic algorithm run function for async inplace mode. 8100 * Creates a session from input parameters and runs one operation 8101 * on input_vec. Checks the output of the crypto operation against 8102 * output_vec. 8103 */ 8104 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 8105 enum rte_crypto_auth_operation opa, 8106 const uint8_t *input_vec, unsigned int input_vec_len, 8107 const uint8_t *output_vec, 8108 unsigned int output_vec_len, 8109 enum rte_crypto_cipher_algorithm cipher_alg, 8110 const uint8_t *cipher_key, uint32_t cipher_key_len, 8111 enum rte_crypto_auth_algorithm auth_alg, 8112 const uint8_t *auth_key, uint32_t auth_key_len, 8113 uint8_t bearer, enum rte_security_pdcp_domain domain, 8114 uint8_t packet_direction, uint8_t sn_size, 8115 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 8116 { 8117 struct crypto_testsuite_params *ts_params = &testsuite_params; 8118 struct crypto_unittest_params *ut_params = &unittest_params; 8119 uint8_t *plaintext; 8120 int ret = TEST_SUCCESS; 8121 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8122 rte_cryptodev_get_sec_ctx( 8123 ts_params->valid_devs[0]); 8124 8125 /* Verify the capabilities */ 8126 struct rte_security_capability_idx sec_cap_idx; 8127 8128 sec_cap_idx.action = ut_params->type; 8129 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8130 sec_cap_idx.pdcp.domain = domain; 8131 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8132 return TEST_SKIPPED; 8133 8134 /* Generate test mbuf data */ 8135 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8136 8137 /* clear mbuf payload */ 8138 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8139 rte_pktmbuf_tailroom(ut_params->ibuf)); 8140 8141 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8142 input_vec_len); 8143 memcpy(plaintext, input_vec, input_vec_len); 8144 8145 /* Out of place support */ 8146 if (oop) { 8147 /* 8148 * For out-op-place we need to alloc another mbuf 8149 */ 8150 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8151 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 8152 } 8153 8154 /* Setup Cipher Parameters */ 8155 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8156 ut_params->cipher_xform.cipher.algo = cipher_alg; 8157 ut_params->cipher_xform.cipher.op = opc; 8158 ut_params->cipher_xform.cipher.key.data = cipher_key; 8159 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 8160 ut_params->cipher_xform.cipher.iv.length = 8161 packet_direction ? 4 : 0; 8162 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8163 8164 /* Setup HMAC Parameters if ICV header is required */ 8165 if (auth_alg != 0) { 8166 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8167 ut_params->auth_xform.next = NULL; 8168 ut_params->auth_xform.auth.algo = auth_alg; 8169 ut_params->auth_xform.auth.op = opa; 8170 ut_params->auth_xform.auth.key.data = auth_key; 8171 ut_params->auth_xform.auth.key.length = auth_key_len; 8172 8173 ut_params->cipher_xform.next = &ut_params->auth_xform; 8174 } else { 8175 ut_params->cipher_xform.next = NULL; 8176 } 8177 8178 struct rte_security_session_conf sess_conf = { 8179 .action_type = ut_params->type, 8180 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8181 {.pdcp = { 8182 .bearer = bearer, 8183 .domain = domain, 8184 .pkt_dir = packet_direction, 8185 .sn_size = sn_size, 8186 .hfn = packet_direction ? 0 : hfn, 8187 /** 8188 * hfn can be set as pdcp_test_hfn[i] 8189 * if hfn_ovrd is not set. Here, PDCP 8190 * packet direction is just used to 8191 * run half of the cases with session 8192 * HFN and other half with per packet 8193 * HFN. 8194 */ 8195 .hfn_threshold = hfn_threshold, 8196 .hfn_ovrd = packet_direction ? 1 : 0, 8197 .sdap_enabled = sdap, 8198 } }, 8199 .crypto_xform = &ut_params->cipher_xform 8200 }; 8201 8202 /* Create security session */ 8203 ut_params->sec_session = rte_security_session_create(ctx, 8204 &sess_conf, ts_params->session_mpool, 8205 ts_params->session_priv_mpool); 8206 8207 if (!ut_params->sec_session) { 8208 printf("TestCase %s()-%d line %d failed %s: ", 8209 __func__, i, __LINE__, "Failed to allocate session"); 8210 ret = TEST_FAILED; 8211 goto on_err; 8212 } 8213 8214 /* Generate crypto op data structure */ 8215 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8216 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8217 if (!ut_params->op) { 8218 printf("TestCase %s()-%d line %d failed %s: ", 8219 __func__, i, __LINE__, 8220 "Failed to allocate symmetric crypto operation struct"); 8221 ret = TEST_FAILED; 8222 goto on_err; 8223 } 8224 8225 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 8226 uint32_t *, IV_OFFSET); 8227 *per_pkt_hfn = packet_direction ? hfn : 0; 8228 8229 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8230 8231 /* set crypto operation source mbuf */ 8232 ut_params->op->sym->m_src = ut_params->ibuf; 8233 if (oop) 8234 ut_params->op->sym->m_dst = ut_params->obuf; 8235 8236 /* Process crypto operation */ 8237 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8238 == NULL) { 8239 printf("TestCase %s()-%d line %d failed %s: ", 8240 __func__, i, __LINE__, 8241 "failed to process sym crypto op"); 8242 ret = TEST_FAILED; 8243 goto on_err; 8244 } 8245 8246 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8247 printf("TestCase %s()-%d line %d failed %s: ", 8248 __func__, i, __LINE__, "crypto op processing failed"); 8249 ret = TEST_FAILED; 8250 goto on_err; 8251 } 8252 8253 /* Validate obuf */ 8254 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8255 uint8_t *); 8256 if (oop) { 8257 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8258 uint8_t *); 8259 } 8260 8261 if (memcmp(ciphertext, output_vec, output_vec_len)) { 8262 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8263 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 8264 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 8265 ret = TEST_FAILED; 8266 goto on_err; 8267 } 8268 8269 on_err: 8270 rte_crypto_op_free(ut_params->op); 8271 ut_params->op = NULL; 8272 8273 if (ut_params->sec_session) 8274 rte_security_session_destroy(ctx, ut_params->sec_session); 8275 ut_params->sec_session = NULL; 8276 8277 rte_pktmbuf_free(ut_params->ibuf); 8278 ut_params->ibuf = NULL; 8279 if (oop) { 8280 rte_pktmbuf_free(ut_params->obuf); 8281 ut_params->obuf = NULL; 8282 } 8283 8284 return ret; 8285 } 8286 8287 static int 8288 test_pdcp_proto_SGL(int i, int oop, 8289 enum rte_crypto_cipher_operation opc, 8290 enum rte_crypto_auth_operation opa, 8291 uint8_t *input_vec, 8292 unsigned int input_vec_len, 8293 uint8_t *output_vec, 8294 unsigned int output_vec_len, 8295 uint32_t fragsz, 8296 uint32_t fragsz_oop) 8297 { 8298 struct crypto_testsuite_params *ts_params = &testsuite_params; 8299 struct crypto_unittest_params *ut_params = &unittest_params; 8300 uint8_t *plaintext; 8301 struct rte_mbuf *buf, *buf_oop = NULL; 8302 int ret = TEST_SUCCESS; 8303 int to_trn = 0; 8304 int to_trn_tbl[16]; 8305 int segs = 1; 8306 unsigned int trn_data = 0; 8307 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8308 rte_cryptodev_get_sec_ctx( 8309 ts_params->valid_devs[0]); 8310 8311 /* Verify the capabilities */ 8312 struct rte_security_capability_idx sec_cap_idx; 8313 8314 sec_cap_idx.action = ut_params->type; 8315 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 8316 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 8317 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 8318 return TEST_SKIPPED; 8319 8320 if (fragsz > input_vec_len) 8321 fragsz = input_vec_len; 8322 8323 uint16_t plaintext_len = fragsz; 8324 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 8325 8326 if (fragsz_oop > output_vec_len) 8327 frag_size_oop = output_vec_len; 8328 8329 int ecx = 0; 8330 if (input_vec_len % fragsz != 0) { 8331 if (input_vec_len / fragsz + 1 > 16) 8332 return 1; 8333 } else if (input_vec_len / fragsz > 16) 8334 return 1; 8335 8336 /* Out of place support */ 8337 if (oop) { 8338 /* 8339 * For out-op-place we need to alloc another mbuf 8340 */ 8341 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8342 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 8343 buf_oop = ut_params->obuf; 8344 } 8345 8346 /* Generate test mbuf data */ 8347 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8348 8349 /* clear mbuf payload */ 8350 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8351 rte_pktmbuf_tailroom(ut_params->ibuf)); 8352 8353 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8354 plaintext_len); 8355 memcpy(plaintext, input_vec, plaintext_len); 8356 trn_data += plaintext_len; 8357 8358 buf = ut_params->ibuf; 8359 8360 /* 8361 * Loop until no more fragments 8362 */ 8363 8364 while (trn_data < input_vec_len) { 8365 ++segs; 8366 to_trn = (input_vec_len - trn_data < fragsz) ? 8367 (input_vec_len - trn_data) : fragsz; 8368 8369 to_trn_tbl[ecx++] = to_trn; 8370 8371 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8372 buf = buf->next; 8373 8374 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 8375 rte_pktmbuf_tailroom(buf)); 8376 8377 /* OOP */ 8378 if (oop && !fragsz_oop) { 8379 buf_oop->next = 8380 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8381 buf_oop = buf_oop->next; 8382 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8383 0, rte_pktmbuf_tailroom(buf_oop)); 8384 rte_pktmbuf_append(buf_oop, to_trn); 8385 } 8386 8387 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 8388 to_trn); 8389 8390 memcpy(plaintext, input_vec + trn_data, to_trn); 8391 trn_data += to_trn; 8392 } 8393 8394 ut_params->ibuf->nb_segs = segs; 8395 8396 segs = 1; 8397 if (fragsz_oop && oop) { 8398 to_trn = 0; 8399 ecx = 0; 8400 8401 trn_data = frag_size_oop; 8402 while (trn_data < output_vec_len) { 8403 ++segs; 8404 to_trn = 8405 (output_vec_len - trn_data < 8406 frag_size_oop) ? 8407 (output_vec_len - trn_data) : 8408 frag_size_oop; 8409 8410 to_trn_tbl[ecx++] = to_trn; 8411 8412 buf_oop->next = 8413 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8414 buf_oop = buf_oop->next; 8415 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8416 0, rte_pktmbuf_tailroom(buf_oop)); 8417 rte_pktmbuf_append(buf_oop, to_trn); 8418 8419 trn_data += to_trn; 8420 } 8421 ut_params->obuf->nb_segs = segs; 8422 } 8423 8424 /* Setup Cipher Parameters */ 8425 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8426 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 8427 ut_params->cipher_xform.cipher.op = opc; 8428 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 8429 ut_params->cipher_xform.cipher.key.length = 8430 pdcp_test_params[i].cipher_key_len; 8431 ut_params->cipher_xform.cipher.iv.length = 0; 8432 8433 /* Setup HMAC Parameters if ICV header is required */ 8434 if (pdcp_test_params[i].auth_alg != 0) { 8435 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8436 ut_params->auth_xform.next = NULL; 8437 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 8438 ut_params->auth_xform.auth.op = opa; 8439 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 8440 ut_params->auth_xform.auth.key.length = 8441 pdcp_test_params[i].auth_key_len; 8442 8443 ut_params->cipher_xform.next = &ut_params->auth_xform; 8444 } else { 8445 ut_params->cipher_xform.next = NULL; 8446 } 8447 8448 struct rte_security_session_conf sess_conf = { 8449 .action_type = ut_params->type, 8450 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8451 {.pdcp = { 8452 .bearer = pdcp_test_bearer[i], 8453 .domain = pdcp_test_params[i].domain, 8454 .pkt_dir = pdcp_test_packet_direction[i], 8455 .sn_size = pdcp_test_data_sn_size[i], 8456 .hfn = pdcp_test_hfn[i], 8457 .hfn_threshold = pdcp_test_hfn_threshold[i], 8458 .hfn_ovrd = 0, 8459 } }, 8460 .crypto_xform = &ut_params->cipher_xform 8461 }; 8462 8463 /* Create security session */ 8464 ut_params->sec_session = rte_security_session_create(ctx, 8465 &sess_conf, ts_params->session_mpool, 8466 ts_params->session_priv_mpool); 8467 8468 if (!ut_params->sec_session) { 8469 printf("TestCase %s()-%d line %d failed %s: ", 8470 __func__, i, __LINE__, "Failed to allocate session"); 8471 ret = TEST_FAILED; 8472 goto on_err; 8473 } 8474 8475 /* Generate crypto op data structure */ 8476 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8477 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8478 if (!ut_params->op) { 8479 printf("TestCase %s()-%d line %d failed %s: ", 8480 __func__, i, __LINE__, 8481 "Failed to allocate symmetric crypto operation struct"); 8482 ret = TEST_FAILED; 8483 goto on_err; 8484 } 8485 8486 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8487 8488 /* set crypto operation source mbuf */ 8489 ut_params->op->sym->m_src = ut_params->ibuf; 8490 if (oop) 8491 ut_params->op->sym->m_dst = ut_params->obuf; 8492 8493 /* Process crypto operation */ 8494 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8495 == NULL) { 8496 printf("TestCase %s()-%d line %d failed %s: ", 8497 __func__, i, __LINE__, 8498 "failed to process sym crypto op"); 8499 ret = TEST_FAILED; 8500 goto on_err; 8501 } 8502 8503 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8504 printf("TestCase %s()-%d line %d failed %s: ", 8505 __func__, i, __LINE__, "crypto op processing failed"); 8506 ret = TEST_FAILED; 8507 goto on_err; 8508 } 8509 8510 /* Validate obuf */ 8511 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8512 uint8_t *); 8513 if (oop) { 8514 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8515 uint8_t *); 8516 } 8517 if (fragsz_oop) 8518 fragsz = frag_size_oop; 8519 if (memcmp(ciphertext, output_vec, fragsz)) { 8520 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8521 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 8522 rte_hexdump(stdout, "reference", output_vec, fragsz); 8523 ret = TEST_FAILED; 8524 goto on_err; 8525 } 8526 8527 buf = ut_params->op->sym->m_src->next; 8528 if (oop) 8529 buf = ut_params->op->sym->m_dst->next; 8530 8531 unsigned int off = fragsz; 8532 8533 ecx = 0; 8534 while (buf) { 8535 ciphertext = rte_pktmbuf_mtod(buf, 8536 uint8_t *); 8537 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 8538 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8539 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 8540 rte_hexdump(stdout, "reference", output_vec + off, 8541 to_trn_tbl[ecx]); 8542 ret = TEST_FAILED; 8543 goto on_err; 8544 } 8545 off += to_trn_tbl[ecx++]; 8546 buf = buf->next; 8547 } 8548 on_err: 8549 rte_crypto_op_free(ut_params->op); 8550 ut_params->op = NULL; 8551 8552 if (ut_params->sec_session) 8553 rte_security_session_destroy(ctx, ut_params->sec_session); 8554 ut_params->sec_session = NULL; 8555 8556 rte_pktmbuf_free(ut_params->ibuf); 8557 ut_params->ibuf = NULL; 8558 if (oop) { 8559 rte_pktmbuf_free(ut_params->obuf); 8560 ut_params->obuf = NULL; 8561 } 8562 8563 return ret; 8564 } 8565 8566 int 8567 test_pdcp_proto_cplane_encap(int i) 8568 { 8569 return test_pdcp_proto( 8570 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8571 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8572 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8573 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8574 pdcp_test_params[i].cipher_key_len, 8575 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8576 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8577 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8578 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8579 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8580 } 8581 8582 int 8583 test_pdcp_proto_uplane_encap(int i) 8584 { 8585 return test_pdcp_proto( 8586 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8587 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8588 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8589 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8590 pdcp_test_params[i].cipher_key_len, 8591 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8592 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8593 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8594 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8595 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8596 } 8597 8598 int 8599 test_pdcp_proto_uplane_encap_with_int(int i) 8600 { 8601 return test_pdcp_proto( 8602 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8603 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8604 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8605 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8606 pdcp_test_params[i].cipher_key_len, 8607 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8608 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8609 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8610 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8611 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8612 } 8613 8614 int 8615 test_pdcp_proto_cplane_decap(int i) 8616 { 8617 return test_pdcp_proto( 8618 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8619 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8620 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8621 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8622 pdcp_test_params[i].cipher_key_len, 8623 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8624 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8625 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8626 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8627 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8628 } 8629 8630 int 8631 test_pdcp_proto_uplane_decap(int i) 8632 { 8633 return test_pdcp_proto( 8634 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8635 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8636 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8637 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8638 pdcp_test_params[i].cipher_key_len, 8639 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8640 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8641 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8642 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8643 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8644 } 8645 8646 int 8647 test_pdcp_proto_uplane_decap_with_int(int i) 8648 { 8649 return test_pdcp_proto( 8650 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8651 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8652 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8653 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8654 pdcp_test_params[i].cipher_key_len, 8655 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8656 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8657 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8658 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8659 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8660 } 8661 8662 static int 8663 test_PDCP_PROTO_SGL_in_place_32B(void) 8664 { 8665 /* i can be used for running any PDCP case 8666 * In this case it is uplane 12-bit AES-SNOW DL encap 8667 */ 8668 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 8669 return test_pdcp_proto_SGL(i, IN_PLACE, 8670 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8671 RTE_CRYPTO_AUTH_OP_GENERATE, 8672 pdcp_test_data_in[i], 8673 pdcp_test_data_in_len[i], 8674 pdcp_test_data_out[i], 8675 pdcp_test_data_in_len[i]+4, 8676 32, 0); 8677 } 8678 static int 8679 test_PDCP_PROTO_SGL_oop_32B_128B(void) 8680 { 8681 /* i can be used for running any PDCP case 8682 * In this case it is uplane 18-bit NULL-NULL DL encap 8683 */ 8684 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 8685 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8686 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8687 RTE_CRYPTO_AUTH_OP_GENERATE, 8688 pdcp_test_data_in[i], 8689 pdcp_test_data_in_len[i], 8690 pdcp_test_data_out[i], 8691 pdcp_test_data_in_len[i]+4, 8692 32, 128); 8693 } 8694 static int 8695 test_PDCP_PROTO_SGL_oop_32B_40B(void) 8696 { 8697 /* i can be used for running any PDCP case 8698 * In this case it is uplane 18-bit AES DL encap 8699 */ 8700 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 8701 + DOWNLINK; 8702 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8703 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8704 RTE_CRYPTO_AUTH_OP_GENERATE, 8705 pdcp_test_data_in[i], 8706 pdcp_test_data_in_len[i], 8707 pdcp_test_data_out[i], 8708 pdcp_test_data_in_len[i], 8709 32, 40); 8710 } 8711 static int 8712 test_PDCP_PROTO_SGL_oop_128B_32B(void) 8713 { 8714 /* i can be used for running any PDCP case 8715 * In this case it is cplane 12-bit AES-ZUC DL encap 8716 */ 8717 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 8718 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8719 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8720 RTE_CRYPTO_AUTH_OP_GENERATE, 8721 pdcp_test_data_in[i], 8722 pdcp_test_data_in_len[i], 8723 pdcp_test_data_out[i], 8724 pdcp_test_data_in_len[i]+4, 8725 128, 32); 8726 } 8727 8728 static int 8729 test_PDCP_SDAP_PROTO_encap_all(void) 8730 { 8731 int i = 0, size = 0; 8732 int err, all_err = TEST_SUCCESS; 8733 const struct pdcp_sdap_test *cur_test; 8734 8735 size = RTE_DIM(list_pdcp_sdap_tests); 8736 8737 for (i = 0; i < size; i++) { 8738 cur_test = &list_pdcp_sdap_tests[i]; 8739 err = test_pdcp_proto( 8740 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8741 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8742 cur_test->in_len, cur_test->data_out, 8743 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8744 cur_test->param.cipher_alg, cur_test->cipher_key, 8745 cur_test->param.cipher_key_len, 8746 cur_test->param.auth_alg, 8747 cur_test->auth_key, cur_test->param.auth_key_len, 8748 cur_test->bearer, cur_test->param.domain, 8749 cur_test->packet_direction, cur_test->sn_size, 8750 cur_test->hfn, 8751 cur_test->hfn_threshold, SDAP_ENABLED); 8752 if (err) { 8753 printf("\t%d) %s: Encapsulation failed\n", 8754 cur_test->test_idx, 8755 cur_test->param.name); 8756 err = TEST_FAILED; 8757 } else { 8758 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 8759 cur_test->param.name); 8760 err = TEST_SUCCESS; 8761 } 8762 all_err += err; 8763 } 8764 8765 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8766 8767 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8768 } 8769 8770 static int 8771 test_PDCP_PROTO_short_mac(void) 8772 { 8773 int i = 0, size = 0; 8774 int err, all_err = TEST_SUCCESS; 8775 const struct pdcp_short_mac_test *cur_test; 8776 8777 size = RTE_DIM(list_pdcp_smac_tests); 8778 8779 for (i = 0; i < size; i++) { 8780 cur_test = &list_pdcp_smac_tests[i]; 8781 err = test_pdcp_proto( 8782 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8783 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8784 cur_test->in_len, cur_test->data_out, 8785 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8786 RTE_CRYPTO_CIPHER_NULL, NULL, 8787 0, cur_test->param.auth_alg, 8788 cur_test->auth_key, cur_test->param.auth_key_len, 8789 0, cur_test->param.domain, 0, 0, 8790 0, 0, 0); 8791 if (err) { 8792 printf("\t%d) %s: Short MAC test failed\n", 8793 cur_test->test_idx, 8794 cur_test->param.name); 8795 err = TEST_FAILED; 8796 } else { 8797 printf("\t%d) %s: Short MAC test PASS\n", 8798 cur_test->test_idx, 8799 cur_test->param.name); 8800 rte_hexdump(stdout, "MAC I", 8801 cur_test->data_out + cur_test->in_len + 2, 8802 2); 8803 err = TEST_SUCCESS; 8804 } 8805 all_err += err; 8806 } 8807 8808 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8809 8810 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8811 8812 } 8813 8814 static int 8815 test_PDCP_SDAP_PROTO_decap_all(void) 8816 { 8817 int i = 0, size = 0; 8818 int err, all_err = TEST_SUCCESS; 8819 const struct pdcp_sdap_test *cur_test; 8820 8821 size = RTE_DIM(list_pdcp_sdap_tests); 8822 8823 for (i = 0; i < size; i++) { 8824 cur_test = &list_pdcp_sdap_tests[i]; 8825 err = test_pdcp_proto( 8826 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 8827 RTE_CRYPTO_AUTH_OP_VERIFY, 8828 cur_test->data_out, 8829 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8830 cur_test->data_in, cur_test->in_len, 8831 cur_test->param.cipher_alg, 8832 cur_test->cipher_key, cur_test->param.cipher_key_len, 8833 cur_test->param.auth_alg, cur_test->auth_key, 8834 cur_test->param.auth_key_len, cur_test->bearer, 8835 cur_test->param.domain, cur_test->packet_direction, 8836 cur_test->sn_size, cur_test->hfn, 8837 cur_test->hfn_threshold, SDAP_ENABLED); 8838 if (err) { 8839 printf("\t%d) %s: Decapsulation failed\n", 8840 cur_test->test_idx, 8841 cur_test->param.name); 8842 err = TEST_FAILED; 8843 } else { 8844 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 8845 cur_test->param.name); 8846 err = TEST_SUCCESS; 8847 } 8848 all_err += err; 8849 } 8850 8851 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8852 8853 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8854 } 8855 8856 static int 8857 test_PDCP_PROTO_all(void) 8858 { 8859 struct crypto_testsuite_params *ts_params = &testsuite_params; 8860 struct crypto_unittest_params *ut_params = &unittest_params; 8861 struct rte_cryptodev_info dev_info; 8862 int status; 8863 8864 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8865 uint64_t feat_flags = dev_info.feature_flags; 8866 8867 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 8868 return TEST_SKIPPED; 8869 8870 /* Set action type */ 8871 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 8872 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 8873 gbl_action_type; 8874 8875 if (security_proto_supported(ut_params->type, 8876 RTE_SECURITY_PROTOCOL_PDCP) < 0) 8877 return TEST_SKIPPED; 8878 8879 status = test_PDCP_PROTO_cplane_encap_all(); 8880 status += test_PDCP_PROTO_cplane_decap_all(); 8881 status += test_PDCP_PROTO_uplane_encap_all(); 8882 status += test_PDCP_PROTO_uplane_decap_all(); 8883 status += test_PDCP_PROTO_SGL_in_place_32B(); 8884 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 8885 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 8886 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 8887 status += test_PDCP_SDAP_PROTO_encap_all(); 8888 status += test_PDCP_SDAP_PROTO_decap_all(); 8889 8890 if (status) 8891 return TEST_FAILED; 8892 else 8893 return TEST_SUCCESS; 8894 } 8895 8896 static int 8897 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td) 8898 { 8899 struct crypto_testsuite_params *ts_params = &testsuite_params; 8900 struct crypto_unittest_params *ut_params = &unittest_params; 8901 uint8_t *plaintext, *ciphertext; 8902 uint8_t *iv_ptr; 8903 int32_t cipher_len, crc_len; 8904 uint32_t crc_data_len; 8905 int ret = TEST_SUCCESS; 8906 8907 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8908 rte_cryptodev_get_sec_ctx( 8909 ts_params->valid_devs[0]); 8910 8911 /* Verify the capabilities */ 8912 struct rte_security_capability_idx sec_cap_idx; 8913 const struct rte_security_capability *sec_cap; 8914 const struct rte_cryptodev_capabilities *crypto_cap; 8915 const struct rte_cryptodev_symmetric_capability *sym_cap; 8916 int j = 0; 8917 8918 sec_cap_idx.action = ut_params->type; 8919 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 8920 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 8921 8922 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 8923 if (sec_cap == NULL) 8924 return TEST_SKIPPED; 8925 8926 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 8927 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 8928 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 8929 crypto_cap->sym.xform_type == 8930 RTE_CRYPTO_SYM_XFORM_CIPHER && 8931 crypto_cap->sym.cipher.algo == 8932 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 8933 sym_cap = &crypto_cap->sym; 8934 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 8935 d_td->key.len, 8936 d_td->iv.len) == 0) 8937 break; 8938 } 8939 } 8940 8941 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 8942 return TEST_SKIPPED; 8943 8944 /* Setup source mbuf payload */ 8945 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8946 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8947 rte_pktmbuf_tailroom(ut_params->ibuf)); 8948 8949 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8950 d_td->ciphertext.len); 8951 8952 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 8953 8954 /* Setup cipher session parameters */ 8955 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8956 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 8957 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 8958 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 8959 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 8960 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 8961 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8962 ut_params->cipher_xform.next = NULL; 8963 8964 /* Setup DOCSIS session parameters */ 8965 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 8966 8967 struct rte_security_session_conf sess_conf = { 8968 .action_type = ut_params->type, 8969 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 8970 .docsis = ut_params->docsis_xform, 8971 .crypto_xform = &ut_params->cipher_xform, 8972 }; 8973 8974 /* Create security session */ 8975 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 8976 ts_params->session_mpool, 8977 ts_params->session_priv_mpool); 8978 8979 if (!ut_params->sec_session) { 8980 printf("TestCase %s(%d) line %d: %s\n", 8981 __func__, i, __LINE__, "failed to allocate session"); 8982 ret = TEST_FAILED; 8983 goto on_err; 8984 } 8985 8986 /* Generate crypto op data structure */ 8987 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8988 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8989 if (!ut_params->op) { 8990 printf("TestCase %s(%d) line %d: %s\n", 8991 __func__, i, __LINE__, 8992 "failed to allocate symmetric crypto operation"); 8993 ret = TEST_FAILED; 8994 goto on_err; 8995 } 8996 8997 /* Setup CRC operation parameters */ 8998 crc_len = d_td->ciphertext.no_crc == false ? 8999 (d_td->ciphertext.len - 9000 d_td->ciphertext.crc_offset - 9001 RTE_ETHER_CRC_LEN) : 9002 0; 9003 crc_len = crc_len > 0 ? crc_len : 0; 9004 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 9005 ut_params->op->sym->auth.data.length = crc_len; 9006 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 9007 9008 /* Setup cipher operation parameters */ 9009 cipher_len = d_td->ciphertext.no_cipher == false ? 9010 (d_td->ciphertext.len - 9011 d_td->ciphertext.cipher_offset) : 9012 0; 9013 cipher_len = cipher_len > 0 ? cipher_len : 0; 9014 ut_params->op->sym->cipher.data.length = cipher_len; 9015 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 9016 9017 /* Setup cipher IV */ 9018 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9019 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9020 9021 /* Attach session to operation */ 9022 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9023 9024 /* Set crypto operation mbufs */ 9025 ut_params->op->sym->m_src = ut_params->ibuf; 9026 ut_params->op->sym->m_dst = NULL; 9027 9028 /* Process crypto operation */ 9029 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9030 NULL) { 9031 printf("TestCase %s(%d) line %d: %s\n", 9032 __func__, i, __LINE__, 9033 "failed to process security crypto op"); 9034 ret = TEST_FAILED; 9035 goto on_err; 9036 } 9037 9038 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9039 printf("TestCase %s(%d) line %d: %s\n", 9040 __func__, i, __LINE__, "crypto op processing failed"); 9041 ret = TEST_FAILED; 9042 goto on_err; 9043 } 9044 9045 /* Validate plaintext */ 9046 plaintext = ciphertext; 9047 9048 if (memcmp(plaintext, d_td->plaintext.data, 9049 d_td->plaintext.len - crc_data_len)) { 9050 printf("TestCase %s(%d) line %d: %s\n", 9051 __func__, i, __LINE__, "plaintext not as expected\n"); 9052 rte_hexdump(stdout, "expected", d_td->plaintext.data, 9053 d_td->plaintext.len); 9054 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 9055 ret = TEST_FAILED; 9056 goto on_err; 9057 } 9058 9059 on_err: 9060 rte_crypto_op_free(ut_params->op); 9061 ut_params->op = NULL; 9062 9063 if (ut_params->sec_session) 9064 rte_security_session_destroy(ctx, ut_params->sec_session); 9065 ut_params->sec_session = NULL; 9066 9067 rte_pktmbuf_free(ut_params->ibuf); 9068 ut_params->ibuf = NULL; 9069 9070 return ret; 9071 } 9072 9073 static int 9074 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td) 9075 { 9076 struct crypto_testsuite_params *ts_params = &testsuite_params; 9077 struct crypto_unittest_params *ut_params = &unittest_params; 9078 uint8_t *plaintext, *ciphertext; 9079 uint8_t *iv_ptr; 9080 int32_t cipher_len, crc_len; 9081 int ret = TEST_SUCCESS; 9082 9083 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 9084 rte_cryptodev_get_sec_ctx( 9085 ts_params->valid_devs[0]); 9086 9087 /* Verify the capabilities */ 9088 struct rte_security_capability_idx sec_cap_idx; 9089 const struct rte_security_capability *sec_cap; 9090 const struct rte_cryptodev_capabilities *crypto_cap; 9091 const struct rte_cryptodev_symmetric_capability *sym_cap; 9092 int j = 0; 9093 9094 sec_cap_idx.action = ut_params->type; 9095 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 9096 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9097 9098 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 9099 if (sec_cap == NULL) 9100 return TEST_SKIPPED; 9101 9102 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 9103 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 9104 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 9105 crypto_cap->sym.xform_type == 9106 RTE_CRYPTO_SYM_XFORM_CIPHER && 9107 crypto_cap->sym.cipher.algo == 9108 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 9109 sym_cap = &crypto_cap->sym; 9110 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 9111 d_td->key.len, 9112 d_td->iv.len) == 0) 9113 break; 9114 } 9115 } 9116 9117 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 9118 return TEST_SKIPPED; 9119 9120 /* Setup source mbuf payload */ 9121 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9122 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9123 rte_pktmbuf_tailroom(ut_params->ibuf)); 9124 9125 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 9126 d_td->plaintext.len); 9127 9128 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 9129 9130 /* Setup cipher session parameters */ 9131 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 9132 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 9133 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 9134 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 9135 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 9136 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 9137 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 9138 ut_params->cipher_xform.next = NULL; 9139 9140 /* Setup DOCSIS session parameters */ 9141 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 9142 9143 struct rte_security_session_conf sess_conf = { 9144 .action_type = ut_params->type, 9145 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 9146 .docsis = ut_params->docsis_xform, 9147 .crypto_xform = &ut_params->cipher_xform, 9148 }; 9149 9150 /* Create security session */ 9151 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 9152 ts_params->session_mpool, 9153 ts_params->session_priv_mpool); 9154 9155 if (!ut_params->sec_session) { 9156 printf("TestCase %s(%d) line %d: %s\n", 9157 __func__, i, __LINE__, "failed to allocate session"); 9158 ret = TEST_FAILED; 9159 goto on_err; 9160 } 9161 9162 /* Generate crypto op data structure */ 9163 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 9164 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 9165 if (!ut_params->op) { 9166 printf("TestCase %s(%d) line %d: %s\n", 9167 __func__, i, __LINE__, 9168 "failed to allocate security crypto operation"); 9169 ret = TEST_FAILED; 9170 goto on_err; 9171 } 9172 9173 /* Setup CRC operation parameters */ 9174 crc_len = d_td->plaintext.no_crc == false ? 9175 (d_td->plaintext.len - 9176 d_td->plaintext.crc_offset - 9177 RTE_ETHER_CRC_LEN) : 9178 0; 9179 crc_len = crc_len > 0 ? crc_len : 0; 9180 ut_params->op->sym->auth.data.length = crc_len; 9181 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 9182 9183 /* Setup cipher operation parameters */ 9184 cipher_len = d_td->plaintext.no_cipher == false ? 9185 (d_td->plaintext.len - 9186 d_td->plaintext.cipher_offset) : 9187 0; 9188 cipher_len = cipher_len > 0 ? cipher_len : 0; 9189 ut_params->op->sym->cipher.data.length = cipher_len; 9190 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 9191 9192 /* Setup cipher IV */ 9193 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 9194 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 9195 9196 /* Attach session to operation */ 9197 rte_security_attach_session(ut_params->op, ut_params->sec_session); 9198 9199 /* Set crypto operation mbufs */ 9200 ut_params->op->sym->m_src = ut_params->ibuf; 9201 ut_params->op->sym->m_dst = NULL; 9202 9203 /* Process crypto operation */ 9204 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 9205 NULL) { 9206 printf("TestCase %s(%d) line %d: %s\n", 9207 __func__, i, __LINE__, 9208 "failed to process security crypto op"); 9209 ret = TEST_FAILED; 9210 goto on_err; 9211 } 9212 9213 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 9214 printf("TestCase %s(%d) line %d: %s\n", 9215 __func__, i, __LINE__, "crypto op processing failed"); 9216 ret = TEST_FAILED; 9217 goto on_err; 9218 } 9219 9220 /* Validate ciphertext */ 9221 ciphertext = plaintext; 9222 9223 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 9224 printf("TestCase %s(%d) line %d: %s\n", 9225 __func__, i, __LINE__, "ciphertext not as expected\n"); 9226 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 9227 d_td->ciphertext.len); 9228 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 9229 ret = TEST_FAILED; 9230 goto on_err; 9231 } 9232 9233 on_err: 9234 rte_crypto_op_free(ut_params->op); 9235 ut_params->op = NULL; 9236 9237 if (ut_params->sec_session) 9238 rte_security_session_destroy(ctx, ut_params->sec_session); 9239 ut_params->sec_session = NULL; 9240 9241 rte_pktmbuf_free(ut_params->ibuf); 9242 ut_params->ibuf = NULL; 9243 9244 return ret; 9245 } 9246 9247 #define TEST_DOCSIS_COUNT(func) do { \ 9248 int ret = func; \ 9249 if (ret == TEST_SUCCESS) { \ 9250 printf("\t%2d)", n++); \ 9251 printf("+++++ PASSED:" #func"\n"); \ 9252 p++; \ 9253 } else if (ret == TEST_SKIPPED) { \ 9254 printf("\t%2d)", n++); \ 9255 printf("~~~~~ SKIPPED:" #func"\n"); \ 9256 s++; \ 9257 } else { \ 9258 printf("\t%2d)", n++); \ 9259 printf("----- FAILED:" #func"\n"); \ 9260 f++; \ 9261 } \ 9262 } while (0) 9263 9264 static int 9265 test_DOCSIS_PROTO_uplink_all(void) 9266 { 9267 int p = 0, s = 0, f = 0, n = 0; 9268 9269 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1)); 9270 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2)); 9271 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3)); 9272 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4)); 9273 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5)); 9274 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6)); 9275 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7)); 9276 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8)); 9277 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9)); 9278 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10)); 9279 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11)); 9280 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12)); 9281 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13)); 9282 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14)); 9283 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15)); 9284 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16)); 9285 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17)); 9286 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18)); 9287 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19)); 9288 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20)); 9289 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21)); 9290 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22)); 9291 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23)); 9292 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24)); 9293 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25)); 9294 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26)); 9295 9296 if (f) 9297 printf("## %s: %d passed out of %d (%d skipped)\n", 9298 __func__, p, n, s); 9299 9300 return f; 9301 }; 9302 9303 static int 9304 test_DOCSIS_PROTO_downlink_all(void) 9305 { 9306 int p = 0, s = 0, f = 0, n = 0; 9307 9308 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1)); 9309 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2)); 9310 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3)); 9311 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4)); 9312 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5)); 9313 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6)); 9314 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7)); 9315 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8)); 9316 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9)); 9317 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10)); 9318 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11)); 9319 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12)); 9320 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13)); 9321 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14)); 9322 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15)); 9323 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16)); 9324 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17)); 9325 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18)); 9326 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19)); 9327 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20)); 9328 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21)); 9329 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22)); 9330 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23)); 9331 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24)); 9332 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25)); 9333 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26)); 9334 9335 if (f) 9336 printf("## %s: %d passed out of %d (%d skipped)\n", 9337 __func__, p, n, s); 9338 9339 return f; 9340 }; 9341 9342 static int 9343 test_DOCSIS_PROTO_all(void) 9344 { 9345 struct crypto_testsuite_params *ts_params = &testsuite_params; 9346 struct crypto_unittest_params *ut_params = &unittest_params; 9347 struct rte_cryptodev_info dev_info; 9348 int status; 9349 9350 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9351 uint64_t feat_flags = dev_info.feature_flags; 9352 9353 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 9354 return TEST_SKIPPED; 9355 9356 /* Set action type */ 9357 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 9358 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 9359 gbl_action_type; 9360 9361 if (security_proto_supported(ut_params->type, 9362 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 9363 return TEST_SKIPPED; 9364 9365 status = test_DOCSIS_PROTO_uplink_all(); 9366 status += test_DOCSIS_PROTO_downlink_all(); 9367 9368 if (status) 9369 return TEST_FAILED; 9370 else 9371 return TEST_SUCCESS; 9372 } 9373 #endif 9374 9375 static int 9376 test_AES_GCM_authenticated_encryption_test_case_1(void) 9377 { 9378 return test_authenticated_encryption(&gcm_test_case_1); 9379 } 9380 9381 static int 9382 test_AES_GCM_authenticated_encryption_test_case_2(void) 9383 { 9384 return test_authenticated_encryption(&gcm_test_case_2); 9385 } 9386 9387 static int 9388 test_AES_GCM_authenticated_encryption_test_case_3(void) 9389 { 9390 return test_authenticated_encryption(&gcm_test_case_3); 9391 } 9392 9393 static int 9394 test_AES_GCM_authenticated_encryption_test_case_4(void) 9395 { 9396 return test_authenticated_encryption(&gcm_test_case_4); 9397 } 9398 9399 static int 9400 test_AES_GCM_authenticated_encryption_test_case_5(void) 9401 { 9402 return test_authenticated_encryption(&gcm_test_case_5); 9403 } 9404 9405 static int 9406 test_AES_GCM_authenticated_encryption_test_case_6(void) 9407 { 9408 return test_authenticated_encryption(&gcm_test_case_6); 9409 } 9410 9411 static int 9412 test_AES_GCM_authenticated_encryption_test_case_7(void) 9413 { 9414 return test_authenticated_encryption(&gcm_test_case_7); 9415 } 9416 9417 static int 9418 test_AES_GCM_authenticated_encryption_test_case_8(void) 9419 { 9420 return test_authenticated_encryption(&gcm_test_case_8); 9421 } 9422 9423 static int 9424 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 9425 { 9426 return test_authenticated_encryption(&gcm_J0_test_case_1); 9427 } 9428 9429 static int 9430 test_AES_GCM_auth_encryption_test_case_192_1(void) 9431 { 9432 return test_authenticated_encryption(&gcm_test_case_192_1); 9433 } 9434 9435 static int 9436 test_AES_GCM_auth_encryption_test_case_192_2(void) 9437 { 9438 return test_authenticated_encryption(&gcm_test_case_192_2); 9439 } 9440 9441 static int 9442 test_AES_GCM_auth_encryption_test_case_192_3(void) 9443 { 9444 return test_authenticated_encryption(&gcm_test_case_192_3); 9445 } 9446 9447 static int 9448 test_AES_GCM_auth_encryption_test_case_192_4(void) 9449 { 9450 return test_authenticated_encryption(&gcm_test_case_192_4); 9451 } 9452 9453 static int 9454 test_AES_GCM_auth_encryption_test_case_192_5(void) 9455 { 9456 return test_authenticated_encryption(&gcm_test_case_192_5); 9457 } 9458 9459 static int 9460 test_AES_GCM_auth_encryption_test_case_192_6(void) 9461 { 9462 return test_authenticated_encryption(&gcm_test_case_192_6); 9463 } 9464 9465 static int 9466 test_AES_GCM_auth_encryption_test_case_192_7(void) 9467 { 9468 return test_authenticated_encryption(&gcm_test_case_192_7); 9469 } 9470 9471 static int 9472 test_AES_GCM_auth_encryption_test_case_256_1(void) 9473 { 9474 return test_authenticated_encryption(&gcm_test_case_256_1); 9475 } 9476 9477 static int 9478 test_AES_GCM_auth_encryption_test_case_256_2(void) 9479 { 9480 return test_authenticated_encryption(&gcm_test_case_256_2); 9481 } 9482 9483 static int 9484 test_AES_GCM_auth_encryption_test_case_256_3(void) 9485 { 9486 return test_authenticated_encryption(&gcm_test_case_256_3); 9487 } 9488 9489 static int 9490 test_AES_GCM_auth_encryption_test_case_256_4(void) 9491 { 9492 return test_authenticated_encryption(&gcm_test_case_256_4); 9493 } 9494 9495 static int 9496 test_AES_GCM_auth_encryption_test_case_256_5(void) 9497 { 9498 return test_authenticated_encryption(&gcm_test_case_256_5); 9499 } 9500 9501 static int 9502 test_AES_GCM_auth_encryption_test_case_256_6(void) 9503 { 9504 return test_authenticated_encryption(&gcm_test_case_256_6); 9505 } 9506 9507 static int 9508 test_AES_GCM_auth_encryption_test_case_256_7(void) 9509 { 9510 return test_authenticated_encryption(&gcm_test_case_256_7); 9511 } 9512 9513 static int 9514 test_AES_GCM_auth_encryption_test_case_aad_1(void) 9515 { 9516 return test_authenticated_encryption(&gcm_test_case_aad_1); 9517 } 9518 9519 static int 9520 test_AES_GCM_auth_encryption_test_case_aad_2(void) 9521 { 9522 return test_authenticated_encryption(&gcm_test_case_aad_2); 9523 } 9524 9525 static int 9526 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 9527 { 9528 struct aead_test_data tdata; 9529 int res; 9530 9531 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9532 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9533 tdata.iv.data[0] += 1; 9534 res = test_authenticated_encryption(&tdata); 9535 if (res == TEST_SKIPPED) 9536 return res; 9537 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9538 return TEST_SUCCESS; 9539 } 9540 9541 static int 9542 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 9543 { 9544 struct aead_test_data tdata; 9545 int res; 9546 9547 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9548 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9549 tdata.plaintext.data[0] += 1; 9550 res = test_authenticated_encryption(&tdata); 9551 if (res == TEST_SKIPPED) 9552 return res; 9553 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9554 return TEST_SUCCESS; 9555 } 9556 9557 static int 9558 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 9559 { 9560 struct aead_test_data tdata; 9561 int res; 9562 9563 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9564 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9565 tdata.ciphertext.data[0] += 1; 9566 res = test_authenticated_encryption(&tdata); 9567 if (res == TEST_SKIPPED) 9568 return res; 9569 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9570 return TEST_SUCCESS; 9571 } 9572 9573 static int 9574 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 9575 { 9576 struct aead_test_data tdata; 9577 int res; 9578 9579 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9580 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9581 tdata.aad.len += 1; 9582 res = test_authenticated_encryption(&tdata); 9583 if (res == TEST_SKIPPED) 9584 return res; 9585 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9586 return TEST_SUCCESS; 9587 } 9588 9589 static int 9590 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 9591 { 9592 struct aead_test_data tdata; 9593 uint8_t aad[gcm_test_case_7.aad.len]; 9594 int res; 9595 9596 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9597 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9598 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9599 aad[0] += 1; 9600 tdata.aad.data = aad; 9601 res = test_authenticated_encryption(&tdata); 9602 if (res == TEST_SKIPPED) 9603 return res; 9604 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9605 return TEST_SUCCESS; 9606 } 9607 9608 static int 9609 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 9610 { 9611 struct aead_test_data tdata; 9612 int res; 9613 9614 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9615 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9616 tdata.auth_tag.data[0] += 1; 9617 res = test_authenticated_encryption(&tdata); 9618 if (res == TEST_SKIPPED) 9619 return res; 9620 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9621 return TEST_SUCCESS; 9622 } 9623 9624 static int 9625 test_authenticated_decryption(const struct aead_test_data *tdata) 9626 { 9627 struct crypto_testsuite_params *ts_params = &testsuite_params; 9628 struct crypto_unittest_params *ut_params = &unittest_params; 9629 9630 int retval; 9631 uint8_t *plaintext; 9632 uint32_t i; 9633 struct rte_cryptodev_info dev_info; 9634 9635 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9636 uint64_t feat_flags = dev_info.feature_flags; 9637 9638 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9639 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9640 printf("Device doesn't support RAW data-path APIs.\n"); 9641 return TEST_SKIPPED; 9642 } 9643 9644 /* Verify the capabilities */ 9645 struct rte_cryptodev_sym_capability_idx cap_idx; 9646 const struct rte_cryptodev_symmetric_capability *capability; 9647 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9648 cap_idx.algo.aead = tdata->algo; 9649 capability = rte_cryptodev_sym_capability_get( 9650 ts_params->valid_devs[0], &cap_idx); 9651 if (capability == NULL) 9652 return TEST_SKIPPED; 9653 if (rte_cryptodev_sym_capability_check_aead( 9654 capability, tdata->key.len, tdata->auth_tag.len, 9655 tdata->aad.len, tdata->iv.len)) 9656 return TEST_SKIPPED; 9657 9658 /* Create AEAD session */ 9659 retval = create_aead_session(ts_params->valid_devs[0], 9660 tdata->algo, 9661 RTE_CRYPTO_AEAD_OP_DECRYPT, 9662 tdata->key.data, tdata->key.len, 9663 tdata->aad.len, tdata->auth_tag.len, 9664 tdata->iv.len); 9665 if (retval < 0) 9666 return retval; 9667 9668 /* alloc mbuf and set payload */ 9669 if (tdata->aad.len > MBUF_SIZE) { 9670 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 9671 /* Populate full size of add data */ 9672 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 9673 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 9674 } else 9675 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9676 9677 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9678 rte_pktmbuf_tailroom(ut_params->ibuf)); 9679 9680 /* Create AEAD operation */ 9681 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 9682 if (retval < 0) 9683 return retval; 9684 9685 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9686 9687 ut_params->op->sym->m_src = ut_params->ibuf; 9688 9689 /* Process crypto operation */ 9690 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9691 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 9692 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9693 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 9694 ut_params->op, 0, 0, 0, 0); 9695 else 9696 TEST_ASSERT_NOT_NULL( 9697 process_crypto_request(ts_params->valid_devs[0], 9698 ut_params->op), "failed to process sym crypto op"); 9699 9700 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9701 "crypto op processing failed"); 9702 9703 if (ut_params->op->sym->m_dst) 9704 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 9705 uint8_t *); 9706 else 9707 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 9708 uint8_t *, 9709 ut_params->op->sym->cipher.data.offset); 9710 9711 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 9712 9713 /* Validate obuf */ 9714 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9715 plaintext, 9716 tdata->plaintext.data, 9717 tdata->plaintext.len, 9718 "Plaintext data not as expected"); 9719 9720 TEST_ASSERT_EQUAL(ut_params->op->status, 9721 RTE_CRYPTO_OP_STATUS_SUCCESS, 9722 "Authentication failed"); 9723 9724 return 0; 9725 } 9726 9727 static int 9728 test_AES_GCM_authenticated_decryption_test_case_1(void) 9729 { 9730 return test_authenticated_decryption(&gcm_test_case_1); 9731 } 9732 9733 static int 9734 test_AES_GCM_authenticated_decryption_test_case_2(void) 9735 { 9736 return test_authenticated_decryption(&gcm_test_case_2); 9737 } 9738 9739 static int 9740 test_AES_GCM_authenticated_decryption_test_case_3(void) 9741 { 9742 return test_authenticated_decryption(&gcm_test_case_3); 9743 } 9744 9745 static int 9746 test_AES_GCM_authenticated_decryption_test_case_4(void) 9747 { 9748 return test_authenticated_decryption(&gcm_test_case_4); 9749 } 9750 9751 static int 9752 test_AES_GCM_authenticated_decryption_test_case_5(void) 9753 { 9754 return test_authenticated_decryption(&gcm_test_case_5); 9755 } 9756 9757 static int 9758 test_AES_GCM_authenticated_decryption_test_case_6(void) 9759 { 9760 return test_authenticated_decryption(&gcm_test_case_6); 9761 } 9762 9763 static int 9764 test_AES_GCM_authenticated_decryption_test_case_7(void) 9765 { 9766 return test_authenticated_decryption(&gcm_test_case_7); 9767 } 9768 9769 static int 9770 test_AES_GCM_authenticated_decryption_test_case_8(void) 9771 { 9772 return test_authenticated_decryption(&gcm_test_case_8); 9773 } 9774 9775 static int 9776 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 9777 { 9778 return test_authenticated_decryption(&gcm_J0_test_case_1); 9779 } 9780 9781 static int 9782 test_AES_GCM_auth_decryption_test_case_192_1(void) 9783 { 9784 return test_authenticated_decryption(&gcm_test_case_192_1); 9785 } 9786 9787 static int 9788 test_AES_GCM_auth_decryption_test_case_192_2(void) 9789 { 9790 return test_authenticated_decryption(&gcm_test_case_192_2); 9791 } 9792 9793 static int 9794 test_AES_GCM_auth_decryption_test_case_192_3(void) 9795 { 9796 return test_authenticated_decryption(&gcm_test_case_192_3); 9797 } 9798 9799 static int 9800 test_AES_GCM_auth_decryption_test_case_192_4(void) 9801 { 9802 return test_authenticated_decryption(&gcm_test_case_192_4); 9803 } 9804 9805 static int 9806 test_AES_GCM_auth_decryption_test_case_192_5(void) 9807 { 9808 return test_authenticated_decryption(&gcm_test_case_192_5); 9809 } 9810 9811 static int 9812 test_AES_GCM_auth_decryption_test_case_192_6(void) 9813 { 9814 return test_authenticated_decryption(&gcm_test_case_192_6); 9815 } 9816 9817 static int 9818 test_AES_GCM_auth_decryption_test_case_192_7(void) 9819 { 9820 return test_authenticated_decryption(&gcm_test_case_192_7); 9821 } 9822 9823 static int 9824 test_AES_GCM_auth_decryption_test_case_256_1(void) 9825 { 9826 return test_authenticated_decryption(&gcm_test_case_256_1); 9827 } 9828 9829 static int 9830 test_AES_GCM_auth_decryption_test_case_256_2(void) 9831 { 9832 return test_authenticated_decryption(&gcm_test_case_256_2); 9833 } 9834 9835 static int 9836 test_AES_GCM_auth_decryption_test_case_256_3(void) 9837 { 9838 return test_authenticated_decryption(&gcm_test_case_256_3); 9839 } 9840 9841 static int 9842 test_AES_GCM_auth_decryption_test_case_256_4(void) 9843 { 9844 return test_authenticated_decryption(&gcm_test_case_256_4); 9845 } 9846 9847 static int 9848 test_AES_GCM_auth_decryption_test_case_256_5(void) 9849 { 9850 return test_authenticated_decryption(&gcm_test_case_256_5); 9851 } 9852 9853 static int 9854 test_AES_GCM_auth_decryption_test_case_256_6(void) 9855 { 9856 return test_authenticated_decryption(&gcm_test_case_256_6); 9857 } 9858 9859 static int 9860 test_AES_GCM_auth_decryption_test_case_256_7(void) 9861 { 9862 return test_authenticated_decryption(&gcm_test_case_256_7); 9863 } 9864 9865 static int 9866 test_AES_GCM_auth_decryption_test_case_aad_1(void) 9867 { 9868 return test_authenticated_decryption(&gcm_test_case_aad_1); 9869 } 9870 9871 static int 9872 test_AES_GCM_auth_decryption_test_case_aad_2(void) 9873 { 9874 return test_authenticated_decryption(&gcm_test_case_aad_2); 9875 } 9876 9877 static int 9878 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 9879 { 9880 struct aead_test_data tdata; 9881 int res; 9882 9883 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9884 tdata.iv.data[0] += 1; 9885 res = test_authenticated_decryption(&tdata); 9886 if (res == TEST_SKIPPED) 9887 return res; 9888 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9889 return TEST_SUCCESS; 9890 } 9891 9892 static int 9893 test_AES_GCM_auth_decryption_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_decryption(&tdata); 9902 if (res == TEST_SKIPPED) 9903 return res; 9904 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9905 return TEST_SUCCESS; 9906 } 9907 9908 static int 9909 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 9910 { 9911 struct aead_test_data tdata; 9912 int res; 9913 9914 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9915 tdata.ciphertext.data[0] += 1; 9916 res = test_authenticated_decryption(&tdata); 9917 if (res == TEST_SKIPPED) 9918 return res; 9919 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9920 return TEST_SUCCESS; 9921 } 9922 9923 static int 9924 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 9925 { 9926 struct aead_test_data tdata; 9927 int res; 9928 9929 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9930 tdata.aad.len += 1; 9931 res = test_authenticated_decryption(&tdata); 9932 if (res == TEST_SKIPPED) 9933 return res; 9934 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9935 return TEST_SUCCESS; 9936 } 9937 9938 static int 9939 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 9940 { 9941 struct aead_test_data tdata; 9942 uint8_t aad[gcm_test_case_7.aad.len]; 9943 int res; 9944 9945 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9946 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9947 aad[0] += 1; 9948 tdata.aad.data = aad; 9949 res = test_authenticated_decryption(&tdata); 9950 if (res == TEST_SKIPPED) 9951 return res; 9952 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9953 return TEST_SUCCESS; 9954 } 9955 9956 static int 9957 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 9958 { 9959 struct aead_test_data tdata; 9960 int res; 9961 9962 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9963 tdata.auth_tag.data[0] += 1; 9964 res = test_authenticated_decryption(&tdata); 9965 if (res == TEST_SKIPPED) 9966 return res; 9967 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 9968 return TEST_SUCCESS; 9969 } 9970 9971 static int 9972 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 9973 { 9974 struct crypto_testsuite_params *ts_params = &testsuite_params; 9975 struct crypto_unittest_params *ut_params = &unittest_params; 9976 9977 int retval; 9978 uint8_t *ciphertext, *auth_tag; 9979 uint16_t plaintext_pad_len; 9980 9981 /* Verify the capabilities */ 9982 struct rte_cryptodev_sym_capability_idx cap_idx; 9983 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9984 cap_idx.algo.aead = tdata->algo; 9985 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9986 &cap_idx) == NULL) 9987 return TEST_SKIPPED; 9988 9989 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9990 return TEST_SKIPPED; 9991 9992 /* not supported with CPU crypto */ 9993 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9994 return TEST_SKIPPED; 9995 9996 /* Create AEAD session */ 9997 retval = create_aead_session(ts_params->valid_devs[0], 9998 tdata->algo, 9999 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10000 tdata->key.data, tdata->key.len, 10001 tdata->aad.len, tdata->auth_tag.len, 10002 tdata->iv.len); 10003 if (retval < 0) 10004 return retval; 10005 10006 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10007 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10008 10009 /* clear mbuf payload */ 10010 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10011 rte_pktmbuf_tailroom(ut_params->ibuf)); 10012 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10013 rte_pktmbuf_tailroom(ut_params->obuf)); 10014 10015 /* Create AEAD operation */ 10016 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10017 if (retval < 0) 10018 return retval; 10019 10020 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10021 10022 ut_params->op->sym->m_src = ut_params->ibuf; 10023 ut_params->op->sym->m_dst = ut_params->obuf; 10024 10025 /* Process crypto operation */ 10026 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10027 ut_params->op), "failed to process sym crypto op"); 10028 10029 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10030 "crypto op processing failed"); 10031 10032 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10033 10034 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10035 ut_params->op->sym->cipher.data.offset); 10036 auth_tag = ciphertext + plaintext_pad_len; 10037 10038 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10039 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10040 10041 /* Validate obuf */ 10042 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10043 ciphertext, 10044 tdata->ciphertext.data, 10045 tdata->ciphertext.len, 10046 "Ciphertext data not as expected"); 10047 10048 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10049 auth_tag, 10050 tdata->auth_tag.data, 10051 tdata->auth_tag.len, 10052 "Generated auth tag not as expected"); 10053 10054 return 0; 10055 10056 } 10057 10058 static int 10059 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 10060 { 10061 return test_authenticated_encryption_oop(&gcm_test_case_5); 10062 } 10063 10064 static int 10065 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 10066 { 10067 struct crypto_testsuite_params *ts_params = &testsuite_params; 10068 struct crypto_unittest_params *ut_params = &unittest_params; 10069 10070 int retval; 10071 uint8_t *plaintext; 10072 10073 /* Verify the capabilities */ 10074 struct rte_cryptodev_sym_capability_idx cap_idx; 10075 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10076 cap_idx.algo.aead = tdata->algo; 10077 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10078 &cap_idx) == NULL) 10079 return TEST_SKIPPED; 10080 10081 /* not supported with CPU crypto and raw data-path APIs*/ 10082 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 10083 global_api_test_type == CRYPTODEV_RAW_API_TEST) 10084 return TEST_SKIPPED; 10085 10086 /* Create AEAD session */ 10087 retval = create_aead_session(ts_params->valid_devs[0], 10088 tdata->algo, 10089 RTE_CRYPTO_AEAD_OP_DECRYPT, 10090 tdata->key.data, tdata->key.len, 10091 tdata->aad.len, tdata->auth_tag.len, 10092 tdata->iv.len); 10093 if (retval < 0) 10094 return retval; 10095 10096 /* alloc mbuf and set payload */ 10097 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10098 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10099 10100 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10101 rte_pktmbuf_tailroom(ut_params->ibuf)); 10102 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 10103 rte_pktmbuf_tailroom(ut_params->obuf)); 10104 10105 /* Create AEAD operation */ 10106 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10107 if (retval < 0) 10108 return retval; 10109 10110 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10111 10112 ut_params->op->sym->m_src = ut_params->ibuf; 10113 ut_params->op->sym->m_dst = ut_params->obuf; 10114 10115 /* Process crypto operation */ 10116 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10117 ut_params->op), "failed to process sym crypto op"); 10118 10119 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10120 "crypto op processing failed"); 10121 10122 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 10123 ut_params->op->sym->cipher.data.offset); 10124 10125 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10126 10127 /* Validate obuf */ 10128 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10129 plaintext, 10130 tdata->plaintext.data, 10131 tdata->plaintext.len, 10132 "Plaintext data not as expected"); 10133 10134 TEST_ASSERT_EQUAL(ut_params->op->status, 10135 RTE_CRYPTO_OP_STATUS_SUCCESS, 10136 "Authentication failed"); 10137 return 0; 10138 } 10139 10140 static int 10141 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 10142 { 10143 return test_authenticated_decryption_oop(&gcm_test_case_5); 10144 } 10145 10146 static int 10147 test_authenticated_encryption_sessionless( 10148 const struct aead_test_data *tdata) 10149 { 10150 struct crypto_testsuite_params *ts_params = &testsuite_params; 10151 struct crypto_unittest_params *ut_params = &unittest_params; 10152 10153 int retval; 10154 uint8_t *ciphertext, *auth_tag; 10155 uint16_t plaintext_pad_len; 10156 uint8_t key[tdata->key.len + 1]; 10157 struct rte_cryptodev_info dev_info; 10158 10159 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10160 uint64_t feat_flags = dev_info.feature_flags; 10161 10162 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10163 printf("Device doesn't support Sessionless ops.\n"); 10164 return TEST_SKIPPED; 10165 } 10166 10167 /* not supported with CPU crypto */ 10168 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10169 return TEST_SKIPPED; 10170 10171 /* Verify the capabilities */ 10172 struct rte_cryptodev_sym_capability_idx cap_idx; 10173 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10174 cap_idx.algo.aead = tdata->algo; 10175 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10176 &cap_idx) == NULL) 10177 return TEST_SKIPPED; 10178 10179 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10180 10181 /* clear mbuf payload */ 10182 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10183 rte_pktmbuf_tailroom(ut_params->ibuf)); 10184 10185 /* Create AEAD operation */ 10186 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 10187 if (retval < 0) 10188 return retval; 10189 10190 /* Create GCM xform */ 10191 memcpy(key, tdata->key.data, tdata->key.len); 10192 retval = create_aead_xform(ut_params->op, 10193 tdata->algo, 10194 RTE_CRYPTO_AEAD_OP_ENCRYPT, 10195 key, tdata->key.len, 10196 tdata->aad.len, tdata->auth_tag.len, 10197 tdata->iv.len); 10198 if (retval < 0) 10199 return retval; 10200 10201 ut_params->op->sym->m_src = ut_params->ibuf; 10202 10203 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10204 RTE_CRYPTO_OP_SESSIONLESS, 10205 "crypto op session type not sessionless"); 10206 10207 /* Process crypto operation */ 10208 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 10209 ut_params->op), "failed to process sym crypto op"); 10210 10211 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10212 10213 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10214 "crypto op status not success"); 10215 10216 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10217 10218 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10219 ut_params->op->sym->cipher.data.offset); 10220 auth_tag = ciphertext + plaintext_pad_len; 10221 10222 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 10223 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 10224 10225 /* Validate obuf */ 10226 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10227 ciphertext, 10228 tdata->ciphertext.data, 10229 tdata->ciphertext.len, 10230 "Ciphertext data not as expected"); 10231 10232 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10233 auth_tag, 10234 tdata->auth_tag.data, 10235 tdata->auth_tag.len, 10236 "Generated auth tag not as expected"); 10237 10238 return 0; 10239 10240 } 10241 10242 static int 10243 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 10244 { 10245 return test_authenticated_encryption_sessionless( 10246 &gcm_test_case_5); 10247 } 10248 10249 static int 10250 test_authenticated_decryption_sessionless( 10251 const struct aead_test_data *tdata) 10252 { 10253 struct crypto_testsuite_params *ts_params = &testsuite_params; 10254 struct crypto_unittest_params *ut_params = &unittest_params; 10255 10256 int retval; 10257 uint8_t *plaintext; 10258 uint8_t key[tdata->key.len + 1]; 10259 struct rte_cryptodev_info dev_info; 10260 10261 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10262 uint64_t feat_flags = dev_info.feature_flags; 10263 10264 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 10265 printf("Device doesn't support Sessionless ops.\n"); 10266 return TEST_SKIPPED; 10267 } 10268 10269 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10270 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10271 printf("Device doesn't support RAW data-path APIs.\n"); 10272 return TEST_SKIPPED; 10273 } 10274 10275 /* not supported with CPU crypto */ 10276 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10277 return TEST_SKIPPED; 10278 10279 /* Verify the capabilities */ 10280 struct rte_cryptodev_sym_capability_idx cap_idx; 10281 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 10282 cap_idx.algo.aead = tdata->algo; 10283 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10284 &cap_idx) == NULL) 10285 return TEST_SKIPPED; 10286 10287 /* alloc mbuf and set payload */ 10288 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10289 10290 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10291 rte_pktmbuf_tailroom(ut_params->ibuf)); 10292 10293 /* Create AEAD operation */ 10294 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 10295 if (retval < 0) 10296 return retval; 10297 10298 /* Create AEAD xform */ 10299 memcpy(key, tdata->key.data, tdata->key.len); 10300 retval = create_aead_xform(ut_params->op, 10301 tdata->algo, 10302 RTE_CRYPTO_AEAD_OP_DECRYPT, 10303 key, tdata->key.len, 10304 tdata->aad.len, tdata->auth_tag.len, 10305 tdata->iv.len); 10306 if (retval < 0) 10307 return retval; 10308 10309 ut_params->op->sym->m_src = ut_params->ibuf; 10310 10311 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 10312 RTE_CRYPTO_OP_SESSIONLESS, 10313 "crypto op session type not sessionless"); 10314 10315 /* Process crypto operation */ 10316 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10317 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10318 ut_params->op, 0, 0, 0, 0); 10319 else 10320 TEST_ASSERT_NOT_NULL(process_crypto_request( 10321 ts_params->valid_devs[0], ut_params->op), 10322 "failed to process sym crypto op"); 10323 10324 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 10325 10326 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10327 "crypto op status not success"); 10328 10329 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 10330 ut_params->op->sym->cipher.data.offset); 10331 10332 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 10333 10334 /* Validate obuf */ 10335 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10336 plaintext, 10337 tdata->plaintext.data, 10338 tdata->plaintext.len, 10339 "Plaintext data not as expected"); 10340 10341 TEST_ASSERT_EQUAL(ut_params->op->status, 10342 RTE_CRYPTO_OP_STATUS_SUCCESS, 10343 "Authentication failed"); 10344 return 0; 10345 } 10346 10347 static int 10348 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 10349 { 10350 return test_authenticated_decryption_sessionless( 10351 &gcm_test_case_5); 10352 } 10353 10354 static int 10355 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 10356 { 10357 return test_authenticated_encryption(&ccm_test_case_128_1); 10358 } 10359 10360 static int 10361 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 10362 { 10363 return test_authenticated_encryption(&ccm_test_case_128_2); 10364 } 10365 10366 static int 10367 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 10368 { 10369 return test_authenticated_encryption(&ccm_test_case_128_3); 10370 } 10371 10372 static int 10373 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 10374 { 10375 return test_authenticated_decryption(&ccm_test_case_128_1); 10376 } 10377 10378 static int 10379 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 10380 { 10381 return test_authenticated_decryption(&ccm_test_case_128_2); 10382 } 10383 10384 static int 10385 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 10386 { 10387 return test_authenticated_decryption(&ccm_test_case_128_3); 10388 } 10389 10390 static int 10391 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 10392 { 10393 return test_authenticated_encryption(&ccm_test_case_192_1); 10394 } 10395 10396 static int 10397 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 10398 { 10399 return test_authenticated_encryption(&ccm_test_case_192_2); 10400 } 10401 10402 static int 10403 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 10404 { 10405 return test_authenticated_encryption(&ccm_test_case_192_3); 10406 } 10407 10408 static int 10409 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 10410 { 10411 return test_authenticated_decryption(&ccm_test_case_192_1); 10412 } 10413 10414 static int 10415 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 10416 { 10417 return test_authenticated_decryption(&ccm_test_case_192_2); 10418 } 10419 10420 static int 10421 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 10422 { 10423 return test_authenticated_decryption(&ccm_test_case_192_3); 10424 } 10425 10426 static int 10427 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 10428 { 10429 return test_authenticated_encryption(&ccm_test_case_256_1); 10430 } 10431 10432 static int 10433 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 10434 { 10435 return test_authenticated_encryption(&ccm_test_case_256_2); 10436 } 10437 10438 static int 10439 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 10440 { 10441 return test_authenticated_encryption(&ccm_test_case_256_3); 10442 } 10443 10444 static int 10445 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 10446 { 10447 return test_authenticated_decryption(&ccm_test_case_256_1); 10448 } 10449 10450 static int 10451 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 10452 { 10453 return test_authenticated_decryption(&ccm_test_case_256_2); 10454 } 10455 10456 static int 10457 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 10458 { 10459 return test_authenticated_decryption(&ccm_test_case_256_3); 10460 } 10461 10462 static int 10463 test_stats(void) 10464 { 10465 struct crypto_testsuite_params *ts_params = &testsuite_params; 10466 struct rte_cryptodev_stats stats; 10467 10468 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10469 return TEST_SKIPPED; 10470 10471 /* Verify the capabilities */ 10472 struct rte_cryptodev_sym_capability_idx cap_idx; 10473 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10474 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 10475 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10476 &cap_idx) == NULL) 10477 return TEST_SKIPPED; 10478 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10479 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10480 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10481 &cap_idx) == NULL) 10482 return TEST_SKIPPED; 10483 10484 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 10485 == -ENOTSUP) 10486 return TEST_SKIPPED; 10487 10488 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10489 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 10490 &stats) == -ENODEV), 10491 "rte_cryptodev_stats_get invalid dev failed"); 10492 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 10493 "rte_cryptodev_stats_get invalid Param failed"); 10494 10495 /* Test expected values */ 10496 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 10497 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10498 &stats), 10499 "rte_cryptodev_stats_get failed"); 10500 TEST_ASSERT((stats.enqueued_count == 1), 10501 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10502 TEST_ASSERT((stats.dequeued_count == 1), 10503 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10504 TEST_ASSERT((stats.enqueue_err_count == 0), 10505 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10506 TEST_ASSERT((stats.dequeue_err_count == 0), 10507 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10508 10509 /* invalid device but should ignore and not reset device stats*/ 10510 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 10511 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10512 &stats), 10513 "rte_cryptodev_stats_get failed"); 10514 TEST_ASSERT((stats.enqueued_count == 1), 10515 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10516 10517 /* check that a valid reset clears stats */ 10518 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10519 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10520 &stats), 10521 "rte_cryptodev_stats_get failed"); 10522 TEST_ASSERT((stats.enqueued_count == 0), 10523 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10524 TEST_ASSERT((stats.dequeued_count == 0), 10525 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10526 10527 return TEST_SUCCESS; 10528 } 10529 10530 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 10531 struct crypto_unittest_params *ut_params, 10532 enum rte_crypto_auth_operation op, 10533 const struct HMAC_MD5_vector *test_case) 10534 { 10535 uint8_t key[64]; 10536 10537 memcpy(key, test_case->key.data, test_case->key.len); 10538 10539 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10540 ut_params->auth_xform.next = NULL; 10541 ut_params->auth_xform.auth.op = op; 10542 10543 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 10544 10545 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 10546 ut_params->auth_xform.auth.key.length = test_case->key.len; 10547 ut_params->auth_xform.auth.key.data = key; 10548 10549 ut_params->sess = rte_cryptodev_sym_session_create( 10550 ts_params->session_mpool); 10551 10552 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10553 ut_params->sess, &ut_params->auth_xform, 10554 ts_params->session_priv_mpool); 10555 10556 if (ut_params->sess == NULL) 10557 return TEST_FAILED; 10558 10559 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10560 10561 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10562 rte_pktmbuf_tailroom(ut_params->ibuf)); 10563 10564 return 0; 10565 } 10566 10567 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 10568 const struct HMAC_MD5_vector *test_case, 10569 uint8_t **plaintext) 10570 { 10571 uint16_t plaintext_pad_len; 10572 10573 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10574 10575 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10576 16); 10577 10578 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10579 plaintext_pad_len); 10580 memcpy(*plaintext, test_case->plaintext.data, 10581 test_case->plaintext.len); 10582 10583 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10584 ut_params->ibuf, MD5_DIGEST_LEN); 10585 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10586 "no room to append digest"); 10587 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10588 ut_params->ibuf, plaintext_pad_len); 10589 10590 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10591 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 10592 test_case->auth_tag.len); 10593 } 10594 10595 sym_op->auth.data.offset = 0; 10596 sym_op->auth.data.length = test_case->plaintext.len; 10597 10598 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10599 ut_params->op->sym->m_src = ut_params->ibuf; 10600 10601 return 0; 10602 } 10603 10604 static int 10605 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 10606 { 10607 uint16_t plaintext_pad_len; 10608 uint8_t *plaintext, *auth_tag; 10609 10610 struct crypto_testsuite_params *ts_params = &testsuite_params; 10611 struct crypto_unittest_params *ut_params = &unittest_params; 10612 struct rte_cryptodev_info dev_info; 10613 10614 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10615 uint64_t feat_flags = dev_info.feature_flags; 10616 10617 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10618 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10619 printf("Device doesn't support RAW data-path APIs.\n"); 10620 return TEST_SKIPPED; 10621 } 10622 10623 /* Verify the capabilities */ 10624 struct rte_cryptodev_sym_capability_idx cap_idx; 10625 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10626 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10627 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10628 &cap_idx) == NULL) 10629 return TEST_SKIPPED; 10630 10631 if (MD5_HMAC_create_session(ts_params, ut_params, 10632 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 10633 return TEST_FAILED; 10634 10635 /* Generate Crypto op data structure */ 10636 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10637 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10638 TEST_ASSERT_NOT_NULL(ut_params->op, 10639 "Failed to allocate symmetric crypto operation struct"); 10640 10641 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10642 16); 10643 10644 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10645 return TEST_FAILED; 10646 10647 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10648 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10649 ut_params->op); 10650 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10651 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10652 ut_params->op, 0, 1, 0, 0); 10653 else 10654 TEST_ASSERT_NOT_NULL( 10655 process_crypto_request(ts_params->valid_devs[0], 10656 ut_params->op), 10657 "failed to process sym crypto op"); 10658 10659 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10660 "crypto op processing failed"); 10661 10662 if (ut_params->op->sym->m_dst) { 10663 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 10664 uint8_t *, plaintext_pad_len); 10665 } else { 10666 auth_tag = plaintext + plaintext_pad_len; 10667 } 10668 10669 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10670 auth_tag, 10671 test_case->auth_tag.data, 10672 test_case->auth_tag.len, 10673 "HMAC_MD5 generated tag not as expected"); 10674 10675 return TEST_SUCCESS; 10676 } 10677 10678 static int 10679 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 10680 { 10681 uint8_t *plaintext; 10682 10683 struct crypto_testsuite_params *ts_params = &testsuite_params; 10684 struct crypto_unittest_params *ut_params = &unittest_params; 10685 struct rte_cryptodev_info dev_info; 10686 10687 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10688 uint64_t feat_flags = dev_info.feature_flags; 10689 10690 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10691 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10692 printf("Device doesn't support RAW data-path APIs.\n"); 10693 return TEST_SKIPPED; 10694 } 10695 10696 /* Verify the capabilities */ 10697 struct rte_cryptodev_sym_capability_idx cap_idx; 10698 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10699 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10700 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10701 &cap_idx) == NULL) 10702 return TEST_SKIPPED; 10703 10704 if (MD5_HMAC_create_session(ts_params, ut_params, 10705 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 10706 return TEST_FAILED; 10707 } 10708 10709 /* Generate Crypto op data structure */ 10710 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10711 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10712 TEST_ASSERT_NOT_NULL(ut_params->op, 10713 "Failed to allocate symmetric crypto operation struct"); 10714 10715 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10716 return TEST_FAILED; 10717 10718 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10719 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10720 ut_params->op); 10721 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10722 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10723 ut_params->op, 0, 1, 0, 0); 10724 else 10725 TEST_ASSERT_NOT_NULL( 10726 process_crypto_request(ts_params->valid_devs[0], 10727 ut_params->op), 10728 "failed to process sym crypto op"); 10729 10730 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10731 "HMAC_MD5 crypto op processing failed"); 10732 10733 return TEST_SUCCESS; 10734 } 10735 10736 static int 10737 test_MD5_HMAC_generate_case_1(void) 10738 { 10739 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 10740 } 10741 10742 static int 10743 test_MD5_HMAC_verify_case_1(void) 10744 { 10745 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 10746 } 10747 10748 static int 10749 test_MD5_HMAC_generate_case_2(void) 10750 { 10751 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 10752 } 10753 10754 static int 10755 test_MD5_HMAC_verify_case_2(void) 10756 { 10757 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 10758 } 10759 10760 static int 10761 test_multi_session(void) 10762 { 10763 struct crypto_testsuite_params *ts_params = &testsuite_params; 10764 struct crypto_unittest_params *ut_params = &unittest_params; 10765 10766 struct rte_cryptodev_info dev_info; 10767 struct rte_cryptodev_sym_session **sessions; 10768 10769 uint16_t i; 10770 10771 /* Verify the capabilities */ 10772 struct rte_cryptodev_sym_capability_idx cap_idx; 10773 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10774 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10775 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10776 &cap_idx) == NULL) 10777 return TEST_SKIPPED; 10778 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10779 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10780 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10781 &cap_idx) == NULL) 10782 return TEST_SKIPPED; 10783 10784 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 10785 aes_cbc_key, hmac_sha512_key); 10786 10787 10788 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10789 10790 sessions = rte_malloc(NULL, 10791 sizeof(struct rte_cryptodev_sym_session *) * 10792 (MAX_NB_SESSIONS + 1), 0); 10793 10794 /* Create multiple crypto sessions*/ 10795 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10796 10797 sessions[i] = rte_cryptodev_sym_session_create( 10798 ts_params->session_mpool); 10799 10800 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10801 sessions[i], &ut_params->auth_xform, 10802 ts_params->session_priv_mpool); 10803 TEST_ASSERT_NOT_NULL(sessions[i], 10804 "Session creation failed at session number %u", 10805 i); 10806 10807 /* Attempt to send a request on each session */ 10808 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 10809 sessions[i], 10810 ut_params, 10811 ts_params, 10812 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 10813 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 10814 aes_cbc_iv), 10815 "Failed to perform decrypt on request number %u.", i); 10816 /* free crypto operation structure */ 10817 if (ut_params->op) 10818 rte_crypto_op_free(ut_params->op); 10819 10820 /* 10821 * free mbuf - both obuf and ibuf are usually the same, 10822 * so check if they point at the same address is necessary, 10823 * to avoid freeing the mbuf twice. 10824 */ 10825 if (ut_params->obuf) { 10826 rte_pktmbuf_free(ut_params->obuf); 10827 if (ut_params->ibuf == ut_params->obuf) 10828 ut_params->ibuf = 0; 10829 ut_params->obuf = 0; 10830 } 10831 if (ut_params->ibuf) { 10832 rte_pktmbuf_free(ut_params->ibuf); 10833 ut_params->ibuf = 0; 10834 } 10835 } 10836 10837 sessions[i] = NULL; 10838 /* Next session create should fail */ 10839 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10840 sessions[i], &ut_params->auth_xform, 10841 ts_params->session_priv_mpool); 10842 TEST_ASSERT_NULL(sessions[i], 10843 "Session creation succeeded unexpectedly!"); 10844 10845 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10846 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10847 sessions[i]); 10848 rte_cryptodev_sym_session_free(sessions[i]); 10849 } 10850 10851 rte_free(sessions); 10852 10853 return TEST_SUCCESS; 10854 } 10855 10856 struct multi_session_params { 10857 struct crypto_unittest_params ut_params; 10858 uint8_t *cipher_key; 10859 uint8_t *hmac_key; 10860 const uint8_t *cipher; 10861 const uint8_t *digest; 10862 uint8_t *iv; 10863 }; 10864 10865 #define MB_SESSION_NUMBER 3 10866 10867 static int 10868 test_multi_session_random_usage(void) 10869 { 10870 struct crypto_testsuite_params *ts_params = &testsuite_params; 10871 struct rte_cryptodev_info dev_info; 10872 struct rte_cryptodev_sym_session **sessions; 10873 uint32_t i, j; 10874 struct multi_session_params ut_paramz[] = { 10875 10876 { 10877 .cipher_key = ms_aes_cbc_key0, 10878 .hmac_key = ms_hmac_key0, 10879 .cipher = ms_aes_cbc_cipher0, 10880 .digest = ms_hmac_digest0, 10881 .iv = ms_aes_cbc_iv0 10882 }, 10883 { 10884 .cipher_key = ms_aes_cbc_key1, 10885 .hmac_key = ms_hmac_key1, 10886 .cipher = ms_aes_cbc_cipher1, 10887 .digest = ms_hmac_digest1, 10888 .iv = ms_aes_cbc_iv1 10889 }, 10890 { 10891 .cipher_key = ms_aes_cbc_key2, 10892 .hmac_key = ms_hmac_key2, 10893 .cipher = ms_aes_cbc_cipher2, 10894 .digest = ms_hmac_digest2, 10895 .iv = ms_aes_cbc_iv2 10896 }, 10897 10898 }; 10899 10900 /* Verify the capabilities */ 10901 struct rte_cryptodev_sym_capability_idx cap_idx; 10902 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10903 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10904 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10905 &cap_idx) == NULL) 10906 return TEST_SKIPPED; 10907 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10908 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10909 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10910 &cap_idx) == NULL) 10911 return TEST_SKIPPED; 10912 10913 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10914 10915 sessions = rte_malloc(NULL, 10916 (sizeof(struct rte_cryptodev_sym_session *) 10917 * MAX_NB_SESSIONS) + 1, 0); 10918 10919 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10920 sessions[i] = rte_cryptodev_sym_session_create( 10921 ts_params->session_mpool); 10922 10923 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 10924 sizeof(struct crypto_unittest_params)); 10925 10926 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 10927 &ut_paramz[i].ut_params, 10928 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 10929 10930 /* Create multiple crypto sessions*/ 10931 rte_cryptodev_sym_session_init( 10932 ts_params->valid_devs[0], 10933 sessions[i], 10934 &ut_paramz[i].ut_params.auth_xform, 10935 ts_params->session_priv_mpool); 10936 10937 TEST_ASSERT_NOT_NULL(sessions[i], 10938 "Session creation failed at session number %u", 10939 i); 10940 10941 } 10942 10943 srand(time(NULL)); 10944 for (i = 0; i < 40000; i++) { 10945 10946 j = rand() % MB_SESSION_NUMBER; 10947 10948 TEST_ASSERT_SUCCESS( 10949 test_AES_CBC_HMAC_SHA512_decrypt_perform( 10950 sessions[j], 10951 &ut_paramz[j].ut_params, 10952 ts_params, ut_paramz[j].cipher, 10953 ut_paramz[j].digest, 10954 ut_paramz[j].iv), 10955 "Failed to perform decrypt on request number %u.", i); 10956 10957 if (ut_paramz[j].ut_params.op) 10958 rte_crypto_op_free(ut_paramz[j].ut_params.op); 10959 10960 /* 10961 * free mbuf - both obuf and ibuf are usually the same, 10962 * so check if they point at the same address is necessary, 10963 * to avoid freeing the mbuf twice. 10964 */ 10965 if (ut_paramz[j].ut_params.obuf) { 10966 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 10967 if (ut_paramz[j].ut_params.ibuf 10968 == ut_paramz[j].ut_params.obuf) 10969 ut_paramz[j].ut_params.ibuf = 0; 10970 ut_paramz[j].ut_params.obuf = 0; 10971 } 10972 if (ut_paramz[j].ut_params.ibuf) { 10973 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 10974 ut_paramz[j].ut_params.ibuf = 0; 10975 } 10976 } 10977 10978 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10979 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10980 sessions[i]); 10981 rte_cryptodev_sym_session_free(sessions[i]); 10982 } 10983 10984 rte_free(sessions); 10985 10986 return TEST_SUCCESS; 10987 } 10988 10989 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 10990 0xab, 0xab, 0xab, 0xab, 10991 0xab, 0xab, 0xab, 0xab, 10992 0xab, 0xab, 0xab, 0xab}; 10993 10994 static int 10995 test_null_invalid_operation(void) 10996 { 10997 struct crypto_testsuite_params *ts_params = &testsuite_params; 10998 struct crypto_unittest_params *ut_params = &unittest_params; 10999 int ret; 11000 11001 /* This test is for NULL PMD only */ 11002 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11003 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11004 return TEST_SKIPPED; 11005 11006 /* Setup Cipher Parameters */ 11007 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11008 ut_params->cipher_xform.next = NULL; 11009 11010 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 11011 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11012 11013 ut_params->sess = rte_cryptodev_sym_session_create( 11014 ts_params->session_mpool); 11015 11016 /* Create Crypto session*/ 11017 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11018 ut_params->sess, &ut_params->cipher_xform, 11019 ts_params->session_priv_mpool); 11020 TEST_ASSERT(ret < 0, 11021 "Session creation succeeded unexpectedly"); 11022 11023 11024 /* Setup HMAC Parameters */ 11025 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11026 ut_params->auth_xform.next = NULL; 11027 11028 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 11029 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11030 11031 ut_params->sess = rte_cryptodev_sym_session_create( 11032 ts_params->session_mpool); 11033 11034 /* Create Crypto session*/ 11035 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11036 ut_params->sess, &ut_params->auth_xform, 11037 ts_params->session_priv_mpool); 11038 TEST_ASSERT(ret < 0, 11039 "Session creation succeeded unexpectedly"); 11040 11041 return TEST_SUCCESS; 11042 } 11043 11044 11045 #define NULL_BURST_LENGTH (32) 11046 11047 static int 11048 test_null_burst_operation(void) 11049 { 11050 struct crypto_testsuite_params *ts_params = &testsuite_params; 11051 struct crypto_unittest_params *ut_params = &unittest_params; 11052 11053 unsigned i, burst_len = NULL_BURST_LENGTH; 11054 11055 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 11056 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 11057 11058 /* This test is for NULL PMD only */ 11059 if (gbl_driver_id != rte_cryptodev_driver_id_get( 11060 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 11061 return TEST_SKIPPED; 11062 11063 /* Setup Cipher Parameters */ 11064 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11065 ut_params->cipher_xform.next = &ut_params->auth_xform; 11066 11067 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 11068 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 11069 11070 /* Setup HMAC Parameters */ 11071 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11072 ut_params->auth_xform.next = NULL; 11073 11074 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 11075 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 11076 11077 ut_params->sess = rte_cryptodev_sym_session_create( 11078 ts_params->session_mpool); 11079 11080 /* Create Crypto session*/ 11081 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 11082 ut_params->sess, &ut_params->cipher_xform, 11083 ts_params->session_priv_mpool); 11084 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11085 11086 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 11087 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 11088 burst_len, "failed to generate burst of crypto ops"); 11089 11090 /* Generate an operation for each mbuf in burst */ 11091 for (i = 0; i < burst_len; i++) { 11092 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11093 11094 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 11095 11096 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 11097 sizeof(unsigned)); 11098 *data = i; 11099 11100 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 11101 11102 burst[i]->sym->m_src = m; 11103 } 11104 11105 /* Process crypto operation */ 11106 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 11107 0, burst, burst_len), 11108 burst_len, 11109 "Error enqueuing burst"); 11110 11111 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 11112 0, burst_dequeued, burst_len), 11113 burst_len, 11114 "Error dequeuing burst"); 11115 11116 11117 for (i = 0; i < burst_len; i++) { 11118 TEST_ASSERT_EQUAL( 11119 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 11120 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 11121 uint32_t *), 11122 "data not as expected"); 11123 11124 rte_pktmbuf_free(burst[i]->sym->m_src); 11125 rte_crypto_op_free(burst[i]); 11126 } 11127 11128 return TEST_SUCCESS; 11129 } 11130 11131 static uint16_t 11132 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11133 uint16_t nb_ops, void *user_param) 11134 { 11135 RTE_SET_USED(dev_id); 11136 RTE_SET_USED(qp_id); 11137 RTE_SET_USED(ops); 11138 RTE_SET_USED(user_param); 11139 11140 printf("crypto enqueue callback called\n"); 11141 return nb_ops; 11142 } 11143 11144 static uint16_t 11145 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops, 11146 uint16_t nb_ops, void *user_param) 11147 { 11148 RTE_SET_USED(dev_id); 11149 RTE_SET_USED(qp_id); 11150 RTE_SET_USED(ops); 11151 RTE_SET_USED(user_param); 11152 11153 printf("crypto dequeue callback called\n"); 11154 return nb_ops; 11155 } 11156 11157 /* 11158 * Thread using enqueue/dequeue callback with RCU. 11159 */ 11160 static int 11161 test_enqdeq_callback_thread(void *arg) 11162 { 11163 RTE_SET_USED(arg); 11164 /* DP thread calls rte_cryptodev_enqueue_burst()/ 11165 * rte_cryptodev_dequeue_burst() and invokes callback. 11166 */ 11167 test_null_burst_operation(); 11168 return 0; 11169 } 11170 11171 static int 11172 test_enq_callback_setup(void) 11173 { 11174 struct crypto_testsuite_params *ts_params = &testsuite_params; 11175 struct rte_cryptodev_info dev_info; 11176 struct rte_cryptodev_qp_conf qp_conf = { 11177 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11178 }; 11179 11180 struct rte_cryptodev_cb *cb; 11181 uint16_t qp_id = 0; 11182 11183 /* Stop the device in case it's started so it can be configured */ 11184 rte_cryptodev_stop(ts_params->valid_devs[0]); 11185 11186 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11187 11188 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11189 &ts_params->conf), 11190 "Failed to configure cryptodev %u", 11191 ts_params->valid_devs[0]); 11192 11193 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11194 qp_conf.mp_session = ts_params->session_mpool; 11195 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11196 11197 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11198 ts_params->valid_devs[0], qp_id, &qp_conf, 11199 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11200 "Failed test for " 11201 "rte_cryptodev_queue_pair_setup: num_inflights " 11202 "%u on qp %u on cryptodev %u", 11203 qp_conf.nb_descriptors, qp_id, 11204 ts_params->valid_devs[0]); 11205 11206 /* Test with invalid crypto device */ 11207 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS, 11208 qp_id, test_enq_callback, NULL); 11209 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11210 "cryptodev %u did not fail", 11211 qp_id, RTE_CRYPTO_MAX_DEVS); 11212 11213 /* Test with invalid queue pair */ 11214 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11215 dev_info.max_nb_queue_pairs + 1, 11216 test_enq_callback, NULL); 11217 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11218 "cryptodev %u did not fail", 11219 dev_info.max_nb_queue_pairs + 1, 11220 ts_params->valid_devs[0]); 11221 11222 /* Test with NULL callback */ 11223 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11224 qp_id, NULL, NULL); 11225 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11226 "cryptodev %u did not fail", 11227 qp_id, ts_params->valid_devs[0]); 11228 11229 /* Test with valid configuration */ 11230 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0], 11231 qp_id, test_enq_callback, NULL); 11232 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11233 "qp %u on cryptodev %u", 11234 qp_id, ts_params->valid_devs[0]); 11235 11236 rte_cryptodev_start(ts_params->valid_devs[0]); 11237 11238 /* Launch a thread */ 11239 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11240 rte_get_next_lcore(-1, 1, 0)); 11241 11242 /* Wait until reader exited. */ 11243 rte_eal_mp_wait_lcore(); 11244 11245 /* Test with invalid crypto device */ 11246 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11247 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11248 "Expected call to fail as crypto device is invalid"); 11249 11250 /* Test with invalid queue pair */ 11251 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11252 ts_params->valid_devs[0], 11253 dev_info.max_nb_queue_pairs + 1, cb), 11254 "Expected call to fail as queue pair is invalid"); 11255 11256 /* Test with NULL callback */ 11257 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback( 11258 ts_params->valid_devs[0], qp_id, NULL), 11259 "Expected call to fail as callback is NULL"); 11260 11261 /* Test with valid configuration */ 11262 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback( 11263 ts_params->valid_devs[0], qp_id, cb), 11264 "Failed test to remove callback on " 11265 "qp %u on cryptodev %u", 11266 qp_id, ts_params->valid_devs[0]); 11267 11268 return TEST_SUCCESS; 11269 } 11270 11271 static int 11272 test_deq_callback_setup(void) 11273 { 11274 struct crypto_testsuite_params *ts_params = &testsuite_params; 11275 struct rte_cryptodev_info dev_info; 11276 struct rte_cryptodev_qp_conf qp_conf = { 11277 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 11278 }; 11279 11280 struct rte_cryptodev_cb *cb; 11281 uint16_t qp_id = 0; 11282 11283 /* Stop the device in case it's started so it can be configured */ 11284 rte_cryptodev_stop(ts_params->valid_devs[0]); 11285 11286 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11287 11288 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 11289 &ts_params->conf), 11290 "Failed to configure cryptodev %u", 11291 ts_params->valid_devs[0]); 11292 11293 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 11294 qp_conf.mp_session = ts_params->session_mpool; 11295 qp_conf.mp_session_private = ts_params->session_priv_mpool; 11296 11297 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 11298 ts_params->valid_devs[0], qp_id, &qp_conf, 11299 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 11300 "Failed test for " 11301 "rte_cryptodev_queue_pair_setup: num_inflights " 11302 "%u on qp %u on cryptodev %u", 11303 qp_conf.nb_descriptors, qp_id, 11304 ts_params->valid_devs[0]); 11305 11306 /* Test with invalid crypto device */ 11307 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS, 11308 qp_id, test_deq_callback, NULL); 11309 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11310 "cryptodev %u did not fail", 11311 qp_id, RTE_CRYPTO_MAX_DEVS); 11312 11313 /* Test with invalid queue pair */ 11314 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11315 dev_info.max_nb_queue_pairs + 1, 11316 test_deq_callback, NULL); 11317 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11318 "cryptodev %u did not fail", 11319 dev_info.max_nb_queue_pairs + 1, 11320 ts_params->valid_devs[0]); 11321 11322 /* Test with NULL callback */ 11323 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11324 qp_id, NULL, NULL); 11325 TEST_ASSERT_NULL(cb, "Add callback on qp %u on " 11326 "cryptodev %u did not fail", 11327 qp_id, ts_params->valid_devs[0]); 11328 11329 /* Test with valid configuration */ 11330 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0], 11331 qp_id, test_deq_callback, NULL); 11332 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on " 11333 "qp %u on cryptodev %u", 11334 qp_id, ts_params->valid_devs[0]); 11335 11336 rte_cryptodev_start(ts_params->valid_devs[0]); 11337 11338 /* Launch a thread */ 11339 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL, 11340 rte_get_next_lcore(-1, 1, 0)); 11341 11342 /* Wait until reader exited. */ 11343 rte_eal_mp_wait_lcore(); 11344 11345 /* Test with invalid crypto device */ 11346 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11347 RTE_CRYPTO_MAX_DEVS, qp_id, cb), 11348 "Expected call to fail as crypto device is invalid"); 11349 11350 /* Test with invalid queue pair */ 11351 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11352 ts_params->valid_devs[0], 11353 dev_info.max_nb_queue_pairs + 1, cb), 11354 "Expected call to fail as queue pair is invalid"); 11355 11356 /* Test with NULL callback */ 11357 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback( 11358 ts_params->valid_devs[0], qp_id, NULL), 11359 "Expected call to fail as callback is NULL"); 11360 11361 /* Test with valid configuration */ 11362 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback( 11363 ts_params->valid_devs[0], qp_id, cb), 11364 "Failed test to remove callback on " 11365 "qp %u on cryptodev %u", 11366 qp_id, ts_params->valid_devs[0]); 11367 11368 return TEST_SUCCESS; 11369 } 11370 11371 static void 11372 generate_gmac_large_plaintext(uint8_t *data) 11373 { 11374 uint16_t i; 11375 11376 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 11377 memcpy(&data[i], &data[0], 32); 11378 } 11379 11380 static int 11381 create_gmac_operation(enum rte_crypto_auth_operation op, 11382 const struct gmac_test_data *tdata) 11383 { 11384 struct crypto_testsuite_params *ts_params = &testsuite_params; 11385 struct crypto_unittest_params *ut_params = &unittest_params; 11386 struct rte_crypto_sym_op *sym_op; 11387 11388 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11389 11390 /* Generate Crypto op data structure */ 11391 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11392 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11393 TEST_ASSERT_NOT_NULL(ut_params->op, 11394 "Failed to allocate symmetric crypto operation struct"); 11395 11396 sym_op = ut_params->op->sym; 11397 11398 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11399 ut_params->ibuf, tdata->gmac_tag.len); 11400 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11401 "no room to append digest"); 11402 11403 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11404 ut_params->ibuf, plaintext_pad_len); 11405 11406 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11407 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11408 tdata->gmac_tag.len); 11409 debug_hexdump(stdout, "digest:", 11410 sym_op->auth.digest.data, 11411 tdata->gmac_tag.len); 11412 } 11413 11414 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11415 uint8_t *, IV_OFFSET); 11416 11417 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11418 11419 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11420 11421 sym_op->cipher.data.length = 0; 11422 sym_op->cipher.data.offset = 0; 11423 11424 sym_op->auth.data.offset = 0; 11425 sym_op->auth.data.length = tdata->plaintext.len; 11426 11427 return 0; 11428 } 11429 11430 static int 11431 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 11432 const struct gmac_test_data *tdata, 11433 void *digest_mem, uint64_t digest_phys) 11434 { 11435 struct crypto_testsuite_params *ts_params = &testsuite_params; 11436 struct crypto_unittest_params *ut_params = &unittest_params; 11437 struct rte_crypto_sym_op *sym_op; 11438 11439 /* Generate Crypto op data structure */ 11440 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11441 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11442 TEST_ASSERT_NOT_NULL(ut_params->op, 11443 "Failed to allocate symmetric crypto operation struct"); 11444 11445 sym_op = ut_params->op->sym; 11446 11447 sym_op->auth.digest.data = digest_mem; 11448 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11449 "no room to append digest"); 11450 11451 sym_op->auth.digest.phys_addr = digest_phys; 11452 11453 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 11454 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 11455 tdata->gmac_tag.len); 11456 debug_hexdump(stdout, "digest:", 11457 sym_op->auth.digest.data, 11458 tdata->gmac_tag.len); 11459 } 11460 11461 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 11462 uint8_t *, IV_OFFSET); 11463 11464 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 11465 11466 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 11467 11468 sym_op->cipher.data.length = 0; 11469 sym_op->cipher.data.offset = 0; 11470 11471 sym_op->auth.data.offset = 0; 11472 sym_op->auth.data.length = tdata->plaintext.len; 11473 11474 return 0; 11475 } 11476 11477 static int create_gmac_session(uint8_t dev_id, 11478 const struct gmac_test_data *tdata, 11479 enum rte_crypto_auth_operation auth_op) 11480 { 11481 uint8_t auth_key[tdata->key.len]; 11482 11483 struct crypto_testsuite_params *ts_params = &testsuite_params; 11484 struct crypto_unittest_params *ut_params = &unittest_params; 11485 11486 memcpy(auth_key, tdata->key.data, tdata->key.len); 11487 11488 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11489 ut_params->auth_xform.next = NULL; 11490 11491 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 11492 ut_params->auth_xform.auth.op = auth_op; 11493 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 11494 ut_params->auth_xform.auth.key.length = tdata->key.len; 11495 ut_params->auth_xform.auth.key.data = auth_key; 11496 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 11497 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 11498 11499 11500 ut_params->sess = rte_cryptodev_sym_session_create( 11501 ts_params->session_mpool); 11502 11503 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 11504 &ut_params->auth_xform, 11505 ts_params->session_priv_mpool); 11506 11507 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11508 11509 return 0; 11510 } 11511 11512 static int 11513 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 11514 { 11515 struct crypto_testsuite_params *ts_params = &testsuite_params; 11516 struct crypto_unittest_params *ut_params = &unittest_params; 11517 struct rte_cryptodev_info dev_info; 11518 11519 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11520 uint64_t feat_flags = dev_info.feature_flags; 11521 11522 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11523 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11524 printf("Device doesn't support RAW data-path APIs.\n"); 11525 return TEST_SKIPPED; 11526 } 11527 11528 int retval; 11529 11530 uint8_t *auth_tag, *plaintext; 11531 uint16_t plaintext_pad_len; 11532 11533 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11534 "No GMAC length in the source data"); 11535 11536 /* Verify the capabilities */ 11537 struct rte_cryptodev_sym_capability_idx cap_idx; 11538 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11539 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11540 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11541 &cap_idx) == NULL) 11542 return TEST_SKIPPED; 11543 11544 retval = create_gmac_session(ts_params->valid_devs[0], 11545 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11546 11547 if (retval < 0) 11548 return retval; 11549 11550 if (tdata->plaintext.len > MBUF_SIZE) 11551 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11552 else 11553 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11554 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11555 "Failed to allocate input buffer in mempool"); 11556 11557 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11558 rte_pktmbuf_tailroom(ut_params->ibuf)); 11559 11560 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11561 /* 11562 * Runtime generate the large plain text instead of use hard code 11563 * plain text vector. It is done to avoid create huge source file 11564 * with the test vector. 11565 */ 11566 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11567 generate_gmac_large_plaintext(tdata->plaintext.data); 11568 11569 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11570 plaintext_pad_len); 11571 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11572 11573 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11574 debug_hexdump(stdout, "plaintext:", plaintext, 11575 tdata->plaintext.len); 11576 11577 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 11578 tdata); 11579 11580 if (retval < 0) 11581 return retval; 11582 11583 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11584 11585 ut_params->op->sym->m_src = ut_params->ibuf; 11586 11587 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11588 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11589 ut_params->op); 11590 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11591 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11592 ut_params->op, 0, 1, 0, 0); 11593 else 11594 TEST_ASSERT_NOT_NULL( 11595 process_crypto_request(ts_params->valid_devs[0], 11596 ut_params->op), "failed to process sym crypto op"); 11597 11598 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11599 "crypto op processing failed"); 11600 11601 if (ut_params->op->sym->m_dst) { 11602 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 11603 uint8_t *, plaintext_pad_len); 11604 } else { 11605 auth_tag = plaintext + plaintext_pad_len; 11606 } 11607 11608 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11609 11610 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11611 auth_tag, 11612 tdata->gmac_tag.data, 11613 tdata->gmac_tag.len, 11614 "GMAC Generated auth tag not as expected"); 11615 11616 return 0; 11617 } 11618 11619 static int 11620 test_AES_GMAC_authentication_test_case_1(void) 11621 { 11622 return test_AES_GMAC_authentication(&gmac_test_case_1); 11623 } 11624 11625 static int 11626 test_AES_GMAC_authentication_test_case_2(void) 11627 { 11628 return test_AES_GMAC_authentication(&gmac_test_case_2); 11629 } 11630 11631 static int 11632 test_AES_GMAC_authentication_test_case_3(void) 11633 { 11634 return test_AES_GMAC_authentication(&gmac_test_case_3); 11635 } 11636 11637 static int 11638 test_AES_GMAC_authentication_test_case_4(void) 11639 { 11640 return test_AES_GMAC_authentication(&gmac_test_case_4); 11641 } 11642 11643 static int 11644 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 11645 { 11646 struct crypto_testsuite_params *ts_params = &testsuite_params; 11647 struct crypto_unittest_params *ut_params = &unittest_params; 11648 int retval; 11649 uint32_t plaintext_pad_len; 11650 uint8_t *plaintext; 11651 struct rte_cryptodev_info dev_info; 11652 11653 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11654 uint64_t feat_flags = dev_info.feature_flags; 11655 11656 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11657 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11658 printf("Device doesn't support RAW data-path APIs.\n"); 11659 return TEST_SKIPPED; 11660 } 11661 11662 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11663 "No GMAC length in the source data"); 11664 11665 /* Verify the capabilities */ 11666 struct rte_cryptodev_sym_capability_idx cap_idx; 11667 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11668 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11669 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11670 &cap_idx) == NULL) 11671 return TEST_SKIPPED; 11672 11673 retval = create_gmac_session(ts_params->valid_devs[0], 11674 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 11675 11676 if (retval < 0) 11677 return retval; 11678 11679 if (tdata->plaintext.len > MBUF_SIZE) 11680 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11681 else 11682 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11683 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11684 "Failed to allocate input buffer in mempool"); 11685 11686 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11687 rte_pktmbuf_tailroom(ut_params->ibuf)); 11688 11689 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11690 11691 /* 11692 * Runtime generate the large plain text instead of use hard code 11693 * plain text vector. It is done to avoid create huge source file 11694 * with the test vector. 11695 */ 11696 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11697 generate_gmac_large_plaintext(tdata->plaintext.data); 11698 11699 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11700 plaintext_pad_len); 11701 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11702 11703 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11704 debug_hexdump(stdout, "plaintext:", plaintext, 11705 tdata->plaintext.len); 11706 11707 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 11708 tdata); 11709 11710 if (retval < 0) 11711 return retval; 11712 11713 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11714 11715 ut_params->op->sym->m_src = ut_params->ibuf; 11716 11717 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11718 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11719 ut_params->op); 11720 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11721 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11722 ut_params->op, 0, 1, 0, 0); 11723 else 11724 TEST_ASSERT_NOT_NULL( 11725 process_crypto_request(ts_params->valid_devs[0], 11726 ut_params->op), "failed to process sym crypto op"); 11727 11728 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11729 "crypto op processing failed"); 11730 11731 return 0; 11732 11733 } 11734 11735 static int 11736 test_AES_GMAC_authentication_verify_test_case_1(void) 11737 { 11738 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 11739 } 11740 11741 static int 11742 test_AES_GMAC_authentication_verify_test_case_2(void) 11743 { 11744 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 11745 } 11746 11747 static int 11748 test_AES_GMAC_authentication_verify_test_case_3(void) 11749 { 11750 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 11751 } 11752 11753 static int 11754 test_AES_GMAC_authentication_verify_test_case_4(void) 11755 { 11756 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 11757 } 11758 11759 static int 11760 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 11761 uint32_t fragsz) 11762 { 11763 struct crypto_testsuite_params *ts_params = &testsuite_params; 11764 struct crypto_unittest_params *ut_params = &unittest_params; 11765 struct rte_cryptodev_info dev_info; 11766 uint64_t feature_flags; 11767 unsigned int trn_data = 0; 11768 void *digest_mem = NULL; 11769 uint32_t segs = 1; 11770 unsigned int to_trn = 0; 11771 struct rte_mbuf *buf = NULL; 11772 uint8_t *auth_tag, *plaintext; 11773 int retval; 11774 11775 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11776 "No GMAC length in the source data"); 11777 11778 /* Verify the capabilities */ 11779 struct rte_cryptodev_sym_capability_idx cap_idx; 11780 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11781 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11782 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11783 &cap_idx) == NULL) 11784 return TEST_SKIPPED; 11785 11786 /* Check for any input SGL support */ 11787 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11788 feature_flags = dev_info.feature_flags; 11789 11790 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 11791 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 11792 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 11793 return TEST_SKIPPED; 11794 11795 if (fragsz > tdata->plaintext.len) 11796 fragsz = tdata->plaintext.len; 11797 11798 uint16_t plaintext_len = fragsz; 11799 11800 retval = create_gmac_session(ts_params->valid_devs[0], 11801 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11802 11803 if (retval < 0) 11804 return retval; 11805 11806 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11807 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11808 "Failed to allocate input buffer in mempool"); 11809 11810 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11811 rte_pktmbuf_tailroom(ut_params->ibuf)); 11812 11813 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11814 plaintext_len); 11815 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11816 11817 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 11818 11819 trn_data += plaintext_len; 11820 11821 buf = ut_params->ibuf; 11822 11823 /* 11824 * Loop until no more fragments 11825 */ 11826 11827 while (trn_data < tdata->plaintext.len) { 11828 ++segs; 11829 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 11830 (tdata->plaintext.len - trn_data) : fragsz; 11831 11832 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11833 buf = buf->next; 11834 11835 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 11836 rte_pktmbuf_tailroom(buf)); 11837 11838 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 11839 to_trn); 11840 11841 memcpy(plaintext, tdata->plaintext.data + trn_data, 11842 to_trn); 11843 trn_data += to_trn; 11844 if (trn_data == tdata->plaintext.len) 11845 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 11846 tdata->gmac_tag.len); 11847 } 11848 ut_params->ibuf->nb_segs = segs; 11849 11850 /* 11851 * Place digest at the end of the last buffer 11852 */ 11853 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 11854 11855 if (!digest_mem) { 11856 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11857 + tdata->gmac_tag.len); 11858 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 11859 tdata->plaintext.len); 11860 } 11861 11862 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 11863 tdata, digest_mem, digest_phys); 11864 11865 if (retval < 0) 11866 return retval; 11867 11868 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11869 11870 ut_params->op->sym->m_src = ut_params->ibuf; 11871 11872 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11873 return TEST_SKIPPED; 11874 11875 TEST_ASSERT_NOT_NULL( 11876 process_crypto_request(ts_params->valid_devs[0], 11877 ut_params->op), "failed to process sym crypto op"); 11878 11879 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11880 "crypto op processing failed"); 11881 11882 auth_tag = digest_mem; 11883 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11884 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11885 auth_tag, 11886 tdata->gmac_tag.data, 11887 tdata->gmac_tag.len, 11888 "GMAC Generated auth tag not as expected"); 11889 11890 return 0; 11891 } 11892 11893 /* Segment size not multiple of block size (16B) */ 11894 static int 11895 test_AES_GMAC_authentication_SGL_40B(void) 11896 { 11897 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 11898 } 11899 11900 static int 11901 test_AES_GMAC_authentication_SGL_80B(void) 11902 { 11903 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 11904 } 11905 11906 static int 11907 test_AES_GMAC_authentication_SGL_2048B(void) 11908 { 11909 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 11910 } 11911 11912 /* Segment size not multiple of block size (16B) */ 11913 static int 11914 test_AES_GMAC_authentication_SGL_2047B(void) 11915 { 11916 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 11917 } 11918 11919 struct test_crypto_vector { 11920 enum rte_crypto_cipher_algorithm crypto_algo; 11921 unsigned int cipher_offset; 11922 unsigned int cipher_len; 11923 11924 struct { 11925 uint8_t data[64]; 11926 unsigned int len; 11927 } cipher_key; 11928 11929 struct { 11930 uint8_t data[64]; 11931 unsigned int len; 11932 } iv; 11933 11934 struct { 11935 const uint8_t *data; 11936 unsigned int len; 11937 } plaintext; 11938 11939 struct { 11940 const uint8_t *data; 11941 unsigned int len; 11942 } ciphertext; 11943 11944 enum rte_crypto_auth_algorithm auth_algo; 11945 unsigned int auth_offset; 11946 11947 struct { 11948 uint8_t data[128]; 11949 unsigned int len; 11950 } auth_key; 11951 11952 struct { 11953 const uint8_t *data; 11954 unsigned int len; 11955 } aad; 11956 11957 struct { 11958 uint8_t data[128]; 11959 unsigned int len; 11960 } digest; 11961 }; 11962 11963 static const struct test_crypto_vector 11964 hmac_sha1_test_crypto_vector = { 11965 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 11966 .plaintext = { 11967 .data = plaintext_hash, 11968 .len = 512 11969 }, 11970 .auth_key = { 11971 .data = { 11972 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 11973 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 11974 0xDE, 0xF4, 0xDE, 0xAD 11975 }, 11976 .len = 20 11977 }, 11978 .digest = { 11979 .data = { 11980 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 11981 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 11982 0x3F, 0x91, 0x64, 0x59 11983 }, 11984 .len = 20 11985 } 11986 }; 11987 11988 static const struct test_crypto_vector 11989 aes128_gmac_test_vector = { 11990 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 11991 .plaintext = { 11992 .data = plaintext_hash, 11993 .len = 512 11994 }, 11995 .iv = { 11996 .data = { 11997 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11998 0x08, 0x09, 0x0A, 0x0B 11999 }, 12000 .len = 12 12001 }, 12002 .auth_key = { 12003 .data = { 12004 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12005 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 12006 }, 12007 .len = 16 12008 }, 12009 .digest = { 12010 .data = { 12011 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 12012 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 12013 }, 12014 .len = 16 12015 } 12016 }; 12017 12018 static const struct test_crypto_vector 12019 aes128cbc_hmac_sha1_test_vector = { 12020 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12021 .cipher_offset = 0, 12022 .cipher_len = 512, 12023 .cipher_key = { 12024 .data = { 12025 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12026 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12027 }, 12028 .len = 16 12029 }, 12030 .iv = { 12031 .data = { 12032 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12033 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12034 }, 12035 .len = 16 12036 }, 12037 .plaintext = { 12038 .data = plaintext_hash, 12039 .len = 512 12040 }, 12041 .ciphertext = { 12042 .data = ciphertext512_aes128cbc, 12043 .len = 512 12044 }, 12045 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12046 .auth_offset = 0, 12047 .auth_key = { 12048 .data = { 12049 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12050 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12051 0xDE, 0xF4, 0xDE, 0xAD 12052 }, 12053 .len = 20 12054 }, 12055 .digest = { 12056 .data = { 12057 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 12058 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 12059 0x18, 0x8C, 0x1D, 0x32 12060 }, 12061 .len = 20 12062 } 12063 }; 12064 12065 static const struct test_crypto_vector 12066 aes128cbc_hmac_sha1_aad_test_vector = { 12067 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 12068 .cipher_offset = 8, 12069 .cipher_len = 496, 12070 .cipher_key = { 12071 .data = { 12072 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 12073 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 12074 }, 12075 .len = 16 12076 }, 12077 .iv = { 12078 .data = { 12079 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 12080 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 12081 }, 12082 .len = 16 12083 }, 12084 .plaintext = { 12085 .data = plaintext_hash, 12086 .len = 512 12087 }, 12088 .ciphertext = { 12089 .data = ciphertext512_aes128cbc_aad, 12090 .len = 512 12091 }, 12092 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 12093 .auth_offset = 0, 12094 .auth_key = { 12095 .data = { 12096 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 12097 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 12098 0xDE, 0xF4, 0xDE, 0xAD 12099 }, 12100 .len = 20 12101 }, 12102 .digest = { 12103 .data = { 12104 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 12105 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 12106 0x62, 0x0F, 0xFB, 0x10 12107 }, 12108 .len = 20 12109 } 12110 }; 12111 12112 static void 12113 data_corruption(uint8_t *data) 12114 { 12115 data[0] += 1; 12116 } 12117 12118 static void 12119 tag_corruption(uint8_t *data, unsigned int tag_offset) 12120 { 12121 data[tag_offset] += 1; 12122 } 12123 12124 static int 12125 create_auth_session(struct crypto_unittest_params *ut_params, 12126 uint8_t dev_id, 12127 const struct test_crypto_vector *reference, 12128 enum rte_crypto_auth_operation auth_op) 12129 { 12130 struct crypto_testsuite_params *ts_params = &testsuite_params; 12131 uint8_t auth_key[reference->auth_key.len + 1]; 12132 12133 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12134 12135 /* Setup Authentication Parameters */ 12136 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12137 ut_params->auth_xform.auth.op = auth_op; 12138 ut_params->auth_xform.next = NULL; 12139 ut_params->auth_xform.auth.algo = reference->auth_algo; 12140 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12141 ut_params->auth_xform.auth.key.data = auth_key; 12142 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12143 12144 /* Create Crypto session*/ 12145 ut_params->sess = rte_cryptodev_sym_session_create( 12146 ts_params->session_mpool); 12147 12148 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12149 &ut_params->auth_xform, 12150 ts_params->session_priv_mpool); 12151 12152 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12153 12154 return 0; 12155 } 12156 12157 static int 12158 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 12159 uint8_t dev_id, 12160 const struct test_crypto_vector *reference, 12161 enum rte_crypto_auth_operation auth_op, 12162 enum rte_crypto_cipher_operation cipher_op) 12163 { 12164 struct crypto_testsuite_params *ts_params = &testsuite_params; 12165 uint8_t cipher_key[reference->cipher_key.len + 1]; 12166 uint8_t auth_key[reference->auth_key.len + 1]; 12167 12168 memcpy(cipher_key, reference->cipher_key.data, 12169 reference->cipher_key.len); 12170 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12171 12172 /* Setup Authentication Parameters */ 12173 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12174 ut_params->auth_xform.auth.op = auth_op; 12175 ut_params->auth_xform.auth.algo = reference->auth_algo; 12176 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12177 ut_params->auth_xform.auth.key.data = auth_key; 12178 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12179 12180 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 12181 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 12182 ut_params->auth_xform.auth.iv.length = reference->iv.len; 12183 } else { 12184 ut_params->auth_xform.next = &ut_params->cipher_xform; 12185 12186 /* Setup Cipher Parameters */ 12187 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12188 ut_params->cipher_xform.next = NULL; 12189 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12190 ut_params->cipher_xform.cipher.op = cipher_op; 12191 ut_params->cipher_xform.cipher.key.data = cipher_key; 12192 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12193 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12194 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12195 } 12196 12197 /* Create Crypto session*/ 12198 ut_params->sess = rte_cryptodev_sym_session_create( 12199 ts_params->session_mpool); 12200 12201 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 12202 &ut_params->auth_xform, 12203 ts_params->session_priv_mpool); 12204 12205 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12206 12207 return 0; 12208 } 12209 12210 static int 12211 create_auth_operation(struct crypto_testsuite_params *ts_params, 12212 struct crypto_unittest_params *ut_params, 12213 const struct test_crypto_vector *reference, 12214 unsigned int auth_generate) 12215 { 12216 /* Generate Crypto op data structure */ 12217 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12218 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12219 TEST_ASSERT_NOT_NULL(ut_params->op, 12220 "Failed to allocate pktmbuf offload"); 12221 12222 /* Set crypto operation data parameters */ 12223 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12224 12225 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12226 12227 /* set crypto operation source mbuf */ 12228 sym_op->m_src = ut_params->ibuf; 12229 12230 /* digest */ 12231 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12232 ut_params->ibuf, reference->digest.len); 12233 12234 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12235 "no room to append auth tag"); 12236 12237 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12238 ut_params->ibuf, reference->plaintext.len); 12239 12240 if (auth_generate) 12241 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12242 else 12243 memcpy(sym_op->auth.digest.data, 12244 reference->digest.data, 12245 reference->digest.len); 12246 12247 debug_hexdump(stdout, "digest:", 12248 sym_op->auth.digest.data, 12249 reference->digest.len); 12250 12251 sym_op->auth.data.length = reference->plaintext.len; 12252 sym_op->auth.data.offset = 0; 12253 12254 return 0; 12255 } 12256 12257 static int 12258 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 12259 struct crypto_unittest_params *ut_params, 12260 const struct test_crypto_vector *reference, 12261 unsigned int auth_generate) 12262 { 12263 /* Generate Crypto op data structure */ 12264 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12265 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12266 TEST_ASSERT_NOT_NULL(ut_params->op, 12267 "Failed to allocate pktmbuf offload"); 12268 12269 /* Set crypto operation data parameters */ 12270 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12271 12272 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12273 12274 /* set crypto operation source mbuf */ 12275 sym_op->m_src = ut_params->ibuf; 12276 12277 /* digest */ 12278 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12279 ut_params->ibuf, reference->digest.len); 12280 12281 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12282 "no room to append auth tag"); 12283 12284 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12285 ut_params->ibuf, reference->ciphertext.len); 12286 12287 if (auth_generate) 12288 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12289 else 12290 memcpy(sym_op->auth.digest.data, 12291 reference->digest.data, 12292 reference->digest.len); 12293 12294 debug_hexdump(stdout, "digest:", 12295 sym_op->auth.digest.data, 12296 reference->digest.len); 12297 12298 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12299 reference->iv.data, reference->iv.len); 12300 12301 sym_op->cipher.data.length = 0; 12302 sym_op->cipher.data.offset = 0; 12303 12304 sym_op->auth.data.length = reference->plaintext.len; 12305 sym_op->auth.data.offset = 0; 12306 12307 return 0; 12308 } 12309 12310 static int 12311 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 12312 struct crypto_unittest_params *ut_params, 12313 const struct test_crypto_vector *reference, 12314 unsigned int auth_generate) 12315 { 12316 /* Generate Crypto op data structure */ 12317 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12318 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12319 TEST_ASSERT_NOT_NULL(ut_params->op, 12320 "Failed to allocate pktmbuf offload"); 12321 12322 /* Set crypto operation data parameters */ 12323 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12324 12325 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12326 12327 /* set crypto operation source mbuf */ 12328 sym_op->m_src = ut_params->ibuf; 12329 12330 /* digest */ 12331 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 12332 ut_params->ibuf, reference->digest.len); 12333 12334 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 12335 "no room to append auth tag"); 12336 12337 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 12338 ut_params->ibuf, reference->ciphertext.len); 12339 12340 if (auth_generate) 12341 memset(sym_op->auth.digest.data, 0, reference->digest.len); 12342 else 12343 memcpy(sym_op->auth.digest.data, 12344 reference->digest.data, 12345 reference->digest.len); 12346 12347 debug_hexdump(stdout, "digest:", 12348 sym_op->auth.digest.data, 12349 reference->digest.len); 12350 12351 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 12352 reference->iv.data, reference->iv.len); 12353 12354 sym_op->cipher.data.length = reference->cipher_len; 12355 sym_op->cipher.data.offset = reference->cipher_offset; 12356 12357 sym_op->auth.data.length = reference->plaintext.len; 12358 sym_op->auth.data.offset = reference->auth_offset; 12359 12360 return 0; 12361 } 12362 12363 static int 12364 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12365 struct crypto_unittest_params *ut_params, 12366 const struct test_crypto_vector *reference) 12367 { 12368 return create_auth_operation(ts_params, ut_params, reference, 0); 12369 } 12370 12371 static int 12372 create_auth_verify_GMAC_operation( 12373 struct crypto_testsuite_params *ts_params, 12374 struct crypto_unittest_params *ut_params, 12375 const struct test_crypto_vector *reference) 12376 { 12377 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 12378 } 12379 12380 static int 12381 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 12382 struct crypto_unittest_params *ut_params, 12383 const struct test_crypto_vector *reference) 12384 { 12385 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 12386 } 12387 12388 static int 12389 test_authentication_verify_fail_when_data_corruption( 12390 struct crypto_testsuite_params *ts_params, 12391 struct crypto_unittest_params *ut_params, 12392 const struct test_crypto_vector *reference, 12393 unsigned int data_corrupted) 12394 { 12395 int retval; 12396 12397 uint8_t *plaintext; 12398 struct rte_cryptodev_info dev_info; 12399 12400 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12401 uint64_t feat_flags = dev_info.feature_flags; 12402 12403 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12404 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12405 printf("Device doesn't support RAW data-path APIs.\n"); 12406 return TEST_SKIPPED; 12407 } 12408 12409 /* Verify the capabilities */ 12410 struct rte_cryptodev_sym_capability_idx cap_idx; 12411 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12412 cap_idx.algo.auth = reference->auth_algo; 12413 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12414 &cap_idx) == NULL) 12415 return TEST_SKIPPED; 12416 12417 12418 /* Create session */ 12419 retval = create_auth_session(ut_params, 12420 ts_params->valid_devs[0], 12421 reference, 12422 RTE_CRYPTO_AUTH_OP_VERIFY); 12423 if (retval < 0) 12424 return retval; 12425 12426 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12427 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12428 "Failed to allocate input buffer in mempool"); 12429 12430 /* clear mbuf payload */ 12431 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12432 rte_pktmbuf_tailroom(ut_params->ibuf)); 12433 12434 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12435 reference->plaintext.len); 12436 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12437 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12438 12439 debug_hexdump(stdout, "plaintext:", plaintext, 12440 reference->plaintext.len); 12441 12442 /* Create operation */ 12443 retval = create_auth_verify_operation(ts_params, ut_params, reference); 12444 12445 if (retval < 0) 12446 return retval; 12447 12448 if (data_corrupted) 12449 data_corruption(plaintext); 12450 else 12451 tag_corruption(plaintext, reference->plaintext.len); 12452 12453 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12454 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12455 ut_params->op); 12456 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12457 RTE_CRYPTO_OP_STATUS_SUCCESS, 12458 "authentication not failed"); 12459 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12460 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12461 ut_params->op, 0, 1, 0, 0); 12462 else { 12463 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12464 ut_params->op); 12465 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12466 } 12467 12468 return 0; 12469 } 12470 12471 static int 12472 test_authentication_verify_GMAC_fail_when_corruption( 12473 struct crypto_testsuite_params *ts_params, 12474 struct crypto_unittest_params *ut_params, 12475 const struct test_crypto_vector *reference, 12476 unsigned int data_corrupted) 12477 { 12478 int retval; 12479 uint8_t *plaintext; 12480 struct rte_cryptodev_info dev_info; 12481 12482 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12483 uint64_t feat_flags = dev_info.feature_flags; 12484 12485 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12486 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12487 printf("Device doesn't support RAW data-path APIs.\n"); 12488 return TEST_SKIPPED; 12489 } 12490 12491 /* Verify the capabilities */ 12492 struct rte_cryptodev_sym_capability_idx cap_idx; 12493 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12494 cap_idx.algo.auth = reference->auth_algo; 12495 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12496 &cap_idx) == NULL) 12497 return TEST_SKIPPED; 12498 12499 /* Create session */ 12500 retval = create_auth_cipher_session(ut_params, 12501 ts_params->valid_devs[0], 12502 reference, 12503 RTE_CRYPTO_AUTH_OP_VERIFY, 12504 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12505 if (retval < 0) 12506 return retval; 12507 12508 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12509 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12510 "Failed to allocate input buffer in mempool"); 12511 12512 /* clear mbuf payload */ 12513 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12514 rte_pktmbuf_tailroom(ut_params->ibuf)); 12515 12516 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12517 reference->plaintext.len); 12518 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12519 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12520 12521 debug_hexdump(stdout, "plaintext:", plaintext, 12522 reference->plaintext.len); 12523 12524 /* Create operation */ 12525 retval = create_auth_verify_GMAC_operation(ts_params, 12526 ut_params, 12527 reference); 12528 12529 if (retval < 0) 12530 return retval; 12531 12532 if (data_corrupted) 12533 data_corruption(plaintext); 12534 else 12535 tag_corruption(plaintext, reference->aad.len); 12536 12537 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12538 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12539 ut_params->op); 12540 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12541 RTE_CRYPTO_OP_STATUS_SUCCESS, 12542 "authentication not failed"); 12543 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12544 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12545 ut_params->op, 0, 1, 0, 0); 12546 else { 12547 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12548 ut_params->op); 12549 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12550 } 12551 12552 return 0; 12553 } 12554 12555 static int 12556 test_authenticated_decryption_fail_when_corruption( 12557 struct crypto_testsuite_params *ts_params, 12558 struct crypto_unittest_params *ut_params, 12559 const struct test_crypto_vector *reference, 12560 unsigned int data_corrupted) 12561 { 12562 int retval; 12563 12564 uint8_t *ciphertext; 12565 struct rte_cryptodev_info dev_info; 12566 12567 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12568 uint64_t feat_flags = dev_info.feature_flags; 12569 12570 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12571 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12572 printf("Device doesn't support RAW data-path APIs.\n"); 12573 return TEST_SKIPPED; 12574 } 12575 12576 /* Verify the capabilities */ 12577 struct rte_cryptodev_sym_capability_idx cap_idx; 12578 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12579 cap_idx.algo.auth = reference->auth_algo; 12580 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12581 &cap_idx) == NULL) 12582 return TEST_SKIPPED; 12583 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12584 cap_idx.algo.cipher = reference->crypto_algo; 12585 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12586 &cap_idx) == NULL) 12587 return TEST_SKIPPED; 12588 12589 /* Create session */ 12590 retval = create_auth_cipher_session(ut_params, 12591 ts_params->valid_devs[0], 12592 reference, 12593 RTE_CRYPTO_AUTH_OP_VERIFY, 12594 RTE_CRYPTO_CIPHER_OP_DECRYPT); 12595 if (retval < 0) 12596 return retval; 12597 12598 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12599 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12600 "Failed to allocate input buffer in mempool"); 12601 12602 /* clear mbuf payload */ 12603 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12604 rte_pktmbuf_tailroom(ut_params->ibuf)); 12605 12606 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12607 reference->ciphertext.len); 12608 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12609 memcpy(ciphertext, reference->ciphertext.data, 12610 reference->ciphertext.len); 12611 12612 /* Create operation */ 12613 retval = create_cipher_auth_verify_operation(ts_params, 12614 ut_params, 12615 reference); 12616 12617 if (retval < 0) 12618 return retval; 12619 12620 if (data_corrupted) 12621 data_corruption(ciphertext); 12622 else 12623 tag_corruption(ciphertext, reference->ciphertext.len); 12624 12625 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 12626 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12627 ut_params->op); 12628 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 12629 RTE_CRYPTO_OP_STATUS_SUCCESS, 12630 "authentication not failed"); 12631 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12632 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12633 ut_params->op, 1, 1, 0, 0); 12634 else { 12635 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12636 ut_params->op); 12637 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12638 } 12639 12640 return 0; 12641 } 12642 12643 static int 12644 test_authenticated_encrypt_with_esn( 12645 struct crypto_testsuite_params *ts_params, 12646 struct crypto_unittest_params *ut_params, 12647 const struct test_crypto_vector *reference) 12648 { 12649 int retval; 12650 12651 uint8_t *authciphertext, *plaintext, *auth_tag; 12652 uint16_t plaintext_pad_len; 12653 uint8_t cipher_key[reference->cipher_key.len + 1]; 12654 uint8_t auth_key[reference->auth_key.len + 1]; 12655 struct rte_cryptodev_info dev_info; 12656 12657 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12658 uint64_t feat_flags = dev_info.feature_flags; 12659 12660 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12661 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12662 printf("Device doesn't support RAW data-path APIs.\n"); 12663 return TEST_SKIPPED; 12664 } 12665 12666 /* Verify the capabilities */ 12667 struct rte_cryptodev_sym_capability_idx cap_idx; 12668 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12669 cap_idx.algo.auth = reference->auth_algo; 12670 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12671 &cap_idx) == NULL) 12672 return TEST_SKIPPED; 12673 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12674 cap_idx.algo.cipher = reference->crypto_algo; 12675 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12676 &cap_idx) == NULL) 12677 return TEST_SKIPPED; 12678 12679 /* Create session */ 12680 memcpy(cipher_key, reference->cipher_key.data, 12681 reference->cipher_key.len); 12682 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12683 12684 /* Setup Cipher Parameters */ 12685 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12686 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12687 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 12688 ut_params->cipher_xform.cipher.key.data = cipher_key; 12689 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12690 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12691 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12692 12693 ut_params->cipher_xform.next = &ut_params->auth_xform; 12694 12695 /* Setup Authentication Parameters */ 12696 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12697 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 12698 ut_params->auth_xform.auth.algo = reference->auth_algo; 12699 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12700 ut_params->auth_xform.auth.key.data = auth_key; 12701 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12702 ut_params->auth_xform.next = NULL; 12703 12704 /* Create Crypto session*/ 12705 ut_params->sess = rte_cryptodev_sym_session_create( 12706 ts_params->session_mpool); 12707 12708 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12709 ut_params->sess, 12710 &ut_params->cipher_xform, 12711 ts_params->session_priv_mpool); 12712 12713 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12714 12715 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12716 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12717 "Failed to allocate input buffer in mempool"); 12718 12719 /* clear mbuf payload */ 12720 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12721 rte_pktmbuf_tailroom(ut_params->ibuf)); 12722 12723 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12724 reference->plaintext.len); 12725 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12726 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12727 12728 /* Create operation */ 12729 retval = create_cipher_auth_operation(ts_params, 12730 ut_params, 12731 reference, 0); 12732 12733 if (retval < 0) 12734 return retval; 12735 12736 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12737 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12738 ut_params->op); 12739 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12740 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12741 ut_params->op, 1, 1, 0, 0); 12742 else 12743 ut_params->op = process_crypto_request( 12744 ts_params->valid_devs[0], ut_params->op); 12745 12746 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 12747 12748 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12749 "crypto op processing failed"); 12750 12751 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 12752 12753 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 12754 ut_params->op->sym->auth.data.offset); 12755 auth_tag = authciphertext + plaintext_pad_len; 12756 debug_hexdump(stdout, "ciphertext:", authciphertext, 12757 reference->ciphertext.len); 12758 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 12759 12760 /* Validate obuf */ 12761 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12762 authciphertext, 12763 reference->ciphertext.data, 12764 reference->ciphertext.len, 12765 "Ciphertext data not as expected"); 12766 12767 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12768 auth_tag, 12769 reference->digest.data, 12770 reference->digest.len, 12771 "Generated digest not as expected"); 12772 12773 return TEST_SUCCESS; 12774 12775 } 12776 12777 static int 12778 test_authenticated_decrypt_with_esn( 12779 struct crypto_testsuite_params *ts_params, 12780 struct crypto_unittest_params *ut_params, 12781 const struct test_crypto_vector *reference) 12782 { 12783 int retval; 12784 12785 uint8_t *ciphertext; 12786 uint8_t cipher_key[reference->cipher_key.len + 1]; 12787 uint8_t auth_key[reference->auth_key.len + 1]; 12788 struct rte_cryptodev_info dev_info; 12789 12790 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12791 uint64_t feat_flags = dev_info.feature_flags; 12792 12793 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12794 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12795 printf("Device doesn't support RAW data-path APIs.\n"); 12796 return TEST_SKIPPED; 12797 } 12798 12799 /* Verify the capabilities */ 12800 struct rte_cryptodev_sym_capability_idx cap_idx; 12801 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12802 cap_idx.algo.auth = reference->auth_algo; 12803 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12804 &cap_idx) == NULL) 12805 return TEST_SKIPPED; 12806 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12807 cap_idx.algo.cipher = reference->crypto_algo; 12808 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12809 &cap_idx) == NULL) 12810 return TEST_SKIPPED; 12811 12812 /* Create session */ 12813 memcpy(cipher_key, reference->cipher_key.data, 12814 reference->cipher_key.len); 12815 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12816 12817 /* Setup Authentication Parameters */ 12818 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12819 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 12820 ut_params->auth_xform.auth.algo = reference->auth_algo; 12821 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12822 ut_params->auth_xform.auth.key.data = auth_key; 12823 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12824 ut_params->auth_xform.next = &ut_params->cipher_xform; 12825 12826 /* Setup Cipher Parameters */ 12827 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12828 ut_params->cipher_xform.next = NULL; 12829 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12830 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 12831 ut_params->cipher_xform.cipher.key.data = cipher_key; 12832 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12833 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12834 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12835 12836 /* Create Crypto session*/ 12837 ut_params->sess = rte_cryptodev_sym_session_create( 12838 ts_params->session_mpool); 12839 12840 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12841 ut_params->sess, 12842 &ut_params->auth_xform, 12843 ts_params->session_priv_mpool); 12844 12845 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12846 12847 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12848 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12849 "Failed to allocate input buffer in mempool"); 12850 12851 /* clear mbuf payload */ 12852 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12853 rte_pktmbuf_tailroom(ut_params->ibuf)); 12854 12855 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12856 reference->ciphertext.len); 12857 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12858 memcpy(ciphertext, reference->ciphertext.data, 12859 reference->ciphertext.len); 12860 12861 /* Create operation */ 12862 retval = create_cipher_auth_verify_operation(ts_params, 12863 ut_params, 12864 reference); 12865 12866 if (retval < 0) 12867 return retval; 12868 12869 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12870 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12871 ut_params->op); 12872 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12873 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12874 ut_params->op, 1, 1, 0, 0); 12875 else 12876 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12877 ut_params->op); 12878 12879 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 12880 TEST_ASSERT_EQUAL(ut_params->op->status, 12881 RTE_CRYPTO_OP_STATUS_SUCCESS, 12882 "crypto op processing passed"); 12883 12884 ut_params->obuf = ut_params->op->sym->m_src; 12885 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 12886 12887 return 0; 12888 } 12889 12890 static int 12891 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 12892 const struct aead_test_data *tdata, 12893 void *digest_mem, uint64_t digest_phys) 12894 { 12895 struct crypto_testsuite_params *ts_params = &testsuite_params; 12896 struct crypto_unittest_params *ut_params = &unittest_params; 12897 12898 const unsigned int auth_tag_len = tdata->auth_tag.len; 12899 const unsigned int iv_len = tdata->iv.len; 12900 unsigned int aad_len = tdata->aad.len; 12901 unsigned int aad_len_pad = 0; 12902 12903 /* Generate Crypto op data structure */ 12904 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12905 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12906 TEST_ASSERT_NOT_NULL(ut_params->op, 12907 "Failed to allocate symmetric crypto operation struct"); 12908 12909 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12910 12911 sym_op->aead.digest.data = digest_mem; 12912 12913 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 12914 "no room to append digest"); 12915 12916 sym_op->aead.digest.phys_addr = digest_phys; 12917 12918 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 12919 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 12920 auth_tag_len); 12921 debug_hexdump(stdout, "digest:", 12922 sym_op->aead.digest.data, 12923 auth_tag_len); 12924 } 12925 12926 /* Append aad data */ 12927 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 12928 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12929 uint8_t *, IV_OFFSET); 12930 12931 /* Copy IV 1 byte after the IV pointer, according to the API */ 12932 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 12933 12934 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 12935 12936 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12937 ut_params->ibuf, aad_len); 12938 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12939 "no room to prepend aad"); 12940 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12941 ut_params->ibuf); 12942 12943 memset(sym_op->aead.aad.data, 0, aad_len); 12944 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 12945 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12946 12947 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12948 debug_hexdump(stdout, "aad:", 12949 sym_op->aead.aad.data, aad_len); 12950 } else { 12951 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12952 uint8_t *, IV_OFFSET); 12953 12954 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 12955 12956 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 12957 12958 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12959 ut_params->ibuf, aad_len_pad); 12960 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12961 "no room to prepend aad"); 12962 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12963 ut_params->ibuf); 12964 12965 memset(sym_op->aead.aad.data, 0, aad_len); 12966 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12967 12968 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12969 debug_hexdump(stdout, "aad:", 12970 sym_op->aead.aad.data, aad_len); 12971 } 12972 12973 sym_op->aead.data.length = tdata->plaintext.len; 12974 sym_op->aead.data.offset = aad_len_pad; 12975 12976 return 0; 12977 } 12978 12979 #define SGL_MAX_NO 16 12980 12981 static int 12982 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 12983 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 12984 { 12985 struct crypto_testsuite_params *ts_params = &testsuite_params; 12986 struct crypto_unittest_params *ut_params = &unittest_params; 12987 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 12988 int retval; 12989 int to_trn = 0; 12990 int to_trn_tbl[SGL_MAX_NO]; 12991 int segs = 1; 12992 unsigned int trn_data = 0; 12993 uint8_t *plaintext, *ciphertext, *auth_tag; 12994 struct rte_cryptodev_info dev_info; 12995 12996 /* Verify the capabilities */ 12997 struct rte_cryptodev_sym_capability_idx cap_idx; 12998 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 12999 cap_idx.algo.aead = tdata->algo; 13000 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 13001 &cap_idx) == NULL) 13002 return TEST_SKIPPED; 13003 13004 /* OOP not supported with CPU crypto */ 13005 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13006 return TEST_SKIPPED; 13007 13008 /* Detailed check for the particular SGL support flag */ 13009 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 13010 if (!oop) { 13011 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13012 if (sgl_in && (!(dev_info.feature_flags & 13013 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 13014 return TEST_SKIPPED; 13015 13016 uint64_t feat_flags = dev_info.feature_flags; 13017 13018 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 13019 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 13020 printf("Device doesn't support RAW data-path APIs.\n"); 13021 return TEST_SKIPPED; 13022 } 13023 } else { 13024 unsigned int sgl_in = fragsz < tdata->plaintext.len; 13025 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 13026 tdata->plaintext.len; 13027 /* Raw data path API does not support OOP */ 13028 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13029 return TEST_SKIPPED; 13030 if (sgl_in && !sgl_out) { 13031 if (!(dev_info.feature_flags & 13032 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 13033 return TEST_SKIPPED; 13034 } else if (!sgl_in && sgl_out) { 13035 if (!(dev_info.feature_flags & 13036 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 13037 return TEST_SKIPPED; 13038 } else if (sgl_in && sgl_out) { 13039 if (!(dev_info.feature_flags & 13040 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 13041 return TEST_SKIPPED; 13042 } 13043 } 13044 13045 if (fragsz > tdata->plaintext.len) 13046 fragsz = tdata->plaintext.len; 13047 13048 uint16_t plaintext_len = fragsz; 13049 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 13050 13051 if (fragsz_oop > tdata->plaintext.len) 13052 frag_size_oop = tdata->plaintext.len; 13053 13054 int ecx = 0; 13055 void *digest_mem = NULL; 13056 13057 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 13058 13059 if (tdata->plaintext.len % fragsz != 0) { 13060 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 13061 return 1; 13062 } else { 13063 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 13064 return 1; 13065 } 13066 13067 /* 13068 * For out-op-place we need to alloc another mbuf 13069 */ 13070 if (oop) { 13071 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13072 rte_pktmbuf_append(ut_params->obuf, 13073 frag_size_oop + prepend_len); 13074 buf_oop = ut_params->obuf; 13075 } 13076 13077 /* Create AEAD session */ 13078 retval = create_aead_session(ts_params->valid_devs[0], 13079 tdata->algo, 13080 RTE_CRYPTO_AEAD_OP_ENCRYPT, 13081 tdata->key.data, tdata->key.len, 13082 tdata->aad.len, tdata->auth_tag.len, 13083 tdata->iv.len); 13084 if (retval < 0) 13085 return retval; 13086 13087 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13088 13089 /* clear mbuf payload */ 13090 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 13091 rte_pktmbuf_tailroom(ut_params->ibuf)); 13092 13093 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13094 plaintext_len); 13095 13096 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 13097 13098 trn_data += plaintext_len; 13099 13100 buf = ut_params->ibuf; 13101 13102 /* 13103 * Loop until no more fragments 13104 */ 13105 13106 while (trn_data < tdata->plaintext.len) { 13107 ++segs; 13108 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 13109 (tdata->plaintext.len - trn_data) : fragsz; 13110 13111 to_trn_tbl[ecx++] = to_trn; 13112 13113 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 13114 buf = buf->next; 13115 13116 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 13117 rte_pktmbuf_tailroom(buf)); 13118 13119 /* OOP */ 13120 if (oop && !fragsz_oop) { 13121 buf_last_oop = buf_oop->next = 13122 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13123 buf_oop = buf_oop->next; 13124 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13125 0, rte_pktmbuf_tailroom(buf_oop)); 13126 rte_pktmbuf_append(buf_oop, to_trn); 13127 } 13128 13129 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 13130 to_trn); 13131 13132 memcpy(plaintext, tdata->plaintext.data + trn_data, 13133 to_trn); 13134 trn_data += to_trn; 13135 if (trn_data == tdata->plaintext.len) { 13136 if (oop) { 13137 if (!fragsz_oop) 13138 digest_mem = rte_pktmbuf_append(buf_oop, 13139 tdata->auth_tag.len); 13140 } else 13141 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 13142 tdata->auth_tag.len); 13143 } 13144 } 13145 13146 uint64_t digest_phys = 0; 13147 13148 ut_params->ibuf->nb_segs = segs; 13149 13150 segs = 1; 13151 if (fragsz_oop && oop) { 13152 to_trn = 0; 13153 ecx = 0; 13154 13155 if (frag_size_oop == tdata->plaintext.len) { 13156 digest_mem = rte_pktmbuf_append(ut_params->obuf, 13157 tdata->auth_tag.len); 13158 13159 digest_phys = rte_pktmbuf_iova_offset( 13160 ut_params->obuf, 13161 tdata->plaintext.len + prepend_len); 13162 } 13163 13164 trn_data = frag_size_oop; 13165 while (trn_data < tdata->plaintext.len) { 13166 ++segs; 13167 to_trn = 13168 (tdata->plaintext.len - trn_data < 13169 frag_size_oop) ? 13170 (tdata->plaintext.len - trn_data) : 13171 frag_size_oop; 13172 13173 to_trn_tbl[ecx++] = to_trn; 13174 13175 buf_last_oop = buf_oop->next = 13176 rte_pktmbuf_alloc(ts_params->mbuf_pool); 13177 buf_oop = buf_oop->next; 13178 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 13179 0, rte_pktmbuf_tailroom(buf_oop)); 13180 rte_pktmbuf_append(buf_oop, to_trn); 13181 13182 trn_data += to_trn; 13183 13184 if (trn_data == tdata->plaintext.len) { 13185 digest_mem = rte_pktmbuf_append(buf_oop, 13186 tdata->auth_tag.len); 13187 } 13188 } 13189 13190 ut_params->obuf->nb_segs = segs; 13191 } 13192 13193 /* 13194 * Place digest at the end of the last buffer 13195 */ 13196 if (!digest_phys) 13197 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 13198 if (oop && buf_last_oop) 13199 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 13200 13201 if (!digest_mem && !oop) { 13202 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 13203 + tdata->auth_tag.len); 13204 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 13205 tdata->plaintext.len); 13206 } 13207 13208 /* Create AEAD operation */ 13209 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 13210 tdata, digest_mem, digest_phys); 13211 13212 if (retval < 0) 13213 return retval; 13214 13215 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 13216 13217 ut_params->op->sym->m_src = ut_params->ibuf; 13218 if (oop) 13219 ut_params->op->sym->m_dst = ut_params->obuf; 13220 13221 /* Process crypto operation */ 13222 if (oop == IN_PLACE && 13223 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 13224 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 13225 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 13226 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 13227 ut_params->op, 0, 0, 0, 0); 13228 else 13229 TEST_ASSERT_NOT_NULL( 13230 process_crypto_request(ts_params->valid_devs[0], 13231 ut_params->op), "failed to process sym crypto op"); 13232 13233 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 13234 "crypto op processing failed"); 13235 13236 13237 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 13238 uint8_t *, prepend_len); 13239 if (oop) { 13240 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 13241 uint8_t *, prepend_len); 13242 } 13243 13244 if (fragsz_oop) 13245 fragsz = fragsz_oop; 13246 13247 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13248 ciphertext, 13249 tdata->ciphertext.data, 13250 fragsz, 13251 "Ciphertext data not as expected"); 13252 13253 buf = ut_params->op->sym->m_src->next; 13254 if (oop) 13255 buf = ut_params->op->sym->m_dst->next; 13256 13257 unsigned int off = fragsz; 13258 13259 ecx = 0; 13260 while (buf) { 13261 ciphertext = rte_pktmbuf_mtod(buf, 13262 uint8_t *); 13263 13264 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13265 ciphertext, 13266 tdata->ciphertext.data + off, 13267 to_trn_tbl[ecx], 13268 "Ciphertext data not as expected"); 13269 13270 off += to_trn_tbl[ecx++]; 13271 buf = buf->next; 13272 } 13273 13274 auth_tag = digest_mem; 13275 TEST_ASSERT_BUFFERS_ARE_EQUAL( 13276 auth_tag, 13277 tdata->auth_tag.data, 13278 tdata->auth_tag.len, 13279 "Generated auth tag not as expected"); 13280 13281 return 0; 13282 } 13283 13284 static int 13285 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 13286 { 13287 return test_authenticated_encryption_SGL( 13288 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 13289 } 13290 13291 static int 13292 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 13293 { 13294 return test_authenticated_encryption_SGL( 13295 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 13296 } 13297 13298 static int 13299 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 13300 { 13301 return test_authenticated_encryption_SGL( 13302 &gcm_test_case_8, OUT_OF_PLACE, 400, 13303 gcm_test_case_8.plaintext.len); 13304 } 13305 13306 static int 13307 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 13308 { 13309 /* This test is not for OPENSSL PMD */ 13310 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13311 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 13312 return TEST_SKIPPED; 13313 13314 return test_authenticated_encryption_SGL( 13315 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 13316 } 13317 13318 static int 13319 test_authentication_verify_fail_when_data_corrupted( 13320 struct crypto_testsuite_params *ts_params, 13321 struct crypto_unittest_params *ut_params, 13322 const struct test_crypto_vector *reference) 13323 { 13324 return test_authentication_verify_fail_when_data_corruption( 13325 ts_params, ut_params, reference, 1); 13326 } 13327 13328 static int 13329 test_authentication_verify_fail_when_tag_corrupted( 13330 struct crypto_testsuite_params *ts_params, 13331 struct crypto_unittest_params *ut_params, 13332 const struct test_crypto_vector *reference) 13333 { 13334 return test_authentication_verify_fail_when_data_corruption( 13335 ts_params, ut_params, reference, 0); 13336 } 13337 13338 static int 13339 test_authentication_verify_GMAC_fail_when_data_corrupted( 13340 struct crypto_testsuite_params *ts_params, 13341 struct crypto_unittest_params *ut_params, 13342 const struct test_crypto_vector *reference) 13343 { 13344 return test_authentication_verify_GMAC_fail_when_corruption( 13345 ts_params, ut_params, reference, 1); 13346 } 13347 13348 static int 13349 test_authentication_verify_GMAC_fail_when_tag_corrupted( 13350 struct crypto_testsuite_params *ts_params, 13351 struct crypto_unittest_params *ut_params, 13352 const struct test_crypto_vector *reference) 13353 { 13354 return test_authentication_verify_GMAC_fail_when_corruption( 13355 ts_params, ut_params, reference, 0); 13356 } 13357 13358 static int 13359 test_authenticated_decryption_fail_when_data_corrupted( 13360 struct crypto_testsuite_params *ts_params, 13361 struct crypto_unittest_params *ut_params, 13362 const struct test_crypto_vector *reference) 13363 { 13364 return test_authenticated_decryption_fail_when_corruption( 13365 ts_params, ut_params, reference, 1); 13366 } 13367 13368 static int 13369 test_authenticated_decryption_fail_when_tag_corrupted( 13370 struct crypto_testsuite_params *ts_params, 13371 struct crypto_unittest_params *ut_params, 13372 const struct test_crypto_vector *reference) 13373 { 13374 return test_authenticated_decryption_fail_when_corruption( 13375 ts_params, ut_params, reference, 0); 13376 } 13377 13378 static int 13379 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 13380 { 13381 return test_authentication_verify_fail_when_data_corrupted( 13382 &testsuite_params, &unittest_params, 13383 &hmac_sha1_test_crypto_vector); 13384 } 13385 13386 static int 13387 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 13388 { 13389 return test_authentication_verify_fail_when_tag_corrupted( 13390 &testsuite_params, &unittest_params, 13391 &hmac_sha1_test_crypto_vector); 13392 } 13393 13394 static int 13395 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 13396 { 13397 return test_authentication_verify_GMAC_fail_when_data_corrupted( 13398 &testsuite_params, &unittest_params, 13399 &aes128_gmac_test_vector); 13400 } 13401 13402 static int 13403 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 13404 { 13405 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 13406 &testsuite_params, &unittest_params, 13407 &aes128_gmac_test_vector); 13408 } 13409 13410 static int 13411 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 13412 { 13413 return test_authenticated_decryption_fail_when_data_corrupted( 13414 &testsuite_params, 13415 &unittest_params, 13416 &aes128cbc_hmac_sha1_test_vector); 13417 } 13418 13419 static int 13420 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 13421 { 13422 return test_authenticated_decryption_fail_when_tag_corrupted( 13423 &testsuite_params, 13424 &unittest_params, 13425 &aes128cbc_hmac_sha1_test_vector); 13426 } 13427 13428 static int 13429 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13430 { 13431 return test_authenticated_encrypt_with_esn( 13432 &testsuite_params, 13433 &unittest_params, 13434 &aes128cbc_hmac_sha1_aad_test_vector); 13435 } 13436 13437 static int 13438 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 13439 { 13440 return test_authenticated_decrypt_with_esn( 13441 &testsuite_params, 13442 &unittest_params, 13443 &aes128cbc_hmac_sha1_aad_test_vector); 13444 } 13445 13446 static int 13447 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 13448 { 13449 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 13450 } 13451 13452 static int 13453 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 13454 { 13455 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 13456 } 13457 13458 #ifdef RTE_CRYPTO_SCHEDULER 13459 13460 /* global AESNI worker IDs for the scheduler test */ 13461 uint8_t aesni_ids[2]; 13462 13463 static int 13464 scheduler_testsuite_setup(void) 13465 { 13466 uint32_t i = 0; 13467 int32_t nb_devs, ret; 13468 char vdev_args[VDEV_ARGS_SIZE] = {""}; 13469 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 13470 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 13471 uint16_t worker_core_count = 0; 13472 uint16_t socket_id = 0; 13473 13474 if (gbl_driver_id == rte_cryptodev_driver_id_get( 13475 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 13476 13477 /* Identify the Worker Cores 13478 * Use 2 worker cores for the device args 13479 */ 13480 RTE_LCORE_FOREACH_WORKER(i) { 13481 if (worker_core_count > 1) 13482 break; 13483 snprintf(vdev_args, sizeof(vdev_args), 13484 "%s%d", temp_str, i); 13485 strcpy(temp_str, vdev_args); 13486 strlcat(temp_str, ";", sizeof(temp_str)); 13487 worker_core_count++; 13488 socket_id = rte_lcore_to_socket_id(i); 13489 } 13490 if (worker_core_count != 2) { 13491 RTE_LOG(ERR, USER1, 13492 "Cryptodev scheduler test require at least " 13493 "two worker cores to run. " 13494 "Please use the correct coremask.\n"); 13495 return TEST_FAILED; 13496 } 13497 strcpy(temp_str, vdev_args); 13498 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 13499 temp_str, socket_id); 13500 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 13501 nb_devs = rte_cryptodev_device_count_by_driver( 13502 rte_cryptodev_driver_id_get( 13503 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 13504 if (nb_devs < 1) { 13505 ret = rte_vdev_init( 13506 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 13507 vdev_args); 13508 TEST_ASSERT(ret == 0, 13509 "Failed to create instance %u of pmd : %s", 13510 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 13511 } 13512 } 13513 return testsuite_setup(); 13514 } 13515 13516 static int 13517 test_scheduler_attach_worker_op(void) 13518 { 13519 struct crypto_testsuite_params *ts_params = &testsuite_params; 13520 uint8_t sched_id = ts_params->valid_devs[0]; 13521 uint32_t i, nb_devs_attached = 0; 13522 int ret; 13523 char vdev_name[32]; 13524 unsigned int count = rte_cryptodev_count(); 13525 13526 /* create 2 AESNI_MB vdevs on top of existing devices */ 13527 for (i = count; i < count + 2; i++) { 13528 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 13529 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 13530 i); 13531 ret = rte_vdev_init(vdev_name, NULL); 13532 13533 TEST_ASSERT(ret == 0, 13534 "Failed to create instance %u of" 13535 " pmd : %s", 13536 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13537 13538 if (ret < 0) { 13539 RTE_LOG(ERR, USER1, 13540 "Failed to create 2 AESNI MB PMDs.\n"); 13541 return TEST_SKIPPED; 13542 } 13543 } 13544 13545 /* attach 2 AESNI_MB cdevs */ 13546 for (i = count; i < count + 2; i++) { 13547 struct rte_cryptodev_info info; 13548 unsigned int session_size; 13549 13550 rte_cryptodev_info_get(i, &info); 13551 if (info.driver_id != rte_cryptodev_driver_id_get( 13552 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 13553 continue; 13554 13555 session_size = rte_cryptodev_sym_get_private_session_size(i); 13556 /* 13557 * Create the session mempool again, since now there are new devices 13558 * to use the mempool. 13559 */ 13560 if (ts_params->session_mpool) { 13561 rte_mempool_free(ts_params->session_mpool); 13562 ts_params->session_mpool = NULL; 13563 } 13564 if (ts_params->session_priv_mpool) { 13565 rte_mempool_free(ts_params->session_priv_mpool); 13566 ts_params->session_priv_mpool = NULL; 13567 } 13568 13569 if (info.sym.max_nb_sessions != 0 && 13570 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 13571 RTE_LOG(ERR, USER1, 13572 "Device does not support " 13573 "at least %u sessions\n", 13574 MAX_NB_SESSIONS); 13575 return TEST_FAILED; 13576 } 13577 /* 13578 * Create mempool with maximum number of sessions, 13579 * to include the session headers 13580 */ 13581 if (ts_params->session_mpool == NULL) { 13582 ts_params->session_mpool = 13583 rte_cryptodev_sym_session_pool_create( 13584 "test_sess_mp", 13585 MAX_NB_SESSIONS, 0, 0, 0, 13586 SOCKET_ID_ANY); 13587 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 13588 "session mempool allocation failed"); 13589 } 13590 13591 /* 13592 * Create mempool with maximum number of sessions, 13593 * to include device specific session private data 13594 */ 13595 if (ts_params->session_priv_mpool == NULL) { 13596 ts_params->session_priv_mpool = rte_mempool_create( 13597 "test_sess_mp_priv", 13598 MAX_NB_SESSIONS, 13599 session_size, 13600 0, 0, NULL, NULL, NULL, 13601 NULL, SOCKET_ID_ANY, 13602 0); 13603 13604 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 13605 "session mempool allocation failed"); 13606 } 13607 13608 ts_params->qp_conf.mp_session = ts_params->session_mpool; 13609 ts_params->qp_conf.mp_session_private = 13610 ts_params->session_priv_mpool; 13611 13612 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 13613 (uint8_t)i); 13614 13615 TEST_ASSERT(ret == 0, 13616 "Failed to attach device %u of pmd : %s", i, 13617 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13618 13619 aesni_ids[nb_devs_attached] = (uint8_t)i; 13620 13621 nb_devs_attached++; 13622 } 13623 13624 return 0; 13625 } 13626 13627 static int 13628 test_scheduler_detach_worker_op(void) 13629 { 13630 struct crypto_testsuite_params *ts_params = &testsuite_params; 13631 uint8_t sched_id = ts_params->valid_devs[0]; 13632 uint32_t i; 13633 int ret; 13634 13635 for (i = 0; i < 2; i++) { 13636 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 13637 aesni_ids[i]); 13638 TEST_ASSERT(ret == 0, 13639 "Failed to detach device %u", aesni_ids[i]); 13640 } 13641 13642 return 0; 13643 } 13644 13645 static int 13646 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 13647 { 13648 struct crypto_testsuite_params *ts_params = &testsuite_params; 13649 uint8_t sched_id = ts_params->valid_devs[0]; 13650 /* set mode */ 13651 return rte_cryptodev_scheduler_mode_set(sched_id, 13652 scheduler_mode); 13653 } 13654 13655 static int 13656 test_scheduler_mode_roundrobin_op(void) 13657 { 13658 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 13659 0, "Failed to set roundrobin mode"); 13660 return 0; 13661 13662 } 13663 13664 static int 13665 test_scheduler_mode_multicore_op(void) 13666 { 13667 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 13668 0, "Failed to set multicore mode"); 13669 13670 return 0; 13671 } 13672 13673 static int 13674 test_scheduler_mode_failover_op(void) 13675 { 13676 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 13677 0, "Failed to set failover mode"); 13678 13679 return 0; 13680 } 13681 13682 static int 13683 test_scheduler_mode_pkt_size_distr_op(void) 13684 { 13685 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 13686 0, "Failed to set pktsize mode"); 13687 13688 return 0; 13689 } 13690 13691 static int 13692 scheduler_multicore_testsuite_setup(void) 13693 { 13694 if (test_scheduler_attach_worker_op() < 0) 13695 return TEST_SKIPPED; 13696 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0) 13697 return TEST_SKIPPED; 13698 return 0; 13699 } 13700 13701 static int 13702 scheduler_roundrobin_testsuite_setup(void) 13703 { 13704 if (test_scheduler_attach_worker_op() < 0) 13705 return TEST_SKIPPED; 13706 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0) 13707 return TEST_SKIPPED; 13708 return 0; 13709 } 13710 13711 static int 13712 scheduler_failover_testsuite_setup(void) 13713 { 13714 if (test_scheduler_attach_worker_op() < 0) 13715 return TEST_SKIPPED; 13716 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0) 13717 return TEST_SKIPPED; 13718 return 0; 13719 } 13720 13721 static int 13722 scheduler_pkt_size_distr_testsuite_setup(void) 13723 { 13724 if (test_scheduler_attach_worker_op() < 0) 13725 return TEST_SKIPPED; 13726 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0) 13727 return TEST_SKIPPED; 13728 return 0; 13729 } 13730 13731 static void 13732 scheduler_mode_testsuite_teardown(void) 13733 { 13734 test_scheduler_detach_worker_op(); 13735 } 13736 13737 #endif /* RTE_CRYPTO_SCHEDULER */ 13738 13739 static struct unit_test_suite end_testsuite = { 13740 .suite_name = NULL, 13741 .setup = NULL, 13742 .teardown = NULL, 13743 .unit_test_suites = NULL 13744 }; 13745 13746 #ifdef RTE_LIB_SECURITY 13747 static struct unit_test_suite pdcp_proto_testsuite = { 13748 .suite_name = "PDCP Proto Unit Test Suite", 13749 .setup = pdcp_proto_testsuite_setup, 13750 .unit_test_cases = { 13751 TEST_CASE_ST(ut_setup_security, ut_teardown, 13752 test_PDCP_PROTO_all), 13753 TEST_CASES_END() /**< NULL terminate unit test array */ 13754 } 13755 }; 13756 13757 static struct unit_test_suite docsis_proto_testsuite = { 13758 .suite_name = "Docsis Proto Unit Test Suite", 13759 .setup = docsis_proto_testsuite_setup, 13760 .unit_test_cases = { 13761 TEST_CASE_ST(ut_setup_security, ut_teardown, 13762 test_DOCSIS_PROTO_all), 13763 TEST_CASES_END() /**< NULL terminate unit test array */ 13764 } 13765 }; 13766 #endif 13767 13768 static struct unit_test_suite cryptodev_gen_testsuite = { 13769 .suite_name = "Crypto General Unit Test Suite", 13770 .setup = crypto_gen_testsuite_setup, 13771 .unit_test_cases = { 13772 TEST_CASE_ST(ut_setup, ut_teardown, 13773 test_device_configure_invalid_dev_id), 13774 TEST_CASE_ST(ut_setup, ut_teardown, 13775 test_queue_pair_descriptor_setup), 13776 TEST_CASE_ST(ut_setup, ut_teardown, 13777 test_device_configure_invalid_queue_pair_ids), 13778 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 13779 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup), 13780 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup), 13781 TEST_CASES_END() /**< NULL terminate unit test array */ 13782 } 13783 }; 13784 13785 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = { 13786 .suite_name = "Negative HMAC SHA1 Unit Test Suite", 13787 .setup = negative_hmac_sha1_testsuite_setup, 13788 .unit_test_cases = { 13789 /** Negative tests */ 13790 TEST_CASE_ST(ut_setup, ut_teardown, 13791 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13792 TEST_CASE_ST(ut_setup, ut_teardown, 13793 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13794 TEST_CASE_ST(ut_setup, ut_teardown, 13795 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13796 TEST_CASE_ST(ut_setup, ut_teardown, 13797 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13798 13799 TEST_CASES_END() /**< NULL terminate unit test array */ 13800 } 13801 }; 13802 13803 static struct unit_test_suite cryptodev_multi_session_testsuite = { 13804 .suite_name = "Multi Session Unit Test Suite", 13805 .setup = multi_session_testsuite_setup, 13806 .unit_test_cases = { 13807 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 13808 TEST_CASE_ST(ut_setup, ut_teardown, 13809 test_multi_session_random_usage), 13810 13811 TEST_CASES_END() /**< NULL terminate unit test array */ 13812 } 13813 }; 13814 13815 static struct unit_test_suite cryptodev_null_testsuite = { 13816 .suite_name = "NULL Test Suite", 13817 .setup = null_testsuite_setup, 13818 .unit_test_cases = { 13819 TEST_CASE_ST(ut_setup, ut_teardown, 13820 test_null_invalid_operation), 13821 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 13822 TEST_CASES_END() 13823 } 13824 }; 13825 13826 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = { 13827 .suite_name = "AES CCM Authenticated Test Suite", 13828 .setup = aes_ccm_auth_testsuite_setup, 13829 .unit_test_cases = { 13830 /** AES CCM Authenticated Encryption 128 bits key*/ 13831 TEST_CASE_ST(ut_setup, ut_teardown, 13832 test_AES_CCM_authenticated_encryption_test_case_128_1), 13833 TEST_CASE_ST(ut_setup, ut_teardown, 13834 test_AES_CCM_authenticated_encryption_test_case_128_2), 13835 TEST_CASE_ST(ut_setup, ut_teardown, 13836 test_AES_CCM_authenticated_encryption_test_case_128_3), 13837 13838 /** AES CCM Authenticated Decryption 128 bits key*/ 13839 TEST_CASE_ST(ut_setup, ut_teardown, 13840 test_AES_CCM_authenticated_decryption_test_case_128_1), 13841 TEST_CASE_ST(ut_setup, ut_teardown, 13842 test_AES_CCM_authenticated_decryption_test_case_128_2), 13843 TEST_CASE_ST(ut_setup, ut_teardown, 13844 test_AES_CCM_authenticated_decryption_test_case_128_3), 13845 13846 /** AES CCM Authenticated Encryption 192 bits key */ 13847 TEST_CASE_ST(ut_setup, ut_teardown, 13848 test_AES_CCM_authenticated_encryption_test_case_192_1), 13849 TEST_CASE_ST(ut_setup, ut_teardown, 13850 test_AES_CCM_authenticated_encryption_test_case_192_2), 13851 TEST_CASE_ST(ut_setup, ut_teardown, 13852 test_AES_CCM_authenticated_encryption_test_case_192_3), 13853 13854 /** AES CCM Authenticated Decryption 192 bits key*/ 13855 TEST_CASE_ST(ut_setup, ut_teardown, 13856 test_AES_CCM_authenticated_decryption_test_case_192_1), 13857 TEST_CASE_ST(ut_setup, ut_teardown, 13858 test_AES_CCM_authenticated_decryption_test_case_192_2), 13859 TEST_CASE_ST(ut_setup, ut_teardown, 13860 test_AES_CCM_authenticated_decryption_test_case_192_3), 13861 13862 /** AES CCM Authenticated Encryption 256 bits key */ 13863 TEST_CASE_ST(ut_setup, ut_teardown, 13864 test_AES_CCM_authenticated_encryption_test_case_256_1), 13865 TEST_CASE_ST(ut_setup, ut_teardown, 13866 test_AES_CCM_authenticated_encryption_test_case_256_2), 13867 TEST_CASE_ST(ut_setup, ut_teardown, 13868 test_AES_CCM_authenticated_encryption_test_case_256_3), 13869 13870 /** AES CCM Authenticated Decryption 256 bits key*/ 13871 TEST_CASE_ST(ut_setup, ut_teardown, 13872 test_AES_CCM_authenticated_decryption_test_case_256_1), 13873 TEST_CASE_ST(ut_setup, ut_teardown, 13874 test_AES_CCM_authenticated_decryption_test_case_256_2), 13875 TEST_CASE_ST(ut_setup, ut_teardown, 13876 test_AES_CCM_authenticated_decryption_test_case_256_3), 13877 TEST_CASES_END() 13878 } 13879 }; 13880 13881 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = { 13882 .suite_name = "AES GCM Authenticated Test Suite", 13883 .setup = aes_gcm_auth_testsuite_setup, 13884 .unit_test_cases = { 13885 /** AES GCM Authenticated Encryption */ 13886 TEST_CASE_ST(ut_setup, ut_teardown, 13887 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 13888 TEST_CASE_ST(ut_setup, ut_teardown, 13889 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 13890 TEST_CASE_ST(ut_setup, ut_teardown, 13891 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 13892 TEST_CASE_ST(ut_setup, ut_teardown, 13893 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 13894 TEST_CASE_ST(ut_setup, ut_teardown, 13895 test_AES_GCM_authenticated_encryption_test_case_1), 13896 TEST_CASE_ST(ut_setup, ut_teardown, 13897 test_AES_GCM_authenticated_encryption_test_case_2), 13898 TEST_CASE_ST(ut_setup, ut_teardown, 13899 test_AES_GCM_authenticated_encryption_test_case_3), 13900 TEST_CASE_ST(ut_setup, ut_teardown, 13901 test_AES_GCM_authenticated_encryption_test_case_4), 13902 TEST_CASE_ST(ut_setup, ut_teardown, 13903 test_AES_GCM_authenticated_encryption_test_case_5), 13904 TEST_CASE_ST(ut_setup, ut_teardown, 13905 test_AES_GCM_authenticated_encryption_test_case_6), 13906 TEST_CASE_ST(ut_setup, ut_teardown, 13907 test_AES_GCM_authenticated_encryption_test_case_7), 13908 TEST_CASE_ST(ut_setup, ut_teardown, 13909 test_AES_GCM_authenticated_encryption_test_case_8), 13910 TEST_CASE_ST(ut_setup, ut_teardown, 13911 test_AES_GCM_J0_authenticated_encryption_test_case_1), 13912 13913 /** AES GCM Authenticated Decryption */ 13914 TEST_CASE_ST(ut_setup, ut_teardown, 13915 test_AES_GCM_authenticated_decryption_test_case_1), 13916 TEST_CASE_ST(ut_setup, ut_teardown, 13917 test_AES_GCM_authenticated_decryption_test_case_2), 13918 TEST_CASE_ST(ut_setup, ut_teardown, 13919 test_AES_GCM_authenticated_decryption_test_case_3), 13920 TEST_CASE_ST(ut_setup, ut_teardown, 13921 test_AES_GCM_authenticated_decryption_test_case_4), 13922 TEST_CASE_ST(ut_setup, ut_teardown, 13923 test_AES_GCM_authenticated_decryption_test_case_5), 13924 TEST_CASE_ST(ut_setup, ut_teardown, 13925 test_AES_GCM_authenticated_decryption_test_case_6), 13926 TEST_CASE_ST(ut_setup, ut_teardown, 13927 test_AES_GCM_authenticated_decryption_test_case_7), 13928 TEST_CASE_ST(ut_setup, ut_teardown, 13929 test_AES_GCM_authenticated_decryption_test_case_8), 13930 TEST_CASE_ST(ut_setup, ut_teardown, 13931 test_AES_GCM_J0_authenticated_decryption_test_case_1), 13932 13933 /** AES GCM Authenticated Encryption 192 bits key */ 13934 TEST_CASE_ST(ut_setup, ut_teardown, 13935 test_AES_GCM_auth_encryption_test_case_192_1), 13936 TEST_CASE_ST(ut_setup, ut_teardown, 13937 test_AES_GCM_auth_encryption_test_case_192_2), 13938 TEST_CASE_ST(ut_setup, ut_teardown, 13939 test_AES_GCM_auth_encryption_test_case_192_3), 13940 TEST_CASE_ST(ut_setup, ut_teardown, 13941 test_AES_GCM_auth_encryption_test_case_192_4), 13942 TEST_CASE_ST(ut_setup, ut_teardown, 13943 test_AES_GCM_auth_encryption_test_case_192_5), 13944 TEST_CASE_ST(ut_setup, ut_teardown, 13945 test_AES_GCM_auth_encryption_test_case_192_6), 13946 TEST_CASE_ST(ut_setup, ut_teardown, 13947 test_AES_GCM_auth_encryption_test_case_192_7), 13948 13949 /** AES GCM Authenticated Decryption 192 bits key */ 13950 TEST_CASE_ST(ut_setup, ut_teardown, 13951 test_AES_GCM_auth_decryption_test_case_192_1), 13952 TEST_CASE_ST(ut_setup, ut_teardown, 13953 test_AES_GCM_auth_decryption_test_case_192_2), 13954 TEST_CASE_ST(ut_setup, ut_teardown, 13955 test_AES_GCM_auth_decryption_test_case_192_3), 13956 TEST_CASE_ST(ut_setup, ut_teardown, 13957 test_AES_GCM_auth_decryption_test_case_192_4), 13958 TEST_CASE_ST(ut_setup, ut_teardown, 13959 test_AES_GCM_auth_decryption_test_case_192_5), 13960 TEST_CASE_ST(ut_setup, ut_teardown, 13961 test_AES_GCM_auth_decryption_test_case_192_6), 13962 TEST_CASE_ST(ut_setup, ut_teardown, 13963 test_AES_GCM_auth_decryption_test_case_192_7), 13964 13965 /** AES GCM Authenticated Encryption 256 bits key */ 13966 TEST_CASE_ST(ut_setup, ut_teardown, 13967 test_AES_GCM_auth_encryption_test_case_256_1), 13968 TEST_CASE_ST(ut_setup, ut_teardown, 13969 test_AES_GCM_auth_encryption_test_case_256_2), 13970 TEST_CASE_ST(ut_setup, ut_teardown, 13971 test_AES_GCM_auth_encryption_test_case_256_3), 13972 TEST_CASE_ST(ut_setup, ut_teardown, 13973 test_AES_GCM_auth_encryption_test_case_256_4), 13974 TEST_CASE_ST(ut_setup, ut_teardown, 13975 test_AES_GCM_auth_encryption_test_case_256_5), 13976 TEST_CASE_ST(ut_setup, ut_teardown, 13977 test_AES_GCM_auth_encryption_test_case_256_6), 13978 TEST_CASE_ST(ut_setup, ut_teardown, 13979 test_AES_GCM_auth_encryption_test_case_256_7), 13980 13981 /** AES GCM Authenticated Decryption 256 bits key */ 13982 TEST_CASE_ST(ut_setup, ut_teardown, 13983 test_AES_GCM_auth_decryption_test_case_256_1), 13984 TEST_CASE_ST(ut_setup, ut_teardown, 13985 test_AES_GCM_auth_decryption_test_case_256_2), 13986 TEST_CASE_ST(ut_setup, ut_teardown, 13987 test_AES_GCM_auth_decryption_test_case_256_3), 13988 TEST_CASE_ST(ut_setup, ut_teardown, 13989 test_AES_GCM_auth_decryption_test_case_256_4), 13990 TEST_CASE_ST(ut_setup, ut_teardown, 13991 test_AES_GCM_auth_decryption_test_case_256_5), 13992 TEST_CASE_ST(ut_setup, ut_teardown, 13993 test_AES_GCM_auth_decryption_test_case_256_6), 13994 TEST_CASE_ST(ut_setup, ut_teardown, 13995 test_AES_GCM_auth_decryption_test_case_256_7), 13996 13997 /** AES GCM Authenticated Encryption big aad size */ 13998 TEST_CASE_ST(ut_setup, ut_teardown, 13999 test_AES_GCM_auth_encryption_test_case_aad_1), 14000 TEST_CASE_ST(ut_setup, ut_teardown, 14001 test_AES_GCM_auth_encryption_test_case_aad_2), 14002 14003 /** AES GCM Authenticated Decryption big aad size */ 14004 TEST_CASE_ST(ut_setup, ut_teardown, 14005 test_AES_GCM_auth_decryption_test_case_aad_1), 14006 TEST_CASE_ST(ut_setup, ut_teardown, 14007 test_AES_GCM_auth_decryption_test_case_aad_2), 14008 14009 /** Out of place tests */ 14010 TEST_CASE_ST(ut_setup, ut_teardown, 14011 test_AES_GCM_authenticated_encryption_oop_test_case_1), 14012 TEST_CASE_ST(ut_setup, ut_teardown, 14013 test_AES_GCM_authenticated_decryption_oop_test_case_1), 14014 14015 /** Session-less tests */ 14016 TEST_CASE_ST(ut_setup, ut_teardown, 14017 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 14018 TEST_CASE_ST(ut_setup, ut_teardown, 14019 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 14020 14021 TEST_CASES_END() 14022 } 14023 }; 14024 14025 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = { 14026 .suite_name = "AES GMAC Authentication Test Suite", 14027 .setup = aes_gmac_auth_testsuite_setup, 14028 .unit_test_cases = { 14029 TEST_CASE_ST(ut_setup, ut_teardown, 14030 test_AES_GMAC_authentication_test_case_1), 14031 TEST_CASE_ST(ut_setup, ut_teardown, 14032 test_AES_GMAC_authentication_verify_test_case_1), 14033 TEST_CASE_ST(ut_setup, ut_teardown, 14034 test_AES_GMAC_authentication_test_case_2), 14035 TEST_CASE_ST(ut_setup, ut_teardown, 14036 test_AES_GMAC_authentication_verify_test_case_2), 14037 TEST_CASE_ST(ut_setup, ut_teardown, 14038 test_AES_GMAC_authentication_test_case_3), 14039 TEST_CASE_ST(ut_setup, ut_teardown, 14040 test_AES_GMAC_authentication_verify_test_case_3), 14041 TEST_CASE_ST(ut_setup, ut_teardown, 14042 test_AES_GMAC_authentication_test_case_4), 14043 TEST_CASE_ST(ut_setup, ut_teardown, 14044 test_AES_GMAC_authentication_verify_test_case_4), 14045 TEST_CASE_ST(ut_setup, ut_teardown, 14046 test_AES_GMAC_authentication_SGL_40B), 14047 TEST_CASE_ST(ut_setup, ut_teardown, 14048 test_AES_GMAC_authentication_SGL_80B), 14049 TEST_CASE_ST(ut_setup, ut_teardown, 14050 test_AES_GMAC_authentication_SGL_2048B), 14051 TEST_CASE_ST(ut_setup, ut_teardown, 14052 test_AES_GMAC_authentication_SGL_2047B), 14053 14054 TEST_CASES_END() 14055 } 14056 }; 14057 14058 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = { 14059 .suite_name = "Chacha20-Poly1305 Test Suite", 14060 .setup = chacha20_poly1305_testsuite_setup, 14061 .unit_test_cases = { 14062 TEST_CASE_ST(ut_setup, ut_teardown, 14063 test_chacha20_poly1305_encrypt_test_case_rfc8439), 14064 TEST_CASE_ST(ut_setup, ut_teardown, 14065 test_chacha20_poly1305_decrypt_test_case_rfc8439), 14066 TEST_CASES_END() 14067 } 14068 }; 14069 14070 static struct unit_test_suite cryptodev_snow3g_testsuite = { 14071 .suite_name = "SNOW 3G Test Suite", 14072 .setup = snow3g_testsuite_setup, 14073 .unit_test_cases = { 14074 /** SNOW 3G encrypt only (UEA2) */ 14075 TEST_CASE_ST(ut_setup, ut_teardown, 14076 test_snow3g_encryption_test_case_1), 14077 TEST_CASE_ST(ut_setup, ut_teardown, 14078 test_snow3g_encryption_test_case_2), 14079 TEST_CASE_ST(ut_setup, ut_teardown, 14080 test_snow3g_encryption_test_case_3), 14081 TEST_CASE_ST(ut_setup, ut_teardown, 14082 test_snow3g_encryption_test_case_4), 14083 TEST_CASE_ST(ut_setup, ut_teardown, 14084 test_snow3g_encryption_test_case_5), 14085 14086 TEST_CASE_ST(ut_setup, ut_teardown, 14087 test_PDCP_PROTO_short_mac), 14088 TEST_CASE_ST(ut_setup, ut_teardown, 14089 test_snow3g_encryption_test_case_1_oop), 14090 TEST_CASE_ST(ut_setup, ut_teardown, 14091 test_snow3g_encryption_test_case_1_oop_sgl), 14092 TEST_CASE_ST(ut_setup, ut_teardown, 14093 test_snow3g_encryption_test_case_1_offset_oop), 14094 TEST_CASE_ST(ut_setup, ut_teardown, 14095 test_snow3g_decryption_test_case_1_oop), 14096 14097 /** SNOW 3G generate auth, then encrypt (UEA2) */ 14098 TEST_CASE_ST(ut_setup, ut_teardown, 14099 test_snow3g_auth_cipher_test_case_1), 14100 TEST_CASE_ST(ut_setup, ut_teardown, 14101 test_snow3g_auth_cipher_test_case_2), 14102 TEST_CASE_ST(ut_setup, ut_teardown, 14103 test_snow3g_auth_cipher_test_case_2_oop), 14104 TEST_CASE_ST(ut_setup, ut_teardown, 14105 test_snow3g_auth_cipher_part_digest_enc), 14106 TEST_CASE_ST(ut_setup, ut_teardown, 14107 test_snow3g_auth_cipher_part_digest_enc_oop), 14108 TEST_CASE_ST(ut_setup, ut_teardown, 14109 test_snow3g_auth_cipher_test_case_3_sgl), 14110 TEST_CASE_ST(ut_setup, ut_teardown, 14111 test_snow3g_auth_cipher_test_case_3_oop_sgl), 14112 TEST_CASE_ST(ut_setup, ut_teardown, 14113 test_snow3g_auth_cipher_part_digest_enc_sgl), 14114 TEST_CASE_ST(ut_setup, ut_teardown, 14115 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 14116 14117 /** SNOW 3G decrypt (UEA2), then verify auth */ 14118 TEST_CASE_ST(ut_setup, ut_teardown, 14119 test_snow3g_auth_cipher_verify_test_case_1), 14120 TEST_CASE_ST(ut_setup, ut_teardown, 14121 test_snow3g_auth_cipher_verify_test_case_2), 14122 TEST_CASE_ST(ut_setup, ut_teardown, 14123 test_snow3g_auth_cipher_verify_test_case_2_oop), 14124 TEST_CASE_ST(ut_setup, ut_teardown, 14125 test_snow3g_auth_cipher_verify_part_digest_enc), 14126 TEST_CASE_ST(ut_setup, ut_teardown, 14127 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 14128 TEST_CASE_ST(ut_setup, ut_teardown, 14129 test_snow3g_auth_cipher_verify_test_case_3_sgl), 14130 TEST_CASE_ST(ut_setup, ut_teardown, 14131 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 14132 TEST_CASE_ST(ut_setup, ut_teardown, 14133 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 14134 TEST_CASE_ST(ut_setup, ut_teardown, 14135 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 14136 14137 /** SNOW 3G decrypt only (UEA2) */ 14138 TEST_CASE_ST(ut_setup, ut_teardown, 14139 test_snow3g_decryption_test_case_1), 14140 TEST_CASE_ST(ut_setup, ut_teardown, 14141 test_snow3g_decryption_test_case_2), 14142 TEST_CASE_ST(ut_setup, ut_teardown, 14143 test_snow3g_decryption_test_case_3), 14144 TEST_CASE_ST(ut_setup, ut_teardown, 14145 test_snow3g_decryption_test_case_4), 14146 TEST_CASE_ST(ut_setup, ut_teardown, 14147 test_snow3g_decryption_test_case_5), 14148 TEST_CASE_ST(ut_setup, ut_teardown, 14149 test_snow3g_decryption_with_digest_test_case_1), 14150 TEST_CASE_ST(ut_setup, ut_teardown, 14151 test_snow3g_hash_generate_test_case_1), 14152 TEST_CASE_ST(ut_setup, ut_teardown, 14153 test_snow3g_hash_generate_test_case_2), 14154 TEST_CASE_ST(ut_setup, ut_teardown, 14155 test_snow3g_hash_generate_test_case_3), 14156 14157 /* Tests with buffers which length is not byte-aligned */ 14158 TEST_CASE_ST(ut_setup, ut_teardown, 14159 test_snow3g_hash_generate_test_case_4), 14160 TEST_CASE_ST(ut_setup, ut_teardown, 14161 test_snow3g_hash_generate_test_case_5), 14162 TEST_CASE_ST(ut_setup, ut_teardown, 14163 test_snow3g_hash_generate_test_case_6), 14164 TEST_CASE_ST(ut_setup, ut_teardown, 14165 test_snow3g_hash_verify_test_case_1), 14166 TEST_CASE_ST(ut_setup, ut_teardown, 14167 test_snow3g_hash_verify_test_case_2), 14168 TEST_CASE_ST(ut_setup, ut_teardown, 14169 test_snow3g_hash_verify_test_case_3), 14170 14171 /* Tests with buffers which length is not byte-aligned */ 14172 TEST_CASE_ST(ut_setup, ut_teardown, 14173 test_snow3g_hash_verify_test_case_4), 14174 TEST_CASE_ST(ut_setup, ut_teardown, 14175 test_snow3g_hash_verify_test_case_5), 14176 TEST_CASE_ST(ut_setup, ut_teardown, 14177 test_snow3g_hash_verify_test_case_6), 14178 TEST_CASE_ST(ut_setup, ut_teardown, 14179 test_snow3g_cipher_auth_test_case_1), 14180 TEST_CASE_ST(ut_setup, ut_teardown, 14181 test_snow3g_auth_cipher_with_digest_test_case_1), 14182 TEST_CASES_END() 14183 } 14184 }; 14185 14186 static struct unit_test_suite cryptodev_zuc_testsuite = { 14187 .suite_name = "ZUC Test Suite", 14188 .setup = zuc_testsuite_setup, 14189 .unit_test_cases = { 14190 /** ZUC encrypt only (EEA3) */ 14191 TEST_CASE_ST(ut_setup, ut_teardown, 14192 test_zuc_encryption_test_case_1), 14193 TEST_CASE_ST(ut_setup, ut_teardown, 14194 test_zuc_encryption_test_case_2), 14195 TEST_CASE_ST(ut_setup, ut_teardown, 14196 test_zuc_encryption_test_case_3), 14197 TEST_CASE_ST(ut_setup, ut_teardown, 14198 test_zuc_encryption_test_case_4), 14199 TEST_CASE_ST(ut_setup, ut_teardown, 14200 test_zuc_encryption_test_case_5), 14201 TEST_CASE_ST(ut_setup, ut_teardown, 14202 test_zuc_encryption_test_case_6_sgl), 14203 14204 /** ZUC authenticate (EIA3) */ 14205 TEST_CASE_ST(ut_setup, ut_teardown, 14206 test_zuc_hash_generate_test_case_1), 14207 TEST_CASE_ST(ut_setup, ut_teardown, 14208 test_zuc_hash_generate_test_case_2), 14209 TEST_CASE_ST(ut_setup, ut_teardown, 14210 test_zuc_hash_generate_test_case_3), 14211 TEST_CASE_ST(ut_setup, ut_teardown, 14212 test_zuc_hash_generate_test_case_4), 14213 TEST_CASE_ST(ut_setup, ut_teardown, 14214 test_zuc_hash_generate_test_case_5), 14215 TEST_CASE_ST(ut_setup, ut_teardown, 14216 test_zuc_hash_generate_test_case_6), 14217 TEST_CASE_ST(ut_setup, ut_teardown, 14218 test_zuc_hash_generate_test_case_7), 14219 TEST_CASE_ST(ut_setup, ut_teardown, 14220 test_zuc_hash_generate_test_case_8), 14221 14222 /** ZUC alg-chain (EEA3/EIA3) */ 14223 TEST_CASE_ST(ut_setup, ut_teardown, 14224 test_zuc_cipher_auth_test_case_1), 14225 TEST_CASE_ST(ut_setup, ut_teardown, 14226 test_zuc_cipher_auth_test_case_2), 14227 14228 /** ZUC generate auth, then encrypt (EEA3) */ 14229 TEST_CASE_ST(ut_setup, ut_teardown, 14230 test_zuc_auth_cipher_test_case_1), 14231 TEST_CASE_ST(ut_setup, ut_teardown, 14232 test_zuc_auth_cipher_test_case_1_oop), 14233 TEST_CASE_ST(ut_setup, ut_teardown, 14234 test_zuc_auth_cipher_test_case_1_sgl), 14235 TEST_CASE_ST(ut_setup, ut_teardown, 14236 test_zuc_auth_cipher_test_case_1_oop_sgl), 14237 14238 /** ZUC decrypt (EEA3), then verify auth */ 14239 TEST_CASE_ST(ut_setup, ut_teardown, 14240 test_zuc_auth_cipher_verify_test_case_1), 14241 TEST_CASE_ST(ut_setup, ut_teardown, 14242 test_zuc_auth_cipher_verify_test_case_1_oop), 14243 TEST_CASE_ST(ut_setup, ut_teardown, 14244 test_zuc_auth_cipher_verify_test_case_1_sgl), 14245 TEST_CASE_ST(ut_setup, ut_teardown, 14246 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 14247 TEST_CASES_END() 14248 } 14249 }; 14250 14251 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = { 14252 .suite_name = "HMAC_MD5 Authentication Test Suite", 14253 .setup = hmac_md5_auth_testsuite_setup, 14254 .unit_test_cases = { 14255 TEST_CASE_ST(ut_setup, ut_teardown, 14256 test_MD5_HMAC_generate_case_1), 14257 TEST_CASE_ST(ut_setup, ut_teardown, 14258 test_MD5_HMAC_verify_case_1), 14259 TEST_CASE_ST(ut_setup, ut_teardown, 14260 test_MD5_HMAC_generate_case_2), 14261 TEST_CASE_ST(ut_setup, ut_teardown, 14262 test_MD5_HMAC_verify_case_2), 14263 TEST_CASES_END() 14264 } 14265 }; 14266 14267 static struct unit_test_suite cryptodev_kasumi_testsuite = { 14268 .suite_name = "Kasumi Test Suite", 14269 .setup = kasumi_testsuite_setup, 14270 .unit_test_cases = { 14271 /** KASUMI hash only (UIA1) */ 14272 TEST_CASE_ST(ut_setup, ut_teardown, 14273 test_kasumi_hash_generate_test_case_1), 14274 TEST_CASE_ST(ut_setup, ut_teardown, 14275 test_kasumi_hash_generate_test_case_2), 14276 TEST_CASE_ST(ut_setup, ut_teardown, 14277 test_kasumi_hash_generate_test_case_3), 14278 TEST_CASE_ST(ut_setup, ut_teardown, 14279 test_kasumi_hash_generate_test_case_4), 14280 TEST_CASE_ST(ut_setup, ut_teardown, 14281 test_kasumi_hash_generate_test_case_5), 14282 TEST_CASE_ST(ut_setup, ut_teardown, 14283 test_kasumi_hash_generate_test_case_6), 14284 14285 TEST_CASE_ST(ut_setup, ut_teardown, 14286 test_kasumi_hash_verify_test_case_1), 14287 TEST_CASE_ST(ut_setup, ut_teardown, 14288 test_kasumi_hash_verify_test_case_2), 14289 TEST_CASE_ST(ut_setup, ut_teardown, 14290 test_kasumi_hash_verify_test_case_3), 14291 TEST_CASE_ST(ut_setup, ut_teardown, 14292 test_kasumi_hash_verify_test_case_4), 14293 TEST_CASE_ST(ut_setup, ut_teardown, 14294 test_kasumi_hash_verify_test_case_5), 14295 14296 /** KASUMI encrypt only (UEA1) */ 14297 TEST_CASE_ST(ut_setup, ut_teardown, 14298 test_kasumi_encryption_test_case_1), 14299 TEST_CASE_ST(ut_setup, ut_teardown, 14300 test_kasumi_encryption_test_case_1_sgl), 14301 TEST_CASE_ST(ut_setup, ut_teardown, 14302 test_kasumi_encryption_test_case_1_oop), 14303 TEST_CASE_ST(ut_setup, ut_teardown, 14304 test_kasumi_encryption_test_case_1_oop_sgl), 14305 TEST_CASE_ST(ut_setup, ut_teardown, 14306 test_kasumi_encryption_test_case_2), 14307 TEST_CASE_ST(ut_setup, ut_teardown, 14308 test_kasumi_encryption_test_case_3), 14309 TEST_CASE_ST(ut_setup, ut_teardown, 14310 test_kasumi_encryption_test_case_4), 14311 TEST_CASE_ST(ut_setup, ut_teardown, 14312 test_kasumi_encryption_test_case_5), 14313 14314 /** KASUMI decrypt only (UEA1) */ 14315 TEST_CASE_ST(ut_setup, ut_teardown, 14316 test_kasumi_decryption_test_case_1), 14317 TEST_CASE_ST(ut_setup, ut_teardown, 14318 test_kasumi_decryption_test_case_2), 14319 TEST_CASE_ST(ut_setup, ut_teardown, 14320 test_kasumi_decryption_test_case_3), 14321 TEST_CASE_ST(ut_setup, ut_teardown, 14322 test_kasumi_decryption_test_case_4), 14323 TEST_CASE_ST(ut_setup, ut_teardown, 14324 test_kasumi_decryption_test_case_5), 14325 TEST_CASE_ST(ut_setup, ut_teardown, 14326 test_kasumi_decryption_test_case_1_oop), 14327 14328 TEST_CASE_ST(ut_setup, ut_teardown, 14329 test_PDCP_PROTO_short_mac), 14330 TEST_CASE_ST(ut_setup, ut_teardown, 14331 test_kasumi_cipher_auth_test_case_1), 14332 14333 /** KASUMI generate auth, then encrypt (F8) */ 14334 TEST_CASE_ST(ut_setup, ut_teardown, 14335 test_kasumi_auth_cipher_test_case_1), 14336 TEST_CASE_ST(ut_setup, ut_teardown, 14337 test_kasumi_auth_cipher_test_case_2), 14338 TEST_CASE_ST(ut_setup, ut_teardown, 14339 test_kasumi_auth_cipher_test_case_2_oop), 14340 TEST_CASE_ST(ut_setup, ut_teardown, 14341 test_kasumi_auth_cipher_test_case_2_sgl), 14342 TEST_CASE_ST(ut_setup, ut_teardown, 14343 test_kasumi_auth_cipher_test_case_2_oop_sgl), 14344 14345 /** KASUMI decrypt (F8), then verify auth */ 14346 TEST_CASE_ST(ut_setup, ut_teardown, 14347 test_kasumi_auth_cipher_verify_test_case_1), 14348 TEST_CASE_ST(ut_setup, ut_teardown, 14349 test_kasumi_auth_cipher_verify_test_case_2), 14350 TEST_CASE_ST(ut_setup, ut_teardown, 14351 test_kasumi_auth_cipher_verify_test_case_2_oop), 14352 TEST_CASE_ST(ut_setup, ut_teardown, 14353 test_kasumi_auth_cipher_verify_test_case_2_sgl), 14354 TEST_CASE_ST(ut_setup, ut_teardown, 14355 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 14356 14357 TEST_CASES_END() 14358 } 14359 }; 14360 14361 static struct unit_test_suite cryptodev_esn_testsuite = { 14362 .suite_name = "ESN Test Suite", 14363 .setup = esn_testsuite_setup, 14364 .unit_test_cases = { 14365 TEST_CASE_ST(ut_setup, ut_teardown, 14366 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 14367 TEST_CASE_ST(ut_setup, ut_teardown, 14368 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 14369 TEST_CASES_END() 14370 } 14371 }; 14372 14373 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = { 14374 .suite_name = "Negative AES GCM Test Suite", 14375 .setup = negative_aes_gcm_testsuite_setup, 14376 .unit_test_cases = { 14377 TEST_CASE_ST(ut_setup, ut_teardown, 14378 test_AES_GCM_auth_encryption_fail_iv_corrupt), 14379 TEST_CASE_ST(ut_setup, ut_teardown, 14380 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 14381 TEST_CASE_ST(ut_setup, ut_teardown, 14382 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 14383 TEST_CASE_ST(ut_setup, ut_teardown, 14384 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 14385 TEST_CASE_ST(ut_setup, ut_teardown, 14386 test_AES_GCM_auth_encryption_fail_aad_corrupt), 14387 TEST_CASE_ST(ut_setup, ut_teardown, 14388 test_AES_GCM_auth_encryption_fail_tag_corrupt), 14389 TEST_CASE_ST(ut_setup, ut_teardown, 14390 test_AES_GCM_auth_decryption_fail_iv_corrupt), 14391 TEST_CASE_ST(ut_setup, ut_teardown, 14392 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 14393 TEST_CASE_ST(ut_setup, ut_teardown, 14394 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 14395 TEST_CASE_ST(ut_setup, ut_teardown, 14396 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 14397 TEST_CASE_ST(ut_setup, ut_teardown, 14398 test_AES_GCM_auth_decryption_fail_aad_corrupt), 14399 TEST_CASE_ST(ut_setup, ut_teardown, 14400 test_AES_GCM_auth_decryption_fail_tag_corrupt), 14401 14402 TEST_CASES_END() 14403 } 14404 }; 14405 14406 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = { 14407 .suite_name = "Negative AES GMAC Test Suite", 14408 .setup = negative_aes_gmac_testsuite_setup, 14409 .unit_test_cases = { 14410 TEST_CASE_ST(ut_setup, ut_teardown, 14411 authentication_verify_AES128_GMAC_fail_data_corrupt), 14412 TEST_CASE_ST(ut_setup, ut_teardown, 14413 authentication_verify_AES128_GMAC_fail_tag_corrupt), 14414 14415 TEST_CASES_END() 14416 } 14417 }; 14418 14419 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = { 14420 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite", 14421 .setup = mixed_cipher_hash_testsuite_setup, 14422 .unit_test_cases = { 14423 /** AUTH AES CMAC + CIPHER AES CTR */ 14424 TEST_CASE_ST(ut_setup, ut_teardown, 14425 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 14426 TEST_CASE_ST(ut_setup, ut_teardown, 14427 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14428 TEST_CASE_ST(ut_setup, ut_teardown, 14429 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14430 TEST_CASE_ST(ut_setup, ut_teardown, 14431 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14432 TEST_CASE_ST(ut_setup, ut_teardown, 14433 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 14434 TEST_CASE_ST(ut_setup, ut_teardown, 14435 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 14436 TEST_CASE_ST(ut_setup, ut_teardown, 14437 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 14438 TEST_CASE_ST(ut_setup, ut_teardown, 14439 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 14440 14441 /** AUTH ZUC + CIPHER SNOW3G */ 14442 TEST_CASE_ST(ut_setup, ut_teardown, 14443 test_auth_zuc_cipher_snow_test_case_1), 14444 TEST_CASE_ST(ut_setup, ut_teardown, 14445 test_verify_auth_zuc_cipher_snow_test_case_1), 14446 /** AUTH AES CMAC + CIPHER SNOW3G */ 14447 TEST_CASE_ST(ut_setup, ut_teardown, 14448 test_auth_aes_cmac_cipher_snow_test_case_1), 14449 TEST_CASE_ST(ut_setup, ut_teardown, 14450 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 14451 /** AUTH ZUC + CIPHER AES CTR */ 14452 TEST_CASE_ST(ut_setup, ut_teardown, 14453 test_auth_zuc_cipher_aes_ctr_test_case_1), 14454 TEST_CASE_ST(ut_setup, ut_teardown, 14455 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 14456 /** AUTH SNOW3G + CIPHER AES CTR */ 14457 TEST_CASE_ST(ut_setup, ut_teardown, 14458 test_auth_snow_cipher_aes_ctr_test_case_1), 14459 TEST_CASE_ST(ut_setup, ut_teardown, 14460 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 14461 /** AUTH SNOW3G + CIPHER ZUC */ 14462 TEST_CASE_ST(ut_setup, ut_teardown, 14463 test_auth_snow_cipher_zuc_test_case_1), 14464 TEST_CASE_ST(ut_setup, ut_teardown, 14465 test_verify_auth_snow_cipher_zuc_test_case_1), 14466 /** AUTH AES CMAC + CIPHER ZUC */ 14467 TEST_CASE_ST(ut_setup, ut_teardown, 14468 test_auth_aes_cmac_cipher_zuc_test_case_1), 14469 TEST_CASE_ST(ut_setup, ut_teardown, 14470 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 14471 14472 /** AUTH NULL + CIPHER SNOW3G */ 14473 TEST_CASE_ST(ut_setup, ut_teardown, 14474 test_auth_null_cipher_snow_test_case_1), 14475 TEST_CASE_ST(ut_setup, ut_teardown, 14476 test_verify_auth_null_cipher_snow_test_case_1), 14477 /** AUTH NULL + CIPHER ZUC */ 14478 TEST_CASE_ST(ut_setup, ut_teardown, 14479 test_auth_null_cipher_zuc_test_case_1), 14480 TEST_CASE_ST(ut_setup, ut_teardown, 14481 test_verify_auth_null_cipher_zuc_test_case_1), 14482 /** AUTH SNOW3G + CIPHER NULL */ 14483 TEST_CASE_ST(ut_setup, ut_teardown, 14484 test_auth_snow_cipher_null_test_case_1), 14485 TEST_CASE_ST(ut_setup, ut_teardown, 14486 test_verify_auth_snow_cipher_null_test_case_1), 14487 /** AUTH ZUC + CIPHER NULL */ 14488 TEST_CASE_ST(ut_setup, ut_teardown, 14489 test_auth_zuc_cipher_null_test_case_1), 14490 TEST_CASE_ST(ut_setup, ut_teardown, 14491 test_verify_auth_zuc_cipher_null_test_case_1), 14492 /** AUTH NULL + CIPHER AES CTR */ 14493 TEST_CASE_ST(ut_setup, ut_teardown, 14494 test_auth_null_cipher_aes_ctr_test_case_1), 14495 TEST_CASE_ST(ut_setup, ut_teardown, 14496 test_verify_auth_null_cipher_aes_ctr_test_case_1), 14497 /** AUTH AES CMAC + CIPHER NULL */ 14498 TEST_CASE_ST(ut_setup, ut_teardown, 14499 test_auth_aes_cmac_cipher_null_test_case_1), 14500 TEST_CASE_ST(ut_setup, ut_teardown, 14501 test_verify_auth_aes_cmac_cipher_null_test_case_1), 14502 TEST_CASES_END() 14503 } 14504 }; 14505 14506 static int 14507 run_cryptodev_testsuite(const char *pmd_name) 14508 { 14509 uint8_t ret, j, i = 0, blk_start_idx = 0; 14510 const enum blockcipher_test_type blk_suites[] = { 14511 BLKCIPHER_AES_CHAIN_TYPE, 14512 BLKCIPHER_AES_CIPHERONLY_TYPE, 14513 BLKCIPHER_AES_DOCSIS_TYPE, 14514 BLKCIPHER_3DES_CHAIN_TYPE, 14515 BLKCIPHER_3DES_CIPHERONLY_TYPE, 14516 BLKCIPHER_DES_CIPHERONLY_TYPE, 14517 BLKCIPHER_DES_DOCSIS_TYPE, 14518 BLKCIPHER_AUTHONLY_TYPE}; 14519 struct unit_test_suite *static_suites[] = { 14520 &cryptodev_multi_session_testsuite, 14521 &cryptodev_null_testsuite, 14522 &cryptodev_aes_ccm_auth_testsuite, 14523 &cryptodev_aes_gcm_auth_testsuite, 14524 &cryptodev_aes_gmac_auth_testsuite, 14525 &cryptodev_snow3g_testsuite, 14526 &cryptodev_chacha20_poly1305_testsuite, 14527 &cryptodev_zuc_testsuite, 14528 &cryptodev_hmac_md5_auth_testsuite, 14529 &cryptodev_kasumi_testsuite, 14530 &cryptodev_esn_testsuite, 14531 &cryptodev_negative_aes_gcm_testsuite, 14532 &cryptodev_negative_aes_gmac_testsuite, 14533 &cryptodev_mixed_cipher_hash_testsuite, 14534 &cryptodev_negative_hmac_sha1_testsuite, 14535 &cryptodev_gen_testsuite, 14536 #ifdef RTE_LIB_SECURITY 14537 &pdcp_proto_testsuite, 14538 &docsis_proto_testsuite, 14539 #endif 14540 &end_testsuite 14541 }; 14542 static struct unit_test_suite ts = { 14543 .suite_name = "Cryptodev Unit Test Suite", 14544 .setup = testsuite_setup, 14545 .teardown = testsuite_teardown, 14546 .unit_test_cases = {TEST_CASES_END()} 14547 }; 14548 14549 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name); 14550 14551 if (gbl_driver_id == -1) { 14552 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name); 14553 return TEST_SKIPPED; 14554 } 14555 14556 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 14557 (RTE_DIM(blk_suites) + RTE_DIM(static_suites))); 14558 14559 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites)); 14560 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 14561 ret = unit_test_suite_runner(&ts); 14562 14563 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites)); 14564 free(ts.unit_test_suites); 14565 return ret; 14566 } 14567 14568 static int 14569 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name) 14570 { 14571 struct rte_cryptodev_info dev_info; 14572 uint8_t i, nb_devs; 14573 int driver_id; 14574 14575 driver_id = rte_cryptodev_driver_id_get(pmd_name); 14576 if (driver_id == -1) { 14577 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name); 14578 return TEST_SKIPPED; 14579 } 14580 14581 nb_devs = rte_cryptodev_count(); 14582 if (nb_devs < 1) { 14583 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 14584 return TEST_SKIPPED; 14585 } 14586 14587 for (i = 0; i < nb_devs; i++) { 14588 rte_cryptodev_info_get(i, &dev_info); 14589 if (dev_info.driver_id == driver_id) { 14590 if (!(dev_info.feature_flags & flag)) { 14591 RTE_LOG(INFO, USER1, "%s not supported\n", 14592 flag_name); 14593 return TEST_SKIPPED; 14594 } 14595 return 0; /* found */ 14596 } 14597 } 14598 14599 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name); 14600 return TEST_SKIPPED; 14601 } 14602 14603 static int 14604 test_cryptodev_qat(void) 14605 { 14606 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 14607 } 14608 14609 static int 14610 test_cryptodev_virtio(void) 14611 { 14612 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 14613 } 14614 14615 static int 14616 test_cryptodev_aesni_mb(void) 14617 { 14618 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14619 } 14620 14621 static int 14622 test_cryptodev_cpu_aesni_mb(void) 14623 { 14624 int32_t rc; 14625 enum rte_security_session_action_type at = gbl_action_type; 14626 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 14627 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 14628 gbl_action_type = at; 14629 return rc; 14630 } 14631 14632 static int 14633 test_cryptodev_openssl(void) 14634 { 14635 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 14636 } 14637 14638 static int 14639 test_cryptodev_aesni_gcm(void) 14640 { 14641 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 14642 } 14643 14644 static int 14645 test_cryptodev_cpu_aesni_gcm(void) 14646 { 14647 int32_t rc; 14648 enum rte_security_session_action_type at = gbl_action_type; 14649 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 14650 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 14651 gbl_action_type = at; 14652 return rc; 14653 } 14654 14655 static int 14656 test_cryptodev_mlx5(void) 14657 { 14658 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD)); 14659 } 14660 14661 static int 14662 test_cryptodev_null(void) 14663 { 14664 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 14665 } 14666 14667 static int 14668 test_cryptodev_sw_snow3g(void) 14669 { 14670 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 14671 } 14672 14673 static int 14674 test_cryptodev_sw_kasumi(void) 14675 { 14676 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 14677 } 14678 14679 static int 14680 test_cryptodev_sw_zuc(void) 14681 { 14682 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 14683 } 14684 14685 static int 14686 test_cryptodev_armv8(void) 14687 { 14688 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 14689 } 14690 14691 static int 14692 test_cryptodev_mrvl(void) 14693 { 14694 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 14695 } 14696 14697 #ifdef RTE_CRYPTO_SCHEDULER 14698 14699 static int 14700 test_cryptodev_scheduler(void) 14701 { 14702 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0; 14703 const enum blockcipher_test_type blk_suites[] = { 14704 BLKCIPHER_AES_CHAIN_TYPE, 14705 BLKCIPHER_AES_CIPHERONLY_TYPE, 14706 BLKCIPHER_AUTHONLY_TYPE 14707 }; 14708 static struct unit_test_suite scheduler_multicore = { 14709 .suite_name = "Scheduler Multicore Unit Test Suite", 14710 .setup = scheduler_multicore_testsuite_setup, 14711 .teardown = scheduler_mode_testsuite_teardown, 14712 .unit_test_cases = {TEST_CASES_END()} 14713 }; 14714 static struct unit_test_suite scheduler_round_robin = { 14715 .suite_name = "Scheduler Round Robin Unit Test Suite", 14716 .setup = scheduler_roundrobin_testsuite_setup, 14717 .teardown = scheduler_mode_testsuite_teardown, 14718 .unit_test_cases = {TEST_CASES_END()} 14719 }; 14720 static struct unit_test_suite scheduler_failover = { 14721 .suite_name = "Scheduler Failover Unit Test Suite", 14722 .setup = scheduler_failover_testsuite_setup, 14723 .teardown = scheduler_mode_testsuite_teardown, 14724 .unit_test_cases = {TEST_CASES_END()} 14725 }; 14726 static struct unit_test_suite scheduler_pkt_size_distr = { 14727 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite", 14728 .setup = scheduler_pkt_size_distr_testsuite_setup, 14729 .teardown = scheduler_mode_testsuite_teardown, 14730 .unit_test_cases = {TEST_CASES_END()} 14731 }; 14732 struct unit_test_suite *sched_mode_suites[] = { 14733 &scheduler_multicore, 14734 &scheduler_round_robin, 14735 &scheduler_failover, 14736 &scheduler_pkt_size_distr 14737 }; 14738 static struct unit_test_suite scheduler_config = { 14739 .suite_name = "Crypto Device Scheduler Config Unit Test Suite", 14740 .unit_test_cases = { 14741 TEST_CASE(test_scheduler_attach_worker_op), 14742 TEST_CASE(test_scheduler_mode_multicore_op), 14743 TEST_CASE(test_scheduler_mode_roundrobin_op), 14744 TEST_CASE(test_scheduler_mode_failover_op), 14745 TEST_CASE(test_scheduler_mode_pkt_size_distr_op), 14746 TEST_CASE(test_scheduler_detach_worker_op), 14747 14748 TEST_CASES_END() /**< NULL terminate array */ 14749 } 14750 }; 14751 struct unit_test_suite *static_suites[] = { 14752 &scheduler_config, 14753 &end_testsuite 14754 }; 14755 static struct unit_test_suite ts = { 14756 .suite_name = "Scheduler Unit Test Suite", 14757 .setup = scheduler_testsuite_setup, 14758 .teardown = testsuite_teardown, 14759 .unit_test_cases = {TEST_CASES_END()} 14760 }; 14761 14762 gbl_driver_id = rte_cryptodev_driver_id_get( 14763 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 14764 14765 if (gbl_driver_id == -1) { 14766 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 14767 return TEST_SKIPPED; 14768 } 14769 14770 if (rte_cryptodev_driver_id_get( 14771 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 14772 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 14773 return TEST_SKIPPED; 14774 } 14775 14776 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 14777 uint8_t blk_i = 0; 14778 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof 14779 (struct unit_test_suite *) * 14780 (RTE_DIM(blk_suites) + 1)); 14781 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]), 14782 blk_suites, RTE_DIM(blk_suites)); 14783 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite; 14784 } 14785 14786 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) * 14787 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites))); 14788 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites, 14789 RTE_DIM(sched_mode_suites)); 14790 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites)); 14791 ret = unit_test_suite_runner(&ts); 14792 14793 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) { 14794 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, 14795 (*sched_mode_suites[sched_i]), 14796 RTE_DIM(blk_suites)); 14797 free(sched_mode_suites[sched_i]->unit_test_suites); 14798 } 14799 free(ts.unit_test_suites); 14800 return ret; 14801 } 14802 14803 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 14804 14805 #endif 14806 14807 static int 14808 test_cryptodev_dpaa2_sec(void) 14809 { 14810 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 14811 } 14812 14813 static int 14814 test_cryptodev_dpaa_sec(void) 14815 { 14816 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 14817 } 14818 14819 static int 14820 test_cryptodev_ccp(void) 14821 { 14822 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 14823 } 14824 14825 static int 14826 test_cryptodev_octeontx(void) 14827 { 14828 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 14829 } 14830 14831 static int 14832 test_cryptodev_octeontx2(void) 14833 { 14834 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)); 14835 } 14836 14837 static int 14838 test_cryptodev_caam_jr(void) 14839 { 14840 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 14841 } 14842 14843 static int 14844 test_cryptodev_nitrox(void) 14845 { 14846 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 14847 } 14848 14849 static int 14850 test_cryptodev_bcmfs(void) 14851 { 14852 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 14853 } 14854 14855 static int 14856 test_cryptodev_qat_raw_api(void) 14857 { 14858 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD); 14859 int ret; 14860 14861 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP, 14862 "RAW API"); 14863 if (ret) 14864 return ret; 14865 14866 global_api_test_type = CRYPTODEV_RAW_API_TEST; 14867 ret = run_cryptodev_testsuite(pmd_name); 14868 global_api_test_type = CRYPTODEV_API_TEST; 14869 14870 return ret; 14871 } 14872 14873 static int 14874 test_cryptodev_cn9k(void) 14875 { 14876 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD)); 14877 } 14878 14879 static int 14880 test_cryptodev_cn10k(void) 14881 { 14882 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD)); 14883 } 14884 14885 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 14886 test_cryptodev_qat_raw_api); 14887 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 14888 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 14889 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 14890 test_cryptodev_cpu_aesni_mb); 14891 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 14892 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 14893 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 14894 test_cryptodev_cpu_aesni_gcm); 14895 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5); 14896 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 14897 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 14898 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 14899 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 14900 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 14901 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 14902 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 14903 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 14904 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 14905 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 14906 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 14907 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2); 14908 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 14909 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 14910 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 14911 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k); 14912 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k); 14913