1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2020 Intel Corporation 3 * Copyright 2020 NXP 4 */ 5 6 #include <time.h> 7 8 #include <rte_common.h> 9 #include <rte_hexdump.h> 10 #include <rte_mbuf.h> 11 #include <rte_malloc.h> 12 #include <rte_memcpy.h> 13 #include <rte_pause.h> 14 #include <rte_bus_vdev.h> 15 #include <rte_ether.h> 16 17 #include <rte_crypto.h> 18 #include <rte_cryptodev.h> 19 #include <rte_cryptodev_pmd.h> 20 #include <rte_string_fns.h> 21 22 #ifdef RTE_CRYPTO_SCHEDULER 23 #include <rte_cryptodev_scheduler.h> 24 #include <rte_cryptodev_scheduler_operations.h> 25 #endif 26 27 #include <rte_lcore.h> 28 29 #include "test.h" 30 #include "test_cryptodev.h" 31 32 #include "test_cryptodev_blockcipher.h" 33 #include "test_cryptodev_aes_test_vectors.h" 34 #include "test_cryptodev_des_test_vectors.h" 35 #include "test_cryptodev_hash_test_vectors.h" 36 #include "test_cryptodev_kasumi_test_vectors.h" 37 #include "test_cryptodev_kasumi_hash_test_vectors.h" 38 #include "test_cryptodev_snow3g_test_vectors.h" 39 #include "test_cryptodev_snow3g_hash_test_vectors.h" 40 #include "test_cryptodev_zuc_test_vectors.h" 41 #include "test_cryptodev_aead_test_vectors.h" 42 #include "test_cryptodev_hmac_test_vectors.h" 43 #include "test_cryptodev_mixed_test_vectors.h" 44 #ifdef RTE_LIB_SECURITY 45 #include "test_cryptodev_security_pdcp_test_vectors.h" 46 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h" 47 #include "test_cryptodev_security_pdcp_test_func.h" 48 #include "test_cryptodev_security_docsis_test_vectors.h" 49 50 #define SDAP_DISABLED 0 51 #define SDAP_ENABLED 1 52 #endif 53 54 #define VDEV_ARGS_SIZE 100 55 #define MAX_NB_SESSIONS 4 56 57 #define MAX_DRV_SERVICE_CTX_SIZE 256 58 59 #define MAX_RAW_DEQUEUE_COUNT 65535 60 61 #define IN_PLACE 0 62 #define OUT_OF_PLACE 1 63 64 #ifndef ARRAY_SIZE 65 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 66 #endif 67 68 static int gbl_driver_id; 69 70 static enum rte_security_session_action_type gbl_action_type = 71 RTE_SECURITY_ACTION_TYPE_NONE; 72 73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST; 74 75 struct crypto_testsuite_params { 76 struct rte_mempool *mbuf_pool; 77 struct rte_mempool *large_mbuf_pool; 78 struct rte_mempool *op_mpool; 79 struct rte_mempool *session_mpool; 80 struct rte_mempool *session_priv_mpool; 81 struct rte_cryptodev_config conf; 82 struct rte_cryptodev_qp_conf qp_conf; 83 84 uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS]; 85 uint8_t valid_dev_count; 86 }; 87 88 struct crypto_unittest_params { 89 struct rte_crypto_sym_xform cipher_xform; 90 struct rte_crypto_sym_xform auth_xform; 91 struct rte_crypto_sym_xform aead_xform; 92 #ifdef RTE_LIB_SECURITY 93 struct rte_security_docsis_xform docsis_xform; 94 #endif 95 96 union { 97 struct rte_cryptodev_sym_session *sess; 98 #ifdef RTE_LIB_SECURITY 99 struct rte_security_session *sec_session; 100 #endif 101 }; 102 #ifdef RTE_LIB_SECURITY 103 enum rte_security_session_action_type type; 104 #endif 105 struct rte_crypto_op *op; 106 107 struct rte_mbuf *obuf, *ibuf; 108 109 uint8_t *digest; 110 }; 111 112 #define ALIGN_POW2_ROUNDUP(num, align) \ 113 (((num) + (align) - 1) & ~((align) - 1)) 114 115 /* 116 * Forward declarations. 117 */ 118 static int 119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 120 struct crypto_unittest_params *ut_params, uint8_t *cipher_key, 121 uint8_t *hmac_key); 122 123 static int 124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 125 struct crypto_unittest_params *ut_params, 126 struct crypto_testsuite_params *ts_param, 127 const uint8_t *cipher, 128 const uint8_t *digest, 129 const uint8_t *iv); 130 131 static struct rte_mbuf * 132 setup_test_string(struct rte_mempool *mpool, 133 const char *string, size_t len, uint8_t blocksize) 134 { 135 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool); 136 size_t t_len = len - (blocksize ? (len % blocksize) : 0); 137 138 memset(m->buf_addr, 0, m->buf_len); 139 if (m) { 140 char *dst = rte_pktmbuf_append(m, t_len); 141 142 if (!dst) { 143 rte_pktmbuf_free(m); 144 return NULL; 145 } 146 if (string != NULL) 147 rte_memcpy(dst, string, t_len); 148 else 149 memset(dst, 0, t_len); 150 } 151 152 return m; 153 } 154 155 /* Get number of bytes in X bits (rounding up) */ 156 static uint32_t 157 ceil_byte_length(uint32_t num_bits) 158 { 159 if (num_bits % 8) 160 return ((num_bits >> 3) + 1); 161 else 162 return (num_bits >> 3); 163 } 164 165 static uint32_t 166 get_raw_dp_dequeue_count(void *user_data __rte_unused) 167 { 168 return 1; 169 } 170 171 static void 172 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused, 173 uint8_t is_op_success) 174 { 175 struct rte_crypto_op *op = user_data; 176 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS : 177 RTE_CRYPTO_OP_STATUS_ERROR; 178 } 179 180 void 181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 182 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 183 uint8_t len_in_bits, uint8_t cipher_iv_len) 184 { 185 struct rte_crypto_sym_op *sop = op->sym; 186 struct rte_crypto_op *ret_op = NULL; 187 struct rte_crypto_vec data_vec[UINT8_MAX]; 188 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv; 189 union rte_crypto_sym_ofs ofs; 190 struct rte_crypto_sym_vec vec; 191 struct rte_crypto_sgl sgl; 192 uint32_t max_len; 193 union rte_cryptodev_session_ctx sess; 194 uint32_t count = 0; 195 struct rte_crypto_raw_dp_ctx *ctx; 196 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0, 197 auth_len = 0; 198 int32_t n; 199 uint32_t n_success; 200 int ctx_service_size; 201 int32_t status = 0; 202 int enqueue_status, dequeue_status; 203 204 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id); 205 if (ctx_service_size < 0) { 206 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 207 return; 208 } 209 210 ctx = malloc(ctx_service_size); 211 if (!ctx) { 212 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 213 return; 214 } 215 216 /* Both are enums, setting crypto_sess will suit any session type */ 217 sess.crypto_sess = op->sym->session; 218 219 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx, 220 op->sess_type, sess, 0) < 0) { 221 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 222 goto exit; 223 } 224 225 cipher_iv.iova = 0; 226 cipher_iv.va = NULL; 227 aad_auth_iv.iova = 0; 228 aad_auth_iv.va = NULL; 229 digest.iova = 0; 230 digest.va = NULL; 231 sgl.vec = data_vec; 232 vec.num = 1; 233 vec.sgl = &sgl; 234 vec.iv = &cipher_iv; 235 vec.digest = &digest; 236 vec.aad = &aad_auth_iv; 237 vec.status = &status; 238 239 ofs.raw = 0; 240 241 if (is_cipher && is_auth) { 242 cipher_offset = sop->cipher.data.offset; 243 cipher_len = sop->cipher.data.length; 244 auth_offset = sop->auth.data.offset; 245 auth_len = sop->auth.data.length; 246 max_len = RTE_MAX(cipher_offset + cipher_len, 247 auth_offset + auth_len); 248 if (len_in_bits) { 249 max_len = max_len >> 3; 250 cipher_offset = cipher_offset >> 3; 251 auth_offset = auth_offset >> 3; 252 cipher_len = cipher_len >> 3; 253 auth_len = auth_len >> 3; 254 } 255 ofs.ofs.cipher.head = cipher_offset; 256 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 257 ofs.ofs.auth.head = auth_offset; 258 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 259 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 260 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 261 aad_auth_iv.va = rte_crypto_op_ctod_offset( 262 op, void *, IV_OFFSET + cipher_iv_len); 263 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 264 cipher_iv_len); 265 digest.va = (void *)sop->auth.digest.data; 266 digest.iova = sop->auth.digest.phys_addr; 267 268 } else if (is_cipher) { 269 cipher_offset = sop->cipher.data.offset; 270 cipher_len = sop->cipher.data.length; 271 max_len = cipher_len + cipher_offset; 272 if (len_in_bits) { 273 max_len = max_len >> 3; 274 cipher_offset = cipher_offset >> 3; 275 cipher_len = cipher_len >> 3; 276 } 277 ofs.ofs.cipher.head = cipher_offset; 278 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 279 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 280 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 281 282 } else if (is_auth) { 283 auth_offset = sop->auth.data.offset; 284 auth_len = sop->auth.data.length; 285 max_len = auth_len + auth_offset; 286 if (len_in_bits) { 287 max_len = max_len >> 3; 288 auth_offset = auth_offset >> 3; 289 auth_len = auth_len >> 3; 290 } 291 ofs.ofs.auth.head = auth_offset; 292 ofs.ofs.auth.tail = max_len - auth_offset - auth_len; 293 aad_auth_iv.va = rte_crypto_op_ctod_offset( 294 op, void *, IV_OFFSET + cipher_iv_len); 295 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET + 296 cipher_iv_len); 297 digest.va = (void *)sop->auth.digest.data; 298 digest.iova = sop->auth.digest.phys_addr; 299 300 } else { /* aead */ 301 cipher_offset = sop->aead.data.offset; 302 cipher_len = sop->aead.data.length; 303 max_len = cipher_len + cipher_offset; 304 if (len_in_bits) { 305 max_len = max_len >> 3; 306 cipher_offset = cipher_offset >> 3; 307 cipher_len = cipher_len >> 3; 308 } 309 ofs.ofs.cipher.head = cipher_offset; 310 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len; 311 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 312 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET); 313 aad_auth_iv.va = (void *)sop->aead.aad.data; 314 aad_auth_iv.iova = sop->aead.aad.phys_addr; 315 digest.va = (void *)sop->aead.digest.data; 316 digest.iova = sop->aead.digest.phys_addr; 317 } 318 319 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len, 320 data_vec, RTE_DIM(data_vec)); 321 if (n < 0 || n > sop->m_src->nb_segs) { 322 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 323 goto exit; 324 } 325 326 sgl.num = n; 327 328 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op, 329 &enqueue_status) < 1) { 330 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 331 goto exit; 332 } 333 334 if (enqueue_status == 0) { 335 status = rte_cryptodev_raw_enqueue_done(ctx, 1); 336 if (status < 0) { 337 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 338 goto exit; 339 } 340 } else if (enqueue_status < 0) { 341 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 342 goto exit; 343 } 344 345 n = n_success = 0; 346 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) { 347 n = rte_cryptodev_raw_dequeue_burst(ctx, 348 get_raw_dp_dequeue_count, post_process_raw_dp_op, 349 (void **)&ret_op, 0, &n_success, 350 &dequeue_status); 351 if (dequeue_status < 0) { 352 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 353 goto exit; 354 } 355 if (n == 0) 356 rte_pause(); 357 } 358 359 if (n == 1 && dequeue_status == 0) { 360 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) { 361 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 362 goto exit; 363 } 364 } 365 366 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op || 367 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR : 368 RTE_CRYPTO_OP_STATUS_SUCCESS; 369 370 exit: 371 free(ctx); 372 } 373 374 static void 375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op) 376 { 377 int32_t n, st; 378 struct rte_crypto_sym_op *sop; 379 union rte_crypto_sym_ofs ofs; 380 struct rte_crypto_sgl sgl; 381 struct rte_crypto_sym_vec symvec; 382 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr; 383 struct rte_crypto_vec vec[UINT8_MAX]; 384 385 sop = op->sym; 386 387 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset, 388 sop->aead.data.length, vec, RTE_DIM(vec)); 389 390 if (n < 0 || n != sop->m_src->nb_segs) { 391 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 392 return; 393 } 394 395 sgl.vec = vec; 396 sgl.num = n; 397 symvec.sgl = &sgl; 398 symvec.iv = &iv_ptr; 399 symvec.digest = &digest_ptr; 400 symvec.aad = &aad_ptr; 401 symvec.status = &st; 402 symvec.num = 1; 403 404 /* for CPU crypto the IOVA address is not required */ 405 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 406 digest_ptr.va = (void *)sop->aead.digest.data; 407 aad_ptr.va = (void *)sop->aead.aad.data; 408 409 ofs.raw = 0; 410 411 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 412 &symvec); 413 414 if (n != 1) 415 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 416 else 417 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 418 } 419 420 static void 421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op) 422 { 423 int32_t n, st; 424 struct rte_crypto_sym_op *sop; 425 union rte_crypto_sym_ofs ofs; 426 struct rte_crypto_sgl sgl; 427 struct rte_crypto_sym_vec symvec; 428 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr; 429 struct rte_crypto_vec vec[UINT8_MAX]; 430 431 sop = op->sym; 432 433 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset, 434 sop->auth.data.length, vec, RTE_DIM(vec)); 435 436 if (n < 0 || n != sop->m_src->nb_segs) { 437 op->status = RTE_CRYPTO_OP_STATUS_ERROR; 438 return; 439 } 440 441 sgl.vec = vec; 442 sgl.num = n; 443 symvec.sgl = &sgl; 444 symvec.iv = &iv_ptr; 445 symvec.digest = &digest_ptr; 446 symvec.status = &st; 447 symvec.num = 1; 448 449 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET); 450 digest_ptr.va = (void *)sop->auth.digest.data; 451 452 ofs.raw = 0; 453 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset; 454 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) - 455 (sop->cipher.data.offset + sop->cipher.data.length); 456 457 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs, 458 &symvec); 459 460 if (n != 1) 461 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 462 else 463 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 464 } 465 466 static struct rte_crypto_op * 467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op) 468 { 469 470 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO); 471 472 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) { 473 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n"); 474 return NULL; 475 } 476 477 op = NULL; 478 479 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0) 480 rte_pause(); 481 482 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 483 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status); 484 return NULL; 485 } 486 487 return op; 488 } 489 490 static struct crypto_testsuite_params testsuite_params = { NULL }; 491 static struct crypto_unittest_params unittest_params; 492 493 static int 494 testsuite_setup(void) 495 { 496 struct crypto_testsuite_params *ts_params = &testsuite_params; 497 struct rte_cryptodev_info info; 498 uint32_t i = 0, nb_devs, dev_id; 499 int ret; 500 uint16_t qp_id; 501 502 memset(ts_params, 0, sizeof(*ts_params)); 503 504 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL"); 505 if (ts_params->mbuf_pool == NULL) { 506 /* Not already created so create */ 507 ts_params->mbuf_pool = rte_pktmbuf_pool_create( 508 "CRYPTO_MBUFPOOL", 509 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE, 510 rte_socket_id()); 511 if (ts_params->mbuf_pool == NULL) { 512 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n"); 513 return TEST_FAILED; 514 } 515 } 516 517 ts_params->large_mbuf_pool = rte_mempool_lookup( 518 "CRYPTO_LARGE_MBUFPOOL"); 519 if (ts_params->large_mbuf_pool == NULL) { 520 /* Not already created so create */ 521 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create( 522 "CRYPTO_LARGE_MBUFPOOL", 523 1, 0, 0, UINT16_MAX, 524 rte_socket_id()); 525 if (ts_params->large_mbuf_pool == NULL) { 526 RTE_LOG(ERR, USER1, 527 "Can't create CRYPTO_LARGE_MBUFPOOL\n"); 528 return TEST_FAILED; 529 } 530 } 531 532 ts_params->op_mpool = rte_crypto_op_pool_create( 533 "MBUF_CRYPTO_SYM_OP_POOL", 534 RTE_CRYPTO_OP_TYPE_SYMMETRIC, 535 NUM_MBUFS, MBUF_CACHE_SIZE, 536 DEFAULT_NUM_XFORMS * 537 sizeof(struct rte_crypto_sym_xform) + 538 MAXIMUM_IV_LENGTH, 539 rte_socket_id()); 540 if (ts_params->op_mpool == NULL) { 541 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n"); 542 return TEST_FAILED; 543 } 544 545 /* Create an AESNI MB device if required */ 546 if (gbl_driver_id == rte_cryptodev_driver_id_get( 547 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) { 548 nb_devs = rte_cryptodev_device_count_by_driver( 549 rte_cryptodev_driver_id_get( 550 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))); 551 if (nb_devs < 1) { 552 ret = rte_vdev_init( 553 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL); 554 555 TEST_ASSERT(ret == 0, 556 "Failed to create instance of" 557 " pmd : %s", 558 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 559 } 560 } 561 562 /* Create an AESNI GCM device if required */ 563 if (gbl_driver_id == rte_cryptodev_driver_id_get( 564 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) { 565 nb_devs = rte_cryptodev_device_count_by_driver( 566 rte_cryptodev_driver_id_get( 567 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))); 568 if (nb_devs < 1) { 569 TEST_ASSERT_SUCCESS(rte_vdev_init( 570 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL), 571 "Failed to create instance of" 572 " pmd : %s", 573 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 574 } 575 } 576 577 /* Create a SNOW 3G device if required */ 578 if (gbl_driver_id == rte_cryptodev_driver_id_get( 579 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) { 580 nb_devs = rte_cryptodev_device_count_by_driver( 581 rte_cryptodev_driver_id_get( 582 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))); 583 if (nb_devs < 1) { 584 TEST_ASSERT_SUCCESS(rte_vdev_init( 585 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL), 586 "Failed to create instance of" 587 " pmd : %s", 588 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 589 } 590 } 591 592 /* Create a KASUMI device if required */ 593 if (gbl_driver_id == rte_cryptodev_driver_id_get( 594 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) { 595 nb_devs = rte_cryptodev_device_count_by_driver( 596 rte_cryptodev_driver_id_get( 597 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))); 598 if (nb_devs < 1) { 599 TEST_ASSERT_SUCCESS(rte_vdev_init( 600 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL), 601 "Failed to create instance of" 602 " pmd : %s", 603 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 604 } 605 } 606 607 /* Create a ZUC device if required */ 608 if (gbl_driver_id == rte_cryptodev_driver_id_get( 609 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) { 610 nb_devs = rte_cryptodev_device_count_by_driver( 611 rte_cryptodev_driver_id_get( 612 RTE_STR(CRYPTODEV_NAME_ZUC_PMD))); 613 if (nb_devs < 1) { 614 TEST_ASSERT_SUCCESS(rte_vdev_init( 615 RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL), 616 "Failed to create instance of" 617 " pmd : %s", 618 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 619 } 620 } 621 622 /* Create a NULL device if required */ 623 if (gbl_driver_id == rte_cryptodev_driver_id_get( 624 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) { 625 nb_devs = rte_cryptodev_device_count_by_driver( 626 rte_cryptodev_driver_id_get( 627 RTE_STR(CRYPTODEV_NAME_NULL_PMD))); 628 if (nb_devs < 1) { 629 ret = rte_vdev_init( 630 RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL); 631 632 TEST_ASSERT(ret == 0, 633 "Failed to create instance of" 634 " pmd : %s", 635 RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 636 } 637 } 638 639 /* Create an OPENSSL device if required */ 640 if (gbl_driver_id == rte_cryptodev_driver_id_get( 641 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) { 642 nb_devs = rte_cryptodev_device_count_by_driver( 643 rte_cryptodev_driver_id_get( 644 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))); 645 if (nb_devs < 1) { 646 ret = rte_vdev_init( 647 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD), 648 NULL); 649 650 TEST_ASSERT(ret == 0, "Failed to create " 651 "instance of pmd : %s", 652 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 653 } 654 } 655 656 /* Create a ARMv8 device if required */ 657 if (gbl_driver_id == rte_cryptodev_driver_id_get( 658 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) { 659 nb_devs = rte_cryptodev_device_count_by_driver( 660 rte_cryptodev_driver_id_get( 661 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))); 662 if (nb_devs < 1) { 663 ret = rte_vdev_init( 664 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD), 665 NULL); 666 667 TEST_ASSERT(ret == 0, "Failed to create " 668 "instance of pmd : %s", 669 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 670 } 671 } 672 673 /* Create a MVSAM device if required */ 674 if (gbl_driver_id == rte_cryptodev_driver_id_get( 675 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) { 676 nb_devs = rte_cryptodev_device_count_by_driver( 677 rte_cryptodev_driver_id_get( 678 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))); 679 if (nb_devs < 1) { 680 ret = rte_vdev_init( 681 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD), 682 NULL); 683 684 TEST_ASSERT(ret == 0, "Failed to create " 685 "instance of pmd : %s", 686 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 687 } 688 } 689 690 /* Create an CCP device if required */ 691 if (gbl_driver_id == rte_cryptodev_driver_id_get( 692 RTE_STR(CRYPTODEV_NAME_CCP_PMD))) { 693 nb_devs = rte_cryptodev_device_count_by_driver( 694 rte_cryptodev_driver_id_get( 695 RTE_STR(CRYPTODEV_NAME_CCP_PMD))); 696 if (nb_devs < 1) { 697 ret = rte_vdev_init( 698 RTE_STR(CRYPTODEV_NAME_CCP_PMD), 699 NULL); 700 701 TEST_ASSERT(ret == 0, "Failed to create " 702 "instance of pmd : %s", 703 RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 704 } 705 } 706 707 #ifdef RTE_CRYPTO_SCHEDULER 708 char vdev_args[VDEV_ARGS_SIZE] = {""}; 709 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core," 710 "ordering=enable,name=cryptodev_test_scheduler,corelist="}; 711 uint16_t worker_core_count = 0; 712 uint16_t socket_id = 0; 713 714 if (gbl_driver_id == rte_cryptodev_driver_id_get( 715 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) { 716 717 /* Identify the Worker Cores 718 * Use 2 worker cores for the device args 719 */ 720 RTE_LCORE_FOREACH_WORKER(i) { 721 if (worker_core_count > 1) 722 break; 723 snprintf(vdev_args, sizeof(vdev_args), 724 "%s%d", temp_str, i); 725 strcpy(temp_str, vdev_args); 726 strlcat(temp_str, ";", sizeof(temp_str)); 727 worker_core_count++; 728 socket_id = rte_lcore_to_socket_id(i); 729 } 730 if (worker_core_count != 2) { 731 RTE_LOG(ERR, USER1, 732 "Cryptodev scheduler test require at least " 733 "two worker cores to run. " 734 "Please use the correct coremask.\n"); 735 return TEST_FAILED; 736 } 737 strcpy(temp_str, vdev_args); 738 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d", 739 temp_str, socket_id); 740 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args); 741 nb_devs = rte_cryptodev_device_count_by_driver( 742 rte_cryptodev_driver_id_get( 743 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))); 744 if (nb_devs < 1) { 745 ret = rte_vdev_init( 746 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD), 747 vdev_args); 748 TEST_ASSERT(ret == 0, 749 "Failed to create instance %u of" 750 " pmd : %s", 751 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 752 } 753 } 754 #endif /* RTE_CRYPTO_SCHEDULER */ 755 756 nb_devs = rte_cryptodev_count(); 757 if (nb_devs < 1) { 758 RTE_LOG(WARNING, USER1, "No crypto devices found?\n"); 759 return TEST_SKIPPED; 760 } 761 762 /* Create list of valid crypto devs */ 763 for (i = 0; i < nb_devs; i++) { 764 rte_cryptodev_info_get(i, &info); 765 if (info.driver_id == gbl_driver_id) 766 ts_params->valid_devs[ts_params->valid_dev_count++] = i; 767 } 768 769 if (ts_params->valid_dev_count < 1) 770 return TEST_FAILED; 771 772 /* Set up all the qps on the first of the valid devices found */ 773 774 dev_id = ts_params->valid_devs[0]; 775 776 rte_cryptodev_info_get(dev_id, &info); 777 778 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs; 779 ts_params->conf.socket_id = SOCKET_ID_ANY; 780 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY; 781 782 unsigned int session_size = 783 rte_cryptodev_sym_get_private_session_size(dev_id); 784 785 #ifdef RTE_LIB_SECURITY 786 unsigned int security_session_size = rte_security_session_get_size( 787 rte_cryptodev_get_sec_ctx(dev_id)); 788 789 if (session_size < security_session_size) 790 session_size = security_session_size; 791 #endif 792 /* 793 * Create mempool with maximum number of sessions. 794 */ 795 if (info.sym.max_nb_sessions != 0 && 796 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 797 RTE_LOG(ERR, USER1, "Device does not support " 798 "at least %u sessions\n", 799 MAX_NB_SESSIONS); 800 return TEST_FAILED; 801 } 802 803 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create( 804 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0, 805 SOCKET_ID_ANY); 806 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 807 "session mempool allocation failed"); 808 809 ts_params->session_priv_mpool = rte_mempool_create( 810 "test_sess_mp_priv", 811 MAX_NB_SESSIONS, 812 session_size, 813 0, 0, NULL, NULL, NULL, 814 NULL, SOCKET_ID_ANY, 815 0); 816 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 817 "session mempool allocation failed"); 818 819 820 821 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, 822 &ts_params->conf), 823 "Failed to configure cryptodev %u with %u qps", 824 dev_id, ts_params->conf.nb_queue_pairs); 825 826 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 827 ts_params->qp_conf.mp_session = ts_params->session_mpool; 828 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 829 830 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) { 831 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 832 dev_id, qp_id, &ts_params->qp_conf, 833 rte_cryptodev_socket_id(dev_id)), 834 "Failed to setup queue pair %u on cryptodev %u", 835 qp_id, dev_id); 836 } 837 838 return TEST_SUCCESS; 839 } 840 841 static void 842 testsuite_teardown(void) 843 { 844 struct crypto_testsuite_params *ts_params = &testsuite_params; 845 846 if (ts_params->mbuf_pool != NULL) { 847 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 848 rte_mempool_avail_count(ts_params->mbuf_pool)); 849 } 850 851 if (ts_params->op_mpool != NULL) { 852 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n", 853 rte_mempool_avail_count(ts_params->op_mpool)); 854 } 855 856 /* Free session mempools */ 857 if (ts_params->session_priv_mpool != NULL) { 858 rte_mempool_free(ts_params->session_priv_mpool); 859 ts_params->session_priv_mpool = NULL; 860 } 861 862 if (ts_params->session_mpool != NULL) { 863 rte_mempool_free(ts_params->session_mpool); 864 ts_params->session_mpool = NULL; 865 } 866 } 867 868 static int 869 dev_configure_and_start(uint64_t ff_disable) 870 { 871 struct crypto_testsuite_params *ts_params = &testsuite_params; 872 struct crypto_unittest_params *ut_params = &unittest_params; 873 874 uint16_t qp_id; 875 876 /* Clear unit test parameters before running test */ 877 memset(ut_params, 0, sizeof(*ut_params)); 878 879 /* Reconfigure device to default parameters */ 880 ts_params->conf.socket_id = SOCKET_ID_ANY; 881 ts_params->conf.ff_disable = ff_disable; 882 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; 883 ts_params->qp_conf.mp_session = ts_params->session_mpool; 884 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool; 885 886 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 887 &ts_params->conf), 888 "Failed to configure cryptodev %u", 889 ts_params->valid_devs[0]); 890 891 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) { 892 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 893 ts_params->valid_devs[0], qp_id, 894 &ts_params->qp_conf, 895 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 896 "Failed to setup queue pair %u on cryptodev %u", 897 qp_id, ts_params->valid_devs[0]); 898 } 899 900 901 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 902 903 /* Start the device */ 904 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]), 905 "Failed to start cryptodev %u", 906 ts_params->valid_devs[0]); 907 908 return TEST_SUCCESS; 909 } 910 911 static int 912 ut_setup(void) 913 { 914 /* Configure and start the device with security feature disabled */ 915 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY); 916 } 917 918 static int 919 ut_setup_security(void) 920 { 921 /* Configure and start the device with no features disabled */ 922 return dev_configure_and_start(0); 923 } 924 925 static void 926 ut_teardown(void) 927 { 928 struct crypto_testsuite_params *ts_params = &testsuite_params; 929 struct crypto_unittest_params *ut_params = &unittest_params; 930 struct rte_cryptodev_stats stats; 931 932 /* free crypto session structure */ 933 #ifdef RTE_LIB_SECURITY 934 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) { 935 if (ut_params->sec_session) { 936 rte_security_session_destroy(rte_cryptodev_get_sec_ctx 937 (ts_params->valid_devs[0]), 938 ut_params->sec_session); 939 ut_params->sec_session = NULL; 940 } 941 } else 942 #endif 943 { 944 if (ut_params->sess) { 945 rte_cryptodev_sym_session_clear( 946 ts_params->valid_devs[0], 947 ut_params->sess); 948 rte_cryptodev_sym_session_free(ut_params->sess); 949 ut_params->sess = NULL; 950 } 951 } 952 953 /* free crypto operation structure */ 954 if (ut_params->op) 955 rte_crypto_op_free(ut_params->op); 956 957 /* 958 * free mbuf - both obuf and ibuf are usually the same, 959 * so check if they point at the same address is necessary, 960 * to avoid freeing the mbuf twice. 961 */ 962 if (ut_params->obuf) { 963 rte_pktmbuf_free(ut_params->obuf); 964 if (ut_params->ibuf == ut_params->obuf) 965 ut_params->ibuf = 0; 966 ut_params->obuf = 0; 967 } 968 if (ut_params->ibuf) { 969 rte_pktmbuf_free(ut_params->ibuf); 970 ut_params->ibuf = 0; 971 } 972 973 if (ts_params->mbuf_pool != NULL) 974 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n", 975 rte_mempool_avail_count(ts_params->mbuf_pool)); 976 977 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats); 978 979 /* Stop the device */ 980 rte_cryptodev_stop(ts_params->valid_devs[0]); 981 } 982 983 static int 984 test_device_configure_invalid_dev_id(void) 985 { 986 struct crypto_testsuite_params *ts_params = &testsuite_params; 987 uint16_t dev_id, num_devs = 0; 988 989 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1, 990 "Need at least %d devices for test", 1); 991 992 /* valid dev_id values */ 993 dev_id = ts_params->valid_devs[0]; 994 995 /* Stop the device in case it's started so it can be configured */ 996 rte_cryptodev_stop(dev_id); 997 998 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf), 999 "Failed test for rte_cryptodev_configure: " 1000 "invalid dev_num %u", dev_id); 1001 1002 /* invalid dev_id values */ 1003 dev_id = num_devs; 1004 1005 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1006 "Failed test for rte_cryptodev_configure: " 1007 "invalid dev_num %u", dev_id); 1008 1009 dev_id = 0xff; 1010 1011 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf), 1012 "Failed test for rte_cryptodev_configure:" 1013 "invalid dev_num %u", dev_id); 1014 1015 return TEST_SUCCESS; 1016 } 1017 1018 static int 1019 test_device_configure_invalid_queue_pair_ids(void) 1020 { 1021 struct crypto_testsuite_params *ts_params = &testsuite_params; 1022 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs; 1023 1024 /* Stop the device in case it's started so it can be configured */ 1025 rte_cryptodev_stop(ts_params->valid_devs[0]); 1026 1027 /* valid - max value queue pairs */ 1028 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1029 1030 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1031 &ts_params->conf), 1032 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1033 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs); 1034 1035 /* valid - one queue pairs */ 1036 ts_params->conf.nb_queue_pairs = 1; 1037 1038 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1039 &ts_params->conf), 1040 "Failed to configure cryptodev: dev_id %u, qp_id %u", 1041 ts_params->valid_devs[0], 1042 ts_params->conf.nb_queue_pairs); 1043 1044 1045 /* invalid - zero queue pairs */ 1046 ts_params->conf.nb_queue_pairs = 0; 1047 1048 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1049 &ts_params->conf), 1050 "Failed test for rte_cryptodev_configure, dev_id %u," 1051 " invalid qps: %u", 1052 ts_params->valid_devs[0], 1053 ts_params->conf.nb_queue_pairs); 1054 1055 1056 /* invalid - max value supported by field queue pairs */ 1057 ts_params->conf.nb_queue_pairs = UINT16_MAX; 1058 1059 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1060 &ts_params->conf), 1061 "Failed test for rte_cryptodev_configure, dev_id %u," 1062 " invalid qps: %u", 1063 ts_params->valid_devs[0], 1064 ts_params->conf.nb_queue_pairs); 1065 1066 1067 /* invalid - max value + 1 queue pairs */ 1068 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1; 1069 1070 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0], 1071 &ts_params->conf), 1072 "Failed test for rte_cryptodev_configure, dev_id %u," 1073 " invalid qps: %u", 1074 ts_params->valid_devs[0], 1075 ts_params->conf.nb_queue_pairs); 1076 1077 /* revert to original testsuite value */ 1078 ts_params->conf.nb_queue_pairs = orig_nb_qps; 1079 1080 return TEST_SUCCESS; 1081 } 1082 1083 static int 1084 test_queue_pair_descriptor_setup(void) 1085 { 1086 struct crypto_testsuite_params *ts_params = &testsuite_params; 1087 struct rte_cryptodev_qp_conf qp_conf = { 1088 .nb_descriptors = MAX_NUM_OPS_INFLIGHT 1089 }; 1090 uint16_t qp_id; 1091 1092 /* Stop the device in case it's started so it can be configured */ 1093 rte_cryptodev_stop(ts_params->valid_devs[0]); 1094 1095 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0], 1096 &ts_params->conf), 1097 "Failed to configure cryptodev %u", 1098 ts_params->valid_devs[0]); 1099 1100 /* 1101 * Test various ring sizes on this device. memzones can't be 1102 * freed so are re-used if ring is released and re-created. 1103 */ 1104 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/ 1105 qp_conf.mp_session = ts_params->session_mpool; 1106 qp_conf.mp_session_private = ts_params->session_priv_mpool; 1107 1108 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1109 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1110 ts_params->valid_devs[0], qp_id, &qp_conf, 1111 rte_cryptodev_socket_id( 1112 ts_params->valid_devs[0])), 1113 "Failed test for " 1114 "rte_cryptodev_queue_pair_setup: num_inflights " 1115 "%u on qp %u on cryptodev %u", 1116 qp_conf.nb_descriptors, qp_id, 1117 ts_params->valid_devs[0]); 1118 } 1119 1120 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2); 1121 1122 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1123 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1124 ts_params->valid_devs[0], qp_id, &qp_conf, 1125 rte_cryptodev_socket_id( 1126 ts_params->valid_devs[0])), 1127 "Failed test for" 1128 " rte_cryptodev_queue_pair_setup: num_inflights" 1129 " %u on qp %u on cryptodev %u", 1130 qp_conf.nb_descriptors, qp_id, 1131 ts_params->valid_devs[0]); 1132 } 1133 1134 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */ 1135 1136 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1137 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1138 ts_params->valid_devs[0], qp_id, &qp_conf, 1139 rte_cryptodev_socket_id( 1140 ts_params->valid_devs[0])), 1141 "Failed test for " 1142 "rte_cryptodev_queue_pair_setup: num_inflights" 1143 " %u on qp %u on cryptodev %u", 1144 qp_conf.nb_descriptors, qp_id, 1145 ts_params->valid_devs[0]); 1146 } 1147 1148 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; 1149 1150 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) { 1151 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup( 1152 ts_params->valid_devs[0], qp_id, &qp_conf, 1153 rte_cryptodev_socket_id( 1154 ts_params->valid_devs[0])), 1155 "Failed test for" 1156 " rte_cryptodev_queue_pair_setup:" 1157 "num_inflights %u on qp %u on cryptodev %u", 1158 qp_conf.nb_descriptors, qp_id, 1159 ts_params->valid_devs[0]); 1160 } 1161 1162 /* test invalid queue pair id */ 1163 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */ 1164 1165 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */ 1166 1167 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1168 ts_params->valid_devs[0], 1169 qp_id, &qp_conf, 1170 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1171 "Failed test for rte_cryptodev_queue_pair_setup:" 1172 "invalid qp %u on cryptodev %u", 1173 qp_id, ts_params->valid_devs[0]); 1174 1175 qp_id = 0xffff; /*invalid*/ 1176 1177 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup( 1178 ts_params->valid_devs[0], 1179 qp_id, &qp_conf, 1180 rte_cryptodev_socket_id(ts_params->valid_devs[0])), 1181 "Failed test for rte_cryptodev_queue_pair_setup:" 1182 "invalid qp %u on cryptodev %u", 1183 qp_id, ts_params->valid_devs[0]); 1184 1185 return TEST_SUCCESS; 1186 } 1187 1188 /* ***** Plaintext data for tests ***** */ 1189 1190 const char catch_22_quote_1[] = 1191 "There was only one catch and that was Catch-22, which " 1192 "specified that a concern for one's safety in the face of " 1193 "dangers that were real and immediate was the process of a " 1194 "rational mind. Orr was crazy and could be grounded. All he " 1195 "had to do was ask; and as soon as he did, he would no longer " 1196 "be crazy and would have to fly more missions. Orr would be " 1197 "crazy to fly more missions and sane if he didn't, but if he " 1198 "was sane he had to fly them. If he flew them he was crazy " 1199 "and didn't have to; but if he didn't want to he was sane and " 1200 "had to. Yossarian was moved very deeply by the absolute " 1201 "simplicity of this clause of Catch-22 and let out a " 1202 "respectful whistle. \"That's some catch, that Catch-22\", he " 1203 "observed. \"It's the best there is,\" Doc Daneeka agreed."; 1204 1205 const char catch_22_quote[] = 1206 "What a lousy earth! He wondered how many people were " 1207 "destitute that same night even in his own prosperous country, " 1208 "how many homes were shanties, how many husbands were drunk " 1209 "and wives socked, and how many children were bullied, abused, " 1210 "or abandoned. How many families hungered for food they could " 1211 "not afford to buy? How many hearts were broken? How many " 1212 "suicides would take place that same night, how many people " 1213 "would go insane? How many cockroaches and landlords would " 1214 "triumph? How many winners were losers, successes failures, " 1215 "and rich men poor men? How many wise guys were stupid? How " 1216 "many happy endings were unhappy endings? How many honest men " 1217 "were liars, brave men cowards, loyal men traitors, how many " 1218 "sainted men were corrupt, how many people in positions of " 1219 "trust had sold their souls to bodyguards, how many had never " 1220 "had souls? How many straight-and-narrow paths were crooked " 1221 "paths? How many best families were worst families and how " 1222 "many good people were bad people? When you added them all up " 1223 "and then subtracted, you might be left with only the children, " 1224 "and perhaps with Albert Einstein and an old violinist or " 1225 "sculptor somewhere."; 1226 1227 #define QUOTE_480_BYTES (480) 1228 #define QUOTE_512_BYTES (512) 1229 #define QUOTE_768_BYTES (768) 1230 #define QUOTE_1024_BYTES (1024) 1231 1232 1233 1234 /* ***** SHA1 Hash Tests ***** */ 1235 1236 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1) 1237 1238 static uint8_t hmac_sha1_key[] = { 1239 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 1240 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 1241 0xDE, 0xF4, 0xDE, 0xAD }; 1242 1243 /* ***** SHA224 Hash Tests ***** */ 1244 1245 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224) 1246 1247 1248 /* ***** AES-CBC Cipher Tests ***** */ 1249 1250 #define CIPHER_KEY_LENGTH_AES_CBC (16) 1251 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC) 1252 1253 static uint8_t aes_cbc_key[] = { 1254 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 1255 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A }; 1256 1257 static uint8_t aes_cbc_iv[] = { 1258 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1259 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; 1260 1261 1262 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */ 1263 1264 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = { 1265 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31, 1266 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76, 1267 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E, 1268 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A, 1269 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E, 1270 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08, 1271 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0, 1272 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01, 1273 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57, 1274 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE, 1275 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9, 1276 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9, 1277 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D, 1278 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3, 1279 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46, 1280 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3, 1281 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80, 1282 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92, 1283 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5, 1284 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5, 1285 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2, 1286 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5, 1287 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1288 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76, 1289 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4, 1290 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62, 1291 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4, 1292 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4, 1293 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54, 1294 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61, 1295 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91, 1296 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A, 1297 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF, 1298 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F, 1299 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28, 1300 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E, 1301 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7, 1302 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76, 1303 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6, 1304 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03, 1305 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C, 1306 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2, 1307 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6, 1308 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96, 1309 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6, 1310 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA, 1311 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87, 1312 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55, 1313 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B, 1314 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98, 1315 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53, 1316 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A, 1317 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26, 1318 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36, 1319 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36, 1320 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D, 1321 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E, 1322 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E, 1323 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A, 1324 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6, 1325 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4, 1326 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7, 1327 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1, 1328 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C 1329 }; 1330 1331 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = { 1332 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60, 1333 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1334 0x18, 0x8c, 0x1d, 0x32 1335 }; 1336 1337 1338 /* Multisession Vector context Test */ 1339 /*Begin Session 0 */ 1340 static uint8_t ms_aes_cbc_key0[] = { 1341 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1342 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1343 }; 1344 1345 static uint8_t ms_aes_cbc_iv0[] = { 1346 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1347 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1348 }; 1349 1350 static const uint8_t ms_aes_cbc_cipher0[] = { 1351 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38, 1352 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC, 1353 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB, 1354 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9, 1355 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D, 1356 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4, 1357 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34, 1358 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F, 1359 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99, 1360 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED, 1361 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D, 1362 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24, 1363 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71, 1364 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72, 1365 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E, 1366 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD, 1367 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18, 1368 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6, 1369 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29, 1370 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C, 1371 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96, 1372 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26, 1373 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55, 1374 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46, 1375 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B, 1376 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4, 1377 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7, 1378 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5, 1379 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0, 1380 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E, 1381 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D, 1382 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44, 1383 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76, 1384 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3, 1385 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83, 1386 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85, 1387 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45, 1388 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25, 1389 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A, 1390 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1, 1391 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA, 1392 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3, 1393 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4, 1394 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60, 1395 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A, 1396 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A, 1397 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9, 1398 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55, 1399 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13, 1400 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B, 1401 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1, 1402 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0, 1403 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3, 1404 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23, 1405 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B, 1406 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07, 1407 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB, 1408 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1, 1409 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F, 1410 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F, 1411 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84, 1412 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B, 1413 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17, 1414 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF 1415 }; 1416 1417 1418 static uint8_t ms_hmac_key0[] = { 1419 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1420 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1421 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1422 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1423 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1424 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1425 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1426 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1427 }; 1428 1429 static const uint8_t ms_hmac_digest0[] = { 1430 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51, 1431 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F, 1432 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C, 1433 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4, 1434 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56, 1435 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4, 1436 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23, 1437 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90 1438 }; 1439 1440 /* End Session 0 */ 1441 /* Begin session 1 */ 1442 1443 static uint8_t ms_aes_cbc_key1[] = { 1444 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1445 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1446 }; 1447 1448 static uint8_t ms_aes_cbc_iv1[] = { 1449 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1450 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1451 }; 1452 1453 static const uint8_t ms_aes_cbc_cipher1[] = { 1454 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71, 1455 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23, 1456 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09, 1457 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A, 1458 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C, 1459 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F, 1460 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9, 1461 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66, 1462 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43, 1463 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB, 1464 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23, 1465 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29, 1466 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26, 1467 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F, 1468 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68, 1469 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77, 1470 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8, 1471 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97, 1472 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3, 1473 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90, 1474 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5, 1475 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E, 1476 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45, 1477 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B, 1478 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5, 1479 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D, 1480 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E, 1481 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD, 1482 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE, 1483 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1, 1484 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F, 1485 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25, 1486 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1, 1487 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3, 1488 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE, 1489 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6, 1490 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52, 1491 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA, 1492 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63, 1493 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E, 1494 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA, 1495 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB, 1496 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71, 1497 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF, 1498 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A, 1499 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95, 1500 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73, 1501 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49, 1502 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB, 1503 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B, 1504 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC, 1505 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED, 1506 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02, 1507 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4, 1508 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF, 1509 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82, 1510 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D, 1511 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6, 1512 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9, 1513 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35, 1514 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0, 1515 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53, 1516 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5, 1517 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3 1518 1519 }; 1520 1521 static uint8_t ms_hmac_key1[] = { 1522 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1523 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1524 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1525 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1526 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1527 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1528 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1529 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1530 }; 1531 1532 static const uint8_t ms_hmac_digest1[] = { 1533 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69, 1534 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50, 1535 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20, 1536 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD, 1537 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9, 1538 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4, 1539 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA, 1540 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F 1541 }; 1542 /* End Session 1 */ 1543 /* Begin Session 2 */ 1544 static uint8_t ms_aes_cbc_key2[] = { 1545 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1546 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1547 }; 1548 1549 static uint8_t ms_aes_cbc_iv2[] = { 1550 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 1551 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 1552 }; 1553 1554 static const uint8_t ms_aes_cbc_cipher2[] = { 1555 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91, 1556 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97, 1557 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8, 1558 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5, 1559 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98, 1560 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69, 1561 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09, 1562 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF, 1563 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44, 1564 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B, 1565 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9, 1566 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34, 1567 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99, 1568 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF, 1569 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC, 1570 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26, 1571 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3, 1572 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF, 1573 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3, 1574 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3, 1575 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA, 1576 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13, 1577 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38, 1578 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71, 1579 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC, 1580 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1, 1581 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E, 1582 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22, 1583 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62, 1584 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72, 1585 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6, 1586 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6, 1587 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44, 1588 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24, 1589 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5, 1590 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E, 1591 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17, 1592 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9, 1593 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D, 1594 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D, 1595 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22, 1596 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9, 1597 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49, 1598 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E, 1599 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B, 1600 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2, 1601 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95, 1602 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07, 1603 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3, 1604 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A, 1605 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57, 1606 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84, 1607 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61, 1608 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF, 1609 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17, 1610 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A, 1611 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1, 1612 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53, 1613 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7, 1614 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2, 1615 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A, 1616 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8, 1617 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70, 1618 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92 1619 }; 1620 1621 static uint8_t ms_hmac_key2[] = { 1622 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 1623 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1624 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1625 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60, 1626 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1, 1627 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1628 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76, 1629 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60 1630 }; 1631 1632 static const uint8_t ms_hmac_digest2[] = { 1633 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF, 1634 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6, 1635 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77, 1636 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27, 1637 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82, 1638 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24, 1639 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E, 1640 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59 1641 }; 1642 1643 /* End Session 2 */ 1644 1645 1646 static int 1647 test_AES_CBC_HMAC_SHA1_encrypt_digest(void) 1648 { 1649 struct crypto_testsuite_params *ts_params = &testsuite_params; 1650 struct crypto_unittest_params *ut_params = &unittest_params; 1651 1652 /* Verify the capabilities */ 1653 struct rte_cryptodev_sym_capability_idx cap_idx; 1654 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1655 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 1656 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 1657 &cap_idx) == NULL) 1658 return -ENOTSUP; 1659 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1660 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 1661 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 1662 &cap_idx) == NULL) 1663 return -ENOTSUP; 1664 1665 /* Generate test mbuf data and space for digest */ 1666 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 1667 catch_22_quote, QUOTE_512_BYTES, 0); 1668 1669 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 1670 DIGEST_BYTE_LENGTH_SHA1); 1671 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 1672 1673 /* Setup Cipher Parameters */ 1674 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1675 ut_params->cipher_xform.next = &ut_params->auth_xform; 1676 1677 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 1678 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 1679 ut_params->cipher_xform.cipher.key.data = aes_cbc_key; 1680 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 1681 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1682 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 1683 1684 /* Setup HMAC Parameters */ 1685 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1686 1687 ut_params->auth_xform.next = NULL; 1688 1689 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 1690 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 1691 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1; 1692 ut_params->auth_xform.auth.key.data = hmac_sha1_key; 1693 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1; 1694 1695 ut_params->sess = rte_cryptodev_sym_session_create( 1696 ts_params->session_mpool); 1697 1698 /* Create crypto session*/ 1699 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 1700 ut_params->sess, &ut_params->cipher_xform, 1701 ts_params->session_priv_mpool); 1702 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 1703 1704 /* Generate crypto op data structure */ 1705 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1706 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1707 TEST_ASSERT_NOT_NULL(ut_params->op, 1708 "Failed to allocate symmetric crypto operation struct"); 1709 1710 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 1711 1712 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1713 1714 /* set crypto operation source mbuf */ 1715 sym_op->m_src = ut_params->ibuf; 1716 1717 /* Set crypto operation authentication parameters */ 1718 sym_op->auth.digest.data = ut_params->digest; 1719 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 1720 ut_params->ibuf, QUOTE_512_BYTES); 1721 1722 sym_op->auth.data.offset = 0; 1723 sym_op->auth.data.length = QUOTE_512_BYTES; 1724 1725 /* Copy IV at the end of the crypto operation */ 1726 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1727 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC); 1728 1729 /* Set crypto operation cipher parameters */ 1730 sym_op->cipher.data.offset = 0; 1731 sym_op->cipher.data.length = QUOTE_512_BYTES; 1732 1733 /* Process crypto operation */ 1734 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 1735 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 1736 ut_params->op); 1737 else 1738 TEST_ASSERT_NOT_NULL( 1739 process_crypto_request(ts_params->valid_devs[0], 1740 ut_params->op), 1741 "failed to process sym crypto op"); 1742 1743 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1744 "crypto op processing failed"); 1745 1746 /* Validate obuf */ 1747 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 1748 uint8_t *); 1749 1750 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext, 1751 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 1752 QUOTE_512_BYTES, 1753 "ciphertext data not as expected"); 1754 1755 uint8_t *digest = ciphertext + QUOTE_512_BYTES; 1756 1757 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest, 1758 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest, 1759 gbl_driver_id == rte_cryptodev_driver_id_get( 1760 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ? 1761 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 : 1762 DIGEST_BYTE_LENGTH_SHA1, 1763 "Generated digest data not as expected"); 1764 1765 return TEST_SUCCESS; 1766 } 1767 1768 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */ 1769 1770 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512) 1771 1772 static uint8_t hmac_sha512_key[] = { 1773 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1, 1774 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA, 1775 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76, 1776 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60, 1777 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1, 1778 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0, 1779 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76, 1780 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 }; 1781 1782 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = { 1783 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8, 1784 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48, 1785 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8, 1786 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70, 1787 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8, 1788 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E, 1789 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D, 1790 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A }; 1791 1792 1793 1794 static int 1795 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 1796 struct crypto_unittest_params *ut_params, 1797 uint8_t *cipher_key, 1798 uint8_t *hmac_key); 1799 1800 static int 1801 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 1802 struct crypto_unittest_params *ut_params, 1803 struct crypto_testsuite_params *ts_params, 1804 const uint8_t *cipher, 1805 const uint8_t *digest, 1806 const uint8_t *iv); 1807 1808 1809 static int 1810 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 1811 struct crypto_unittest_params *ut_params, 1812 uint8_t *cipher_key, 1813 uint8_t *hmac_key) 1814 { 1815 1816 /* Setup Cipher Parameters */ 1817 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 1818 ut_params->cipher_xform.next = NULL; 1819 1820 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 1821 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 1822 ut_params->cipher_xform.cipher.key.data = cipher_key; 1823 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC; 1824 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 1825 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC; 1826 1827 /* Setup HMAC Parameters */ 1828 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 1829 ut_params->auth_xform.next = &ut_params->cipher_xform; 1830 1831 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 1832 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC; 1833 ut_params->auth_xform.auth.key.data = hmac_key; 1834 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512; 1835 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512; 1836 1837 return TEST_SUCCESS; 1838 } 1839 1840 1841 static int 1842 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess, 1843 struct crypto_unittest_params *ut_params, 1844 struct crypto_testsuite_params *ts_params, 1845 const uint8_t *cipher, 1846 const uint8_t *digest, 1847 const uint8_t *iv) 1848 { 1849 /* Generate test mbuf data and digest */ 1850 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool, 1851 (const char *) 1852 cipher, 1853 QUOTE_512_BYTES, 0); 1854 1855 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 1856 DIGEST_BYTE_LENGTH_SHA512); 1857 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest"); 1858 1859 rte_memcpy(ut_params->digest, 1860 digest, 1861 DIGEST_BYTE_LENGTH_SHA512); 1862 1863 /* Generate Crypto op data structure */ 1864 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 1865 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 1866 TEST_ASSERT_NOT_NULL(ut_params->op, 1867 "Failed to allocate symmetric crypto operation struct"); 1868 1869 rte_crypto_op_attach_sym_session(ut_params->op, sess); 1870 1871 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 1872 1873 /* set crypto operation source mbuf */ 1874 sym_op->m_src = ut_params->ibuf; 1875 1876 sym_op->auth.digest.data = ut_params->digest; 1877 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 1878 ut_params->ibuf, QUOTE_512_BYTES); 1879 1880 sym_op->auth.data.offset = 0; 1881 sym_op->auth.data.length = QUOTE_512_BYTES; 1882 1883 /* Copy IV at the end of the crypto operation */ 1884 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 1885 iv, CIPHER_IV_LENGTH_AES_CBC); 1886 1887 sym_op->cipher.data.offset = 0; 1888 sym_op->cipher.data.length = QUOTE_512_BYTES; 1889 1890 /* Process crypto operation */ 1891 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 1892 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 1893 ut_params->op); 1894 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 1895 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 1896 ut_params->op, 1, 1, 0, 0); 1897 else 1898 TEST_ASSERT_NOT_NULL( 1899 process_crypto_request(ts_params->valid_devs[0], 1900 ut_params->op), 1901 "failed to process sym crypto op"); 1902 1903 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1904 "crypto op processing failed"); 1905 1906 ut_params->obuf = ut_params->op->sym->m_src; 1907 1908 /* Validate obuf */ 1909 TEST_ASSERT_BUFFERS_ARE_EQUAL( 1910 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 1911 catch_22_quote, 1912 QUOTE_512_BYTES, 1913 "Plaintext data not as expected"); 1914 1915 /* Validate obuf */ 1916 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 1917 "Digest verification failed"); 1918 1919 return TEST_SUCCESS; 1920 } 1921 1922 static int 1923 test_blockcipher(enum blockcipher_test_type test_type) 1924 { 1925 struct crypto_testsuite_params *ts_params = &testsuite_params; 1926 int status; 1927 1928 status = test_blockcipher_all_tests(ts_params->mbuf_pool, 1929 ts_params->op_mpool, 1930 ts_params->session_mpool, ts_params->session_priv_mpool, 1931 ts_params->valid_devs[0], 1932 test_type); 1933 1934 if (status == -ENOTSUP) 1935 return status; 1936 1937 TEST_ASSERT_EQUAL(status, 0, "Test failed"); 1938 1939 return TEST_SUCCESS; 1940 } 1941 1942 static int 1943 test_AES_cipheronly_all(void) 1944 { 1945 return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE); 1946 } 1947 1948 static int 1949 test_AES_docsis_all(void) 1950 { 1951 /* Data-path service does not support DOCSIS yet */ 1952 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 1953 return -ENOTSUP; 1954 return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE); 1955 } 1956 1957 static int 1958 test_DES_docsis_all(void) 1959 { 1960 /* Data-path service does not support DOCSIS yet */ 1961 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 1962 return -ENOTSUP; 1963 return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE); 1964 } 1965 1966 static int 1967 test_DES_cipheronly_all(void) 1968 { 1969 return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE); 1970 } 1971 1972 static int 1973 test_authonly_all(void) 1974 { 1975 return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE); 1976 } 1977 1978 static int 1979 test_AES_chain_all(void) 1980 { 1981 return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE); 1982 } 1983 1984 static int 1985 test_3DES_chain_all(void) 1986 { 1987 return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE); 1988 } 1989 1990 static int 1991 test_3DES_cipheronly_all(void) 1992 { 1993 return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE); 1994 } 1995 1996 /* ***** SNOW 3G Tests ***** */ 1997 static int 1998 create_wireless_algo_hash_session(uint8_t dev_id, 1999 const uint8_t *key, const uint8_t key_len, 2000 const uint8_t iv_len, const uint8_t auth_len, 2001 enum rte_crypto_auth_operation op, 2002 enum rte_crypto_auth_algorithm algo) 2003 { 2004 uint8_t hash_key[key_len]; 2005 int status; 2006 2007 struct crypto_testsuite_params *ts_params = &testsuite_params; 2008 struct crypto_unittest_params *ut_params = &unittest_params; 2009 2010 memcpy(hash_key, key, key_len); 2011 2012 debug_hexdump(stdout, "key:", key, key_len); 2013 2014 /* Setup Authentication Parameters */ 2015 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2016 ut_params->auth_xform.next = NULL; 2017 2018 ut_params->auth_xform.auth.op = op; 2019 ut_params->auth_xform.auth.algo = algo; 2020 ut_params->auth_xform.auth.key.length = key_len; 2021 ut_params->auth_xform.auth.key.data = hash_key; 2022 ut_params->auth_xform.auth.digest_length = auth_len; 2023 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 2024 ut_params->auth_xform.auth.iv.length = iv_len; 2025 ut_params->sess = rte_cryptodev_sym_session_create( 2026 ts_params->session_mpool); 2027 2028 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2029 &ut_params->auth_xform, 2030 ts_params->session_priv_mpool); 2031 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2032 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2033 return 0; 2034 } 2035 2036 static int 2037 create_wireless_algo_cipher_session(uint8_t dev_id, 2038 enum rte_crypto_cipher_operation op, 2039 enum rte_crypto_cipher_algorithm algo, 2040 const uint8_t *key, const uint8_t key_len, 2041 uint8_t iv_len) 2042 { 2043 uint8_t cipher_key[key_len]; 2044 int status; 2045 struct crypto_testsuite_params *ts_params = &testsuite_params; 2046 struct crypto_unittest_params *ut_params = &unittest_params; 2047 2048 memcpy(cipher_key, key, key_len); 2049 2050 /* Setup Cipher Parameters */ 2051 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2052 ut_params->cipher_xform.next = NULL; 2053 2054 ut_params->cipher_xform.cipher.algo = algo; 2055 ut_params->cipher_xform.cipher.op = op; 2056 ut_params->cipher_xform.cipher.key.data = cipher_key; 2057 ut_params->cipher_xform.cipher.key.length = key_len; 2058 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2059 ut_params->cipher_xform.cipher.iv.length = iv_len; 2060 2061 debug_hexdump(stdout, "key:", key, key_len); 2062 2063 /* Create Crypto session */ 2064 ut_params->sess = rte_cryptodev_sym_session_create( 2065 ts_params->session_mpool); 2066 2067 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2068 &ut_params->cipher_xform, 2069 ts_params->session_priv_mpool); 2070 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2071 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2072 return 0; 2073 } 2074 2075 static int 2076 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len, 2077 unsigned int cipher_len, 2078 unsigned int cipher_offset) 2079 { 2080 struct crypto_testsuite_params *ts_params = &testsuite_params; 2081 struct crypto_unittest_params *ut_params = &unittest_params; 2082 2083 /* Generate Crypto op data structure */ 2084 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2085 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2086 TEST_ASSERT_NOT_NULL(ut_params->op, 2087 "Failed to allocate pktmbuf offload"); 2088 2089 /* Set crypto operation data parameters */ 2090 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2091 2092 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2093 2094 /* set crypto operation source mbuf */ 2095 sym_op->m_src = ut_params->ibuf; 2096 2097 /* iv */ 2098 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2099 iv, iv_len); 2100 sym_op->cipher.data.length = cipher_len; 2101 sym_op->cipher.data.offset = cipher_offset; 2102 return 0; 2103 } 2104 2105 static int 2106 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len, 2107 unsigned int cipher_len, 2108 unsigned int cipher_offset) 2109 { 2110 struct crypto_testsuite_params *ts_params = &testsuite_params; 2111 struct crypto_unittest_params *ut_params = &unittest_params; 2112 2113 /* Generate Crypto op data structure */ 2114 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2115 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2116 TEST_ASSERT_NOT_NULL(ut_params->op, 2117 "Failed to allocate pktmbuf offload"); 2118 2119 /* Set crypto operation data parameters */ 2120 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2121 2122 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2123 2124 /* set crypto operation source mbuf */ 2125 sym_op->m_src = ut_params->ibuf; 2126 sym_op->m_dst = ut_params->obuf; 2127 2128 /* iv */ 2129 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2130 iv, iv_len); 2131 sym_op->cipher.data.length = cipher_len; 2132 sym_op->cipher.data.offset = cipher_offset; 2133 return 0; 2134 } 2135 2136 static int 2137 create_wireless_algo_cipher_auth_session(uint8_t dev_id, 2138 enum rte_crypto_cipher_operation cipher_op, 2139 enum rte_crypto_auth_operation auth_op, 2140 enum rte_crypto_auth_algorithm auth_algo, 2141 enum rte_crypto_cipher_algorithm cipher_algo, 2142 const uint8_t *key, uint8_t key_len, 2143 uint8_t auth_iv_len, uint8_t auth_len, 2144 uint8_t cipher_iv_len) 2145 2146 { 2147 uint8_t cipher_auth_key[key_len]; 2148 int status; 2149 2150 struct crypto_testsuite_params *ts_params = &testsuite_params; 2151 struct crypto_unittest_params *ut_params = &unittest_params; 2152 2153 memcpy(cipher_auth_key, key, key_len); 2154 2155 /* Setup Authentication Parameters */ 2156 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2157 ut_params->auth_xform.next = NULL; 2158 2159 ut_params->auth_xform.auth.op = auth_op; 2160 ut_params->auth_xform.auth.algo = auth_algo; 2161 ut_params->auth_xform.auth.key.length = key_len; 2162 /* Hash key = cipher key */ 2163 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2164 ut_params->auth_xform.auth.digest_length = auth_len; 2165 /* Auth IV will be after cipher IV */ 2166 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2167 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2168 2169 /* Setup Cipher Parameters */ 2170 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2171 ut_params->cipher_xform.next = &ut_params->auth_xform; 2172 2173 ut_params->cipher_xform.cipher.algo = cipher_algo; 2174 ut_params->cipher_xform.cipher.op = cipher_op; 2175 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2176 ut_params->cipher_xform.cipher.key.length = key_len; 2177 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2178 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2179 2180 debug_hexdump(stdout, "key:", key, key_len); 2181 2182 /* Create Crypto session*/ 2183 ut_params->sess = rte_cryptodev_sym_session_create( 2184 ts_params->session_mpool); 2185 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2186 2187 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2188 &ut_params->cipher_xform, 2189 ts_params->session_priv_mpool); 2190 if (status == -ENOTSUP) 2191 return status; 2192 2193 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2194 return 0; 2195 } 2196 2197 static int 2198 create_wireless_cipher_auth_session(uint8_t dev_id, 2199 enum rte_crypto_cipher_operation cipher_op, 2200 enum rte_crypto_auth_operation auth_op, 2201 enum rte_crypto_auth_algorithm auth_algo, 2202 enum rte_crypto_cipher_algorithm cipher_algo, 2203 const struct wireless_test_data *tdata) 2204 { 2205 const uint8_t key_len = tdata->key.len; 2206 uint8_t cipher_auth_key[key_len]; 2207 int status; 2208 2209 struct crypto_testsuite_params *ts_params = &testsuite_params; 2210 struct crypto_unittest_params *ut_params = &unittest_params; 2211 const uint8_t *key = tdata->key.data; 2212 const uint8_t auth_len = tdata->digest.len; 2213 uint8_t cipher_iv_len = tdata->cipher_iv.len; 2214 uint8_t auth_iv_len = tdata->auth_iv.len; 2215 2216 memcpy(cipher_auth_key, key, key_len); 2217 2218 /* Setup Authentication Parameters */ 2219 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2220 ut_params->auth_xform.next = NULL; 2221 2222 ut_params->auth_xform.auth.op = auth_op; 2223 ut_params->auth_xform.auth.algo = auth_algo; 2224 ut_params->auth_xform.auth.key.length = key_len; 2225 /* Hash key = cipher key */ 2226 ut_params->auth_xform.auth.key.data = cipher_auth_key; 2227 ut_params->auth_xform.auth.digest_length = auth_len; 2228 /* Auth IV will be after cipher IV */ 2229 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2230 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2231 2232 /* Setup Cipher Parameters */ 2233 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2234 ut_params->cipher_xform.next = &ut_params->auth_xform; 2235 2236 ut_params->cipher_xform.cipher.algo = cipher_algo; 2237 ut_params->cipher_xform.cipher.op = cipher_op; 2238 ut_params->cipher_xform.cipher.key.data = cipher_auth_key; 2239 ut_params->cipher_xform.cipher.key.length = key_len; 2240 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2241 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2242 2243 2244 debug_hexdump(stdout, "key:", key, key_len); 2245 2246 /* Create Crypto session*/ 2247 ut_params->sess = rte_cryptodev_sym_session_create( 2248 ts_params->session_mpool); 2249 2250 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2251 &ut_params->cipher_xform, 2252 ts_params->session_priv_mpool); 2253 if (status == -ENOTSUP) 2254 return status; 2255 2256 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2257 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2258 return 0; 2259 } 2260 2261 static int 2262 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id, 2263 const struct wireless_test_data *tdata) 2264 { 2265 return create_wireless_cipher_auth_session(dev_id, 2266 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 2267 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3, 2268 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata); 2269 } 2270 2271 static int 2272 create_wireless_algo_auth_cipher_session(uint8_t dev_id, 2273 enum rte_crypto_cipher_operation cipher_op, 2274 enum rte_crypto_auth_operation auth_op, 2275 enum rte_crypto_auth_algorithm auth_algo, 2276 enum rte_crypto_cipher_algorithm cipher_algo, 2277 const uint8_t *key, const uint8_t key_len, 2278 uint8_t auth_iv_len, uint8_t auth_len, 2279 uint8_t cipher_iv_len) 2280 { 2281 uint8_t auth_cipher_key[key_len]; 2282 int status; 2283 struct crypto_testsuite_params *ts_params = &testsuite_params; 2284 struct crypto_unittest_params *ut_params = &unittest_params; 2285 2286 memcpy(auth_cipher_key, key, key_len); 2287 2288 /* Setup Authentication Parameters */ 2289 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2290 ut_params->auth_xform.auth.op = auth_op; 2291 ut_params->auth_xform.next = &ut_params->cipher_xform; 2292 ut_params->auth_xform.auth.algo = auth_algo; 2293 ut_params->auth_xform.auth.key.length = key_len; 2294 ut_params->auth_xform.auth.key.data = auth_cipher_key; 2295 ut_params->auth_xform.auth.digest_length = auth_len; 2296 /* Auth IV will be after cipher IV */ 2297 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len; 2298 ut_params->auth_xform.auth.iv.length = auth_iv_len; 2299 2300 /* Setup Cipher Parameters */ 2301 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 2302 ut_params->cipher_xform.next = NULL; 2303 ut_params->cipher_xform.cipher.algo = cipher_algo; 2304 ut_params->cipher_xform.cipher.op = cipher_op; 2305 ut_params->cipher_xform.cipher.key.data = auth_cipher_key; 2306 ut_params->cipher_xform.cipher.key.length = key_len; 2307 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 2308 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len; 2309 2310 debug_hexdump(stdout, "key:", key, key_len); 2311 2312 /* Create Crypto session*/ 2313 ut_params->sess = rte_cryptodev_sym_session_create( 2314 ts_params->session_mpool); 2315 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 2316 2317 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) { 2318 ut_params->auth_xform.next = NULL; 2319 ut_params->cipher_xform.next = &ut_params->auth_xform; 2320 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2321 &ut_params->cipher_xform, 2322 ts_params->session_priv_mpool); 2323 2324 } else 2325 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 2326 &ut_params->auth_xform, 2327 ts_params->session_priv_mpool); 2328 2329 if (status == -ENOTSUP) 2330 return status; 2331 2332 TEST_ASSERT_EQUAL(status, 0, "session init failed"); 2333 2334 return 0; 2335 } 2336 2337 static int 2338 create_wireless_algo_hash_operation(const uint8_t *auth_tag, 2339 unsigned int auth_tag_len, 2340 const uint8_t *iv, unsigned int iv_len, 2341 unsigned int data_pad_len, 2342 enum rte_crypto_auth_operation op, 2343 unsigned int auth_len, unsigned int auth_offset) 2344 { 2345 struct crypto_testsuite_params *ts_params = &testsuite_params; 2346 2347 struct crypto_unittest_params *ut_params = &unittest_params; 2348 2349 /* Generate Crypto op data structure */ 2350 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2351 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2352 TEST_ASSERT_NOT_NULL(ut_params->op, 2353 "Failed to allocate pktmbuf offload"); 2354 2355 /* Set crypto operation data parameters */ 2356 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2357 2358 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2359 2360 /* set crypto operation source mbuf */ 2361 sym_op->m_src = ut_params->ibuf; 2362 2363 /* iv */ 2364 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 2365 iv, iv_len); 2366 /* digest */ 2367 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2368 ut_params->ibuf, auth_tag_len); 2369 2370 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2371 "no room to append auth tag"); 2372 ut_params->digest = sym_op->auth.digest.data; 2373 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2374 ut_params->ibuf, data_pad_len); 2375 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2376 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2377 else 2378 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2379 2380 debug_hexdump(stdout, "digest:", 2381 sym_op->auth.digest.data, 2382 auth_tag_len); 2383 2384 sym_op->auth.data.length = auth_len; 2385 sym_op->auth.data.offset = auth_offset; 2386 2387 return 0; 2388 } 2389 2390 static int 2391 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata, 2392 enum rte_crypto_auth_operation op) 2393 { 2394 struct crypto_testsuite_params *ts_params = &testsuite_params; 2395 struct crypto_unittest_params *ut_params = &unittest_params; 2396 2397 const uint8_t *auth_tag = tdata->digest.data; 2398 const unsigned int auth_tag_len = tdata->digest.len; 2399 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len); 2400 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2401 2402 const uint8_t *cipher_iv = tdata->cipher_iv.data; 2403 const uint8_t cipher_iv_len = tdata->cipher_iv.len; 2404 const uint8_t *auth_iv = tdata->auth_iv.data; 2405 const uint8_t auth_iv_len = tdata->auth_iv.len; 2406 const unsigned int cipher_len = tdata->validCipherLenInBits.len; 2407 const unsigned int auth_len = tdata->validAuthLenInBits.len; 2408 2409 /* Generate Crypto op data structure */ 2410 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2411 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2412 TEST_ASSERT_NOT_NULL(ut_params->op, 2413 "Failed to allocate pktmbuf offload"); 2414 /* Set crypto operation data parameters */ 2415 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2416 2417 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2418 2419 /* set crypto operation source mbuf */ 2420 sym_op->m_src = ut_params->ibuf; 2421 2422 /* digest */ 2423 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2424 ut_params->ibuf, auth_tag_len); 2425 2426 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2427 "no room to append auth tag"); 2428 ut_params->digest = sym_op->auth.digest.data; 2429 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2430 ut_params->ibuf, data_pad_len); 2431 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2432 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2433 else 2434 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2435 2436 debug_hexdump(stdout, "digest:", 2437 sym_op->auth.digest.data, 2438 auth_tag_len); 2439 2440 /* Copy cipher and auth IVs at the end of the crypto operation */ 2441 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2442 IV_OFFSET); 2443 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2444 iv_ptr += cipher_iv_len; 2445 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2446 2447 sym_op->cipher.data.length = cipher_len; 2448 sym_op->cipher.data.offset = 0; 2449 sym_op->auth.data.length = auth_len; 2450 sym_op->auth.data.offset = 0; 2451 2452 return 0; 2453 } 2454 2455 static int 2456 create_zuc_cipher_hash_generate_operation( 2457 const struct wireless_test_data *tdata) 2458 { 2459 return create_wireless_cipher_hash_operation(tdata, 2460 RTE_CRYPTO_AUTH_OP_GENERATE); 2461 } 2462 2463 static int 2464 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag, 2465 const unsigned auth_tag_len, 2466 const uint8_t *auth_iv, uint8_t auth_iv_len, 2467 unsigned data_pad_len, 2468 enum rte_crypto_auth_operation op, 2469 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2470 const unsigned cipher_len, const unsigned cipher_offset, 2471 const unsigned auth_len, const unsigned auth_offset) 2472 { 2473 struct crypto_testsuite_params *ts_params = &testsuite_params; 2474 struct crypto_unittest_params *ut_params = &unittest_params; 2475 2476 enum rte_crypto_cipher_algorithm cipher_algo = 2477 ut_params->cipher_xform.cipher.algo; 2478 enum rte_crypto_auth_algorithm auth_algo = 2479 ut_params->auth_xform.auth.algo; 2480 2481 /* Generate Crypto op data structure */ 2482 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2483 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2484 TEST_ASSERT_NOT_NULL(ut_params->op, 2485 "Failed to allocate pktmbuf offload"); 2486 /* Set crypto operation data parameters */ 2487 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2488 2489 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2490 2491 /* set crypto operation source mbuf */ 2492 sym_op->m_src = ut_params->ibuf; 2493 2494 /* digest */ 2495 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 2496 ut_params->ibuf, auth_tag_len); 2497 2498 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 2499 "no room to append auth tag"); 2500 ut_params->digest = sym_op->auth.digest.data; 2501 2502 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) { 2503 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2504 ut_params->ibuf, data_pad_len); 2505 } else { 2506 struct rte_mbuf *m = ut_params->ibuf; 2507 unsigned int offset = data_pad_len; 2508 2509 while (offset > m->data_len && m->next != NULL) { 2510 offset -= m->data_len; 2511 m = m->next; 2512 } 2513 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2514 m, offset); 2515 } 2516 2517 if (op == RTE_CRYPTO_AUTH_OP_GENERATE) 2518 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2519 else 2520 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2521 2522 debug_hexdump(stdout, "digest:", 2523 sym_op->auth.digest.data, 2524 auth_tag_len); 2525 2526 /* Copy cipher and auth IVs at the end of the crypto operation */ 2527 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, 2528 IV_OFFSET); 2529 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2530 iv_ptr += cipher_iv_len; 2531 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2532 2533 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2534 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2535 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2536 sym_op->cipher.data.length = cipher_len; 2537 sym_op->cipher.data.offset = cipher_offset; 2538 } else { 2539 sym_op->cipher.data.length = cipher_len >> 3; 2540 sym_op->cipher.data.offset = cipher_offset >> 3; 2541 } 2542 2543 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2544 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2545 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2546 sym_op->auth.data.length = auth_len; 2547 sym_op->auth.data.offset = auth_offset; 2548 } else { 2549 sym_op->auth.data.length = auth_len >> 3; 2550 sym_op->auth.data.offset = auth_offset >> 3; 2551 } 2552 2553 return 0; 2554 } 2555 2556 static int 2557 create_wireless_algo_auth_cipher_operation( 2558 const uint8_t *auth_tag, unsigned int auth_tag_len, 2559 const uint8_t *cipher_iv, uint8_t cipher_iv_len, 2560 const uint8_t *auth_iv, uint8_t auth_iv_len, 2561 unsigned int data_pad_len, 2562 unsigned int cipher_len, unsigned int cipher_offset, 2563 unsigned int auth_len, unsigned int auth_offset, 2564 uint8_t op_mode, uint8_t do_sgl, uint8_t verify) 2565 { 2566 struct crypto_testsuite_params *ts_params = &testsuite_params; 2567 struct crypto_unittest_params *ut_params = &unittest_params; 2568 2569 enum rte_crypto_cipher_algorithm cipher_algo = 2570 ut_params->cipher_xform.cipher.algo; 2571 enum rte_crypto_auth_algorithm auth_algo = 2572 ut_params->auth_xform.auth.algo; 2573 2574 /* Generate Crypto op data structure */ 2575 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 2576 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 2577 TEST_ASSERT_NOT_NULL(ut_params->op, 2578 "Failed to allocate pktmbuf offload"); 2579 2580 /* Set crypto operation data parameters */ 2581 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 2582 2583 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 2584 2585 /* set crypto operation mbufs */ 2586 sym_op->m_src = ut_params->ibuf; 2587 if (op_mode == OUT_OF_PLACE) 2588 sym_op->m_dst = ut_params->obuf; 2589 2590 /* digest */ 2591 if (!do_sgl) { 2592 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset( 2593 (op_mode == IN_PLACE ? 2594 ut_params->ibuf : ut_params->obuf), 2595 uint8_t *, data_pad_len); 2596 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 2597 (op_mode == IN_PLACE ? 2598 ut_params->ibuf : ut_params->obuf), 2599 data_pad_len); 2600 memset(sym_op->auth.digest.data, 0, auth_tag_len); 2601 } else { 2602 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3); 2603 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ? 2604 sym_op->m_src : sym_op->m_dst); 2605 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) { 2606 remaining_off -= rte_pktmbuf_data_len(sgl_buf); 2607 sgl_buf = sgl_buf->next; 2608 } 2609 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf, 2610 uint8_t *, remaining_off); 2611 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf, 2612 remaining_off); 2613 memset(sym_op->auth.digest.data, 0, remaining_off); 2614 while (sgl_buf->next != NULL) { 2615 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *), 2616 0, rte_pktmbuf_data_len(sgl_buf)); 2617 sgl_buf = sgl_buf->next; 2618 } 2619 } 2620 2621 /* Copy digest for the verification */ 2622 if (verify) 2623 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len); 2624 2625 /* Copy cipher and auth IVs at the end of the crypto operation */ 2626 uint8_t *iv_ptr = rte_crypto_op_ctod_offset( 2627 ut_params->op, uint8_t *, IV_OFFSET); 2628 2629 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len); 2630 iv_ptr += cipher_iv_len; 2631 rte_memcpy(iv_ptr, auth_iv, auth_iv_len); 2632 2633 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 || 2634 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 || 2635 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) { 2636 sym_op->cipher.data.length = cipher_len; 2637 sym_op->cipher.data.offset = cipher_offset; 2638 } else { 2639 sym_op->cipher.data.length = cipher_len >> 3; 2640 sym_op->cipher.data.offset = cipher_offset >> 3; 2641 } 2642 2643 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 || 2644 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 || 2645 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) { 2646 sym_op->auth.data.length = auth_len; 2647 sym_op->auth.data.offset = auth_offset; 2648 } else { 2649 sym_op->auth.data.length = auth_len >> 3; 2650 sym_op->auth.data.offset = auth_offset >> 3; 2651 } 2652 2653 return 0; 2654 } 2655 2656 static int 2657 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata) 2658 { 2659 struct crypto_testsuite_params *ts_params = &testsuite_params; 2660 struct crypto_unittest_params *ut_params = &unittest_params; 2661 2662 int retval; 2663 unsigned plaintext_pad_len; 2664 unsigned plaintext_len; 2665 uint8_t *plaintext; 2666 struct rte_cryptodev_info dev_info; 2667 2668 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 2669 uint64_t feat_flags = dev_info.feature_flags; 2670 2671 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 2672 ((tdata->validAuthLenInBits.len % 8) != 0)) { 2673 printf("Device doesn't support NON-Byte Aligned Data.\n"); 2674 return -ENOTSUP; 2675 } 2676 2677 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 2678 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 2679 printf("Device doesn't support RAW data-path APIs.\n"); 2680 return -ENOTSUP; 2681 } 2682 2683 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2684 return -ENOTSUP; 2685 2686 /* Verify the capabilities */ 2687 struct rte_cryptodev_sym_capability_idx cap_idx; 2688 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2689 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 2690 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2691 &cap_idx) == NULL) 2692 return -ENOTSUP; 2693 2694 /* Create SNOW 3G session */ 2695 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2696 tdata->key.data, tdata->key.len, 2697 tdata->auth_iv.len, tdata->digest.len, 2698 RTE_CRYPTO_AUTH_OP_GENERATE, 2699 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 2700 if (retval < 0) 2701 return retval; 2702 2703 /* alloc mbuf and set payload */ 2704 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2705 2706 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2707 rte_pktmbuf_tailroom(ut_params->ibuf)); 2708 2709 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2710 /* Append data which is padded to a multiple of */ 2711 /* the algorithms block size */ 2712 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2713 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2714 plaintext_pad_len); 2715 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2716 2717 /* Create SNOW 3G operation */ 2718 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 2719 tdata->auth_iv.data, tdata->auth_iv.len, 2720 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 2721 tdata->validAuthLenInBits.len, 2722 0); 2723 if (retval < 0) 2724 return retval; 2725 2726 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2727 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2728 ut_params->op, 0, 1, 1, 0); 2729 else 2730 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2731 ut_params->op); 2732 ut_params->obuf = ut_params->op->sym->m_src; 2733 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2734 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2735 + plaintext_pad_len; 2736 2737 /* Validate obuf */ 2738 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2739 ut_params->digest, 2740 tdata->digest.data, 2741 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 2742 "SNOW 3G Generated auth tag not as expected"); 2743 2744 return 0; 2745 } 2746 2747 static int 2748 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata) 2749 { 2750 struct crypto_testsuite_params *ts_params = &testsuite_params; 2751 struct crypto_unittest_params *ut_params = &unittest_params; 2752 2753 int retval; 2754 unsigned plaintext_pad_len; 2755 unsigned plaintext_len; 2756 uint8_t *plaintext; 2757 struct rte_cryptodev_info dev_info; 2758 2759 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 2760 uint64_t feat_flags = dev_info.feature_flags; 2761 2762 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 2763 ((tdata->validAuthLenInBits.len % 8) != 0)) { 2764 printf("Device doesn't support NON-Byte Aligned Data.\n"); 2765 return -ENOTSUP; 2766 } 2767 2768 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 2769 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 2770 printf("Device doesn't support RAW data-path APIs.\n"); 2771 return -ENOTSUP; 2772 } 2773 2774 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2775 return -ENOTSUP; 2776 2777 /* Verify the capabilities */ 2778 struct rte_cryptodev_sym_capability_idx cap_idx; 2779 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2780 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 2781 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2782 &cap_idx) == NULL) 2783 return -ENOTSUP; 2784 2785 /* Create SNOW 3G session */ 2786 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2787 tdata->key.data, tdata->key.len, 2788 tdata->auth_iv.len, tdata->digest.len, 2789 RTE_CRYPTO_AUTH_OP_VERIFY, 2790 RTE_CRYPTO_AUTH_SNOW3G_UIA2); 2791 if (retval < 0) 2792 return retval; 2793 /* alloc mbuf and set payload */ 2794 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2795 2796 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2797 rte_pktmbuf_tailroom(ut_params->ibuf)); 2798 2799 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2800 /* Append data which is padded to a multiple of */ 2801 /* the algorithms block size */ 2802 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 2803 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2804 plaintext_pad_len); 2805 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2806 2807 /* Create SNOW 3G operation */ 2808 retval = create_wireless_algo_hash_operation(tdata->digest.data, 2809 tdata->digest.len, 2810 tdata->auth_iv.data, tdata->auth_iv.len, 2811 plaintext_pad_len, 2812 RTE_CRYPTO_AUTH_OP_VERIFY, 2813 tdata->validAuthLenInBits.len, 2814 0); 2815 if (retval < 0) 2816 return retval; 2817 2818 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2819 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2820 ut_params->op, 0, 1, 1, 0); 2821 else 2822 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2823 ut_params->op); 2824 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2825 ut_params->obuf = ut_params->op->sym->m_src; 2826 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2827 + plaintext_pad_len; 2828 2829 /* Validate obuf */ 2830 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 2831 return 0; 2832 else 2833 return -1; 2834 2835 return 0; 2836 } 2837 2838 static int 2839 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata) 2840 { 2841 struct crypto_testsuite_params *ts_params = &testsuite_params; 2842 struct crypto_unittest_params *ut_params = &unittest_params; 2843 2844 int retval; 2845 unsigned plaintext_pad_len; 2846 unsigned plaintext_len; 2847 uint8_t *plaintext; 2848 struct rte_cryptodev_info dev_info; 2849 2850 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 2851 uint64_t feat_flags = dev_info.feature_flags; 2852 2853 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 2854 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 2855 printf("Device doesn't support RAW data-path APIs.\n"); 2856 return -ENOTSUP; 2857 } 2858 2859 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2860 return -ENOTSUP; 2861 2862 /* Verify the capabilities */ 2863 struct rte_cryptodev_sym_capability_idx cap_idx; 2864 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2865 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 2866 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2867 &cap_idx) == NULL) 2868 return -ENOTSUP; 2869 2870 /* Create KASUMI session */ 2871 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2872 tdata->key.data, tdata->key.len, 2873 0, tdata->digest.len, 2874 RTE_CRYPTO_AUTH_OP_GENERATE, 2875 RTE_CRYPTO_AUTH_KASUMI_F9); 2876 if (retval < 0) 2877 return retval; 2878 2879 /* alloc mbuf and set payload */ 2880 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2881 2882 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2883 rte_pktmbuf_tailroom(ut_params->ibuf)); 2884 2885 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2886 /* Append data which is padded to a multiple of */ 2887 /* the algorithms block size */ 2888 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 2889 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2890 plaintext_pad_len); 2891 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2892 2893 /* Create KASUMI operation */ 2894 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 2895 NULL, 0, 2896 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 2897 tdata->plaintext.len, 2898 0); 2899 if (retval < 0) 2900 return retval; 2901 2902 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2903 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 2904 ut_params->op); 2905 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2906 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2907 ut_params->op, 0, 1, 1, 0); 2908 else 2909 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2910 ut_params->op); 2911 2912 ut_params->obuf = ut_params->op->sym->m_src; 2913 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2914 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 2915 + plaintext_pad_len; 2916 2917 /* Validate obuf */ 2918 TEST_ASSERT_BUFFERS_ARE_EQUAL( 2919 ut_params->digest, 2920 tdata->digest.data, 2921 DIGEST_BYTE_LENGTH_KASUMI_F9, 2922 "KASUMI Generated auth tag not as expected"); 2923 2924 return 0; 2925 } 2926 2927 static int 2928 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata) 2929 { 2930 struct crypto_testsuite_params *ts_params = &testsuite_params; 2931 struct crypto_unittest_params *ut_params = &unittest_params; 2932 2933 int retval; 2934 unsigned plaintext_pad_len; 2935 unsigned plaintext_len; 2936 uint8_t *plaintext; 2937 struct rte_cryptodev_info dev_info; 2938 2939 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 2940 uint64_t feat_flags = dev_info.feature_flags; 2941 2942 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 2943 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 2944 printf("Device doesn't support RAW data-path APIs.\n"); 2945 return -ENOTSUP; 2946 } 2947 2948 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 2949 return -ENOTSUP; 2950 2951 /* Verify the capabilities */ 2952 struct rte_cryptodev_sym_capability_idx cap_idx; 2953 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 2954 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 2955 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 2956 &cap_idx) == NULL) 2957 return -ENOTSUP; 2958 2959 /* Create KASUMI session */ 2960 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 2961 tdata->key.data, tdata->key.len, 2962 0, tdata->digest.len, 2963 RTE_CRYPTO_AUTH_OP_VERIFY, 2964 RTE_CRYPTO_AUTH_KASUMI_F9); 2965 if (retval < 0) 2966 return retval; 2967 /* alloc mbuf and set payload */ 2968 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 2969 2970 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 2971 rte_pktmbuf_tailroom(ut_params->ibuf)); 2972 2973 plaintext_len = ceil_byte_length(tdata->plaintext.len); 2974 /* Append data which is padded to a multiple */ 2975 /* of the algorithms block size */ 2976 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 2977 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 2978 plaintext_pad_len); 2979 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 2980 2981 /* Create KASUMI operation */ 2982 retval = create_wireless_algo_hash_operation(tdata->digest.data, 2983 tdata->digest.len, 2984 NULL, 0, 2985 plaintext_pad_len, 2986 RTE_CRYPTO_AUTH_OP_VERIFY, 2987 tdata->plaintext.len, 2988 0); 2989 if (retval < 0) 2990 return retval; 2991 2992 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 2993 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 2994 ut_params->op, 0, 1, 1, 0); 2995 else 2996 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 2997 ut_params->op); 2998 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 2999 ut_params->obuf = ut_params->op->sym->m_src; 3000 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 3001 + plaintext_pad_len; 3002 3003 /* Validate obuf */ 3004 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS) 3005 return 0; 3006 else 3007 return -1; 3008 3009 return 0; 3010 } 3011 3012 static int 3013 test_snow3g_hash_generate_test_case_1(void) 3014 { 3015 return test_snow3g_authentication(&snow3g_hash_test_case_1); 3016 } 3017 3018 static int 3019 test_snow3g_hash_generate_test_case_2(void) 3020 { 3021 return test_snow3g_authentication(&snow3g_hash_test_case_2); 3022 } 3023 3024 static int 3025 test_snow3g_hash_generate_test_case_3(void) 3026 { 3027 return test_snow3g_authentication(&snow3g_hash_test_case_3); 3028 } 3029 3030 static int 3031 test_snow3g_hash_generate_test_case_4(void) 3032 { 3033 return test_snow3g_authentication(&snow3g_hash_test_case_4); 3034 } 3035 3036 static int 3037 test_snow3g_hash_generate_test_case_5(void) 3038 { 3039 return test_snow3g_authentication(&snow3g_hash_test_case_5); 3040 } 3041 3042 static int 3043 test_snow3g_hash_generate_test_case_6(void) 3044 { 3045 return test_snow3g_authentication(&snow3g_hash_test_case_6); 3046 } 3047 3048 static int 3049 test_snow3g_hash_verify_test_case_1(void) 3050 { 3051 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1); 3052 3053 } 3054 3055 static int 3056 test_snow3g_hash_verify_test_case_2(void) 3057 { 3058 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2); 3059 } 3060 3061 static int 3062 test_snow3g_hash_verify_test_case_3(void) 3063 { 3064 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3); 3065 } 3066 3067 static int 3068 test_snow3g_hash_verify_test_case_4(void) 3069 { 3070 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4); 3071 } 3072 3073 static int 3074 test_snow3g_hash_verify_test_case_5(void) 3075 { 3076 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5); 3077 } 3078 3079 static int 3080 test_snow3g_hash_verify_test_case_6(void) 3081 { 3082 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6); 3083 } 3084 3085 static int 3086 test_kasumi_hash_generate_test_case_1(void) 3087 { 3088 return test_kasumi_authentication(&kasumi_hash_test_case_1); 3089 } 3090 3091 static int 3092 test_kasumi_hash_generate_test_case_2(void) 3093 { 3094 return test_kasumi_authentication(&kasumi_hash_test_case_2); 3095 } 3096 3097 static int 3098 test_kasumi_hash_generate_test_case_3(void) 3099 { 3100 return test_kasumi_authentication(&kasumi_hash_test_case_3); 3101 } 3102 3103 static int 3104 test_kasumi_hash_generate_test_case_4(void) 3105 { 3106 return test_kasumi_authentication(&kasumi_hash_test_case_4); 3107 } 3108 3109 static int 3110 test_kasumi_hash_generate_test_case_5(void) 3111 { 3112 return test_kasumi_authentication(&kasumi_hash_test_case_5); 3113 } 3114 3115 static int 3116 test_kasumi_hash_generate_test_case_6(void) 3117 { 3118 return test_kasumi_authentication(&kasumi_hash_test_case_6); 3119 } 3120 3121 static int 3122 test_kasumi_hash_verify_test_case_1(void) 3123 { 3124 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1); 3125 } 3126 3127 static int 3128 test_kasumi_hash_verify_test_case_2(void) 3129 { 3130 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2); 3131 } 3132 3133 static int 3134 test_kasumi_hash_verify_test_case_3(void) 3135 { 3136 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3); 3137 } 3138 3139 static int 3140 test_kasumi_hash_verify_test_case_4(void) 3141 { 3142 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4); 3143 } 3144 3145 static int 3146 test_kasumi_hash_verify_test_case_5(void) 3147 { 3148 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5); 3149 } 3150 3151 static int 3152 test_kasumi_encryption(const struct kasumi_test_data *tdata) 3153 { 3154 struct crypto_testsuite_params *ts_params = &testsuite_params; 3155 struct crypto_unittest_params *ut_params = &unittest_params; 3156 3157 int retval; 3158 uint8_t *plaintext, *ciphertext; 3159 unsigned plaintext_pad_len; 3160 unsigned plaintext_len; 3161 struct rte_cryptodev_info dev_info; 3162 3163 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3164 uint64_t feat_flags = dev_info.feature_flags; 3165 3166 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3167 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3168 printf("Device doesn't support RAW data-path APIs.\n"); 3169 return -ENOTSUP; 3170 } 3171 3172 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3173 return -ENOTSUP; 3174 3175 /* Verify the capabilities */ 3176 struct rte_cryptodev_sym_capability_idx cap_idx; 3177 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3178 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3179 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3180 &cap_idx) == NULL) 3181 return -ENOTSUP; 3182 3183 /* Create KASUMI session */ 3184 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3185 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3186 RTE_CRYPTO_CIPHER_KASUMI_F8, 3187 tdata->key.data, tdata->key.len, 3188 tdata->cipher_iv.len); 3189 if (retval < 0) 3190 return retval; 3191 3192 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3193 3194 /* Clear mbuf payload */ 3195 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3196 rte_pktmbuf_tailroom(ut_params->ibuf)); 3197 3198 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3199 /* Append data which is padded to a multiple */ 3200 /* of the algorithms block size */ 3201 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3202 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3203 plaintext_pad_len); 3204 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3205 3206 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3207 3208 /* Create KASUMI operation */ 3209 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3210 tdata->cipher_iv.len, 3211 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3212 tdata->validCipherOffsetInBits.len); 3213 if (retval < 0) 3214 return retval; 3215 3216 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3217 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3218 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3219 else 3220 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3221 ut_params->op); 3222 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3223 3224 ut_params->obuf = ut_params->op->sym->m_dst; 3225 if (ut_params->obuf) 3226 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3227 else 3228 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3229 3230 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3231 3232 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3233 (tdata->validCipherOffsetInBits.len >> 3); 3234 /* Validate obuf */ 3235 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3236 ciphertext, 3237 reference_ciphertext, 3238 tdata->validCipherLenInBits.len, 3239 "KASUMI Ciphertext data not as expected"); 3240 return 0; 3241 } 3242 3243 static int 3244 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata) 3245 { 3246 struct crypto_testsuite_params *ts_params = &testsuite_params; 3247 struct crypto_unittest_params *ut_params = &unittest_params; 3248 3249 int retval; 3250 3251 unsigned int plaintext_pad_len; 3252 unsigned int plaintext_len; 3253 3254 uint8_t buffer[10000]; 3255 const uint8_t *ciphertext; 3256 3257 struct rte_cryptodev_info dev_info; 3258 3259 /* Verify the capabilities */ 3260 struct rte_cryptodev_sym_capability_idx cap_idx; 3261 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3262 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3263 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3264 &cap_idx) == NULL) 3265 return -ENOTSUP; 3266 3267 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3268 3269 uint64_t feat_flags = dev_info.feature_flags; 3270 3271 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 3272 printf("Device doesn't support in-place scatter-gather. " 3273 "Test Skipped.\n"); 3274 return -ENOTSUP; 3275 } 3276 3277 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3278 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3279 printf("Device doesn't support RAW data-path APIs.\n"); 3280 return -ENOTSUP; 3281 } 3282 3283 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3284 return -ENOTSUP; 3285 3286 /* Create KASUMI session */ 3287 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3288 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3289 RTE_CRYPTO_CIPHER_KASUMI_F8, 3290 tdata->key.data, tdata->key.len, 3291 tdata->cipher_iv.len); 3292 if (retval < 0) 3293 return retval; 3294 3295 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3296 3297 3298 /* Append data which is padded to a multiple */ 3299 /* of the algorithms block size */ 3300 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3301 3302 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3303 plaintext_pad_len, 10, 0); 3304 3305 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3306 3307 /* Create KASUMI operation */ 3308 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3309 tdata->cipher_iv.len, 3310 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3311 tdata->validCipherOffsetInBits.len); 3312 if (retval < 0) 3313 return retval; 3314 3315 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3316 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3317 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3318 else 3319 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3320 ut_params->op); 3321 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3322 3323 ut_params->obuf = ut_params->op->sym->m_dst; 3324 3325 if (ut_params->obuf) 3326 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3327 plaintext_len, buffer); 3328 else 3329 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3330 tdata->validCipherOffsetInBits.len >> 3, 3331 plaintext_len, buffer); 3332 3333 /* Validate obuf */ 3334 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3335 3336 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3337 (tdata->validCipherOffsetInBits.len >> 3); 3338 /* Validate obuf */ 3339 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3340 ciphertext, 3341 reference_ciphertext, 3342 tdata->validCipherLenInBits.len, 3343 "KASUMI Ciphertext data not as expected"); 3344 return 0; 3345 } 3346 3347 static int 3348 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata) 3349 { 3350 struct crypto_testsuite_params *ts_params = &testsuite_params; 3351 struct crypto_unittest_params *ut_params = &unittest_params; 3352 3353 int retval; 3354 uint8_t *plaintext, *ciphertext; 3355 unsigned plaintext_pad_len; 3356 unsigned plaintext_len; 3357 3358 /* Verify the capabilities */ 3359 struct rte_cryptodev_sym_capability_idx cap_idx; 3360 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3361 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3362 /* Data-path service does not support OOP */ 3363 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3364 &cap_idx) == NULL) 3365 return -ENOTSUP; 3366 3367 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3368 return -ENOTSUP; 3369 3370 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3371 return -ENOTSUP; 3372 3373 /* Create KASUMI session */ 3374 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3375 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3376 RTE_CRYPTO_CIPHER_KASUMI_F8, 3377 tdata->key.data, tdata->key.len, 3378 tdata->cipher_iv.len); 3379 if (retval < 0) 3380 return retval; 3381 3382 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3383 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3384 3385 /* Clear mbuf payload */ 3386 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3387 rte_pktmbuf_tailroom(ut_params->ibuf)); 3388 3389 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3390 /* Append data which is padded to a multiple */ 3391 /* of the algorithms block size */ 3392 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3393 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3394 plaintext_pad_len); 3395 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3396 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3397 3398 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3399 3400 /* Create KASUMI operation */ 3401 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3402 tdata->cipher_iv.len, 3403 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3404 tdata->validCipherOffsetInBits.len); 3405 if (retval < 0) 3406 return retval; 3407 3408 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3409 ut_params->op); 3410 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3411 3412 ut_params->obuf = ut_params->op->sym->m_dst; 3413 if (ut_params->obuf) 3414 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3415 else 3416 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3); 3417 3418 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3419 3420 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3421 (tdata->validCipherOffsetInBits.len >> 3); 3422 /* Validate obuf */ 3423 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3424 ciphertext, 3425 reference_ciphertext, 3426 tdata->validCipherLenInBits.len, 3427 "KASUMI Ciphertext data not as expected"); 3428 return 0; 3429 } 3430 3431 static int 3432 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata) 3433 { 3434 struct crypto_testsuite_params *ts_params = &testsuite_params; 3435 struct crypto_unittest_params *ut_params = &unittest_params; 3436 3437 int retval; 3438 unsigned int plaintext_pad_len; 3439 unsigned int plaintext_len; 3440 3441 const uint8_t *ciphertext; 3442 uint8_t buffer[2048]; 3443 3444 struct rte_cryptodev_info dev_info; 3445 3446 /* Verify the capabilities */ 3447 struct rte_cryptodev_sym_capability_idx cap_idx; 3448 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3449 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3450 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3451 &cap_idx) == NULL) 3452 return -ENOTSUP; 3453 3454 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3455 return -ENOTSUP; 3456 3457 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3458 return -ENOTSUP; 3459 3460 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3461 3462 uint64_t feat_flags = dev_info.feature_flags; 3463 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3464 printf("Device doesn't support out-of-place scatter-gather " 3465 "in both input and output mbufs. " 3466 "Test Skipped.\n"); 3467 return -ENOTSUP; 3468 } 3469 3470 /* Create KASUMI session */ 3471 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3472 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3473 RTE_CRYPTO_CIPHER_KASUMI_F8, 3474 tdata->key.data, tdata->key.len, 3475 tdata->cipher_iv.len); 3476 if (retval < 0) 3477 return retval; 3478 3479 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3480 /* Append data which is padded to a multiple */ 3481 /* of the algorithms block size */ 3482 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 3483 3484 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3485 plaintext_pad_len, 10, 0); 3486 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3487 plaintext_pad_len, 3, 0); 3488 3489 /* Append data which is padded to a multiple */ 3490 /* of the algorithms block size */ 3491 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3492 3493 /* Create KASUMI operation */ 3494 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3495 tdata->cipher_iv.len, 3496 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3497 tdata->validCipherOffsetInBits.len); 3498 if (retval < 0) 3499 return retval; 3500 3501 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3502 ut_params->op); 3503 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3504 3505 ut_params->obuf = ut_params->op->sym->m_dst; 3506 if (ut_params->obuf) 3507 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3508 plaintext_pad_len, buffer); 3509 else 3510 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 3511 tdata->validCipherOffsetInBits.len >> 3, 3512 plaintext_pad_len, buffer); 3513 3514 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 3515 (tdata->validCipherOffsetInBits.len >> 3); 3516 /* Validate obuf */ 3517 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3518 ciphertext, 3519 reference_ciphertext, 3520 tdata->validCipherLenInBits.len, 3521 "KASUMI Ciphertext data not as expected"); 3522 return 0; 3523 } 3524 3525 3526 static int 3527 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata) 3528 { 3529 struct crypto_testsuite_params *ts_params = &testsuite_params; 3530 struct crypto_unittest_params *ut_params = &unittest_params; 3531 3532 int retval; 3533 uint8_t *ciphertext, *plaintext; 3534 unsigned ciphertext_pad_len; 3535 unsigned ciphertext_len; 3536 3537 /* Verify the capabilities */ 3538 struct rte_cryptodev_sym_capability_idx cap_idx; 3539 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3540 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3541 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3542 &cap_idx) == NULL) 3543 return -ENOTSUP; 3544 3545 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3546 return -ENOTSUP; 3547 3548 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3549 return -ENOTSUP; 3550 3551 /* Create KASUMI session */ 3552 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3553 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3554 RTE_CRYPTO_CIPHER_KASUMI_F8, 3555 tdata->key.data, tdata->key.len, 3556 tdata->cipher_iv.len); 3557 if (retval < 0) 3558 return retval; 3559 3560 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3561 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3562 3563 /* Clear mbuf payload */ 3564 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3565 rte_pktmbuf_tailroom(ut_params->ibuf)); 3566 3567 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3568 /* Append data which is padded to a multiple */ 3569 /* of the algorithms block size */ 3570 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3571 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3572 ciphertext_pad_len); 3573 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 3574 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3575 3576 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3577 3578 /* Create KASUMI operation */ 3579 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3580 tdata->cipher_iv.len, 3581 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 3582 tdata->validCipherOffsetInBits.len); 3583 if (retval < 0) 3584 return retval; 3585 3586 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3587 ut_params->op); 3588 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3589 3590 ut_params->obuf = ut_params->op->sym->m_dst; 3591 if (ut_params->obuf) 3592 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3593 else 3594 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3595 3596 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3597 3598 const uint8_t *reference_plaintext = tdata->plaintext.data + 3599 (tdata->validCipherOffsetInBits.len >> 3); 3600 /* Validate obuf */ 3601 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3602 plaintext, 3603 reference_plaintext, 3604 tdata->validCipherLenInBits.len, 3605 "KASUMI Plaintext data not as expected"); 3606 return 0; 3607 } 3608 3609 static int 3610 test_kasumi_decryption(const struct kasumi_test_data *tdata) 3611 { 3612 struct crypto_testsuite_params *ts_params = &testsuite_params; 3613 struct crypto_unittest_params *ut_params = &unittest_params; 3614 3615 int retval; 3616 uint8_t *ciphertext, *plaintext; 3617 unsigned ciphertext_pad_len; 3618 unsigned ciphertext_len; 3619 struct rte_cryptodev_info dev_info; 3620 3621 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3622 uint64_t feat_flags = dev_info.feature_flags; 3623 3624 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3625 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3626 printf("Device doesn't support RAW data-path APIs.\n"); 3627 return -ENOTSUP; 3628 } 3629 3630 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3631 return -ENOTSUP; 3632 3633 /* Verify the capabilities */ 3634 struct rte_cryptodev_sym_capability_idx cap_idx; 3635 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3636 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 3637 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3638 &cap_idx) == NULL) 3639 return -ENOTSUP; 3640 3641 /* Create KASUMI session */ 3642 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3643 RTE_CRYPTO_CIPHER_OP_DECRYPT, 3644 RTE_CRYPTO_CIPHER_KASUMI_F8, 3645 tdata->key.data, tdata->key.len, 3646 tdata->cipher_iv.len); 3647 if (retval < 0) 3648 return retval; 3649 3650 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3651 3652 /* Clear mbuf payload */ 3653 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3654 rte_pktmbuf_tailroom(ut_params->ibuf)); 3655 3656 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 3657 /* Append data which is padded to a multiple */ 3658 /* of the algorithms block size */ 3659 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8); 3660 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3661 ciphertext_pad_len); 3662 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 3663 3664 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 3665 3666 /* Create KASUMI operation */ 3667 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3668 tdata->cipher_iv.len, 3669 tdata->ciphertext.len, 3670 tdata->validCipherOffsetInBits.len); 3671 if (retval < 0) 3672 return retval; 3673 3674 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3675 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3676 ut_params->op, 1, 0, 1, 0); 3677 else 3678 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3679 ut_params->op); 3680 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3681 3682 ut_params->obuf = ut_params->op->sym->m_dst; 3683 if (ut_params->obuf) 3684 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3685 else 3686 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3); 3687 3688 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 3689 3690 const uint8_t *reference_plaintext = tdata->plaintext.data + 3691 (tdata->validCipherOffsetInBits.len >> 3); 3692 /* Validate obuf */ 3693 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3694 plaintext, 3695 reference_plaintext, 3696 tdata->validCipherLenInBits.len, 3697 "KASUMI Plaintext data not as expected"); 3698 return 0; 3699 } 3700 3701 static int 3702 test_snow3g_encryption(const struct snow3g_test_data *tdata) 3703 { 3704 struct crypto_testsuite_params *ts_params = &testsuite_params; 3705 struct crypto_unittest_params *ut_params = &unittest_params; 3706 3707 int retval; 3708 uint8_t *plaintext, *ciphertext; 3709 unsigned plaintext_pad_len; 3710 unsigned plaintext_len; 3711 struct rte_cryptodev_info dev_info; 3712 3713 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3714 uint64_t feat_flags = dev_info.feature_flags; 3715 3716 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 3717 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 3718 printf("Device doesn't support RAW data-path APIs.\n"); 3719 return -ENOTSUP; 3720 } 3721 3722 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3723 return -ENOTSUP; 3724 3725 /* Verify the capabilities */ 3726 struct rte_cryptodev_sym_capability_idx cap_idx; 3727 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3728 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3729 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3730 &cap_idx) == NULL) 3731 return -ENOTSUP; 3732 3733 /* Create SNOW 3G session */ 3734 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3735 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3736 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3737 tdata->key.data, tdata->key.len, 3738 tdata->cipher_iv.len); 3739 if (retval < 0) 3740 return retval; 3741 3742 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3743 3744 /* Clear mbuf payload */ 3745 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3746 rte_pktmbuf_tailroom(ut_params->ibuf)); 3747 3748 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3749 /* Append data which is padded to a multiple of */ 3750 /* the algorithms block size */ 3751 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3752 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3753 plaintext_pad_len); 3754 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3755 3756 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3757 3758 /* Create SNOW 3G operation */ 3759 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 3760 tdata->cipher_iv.len, 3761 tdata->validCipherLenInBits.len, 3762 0); 3763 if (retval < 0) 3764 return retval; 3765 3766 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3767 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 3768 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 3769 else 3770 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3771 ut_params->op); 3772 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3773 3774 ut_params->obuf = ut_params->op->sym->m_dst; 3775 if (ut_params->obuf) 3776 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3777 else 3778 ciphertext = plaintext; 3779 3780 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3781 3782 /* Validate obuf */ 3783 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3784 ciphertext, 3785 tdata->ciphertext.data, 3786 tdata->validDataLenInBits.len, 3787 "SNOW 3G Ciphertext data not as expected"); 3788 return 0; 3789 } 3790 3791 3792 static int 3793 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata) 3794 { 3795 struct crypto_testsuite_params *ts_params = &testsuite_params; 3796 struct crypto_unittest_params *ut_params = &unittest_params; 3797 uint8_t *plaintext, *ciphertext; 3798 3799 int retval; 3800 unsigned plaintext_pad_len; 3801 unsigned plaintext_len; 3802 3803 /* Verify the capabilities */ 3804 struct rte_cryptodev_sym_capability_idx cap_idx; 3805 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3806 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3807 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3808 &cap_idx) == NULL) 3809 return -ENOTSUP; 3810 3811 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3812 return -ENOTSUP; 3813 3814 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3815 return -ENOTSUP; 3816 3817 /* Create SNOW 3G session */ 3818 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3819 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3820 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3821 tdata->key.data, tdata->key.len, 3822 tdata->cipher_iv.len); 3823 if (retval < 0) 3824 return retval; 3825 3826 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3827 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 3828 3829 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3830 "Failed to allocate input buffer in mempool"); 3831 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3832 "Failed to allocate output buffer in mempool"); 3833 3834 /* Clear mbuf payload */ 3835 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 3836 rte_pktmbuf_tailroom(ut_params->ibuf)); 3837 3838 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3839 /* Append data which is padded to a multiple of */ 3840 /* the algorithms block size */ 3841 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3842 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 3843 plaintext_pad_len); 3844 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 3845 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 3846 3847 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 3848 3849 /* Create SNOW 3G operation */ 3850 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3851 tdata->cipher_iv.len, 3852 tdata->validCipherLenInBits.len, 3853 0); 3854 if (retval < 0) 3855 return retval; 3856 3857 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3858 ut_params->op); 3859 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3860 3861 ut_params->obuf = ut_params->op->sym->m_dst; 3862 if (ut_params->obuf) 3863 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 3864 else 3865 ciphertext = plaintext; 3866 3867 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3868 3869 /* Validate obuf */ 3870 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3871 ciphertext, 3872 tdata->ciphertext.data, 3873 tdata->validDataLenInBits.len, 3874 "SNOW 3G Ciphertext data not as expected"); 3875 return 0; 3876 } 3877 3878 static int 3879 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata) 3880 { 3881 struct crypto_testsuite_params *ts_params = &testsuite_params; 3882 struct crypto_unittest_params *ut_params = &unittest_params; 3883 3884 int retval; 3885 unsigned int plaintext_pad_len; 3886 unsigned int plaintext_len; 3887 uint8_t buffer[10000]; 3888 const uint8_t *ciphertext; 3889 3890 struct rte_cryptodev_info dev_info; 3891 3892 /* Verify the capabilities */ 3893 struct rte_cryptodev_sym_capability_idx cap_idx; 3894 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 3895 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 3896 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 3897 &cap_idx) == NULL) 3898 return -ENOTSUP; 3899 3900 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 3901 return -ENOTSUP; 3902 3903 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 3904 return -ENOTSUP; 3905 3906 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 3907 3908 uint64_t feat_flags = dev_info.feature_flags; 3909 3910 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 3911 printf("Device doesn't support out-of-place scatter-gather " 3912 "in both input and output mbufs. " 3913 "Test Skipped.\n"); 3914 return -ENOTSUP; 3915 } 3916 3917 /* Create SNOW 3G session */ 3918 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 3919 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 3920 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 3921 tdata->key.data, tdata->key.len, 3922 tdata->cipher_iv.len); 3923 if (retval < 0) 3924 return retval; 3925 3926 plaintext_len = ceil_byte_length(tdata->plaintext.len); 3927 /* Append data which is padded to a multiple of */ 3928 /* the algorithms block size */ 3929 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 3930 3931 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 3932 plaintext_pad_len, 10, 0); 3933 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 3934 plaintext_pad_len, 3, 0); 3935 3936 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 3937 "Failed to allocate input buffer in mempool"); 3938 TEST_ASSERT_NOT_NULL(ut_params->obuf, 3939 "Failed to allocate output buffer in mempool"); 3940 3941 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 3942 3943 /* Create SNOW 3G operation */ 3944 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 3945 tdata->cipher_iv.len, 3946 tdata->validCipherLenInBits.len, 3947 0); 3948 if (retval < 0) 3949 return retval; 3950 3951 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 3952 ut_params->op); 3953 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 3954 3955 ut_params->obuf = ut_params->op->sym->m_dst; 3956 if (ut_params->obuf) 3957 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 3958 plaintext_len, buffer); 3959 else 3960 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 3961 plaintext_len, buffer); 3962 3963 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 3964 3965 /* Validate obuf */ 3966 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 3967 ciphertext, 3968 tdata->ciphertext.data, 3969 tdata->validDataLenInBits.len, 3970 "SNOW 3G Ciphertext data not as expected"); 3971 3972 return 0; 3973 } 3974 3975 /* Shift right a buffer by "offset" bits, "offset" < 8 */ 3976 static void 3977 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset) 3978 { 3979 uint8_t curr_byte, prev_byte; 3980 uint32_t length_in_bytes = ceil_byte_length(length + offset); 3981 uint8_t lower_byte_mask = (1 << offset) - 1; 3982 unsigned i; 3983 3984 prev_byte = buffer[0]; 3985 buffer[0] >>= offset; 3986 3987 for (i = 1; i < length_in_bytes; i++) { 3988 curr_byte = buffer[i]; 3989 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) | 3990 (curr_byte >> offset); 3991 prev_byte = curr_byte; 3992 } 3993 } 3994 3995 static int 3996 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata) 3997 { 3998 struct crypto_testsuite_params *ts_params = &testsuite_params; 3999 struct crypto_unittest_params *ut_params = &unittest_params; 4000 uint8_t *plaintext, *ciphertext; 4001 int retval; 4002 uint32_t plaintext_len; 4003 uint32_t plaintext_pad_len; 4004 uint8_t extra_offset = 4; 4005 uint8_t *expected_ciphertext_shifted; 4006 struct rte_cryptodev_info dev_info; 4007 4008 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4009 uint64_t feat_flags = dev_info.feature_flags; 4010 4011 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4012 ((tdata->validDataLenInBits.len % 8) != 0)) { 4013 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4014 return -ENOTSUP; 4015 } 4016 4017 /* Verify the capabilities */ 4018 struct rte_cryptodev_sym_capability_idx cap_idx; 4019 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4020 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4021 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4022 &cap_idx) == NULL) 4023 return -ENOTSUP; 4024 4025 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4026 return -ENOTSUP; 4027 4028 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4029 return -ENOTSUP; 4030 4031 /* Create SNOW 3G session */ 4032 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4033 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4034 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4035 tdata->key.data, tdata->key.len, 4036 tdata->cipher_iv.len); 4037 if (retval < 0) 4038 return retval; 4039 4040 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4041 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4042 4043 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4044 "Failed to allocate input buffer in mempool"); 4045 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4046 "Failed to allocate output buffer in mempool"); 4047 4048 /* Clear mbuf payload */ 4049 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4050 rte_pktmbuf_tailroom(ut_params->ibuf)); 4051 4052 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset); 4053 /* 4054 * Append data which is padded to a 4055 * multiple of the algorithms block size 4056 */ 4057 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4058 4059 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf, 4060 plaintext_pad_len); 4061 4062 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4063 4064 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3)); 4065 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset); 4066 4067 #ifdef RTE_APP_TEST_DEBUG 4068 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len); 4069 #endif 4070 /* Create SNOW 3G operation */ 4071 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4072 tdata->cipher_iv.len, 4073 tdata->validCipherLenInBits.len, 4074 extra_offset); 4075 if (retval < 0) 4076 return retval; 4077 4078 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4079 ut_params->op); 4080 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4081 4082 ut_params->obuf = ut_params->op->sym->m_dst; 4083 if (ut_params->obuf) 4084 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4085 else 4086 ciphertext = plaintext; 4087 4088 #ifdef RTE_APP_TEST_DEBUG 4089 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4090 #endif 4091 4092 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8); 4093 4094 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted, 4095 "failed to reserve memory for ciphertext shifted\n"); 4096 4097 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data, 4098 ceil_byte_length(tdata->ciphertext.len)); 4099 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len, 4100 extra_offset); 4101 /* Validate obuf */ 4102 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET( 4103 ciphertext, 4104 expected_ciphertext_shifted, 4105 tdata->validDataLenInBits.len, 4106 extra_offset, 4107 "SNOW 3G Ciphertext data not as expected"); 4108 return 0; 4109 } 4110 4111 static int test_snow3g_decryption(const struct snow3g_test_data *tdata) 4112 { 4113 struct crypto_testsuite_params *ts_params = &testsuite_params; 4114 struct crypto_unittest_params *ut_params = &unittest_params; 4115 4116 int retval; 4117 4118 uint8_t *plaintext, *ciphertext; 4119 unsigned ciphertext_pad_len; 4120 unsigned ciphertext_len; 4121 struct rte_cryptodev_info dev_info; 4122 4123 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4124 uint64_t feat_flags = dev_info.feature_flags; 4125 4126 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4127 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4128 printf("Device doesn't support RAW data-path APIs.\n"); 4129 return -ENOTSUP; 4130 } 4131 4132 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4133 return -ENOTSUP; 4134 4135 /* Verify the capabilities */ 4136 struct rte_cryptodev_sym_capability_idx cap_idx; 4137 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4138 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4139 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4140 &cap_idx) == NULL) 4141 return -ENOTSUP; 4142 4143 /* Create SNOW 3G session */ 4144 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4145 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4146 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4147 tdata->key.data, tdata->key.len, 4148 tdata->cipher_iv.len); 4149 if (retval < 0) 4150 return retval; 4151 4152 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4153 4154 /* Clear mbuf payload */ 4155 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4156 rte_pktmbuf_tailroom(ut_params->ibuf)); 4157 4158 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4159 /* Append data which is padded to a multiple of */ 4160 /* the algorithms block size */ 4161 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4162 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4163 ciphertext_pad_len); 4164 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4165 4166 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4167 4168 /* Create SNOW 3G operation */ 4169 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 4170 tdata->cipher_iv.len, 4171 tdata->validCipherLenInBits.len, 4172 tdata->cipher.offset_bits); 4173 if (retval < 0) 4174 return retval; 4175 4176 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4177 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4178 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 4179 else 4180 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4181 ut_params->op); 4182 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4183 ut_params->obuf = ut_params->op->sym->m_dst; 4184 if (ut_params->obuf) 4185 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4186 else 4187 plaintext = ciphertext; 4188 4189 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4190 4191 /* Validate obuf */ 4192 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4193 tdata->plaintext.data, 4194 tdata->validDataLenInBits.len, 4195 "SNOW 3G Plaintext data not as expected"); 4196 return 0; 4197 } 4198 4199 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata) 4200 { 4201 struct crypto_testsuite_params *ts_params = &testsuite_params; 4202 struct crypto_unittest_params *ut_params = &unittest_params; 4203 4204 int retval; 4205 4206 uint8_t *plaintext, *ciphertext; 4207 unsigned ciphertext_pad_len; 4208 unsigned ciphertext_len; 4209 4210 /* Verify the capabilities */ 4211 struct rte_cryptodev_sym_capability_idx cap_idx; 4212 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4213 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4214 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4215 &cap_idx) == NULL) 4216 return -ENOTSUP; 4217 4218 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4219 return -ENOTSUP; 4220 4221 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4222 return -ENOTSUP; 4223 4224 /* Create SNOW 3G session */ 4225 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 4226 RTE_CRYPTO_CIPHER_OP_DECRYPT, 4227 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4228 tdata->key.data, tdata->key.len, 4229 tdata->cipher_iv.len); 4230 if (retval < 0) 4231 return retval; 4232 4233 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4234 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4235 4236 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4237 "Failed to allocate input buffer"); 4238 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4239 "Failed to allocate output buffer"); 4240 4241 /* Clear mbuf payload */ 4242 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4243 rte_pktmbuf_tailroom(ut_params->ibuf)); 4244 4245 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4246 rte_pktmbuf_tailroom(ut_params->obuf)); 4247 4248 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4249 /* Append data which is padded to a multiple of */ 4250 /* the algorithms block size */ 4251 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4252 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4253 ciphertext_pad_len); 4254 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4255 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4256 4257 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len); 4258 4259 /* Create SNOW 3G operation */ 4260 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data, 4261 tdata->cipher_iv.len, 4262 tdata->validCipherLenInBits.len, 4263 0); 4264 if (retval < 0) 4265 return retval; 4266 4267 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4268 ut_params->op); 4269 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4270 ut_params->obuf = ut_params->op->sym->m_dst; 4271 if (ut_params->obuf) 4272 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4273 else 4274 plaintext = ciphertext; 4275 4276 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len); 4277 4278 /* Validate obuf */ 4279 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext, 4280 tdata->plaintext.data, 4281 tdata->validDataLenInBits.len, 4282 "SNOW 3G Plaintext data not as expected"); 4283 return 0; 4284 } 4285 4286 static int 4287 test_zuc_cipher_auth(const struct wireless_test_data *tdata) 4288 { 4289 struct crypto_testsuite_params *ts_params = &testsuite_params; 4290 struct crypto_unittest_params *ut_params = &unittest_params; 4291 4292 int retval; 4293 4294 uint8_t *plaintext, *ciphertext; 4295 unsigned int plaintext_pad_len; 4296 unsigned int plaintext_len; 4297 4298 struct rte_cryptodev_info dev_info; 4299 struct rte_cryptodev_sym_capability_idx cap_idx; 4300 4301 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4302 uint64_t feat_flags = dev_info.feature_flags; 4303 4304 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 4305 ((tdata->validAuthLenInBits.len % 8 != 0) || 4306 (tdata->validDataLenInBits.len % 8 != 0))) { 4307 printf("Device doesn't support NON-Byte Aligned Data.\n"); 4308 return -ENOTSUP; 4309 } 4310 4311 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4312 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4313 printf("Device doesn't support RAW data-path APIs.\n"); 4314 return -ENOTSUP; 4315 } 4316 4317 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4318 return -ENOTSUP; 4319 4320 /* Check if device supports ZUC EEA3 */ 4321 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4322 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 4323 4324 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4325 &cap_idx) == NULL) 4326 return -ENOTSUP; 4327 4328 /* Check if device supports ZUC EIA3 */ 4329 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4330 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 4331 4332 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4333 &cap_idx) == NULL) 4334 return -ENOTSUP; 4335 4336 /* Create ZUC session */ 4337 retval = create_zuc_cipher_auth_encrypt_generate_session( 4338 ts_params->valid_devs[0], 4339 tdata); 4340 if (retval < 0) 4341 return retval; 4342 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4343 4344 /* clear mbuf payload */ 4345 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4346 rte_pktmbuf_tailroom(ut_params->ibuf)); 4347 4348 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4349 /* Append data which is padded to a multiple of */ 4350 /* the algorithms block size */ 4351 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4352 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4353 plaintext_pad_len); 4354 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4355 4356 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4357 4358 /* Create ZUC operation */ 4359 retval = create_zuc_cipher_hash_generate_operation(tdata); 4360 if (retval < 0) 4361 return retval; 4362 4363 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4364 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4365 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4366 else 4367 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4368 ut_params->op); 4369 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4370 ut_params->obuf = ut_params->op->sym->m_src; 4371 if (ut_params->obuf) 4372 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4373 else 4374 ciphertext = plaintext; 4375 4376 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4377 /* Validate obuf */ 4378 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4379 ciphertext, 4380 tdata->ciphertext.data, 4381 tdata->validDataLenInBits.len, 4382 "ZUC Ciphertext data not as expected"); 4383 4384 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4385 + plaintext_pad_len; 4386 4387 /* Validate obuf */ 4388 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4389 ut_params->digest, 4390 tdata->digest.data, 4391 4, 4392 "ZUC Generated auth tag not as expected"); 4393 return 0; 4394 } 4395 4396 static int 4397 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata) 4398 { 4399 struct crypto_testsuite_params *ts_params = &testsuite_params; 4400 struct crypto_unittest_params *ut_params = &unittest_params; 4401 4402 int retval; 4403 4404 uint8_t *plaintext, *ciphertext; 4405 unsigned plaintext_pad_len; 4406 unsigned plaintext_len; 4407 struct rte_cryptodev_info dev_info; 4408 4409 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4410 uint64_t feat_flags = dev_info.feature_flags; 4411 4412 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4413 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4414 printf("Device doesn't support RAW data-path APIs.\n"); 4415 return -ENOTSUP; 4416 } 4417 4418 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4419 return -ENOTSUP; 4420 4421 /* Verify the capabilities */ 4422 struct rte_cryptodev_sym_capability_idx cap_idx; 4423 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4424 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4425 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4426 &cap_idx) == NULL) 4427 return -ENOTSUP; 4428 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4429 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4430 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4431 &cap_idx) == NULL) 4432 return -ENOTSUP; 4433 4434 /* Create SNOW 3G session */ 4435 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0], 4436 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 4437 RTE_CRYPTO_AUTH_OP_GENERATE, 4438 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4439 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4440 tdata->key.data, tdata->key.len, 4441 tdata->auth_iv.len, tdata->digest.len, 4442 tdata->cipher_iv.len); 4443 if (retval < 0) 4444 return retval; 4445 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4446 4447 /* clear mbuf payload */ 4448 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4449 rte_pktmbuf_tailroom(ut_params->ibuf)); 4450 4451 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4452 /* Append data which is padded to a multiple of */ 4453 /* the algorithms block size */ 4454 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4455 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4456 plaintext_pad_len); 4457 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4458 4459 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4460 4461 /* Create SNOW 3G operation */ 4462 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 4463 tdata->digest.len, tdata->auth_iv.data, 4464 tdata->auth_iv.len, 4465 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 4466 tdata->cipher_iv.data, tdata->cipher_iv.len, 4467 tdata->validCipherLenInBits.len, 4468 0, 4469 tdata->validAuthLenInBits.len, 4470 0 4471 ); 4472 if (retval < 0) 4473 return retval; 4474 4475 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4476 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4477 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4478 else 4479 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4480 ut_params->op); 4481 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4482 ut_params->obuf = ut_params->op->sym->m_src; 4483 if (ut_params->obuf) 4484 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 4485 else 4486 ciphertext = plaintext; 4487 4488 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 4489 /* Validate obuf */ 4490 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4491 ciphertext, 4492 tdata->ciphertext.data, 4493 tdata->validDataLenInBits.len, 4494 "SNOW 3G Ciphertext data not as expected"); 4495 4496 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4497 + plaintext_pad_len; 4498 4499 /* Validate obuf */ 4500 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4501 ut_params->digest, 4502 tdata->digest.data, 4503 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4504 "SNOW 3G Generated auth tag not as expected"); 4505 return 0; 4506 } 4507 4508 static int 4509 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata, 4510 uint8_t op_mode, uint8_t verify) 4511 { 4512 struct crypto_testsuite_params *ts_params = &testsuite_params; 4513 struct crypto_unittest_params *ut_params = &unittest_params; 4514 4515 int retval; 4516 4517 uint8_t *plaintext = NULL, *ciphertext = NULL; 4518 unsigned int plaintext_pad_len; 4519 unsigned int plaintext_len; 4520 unsigned int ciphertext_pad_len; 4521 unsigned int ciphertext_len; 4522 4523 struct rte_cryptodev_info dev_info; 4524 4525 /* Verify the capabilities */ 4526 struct rte_cryptodev_sym_capability_idx cap_idx; 4527 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4528 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4529 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4530 &cap_idx) == NULL) 4531 return -ENOTSUP; 4532 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4533 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4534 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4535 &cap_idx) == NULL) 4536 return -ENOTSUP; 4537 4538 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4539 return -ENOTSUP; 4540 4541 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4542 4543 uint64_t feat_flags = dev_info.feature_flags; 4544 4545 if (op_mode == OUT_OF_PLACE) { 4546 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4547 printf("Device doesn't support digest encrypted.\n"); 4548 return -ENOTSUP; 4549 } 4550 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4551 return -ENOTSUP; 4552 } 4553 4554 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4555 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4556 printf("Device doesn't support RAW data-path APIs.\n"); 4557 return -ENOTSUP; 4558 } 4559 4560 /* Create SNOW 3G session */ 4561 retval = create_wireless_algo_auth_cipher_session( 4562 ts_params->valid_devs[0], 4563 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4564 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4565 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4566 : RTE_CRYPTO_AUTH_OP_GENERATE), 4567 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4568 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4569 tdata->key.data, tdata->key.len, 4570 tdata->auth_iv.len, tdata->digest.len, 4571 tdata->cipher_iv.len); 4572 4573 if (retval < 0) 4574 return retval; 4575 4576 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4577 if (op_mode == OUT_OF_PLACE) 4578 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4579 4580 /* clear mbuf payload */ 4581 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4582 rte_pktmbuf_tailroom(ut_params->ibuf)); 4583 if (op_mode == OUT_OF_PLACE) 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 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4589 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4590 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4591 4592 if (verify) { 4593 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4594 ciphertext_pad_len); 4595 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4596 if (op_mode == OUT_OF_PLACE) 4597 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4598 debug_hexdump(stdout, "ciphertext:", ciphertext, 4599 ciphertext_len); 4600 } else { 4601 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4602 plaintext_pad_len); 4603 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 4604 if (op_mode == OUT_OF_PLACE) 4605 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 4606 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 4607 } 4608 4609 /* Create SNOW 3G operation */ 4610 retval = create_wireless_algo_auth_cipher_operation( 4611 tdata->digest.data, tdata->digest.len, 4612 tdata->cipher_iv.data, tdata->cipher_iv.len, 4613 tdata->auth_iv.data, tdata->auth_iv.len, 4614 (tdata->digest.offset_bytes == 0 ? 4615 (verify ? ciphertext_pad_len : plaintext_pad_len) 4616 : tdata->digest.offset_bytes), 4617 tdata->validCipherLenInBits.len, 4618 tdata->cipher.offset_bits, 4619 tdata->validAuthLenInBits.len, 4620 tdata->auth.offset_bits, 4621 op_mode, 0, verify); 4622 4623 if (retval < 0) 4624 return retval; 4625 4626 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4627 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4628 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4629 else 4630 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4631 ut_params->op); 4632 4633 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4634 4635 ut_params->obuf = (op_mode == IN_PLACE ? 4636 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4637 4638 if (verify) { 4639 if (ut_params->obuf) 4640 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 4641 uint8_t *); 4642 else 4643 plaintext = ciphertext + 4644 (tdata->cipher.offset_bits >> 3); 4645 4646 debug_hexdump(stdout, "plaintext:", plaintext, 4647 (tdata->plaintext.len >> 3) - tdata->digest.len); 4648 debug_hexdump(stdout, "plaintext expected:", 4649 tdata->plaintext.data, 4650 (tdata->plaintext.len >> 3) - tdata->digest.len); 4651 } else { 4652 if (ut_params->obuf) 4653 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 4654 uint8_t *); 4655 else 4656 ciphertext = plaintext; 4657 4658 debug_hexdump(stdout, "ciphertext:", ciphertext, 4659 ciphertext_len); 4660 debug_hexdump(stdout, "ciphertext expected:", 4661 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4662 4663 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 4664 + (tdata->digest.offset_bytes == 0 ? 4665 plaintext_pad_len : tdata->digest.offset_bytes); 4666 4667 debug_hexdump(stdout, "digest:", ut_params->digest, 4668 tdata->digest.len); 4669 debug_hexdump(stdout, "digest expected:", tdata->digest.data, 4670 tdata->digest.len); 4671 } 4672 4673 /* Validate obuf */ 4674 if (verify) { 4675 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4676 plaintext, 4677 tdata->plaintext.data, 4678 tdata->plaintext.len >> 3, 4679 "SNOW 3G Plaintext data not as expected"); 4680 } else { 4681 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4682 ciphertext, 4683 tdata->ciphertext.data, 4684 tdata->validDataLenInBits.len, 4685 "SNOW 3G Ciphertext data not as expected"); 4686 4687 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4688 ut_params->digest, 4689 tdata->digest.data, 4690 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4691 "SNOW 3G Generated auth tag not as expected"); 4692 } 4693 return 0; 4694 } 4695 4696 static int 4697 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata, 4698 uint8_t op_mode, uint8_t verify) 4699 { 4700 struct crypto_testsuite_params *ts_params = &testsuite_params; 4701 struct crypto_unittest_params *ut_params = &unittest_params; 4702 4703 int retval; 4704 4705 const uint8_t *plaintext = NULL; 4706 const uint8_t *ciphertext = NULL; 4707 const uint8_t *digest = NULL; 4708 unsigned int plaintext_pad_len; 4709 unsigned int plaintext_len; 4710 unsigned int ciphertext_pad_len; 4711 unsigned int ciphertext_len; 4712 uint8_t buffer[10000]; 4713 uint8_t digest_buffer[10000]; 4714 4715 struct rte_cryptodev_info dev_info; 4716 4717 /* Verify the capabilities */ 4718 struct rte_cryptodev_sym_capability_idx cap_idx; 4719 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4720 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2; 4721 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4722 &cap_idx) == NULL) 4723 return -ENOTSUP; 4724 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4725 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2; 4726 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4727 &cap_idx) == NULL) 4728 return -ENOTSUP; 4729 4730 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4731 return -ENOTSUP; 4732 4733 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4734 4735 uint64_t feat_flags = dev_info.feature_flags; 4736 4737 if (op_mode == IN_PLACE) { 4738 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 4739 printf("Device doesn't support in-place scatter-gather " 4740 "in both input and output mbufs.\n"); 4741 return -ENOTSUP; 4742 } 4743 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4744 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4745 printf("Device doesn't support RAW data-path APIs.\n"); 4746 return -ENOTSUP; 4747 } 4748 } else { 4749 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4750 return -ENOTSUP; 4751 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 4752 printf("Device doesn't support out-of-place scatter-gather " 4753 "in both input and output mbufs.\n"); 4754 return -ENOTSUP; 4755 } 4756 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4757 printf("Device doesn't support digest encrypted.\n"); 4758 return -ENOTSUP; 4759 } 4760 } 4761 4762 /* Create SNOW 3G session */ 4763 retval = create_wireless_algo_auth_cipher_session( 4764 ts_params->valid_devs[0], 4765 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4766 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4767 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4768 : RTE_CRYPTO_AUTH_OP_GENERATE), 4769 RTE_CRYPTO_AUTH_SNOW3G_UIA2, 4770 RTE_CRYPTO_CIPHER_SNOW3G_UEA2, 4771 tdata->key.data, tdata->key.len, 4772 tdata->auth_iv.len, tdata->digest.len, 4773 tdata->cipher_iv.len); 4774 4775 if (retval < 0) 4776 return retval; 4777 4778 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4779 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4780 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4781 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4782 4783 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 4784 plaintext_pad_len, 15, 0); 4785 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 4786 "Failed to allocate input buffer in mempool"); 4787 4788 if (op_mode == OUT_OF_PLACE) { 4789 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 4790 plaintext_pad_len, 15, 0); 4791 TEST_ASSERT_NOT_NULL(ut_params->obuf, 4792 "Failed to allocate output buffer in mempool"); 4793 } 4794 4795 if (verify) { 4796 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 4797 tdata->ciphertext.data); 4798 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4799 ciphertext_len, buffer); 4800 debug_hexdump(stdout, "ciphertext:", ciphertext, 4801 ciphertext_len); 4802 } else { 4803 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 4804 tdata->plaintext.data); 4805 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4806 plaintext_len, buffer); 4807 debug_hexdump(stdout, "plaintext:", plaintext, 4808 plaintext_len); 4809 } 4810 memset(buffer, 0, sizeof(buffer)); 4811 4812 /* Create SNOW 3G operation */ 4813 retval = create_wireless_algo_auth_cipher_operation( 4814 tdata->digest.data, tdata->digest.len, 4815 tdata->cipher_iv.data, tdata->cipher_iv.len, 4816 tdata->auth_iv.data, tdata->auth_iv.len, 4817 (tdata->digest.offset_bytes == 0 ? 4818 (verify ? ciphertext_pad_len : plaintext_pad_len) 4819 : tdata->digest.offset_bytes), 4820 tdata->validCipherLenInBits.len, 4821 tdata->cipher.offset_bits, 4822 tdata->validAuthLenInBits.len, 4823 tdata->auth.offset_bits, 4824 op_mode, 1, verify); 4825 4826 if (retval < 0) 4827 return retval; 4828 4829 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4830 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 4831 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 4832 else 4833 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 4834 ut_params->op); 4835 4836 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 4837 4838 ut_params->obuf = (op_mode == IN_PLACE ? 4839 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 4840 4841 if (verify) { 4842 if (ut_params->obuf) 4843 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 4844 plaintext_len, buffer); 4845 else 4846 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 4847 plaintext_len, buffer); 4848 4849 debug_hexdump(stdout, "plaintext:", plaintext, 4850 (tdata->plaintext.len >> 3) - tdata->digest.len); 4851 debug_hexdump(stdout, "plaintext expected:", 4852 tdata->plaintext.data, 4853 (tdata->plaintext.len >> 3) - tdata->digest.len); 4854 } else { 4855 if (ut_params->obuf) 4856 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 4857 ciphertext_len, buffer); 4858 else 4859 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 4860 ciphertext_len, buffer); 4861 4862 debug_hexdump(stdout, "ciphertext:", ciphertext, 4863 ciphertext_len); 4864 debug_hexdump(stdout, "ciphertext expected:", 4865 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 4866 4867 if (ut_params->obuf) 4868 digest = rte_pktmbuf_read(ut_params->obuf, 4869 (tdata->digest.offset_bytes == 0 ? 4870 plaintext_pad_len : tdata->digest.offset_bytes), 4871 tdata->digest.len, digest_buffer); 4872 else 4873 digest = rte_pktmbuf_read(ut_params->ibuf, 4874 (tdata->digest.offset_bytes == 0 ? 4875 plaintext_pad_len : tdata->digest.offset_bytes), 4876 tdata->digest.len, digest_buffer); 4877 4878 debug_hexdump(stdout, "digest:", digest, 4879 tdata->digest.len); 4880 debug_hexdump(stdout, "digest expected:", 4881 tdata->digest.data, tdata->digest.len); 4882 } 4883 4884 /* Validate obuf */ 4885 if (verify) { 4886 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4887 plaintext, 4888 tdata->plaintext.data, 4889 tdata->plaintext.len >> 3, 4890 "SNOW 3G Plaintext data not as expected"); 4891 } else { 4892 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 4893 ciphertext, 4894 tdata->ciphertext.data, 4895 tdata->validDataLenInBits.len, 4896 "SNOW 3G Ciphertext data not as expected"); 4897 4898 TEST_ASSERT_BUFFERS_ARE_EQUAL( 4899 digest, 4900 tdata->digest.data, 4901 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 4902 "SNOW 3G Generated auth tag not as expected"); 4903 } 4904 return 0; 4905 } 4906 4907 static int 4908 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata, 4909 uint8_t op_mode, uint8_t verify) 4910 { 4911 struct crypto_testsuite_params *ts_params = &testsuite_params; 4912 struct crypto_unittest_params *ut_params = &unittest_params; 4913 4914 int retval; 4915 4916 uint8_t *plaintext = NULL, *ciphertext = NULL; 4917 unsigned int plaintext_pad_len; 4918 unsigned int plaintext_len; 4919 unsigned int ciphertext_pad_len; 4920 unsigned int ciphertext_len; 4921 4922 struct rte_cryptodev_info dev_info; 4923 4924 /* Verify the capabilities */ 4925 struct rte_cryptodev_sym_capability_idx cap_idx; 4926 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 4927 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 4928 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4929 &cap_idx) == NULL) 4930 return -ENOTSUP; 4931 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 4932 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 4933 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 4934 &cap_idx) == NULL) 4935 return -ENOTSUP; 4936 4937 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 4938 4939 uint64_t feat_flags = dev_info.feature_flags; 4940 4941 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 4942 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 4943 printf("Device doesn't support RAW data-path APIs.\n"); 4944 return -ENOTSUP; 4945 } 4946 4947 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 4948 return -ENOTSUP; 4949 4950 if (op_mode == OUT_OF_PLACE) { 4951 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 4952 return -ENOTSUP; 4953 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 4954 printf("Device doesn't support digest encrypted.\n"); 4955 return -ENOTSUP; 4956 } 4957 } 4958 4959 /* Create KASUMI session */ 4960 retval = create_wireless_algo_auth_cipher_session( 4961 ts_params->valid_devs[0], 4962 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 4963 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 4964 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 4965 : RTE_CRYPTO_AUTH_OP_GENERATE), 4966 RTE_CRYPTO_AUTH_KASUMI_F9, 4967 RTE_CRYPTO_CIPHER_KASUMI_F8, 4968 tdata->key.data, tdata->key.len, 4969 0, tdata->digest.len, 4970 tdata->cipher_iv.len); 4971 4972 if (retval < 0) 4973 return retval; 4974 4975 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4976 if (op_mode == OUT_OF_PLACE) 4977 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 4978 4979 /* clear mbuf payload */ 4980 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 4981 rte_pktmbuf_tailroom(ut_params->ibuf)); 4982 if (op_mode == OUT_OF_PLACE) 4983 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 4984 rte_pktmbuf_tailroom(ut_params->obuf)); 4985 4986 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 4987 plaintext_len = ceil_byte_length(tdata->plaintext.len); 4988 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 4989 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 4990 4991 if (verify) { 4992 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 4993 ciphertext_pad_len); 4994 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 4995 if (op_mode == OUT_OF_PLACE) 4996 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 4997 debug_hexdump(stdout, "ciphertext:", ciphertext, 4998 ciphertext_len); 4999 } else { 5000 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5001 plaintext_pad_len); 5002 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5003 if (op_mode == OUT_OF_PLACE) 5004 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5005 debug_hexdump(stdout, "plaintext:", plaintext, 5006 plaintext_len); 5007 } 5008 5009 /* Create KASUMI operation */ 5010 retval = create_wireless_algo_auth_cipher_operation( 5011 tdata->digest.data, tdata->digest.len, 5012 tdata->cipher_iv.data, tdata->cipher_iv.len, 5013 NULL, 0, 5014 (tdata->digest.offset_bytes == 0 ? 5015 (verify ? ciphertext_pad_len : plaintext_pad_len) 5016 : tdata->digest.offset_bytes), 5017 tdata->validCipherLenInBits.len, 5018 tdata->validCipherOffsetInBits.len, 5019 tdata->validAuthLenInBits.len, 5020 0, 5021 op_mode, 0, verify); 5022 5023 if (retval < 0) 5024 return retval; 5025 5026 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5027 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5028 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5029 else 5030 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5031 ut_params->op); 5032 5033 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5034 5035 ut_params->obuf = (op_mode == IN_PLACE ? 5036 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5037 5038 5039 if (verify) { 5040 if (ut_params->obuf) 5041 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5042 uint8_t *); 5043 else 5044 plaintext = ciphertext; 5045 5046 debug_hexdump(stdout, "plaintext:", plaintext, 5047 (tdata->plaintext.len >> 3) - tdata->digest.len); 5048 debug_hexdump(stdout, "plaintext expected:", 5049 tdata->plaintext.data, 5050 (tdata->plaintext.len >> 3) - tdata->digest.len); 5051 } else { 5052 if (ut_params->obuf) 5053 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5054 uint8_t *); 5055 else 5056 ciphertext = plaintext; 5057 5058 debug_hexdump(stdout, "ciphertext:", ciphertext, 5059 ciphertext_len); 5060 debug_hexdump(stdout, "ciphertext expected:", 5061 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5062 5063 ut_params->digest = rte_pktmbuf_mtod( 5064 ut_params->obuf, uint8_t *) + 5065 (tdata->digest.offset_bytes == 0 ? 5066 plaintext_pad_len : tdata->digest.offset_bytes); 5067 5068 debug_hexdump(stdout, "digest:", ut_params->digest, 5069 tdata->digest.len); 5070 debug_hexdump(stdout, "digest expected:", 5071 tdata->digest.data, tdata->digest.len); 5072 } 5073 5074 /* Validate obuf */ 5075 if (verify) { 5076 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5077 plaintext, 5078 tdata->plaintext.data, 5079 tdata->plaintext.len >> 3, 5080 "KASUMI Plaintext data not as expected"); 5081 } else { 5082 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5083 ciphertext, 5084 tdata->ciphertext.data, 5085 tdata->ciphertext.len >> 3, 5086 "KASUMI Ciphertext data not as expected"); 5087 5088 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5089 ut_params->digest, 5090 tdata->digest.data, 5091 DIGEST_BYTE_LENGTH_KASUMI_F9, 5092 "KASUMI Generated auth tag not as expected"); 5093 } 5094 return 0; 5095 } 5096 5097 static int 5098 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata, 5099 uint8_t op_mode, uint8_t verify) 5100 { 5101 struct crypto_testsuite_params *ts_params = &testsuite_params; 5102 struct crypto_unittest_params *ut_params = &unittest_params; 5103 5104 int retval; 5105 5106 const uint8_t *plaintext = NULL; 5107 const uint8_t *ciphertext = NULL; 5108 const uint8_t *digest = NULL; 5109 unsigned int plaintext_pad_len; 5110 unsigned int plaintext_len; 5111 unsigned int ciphertext_pad_len; 5112 unsigned int ciphertext_len; 5113 uint8_t buffer[10000]; 5114 uint8_t digest_buffer[10000]; 5115 5116 struct rte_cryptodev_info dev_info; 5117 5118 /* Verify the capabilities */ 5119 struct rte_cryptodev_sym_capability_idx cap_idx; 5120 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5121 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5122 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5123 &cap_idx) == NULL) 5124 return -ENOTSUP; 5125 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5126 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5127 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5128 &cap_idx) == NULL) 5129 return -ENOTSUP; 5130 5131 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5132 return -ENOTSUP; 5133 5134 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5135 5136 uint64_t feat_flags = dev_info.feature_flags; 5137 5138 if (op_mode == IN_PLACE) { 5139 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5140 printf("Device doesn't support in-place scatter-gather " 5141 "in both input and output mbufs.\n"); 5142 return -ENOTSUP; 5143 } 5144 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5145 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5146 printf("Device doesn't support RAW data-path APIs.\n"); 5147 return -ENOTSUP; 5148 } 5149 } else { 5150 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5151 return -ENOTSUP; 5152 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5153 printf("Device doesn't support out-of-place scatter-gather " 5154 "in both input and output mbufs.\n"); 5155 return -ENOTSUP; 5156 } 5157 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5158 printf("Device doesn't support digest encrypted.\n"); 5159 return -ENOTSUP; 5160 } 5161 } 5162 5163 /* Create KASUMI session */ 5164 retval = create_wireless_algo_auth_cipher_session( 5165 ts_params->valid_devs[0], 5166 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5167 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5168 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5169 : RTE_CRYPTO_AUTH_OP_GENERATE), 5170 RTE_CRYPTO_AUTH_KASUMI_F9, 5171 RTE_CRYPTO_CIPHER_KASUMI_F8, 5172 tdata->key.data, tdata->key.len, 5173 0, tdata->digest.len, 5174 tdata->cipher_iv.len); 5175 5176 if (retval < 0) 5177 return retval; 5178 5179 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5180 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5181 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5182 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5183 5184 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5185 plaintext_pad_len, 15, 0); 5186 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5187 "Failed to allocate input buffer in mempool"); 5188 5189 if (op_mode == OUT_OF_PLACE) { 5190 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5191 plaintext_pad_len, 15, 0); 5192 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5193 "Failed to allocate output buffer in mempool"); 5194 } 5195 5196 if (verify) { 5197 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 5198 tdata->ciphertext.data); 5199 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5200 ciphertext_len, buffer); 5201 debug_hexdump(stdout, "ciphertext:", ciphertext, 5202 ciphertext_len); 5203 } else { 5204 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5205 tdata->plaintext.data); 5206 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5207 plaintext_len, buffer); 5208 debug_hexdump(stdout, "plaintext:", plaintext, 5209 plaintext_len); 5210 } 5211 memset(buffer, 0, sizeof(buffer)); 5212 5213 /* Create KASUMI operation */ 5214 retval = create_wireless_algo_auth_cipher_operation( 5215 tdata->digest.data, tdata->digest.len, 5216 tdata->cipher_iv.data, tdata->cipher_iv.len, 5217 NULL, 0, 5218 (tdata->digest.offset_bytes == 0 ? 5219 (verify ? ciphertext_pad_len : plaintext_pad_len) 5220 : tdata->digest.offset_bytes), 5221 tdata->validCipherLenInBits.len, 5222 tdata->validCipherOffsetInBits.len, 5223 tdata->validAuthLenInBits.len, 5224 0, 5225 op_mode, 1, verify); 5226 5227 if (retval < 0) 5228 return retval; 5229 5230 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5231 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5232 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5233 else 5234 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5235 ut_params->op); 5236 5237 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5238 5239 ut_params->obuf = (op_mode == IN_PLACE ? 5240 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5241 5242 if (verify) { 5243 if (ut_params->obuf) 5244 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 5245 plaintext_len, buffer); 5246 else 5247 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 5248 plaintext_len, buffer); 5249 5250 debug_hexdump(stdout, "plaintext:", plaintext, 5251 (tdata->plaintext.len >> 3) - tdata->digest.len); 5252 debug_hexdump(stdout, "plaintext expected:", 5253 tdata->plaintext.data, 5254 (tdata->plaintext.len >> 3) - tdata->digest.len); 5255 } else { 5256 if (ut_params->obuf) 5257 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 5258 ciphertext_len, buffer); 5259 else 5260 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 5261 ciphertext_len, buffer); 5262 5263 debug_hexdump(stdout, "ciphertext:", ciphertext, 5264 ciphertext_len); 5265 debug_hexdump(stdout, "ciphertext expected:", 5266 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5267 5268 if (ut_params->obuf) 5269 digest = rte_pktmbuf_read(ut_params->obuf, 5270 (tdata->digest.offset_bytes == 0 ? 5271 plaintext_pad_len : tdata->digest.offset_bytes), 5272 tdata->digest.len, digest_buffer); 5273 else 5274 digest = rte_pktmbuf_read(ut_params->ibuf, 5275 (tdata->digest.offset_bytes == 0 ? 5276 plaintext_pad_len : tdata->digest.offset_bytes), 5277 tdata->digest.len, digest_buffer); 5278 5279 debug_hexdump(stdout, "digest:", digest, 5280 tdata->digest.len); 5281 debug_hexdump(stdout, "digest expected:", 5282 tdata->digest.data, tdata->digest.len); 5283 } 5284 5285 /* Validate obuf */ 5286 if (verify) { 5287 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5288 plaintext, 5289 tdata->plaintext.data, 5290 tdata->plaintext.len >> 3, 5291 "KASUMI Plaintext data not as expected"); 5292 } else { 5293 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5294 ciphertext, 5295 tdata->ciphertext.data, 5296 tdata->validDataLenInBits.len, 5297 "KASUMI Ciphertext data not as expected"); 5298 5299 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5300 digest, 5301 tdata->digest.data, 5302 DIGEST_BYTE_LENGTH_KASUMI_F9, 5303 "KASUMI Generated auth tag not as expected"); 5304 } 5305 return 0; 5306 } 5307 5308 static int 5309 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata) 5310 { 5311 struct crypto_testsuite_params *ts_params = &testsuite_params; 5312 struct crypto_unittest_params *ut_params = &unittest_params; 5313 5314 int retval; 5315 5316 uint8_t *plaintext, *ciphertext; 5317 unsigned plaintext_pad_len; 5318 unsigned plaintext_len; 5319 struct rte_cryptodev_info dev_info; 5320 5321 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5322 uint64_t feat_flags = dev_info.feature_flags; 5323 5324 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5325 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5326 printf("Device doesn't support RAW data-path APIs.\n"); 5327 return -ENOTSUP; 5328 } 5329 5330 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5331 return -ENOTSUP; 5332 5333 /* Verify the capabilities */ 5334 struct rte_cryptodev_sym_capability_idx cap_idx; 5335 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5336 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9; 5337 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5338 &cap_idx) == NULL) 5339 return -ENOTSUP; 5340 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5341 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8; 5342 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5343 &cap_idx) == NULL) 5344 return -ENOTSUP; 5345 5346 /* Create KASUMI session */ 5347 retval = create_wireless_algo_cipher_auth_session( 5348 ts_params->valid_devs[0], 5349 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5350 RTE_CRYPTO_AUTH_OP_GENERATE, 5351 RTE_CRYPTO_AUTH_KASUMI_F9, 5352 RTE_CRYPTO_CIPHER_KASUMI_F8, 5353 tdata->key.data, tdata->key.len, 5354 0, tdata->digest.len, 5355 tdata->cipher_iv.len); 5356 if (retval < 0) 5357 return retval; 5358 5359 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5360 5361 /* clear mbuf payload */ 5362 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5363 rte_pktmbuf_tailroom(ut_params->ibuf)); 5364 5365 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5366 /* Append data which is padded to a multiple of */ 5367 /* the algorithms block size */ 5368 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5369 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5370 plaintext_pad_len); 5371 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5372 5373 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5374 5375 /* Create KASUMI operation */ 5376 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data, 5377 tdata->digest.len, NULL, 0, 5378 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5379 tdata->cipher_iv.data, tdata->cipher_iv.len, 5380 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8), 5381 tdata->validCipherOffsetInBits.len, 5382 tdata->validAuthLenInBits.len, 5383 0 5384 ); 5385 if (retval < 0) 5386 return retval; 5387 5388 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5389 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5390 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5391 else 5392 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5393 ut_params->op); 5394 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5395 5396 if (ut_params->op->sym->m_dst) 5397 ut_params->obuf = ut_params->op->sym->m_dst; 5398 else 5399 ut_params->obuf = ut_params->op->sym->m_src; 5400 5401 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 5402 tdata->validCipherOffsetInBits.len >> 3); 5403 5404 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5405 + plaintext_pad_len; 5406 5407 const uint8_t *reference_ciphertext = tdata->ciphertext.data + 5408 (tdata->validCipherOffsetInBits.len >> 3); 5409 /* Validate obuf */ 5410 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5411 ciphertext, 5412 reference_ciphertext, 5413 tdata->validCipherLenInBits.len, 5414 "KASUMI Ciphertext data not as expected"); 5415 5416 /* Validate obuf */ 5417 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5418 ut_params->digest, 5419 tdata->digest.data, 5420 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 5421 "KASUMI Generated auth tag not as expected"); 5422 return 0; 5423 } 5424 5425 static int 5426 test_zuc_encryption(const struct wireless_test_data *tdata) 5427 { 5428 struct crypto_testsuite_params *ts_params = &testsuite_params; 5429 struct crypto_unittest_params *ut_params = &unittest_params; 5430 5431 int retval; 5432 uint8_t *plaintext, *ciphertext; 5433 unsigned plaintext_pad_len; 5434 unsigned plaintext_len; 5435 struct rte_cryptodev_info dev_info; 5436 5437 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5438 uint64_t feat_flags = dev_info.feature_flags; 5439 5440 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5441 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5442 printf("Device doesn't support RAW data-path APIs.\n"); 5443 return -ENOTSUP; 5444 } 5445 5446 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5447 return -ENOTSUP; 5448 5449 struct rte_cryptodev_sym_capability_idx cap_idx; 5450 5451 /* Check if device supports ZUC EEA3 */ 5452 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5453 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5454 5455 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5456 &cap_idx) == NULL) 5457 return -ENOTSUP; 5458 5459 /* Create ZUC session */ 5460 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5461 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5462 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5463 tdata->key.data, tdata->key.len, 5464 tdata->cipher_iv.len); 5465 if (retval < 0) 5466 return retval; 5467 5468 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5469 5470 /* Clear mbuf payload */ 5471 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5472 rte_pktmbuf_tailroom(ut_params->ibuf)); 5473 5474 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5475 /* Append data which is padded to a multiple */ 5476 /* of the algorithms block size */ 5477 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5478 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5479 plaintext_pad_len); 5480 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5481 5482 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 5483 5484 /* Create ZUC operation */ 5485 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5486 tdata->cipher_iv.len, 5487 tdata->plaintext.len, 5488 0); 5489 if (retval < 0) 5490 return retval; 5491 5492 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5493 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5494 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5495 else 5496 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5497 ut_params->op); 5498 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5499 5500 ut_params->obuf = ut_params->op->sym->m_dst; 5501 if (ut_params->obuf) 5502 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *); 5503 else 5504 ciphertext = plaintext; 5505 5506 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5507 5508 /* Validate obuf */ 5509 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5510 ciphertext, 5511 tdata->ciphertext.data, 5512 tdata->validCipherLenInBits.len, 5513 "ZUC Ciphertext data not as expected"); 5514 return 0; 5515 } 5516 5517 static int 5518 test_zuc_encryption_sgl(const struct wireless_test_data *tdata) 5519 { 5520 struct crypto_testsuite_params *ts_params = &testsuite_params; 5521 struct crypto_unittest_params *ut_params = &unittest_params; 5522 5523 int retval; 5524 5525 unsigned int plaintext_pad_len; 5526 unsigned int plaintext_len; 5527 const uint8_t *ciphertext; 5528 uint8_t ciphertext_buffer[2048]; 5529 struct rte_cryptodev_info dev_info; 5530 5531 struct rte_cryptodev_sym_capability_idx cap_idx; 5532 5533 /* Check if device supports ZUC EEA3 */ 5534 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 5535 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3; 5536 5537 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5538 &cap_idx) == NULL) 5539 return -ENOTSUP; 5540 5541 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5542 return -ENOTSUP; 5543 5544 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5545 5546 uint64_t feat_flags = dev_info.feature_flags; 5547 5548 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5549 printf("Device doesn't support in-place scatter-gather. " 5550 "Test Skipped.\n"); 5551 return -ENOTSUP; 5552 } 5553 5554 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5555 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5556 printf("Device doesn't support RAW data-path APIs.\n"); 5557 return -ENOTSUP; 5558 } 5559 5560 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5561 5562 /* Append data which is padded to a multiple */ 5563 /* of the algorithms block size */ 5564 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5565 5566 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5567 plaintext_pad_len, 10, 0); 5568 5569 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 5570 tdata->plaintext.data); 5571 5572 /* Create ZUC session */ 5573 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0], 5574 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 5575 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5576 tdata->key.data, tdata->key.len, 5577 tdata->cipher_iv.len); 5578 if (retval < 0) 5579 return retval; 5580 5581 /* Clear mbuf payload */ 5582 5583 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data); 5584 5585 /* Create ZUC operation */ 5586 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data, 5587 tdata->cipher_iv.len, tdata->plaintext.len, 5588 0); 5589 if (retval < 0) 5590 return retval; 5591 5592 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5593 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5594 ut_params->op, 1, 0, 1, tdata->cipher_iv.len); 5595 else 5596 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5597 ut_params->op); 5598 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5599 5600 ut_params->obuf = ut_params->op->sym->m_dst; 5601 if (ut_params->obuf) 5602 ciphertext = rte_pktmbuf_read(ut_params->obuf, 5603 0, plaintext_len, ciphertext_buffer); 5604 else 5605 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 5606 0, plaintext_len, ciphertext_buffer); 5607 5608 /* Validate obuf */ 5609 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len); 5610 5611 /* Validate obuf */ 5612 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5613 ciphertext, 5614 tdata->ciphertext.data, 5615 tdata->validCipherLenInBits.len, 5616 "ZUC Ciphertext data not as expected"); 5617 5618 return 0; 5619 } 5620 5621 static int 5622 test_zuc_authentication(const struct wireless_test_data *tdata) 5623 { 5624 struct crypto_testsuite_params *ts_params = &testsuite_params; 5625 struct crypto_unittest_params *ut_params = &unittest_params; 5626 5627 int retval; 5628 unsigned plaintext_pad_len; 5629 unsigned plaintext_len; 5630 uint8_t *plaintext; 5631 5632 struct rte_cryptodev_sym_capability_idx cap_idx; 5633 struct rte_cryptodev_info dev_info; 5634 5635 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5636 uint64_t feat_flags = dev_info.feature_flags; 5637 5638 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) && 5639 (tdata->validAuthLenInBits.len % 8 != 0)) { 5640 printf("Device doesn't support NON-Byte Aligned Data.\n"); 5641 return -ENOTSUP; 5642 } 5643 5644 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5645 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5646 printf("Device doesn't support RAW data-path APIs.\n"); 5647 return -ENOTSUP; 5648 } 5649 5650 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 5651 return -ENOTSUP; 5652 5653 /* Check if device supports ZUC EIA3 */ 5654 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5655 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5656 5657 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5658 &cap_idx) == NULL) 5659 return -ENOTSUP; 5660 5661 /* Create ZUC session */ 5662 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0], 5663 tdata->key.data, tdata->key.len, 5664 tdata->auth_iv.len, tdata->digest.len, 5665 RTE_CRYPTO_AUTH_OP_GENERATE, 5666 RTE_CRYPTO_AUTH_ZUC_EIA3); 5667 if (retval < 0) 5668 return retval; 5669 5670 /* alloc mbuf and set payload */ 5671 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5672 5673 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5674 rte_pktmbuf_tailroom(ut_params->ibuf)); 5675 5676 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5677 /* Append data which is padded to a multiple of */ 5678 /* the algorithms block size */ 5679 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8); 5680 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5681 plaintext_pad_len); 5682 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5683 5684 /* Create ZUC operation */ 5685 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len, 5686 tdata->auth_iv.data, tdata->auth_iv.len, 5687 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE, 5688 tdata->validAuthLenInBits.len, 5689 0); 5690 if (retval < 0) 5691 return retval; 5692 5693 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5694 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5695 ut_params->op, 0, 1, 1, 0); 5696 else 5697 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5698 ut_params->op); 5699 ut_params->obuf = ut_params->op->sym->m_src; 5700 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5701 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 5702 + plaintext_pad_len; 5703 5704 /* Validate obuf */ 5705 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5706 ut_params->digest, 5707 tdata->digest.data, 5708 tdata->digest.len, 5709 "ZUC Generated auth tag not as expected"); 5710 5711 return 0; 5712 } 5713 5714 static int 5715 test_zuc_auth_cipher(const struct wireless_test_data *tdata, 5716 uint8_t op_mode, uint8_t verify) 5717 { 5718 struct crypto_testsuite_params *ts_params = &testsuite_params; 5719 struct crypto_unittest_params *ut_params = &unittest_params; 5720 5721 int retval; 5722 5723 uint8_t *plaintext = NULL, *ciphertext = NULL; 5724 unsigned int plaintext_pad_len; 5725 unsigned int plaintext_len; 5726 unsigned int ciphertext_pad_len; 5727 unsigned int ciphertext_len; 5728 5729 struct rte_cryptodev_info dev_info; 5730 struct rte_cryptodev_sym_capability_idx cap_idx; 5731 5732 /* Check if device supports ZUC EIA3 */ 5733 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5734 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5735 5736 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5737 &cap_idx) == NULL) 5738 return -ENOTSUP; 5739 5740 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5741 5742 uint64_t feat_flags = dev_info.feature_flags; 5743 5744 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5745 printf("Device doesn't support digest encrypted.\n"); 5746 return -ENOTSUP; 5747 } 5748 if (op_mode == IN_PLACE) { 5749 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5750 printf("Device doesn't support in-place scatter-gather " 5751 "in both input and output mbufs.\n"); 5752 return -ENOTSUP; 5753 } 5754 5755 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5756 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5757 printf("Device doesn't support RAW data-path APIs.\n"); 5758 return -ENOTSUP; 5759 } 5760 } else { 5761 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5762 return -ENOTSUP; 5763 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5764 printf("Device doesn't support out-of-place scatter-gather " 5765 "in both input and output mbufs.\n"); 5766 return -ENOTSUP; 5767 } 5768 } 5769 5770 /* Create ZUC session */ 5771 retval = create_wireless_algo_auth_cipher_session( 5772 ts_params->valid_devs[0], 5773 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5774 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5775 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5776 : RTE_CRYPTO_AUTH_OP_GENERATE), 5777 RTE_CRYPTO_AUTH_ZUC_EIA3, 5778 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5779 tdata->key.data, tdata->key.len, 5780 tdata->auth_iv.len, tdata->digest.len, 5781 tdata->cipher_iv.len); 5782 5783 if (retval < 0) 5784 return retval; 5785 5786 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5787 if (op_mode == OUT_OF_PLACE) 5788 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 5789 5790 /* clear mbuf payload */ 5791 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 5792 rte_pktmbuf_tailroom(ut_params->ibuf)); 5793 if (op_mode == OUT_OF_PLACE) 5794 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 5795 rte_pktmbuf_tailroom(ut_params->obuf)); 5796 5797 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5798 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5799 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5800 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5801 5802 if (verify) { 5803 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5804 ciphertext_pad_len); 5805 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 5806 if (op_mode == OUT_OF_PLACE) 5807 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 5808 debug_hexdump(stdout, "ciphertext:", ciphertext, 5809 ciphertext_len); 5810 } else { 5811 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 5812 plaintext_pad_len); 5813 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 5814 if (op_mode == OUT_OF_PLACE) 5815 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 5816 debug_hexdump(stdout, "plaintext:", plaintext, 5817 plaintext_len); 5818 } 5819 5820 /* Create ZUC operation */ 5821 retval = create_wireless_algo_auth_cipher_operation( 5822 tdata->digest.data, tdata->digest.len, 5823 tdata->cipher_iv.data, tdata->cipher_iv.len, 5824 tdata->auth_iv.data, tdata->auth_iv.len, 5825 (tdata->digest.offset_bytes == 0 ? 5826 (verify ? ciphertext_pad_len : plaintext_pad_len) 5827 : tdata->digest.offset_bytes), 5828 tdata->validCipherLenInBits.len, 5829 tdata->validCipherOffsetInBits.len, 5830 tdata->validAuthLenInBits.len, 5831 0, 5832 op_mode, 0, verify); 5833 5834 if (retval < 0) 5835 return retval; 5836 5837 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5838 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 5839 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 5840 else 5841 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 5842 ut_params->op); 5843 5844 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 5845 5846 ut_params->obuf = (op_mode == IN_PLACE ? 5847 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 5848 5849 5850 if (verify) { 5851 if (ut_params->obuf) 5852 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 5853 uint8_t *); 5854 else 5855 plaintext = ciphertext; 5856 5857 debug_hexdump(stdout, "plaintext:", plaintext, 5858 (tdata->plaintext.len >> 3) - tdata->digest.len); 5859 debug_hexdump(stdout, "plaintext expected:", 5860 tdata->plaintext.data, 5861 (tdata->plaintext.len >> 3) - tdata->digest.len); 5862 } else { 5863 if (ut_params->obuf) 5864 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 5865 uint8_t *); 5866 else 5867 ciphertext = plaintext; 5868 5869 debug_hexdump(stdout, "ciphertext:", ciphertext, 5870 ciphertext_len); 5871 debug_hexdump(stdout, "ciphertext expected:", 5872 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 5873 5874 ut_params->digest = rte_pktmbuf_mtod( 5875 ut_params->obuf, uint8_t *) + 5876 (tdata->digest.offset_bytes == 0 ? 5877 plaintext_pad_len : tdata->digest.offset_bytes); 5878 5879 debug_hexdump(stdout, "digest:", ut_params->digest, 5880 tdata->digest.len); 5881 debug_hexdump(stdout, "digest expected:", 5882 tdata->digest.data, tdata->digest.len); 5883 } 5884 5885 /* Validate obuf */ 5886 if (verify) { 5887 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5888 plaintext, 5889 tdata->plaintext.data, 5890 tdata->plaintext.len >> 3, 5891 "ZUC Plaintext data not as expected"); 5892 } else { 5893 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 5894 ciphertext, 5895 tdata->ciphertext.data, 5896 tdata->ciphertext.len >> 3, 5897 "ZUC Ciphertext data not as expected"); 5898 5899 TEST_ASSERT_BUFFERS_ARE_EQUAL( 5900 ut_params->digest, 5901 tdata->digest.data, 5902 DIGEST_BYTE_LENGTH_KASUMI_F9, 5903 "ZUC Generated auth tag not as expected"); 5904 } 5905 return 0; 5906 } 5907 5908 static int 5909 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata, 5910 uint8_t op_mode, uint8_t verify) 5911 { 5912 struct crypto_testsuite_params *ts_params = &testsuite_params; 5913 struct crypto_unittest_params *ut_params = &unittest_params; 5914 5915 int retval; 5916 5917 const uint8_t *plaintext = NULL; 5918 const uint8_t *ciphertext = NULL; 5919 const uint8_t *digest = NULL; 5920 unsigned int plaintext_pad_len; 5921 unsigned int plaintext_len; 5922 unsigned int ciphertext_pad_len; 5923 unsigned int ciphertext_len; 5924 uint8_t buffer[10000]; 5925 uint8_t digest_buffer[10000]; 5926 5927 struct rte_cryptodev_info dev_info; 5928 struct rte_cryptodev_sym_capability_idx cap_idx; 5929 5930 /* Check if device supports ZUC EIA3 */ 5931 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 5932 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3; 5933 5934 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 5935 &cap_idx) == NULL) 5936 return -ENOTSUP; 5937 5938 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 5939 5940 uint64_t feat_flags = dev_info.feature_flags; 5941 5942 if (op_mode == IN_PLACE) { 5943 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 5944 printf("Device doesn't support in-place scatter-gather " 5945 "in both input and output mbufs.\n"); 5946 return -ENOTSUP; 5947 } 5948 5949 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 5950 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 5951 printf("Device doesn't support RAW data-path APIs.\n"); 5952 return -ENOTSUP; 5953 } 5954 } else { 5955 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 5956 return -ENOTSUP; 5957 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 5958 printf("Device doesn't support out-of-place scatter-gather " 5959 "in both input and output mbufs.\n"); 5960 return -ENOTSUP; 5961 } 5962 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 5963 printf("Device doesn't support digest encrypted.\n"); 5964 return -ENOTSUP; 5965 } 5966 } 5967 5968 /* Create ZUC session */ 5969 retval = create_wireless_algo_auth_cipher_session( 5970 ts_params->valid_devs[0], 5971 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT 5972 : RTE_CRYPTO_CIPHER_OP_ENCRYPT), 5973 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY 5974 : RTE_CRYPTO_AUTH_OP_GENERATE), 5975 RTE_CRYPTO_AUTH_ZUC_EIA3, 5976 RTE_CRYPTO_CIPHER_ZUC_EEA3, 5977 tdata->key.data, tdata->key.len, 5978 tdata->auth_iv.len, tdata->digest.len, 5979 tdata->cipher_iv.len); 5980 5981 if (retval < 0) 5982 return retval; 5983 5984 ciphertext_len = ceil_byte_length(tdata->ciphertext.len); 5985 plaintext_len = ceil_byte_length(tdata->plaintext.len); 5986 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 5987 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 5988 5989 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 5990 plaintext_pad_len, 15, 0); 5991 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 5992 "Failed to allocate input buffer in mempool"); 5993 5994 if (op_mode == OUT_OF_PLACE) { 5995 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 5996 plaintext_pad_len, 15, 0); 5997 TEST_ASSERT_NOT_NULL(ut_params->obuf, 5998 "Failed to allocate output buffer in mempool"); 5999 } 6000 6001 if (verify) { 6002 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 6003 tdata->ciphertext.data); 6004 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6005 ciphertext_len, buffer); 6006 debug_hexdump(stdout, "ciphertext:", ciphertext, 6007 ciphertext_len); 6008 } else { 6009 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 6010 tdata->plaintext.data); 6011 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6012 plaintext_len, buffer); 6013 debug_hexdump(stdout, "plaintext:", plaintext, 6014 plaintext_len); 6015 } 6016 memset(buffer, 0, sizeof(buffer)); 6017 6018 /* Create ZUC operation */ 6019 retval = create_wireless_algo_auth_cipher_operation( 6020 tdata->digest.data, tdata->digest.len, 6021 tdata->cipher_iv.data, tdata->cipher_iv.len, 6022 NULL, 0, 6023 (tdata->digest.offset_bytes == 0 ? 6024 (verify ? ciphertext_pad_len : plaintext_pad_len) 6025 : tdata->digest.offset_bytes), 6026 tdata->validCipherLenInBits.len, 6027 tdata->validCipherOffsetInBits.len, 6028 tdata->validAuthLenInBits.len, 6029 0, 6030 op_mode, 1, verify); 6031 6032 if (retval < 0) 6033 return retval; 6034 6035 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6036 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 6037 ut_params->op, 1, 1, 1, tdata->cipher_iv.len); 6038 else 6039 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 6040 ut_params->op); 6041 6042 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6043 6044 ut_params->obuf = (op_mode == IN_PLACE ? 6045 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6046 6047 if (verify) { 6048 if (ut_params->obuf) 6049 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 6050 plaintext_len, buffer); 6051 else 6052 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 6053 plaintext_len, buffer); 6054 6055 debug_hexdump(stdout, "plaintext:", plaintext, 6056 (tdata->plaintext.len >> 3) - tdata->digest.len); 6057 debug_hexdump(stdout, "plaintext expected:", 6058 tdata->plaintext.data, 6059 (tdata->plaintext.len >> 3) - tdata->digest.len); 6060 } else { 6061 if (ut_params->obuf) 6062 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 6063 ciphertext_len, buffer); 6064 else 6065 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 6066 ciphertext_len, buffer); 6067 6068 debug_hexdump(stdout, "ciphertext:", ciphertext, 6069 ciphertext_len); 6070 debug_hexdump(stdout, "ciphertext expected:", 6071 tdata->ciphertext.data, tdata->ciphertext.len >> 3); 6072 6073 if (ut_params->obuf) 6074 digest = rte_pktmbuf_read(ut_params->obuf, 6075 (tdata->digest.offset_bytes == 0 ? 6076 plaintext_pad_len : tdata->digest.offset_bytes), 6077 tdata->digest.len, digest_buffer); 6078 else 6079 digest = rte_pktmbuf_read(ut_params->ibuf, 6080 (tdata->digest.offset_bytes == 0 ? 6081 plaintext_pad_len : tdata->digest.offset_bytes), 6082 tdata->digest.len, digest_buffer); 6083 6084 debug_hexdump(stdout, "digest:", digest, 6085 tdata->digest.len); 6086 debug_hexdump(stdout, "digest expected:", 6087 tdata->digest.data, tdata->digest.len); 6088 } 6089 6090 /* Validate obuf */ 6091 if (verify) { 6092 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6093 plaintext, 6094 tdata->plaintext.data, 6095 tdata->plaintext.len >> 3, 6096 "ZUC Plaintext data not as expected"); 6097 } else { 6098 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6099 ciphertext, 6100 tdata->ciphertext.data, 6101 tdata->validDataLenInBits.len, 6102 "ZUC Ciphertext data not as expected"); 6103 6104 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6105 digest, 6106 tdata->digest.data, 6107 DIGEST_BYTE_LENGTH_KASUMI_F9, 6108 "ZUC Generated auth tag not as expected"); 6109 } 6110 return 0; 6111 } 6112 6113 static int 6114 test_kasumi_encryption_test_case_1(void) 6115 { 6116 return test_kasumi_encryption(&kasumi_test_case_1); 6117 } 6118 6119 static int 6120 test_kasumi_encryption_test_case_1_sgl(void) 6121 { 6122 return test_kasumi_encryption_sgl(&kasumi_test_case_1); 6123 } 6124 6125 static int 6126 test_kasumi_encryption_test_case_1_oop(void) 6127 { 6128 return test_kasumi_encryption_oop(&kasumi_test_case_1); 6129 } 6130 6131 static int 6132 test_kasumi_encryption_test_case_1_oop_sgl(void) 6133 { 6134 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1); 6135 } 6136 6137 static int 6138 test_kasumi_encryption_test_case_2(void) 6139 { 6140 return test_kasumi_encryption(&kasumi_test_case_2); 6141 } 6142 6143 static int 6144 test_kasumi_encryption_test_case_3(void) 6145 { 6146 return test_kasumi_encryption(&kasumi_test_case_3); 6147 } 6148 6149 static int 6150 test_kasumi_encryption_test_case_4(void) 6151 { 6152 return test_kasumi_encryption(&kasumi_test_case_4); 6153 } 6154 6155 static int 6156 test_kasumi_encryption_test_case_5(void) 6157 { 6158 return test_kasumi_encryption(&kasumi_test_case_5); 6159 } 6160 6161 static int 6162 test_kasumi_decryption_test_case_1(void) 6163 { 6164 return test_kasumi_decryption(&kasumi_test_case_1); 6165 } 6166 6167 static int 6168 test_kasumi_decryption_test_case_1_oop(void) 6169 { 6170 return test_kasumi_decryption_oop(&kasumi_test_case_1); 6171 } 6172 6173 static int 6174 test_kasumi_decryption_test_case_2(void) 6175 { 6176 return test_kasumi_decryption(&kasumi_test_case_2); 6177 } 6178 6179 static int 6180 test_kasumi_decryption_test_case_3(void) 6181 { 6182 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6183 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6184 return -ENOTSUP; 6185 return test_kasumi_decryption(&kasumi_test_case_3); 6186 } 6187 6188 static int 6189 test_kasumi_decryption_test_case_4(void) 6190 { 6191 return test_kasumi_decryption(&kasumi_test_case_4); 6192 } 6193 6194 static int 6195 test_kasumi_decryption_test_case_5(void) 6196 { 6197 return test_kasumi_decryption(&kasumi_test_case_5); 6198 } 6199 static int 6200 test_snow3g_encryption_test_case_1(void) 6201 { 6202 return test_snow3g_encryption(&snow3g_test_case_1); 6203 } 6204 6205 static int 6206 test_snow3g_encryption_test_case_1_oop(void) 6207 { 6208 return test_snow3g_encryption_oop(&snow3g_test_case_1); 6209 } 6210 6211 static int 6212 test_snow3g_encryption_test_case_1_oop_sgl(void) 6213 { 6214 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1); 6215 } 6216 6217 6218 static int 6219 test_snow3g_encryption_test_case_1_offset_oop(void) 6220 { 6221 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1); 6222 } 6223 6224 static int 6225 test_snow3g_encryption_test_case_2(void) 6226 { 6227 return test_snow3g_encryption(&snow3g_test_case_2); 6228 } 6229 6230 static int 6231 test_snow3g_encryption_test_case_3(void) 6232 { 6233 return test_snow3g_encryption(&snow3g_test_case_3); 6234 } 6235 6236 static int 6237 test_snow3g_encryption_test_case_4(void) 6238 { 6239 return test_snow3g_encryption(&snow3g_test_case_4); 6240 } 6241 6242 static int 6243 test_snow3g_encryption_test_case_5(void) 6244 { 6245 return test_snow3g_encryption(&snow3g_test_case_5); 6246 } 6247 6248 static int 6249 test_snow3g_decryption_test_case_1(void) 6250 { 6251 return test_snow3g_decryption(&snow3g_test_case_1); 6252 } 6253 6254 static int 6255 test_snow3g_decryption_test_case_1_oop(void) 6256 { 6257 return test_snow3g_decryption_oop(&snow3g_test_case_1); 6258 } 6259 6260 static int 6261 test_snow3g_decryption_test_case_2(void) 6262 { 6263 return test_snow3g_decryption(&snow3g_test_case_2); 6264 } 6265 6266 static int 6267 test_snow3g_decryption_test_case_3(void) 6268 { 6269 return test_snow3g_decryption(&snow3g_test_case_3); 6270 } 6271 6272 static int 6273 test_snow3g_decryption_test_case_4(void) 6274 { 6275 return test_snow3g_decryption(&snow3g_test_case_4); 6276 } 6277 6278 static int 6279 test_snow3g_decryption_test_case_5(void) 6280 { 6281 return test_snow3g_decryption(&snow3g_test_case_5); 6282 } 6283 6284 /* 6285 * Function prepares snow3g_hash_test_data from snow3g_test_data. 6286 * Pattern digest from snow3g_test_data must be allocated as 6287 * 4 last bytes in plaintext. 6288 */ 6289 static void 6290 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern, 6291 struct snow3g_hash_test_data *output) 6292 { 6293 if ((pattern != NULL) && (output != NULL)) { 6294 output->key.len = pattern->key.len; 6295 6296 memcpy(output->key.data, 6297 pattern->key.data, pattern->key.len); 6298 6299 output->auth_iv.len = pattern->auth_iv.len; 6300 6301 memcpy(output->auth_iv.data, 6302 pattern->auth_iv.data, pattern->auth_iv.len); 6303 6304 output->plaintext.len = pattern->plaintext.len; 6305 6306 memcpy(output->plaintext.data, 6307 pattern->plaintext.data, pattern->plaintext.len >> 3); 6308 6309 output->digest.len = pattern->digest.len; 6310 6311 memcpy(output->digest.data, 6312 &pattern->plaintext.data[pattern->digest.offset_bytes], 6313 pattern->digest.len); 6314 6315 output->validAuthLenInBits.len = 6316 pattern->validAuthLenInBits.len; 6317 } 6318 } 6319 6320 /* 6321 * Test case verify computed cipher and digest from snow3g_test_case_7 data. 6322 */ 6323 static int 6324 test_snow3g_decryption_with_digest_test_case_1(void) 6325 { 6326 struct snow3g_hash_test_data snow3g_hash_data; 6327 6328 /* 6329 * Function prepare data for hash veryfication test case. 6330 * Digest is allocated in 4 last bytes in plaintext, pattern. 6331 */ 6332 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data); 6333 6334 return test_snow3g_decryption(&snow3g_test_case_7) & 6335 test_snow3g_authentication_verify(&snow3g_hash_data); 6336 } 6337 6338 static int 6339 test_snow3g_cipher_auth_test_case_1(void) 6340 { 6341 return test_snow3g_cipher_auth(&snow3g_test_case_3); 6342 } 6343 6344 static int 6345 test_snow3g_auth_cipher_test_case_1(void) 6346 { 6347 return test_snow3g_auth_cipher( 6348 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0); 6349 } 6350 6351 static int 6352 test_snow3g_auth_cipher_test_case_2(void) 6353 { 6354 return test_snow3g_auth_cipher( 6355 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0); 6356 } 6357 6358 static int 6359 test_snow3g_auth_cipher_test_case_2_oop(void) 6360 { 6361 return test_snow3g_auth_cipher( 6362 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6363 } 6364 6365 static int 6366 test_snow3g_auth_cipher_part_digest_enc(void) 6367 { 6368 return test_snow3g_auth_cipher( 6369 &snow3g_auth_cipher_partial_digest_encryption, 6370 IN_PLACE, 0); 6371 } 6372 6373 static int 6374 test_snow3g_auth_cipher_part_digest_enc_oop(void) 6375 { 6376 return test_snow3g_auth_cipher( 6377 &snow3g_auth_cipher_partial_digest_encryption, 6378 OUT_OF_PLACE, 0); 6379 } 6380 6381 static int 6382 test_snow3g_auth_cipher_test_case_3_sgl(void) 6383 { 6384 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6385 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6386 return -ENOTSUP; 6387 return test_snow3g_auth_cipher_sgl( 6388 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0); 6389 } 6390 6391 static int 6392 test_snow3g_auth_cipher_test_case_3_oop_sgl(void) 6393 { 6394 return test_snow3g_auth_cipher_sgl( 6395 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0); 6396 } 6397 6398 static int 6399 test_snow3g_auth_cipher_part_digest_enc_sgl(void) 6400 { 6401 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */ 6402 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6403 return -ENOTSUP; 6404 return test_snow3g_auth_cipher_sgl( 6405 &snow3g_auth_cipher_partial_digest_encryption, 6406 IN_PLACE, 0); 6407 } 6408 6409 static int 6410 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void) 6411 { 6412 return test_snow3g_auth_cipher_sgl( 6413 &snow3g_auth_cipher_partial_digest_encryption, 6414 OUT_OF_PLACE, 0); 6415 } 6416 6417 static int 6418 test_snow3g_auth_cipher_verify_test_case_1(void) 6419 { 6420 return test_snow3g_auth_cipher( 6421 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1); 6422 } 6423 6424 static int 6425 test_snow3g_auth_cipher_verify_test_case_2(void) 6426 { 6427 return test_snow3g_auth_cipher( 6428 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1); 6429 } 6430 6431 static int 6432 test_snow3g_auth_cipher_verify_test_case_2_oop(void) 6433 { 6434 return test_snow3g_auth_cipher( 6435 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6436 } 6437 6438 static int 6439 test_snow3g_auth_cipher_verify_part_digest_enc(void) 6440 { 6441 return test_snow3g_auth_cipher( 6442 &snow3g_auth_cipher_partial_digest_encryption, 6443 IN_PLACE, 1); 6444 } 6445 6446 static int 6447 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void) 6448 { 6449 return test_snow3g_auth_cipher( 6450 &snow3g_auth_cipher_partial_digest_encryption, 6451 OUT_OF_PLACE, 1); 6452 } 6453 6454 static int 6455 test_snow3g_auth_cipher_verify_test_case_3_sgl(void) 6456 { 6457 return test_snow3g_auth_cipher_sgl( 6458 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1); 6459 } 6460 6461 static int 6462 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void) 6463 { 6464 return test_snow3g_auth_cipher_sgl( 6465 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1); 6466 } 6467 6468 static int 6469 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void) 6470 { 6471 return test_snow3g_auth_cipher_sgl( 6472 &snow3g_auth_cipher_partial_digest_encryption, 6473 IN_PLACE, 1); 6474 } 6475 6476 static int 6477 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void) 6478 { 6479 return test_snow3g_auth_cipher_sgl( 6480 &snow3g_auth_cipher_partial_digest_encryption, 6481 OUT_OF_PLACE, 1); 6482 } 6483 6484 static int 6485 test_snow3g_auth_cipher_with_digest_test_case_1(void) 6486 { 6487 return test_snow3g_auth_cipher( 6488 &snow3g_test_case_7, IN_PLACE, 0); 6489 } 6490 6491 static int 6492 test_kasumi_auth_cipher_test_case_1(void) 6493 { 6494 return test_kasumi_auth_cipher( 6495 &kasumi_test_case_3, IN_PLACE, 0); 6496 } 6497 6498 static int 6499 test_kasumi_auth_cipher_test_case_2(void) 6500 { 6501 return test_kasumi_auth_cipher( 6502 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6503 } 6504 6505 static int 6506 test_kasumi_auth_cipher_test_case_2_oop(void) 6507 { 6508 return test_kasumi_auth_cipher( 6509 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6510 } 6511 6512 static int 6513 test_kasumi_auth_cipher_test_case_2_sgl(void) 6514 { 6515 return test_kasumi_auth_cipher_sgl( 6516 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0); 6517 } 6518 6519 static int 6520 test_kasumi_auth_cipher_test_case_2_oop_sgl(void) 6521 { 6522 return test_kasumi_auth_cipher_sgl( 6523 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0); 6524 } 6525 6526 static int 6527 test_kasumi_auth_cipher_verify_test_case_1(void) 6528 { 6529 return test_kasumi_auth_cipher( 6530 &kasumi_test_case_3, IN_PLACE, 1); 6531 } 6532 6533 static int 6534 test_kasumi_auth_cipher_verify_test_case_2(void) 6535 { 6536 return test_kasumi_auth_cipher( 6537 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6538 } 6539 6540 static int 6541 test_kasumi_auth_cipher_verify_test_case_2_oop(void) 6542 { 6543 return test_kasumi_auth_cipher( 6544 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6545 } 6546 6547 static int 6548 test_kasumi_auth_cipher_verify_test_case_2_sgl(void) 6549 { 6550 return test_kasumi_auth_cipher_sgl( 6551 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1); 6552 } 6553 6554 static int 6555 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void) 6556 { 6557 return test_kasumi_auth_cipher_sgl( 6558 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1); 6559 } 6560 6561 static int 6562 test_kasumi_cipher_auth_test_case_1(void) 6563 { 6564 return test_kasumi_cipher_auth(&kasumi_test_case_6); 6565 } 6566 6567 static int 6568 test_zuc_encryption_test_case_1(void) 6569 { 6570 return test_zuc_encryption(&zuc_test_case_cipher_193b); 6571 } 6572 6573 static int 6574 test_zuc_encryption_test_case_2(void) 6575 { 6576 return test_zuc_encryption(&zuc_test_case_cipher_800b); 6577 } 6578 6579 static int 6580 test_zuc_encryption_test_case_3(void) 6581 { 6582 return test_zuc_encryption(&zuc_test_case_cipher_1570b); 6583 } 6584 6585 static int 6586 test_zuc_encryption_test_case_4(void) 6587 { 6588 return test_zuc_encryption(&zuc_test_case_cipher_2798b); 6589 } 6590 6591 static int 6592 test_zuc_encryption_test_case_5(void) 6593 { 6594 return test_zuc_encryption(&zuc_test_case_cipher_4019b); 6595 } 6596 6597 static int 6598 test_zuc_encryption_test_case_6_sgl(void) 6599 { 6600 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b); 6601 } 6602 6603 static int 6604 test_zuc_hash_generate_test_case_1(void) 6605 { 6606 return test_zuc_authentication(&zuc_test_case_auth_1b); 6607 } 6608 6609 static int 6610 test_zuc_hash_generate_test_case_2(void) 6611 { 6612 return test_zuc_authentication(&zuc_test_case_auth_90b); 6613 } 6614 6615 static int 6616 test_zuc_hash_generate_test_case_3(void) 6617 { 6618 return test_zuc_authentication(&zuc_test_case_auth_577b); 6619 } 6620 6621 static int 6622 test_zuc_hash_generate_test_case_4(void) 6623 { 6624 return test_zuc_authentication(&zuc_test_case_auth_2079b); 6625 } 6626 6627 static int 6628 test_zuc_hash_generate_test_case_5(void) 6629 { 6630 return test_zuc_authentication(&zuc_test_auth_5670b); 6631 } 6632 6633 static int 6634 test_zuc_hash_generate_test_case_6(void) 6635 { 6636 return test_zuc_authentication(&zuc_test_case_auth_128b); 6637 } 6638 6639 static int 6640 test_zuc_hash_generate_test_case_7(void) 6641 { 6642 return test_zuc_authentication(&zuc_test_case_auth_2080b); 6643 } 6644 6645 static int 6646 test_zuc_hash_generate_test_case_8(void) 6647 { 6648 return test_zuc_authentication(&zuc_test_case_auth_584b); 6649 } 6650 6651 static int 6652 test_zuc_cipher_auth_test_case_1(void) 6653 { 6654 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b); 6655 } 6656 6657 static int 6658 test_zuc_cipher_auth_test_case_2(void) 6659 { 6660 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b); 6661 } 6662 6663 static int 6664 test_zuc_auth_cipher_test_case_1(void) 6665 { 6666 return test_zuc_auth_cipher( 6667 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 6668 } 6669 6670 static int 6671 test_zuc_auth_cipher_test_case_1_oop(void) 6672 { 6673 return test_zuc_auth_cipher( 6674 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 6675 } 6676 6677 static int 6678 test_zuc_auth_cipher_test_case_1_sgl(void) 6679 { 6680 return test_zuc_auth_cipher_sgl( 6681 &zuc_auth_cipher_test_case_1, IN_PLACE, 0); 6682 } 6683 6684 static int 6685 test_zuc_auth_cipher_test_case_1_oop_sgl(void) 6686 { 6687 return test_zuc_auth_cipher_sgl( 6688 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0); 6689 } 6690 6691 static int 6692 test_zuc_auth_cipher_verify_test_case_1(void) 6693 { 6694 return test_zuc_auth_cipher( 6695 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 6696 } 6697 6698 static int 6699 test_zuc_auth_cipher_verify_test_case_1_oop(void) 6700 { 6701 return test_zuc_auth_cipher( 6702 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 6703 } 6704 6705 static int 6706 test_zuc_auth_cipher_verify_test_case_1_sgl(void) 6707 { 6708 return test_zuc_auth_cipher_sgl( 6709 &zuc_auth_cipher_test_case_1, IN_PLACE, 1); 6710 } 6711 6712 static int 6713 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void) 6714 { 6715 return test_zuc_auth_cipher_sgl( 6716 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1); 6717 } 6718 6719 static int 6720 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata) 6721 { 6722 uint8_t dev_id = testsuite_params.valid_devs[0]; 6723 6724 struct rte_cryptodev_sym_capability_idx cap_idx; 6725 6726 /* Check if device supports particular cipher algorithm */ 6727 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 6728 cap_idx.algo.cipher = tdata->cipher_algo; 6729 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 6730 return -ENOTSUP; 6731 6732 /* Check if device supports particular hash algorithm */ 6733 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 6734 cap_idx.algo.auth = tdata->auth_algo; 6735 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL) 6736 return -ENOTSUP; 6737 6738 return 0; 6739 } 6740 6741 static int 6742 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata, 6743 uint8_t op_mode, uint8_t verify) 6744 { 6745 struct crypto_testsuite_params *ts_params = &testsuite_params; 6746 struct crypto_unittest_params *ut_params = &unittest_params; 6747 6748 int retval; 6749 6750 uint8_t *plaintext = NULL, *ciphertext = NULL; 6751 unsigned int plaintext_pad_len; 6752 unsigned int plaintext_len; 6753 unsigned int ciphertext_pad_len; 6754 unsigned int ciphertext_len; 6755 6756 struct rte_cryptodev_info dev_info; 6757 struct rte_crypto_op *op; 6758 6759 /* Check if device supports particular algorithms separately */ 6760 if (test_mixed_check_if_unsupported(tdata)) 6761 return -ENOTSUP; 6762 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6763 return -ENOTSUP; 6764 6765 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6766 6767 uint64_t feat_flags = dev_info.feature_flags; 6768 6769 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6770 printf("Device doesn't support digest encrypted.\n"); 6771 return -ENOTSUP; 6772 } 6773 6774 if (op_mode == OUT_OF_PLACE) 6775 return -ENOTSUP; 6776 6777 /* Create the session */ 6778 if (verify) 6779 retval = create_wireless_algo_cipher_auth_session( 6780 ts_params->valid_devs[0], 6781 RTE_CRYPTO_CIPHER_OP_DECRYPT, 6782 RTE_CRYPTO_AUTH_OP_VERIFY, 6783 tdata->auth_algo, 6784 tdata->cipher_algo, 6785 tdata->auth_key.data, tdata->auth_key.len, 6786 tdata->auth_iv.len, tdata->digest_enc.len, 6787 tdata->cipher_iv.len); 6788 else 6789 retval = create_wireless_algo_auth_cipher_session( 6790 ts_params->valid_devs[0], 6791 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6792 RTE_CRYPTO_AUTH_OP_GENERATE, 6793 tdata->auth_algo, 6794 tdata->cipher_algo, 6795 tdata->auth_key.data, tdata->auth_key.len, 6796 tdata->auth_iv.len, tdata->digest_enc.len, 6797 tdata->cipher_iv.len); 6798 if (retval < 0) 6799 return retval; 6800 6801 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6802 if (op_mode == OUT_OF_PLACE) 6803 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 6804 6805 /* clear mbuf payload */ 6806 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 6807 rte_pktmbuf_tailroom(ut_params->ibuf)); 6808 if (op_mode == OUT_OF_PLACE) { 6809 6810 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 6811 rte_pktmbuf_tailroom(ut_params->obuf)); 6812 } 6813 6814 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 6815 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 6816 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 6817 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 6818 6819 if (verify) { 6820 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6821 ciphertext_pad_len); 6822 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len); 6823 if (op_mode == OUT_OF_PLACE) 6824 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len); 6825 debug_hexdump(stdout, "ciphertext:", ciphertext, 6826 ciphertext_len); 6827 } else { 6828 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 6829 plaintext_pad_len); 6830 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 6831 if (op_mode == OUT_OF_PLACE) 6832 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len); 6833 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len); 6834 } 6835 6836 /* Create the operation */ 6837 retval = create_wireless_algo_auth_cipher_operation( 6838 tdata->digest_enc.data, tdata->digest_enc.len, 6839 tdata->cipher_iv.data, tdata->cipher_iv.len, 6840 tdata->auth_iv.data, tdata->auth_iv.len, 6841 (tdata->digest_enc.offset == 0 ? 6842 plaintext_pad_len 6843 : tdata->digest_enc.offset), 6844 tdata->validCipherLen.len_bits, 6845 tdata->cipher.offset_bits, 6846 tdata->validAuthLen.len_bits, 6847 tdata->auth.offset_bits, 6848 op_mode, 0, verify); 6849 6850 if (retval < 0) 6851 return retval; 6852 6853 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 6854 6855 /* Check if the op failed because the device doesn't */ 6856 /* support this particular combination of algorithms */ 6857 if (op == NULL && ut_params->op->status == 6858 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 6859 printf("Device doesn't support this mixed combination. " 6860 "Test Skipped.\n"); 6861 return -ENOTSUP; 6862 } 6863 ut_params->op = op; 6864 6865 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 6866 6867 ut_params->obuf = (op_mode == IN_PLACE ? 6868 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 6869 6870 if (verify) { 6871 if (ut_params->obuf) 6872 plaintext = rte_pktmbuf_mtod(ut_params->obuf, 6873 uint8_t *); 6874 else 6875 plaintext = ciphertext + 6876 (tdata->cipher.offset_bits >> 3); 6877 6878 debug_hexdump(stdout, "plaintext:", plaintext, 6879 tdata->plaintext.len_bits >> 3); 6880 debug_hexdump(stdout, "plaintext expected:", 6881 tdata->plaintext.data, 6882 tdata->plaintext.len_bits >> 3); 6883 } else { 6884 if (ut_params->obuf) 6885 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, 6886 uint8_t *); 6887 else 6888 ciphertext = plaintext; 6889 6890 debug_hexdump(stdout, "ciphertext:", ciphertext, 6891 ciphertext_len); 6892 debug_hexdump(stdout, "ciphertext expected:", 6893 tdata->ciphertext.data, 6894 tdata->ciphertext.len_bits >> 3); 6895 6896 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) 6897 + (tdata->digest_enc.offset == 0 ? 6898 plaintext_pad_len : tdata->digest_enc.offset); 6899 6900 debug_hexdump(stdout, "digest:", ut_params->digest, 6901 tdata->digest_enc.len); 6902 debug_hexdump(stdout, "digest expected:", 6903 tdata->digest_enc.data, 6904 tdata->digest_enc.len); 6905 } 6906 6907 /* Validate obuf */ 6908 if (verify) { 6909 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6910 plaintext, 6911 tdata->plaintext.data, 6912 tdata->plaintext.len_bits >> 3, 6913 "Plaintext data not as expected"); 6914 } else { 6915 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 6916 ciphertext, 6917 tdata->ciphertext.data, 6918 tdata->validDataLen.len_bits, 6919 "Ciphertext data not as expected"); 6920 6921 TEST_ASSERT_BUFFERS_ARE_EQUAL( 6922 ut_params->digest, 6923 tdata->digest_enc.data, 6924 DIGEST_BYTE_LENGTH_SNOW3G_UIA2, 6925 "Generated auth tag not as expected"); 6926 } 6927 6928 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 6929 "crypto op processing failed"); 6930 6931 return 0; 6932 } 6933 6934 static int 6935 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata, 6936 uint8_t op_mode, uint8_t verify) 6937 { 6938 struct crypto_testsuite_params *ts_params = &testsuite_params; 6939 struct crypto_unittest_params *ut_params = &unittest_params; 6940 6941 int retval; 6942 6943 const uint8_t *plaintext = NULL; 6944 const uint8_t *ciphertext = NULL; 6945 const uint8_t *digest = NULL; 6946 unsigned int plaintext_pad_len; 6947 unsigned int plaintext_len; 6948 unsigned int ciphertext_pad_len; 6949 unsigned int ciphertext_len; 6950 uint8_t buffer[10000]; 6951 uint8_t digest_buffer[10000]; 6952 6953 struct rte_cryptodev_info dev_info; 6954 struct rte_crypto_op *op; 6955 6956 /* Check if device supports particular algorithms */ 6957 if (test_mixed_check_if_unsupported(tdata)) 6958 return -ENOTSUP; 6959 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 6960 return -ENOTSUP; 6961 6962 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 6963 6964 uint64_t feat_flags = dev_info.feature_flags; 6965 6966 if (op_mode == IN_PLACE) { 6967 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) { 6968 printf("Device doesn't support in-place scatter-gather " 6969 "in both input and output mbufs.\n"); 6970 return -ENOTSUP; 6971 } 6972 } else { 6973 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) { 6974 printf("Device doesn't support out-of-place scatter-gather " 6975 "in both input and output mbufs.\n"); 6976 return -ENOTSUP; 6977 } 6978 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) { 6979 printf("Device doesn't support digest encrypted.\n"); 6980 return -ENOTSUP; 6981 } 6982 } 6983 6984 /* Create the session */ 6985 if (verify) 6986 retval = create_wireless_algo_cipher_auth_session( 6987 ts_params->valid_devs[0], 6988 RTE_CRYPTO_CIPHER_OP_DECRYPT, 6989 RTE_CRYPTO_AUTH_OP_VERIFY, 6990 tdata->auth_algo, 6991 tdata->cipher_algo, 6992 tdata->auth_key.data, tdata->auth_key.len, 6993 tdata->auth_iv.len, tdata->digest_enc.len, 6994 tdata->cipher_iv.len); 6995 else 6996 retval = create_wireless_algo_auth_cipher_session( 6997 ts_params->valid_devs[0], 6998 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 6999 RTE_CRYPTO_AUTH_OP_GENERATE, 7000 tdata->auth_algo, 7001 tdata->cipher_algo, 7002 tdata->auth_key.data, tdata->auth_key.len, 7003 tdata->auth_iv.len, tdata->digest_enc.len, 7004 tdata->cipher_iv.len); 7005 if (retval < 0) 7006 return retval; 7007 7008 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits); 7009 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits); 7010 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16); 7011 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16); 7012 7013 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool, 7014 ciphertext_pad_len, 15, 0); 7015 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 7016 "Failed to allocate input buffer in mempool"); 7017 7018 if (op_mode == OUT_OF_PLACE) { 7019 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool, 7020 plaintext_pad_len, 15, 0); 7021 TEST_ASSERT_NOT_NULL(ut_params->obuf, 7022 "Failed to allocate output buffer in mempool"); 7023 } 7024 7025 if (verify) { 7026 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len, 7027 tdata->ciphertext.data); 7028 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7029 ciphertext_len, buffer); 7030 debug_hexdump(stdout, "ciphertext:", ciphertext, 7031 ciphertext_len); 7032 } else { 7033 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, 7034 tdata->plaintext.data); 7035 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7036 plaintext_len, buffer); 7037 debug_hexdump(stdout, "plaintext:", plaintext, 7038 plaintext_len); 7039 } 7040 memset(buffer, 0, sizeof(buffer)); 7041 7042 /* Create the operation */ 7043 retval = create_wireless_algo_auth_cipher_operation( 7044 tdata->digest_enc.data, tdata->digest_enc.len, 7045 tdata->cipher_iv.data, tdata->cipher_iv.len, 7046 tdata->auth_iv.data, tdata->auth_iv.len, 7047 (tdata->digest_enc.offset == 0 ? 7048 plaintext_pad_len 7049 : tdata->digest_enc.offset), 7050 tdata->validCipherLen.len_bits, 7051 tdata->cipher.offset_bits, 7052 tdata->validAuthLen.len_bits, 7053 tdata->auth.offset_bits, 7054 op_mode, 1, verify); 7055 7056 if (retval < 0) 7057 return retval; 7058 7059 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op); 7060 7061 /* Check if the op failed because the device doesn't */ 7062 /* support this particular combination of algorithms */ 7063 if (op == NULL && ut_params->op->status == 7064 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) { 7065 printf("Device doesn't support this mixed combination. " 7066 "Test Skipped.\n"); 7067 return -ENOTSUP; 7068 } 7069 ut_params->op = op; 7070 7071 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf"); 7072 7073 ut_params->obuf = (op_mode == IN_PLACE ? 7074 ut_params->op->sym->m_src : ut_params->op->sym->m_dst); 7075 7076 if (verify) { 7077 if (ut_params->obuf) 7078 plaintext = rte_pktmbuf_read(ut_params->obuf, 0, 7079 plaintext_len, buffer); 7080 else 7081 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0, 7082 plaintext_len, buffer); 7083 7084 debug_hexdump(stdout, "plaintext:", plaintext, 7085 (tdata->plaintext.len_bits >> 3) - 7086 tdata->digest_enc.len); 7087 debug_hexdump(stdout, "plaintext expected:", 7088 tdata->plaintext.data, 7089 (tdata->plaintext.len_bits >> 3) - 7090 tdata->digest_enc.len); 7091 } else { 7092 if (ut_params->obuf) 7093 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0, 7094 ciphertext_len, buffer); 7095 else 7096 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0, 7097 ciphertext_len, buffer); 7098 7099 debug_hexdump(stdout, "ciphertext:", ciphertext, 7100 ciphertext_len); 7101 debug_hexdump(stdout, "ciphertext expected:", 7102 tdata->ciphertext.data, 7103 tdata->ciphertext.len_bits >> 3); 7104 7105 if (ut_params->obuf) 7106 digest = rte_pktmbuf_read(ut_params->obuf, 7107 (tdata->digest_enc.offset == 0 ? 7108 plaintext_pad_len : 7109 tdata->digest_enc.offset), 7110 tdata->digest_enc.len, digest_buffer); 7111 else 7112 digest = rte_pktmbuf_read(ut_params->ibuf, 7113 (tdata->digest_enc.offset == 0 ? 7114 plaintext_pad_len : 7115 tdata->digest_enc.offset), 7116 tdata->digest_enc.len, digest_buffer); 7117 7118 debug_hexdump(stdout, "digest:", digest, 7119 tdata->digest_enc.len); 7120 debug_hexdump(stdout, "digest expected:", 7121 tdata->digest_enc.data, tdata->digest_enc.len); 7122 } 7123 7124 /* Validate obuf */ 7125 if (verify) { 7126 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7127 plaintext, 7128 tdata->plaintext.data, 7129 tdata->plaintext.len_bits >> 3, 7130 "Plaintext data not as expected"); 7131 } else { 7132 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT( 7133 ciphertext, 7134 tdata->ciphertext.data, 7135 tdata->validDataLen.len_bits, 7136 "Ciphertext data not as expected"); 7137 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7138 digest, 7139 tdata->digest_enc.data, 7140 tdata->digest_enc.len, 7141 "Generated auth tag not as expected"); 7142 } 7143 7144 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7145 "crypto op processing failed"); 7146 7147 return 0; 7148 } 7149 7150 /** AUTH AES CMAC + CIPHER AES CTR */ 7151 7152 static int 7153 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7154 { 7155 return test_mixed_auth_cipher( 7156 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7157 } 7158 7159 static int 7160 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7161 { 7162 return test_mixed_auth_cipher( 7163 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7164 } 7165 7166 static int 7167 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7168 { 7169 return test_mixed_auth_cipher_sgl( 7170 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0); 7171 } 7172 7173 static int 7174 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7175 { 7176 return test_mixed_auth_cipher_sgl( 7177 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7178 } 7179 7180 static int 7181 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void) 7182 { 7183 return test_mixed_auth_cipher( 7184 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7185 } 7186 7187 static int 7188 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void) 7189 { 7190 return test_mixed_auth_cipher( 7191 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7192 } 7193 7194 static int 7195 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void) 7196 { 7197 return test_mixed_auth_cipher_sgl( 7198 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1); 7199 } 7200 7201 static int 7202 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void) 7203 { 7204 return test_mixed_auth_cipher_sgl( 7205 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7206 } 7207 7208 /** MIXED AUTH + CIPHER */ 7209 7210 static int 7211 test_auth_zuc_cipher_snow_test_case_1(void) 7212 { 7213 return test_mixed_auth_cipher( 7214 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7215 } 7216 7217 static int 7218 test_verify_auth_zuc_cipher_snow_test_case_1(void) 7219 { 7220 return test_mixed_auth_cipher( 7221 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7222 } 7223 7224 static int 7225 test_auth_aes_cmac_cipher_snow_test_case_1(void) 7226 { 7227 return test_mixed_auth_cipher( 7228 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7229 } 7230 7231 static int 7232 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void) 7233 { 7234 return test_mixed_auth_cipher( 7235 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7236 } 7237 7238 static int 7239 test_auth_zuc_cipher_aes_ctr_test_case_1(void) 7240 { 7241 return test_mixed_auth_cipher( 7242 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7243 } 7244 7245 static int 7246 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void) 7247 { 7248 return test_mixed_auth_cipher( 7249 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7250 } 7251 7252 static int 7253 test_auth_snow_cipher_aes_ctr_test_case_1(void) 7254 { 7255 return test_mixed_auth_cipher( 7256 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7257 } 7258 7259 static int 7260 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void) 7261 { 7262 return test_mixed_auth_cipher( 7263 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7264 } 7265 7266 static int 7267 test_auth_snow_cipher_zuc_test_case_1(void) 7268 { 7269 return test_mixed_auth_cipher( 7270 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7271 } 7272 7273 static int 7274 test_verify_auth_snow_cipher_zuc_test_case_1(void) 7275 { 7276 return test_mixed_auth_cipher( 7277 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7278 } 7279 7280 static int 7281 test_auth_aes_cmac_cipher_zuc_test_case_1(void) 7282 { 7283 return test_mixed_auth_cipher( 7284 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7285 } 7286 7287 static int 7288 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void) 7289 { 7290 return test_mixed_auth_cipher( 7291 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7292 } 7293 7294 static int 7295 test_auth_null_cipher_snow_test_case_1(void) 7296 { 7297 return test_mixed_auth_cipher( 7298 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0); 7299 } 7300 7301 static int 7302 test_verify_auth_null_cipher_snow_test_case_1(void) 7303 { 7304 return test_mixed_auth_cipher( 7305 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1); 7306 } 7307 7308 static int 7309 test_auth_null_cipher_zuc_test_case_1(void) 7310 { 7311 return test_mixed_auth_cipher( 7312 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0); 7313 } 7314 7315 static int 7316 test_verify_auth_null_cipher_zuc_test_case_1(void) 7317 { 7318 return test_mixed_auth_cipher( 7319 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1); 7320 } 7321 7322 static int 7323 test_auth_snow_cipher_null_test_case_1(void) 7324 { 7325 return test_mixed_auth_cipher( 7326 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7327 } 7328 7329 static int 7330 test_verify_auth_snow_cipher_null_test_case_1(void) 7331 { 7332 return test_mixed_auth_cipher( 7333 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7334 } 7335 7336 static int 7337 test_auth_zuc_cipher_null_test_case_1(void) 7338 { 7339 return test_mixed_auth_cipher( 7340 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7341 } 7342 7343 static int 7344 test_verify_auth_zuc_cipher_null_test_case_1(void) 7345 { 7346 return test_mixed_auth_cipher( 7347 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7348 } 7349 7350 static int 7351 test_auth_null_cipher_aes_ctr_test_case_1(void) 7352 { 7353 return test_mixed_auth_cipher( 7354 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0); 7355 } 7356 7357 static int 7358 test_verify_auth_null_cipher_aes_ctr_test_case_1(void) 7359 { 7360 return test_mixed_auth_cipher( 7361 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1); 7362 } 7363 7364 static int 7365 test_auth_aes_cmac_cipher_null_test_case_1(void) 7366 { 7367 return test_mixed_auth_cipher( 7368 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0); 7369 } 7370 7371 static int 7372 test_verify_auth_aes_cmac_cipher_null_test_case_1(void) 7373 { 7374 return test_mixed_auth_cipher( 7375 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1); 7376 } 7377 7378 /* ***** AEAD algorithm Tests ***** */ 7379 7380 static int 7381 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo, 7382 enum rte_crypto_aead_operation op, 7383 const uint8_t *key, const uint8_t key_len, 7384 const uint16_t aad_len, const uint8_t auth_len, 7385 uint8_t iv_len) 7386 { 7387 uint8_t aead_key[key_len]; 7388 7389 struct crypto_testsuite_params *ts_params = &testsuite_params; 7390 struct crypto_unittest_params *ut_params = &unittest_params; 7391 7392 memcpy(aead_key, key, key_len); 7393 7394 /* Setup AEAD Parameters */ 7395 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7396 ut_params->aead_xform.next = NULL; 7397 ut_params->aead_xform.aead.algo = algo; 7398 ut_params->aead_xform.aead.op = op; 7399 ut_params->aead_xform.aead.key.data = aead_key; 7400 ut_params->aead_xform.aead.key.length = key_len; 7401 ut_params->aead_xform.aead.iv.offset = IV_OFFSET; 7402 ut_params->aead_xform.aead.iv.length = iv_len; 7403 ut_params->aead_xform.aead.digest_length = auth_len; 7404 ut_params->aead_xform.aead.aad_length = aad_len; 7405 7406 debug_hexdump(stdout, "key:", key, key_len); 7407 7408 /* Create Crypto session*/ 7409 ut_params->sess = rte_cryptodev_sym_session_create( 7410 ts_params->session_mpool); 7411 7412 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 7413 &ut_params->aead_xform, 7414 ts_params->session_priv_mpool); 7415 7416 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 7417 7418 return 0; 7419 } 7420 7421 static int 7422 create_aead_xform(struct rte_crypto_op *op, 7423 enum rte_crypto_aead_algorithm algo, 7424 enum rte_crypto_aead_operation aead_op, 7425 uint8_t *key, const uint8_t key_len, 7426 const uint8_t aad_len, const uint8_t auth_len, 7427 uint8_t iv_len) 7428 { 7429 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1), 7430 "failed to allocate space for crypto transform"); 7431 7432 struct rte_crypto_sym_op *sym_op = op->sym; 7433 7434 /* Setup AEAD Parameters */ 7435 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD; 7436 sym_op->xform->next = NULL; 7437 sym_op->xform->aead.algo = algo; 7438 sym_op->xform->aead.op = aead_op; 7439 sym_op->xform->aead.key.data = key; 7440 sym_op->xform->aead.key.length = key_len; 7441 sym_op->xform->aead.iv.offset = IV_OFFSET; 7442 sym_op->xform->aead.iv.length = iv_len; 7443 sym_op->xform->aead.digest_length = auth_len; 7444 sym_op->xform->aead.aad_length = aad_len; 7445 7446 debug_hexdump(stdout, "key:", key, key_len); 7447 7448 return 0; 7449 } 7450 7451 static int 7452 create_aead_operation(enum rte_crypto_aead_operation op, 7453 const struct aead_test_data *tdata) 7454 { 7455 struct crypto_testsuite_params *ts_params = &testsuite_params; 7456 struct crypto_unittest_params *ut_params = &unittest_params; 7457 7458 uint8_t *plaintext, *ciphertext; 7459 unsigned int aad_pad_len, plaintext_pad_len; 7460 7461 /* Generate Crypto op data structure */ 7462 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7463 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7464 TEST_ASSERT_NOT_NULL(ut_params->op, 7465 "Failed to allocate symmetric crypto operation struct"); 7466 7467 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 7468 7469 /* Append aad data */ 7470 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 7471 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16); 7472 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7473 aad_pad_len); 7474 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7475 "no room to append aad"); 7476 7477 sym_op->aead.aad.phys_addr = 7478 rte_pktmbuf_iova(ut_params->ibuf); 7479 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 7480 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len); 7481 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7482 tdata->aad.len); 7483 7484 /* Append IV at the end of the crypto operation*/ 7485 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7486 uint8_t *, IV_OFFSET); 7487 7488 /* Copy IV 1 byte after the IV pointer, according to the API */ 7489 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len); 7490 debug_hexdump(stdout, "iv:", iv_ptr, 7491 tdata->iv.len); 7492 } else { 7493 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 7494 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7495 aad_pad_len); 7496 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 7497 "no room to append aad"); 7498 7499 sym_op->aead.aad.phys_addr = 7500 rte_pktmbuf_iova(ut_params->ibuf); 7501 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len); 7502 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data, 7503 tdata->aad.len); 7504 7505 /* Append IV at the end of the crypto operation*/ 7506 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 7507 uint8_t *, IV_OFFSET); 7508 7509 if (tdata->iv.len == 0) { 7510 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH); 7511 debug_hexdump(stdout, "iv:", iv_ptr, 7512 AES_GCM_J0_LENGTH); 7513 } else { 7514 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 7515 debug_hexdump(stdout, "iv:", iv_ptr, 7516 tdata->iv.len); 7517 } 7518 } 7519 7520 /* Append plaintext/ciphertext */ 7521 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7522 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7523 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7524 plaintext_pad_len); 7525 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 7526 7527 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 7528 debug_hexdump(stdout, "plaintext:", plaintext, 7529 tdata->plaintext.len); 7530 7531 if (ut_params->obuf) { 7532 ciphertext = (uint8_t *)rte_pktmbuf_append( 7533 ut_params->obuf, 7534 plaintext_pad_len + aad_pad_len); 7535 TEST_ASSERT_NOT_NULL(ciphertext, 7536 "no room to append ciphertext"); 7537 7538 memset(ciphertext + aad_pad_len, 0, 7539 tdata->ciphertext.len); 7540 } 7541 } else { 7542 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16); 7543 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7544 plaintext_pad_len); 7545 TEST_ASSERT_NOT_NULL(ciphertext, 7546 "no room to append ciphertext"); 7547 7548 memcpy(ciphertext, tdata->ciphertext.data, 7549 tdata->ciphertext.len); 7550 debug_hexdump(stdout, "ciphertext:", ciphertext, 7551 tdata->ciphertext.len); 7552 7553 if (ut_params->obuf) { 7554 plaintext = (uint8_t *)rte_pktmbuf_append( 7555 ut_params->obuf, 7556 plaintext_pad_len + aad_pad_len); 7557 TEST_ASSERT_NOT_NULL(plaintext, 7558 "no room to append plaintext"); 7559 7560 memset(plaintext + aad_pad_len, 0, 7561 tdata->plaintext.len); 7562 } 7563 } 7564 7565 /* Append digest data */ 7566 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) { 7567 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7568 ut_params->obuf ? ut_params->obuf : 7569 ut_params->ibuf, 7570 tdata->auth_tag.len); 7571 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7572 "no room to append digest"); 7573 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len); 7574 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7575 ut_params->obuf ? ut_params->obuf : 7576 ut_params->ibuf, 7577 plaintext_pad_len + 7578 aad_pad_len); 7579 } else { 7580 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append( 7581 ut_params->ibuf, tdata->auth_tag.len); 7582 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 7583 "no room to append digest"); 7584 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset( 7585 ut_params->ibuf, 7586 plaintext_pad_len + aad_pad_len); 7587 7588 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 7589 tdata->auth_tag.len); 7590 debug_hexdump(stdout, "digest:", 7591 sym_op->aead.digest.data, 7592 tdata->auth_tag.len); 7593 } 7594 7595 sym_op->aead.data.length = tdata->plaintext.len; 7596 sym_op->aead.data.offset = aad_pad_len; 7597 7598 return 0; 7599 } 7600 7601 static int 7602 test_authenticated_encryption(const struct aead_test_data *tdata) 7603 { 7604 struct crypto_testsuite_params *ts_params = &testsuite_params; 7605 struct crypto_unittest_params *ut_params = &unittest_params; 7606 7607 int retval; 7608 uint8_t *ciphertext, *auth_tag; 7609 uint16_t plaintext_pad_len; 7610 uint32_t i; 7611 struct rte_cryptodev_info dev_info; 7612 7613 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 7614 uint64_t feat_flags = dev_info.feature_flags; 7615 7616 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 7617 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 7618 printf("Device doesn't support RAW data-path APIs.\n"); 7619 return -ENOTSUP; 7620 } 7621 7622 /* Verify the capabilities */ 7623 struct rte_cryptodev_sym_capability_idx cap_idx; 7624 const struct rte_cryptodev_symmetric_capability *capability; 7625 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 7626 cap_idx.algo.aead = tdata->algo; 7627 capability = rte_cryptodev_sym_capability_get( 7628 ts_params->valid_devs[0], &cap_idx); 7629 if (capability == NULL) 7630 return -ENOTSUP; 7631 if (rte_cryptodev_sym_capability_check_aead( 7632 capability, tdata->key.len, tdata->auth_tag.len, 7633 tdata->aad.len, tdata->iv.len)) 7634 return -ENOTSUP; 7635 7636 /* Create AEAD session */ 7637 retval = create_aead_session(ts_params->valid_devs[0], 7638 tdata->algo, 7639 RTE_CRYPTO_AEAD_OP_ENCRYPT, 7640 tdata->key.data, tdata->key.len, 7641 tdata->aad.len, tdata->auth_tag.len, 7642 tdata->iv.len); 7643 if (retval < 0) 7644 return retval; 7645 7646 if (tdata->aad.len > MBUF_SIZE) { 7647 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 7648 /* Populate full size of add data */ 7649 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 7650 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 7651 } else 7652 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7653 7654 /* clear mbuf payload */ 7655 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7656 rte_pktmbuf_tailroom(ut_params->ibuf)); 7657 7658 /* Create AEAD operation */ 7659 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 7660 if (retval < 0) 7661 return retval; 7662 7663 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 7664 7665 ut_params->op->sym->m_src = ut_params->ibuf; 7666 7667 /* Process crypto operation */ 7668 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 7669 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 7670 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 7671 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 7672 ut_params->op, 0, 0, 0, 0); 7673 else 7674 TEST_ASSERT_NOT_NULL( 7675 process_crypto_request(ts_params->valid_devs[0], 7676 ut_params->op), "failed to process sym crypto op"); 7677 7678 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 7679 "crypto op processing failed"); 7680 7681 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 7682 7683 if (ut_params->op->sym->m_dst) { 7684 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 7685 uint8_t *); 7686 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 7687 uint8_t *, plaintext_pad_len); 7688 } else { 7689 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 7690 uint8_t *, 7691 ut_params->op->sym->cipher.data.offset); 7692 auth_tag = ciphertext + plaintext_pad_len; 7693 } 7694 7695 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 7696 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 7697 7698 /* Validate obuf */ 7699 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7700 ciphertext, 7701 tdata->ciphertext.data, 7702 tdata->ciphertext.len, 7703 "Ciphertext data not as expected"); 7704 7705 TEST_ASSERT_BUFFERS_ARE_EQUAL( 7706 auth_tag, 7707 tdata->auth_tag.data, 7708 tdata->auth_tag.len, 7709 "Generated auth tag not as expected"); 7710 7711 return 0; 7712 7713 } 7714 7715 #ifdef RTE_LIB_SECURITY 7716 static int 7717 security_proto_supported(enum rte_security_session_action_type action, 7718 enum rte_security_session_protocol proto) 7719 { 7720 struct crypto_testsuite_params *ts_params = &testsuite_params; 7721 7722 const struct rte_security_capability *capabilities; 7723 const struct rte_security_capability *capability; 7724 uint16_t i = 0; 7725 7726 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 7727 rte_cryptodev_get_sec_ctx( 7728 ts_params->valid_devs[0]); 7729 7730 7731 capabilities = rte_security_capabilities_get(ctx); 7732 7733 if (capabilities == NULL) 7734 return -ENOTSUP; 7735 7736 while ((capability = &capabilities[i++])->action != 7737 RTE_SECURITY_ACTION_TYPE_NONE) { 7738 if (capability->action == action && 7739 capability->protocol == proto) 7740 return 0; 7741 } 7742 7743 return -ENOTSUP; 7744 } 7745 7746 /* Basic algorithm run function for async inplace mode. 7747 * Creates a session from input parameters and runs one operation 7748 * on input_vec. Checks the output of the crypto operation against 7749 * output_vec. 7750 */ 7751 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc, 7752 enum rte_crypto_auth_operation opa, 7753 const uint8_t *input_vec, unsigned int input_vec_len, 7754 const uint8_t *output_vec, 7755 unsigned int output_vec_len, 7756 enum rte_crypto_cipher_algorithm cipher_alg, 7757 const uint8_t *cipher_key, uint32_t cipher_key_len, 7758 enum rte_crypto_auth_algorithm auth_alg, 7759 const uint8_t *auth_key, uint32_t auth_key_len, 7760 uint8_t bearer, enum rte_security_pdcp_domain domain, 7761 uint8_t packet_direction, uint8_t sn_size, 7762 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap) 7763 { 7764 struct crypto_testsuite_params *ts_params = &testsuite_params; 7765 struct crypto_unittest_params *ut_params = &unittest_params; 7766 uint8_t *plaintext; 7767 int ret = TEST_SUCCESS; 7768 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 7769 rte_cryptodev_get_sec_ctx( 7770 ts_params->valid_devs[0]); 7771 7772 /* Verify the capabilities */ 7773 struct rte_security_capability_idx sec_cap_idx; 7774 7775 sec_cap_idx.action = ut_params->type; 7776 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 7777 sec_cap_idx.pdcp.domain = domain; 7778 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 7779 return -ENOTSUP; 7780 7781 /* Generate test mbuf data */ 7782 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7783 7784 /* clear mbuf payload */ 7785 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7786 rte_pktmbuf_tailroom(ut_params->ibuf)); 7787 7788 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 7789 input_vec_len); 7790 memcpy(plaintext, input_vec, input_vec_len); 7791 7792 /* Out of place support */ 7793 if (oop) { 7794 /* 7795 * For out-op-place we need to alloc another mbuf 7796 */ 7797 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7798 rte_pktmbuf_append(ut_params->obuf, output_vec_len); 7799 } 7800 7801 /* Setup Cipher Parameters */ 7802 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 7803 ut_params->cipher_xform.cipher.algo = cipher_alg; 7804 ut_params->cipher_xform.cipher.op = opc; 7805 ut_params->cipher_xform.cipher.key.data = cipher_key; 7806 ut_params->cipher_xform.cipher.key.length = cipher_key_len; 7807 ut_params->cipher_xform.cipher.iv.length = 7808 packet_direction ? 4 : 0; 7809 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 7810 7811 /* Setup HMAC Parameters if ICV header is required */ 7812 if (auth_alg != 0) { 7813 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 7814 ut_params->auth_xform.next = NULL; 7815 ut_params->auth_xform.auth.algo = auth_alg; 7816 ut_params->auth_xform.auth.op = opa; 7817 ut_params->auth_xform.auth.key.data = auth_key; 7818 ut_params->auth_xform.auth.key.length = auth_key_len; 7819 7820 ut_params->cipher_xform.next = &ut_params->auth_xform; 7821 } else { 7822 ut_params->cipher_xform.next = NULL; 7823 } 7824 7825 struct rte_security_session_conf sess_conf = { 7826 .action_type = ut_params->type, 7827 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 7828 {.pdcp = { 7829 .bearer = bearer, 7830 .domain = domain, 7831 .pkt_dir = packet_direction, 7832 .sn_size = sn_size, 7833 .hfn = packet_direction ? 0 : hfn, 7834 /** 7835 * hfn can be set as pdcp_test_hfn[i] 7836 * if hfn_ovrd is not set. Here, PDCP 7837 * packet direction is just used to 7838 * run half of the cases with session 7839 * HFN and other half with per packet 7840 * HFN. 7841 */ 7842 .hfn_threshold = hfn_threshold, 7843 .hfn_ovrd = packet_direction ? 1 : 0, 7844 .sdap_enabled = sdap, 7845 } }, 7846 .crypto_xform = &ut_params->cipher_xform 7847 }; 7848 7849 /* Create security session */ 7850 ut_params->sec_session = rte_security_session_create(ctx, 7851 &sess_conf, ts_params->session_mpool, 7852 ts_params->session_priv_mpool); 7853 7854 if (!ut_params->sec_session) { 7855 printf("TestCase %s()-%d line %d failed %s: ", 7856 __func__, i, __LINE__, "Failed to allocate session"); 7857 ret = TEST_FAILED; 7858 goto on_err; 7859 } 7860 7861 /* Generate crypto op data structure */ 7862 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 7863 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 7864 if (!ut_params->op) { 7865 printf("TestCase %s()-%d line %d failed %s: ", 7866 __func__, i, __LINE__, 7867 "Failed to allocate symmetric crypto operation struct"); 7868 ret = TEST_FAILED; 7869 goto on_err; 7870 } 7871 7872 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op, 7873 uint32_t *, IV_OFFSET); 7874 *per_pkt_hfn = packet_direction ? hfn : 0; 7875 7876 rte_security_attach_session(ut_params->op, ut_params->sec_session); 7877 7878 /* set crypto operation source mbuf */ 7879 ut_params->op->sym->m_src = ut_params->ibuf; 7880 if (oop) 7881 ut_params->op->sym->m_dst = ut_params->obuf; 7882 7883 /* Process crypto operation */ 7884 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 7885 == NULL) { 7886 printf("TestCase %s()-%d line %d failed %s: ", 7887 __func__, i, __LINE__, 7888 "failed to process sym crypto op"); 7889 ret = TEST_FAILED; 7890 goto on_err; 7891 } 7892 7893 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 7894 printf("TestCase %s()-%d line %d failed %s: ", 7895 __func__, i, __LINE__, "crypto op processing failed"); 7896 ret = TEST_FAILED; 7897 goto on_err; 7898 } 7899 7900 /* Validate obuf */ 7901 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 7902 uint8_t *); 7903 if (oop) { 7904 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 7905 uint8_t *); 7906 } 7907 7908 if (memcmp(ciphertext, output_vec, output_vec_len)) { 7909 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 7910 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len); 7911 rte_hexdump(stdout, "reference", output_vec, output_vec_len); 7912 ret = TEST_FAILED; 7913 goto on_err; 7914 } 7915 7916 on_err: 7917 rte_crypto_op_free(ut_params->op); 7918 ut_params->op = NULL; 7919 7920 if (ut_params->sec_session) 7921 rte_security_session_destroy(ctx, ut_params->sec_session); 7922 ut_params->sec_session = NULL; 7923 7924 rte_pktmbuf_free(ut_params->ibuf); 7925 ut_params->ibuf = NULL; 7926 if (oop) { 7927 rte_pktmbuf_free(ut_params->obuf); 7928 ut_params->obuf = NULL; 7929 } 7930 7931 return ret; 7932 } 7933 7934 static int 7935 test_pdcp_proto_SGL(int i, int oop, 7936 enum rte_crypto_cipher_operation opc, 7937 enum rte_crypto_auth_operation opa, 7938 uint8_t *input_vec, 7939 unsigned int input_vec_len, 7940 uint8_t *output_vec, 7941 unsigned int output_vec_len, 7942 uint32_t fragsz, 7943 uint32_t fragsz_oop) 7944 { 7945 struct crypto_testsuite_params *ts_params = &testsuite_params; 7946 struct crypto_unittest_params *ut_params = &unittest_params; 7947 uint8_t *plaintext; 7948 struct rte_mbuf *buf, *buf_oop = NULL; 7949 int ret = TEST_SUCCESS; 7950 int to_trn = 0; 7951 int to_trn_tbl[16]; 7952 int segs = 1; 7953 unsigned int trn_data = 0; 7954 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 7955 rte_cryptodev_get_sec_ctx( 7956 ts_params->valid_devs[0]); 7957 7958 /* Verify the capabilities */ 7959 struct rte_security_capability_idx sec_cap_idx; 7960 7961 sec_cap_idx.action = ut_params->type; 7962 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP; 7963 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain; 7964 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL) 7965 return -ENOTSUP; 7966 7967 if (fragsz > input_vec_len) 7968 fragsz = input_vec_len; 7969 7970 uint16_t plaintext_len = fragsz; 7971 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 7972 7973 if (fragsz_oop > output_vec_len) 7974 frag_size_oop = output_vec_len; 7975 7976 int ecx = 0; 7977 if (input_vec_len % fragsz != 0) { 7978 if (input_vec_len / fragsz + 1 > 16) 7979 return 1; 7980 } else if (input_vec_len / fragsz > 16) 7981 return 1; 7982 7983 /* Out of place support */ 7984 if (oop) { 7985 /* 7986 * For out-op-place we need to alloc another mbuf 7987 */ 7988 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7989 rte_pktmbuf_append(ut_params->obuf, frag_size_oop); 7990 buf_oop = ut_params->obuf; 7991 } 7992 7993 /* Generate test mbuf data */ 7994 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 7995 7996 /* clear mbuf payload */ 7997 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 7998 rte_pktmbuf_tailroom(ut_params->ibuf)); 7999 8000 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8001 plaintext_len); 8002 memcpy(plaintext, input_vec, plaintext_len); 8003 trn_data += plaintext_len; 8004 8005 buf = ut_params->ibuf; 8006 8007 /* 8008 * Loop until no more fragments 8009 */ 8010 8011 while (trn_data < input_vec_len) { 8012 ++segs; 8013 to_trn = (input_vec_len - trn_data < fragsz) ? 8014 (input_vec_len - trn_data) : fragsz; 8015 8016 to_trn_tbl[ecx++] = to_trn; 8017 8018 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8019 buf = buf->next; 8020 8021 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 8022 rte_pktmbuf_tailroom(buf)); 8023 8024 /* OOP */ 8025 if (oop && !fragsz_oop) { 8026 buf_oop->next = 8027 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8028 buf_oop = buf_oop->next; 8029 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8030 0, rte_pktmbuf_tailroom(buf_oop)); 8031 rte_pktmbuf_append(buf_oop, to_trn); 8032 } 8033 8034 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 8035 to_trn); 8036 8037 memcpy(plaintext, input_vec + trn_data, to_trn); 8038 trn_data += to_trn; 8039 } 8040 8041 ut_params->ibuf->nb_segs = segs; 8042 8043 segs = 1; 8044 if (fragsz_oop && oop) { 8045 to_trn = 0; 8046 ecx = 0; 8047 8048 trn_data = frag_size_oop; 8049 while (trn_data < output_vec_len) { 8050 ++segs; 8051 to_trn = 8052 (output_vec_len - trn_data < 8053 frag_size_oop) ? 8054 (output_vec_len - trn_data) : 8055 frag_size_oop; 8056 8057 to_trn_tbl[ecx++] = to_trn; 8058 8059 buf_oop->next = 8060 rte_pktmbuf_alloc(ts_params->mbuf_pool); 8061 buf_oop = buf_oop->next; 8062 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 8063 0, rte_pktmbuf_tailroom(buf_oop)); 8064 rte_pktmbuf_append(buf_oop, to_trn); 8065 8066 trn_data += to_trn; 8067 } 8068 ut_params->obuf->nb_segs = segs; 8069 } 8070 8071 /* Setup Cipher Parameters */ 8072 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8073 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg; 8074 ut_params->cipher_xform.cipher.op = opc; 8075 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i]; 8076 ut_params->cipher_xform.cipher.key.length = 8077 pdcp_test_params[i].cipher_key_len; 8078 ut_params->cipher_xform.cipher.iv.length = 0; 8079 8080 /* Setup HMAC Parameters if ICV header is required */ 8081 if (pdcp_test_params[i].auth_alg != 0) { 8082 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 8083 ut_params->auth_xform.next = NULL; 8084 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg; 8085 ut_params->auth_xform.auth.op = opa; 8086 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i]; 8087 ut_params->auth_xform.auth.key.length = 8088 pdcp_test_params[i].auth_key_len; 8089 8090 ut_params->cipher_xform.next = &ut_params->auth_xform; 8091 } else { 8092 ut_params->cipher_xform.next = NULL; 8093 } 8094 8095 struct rte_security_session_conf sess_conf = { 8096 .action_type = ut_params->type, 8097 .protocol = RTE_SECURITY_PROTOCOL_PDCP, 8098 {.pdcp = { 8099 .bearer = pdcp_test_bearer[i], 8100 .domain = pdcp_test_params[i].domain, 8101 .pkt_dir = pdcp_test_packet_direction[i], 8102 .sn_size = pdcp_test_data_sn_size[i], 8103 .hfn = pdcp_test_hfn[i], 8104 .hfn_threshold = pdcp_test_hfn_threshold[i], 8105 .hfn_ovrd = 0, 8106 } }, 8107 .crypto_xform = &ut_params->cipher_xform 8108 }; 8109 8110 /* Create security session */ 8111 ut_params->sec_session = rte_security_session_create(ctx, 8112 &sess_conf, ts_params->session_mpool, 8113 ts_params->session_priv_mpool); 8114 8115 if (!ut_params->sec_session) { 8116 printf("TestCase %s()-%d line %d failed %s: ", 8117 __func__, i, __LINE__, "Failed to allocate session"); 8118 ret = TEST_FAILED; 8119 goto on_err; 8120 } 8121 8122 /* Generate crypto op data structure */ 8123 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8124 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8125 if (!ut_params->op) { 8126 printf("TestCase %s()-%d line %d failed %s: ", 8127 __func__, i, __LINE__, 8128 "Failed to allocate symmetric crypto operation struct"); 8129 ret = TEST_FAILED; 8130 goto on_err; 8131 } 8132 8133 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8134 8135 /* set crypto operation source mbuf */ 8136 ut_params->op->sym->m_src = ut_params->ibuf; 8137 if (oop) 8138 ut_params->op->sym->m_dst = ut_params->obuf; 8139 8140 /* Process crypto operation */ 8141 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) 8142 == NULL) { 8143 printf("TestCase %s()-%d line %d failed %s: ", 8144 __func__, i, __LINE__, 8145 "failed to process sym crypto op"); 8146 ret = TEST_FAILED; 8147 goto on_err; 8148 } 8149 8150 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8151 printf("TestCase %s()-%d line %d failed %s: ", 8152 __func__, i, __LINE__, "crypto op processing failed"); 8153 ret = TEST_FAILED; 8154 goto on_err; 8155 } 8156 8157 /* Validate obuf */ 8158 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src, 8159 uint8_t *); 8160 if (oop) { 8161 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 8162 uint8_t *); 8163 } 8164 if (fragsz_oop) 8165 fragsz = frag_size_oop; 8166 if (memcmp(ciphertext, output_vec, fragsz)) { 8167 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8168 rte_hexdump(stdout, "encrypted", ciphertext, fragsz); 8169 rte_hexdump(stdout, "reference", output_vec, fragsz); 8170 ret = TEST_FAILED; 8171 goto on_err; 8172 } 8173 8174 buf = ut_params->op->sym->m_src->next; 8175 if (oop) 8176 buf = ut_params->op->sym->m_dst->next; 8177 8178 unsigned int off = fragsz; 8179 8180 ecx = 0; 8181 while (buf) { 8182 ciphertext = rte_pktmbuf_mtod(buf, 8183 uint8_t *); 8184 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) { 8185 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i); 8186 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]); 8187 rte_hexdump(stdout, "reference", output_vec + off, 8188 to_trn_tbl[ecx]); 8189 ret = TEST_FAILED; 8190 goto on_err; 8191 } 8192 off += to_trn_tbl[ecx++]; 8193 buf = buf->next; 8194 } 8195 on_err: 8196 rte_crypto_op_free(ut_params->op); 8197 ut_params->op = NULL; 8198 8199 if (ut_params->sec_session) 8200 rte_security_session_destroy(ctx, ut_params->sec_session); 8201 ut_params->sec_session = NULL; 8202 8203 rte_pktmbuf_free(ut_params->ibuf); 8204 ut_params->ibuf = NULL; 8205 if (oop) { 8206 rte_pktmbuf_free(ut_params->obuf); 8207 ut_params->obuf = NULL; 8208 } 8209 8210 return ret; 8211 } 8212 8213 int 8214 test_pdcp_proto_cplane_encap(int i) 8215 { 8216 return test_pdcp_proto( 8217 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8218 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8219 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8220 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8221 pdcp_test_params[i].cipher_key_len, 8222 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8223 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8224 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8225 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8226 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8227 } 8228 8229 int 8230 test_pdcp_proto_uplane_encap(int i) 8231 { 8232 return test_pdcp_proto( 8233 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8234 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8235 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8236 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8237 pdcp_test_params[i].cipher_key_len, 8238 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8239 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8240 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8241 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8242 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8243 } 8244 8245 int 8246 test_pdcp_proto_uplane_encap_with_int(int i) 8247 { 8248 return test_pdcp_proto( 8249 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE, 8250 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8251 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8252 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8253 pdcp_test_params[i].cipher_key_len, 8254 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8255 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8256 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8257 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8258 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8259 } 8260 8261 int 8262 test_pdcp_proto_cplane_decap(int i) 8263 { 8264 return test_pdcp_proto( 8265 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8266 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8267 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8268 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8269 pdcp_test_params[i].cipher_key_len, 8270 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8271 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8272 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8273 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8274 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8275 } 8276 8277 int 8278 test_pdcp_proto_uplane_decap(int i) 8279 { 8280 return test_pdcp_proto( 8281 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8282 pdcp_test_data_out[i], pdcp_test_data_in_len[i], 8283 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8284 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8285 pdcp_test_params[i].cipher_key_len, 8286 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8287 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8288 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8289 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8290 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8291 } 8292 8293 int 8294 test_pdcp_proto_uplane_decap_with_int(int i) 8295 { 8296 return test_pdcp_proto( 8297 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY, 8298 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4, 8299 pdcp_test_data_in[i], pdcp_test_data_in_len[i], 8300 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i], 8301 pdcp_test_params[i].cipher_key_len, 8302 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i], 8303 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i], 8304 pdcp_test_params[i].domain, pdcp_test_packet_direction[i], 8305 pdcp_test_data_sn_size[i], pdcp_test_hfn[i], 8306 pdcp_test_hfn_threshold[i], SDAP_DISABLED); 8307 } 8308 8309 static int 8310 test_PDCP_PROTO_SGL_in_place_32B(void) 8311 { 8312 /* i can be used for running any PDCP case 8313 * In this case it is uplane 12-bit AES-SNOW DL encap 8314 */ 8315 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK; 8316 return test_pdcp_proto_SGL(i, IN_PLACE, 8317 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8318 RTE_CRYPTO_AUTH_OP_GENERATE, 8319 pdcp_test_data_in[i], 8320 pdcp_test_data_in_len[i], 8321 pdcp_test_data_out[i], 8322 pdcp_test_data_in_len[i]+4, 8323 32, 0); 8324 } 8325 static int 8326 test_PDCP_PROTO_SGL_oop_32B_128B(void) 8327 { 8328 /* i can be used for running any PDCP case 8329 * In this case it is uplane 18-bit NULL-NULL DL encap 8330 */ 8331 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK; 8332 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8333 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8334 RTE_CRYPTO_AUTH_OP_GENERATE, 8335 pdcp_test_data_in[i], 8336 pdcp_test_data_in_len[i], 8337 pdcp_test_data_out[i], 8338 pdcp_test_data_in_len[i]+4, 8339 32, 128); 8340 } 8341 static int 8342 test_PDCP_PROTO_SGL_oop_32B_40B(void) 8343 { 8344 /* i can be used for running any PDCP case 8345 * In this case it is uplane 18-bit AES DL encap 8346 */ 8347 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET 8348 + DOWNLINK; 8349 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8350 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8351 RTE_CRYPTO_AUTH_OP_GENERATE, 8352 pdcp_test_data_in[i], 8353 pdcp_test_data_in_len[i], 8354 pdcp_test_data_out[i], 8355 pdcp_test_data_in_len[i], 8356 32, 40); 8357 } 8358 static int 8359 test_PDCP_PROTO_SGL_oop_128B_32B(void) 8360 { 8361 /* i can be used for running any PDCP case 8362 * In this case it is cplane 12-bit AES-ZUC DL encap 8363 */ 8364 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK; 8365 return test_pdcp_proto_SGL(i, OUT_OF_PLACE, 8366 RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8367 RTE_CRYPTO_AUTH_OP_GENERATE, 8368 pdcp_test_data_in[i], 8369 pdcp_test_data_in_len[i], 8370 pdcp_test_data_out[i], 8371 pdcp_test_data_in_len[i]+4, 8372 128, 32); 8373 } 8374 8375 static int 8376 test_PDCP_SDAP_PROTO_encap_all(void) 8377 { 8378 int i = 0, size = 0; 8379 int err, all_err = TEST_SUCCESS; 8380 const struct pdcp_sdap_test *cur_test; 8381 8382 size = ARRAY_SIZE(list_pdcp_sdap_tests); 8383 8384 for (i = 0; i < size; i++) { 8385 cur_test = &list_pdcp_sdap_tests[i]; 8386 err = test_pdcp_proto( 8387 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, 8388 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in, 8389 cur_test->in_len, cur_test->data_out, 8390 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8391 cur_test->param.cipher_alg, cur_test->cipher_key, 8392 cur_test->param.cipher_key_len, 8393 cur_test->param.auth_alg, 8394 cur_test->auth_key, cur_test->param.auth_key_len, 8395 cur_test->bearer, cur_test->param.domain, 8396 cur_test->packet_direction, cur_test->sn_size, 8397 cur_test->hfn, 8398 cur_test->hfn_threshold, SDAP_ENABLED); 8399 if (err) { 8400 printf("\t%d) %s: Encapsulation failed\n", 8401 cur_test->test_idx, 8402 cur_test->param.name); 8403 err = TEST_FAILED; 8404 } else { 8405 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx, 8406 cur_test->param.name); 8407 err = TEST_SUCCESS; 8408 } 8409 all_err += err; 8410 } 8411 8412 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8413 8414 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8415 } 8416 8417 static int 8418 test_PDCP_SDAP_PROTO_decap_all(void) 8419 { 8420 int i = 0, size = 0; 8421 int err, all_err = TEST_SUCCESS; 8422 const struct pdcp_sdap_test *cur_test; 8423 8424 size = ARRAY_SIZE(list_pdcp_sdap_tests); 8425 8426 for (i = 0; i < size; i++) { 8427 cur_test = &list_pdcp_sdap_tests[i]; 8428 err = test_pdcp_proto( 8429 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, 8430 RTE_CRYPTO_AUTH_OP_VERIFY, 8431 cur_test->data_out, 8432 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0), 8433 cur_test->data_in, cur_test->in_len, 8434 cur_test->param.cipher_alg, 8435 cur_test->cipher_key, cur_test->param.cipher_key_len, 8436 cur_test->param.auth_alg, cur_test->auth_key, 8437 cur_test->param.auth_key_len, cur_test->bearer, 8438 cur_test->param.domain, cur_test->packet_direction, 8439 cur_test->sn_size, cur_test->hfn, 8440 cur_test->hfn_threshold, SDAP_ENABLED); 8441 if (err) { 8442 printf("\t%d) %s: Decapsulation failed\n", 8443 cur_test->test_idx, 8444 cur_test->param.name); 8445 err = TEST_FAILED; 8446 } else { 8447 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx, 8448 cur_test->param.name); 8449 err = TEST_SUCCESS; 8450 } 8451 all_err += err; 8452 } 8453 8454 printf("Success: %d, Failure: %d\n", size + all_err, -all_err); 8455 8456 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED; 8457 } 8458 8459 static int 8460 test_PDCP_PROTO_all(void) 8461 { 8462 struct crypto_testsuite_params *ts_params = &testsuite_params; 8463 struct crypto_unittest_params *ut_params = &unittest_params; 8464 struct rte_cryptodev_info dev_info; 8465 int status; 8466 8467 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8468 uint64_t feat_flags = dev_info.feature_flags; 8469 8470 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 8471 return -ENOTSUP; 8472 8473 /* Set action type */ 8474 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 8475 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 8476 gbl_action_type; 8477 8478 if (security_proto_supported(ut_params->type, 8479 RTE_SECURITY_PROTOCOL_PDCP) < 0) 8480 return -ENOTSUP; 8481 8482 status = test_PDCP_PROTO_cplane_encap_all(); 8483 status += test_PDCP_PROTO_cplane_decap_all(); 8484 status += test_PDCP_PROTO_uplane_encap_all(); 8485 status += test_PDCP_PROTO_uplane_decap_all(); 8486 status += test_PDCP_PROTO_SGL_in_place_32B(); 8487 status += test_PDCP_PROTO_SGL_oop_32B_128B(); 8488 status += test_PDCP_PROTO_SGL_oop_32B_40B(); 8489 status += test_PDCP_PROTO_SGL_oop_128B_32B(); 8490 status += test_PDCP_SDAP_PROTO_encap_all(); 8491 status += test_PDCP_SDAP_PROTO_decap_all(); 8492 8493 if (status) 8494 return TEST_FAILED; 8495 else 8496 return TEST_SUCCESS; 8497 } 8498 8499 static int 8500 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td) 8501 { 8502 struct crypto_testsuite_params *ts_params = &testsuite_params; 8503 struct crypto_unittest_params *ut_params = &unittest_params; 8504 uint8_t *plaintext, *ciphertext; 8505 uint8_t *iv_ptr; 8506 int32_t cipher_len, crc_len; 8507 uint32_t crc_data_len; 8508 int ret = TEST_SUCCESS; 8509 8510 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8511 rte_cryptodev_get_sec_ctx( 8512 ts_params->valid_devs[0]); 8513 8514 /* Verify the capabilities */ 8515 struct rte_security_capability_idx sec_cap_idx; 8516 const struct rte_security_capability *sec_cap; 8517 const struct rte_cryptodev_capabilities *crypto_cap; 8518 const struct rte_cryptodev_symmetric_capability *sym_cap; 8519 int j = 0; 8520 8521 sec_cap_idx.action = ut_params->type; 8522 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 8523 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK; 8524 8525 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 8526 if (sec_cap == NULL) 8527 return -ENOTSUP; 8528 8529 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 8530 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 8531 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 8532 crypto_cap->sym.xform_type == 8533 RTE_CRYPTO_SYM_XFORM_CIPHER && 8534 crypto_cap->sym.cipher.algo == 8535 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 8536 sym_cap = &crypto_cap->sym; 8537 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 8538 d_td->key.len, 8539 d_td->iv.len) == 0) 8540 break; 8541 } 8542 } 8543 8544 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 8545 return -ENOTSUP; 8546 8547 /* Setup source mbuf payload */ 8548 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8549 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8550 rte_pktmbuf_tailroom(ut_params->ibuf)); 8551 8552 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8553 d_td->ciphertext.len); 8554 8555 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len); 8556 8557 /* Setup cipher session parameters */ 8558 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8559 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 8560 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 8561 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 8562 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 8563 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 8564 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8565 ut_params->cipher_xform.next = NULL; 8566 8567 /* Setup DOCSIS session parameters */ 8568 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK; 8569 8570 struct rte_security_session_conf sess_conf = { 8571 .action_type = ut_params->type, 8572 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 8573 .docsis = ut_params->docsis_xform, 8574 .crypto_xform = &ut_params->cipher_xform, 8575 }; 8576 8577 /* Create security session */ 8578 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 8579 ts_params->session_mpool, 8580 ts_params->session_priv_mpool); 8581 8582 if (!ut_params->sec_session) { 8583 printf("TestCase %s(%d) line %d: %s\n", 8584 __func__, i, __LINE__, "failed to allocate session"); 8585 ret = TEST_FAILED; 8586 goto on_err; 8587 } 8588 8589 /* Generate crypto op data structure */ 8590 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8591 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8592 if (!ut_params->op) { 8593 printf("TestCase %s(%d) line %d: %s\n", 8594 __func__, i, __LINE__, 8595 "failed to allocate symmetric crypto operation"); 8596 ret = TEST_FAILED; 8597 goto on_err; 8598 } 8599 8600 /* Setup CRC operation parameters */ 8601 crc_len = d_td->ciphertext.no_crc == false ? 8602 (d_td->ciphertext.len - 8603 d_td->ciphertext.crc_offset - 8604 RTE_ETHER_CRC_LEN) : 8605 0; 8606 crc_len = crc_len > 0 ? crc_len : 0; 8607 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN; 8608 ut_params->op->sym->auth.data.length = crc_len; 8609 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset; 8610 8611 /* Setup cipher operation parameters */ 8612 cipher_len = d_td->ciphertext.no_cipher == false ? 8613 (d_td->ciphertext.len - 8614 d_td->ciphertext.cipher_offset) : 8615 0; 8616 cipher_len = cipher_len > 0 ? cipher_len : 0; 8617 ut_params->op->sym->cipher.data.length = cipher_len; 8618 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset; 8619 8620 /* Setup cipher IV */ 8621 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 8622 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 8623 8624 /* Attach session to operation */ 8625 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8626 8627 /* Set crypto operation mbufs */ 8628 ut_params->op->sym->m_src = ut_params->ibuf; 8629 ut_params->op->sym->m_dst = NULL; 8630 8631 /* Process crypto operation */ 8632 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 8633 NULL) { 8634 printf("TestCase %s(%d) line %d: %s\n", 8635 __func__, i, __LINE__, 8636 "failed to process security crypto op"); 8637 ret = TEST_FAILED; 8638 goto on_err; 8639 } 8640 8641 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8642 printf("TestCase %s(%d) line %d: %s\n", 8643 __func__, i, __LINE__, "crypto op processing failed"); 8644 ret = TEST_FAILED; 8645 goto on_err; 8646 } 8647 8648 /* Validate plaintext */ 8649 plaintext = ciphertext; 8650 8651 if (memcmp(plaintext, d_td->plaintext.data, 8652 d_td->plaintext.len - crc_data_len)) { 8653 printf("TestCase %s(%d) line %d: %s\n", 8654 __func__, i, __LINE__, "plaintext not as expected\n"); 8655 rte_hexdump(stdout, "expected", d_td->plaintext.data, 8656 d_td->plaintext.len); 8657 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len); 8658 ret = TEST_FAILED; 8659 goto on_err; 8660 } 8661 8662 on_err: 8663 rte_crypto_op_free(ut_params->op); 8664 ut_params->op = NULL; 8665 8666 if (ut_params->sec_session) 8667 rte_security_session_destroy(ctx, ut_params->sec_session); 8668 ut_params->sec_session = NULL; 8669 8670 rte_pktmbuf_free(ut_params->ibuf); 8671 ut_params->ibuf = NULL; 8672 8673 return ret; 8674 } 8675 8676 static int 8677 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td) 8678 { 8679 struct crypto_testsuite_params *ts_params = &testsuite_params; 8680 struct crypto_unittest_params *ut_params = &unittest_params; 8681 uint8_t *plaintext, *ciphertext; 8682 uint8_t *iv_ptr; 8683 int32_t cipher_len, crc_len; 8684 int ret = TEST_SUCCESS; 8685 8686 struct rte_security_ctx *ctx = (struct rte_security_ctx *) 8687 rte_cryptodev_get_sec_ctx( 8688 ts_params->valid_devs[0]); 8689 8690 /* Verify the capabilities */ 8691 struct rte_security_capability_idx sec_cap_idx; 8692 const struct rte_security_capability *sec_cap; 8693 const struct rte_cryptodev_capabilities *crypto_cap; 8694 const struct rte_cryptodev_symmetric_capability *sym_cap; 8695 int j = 0; 8696 8697 sec_cap_idx.action = ut_params->type; 8698 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS; 8699 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 8700 8701 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx); 8702 if (sec_cap == NULL) 8703 return -ENOTSUP; 8704 8705 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op != 8706 RTE_CRYPTO_OP_TYPE_UNDEFINED) { 8707 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC && 8708 crypto_cap->sym.xform_type == 8709 RTE_CRYPTO_SYM_XFORM_CIPHER && 8710 crypto_cap->sym.cipher.algo == 8711 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) { 8712 sym_cap = &crypto_cap->sym; 8713 if (rte_cryptodev_sym_capability_check_cipher(sym_cap, 8714 d_td->key.len, 8715 d_td->iv.len) == 0) 8716 break; 8717 } 8718 } 8719 8720 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED) 8721 return -ENOTSUP; 8722 8723 /* Setup source mbuf payload */ 8724 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 8725 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 8726 rte_pktmbuf_tailroom(ut_params->ibuf)); 8727 8728 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 8729 d_td->plaintext.len); 8730 8731 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len); 8732 8733 /* Setup cipher session parameters */ 8734 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 8735 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI; 8736 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 8737 ut_params->cipher_xform.cipher.key.data = d_td->key.data; 8738 ut_params->cipher_xform.cipher.key.length = d_td->key.len; 8739 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len; 8740 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 8741 ut_params->cipher_xform.next = NULL; 8742 8743 /* Setup DOCSIS session parameters */ 8744 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK; 8745 8746 struct rte_security_session_conf sess_conf = { 8747 .action_type = ut_params->type, 8748 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS, 8749 .docsis = ut_params->docsis_xform, 8750 .crypto_xform = &ut_params->cipher_xform, 8751 }; 8752 8753 /* Create security session */ 8754 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf, 8755 ts_params->session_mpool, 8756 ts_params->session_priv_mpool); 8757 8758 if (!ut_params->sec_session) { 8759 printf("TestCase %s(%d) line %d: %s\n", 8760 __func__, i, __LINE__, "failed to allocate session"); 8761 ret = TEST_FAILED; 8762 goto on_err; 8763 } 8764 8765 /* Generate crypto op data structure */ 8766 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 8767 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 8768 if (!ut_params->op) { 8769 printf("TestCase %s(%d) line %d: %s\n", 8770 __func__, i, __LINE__, 8771 "failed to allocate security crypto operation"); 8772 ret = TEST_FAILED; 8773 goto on_err; 8774 } 8775 8776 /* Setup CRC operation parameters */ 8777 crc_len = d_td->plaintext.no_crc == false ? 8778 (d_td->plaintext.len - 8779 d_td->plaintext.crc_offset - 8780 RTE_ETHER_CRC_LEN) : 8781 0; 8782 crc_len = crc_len > 0 ? crc_len : 0; 8783 ut_params->op->sym->auth.data.length = crc_len; 8784 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset; 8785 8786 /* Setup cipher operation parameters */ 8787 cipher_len = d_td->plaintext.no_cipher == false ? 8788 (d_td->plaintext.len - 8789 d_td->plaintext.cipher_offset) : 8790 0; 8791 cipher_len = cipher_len > 0 ? cipher_len : 0; 8792 ut_params->op->sym->cipher.data.length = cipher_len; 8793 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset; 8794 8795 /* Setup cipher IV */ 8796 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET; 8797 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len); 8798 8799 /* Attach session to operation */ 8800 rte_security_attach_session(ut_params->op, ut_params->sec_session); 8801 8802 /* Set crypto operation mbufs */ 8803 ut_params->op->sym->m_src = ut_params->ibuf; 8804 ut_params->op->sym->m_dst = NULL; 8805 8806 /* Process crypto operation */ 8807 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) == 8808 NULL) { 8809 printf("TestCase %s(%d) line %d: %s\n", 8810 __func__, i, __LINE__, 8811 "failed to process security crypto op"); 8812 ret = TEST_FAILED; 8813 goto on_err; 8814 } 8815 8816 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) { 8817 printf("TestCase %s(%d) line %d: %s\n", 8818 __func__, i, __LINE__, "crypto op processing failed"); 8819 ret = TEST_FAILED; 8820 goto on_err; 8821 } 8822 8823 /* Validate ciphertext */ 8824 ciphertext = plaintext; 8825 8826 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) { 8827 printf("TestCase %s(%d) line %d: %s\n", 8828 __func__, i, __LINE__, "ciphertext not as expected\n"); 8829 rte_hexdump(stdout, "expected", d_td->ciphertext.data, 8830 d_td->ciphertext.len); 8831 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len); 8832 ret = TEST_FAILED; 8833 goto on_err; 8834 } 8835 8836 on_err: 8837 rte_crypto_op_free(ut_params->op); 8838 ut_params->op = NULL; 8839 8840 if (ut_params->sec_session) 8841 rte_security_session_destroy(ctx, ut_params->sec_session); 8842 ut_params->sec_session = NULL; 8843 8844 rte_pktmbuf_free(ut_params->ibuf); 8845 ut_params->ibuf = NULL; 8846 8847 return ret; 8848 } 8849 8850 #define TEST_DOCSIS_COUNT(func) do { \ 8851 int ret = func; \ 8852 if (ret == TEST_SUCCESS) { \ 8853 printf("\t%2d)", n++); \ 8854 printf("+++++ PASSED:" #func"\n"); \ 8855 p++; \ 8856 } else if (ret == -ENOTSUP) { \ 8857 printf("\t%2d)", n++); \ 8858 printf("~~~~~ UNSUPP:" #func"\n"); \ 8859 u++; \ 8860 } else { \ 8861 printf("\t%2d)", n++); \ 8862 printf("----- FAILED:" #func"\n"); \ 8863 f++; \ 8864 } \ 8865 } while (0) 8866 8867 static int 8868 test_DOCSIS_PROTO_uplink_all(void) 8869 { 8870 int p = 0, u = 0, f = 0, n = 0; 8871 8872 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1)); 8873 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2)); 8874 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3)); 8875 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4)); 8876 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5)); 8877 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6)); 8878 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7)); 8879 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8)); 8880 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9)); 8881 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10)); 8882 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11)); 8883 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12)); 8884 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13)); 8885 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14)); 8886 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15)); 8887 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16)); 8888 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17)); 8889 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18)); 8890 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19)); 8891 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20)); 8892 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21)); 8893 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22)); 8894 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23)); 8895 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24)); 8896 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25)); 8897 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26)); 8898 8899 if (f) 8900 printf("## %s: %d passed out of %d (%d unsupported)\n", 8901 __func__, p, n, u); 8902 8903 return f; 8904 }; 8905 8906 static int 8907 test_DOCSIS_PROTO_downlink_all(void) 8908 { 8909 int p = 0, u = 0, f = 0, n = 0; 8910 8911 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1)); 8912 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2)); 8913 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3)); 8914 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4)); 8915 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5)); 8916 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6)); 8917 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7)); 8918 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8)); 8919 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9)); 8920 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10)); 8921 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11)); 8922 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12)); 8923 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13)); 8924 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14)); 8925 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15)); 8926 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16)); 8927 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17)); 8928 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18)); 8929 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19)); 8930 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20)); 8931 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21)); 8932 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22)); 8933 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23)); 8934 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24)); 8935 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25)); 8936 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26)); 8937 8938 if (f) 8939 printf("## %s: %d passed out of %d (%d unsupported)\n", 8940 __func__, p, n, u); 8941 8942 return f; 8943 }; 8944 8945 static int 8946 test_DOCSIS_PROTO_all(void) 8947 { 8948 struct crypto_testsuite_params *ts_params = &testsuite_params; 8949 struct crypto_unittest_params *ut_params = &unittest_params; 8950 struct rte_cryptodev_info dev_info; 8951 int status; 8952 8953 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 8954 uint64_t feat_flags = dev_info.feature_flags; 8955 8956 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY)) 8957 return -ENOTSUP; 8958 8959 /* Set action type */ 8960 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ? 8961 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL : 8962 gbl_action_type; 8963 8964 if (security_proto_supported(ut_params->type, 8965 RTE_SECURITY_PROTOCOL_DOCSIS) < 0) 8966 return -ENOTSUP; 8967 8968 status = test_DOCSIS_PROTO_uplink_all(); 8969 status += test_DOCSIS_PROTO_downlink_all(); 8970 8971 if (status) 8972 return TEST_FAILED; 8973 else 8974 return TEST_SUCCESS; 8975 } 8976 #endif 8977 8978 static int 8979 test_AES_GCM_authenticated_encryption_test_case_1(void) 8980 { 8981 return test_authenticated_encryption(&gcm_test_case_1); 8982 } 8983 8984 static int 8985 test_AES_GCM_authenticated_encryption_test_case_2(void) 8986 { 8987 return test_authenticated_encryption(&gcm_test_case_2); 8988 } 8989 8990 static int 8991 test_AES_GCM_authenticated_encryption_test_case_3(void) 8992 { 8993 return test_authenticated_encryption(&gcm_test_case_3); 8994 } 8995 8996 static int 8997 test_AES_GCM_authenticated_encryption_test_case_4(void) 8998 { 8999 return test_authenticated_encryption(&gcm_test_case_4); 9000 } 9001 9002 static int 9003 test_AES_GCM_authenticated_encryption_test_case_5(void) 9004 { 9005 return test_authenticated_encryption(&gcm_test_case_5); 9006 } 9007 9008 static int 9009 test_AES_GCM_authenticated_encryption_test_case_6(void) 9010 { 9011 return test_authenticated_encryption(&gcm_test_case_6); 9012 } 9013 9014 static int 9015 test_AES_GCM_authenticated_encryption_test_case_7(void) 9016 { 9017 return test_authenticated_encryption(&gcm_test_case_7); 9018 } 9019 9020 static int 9021 test_AES_GCM_authenticated_encryption_test_case_8(void) 9022 { 9023 return test_authenticated_encryption(&gcm_test_case_8); 9024 } 9025 9026 static int 9027 test_AES_GCM_J0_authenticated_encryption_test_case_1(void) 9028 { 9029 return test_authenticated_encryption(&gcm_J0_test_case_1); 9030 } 9031 9032 static int 9033 test_AES_GCM_auth_encryption_test_case_192_1(void) 9034 { 9035 return test_authenticated_encryption(&gcm_test_case_192_1); 9036 } 9037 9038 static int 9039 test_AES_GCM_auth_encryption_test_case_192_2(void) 9040 { 9041 return test_authenticated_encryption(&gcm_test_case_192_2); 9042 } 9043 9044 static int 9045 test_AES_GCM_auth_encryption_test_case_192_3(void) 9046 { 9047 return test_authenticated_encryption(&gcm_test_case_192_3); 9048 } 9049 9050 static int 9051 test_AES_GCM_auth_encryption_test_case_192_4(void) 9052 { 9053 return test_authenticated_encryption(&gcm_test_case_192_4); 9054 } 9055 9056 static int 9057 test_AES_GCM_auth_encryption_test_case_192_5(void) 9058 { 9059 return test_authenticated_encryption(&gcm_test_case_192_5); 9060 } 9061 9062 static int 9063 test_AES_GCM_auth_encryption_test_case_192_6(void) 9064 { 9065 return test_authenticated_encryption(&gcm_test_case_192_6); 9066 } 9067 9068 static int 9069 test_AES_GCM_auth_encryption_test_case_192_7(void) 9070 { 9071 return test_authenticated_encryption(&gcm_test_case_192_7); 9072 } 9073 9074 static int 9075 test_AES_GCM_auth_encryption_test_case_256_1(void) 9076 { 9077 return test_authenticated_encryption(&gcm_test_case_256_1); 9078 } 9079 9080 static int 9081 test_AES_GCM_auth_encryption_test_case_256_2(void) 9082 { 9083 return test_authenticated_encryption(&gcm_test_case_256_2); 9084 } 9085 9086 static int 9087 test_AES_GCM_auth_encryption_test_case_256_3(void) 9088 { 9089 return test_authenticated_encryption(&gcm_test_case_256_3); 9090 } 9091 9092 static int 9093 test_AES_GCM_auth_encryption_test_case_256_4(void) 9094 { 9095 return test_authenticated_encryption(&gcm_test_case_256_4); 9096 } 9097 9098 static int 9099 test_AES_GCM_auth_encryption_test_case_256_5(void) 9100 { 9101 return test_authenticated_encryption(&gcm_test_case_256_5); 9102 } 9103 9104 static int 9105 test_AES_GCM_auth_encryption_test_case_256_6(void) 9106 { 9107 return test_authenticated_encryption(&gcm_test_case_256_6); 9108 } 9109 9110 static int 9111 test_AES_GCM_auth_encryption_test_case_256_7(void) 9112 { 9113 return test_authenticated_encryption(&gcm_test_case_256_7); 9114 } 9115 9116 static int 9117 test_AES_GCM_auth_encryption_test_case_aad_1(void) 9118 { 9119 return test_authenticated_encryption(&gcm_test_case_aad_1); 9120 } 9121 9122 static int 9123 test_AES_GCM_auth_encryption_test_case_aad_2(void) 9124 { 9125 return test_authenticated_encryption(&gcm_test_case_aad_2); 9126 } 9127 9128 static int 9129 test_AES_GCM_auth_encryption_fail_iv_corrupt(void) 9130 { 9131 struct aead_test_data tdata; 9132 int res; 9133 9134 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9135 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9136 tdata.iv.data[0] += 1; 9137 res = test_authenticated_encryption(&tdata); 9138 if (res == -ENOTSUP) 9139 return res; 9140 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9141 return TEST_SUCCESS; 9142 } 9143 9144 static int 9145 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void) 9146 { 9147 struct aead_test_data tdata; 9148 int res; 9149 9150 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9151 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9152 tdata.plaintext.data[0] += 1; 9153 res = test_authenticated_encryption(&tdata); 9154 if (res == -ENOTSUP) 9155 return res; 9156 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9157 return TEST_SUCCESS; 9158 } 9159 9160 static int 9161 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void) 9162 { 9163 struct aead_test_data tdata; 9164 int res; 9165 9166 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9167 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9168 tdata.ciphertext.data[0] += 1; 9169 res = test_authenticated_encryption(&tdata); 9170 if (res == -ENOTSUP) 9171 return res; 9172 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9173 return TEST_SUCCESS; 9174 } 9175 9176 static int 9177 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void) 9178 { 9179 struct aead_test_data tdata; 9180 int res; 9181 9182 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9183 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9184 tdata.aad.len += 1; 9185 res = test_authenticated_encryption(&tdata); 9186 if (res == -ENOTSUP) 9187 return res; 9188 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9189 return TEST_SUCCESS; 9190 } 9191 9192 static int 9193 test_AES_GCM_auth_encryption_fail_aad_corrupt(void) 9194 { 9195 struct aead_test_data tdata; 9196 uint8_t aad[gcm_test_case_7.aad.len]; 9197 int res; 9198 9199 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9200 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9201 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9202 aad[0] += 1; 9203 tdata.aad.data = aad; 9204 res = test_authenticated_encryption(&tdata); 9205 if (res == -ENOTSUP) 9206 return res; 9207 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9208 return TEST_SUCCESS; 9209 } 9210 9211 static int 9212 test_AES_GCM_auth_encryption_fail_tag_corrupt(void) 9213 { 9214 struct aead_test_data tdata; 9215 int res; 9216 9217 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9218 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9219 tdata.auth_tag.data[0] += 1; 9220 res = test_authenticated_encryption(&tdata); 9221 if (res == -ENOTSUP) 9222 return res; 9223 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed"); 9224 return TEST_SUCCESS; 9225 } 9226 9227 static int 9228 test_authenticated_decryption(const struct aead_test_data *tdata) 9229 { 9230 struct crypto_testsuite_params *ts_params = &testsuite_params; 9231 struct crypto_unittest_params *ut_params = &unittest_params; 9232 9233 int retval; 9234 uint8_t *plaintext; 9235 uint32_t i; 9236 struct rte_cryptodev_info dev_info; 9237 9238 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9239 uint64_t feat_flags = dev_info.feature_flags; 9240 9241 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9242 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9243 printf("Device doesn't support RAW data-path APIs.\n"); 9244 return -ENOTSUP; 9245 } 9246 9247 /* Verify the capabilities */ 9248 struct rte_cryptodev_sym_capability_idx cap_idx; 9249 const struct rte_cryptodev_symmetric_capability *capability; 9250 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9251 cap_idx.algo.aead = tdata->algo; 9252 capability = rte_cryptodev_sym_capability_get( 9253 ts_params->valid_devs[0], &cap_idx); 9254 if (capability == NULL) 9255 return -ENOTSUP; 9256 if (rte_cryptodev_sym_capability_check_aead( 9257 capability, tdata->key.len, tdata->auth_tag.len, 9258 tdata->aad.len, tdata->iv.len)) 9259 return -ENOTSUP; 9260 9261 /* Create AEAD session */ 9262 retval = create_aead_session(ts_params->valid_devs[0], 9263 tdata->algo, 9264 RTE_CRYPTO_AEAD_OP_DECRYPT, 9265 tdata->key.data, tdata->key.len, 9266 tdata->aad.len, tdata->auth_tag.len, 9267 tdata->iv.len); 9268 if (retval < 0) 9269 return retval; 9270 9271 /* alloc mbuf and set payload */ 9272 if (tdata->aad.len > MBUF_SIZE) { 9273 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 9274 /* Populate full size of add data */ 9275 for (i = 32; i < MAX_AAD_LENGTH; i += 32) 9276 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32); 9277 } else 9278 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9279 9280 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9281 rte_pktmbuf_tailroom(ut_params->ibuf)); 9282 9283 /* Create AEAD operation */ 9284 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 9285 if (retval < 0) 9286 return retval; 9287 9288 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9289 9290 ut_params->op->sym->m_src = ut_params->ibuf; 9291 9292 /* Process crypto operation */ 9293 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9294 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 9295 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9296 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 9297 ut_params->op, 0, 0, 0, 0); 9298 else 9299 TEST_ASSERT_NOT_NULL( 9300 process_crypto_request(ts_params->valid_devs[0], 9301 ut_params->op), "failed to process sym crypto op"); 9302 9303 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9304 "crypto op processing failed"); 9305 9306 if (ut_params->op->sym->m_dst) 9307 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst, 9308 uint8_t *); 9309 else 9310 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 9311 uint8_t *, 9312 ut_params->op->sym->cipher.data.offset); 9313 9314 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 9315 9316 /* Validate obuf */ 9317 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9318 plaintext, 9319 tdata->plaintext.data, 9320 tdata->plaintext.len, 9321 "Plaintext data not as expected"); 9322 9323 TEST_ASSERT_EQUAL(ut_params->op->status, 9324 RTE_CRYPTO_OP_STATUS_SUCCESS, 9325 "Authentication failed"); 9326 9327 return 0; 9328 } 9329 9330 static int 9331 test_AES_GCM_authenticated_decryption_test_case_1(void) 9332 { 9333 return test_authenticated_decryption(&gcm_test_case_1); 9334 } 9335 9336 static int 9337 test_AES_GCM_authenticated_decryption_test_case_2(void) 9338 { 9339 return test_authenticated_decryption(&gcm_test_case_2); 9340 } 9341 9342 static int 9343 test_AES_GCM_authenticated_decryption_test_case_3(void) 9344 { 9345 return test_authenticated_decryption(&gcm_test_case_3); 9346 } 9347 9348 static int 9349 test_AES_GCM_authenticated_decryption_test_case_4(void) 9350 { 9351 return test_authenticated_decryption(&gcm_test_case_4); 9352 } 9353 9354 static int 9355 test_AES_GCM_authenticated_decryption_test_case_5(void) 9356 { 9357 return test_authenticated_decryption(&gcm_test_case_5); 9358 } 9359 9360 static int 9361 test_AES_GCM_authenticated_decryption_test_case_6(void) 9362 { 9363 return test_authenticated_decryption(&gcm_test_case_6); 9364 } 9365 9366 static int 9367 test_AES_GCM_authenticated_decryption_test_case_7(void) 9368 { 9369 return test_authenticated_decryption(&gcm_test_case_7); 9370 } 9371 9372 static int 9373 test_AES_GCM_authenticated_decryption_test_case_8(void) 9374 { 9375 return test_authenticated_decryption(&gcm_test_case_8); 9376 } 9377 9378 static int 9379 test_AES_GCM_J0_authenticated_decryption_test_case_1(void) 9380 { 9381 return test_authenticated_decryption(&gcm_J0_test_case_1); 9382 } 9383 9384 static int 9385 test_AES_GCM_auth_decryption_test_case_192_1(void) 9386 { 9387 return test_authenticated_decryption(&gcm_test_case_192_1); 9388 } 9389 9390 static int 9391 test_AES_GCM_auth_decryption_test_case_192_2(void) 9392 { 9393 return test_authenticated_decryption(&gcm_test_case_192_2); 9394 } 9395 9396 static int 9397 test_AES_GCM_auth_decryption_test_case_192_3(void) 9398 { 9399 return test_authenticated_decryption(&gcm_test_case_192_3); 9400 } 9401 9402 static int 9403 test_AES_GCM_auth_decryption_test_case_192_4(void) 9404 { 9405 return test_authenticated_decryption(&gcm_test_case_192_4); 9406 } 9407 9408 static int 9409 test_AES_GCM_auth_decryption_test_case_192_5(void) 9410 { 9411 return test_authenticated_decryption(&gcm_test_case_192_5); 9412 } 9413 9414 static int 9415 test_AES_GCM_auth_decryption_test_case_192_6(void) 9416 { 9417 return test_authenticated_decryption(&gcm_test_case_192_6); 9418 } 9419 9420 static int 9421 test_AES_GCM_auth_decryption_test_case_192_7(void) 9422 { 9423 return test_authenticated_decryption(&gcm_test_case_192_7); 9424 } 9425 9426 static int 9427 test_AES_GCM_auth_decryption_test_case_256_1(void) 9428 { 9429 return test_authenticated_decryption(&gcm_test_case_256_1); 9430 } 9431 9432 static int 9433 test_AES_GCM_auth_decryption_test_case_256_2(void) 9434 { 9435 return test_authenticated_decryption(&gcm_test_case_256_2); 9436 } 9437 9438 static int 9439 test_AES_GCM_auth_decryption_test_case_256_3(void) 9440 { 9441 return test_authenticated_decryption(&gcm_test_case_256_3); 9442 } 9443 9444 static int 9445 test_AES_GCM_auth_decryption_test_case_256_4(void) 9446 { 9447 return test_authenticated_decryption(&gcm_test_case_256_4); 9448 } 9449 9450 static int 9451 test_AES_GCM_auth_decryption_test_case_256_5(void) 9452 { 9453 return test_authenticated_decryption(&gcm_test_case_256_5); 9454 } 9455 9456 static int 9457 test_AES_GCM_auth_decryption_test_case_256_6(void) 9458 { 9459 return test_authenticated_decryption(&gcm_test_case_256_6); 9460 } 9461 9462 static int 9463 test_AES_GCM_auth_decryption_test_case_256_7(void) 9464 { 9465 return test_authenticated_decryption(&gcm_test_case_256_7); 9466 } 9467 9468 static int 9469 test_AES_GCM_auth_decryption_test_case_aad_1(void) 9470 { 9471 return test_authenticated_decryption(&gcm_test_case_aad_1); 9472 } 9473 9474 static int 9475 test_AES_GCM_auth_decryption_test_case_aad_2(void) 9476 { 9477 return test_authenticated_decryption(&gcm_test_case_aad_2); 9478 } 9479 9480 static int 9481 test_AES_GCM_auth_decryption_fail_iv_corrupt(void) 9482 { 9483 struct aead_test_data tdata; 9484 int res; 9485 9486 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9487 tdata.iv.data[0] += 1; 9488 res = test_authenticated_decryption(&tdata); 9489 if (res == -ENOTSUP) 9490 return res; 9491 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9492 return TEST_SUCCESS; 9493 } 9494 9495 static int 9496 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void) 9497 { 9498 struct aead_test_data tdata; 9499 int res; 9500 9501 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n"); 9502 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9503 tdata.plaintext.data[0] += 1; 9504 res = test_authenticated_decryption(&tdata); 9505 if (res == -ENOTSUP) 9506 return res; 9507 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9508 return TEST_SUCCESS; 9509 } 9510 9511 static int 9512 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void) 9513 { 9514 struct aead_test_data tdata; 9515 int res; 9516 9517 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9518 tdata.ciphertext.data[0] += 1; 9519 res = test_authenticated_decryption(&tdata); 9520 if (res == -ENOTSUP) 9521 return res; 9522 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9523 return TEST_SUCCESS; 9524 } 9525 9526 static int 9527 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void) 9528 { 9529 struct aead_test_data tdata; 9530 int res; 9531 9532 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9533 tdata.aad.len += 1; 9534 res = test_authenticated_decryption(&tdata); 9535 if (res == -ENOTSUP) 9536 return res; 9537 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9538 return TEST_SUCCESS; 9539 } 9540 9541 static int 9542 test_AES_GCM_auth_decryption_fail_aad_corrupt(void) 9543 { 9544 struct aead_test_data tdata; 9545 uint8_t aad[gcm_test_case_7.aad.len]; 9546 int res; 9547 9548 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9549 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len); 9550 aad[0] += 1; 9551 tdata.aad.data = aad; 9552 res = test_authenticated_decryption(&tdata); 9553 if (res == -ENOTSUP) 9554 return res; 9555 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed"); 9556 return TEST_SUCCESS; 9557 } 9558 9559 static int 9560 test_AES_GCM_auth_decryption_fail_tag_corrupt(void) 9561 { 9562 struct aead_test_data tdata; 9563 int res; 9564 9565 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data)); 9566 tdata.auth_tag.data[0] += 1; 9567 res = test_authenticated_decryption(&tdata); 9568 if (res == -ENOTSUP) 9569 return res; 9570 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed"); 9571 return TEST_SUCCESS; 9572 } 9573 9574 static int 9575 test_authenticated_encryption_oop(const struct aead_test_data *tdata) 9576 { 9577 struct crypto_testsuite_params *ts_params = &testsuite_params; 9578 struct crypto_unittest_params *ut_params = &unittest_params; 9579 9580 int retval; 9581 uint8_t *ciphertext, *auth_tag; 9582 uint16_t plaintext_pad_len; 9583 9584 /* Verify the capabilities */ 9585 struct rte_cryptodev_sym_capability_idx cap_idx; 9586 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9587 cap_idx.algo.aead = tdata->algo; 9588 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9589 &cap_idx) == NULL) 9590 return -ENOTSUP; 9591 9592 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9593 return -ENOTSUP; 9594 9595 /* not supported with CPU crypto */ 9596 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9597 return -ENOTSUP; 9598 9599 /* Create AEAD session */ 9600 retval = create_aead_session(ts_params->valid_devs[0], 9601 tdata->algo, 9602 RTE_CRYPTO_AEAD_OP_ENCRYPT, 9603 tdata->key.data, tdata->key.len, 9604 tdata->aad.len, tdata->auth_tag.len, 9605 tdata->iv.len); 9606 if (retval < 0) 9607 return retval; 9608 9609 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9610 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9611 9612 /* clear mbuf payload */ 9613 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9614 rte_pktmbuf_tailroom(ut_params->ibuf)); 9615 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 9616 rte_pktmbuf_tailroom(ut_params->obuf)); 9617 9618 /* Create AEAD operation */ 9619 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 9620 if (retval < 0) 9621 return retval; 9622 9623 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9624 9625 ut_params->op->sym->m_src = ut_params->ibuf; 9626 ut_params->op->sym->m_dst = ut_params->obuf; 9627 9628 /* Process crypto operation */ 9629 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 9630 ut_params->op), "failed to process sym crypto op"); 9631 9632 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9633 "crypto op processing failed"); 9634 9635 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9636 9637 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 9638 ut_params->op->sym->cipher.data.offset); 9639 auth_tag = ciphertext + plaintext_pad_len; 9640 9641 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 9642 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 9643 9644 /* Validate obuf */ 9645 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9646 ciphertext, 9647 tdata->ciphertext.data, 9648 tdata->ciphertext.len, 9649 "Ciphertext data not as expected"); 9650 9651 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9652 auth_tag, 9653 tdata->auth_tag.data, 9654 tdata->auth_tag.len, 9655 "Generated auth tag not as expected"); 9656 9657 return 0; 9658 9659 } 9660 9661 static int 9662 test_AES_GCM_authenticated_encryption_oop_test_case_1(void) 9663 { 9664 return test_authenticated_encryption_oop(&gcm_test_case_5); 9665 } 9666 9667 static int 9668 test_authenticated_decryption_oop(const struct aead_test_data *tdata) 9669 { 9670 struct crypto_testsuite_params *ts_params = &testsuite_params; 9671 struct crypto_unittest_params *ut_params = &unittest_params; 9672 9673 int retval; 9674 uint8_t *plaintext; 9675 9676 /* Verify the capabilities */ 9677 struct rte_cryptodev_sym_capability_idx cap_idx; 9678 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9679 cap_idx.algo.aead = tdata->algo; 9680 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9681 &cap_idx) == NULL) 9682 return -ENOTSUP; 9683 9684 /* not supported with CPU crypto and raw data-path APIs*/ 9685 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO || 9686 global_api_test_type == CRYPTODEV_RAW_API_TEST) 9687 return -ENOTSUP; 9688 9689 /* Create AEAD session */ 9690 retval = create_aead_session(ts_params->valid_devs[0], 9691 tdata->algo, 9692 RTE_CRYPTO_AEAD_OP_DECRYPT, 9693 tdata->key.data, tdata->key.len, 9694 tdata->aad.len, tdata->auth_tag.len, 9695 tdata->iv.len); 9696 if (retval < 0) 9697 return retval; 9698 9699 /* alloc mbuf and set payload */ 9700 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9701 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9702 9703 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9704 rte_pktmbuf_tailroom(ut_params->ibuf)); 9705 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0, 9706 rte_pktmbuf_tailroom(ut_params->obuf)); 9707 9708 /* Create AEAD operation */ 9709 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 9710 if (retval < 0) 9711 return retval; 9712 9713 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 9714 9715 ut_params->op->sym->m_src = ut_params->ibuf; 9716 ut_params->op->sym->m_dst = ut_params->obuf; 9717 9718 /* Process crypto operation */ 9719 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 9720 ut_params->op), "failed to process sym crypto op"); 9721 9722 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9723 "crypto op processing failed"); 9724 9725 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *, 9726 ut_params->op->sym->cipher.data.offset); 9727 9728 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 9729 9730 /* Validate obuf */ 9731 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9732 plaintext, 9733 tdata->plaintext.data, 9734 tdata->plaintext.len, 9735 "Plaintext data not as expected"); 9736 9737 TEST_ASSERT_EQUAL(ut_params->op->status, 9738 RTE_CRYPTO_OP_STATUS_SUCCESS, 9739 "Authentication failed"); 9740 return 0; 9741 } 9742 9743 static int 9744 test_AES_GCM_authenticated_decryption_oop_test_case_1(void) 9745 { 9746 return test_authenticated_decryption_oop(&gcm_test_case_5); 9747 } 9748 9749 static int 9750 test_authenticated_encryption_sessionless( 9751 const struct aead_test_data *tdata) 9752 { 9753 struct crypto_testsuite_params *ts_params = &testsuite_params; 9754 struct crypto_unittest_params *ut_params = &unittest_params; 9755 9756 int retval; 9757 uint8_t *ciphertext, *auth_tag; 9758 uint16_t plaintext_pad_len; 9759 uint8_t key[tdata->key.len + 1]; 9760 struct rte_cryptodev_info dev_info; 9761 9762 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9763 uint64_t feat_flags = dev_info.feature_flags; 9764 9765 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 9766 printf("Device doesn't support Sessionless ops.\n"); 9767 return -ENOTSUP; 9768 } 9769 9770 /* not supported with CPU crypto */ 9771 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9772 return -ENOTSUP; 9773 9774 /* Verify the capabilities */ 9775 struct rte_cryptodev_sym_capability_idx cap_idx; 9776 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9777 cap_idx.algo.aead = tdata->algo; 9778 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9779 &cap_idx) == NULL) 9780 return -ENOTSUP; 9781 9782 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9783 9784 /* clear mbuf payload */ 9785 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9786 rte_pktmbuf_tailroom(ut_params->ibuf)); 9787 9788 /* Create AEAD operation */ 9789 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata); 9790 if (retval < 0) 9791 return retval; 9792 9793 /* Create GCM xform */ 9794 memcpy(key, tdata->key.data, tdata->key.len); 9795 retval = create_aead_xform(ut_params->op, 9796 tdata->algo, 9797 RTE_CRYPTO_AEAD_OP_ENCRYPT, 9798 key, tdata->key.len, 9799 tdata->aad.len, tdata->auth_tag.len, 9800 tdata->iv.len); 9801 if (retval < 0) 9802 return retval; 9803 9804 ut_params->op->sym->m_src = ut_params->ibuf; 9805 9806 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 9807 RTE_CRYPTO_OP_SESSIONLESS, 9808 "crypto op session type not sessionless"); 9809 9810 /* Process crypto operation */ 9811 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0], 9812 ut_params->op), "failed to process sym crypto op"); 9813 9814 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 9815 9816 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9817 "crypto op status not success"); 9818 9819 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 9820 9821 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 9822 ut_params->op->sym->cipher.data.offset); 9823 auth_tag = ciphertext + plaintext_pad_len; 9824 9825 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len); 9826 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len); 9827 9828 /* Validate obuf */ 9829 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9830 ciphertext, 9831 tdata->ciphertext.data, 9832 tdata->ciphertext.len, 9833 "Ciphertext data not as expected"); 9834 9835 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9836 auth_tag, 9837 tdata->auth_tag.data, 9838 tdata->auth_tag.len, 9839 "Generated auth tag not as expected"); 9840 9841 return 0; 9842 9843 } 9844 9845 static int 9846 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void) 9847 { 9848 return test_authenticated_encryption_sessionless( 9849 &gcm_test_case_5); 9850 } 9851 9852 static int 9853 test_authenticated_decryption_sessionless( 9854 const struct aead_test_data *tdata) 9855 { 9856 struct crypto_testsuite_params *ts_params = &testsuite_params; 9857 struct crypto_unittest_params *ut_params = &unittest_params; 9858 9859 int retval; 9860 uint8_t *plaintext; 9861 uint8_t key[tdata->key.len + 1]; 9862 struct rte_cryptodev_info dev_info; 9863 9864 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 9865 uint64_t feat_flags = dev_info.feature_flags; 9866 9867 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) { 9868 printf("Device doesn't support Sessionless ops.\n"); 9869 return -ENOTSUP; 9870 } 9871 9872 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 9873 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 9874 printf("Device doesn't support RAW data-path APIs.\n"); 9875 return -ENOTSUP; 9876 } 9877 9878 /* not supported with CPU crypto */ 9879 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 9880 return -ENOTSUP; 9881 9882 /* Verify the capabilities */ 9883 struct rte_cryptodev_sym_capability_idx cap_idx; 9884 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 9885 cap_idx.algo.aead = tdata->algo; 9886 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 9887 &cap_idx) == NULL) 9888 return -ENOTSUP; 9889 9890 /* alloc mbuf and set payload */ 9891 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 9892 9893 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 9894 rte_pktmbuf_tailroom(ut_params->ibuf)); 9895 9896 /* Create AEAD operation */ 9897 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata); 9898 if (retval < 0) 9899 return retval; 9900 9901 /* Create AEAD xform */ 9902 memcpy(key, tdata->key.data, tdata->key.len); 9903 retval = create_aead_xform(ut_params->op, 9904 tdata->algo, 9905 RTE_CRYPTO_AEAD_OP_DECRYPT, 9906 key, tdata->key.len, 9907 tdata->aad.len, tdata->auth_tag.len, 9908 tdata->iv.len); 9909 if (retval < 0) 9910 return retval; 9911 9912 ut_params->op->sym->m_src = ut_params->ibuf; 9913 9914 TEST_ASSERT_EQUAL(ut_params->op->sess_type, 9915 RTE_CRYPTO_OP_SESSIONLESS, 9916 "crypto op session type not sessionless"); 9917 9918 /* Process crypto operation */ 9919 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 9920 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 9921 ut_params->op, 0, 0, 0, 0); 9922 else 9923 TEST_ASSERT_NOT_NULL(process_crypto_request( 9924 ts_params->valid_devs[0], ut_params->op), 9925 "failed to process sym crypto op"); 9926 9927 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 9928 9929 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 9930 "crypto op status not success"); 9931 9932 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 9933 ut_params->op->sym->cipher.data.offset); 9934 9935 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len); 9936 9937 /* Validate obuf */ 9938 TEST_ASSERT_BUFFERS_ARE_EQUAL( 9939 plaintext, 9940 tdata->plaintext.data, 9941 tdata->plaintext.len, 9942 "Plaintext data not as expected"); 9943 9944 TEST_ASSERT_EQUAL(ut_params->op->status, 9945 RTE_CRYPTO_OP_STATUS_SUCCESS, 9946 "Authentication failed"); 9947 return 0; 9948 } 9949 9950 static int 9951 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void) 9952 { 9953 return test_authenticated_decryption_sessionless( 9954 &gcm_test_case_5); 9955 } 9956 9957 static int 9958 test_AES_CCM_authenticated_encryption_test_case_128_1(void) 9959 { 9960 return test_authenticated_encryption(&ccm_test_case_128_1); 9961 } 9962 9963 static int 9964 test_AES_CCM_authenticated_encryption_test_case_128_2(void) 9965 { 9966 return test_authenticated_encryption(&ccm_test_case_128_2); 9967 } 9968 9969 static int 9970 test_AES_CCM_authenticated_encryption_test_case_128_3(void) 9971 { 9972 return test_authenticated_encryption(&ccm_test_case_128_3); 9973 } 9974 9975 static int 9976 test_AES_CCM_authenticated_decryption_test_case_128_1(void) 9977 { 9978 return test_authenticated_decryption(&ccm_test_case_128_1); 9979 } 9980 9981 static int 9982 test_AES_CCM_authenticated_decryption_test_case_128_2(void) 9983 { 9984 return test_authenticated_decryption(&ccm_test_case_128_2); 9985 } 9986 9987 static int 9988 test_AES_CCM_authenticated_decryption_test_case_128_3(void) 9989 { 9990 return test_authenticated_decryption(&ccm_test_case_128_3); 9991 } 9992 9993 static int 9994 test_AES_CCM_authenticated_encryption_test_case_192_1(void) 9995 { 9996 return test_authenticated_encryption(&ccm_test_case_192_1); 9997 } 9998 9999 static int 10000 test_AES_CCM_authenticated_encryption_test_case_192_2(void) 10001 { 10002 return test_authenticated_encryption(&ccm_test_case_192_2); 10003 } 10004 10005 static int 10006 test_AES_CCM_authenticated_encryption_test_case_192_3(void) 10007 { 10008 return test_authenticated_encryption(&ccm_test_case_192_3); 10009 } 10010 10011 static int 10012 test_AES_CCM_authenticated_decryption_test_case_192_1(void) 10013 { 10014 return test_authenticated_decryption(&ccm_test_case_192_1); 10015 } 10016 10017 static int 10018 test_AES_CCM_authenticated_decryption_test_case_192_2(void) 10019 { 10020 return test_authenticated_decryption(&ccm_test_case_192_2); 10021 } 10022 10023 static int 10024 test_AES_CCM_authenticated_decryption_test_case_192_3(void) 10025 { 10026 return test_authenticated_decryption(&ccm_test_case_192_3); 10027 } 10028 10029 static int 10030 test_AES_CCM_authenticated_encryption_test_case_256_1(void) 10031 { 10032 return test_authenticated_encryption(&ccm_test_case_256_1); 10033 } 10034 10035 static int 10036 test_AES_CCM_authenticated_encryption_test_case_256_2(void) 10037 { 10038 return test_authenticated_encryption(&ccm_test_case_256_2); 10039 } 10040 10041 static int 10042 test_AES_CCM_authenticated_encryption_test_case_256_3(void) 10043 { 10044 return test_authenticated_encryption(&ccm_test_case_256_3); 10045 } 10046 10047 static int 10048 test_AES_CCM_authenticated_decryption_test_case_256_1(void) 10049 { 10050 return test_authenticated_decryption(&ccm_test_case_256_1); 10051 } 10052 10053 static int 10054 test_AES_CCM_authenticated_decryption_test_case_256_2(void) 10055 { 10056 return test_authenticated_decryption(&ccm_test_case_256_2); 10057 } 10058 10059 static int 10060 test_AES_CCM_authenticated_decryption_test_case_256_3(void) 10061 { 10062 return test_authenticated_decryption(&ccm_test_case_256_3); 10063 } 10064 10065 static int 10066 test_stats(void) 10067 { 10068 struct crypto_testsuite_params *ts_params = &testsuite_params; 10069 struct rte_cryptodev_stats stats; 10070 10071 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10072 return -ENOTSUP; 10073 10074 /* Verify the capabilities */ 10075 struct rte_cryptodev_sym_capability_idx cap_idx; 10076 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10077 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC; 10078 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10079 &cap_idx) == NULL) 10080 return -ENOTSUP; 10081 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10082 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10083 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10084 &cap_idx) == NULL) 10085 return -ENOTSUP; 10086 10087 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats) 10088 == -ENOTSUP) 10089 return -ENOTSUP; 10090 10091 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10092 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600, 10093 &stats) == -ENODEV), 10094 "rte_cryptodev_stats_get invalid dev failed"); 10095 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0), 10096 "rte_cryptodev_stats_get invalid Param failed"); 10097 10098 /* Test expected values */ 10099 test_AES_CBC_HMAC_SHA1_encrypt_digest(); 10100 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10101 &stats), 10102 "rte_cryptodev_stats_get failed"); 10103 TEST_ASSERT((stats.enqueued_count == 1), 10104 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10105 TEST_ASSERT((stats.dequeued_count == 1), 10106 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10107 TEST_ASSERT((stats.enqueue_err_count == 0), 10108 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10109 TEST_ASSERT((stats.dequeue_err_count == 0), 10110 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10111 10112 /* invalid device but should ignore and not reset device stats*/ 10113 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300); 10114 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10115 &stats), 10116 "rte_cryptodev_stats_get failed"); 10117 TEST_ASSERT((stats.enqueued_count == 1), 10118 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10119 10120 /* check that a valid reset clears stats */ 10121 rte_cryptodev_stats_reset(ts_params->valid_devs[0]); 10122 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0], 10123 &stats), 10124 "rte_cryptodev_stats_get failed"); 10125 TEST_ASSERT((stats.enqueued_count == 0), 10126 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10127 TEST_ASSERT((stats.dequeued_count == 0), 10128 "rte_cryptodev_stats_get returned unexpected enqueued stat"); 10129 10130 return TEST_SUCCESS; 10131 } 10132 10133 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params, 10134 struct crypto_unittest_params *ut_params, 10135 enum rte_crypto_auth_operation op, 10136 const struct HMAC_MD5_vector *test_case) 10137 { 10138 uint8_t key[64]; 10139 10140 memcpy(key, test_case->key.data, test_case->key.len); 10141 10142 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10143 ut_params->auth_xform.next = NULL; 10144 ut_params->auth_xform.auth.op = op; 10145 10146 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC; 10147 10148 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN; 10149 ut_params->auth_xform.auth.key.length = test_case->key.len; 10150 ut_params->auth_xform.auth.key.data = key; 10151 10152 ut_params->sess = rte_cryptodev_sym_session_create( 10153 ts_params->session_mpool); 10154 10155 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10156 ut_params->sess, &ut_params->auth_xform, 10157 ts_params->session_priv_mpool); 10158 10159 if (ut_params->sess == NULL) 10160 return TEST_FAILED; 10161 10162 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10163 10164 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10165 rte_pktmbuf_tailroom(ut_params->ibuf)); 10166 10167 return 0; 10168 } 10169 10170 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params, 10171 const struct HMAC_MD5_vector *test_case, 10172 uint8_t **plaintext) 10173 { 10174 uint16_t plaintext_pad_len; 10175 10176 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 10177 10178 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10179 16); 10180 10181 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10182 plaintext_pad_len); 10183 memcpy(*plaintext, test_case->plaintext.data, 10184 test_case->plaintext.len); 10185 10186 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10187 ut_params->ibuf, MD5_DIGEST_LEN); 10188 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10189 "no room to append digest"); 10190 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10191 ut_params->ibuf, plaintext_pad_len); 10192 10193 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10194 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data, 10195 test_case->auth_tag.len); 10196 } 10197 10198 sym_op->auth.data.offset = 0; 10199 sym_op->auth.data.length = test_case->plaintext.len; 10200 10201 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10202 ut_params->op->sym->m_src = ut_params->ibuf; 10203 10204 return 0; 10205 } 10206 10207 static int 10208 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case) 10209 { 10210 uint16_t plaintext_pad_len; 10211 uint8_t *plaintext, *auth_tag; 10212 10213 struct crypto_testsuite_params *ts_params = &testsuite_params; 10214 struct crypto_unittest_params *ut_params = &unittest_params; 10215 struct rte_cryptodev_info dev_info; 10216 10217 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10218 uint64_t feat_flags = dev_info.feature_flags; 10219 10220 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10221 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10222 printf("Device doesn't support RAW data-path APIs.\n"); 10223 return -ENOTSUP; 10224 } 10225 10226 /* Verify the capabilities */ 10227 struct rte_cryptodev_sym_capability_idx cap_idx; 10228 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10229 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10230 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10231 &cap_idx) == NULL) 10232 return -ENOTSUP; 10233 10234 if (MD5_HMAC_create_session(ts_params, ut_params, 10235 RTE_CRYPTO_AUTH_OP_GENERATE, test_case)) 10236 return TEST_FAILED; 10237 10238 /* Generate Crypto op data structure */ 10239 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10240 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10241 TEST_ASSERT_NOT_NULL(ut_params->op, 10242 "Failed to allocate symmetric crypto operation struct"); 10243 10244 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len, 10245 16); 10246 10247 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10248 return TEST_FAILED; 10249 10250 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10251 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10252 ut_params->op); 10253 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10254 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10255 ut_params->op, 0, 1, 0, 0); 10256 else 10257 TEST_ASSERT_NOT_NULL( 10258 process_crypto_request(ts_params->valid_devs[0], 10259 ut_params->op), 10260 "failed to process sym crypto op"); 10261 10262 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10263 "crypto op processing failed"); 10264 10265 if (ut_params->op->sym->m_dst) { 10266 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 10267 uint8_t *, plaintext_pad_len); 10268 } else { 10269 auth_tag = plaintext + plaintext_pad_len; 10270 } 10271 10272 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10273 auth_tag, 10274 test_case->auth_tag.data, 10275 test_case->auth_tag.len, 10276 "HMAC_MD5 generated tag not as expected"); 10277 10278 return TEST_SUCCESS; 10279 } 10280 10281 static int 10282 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case) 10283 { 10284 uint8_t *plaintext; 10285 10286 struct crypto_testsuite_params *ts_params = &testsuite_params; 10287 struct crypto_unittest_params *ut_params = &unittest_params; 10288 struct rte_cryptodev_info dev_info; 10289 10290 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10291 uint64_t feat_flags = dev_info.feature_flags; 10292 10293 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10294 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10295 printf("Device doesn't support RAW data-path APIs.\n"); 10296 return -ENOTSUP; 10297 } 10298 10299 /* Verify the capabilities */ 10300 struct rte_cryptodev_sym_capability_idx cap_idx; 10301 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10302 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC; 10303 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10304 &cap_idx) == NULL) 10305 return -ENOTSUP; 10306 10307 if (MD5_HMAC_create_session(ts_params, ut_params, 10308 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) { 10309 return TEST_FAILED; 10310 } 10311 10312 /* Generate Crypto op data structure */ 10313 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10314 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10315 TEST_ASSERT_NOT_NULL(ut_params->op, 10316 "Failed to allocate symmetric crypto operation struct"); 10317 10318 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext)) 10319 return TEST_FAILED; 10320 10321 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10322 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10323 ut_params->op); 10324 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10325 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10326 ut_params->op, 0, 1, 0, 0); 10327 else 10328 TEST_ASSERT_NOT_NULL( 10329 process_crypto_request(ts_params->valid_devs[0], 10330 ut_params->op), 10331 "failed to process sym crypto op"); 10332 10333 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10334 "HMAC_MD5 crypto op processing failed"); 10335 10336 return TEST_SUCCESS; 10337 } 10338 10339 static int 10340 test_MD5_HMAC_generate_case_1(void) 10341 { 10342 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1); 10343 } 10344 10345 static int 10346 test_MD5_HMAC_verify_case_1(void) 10347 { 10348 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1); 10349 } 10350 10351 static int 10352 test_MD5_HMAC_generate_case_2(void) 10353 { 10354 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2); 10355 } 10356 10357 static int 10358 test_MD5_HMAC_verify_case_2(void) 10359 { 10360 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2); 10361 } 10362 10363 static int 10364 test_multi_session(void) 10365 { 10366 struct crypto_testsuite_params *ts_params = &testsuite_params; 10367 struct crypto_unittest_params *ut_params = &unittest_params; 10368 10369 struct rte_cryptodev_info dev_info; 10370 struct rte_cryptodev_sym_session **sessions; 10371 10372 uint16_t i; 10373 10374 /* Verify the capabilities */ 10375 struct rte_cryptodev_sym_capability_idx cap_idx; 10376 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10377 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10378 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10379 &cap_idx) == NULL) 10380 return -ENOTSUP; 10381 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10382 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10383 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10384 &cap_idx) == NULL) 10385 return -ENOTSUP; 10386 10387 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params, 10388 aes_cbc_key, hmac_sha512_key); 10389 10390 10391 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10392 10393 sessions = rte_malloc(NULL, 10394 (sizeof(struct rte_cryptodev_sym_session *) * 10395 MAX_NB_SESSIONS) + 1, 0); 10396 10397 /* Create multiple crypto sessions*/ 10398 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10399 10400 sessions[i] = rte_cryptodev_sym_session_create( 10401 ts_params->session_mpool); 10402 10403 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10404 sessions[i], &ut_params->auth_xform, 10405 ts_params->session_priv_mpool); 10406 TEST_ASSERT_NOT_NULL(sessions[i], 10407 "Session creation failed at session number %u", 10408 i); 10409 10410 /* Attempt to send a request on each session */ 10411 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform( 10412 sessions[i], 10413 ut_params, 10414 ts_params, 10415 catch_22_quote_2_512_bytes_AES_CBC_ciphertext, 10416 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest, 10417 aes_cbc_iv), 10418 "Failed to perform decrypt on request number %u.", i); 10419 /* free crypto operation structure */ 10420 if (ut_params->op) 10421 rte_crypto_op_free(ut_params->op); 10422 10423 /* 10424 * free mbuf - both obuf and ibuf are usually the same, 10425 * so check if they point at the same address is necessary, 10426 * to avoid freeing the mbuf twice. 10427 */ 10428 if (ut_params->obuf) { 10429 rte_pktmbuf_free(ut_params->obuf); 10430 if (ut_params->ibuf == ut_params->obuf) 10431 ut_params->ibuf = 0; 10432 ut_params->obuf = 0; 10433 } 10434 if (ut_params->ibuf) { 10435 rte_pktmbuf_free(ut_params->ibuf); 10436 ut_params->ibuf = 0; 10437 } 10438 } 10439 10440 /* Next session create should fail */ 10441 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10442 sessions[i], &ut_params->auth_xform, 10443 ts_params->session_priv_mpool); 10444 TEST_ASSERT_NULL(sessions[i], 10445 "Session creation succeeded unexpectedly!"); 10446 10447 for (i = 0; i < MAX_NB_SESSIONS; i++) { 10448 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10449 sessions[i]); 10450 rte_cryptodev_sym_session_free(sessions[i]); 10451 } 10452 10453 rte_free(sessions); 10454 10455 return TEST_SUCCESS; 10456 } 10457 10458 struct multi_session_params { 10459 struct crypto_unittest_params ut_params; 10460 uint8_t *cipher_key; 10461 uint8_t *hmac_key; 10462 const uint8_t *cipher; 10463 const uint8_t *digest; 10464 uint8_t *iv; 10465 }; 10466 10467 #define MB_SESSION_NUMBER 3 10468 10469 static int 10470 test_multi_session_random_usage(void) 10471 { 10472 struct crypto_testsuite_params *ts_params = &testsuite_params; 10473 struct rte_cryptodev_info dev_info; 10474 struct rte_cryptodev_sym_session **sessions; 10475 uint32_t i, j; 10476 struct multi_session_params ut_paramz[] = { 10477 10478 { 10479 .cipher_key = ms_aes_cbc_key0, 10480 .hmac_key = ms_hmac_key0, 10481 .cipher = ms_aes_cbc_cipher0, 10482 .digest = ms_hmac_digest0, 10483 .iv = ms_aes_cbc_iv0 10484 }, 10485 { 10486 .cipher_key = ms_aes_cbc_key1, 10487 .hmac_key = ms_hmac_key1, 10488 .cipher = ms_aes_cbc_cipher1, 10489 .digest = ms_hmac_digest1, 10490 .iv = ms_aes_cbc_iv1 10491 }, 10492 { 10493 .cipher_key = ms_aes_cbc_key2, 10494 .hmac_key = ms_hmac_key2, 10495 .cipher = ms_aes_cbc_cipher2, 10496 .digest = ms_hmac_digest2, 10497 .iv = ms_aes_cbc_iv2 10498 }, 10499 10500 }; 10501 10502 /* Verify the capabilities */ 10503 struct rte_cryptodev_sym_capability_idx cap_idx; 10504 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10505 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC; 10506 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10507 &cap_idx) == NULL) 10508 return -ENOTSUP; 10509 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10510 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC; 10511 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10512 &cap_idx) == NULL) 10513 return -ENOTSUP; 10514 10515 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10516 10517 sessions = rte_malloc(NULL, 10518 (sizeof(struct rte_cryptodev_sym_session *) 10519 * MAX_NB_SESSIONS) + 1, 0); 10520 10521 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10522 sessions[i] = rte_cryptodev_sym_session_create( 10523 ts_params->session_mpool); 10524 10525 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params, 10526 sizeof(struct crypto_unittest_params)); 10527 10528 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params( 10529 &ut_paramz[i].ut_params, 10530 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key); 10531 10532 /* Create multiple crypto sessions*/ 10533 rte_cryptodev_sym_session_init( 10534 ts_params->valid_devs[0], 10535 sessions[i], 10536 &ut_paramz[i].ut_params.auth_xform, 10537 ts_params->session_priv_mpool); 10538 10539 TEST_ASSERT_NOT_NULL(sessions[i], 10540 "Session creation failed at session number %u", 10541 i); 10542 10543 } 10544 10545 srand(time(NULL)); 10546 for (i = 0; i < 40000; i++) { 10547 10548 j = rand() % MB_SESSION_NUMBER; 10549 10550 TEST_ASSERT_SUCCESS( 10551 test_AES_CBC_HMAC_SHA512_decrypt_perform( 10552 sessions[j], 10553 &ut_paramz[j].ut_params, 10554 ts_params, ut_paramz[j].cipher, 10555 ut_paramz[j].digest, 10556 ut_paramz[j].iv), 10557 "Failed to perform decrypt on request number %u.", i); 10558 10559 if (ut_paramz[j].ut_params.op) 10560 rte_crypto_op_free(ut_paramz[j].ut_params.op); 10561 10562 /* 10563 * free mbuf - both obuf and ibuf are usually the same, 10564 * so check if they point at the same address is necessary, 10565 * to avoid freeing the mbuf twice. 10566 */ 10567 if (ut_paramz[j].ut_params.obuf) { 10568 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf); 10569 if (ut_paramz[j].ut_params.ibuf 10570 == ut_paramz[j].ut_params.obuf) 10571 ut_paramz[j].ut_params.ibuf = 0; 10572 ut_paramz[j].ut_params.obuf = 0; 10573 } 10574 if (ut_paramz[j].ut_params.ibuf) { 10575 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf); 10576 ut_paramz[j].ut_params.ibuf = 0; 10577 } 10578 } 10579 10580 for (i = 0; i < MB_SESSION_NUMBER; i++) { 10581 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0], 10582 sessions[i]); 10583 rte_cryptodev_sym_session_free(sessions[i]); 10584 } 10585 10586 rte_free(sessions); 10587 10588 return TEST_SUCCESS; 10589 } 10590 10591 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab, 10592 0xab, 0xab, 0xab, 0xab, 10593 0xab, 0xab, 0xab, 0xab, 10594 0xab, 0xab, 0xab, 0xab}; 10595 10596 static int 10597 test_null_invalid_operation(void) 10598 { 10599 struct crypto_testsuite_params *ts_params = &testsuite_params; 10600 struct crypto_unittest_params *ut_params = &unittest_params; 10601 int ret; 10602 10603 /* This test is for NULL PMD only */ 10604 if (gbl_driver_id != rte_cryptodev_driver_id_get( 10605 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 10606 return -ENOTSUP; 10607 10608 /* Setup Cipher Parameters */ 10609 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10610 ut_params->cipher_xform.next = NULL; 10611 10612 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC; 10613 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10614 10615 ut_params->sess = rte_cryptodev_sym_session_create( 10616 ts_params->session_mpool); 10617 10618 /* Create Crypto session*/ 10619 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10620 ut_params->sess, &ut_params->cipher_xform, 10621 ts_params->session_priv_mpool); 10622 TEST_ASSERT(ret < 0, 10623 "Session creation succeeded unexpectedly"); 10624 10625 10626 /* Setup HMAC Parameters */ 10627 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10628 ut_params->auth_xform.next = NULL; 10629 10630 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC; 10631 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 10632 10633 ut_params->sess = rte_cryptodev_sym_session_create( 10634 ts_params->session_mpool); 10635 10636 /* Create Crypto session*/ 10637 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10638 ut_params->sess, &ut_params->auth_xform, 10639 ts_params->session_priv_mpool); 10640 TEST_ASSERT(ret < 0, 10641 "Session creation succeeded unexpectedly"); 10642 10643 return TEST_SUCCESS; 10644 } 10645 10646 10647 #define NULL_BURST_LENGTH (32) 10648 10649 static int 10650 test_null_burst_operation(void) 10651 { 10652 struct crypto_testsuite_params *ts_params = &testsuite_params; 10653 struct crypto_unittest_params *ut_params = &unittest_params; 10654 10655 unsigned i, burst_len = NULL_BURST_LENGTH; 10656 10657 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL }; 10658 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL }; 10659 10660 /* This test is for NULL PMD only */ 10661 if (gbl_driver_id != rte_cryptodev_driver_id_get( 10662 RTE_STR(CRYPTODEV_NAME_NULL_PMD))) 10663 return -ENOTSUP; 10664 10665 /* Setup Cipher Parameters */ 10666 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 10667 ut_params->cipher_xform.next = &ut_params->auth_xform; 10668 10669 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL; 10670 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 10671 10672 /* Setup HMAC Parameters */ 10673 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10674 ut_params->auth_xform.next = NULL; 10675 10676 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL; 10677 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 10678 10679 ut_params->sess = rte_cryptodev_sym_session_create( 10680 ts_params->session_mpool); 10681 10682 /* Create Crypto session*/ 10683 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 10684 ut_params->sess, &ut_params->cipher_xform, 10685 ts_params->session_priv_mpool); 10686 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10687 10688 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool, 10689 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len), 10690 burst_len, "failed to generate burst of crypto ops"); 10691 10692 /* Generate an operation for each mbuf in burst */ 10693 for (i = 0; i < burst_len; i++) { 10694 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10695 10696 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf"); 10697 10698 unsigned *data = (unsigned *)rte_pktmbuf_append(m, 10699 sizeof(unsigned)); 10700 *data = i; 10701 10702 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess); 10703 10704 burst[i]->sym->m_src = m; 10705 } 10706 10707 /* Process crypto operation */ 10708 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0], 10709 0, burst, burst_len), 10710 burst_len, 10711 "Error enqueuing burst"); 10712 10713 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0], 10714 0, burst_dequeued, burst_len), 10715 burst_len, 10716 "Error dequeuing burst"); 10717 10718 10719 for (i = 0; i < burst_len; i++) { 10720 TEST_ASSERT_EQUAL( 10721 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *), 10722 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src, 10723 uint32_t *), 10724 "data not as expected"); 10725 10726 rte_pktmbuf_free(burst[i]->sym->m_src); 10727 rte_crypto_op_free(burst[i]); 10728 } 10729 10730 return TEST_SUCCESS; 10731 } 10732 10733 static void 10734 generate_gmac_large_plaintext(uint8_t *data) 10735 { 10736 uint16_t i; 10737 10738 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32) 10739 memcpy(&data[i], &data[0], 32); 10740 } 10741 10742 static int 10743 create_gmac_operation(enum rte_crypto_auth_operation op, 10744 const struct gmac_test_data *tdata) 10745 { 10746 struct crypto_testsuite_params *ts_params = &testsuite_params; 10747 struct crypto_unittest_params *ut_params = &unittest_params; 10748 struct rte_crypto_sym_op *sym_op; 10749 10750 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10751 10752 /* Generate Crypto op data structure */ 10753 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10754 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10755 TEST_ASSERT_NOT_NULL(ut_params->op, 10756 "Failed to allocate symmetric crypto operation struct"); 10757 10758 sym_op = ut_params->op->sym; 10759 10760 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 10761 ut_params->ibuf, tdata->gmac_tag.len); 10762 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10763 "no room to append digest"); 10764 10765 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 10766 ut_params->ibuf, plaintext_pad_len); 10767 10768 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10769 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 10770 tdata->gmac_tag.len); 10771 debug_hexdump(stdout, "digest:", 10772 sym_op->auth.digest.data, 10773 tdata->gmac_tag.len); 10774 } 10775 10776 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 10777 uint8_t *, IV_OFFSET); 10778 10779 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 10780 10781 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 10782 10783 sym_op->cipher.data.length = 0; 10784 sym_op->cipher.data.offset = 0; 10785 10786 sym_op->auth.data.offset = 0; 10787 sym_op->auth.data.length = tdata->plaintext.len; 10788 10789 return 0; 10790 } 10791 10792 static int 10793 create_gmac_operation_sgl(enum rte_crypto_auth_operation op, 10794 const struct gmac_test_data *tdata, 10795 void *digest_mem, uint64_t digest_phys) 10796 { 10797 struct crypto_testsuite_params *ts_params = &testsuite_params; 10798 struct crypto_unittest_params *ut_params = &unittest_params; 10799 struct rte_crypto_sym_op *sym_op; 10800 10801 /* Generate Crypto op data structure */ 10802 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 10803 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 10804 TEST_ASSERT_NOT_NULL(ut_params->op, 10805 "Failed to allocate symmetric crypto operation struct"); 10806 10807 sym_op = ut_params->op->sym; 10808 10809 sym_op->auth.digest.data = digest_mem; 10810 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 10811 "no room to append digest"); 10812 10813 sym_op->auth.digest.phys_addr = digest_phys; 10814 10815 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) { 10816 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data, 10817 tdata->gmac_tag.len); 10818 debug_hexdump(stdout, "digest:", 10819 sym_op->auth.digest.data, 10820 tdata->gmac_tag.len); 10821 } 10822 10823 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 10824 uint8_t *, IV_OFFSET); 10825 10826 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len); 10827 10828 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len); 10829 10830 sym_op->cipher.data.length = 0; 10831 sym_op->cipher.data.offset = 0; 10832 10833 sym_op->auth.data.offset = 0; 10834 sym_op->auth.data.length = tdata->plaintext.len; 10835 10836 return 0; 10837 } 10838 10839 static int create_gmac_session(uint8_t dev_id, 10840 const struct gmac_test_data *tdata, 10841 enum rte_crypto_auth_operation auth_op) 10842 { 10843 uint8_t auth_key[tdata->key.len]; 10844 10845 struct crypto_testsuite_params *ts_params = &testsuite_params; 10846 struct crypto_unittest_params *ut_params = &unittest_params; 10847 10848 memcpy(auth_key, tdata->key.data, tdata->key.len); 10849 10850 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10851 ut_params->auth_xform.next = NULL; 10852 10853 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC; 10854 ut_params->auth_xform.auth.op = auth_op; 10855 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len; 10856 ut_params->auth_xform.auth.key.length = tdata->key.len; 10857 ut_params->auth_xform.auth.key.data = auth_key; 10858 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 10859 ut_params->auth_xform.auth.iv.length = tdata->iv.len; 10860 10861 10862 ut_params->sess = rte_cryptodev_sym_session_create( 10863 ts_params->session_mpool); 10864 10865 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 10866 &ut_params->auth_xform, 10867 ts_params->session_priv_mpool); 10868 10869 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 10870 10871 return 0; 10872 } 10873 10874 static int 10875 test_AES_GMAC_authentication(const struct gmac_test_data *tdata) 10876 { 10877 struct crypto_testsuite_params *ts_params = &testsuite_params; 10878 struct crypto_unittest_params *ut_params = &unittest_params; 10879 struct rte_cryptodev_info dev_info; 10880 10881 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 10882 uint64_t feat_flags = dev_info.feature_flags; 10883 10884 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 10885 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 10886 printf("Device doesn't support RAW data-path APIs.\n"); 10887 return -ENOTSUP; 10888 } 10889 10890 int retval; 10891 10892 uint8_t *auth_tag, *plaintext; 10893 uint16_t plaintext_pad_len; 10894 10895 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 10896 "No GMAC length in the source data"); 10897 10898 /* Verify the capabilities */ 10899 struct rte_cryptodev_sym_capability_idx cap_idx; 10900 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 10901 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 10902 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 10903 &cap_idx) == NULL) 10904 return -ENOTSUP; 10905 10906 retval = create_gmac_session(ts_params->valid_devs[0], 10907 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 10908 10909 if (retval < 0) 10910 return retval; 10911 10912 if (tdata->plaintext.len > MBUF_SIZE) 10913 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 10914 else 10915 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 10916 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 10917 "Failed to allocate input buffer in mempool"); 10918 10919 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 10920 rte_pktmbuf_tailroom(ut_params->ibuf)); 10921 10922 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 10923 /* 10924 * Runtime generate the large plain text instead of use hard code 10925 * plain text vector. It is done to avoid create huge source file 10926 * with the test vector. 10927 */ 10928 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 10929 generate_gmac_large_plaintext(tdata->plaintext.data); 10930 10931 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 10932 plaintext_pad_len); 10933 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 10934 10935 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 10936 debug_hexdump(stdout, "plaintext:", plaintext, 10937 tdata->plaintext.len); 10938 10939 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE, 10940 tdata); 10941 10942 if (retval < 0) 10943 return retval; 10944 10945 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 10946 10947 ut_params->op->sym->m_src = ut_params->ibuf; 10948 10949 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 10950 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 10951 ut_params->op); 10952 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 10953 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 10954 ut_params->op, 0, 1, 0, 0); 10955 else 10956 TEST_ASSERT_NOT_NULL( 10957 process_crypto_request(ts_params->valid_devs[0], 10958 ut_params->op), "failed to process sym crypto op"); 10959 10960 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 10961 "crypto op processing failed"); 10962 10963 if (ut_params->op->sym->m_dst) { 10964 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 10965 uint8_t *, plaintext_pad_len); 10966 } else { 10967 auth_tag = plaintext + plaintext_pad_len; 10968 } 10969 10970 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 10971 10972 TEST_ASSERT_BUFFERS_ARE_EQUAL( 10973 auth_tag, 10974 tdata->gmac_tag.data, 10975 tdata->gmac_tag.len, 10976 "GMAC Generated auth tag not as expected"); 10977 10978 return 0; 10979 } 10980 10981 static int 10982 test_AES_GMAC_authentication_test_case_1(void) 10983 { 10984 return test_AES_GMAC_authentication(&gmac_test_case_1); 10985 } 10986 10987 static int 10988 test_AES_GMAC_authentication_test_case_2(void) 10989 { 10990 return test_AES_GMAC_authentication(&gmac_test_case_2); 10991 } 10992 10993 static int 10994 test_AES_GMAC_authentication_test_case_3(void) 10995 { 10996 return test_AES_GMAC_authentication(&gmac_test_case_3); 10997 } 10998 10999 static int 11000 test_AES_GMAC_authentication_test_case_4(void) 11001 { 11002 return test_AES_GMAC_authentication(&gmac_test_case_4); 11003 } 11004 11005 static int 11006 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata) 11007 { 11008 struct crypto_testsuite_params *ts_params = &testsuite_params; 11009 struct crypto_unittest_params *ut_params = &unittest_params; 11010 int retval; 11011 uint32_t plaintext_pad_len; 11012 uint8_t *plaintext; 11013 struct rte_cryptodev_info dev_info; 11014 11015 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11016 uint64_t feat_flags = dev_info.feature_flags; 11017 11018 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11019 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11020 printf("Device doesn't support RAW data-path APIs.\n"); 11021 return -ENOTSUP; 11022 } 11023 11024 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11025 "No GMAC length in the source data"); 11026 11027 /* Verify the capabilities */ 11028 struct rte_cryptodev_sym_capability_idx cap_idx; 11029 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11030 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11031 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11032 &cap_idx) == NULL) 11033 return -ENOTSUP; 11034 11035 retval = create_gmac_session(ts_params->valid_devs[0], 11036 tdata, RTE_CRYPTO_AUTH_OP_VERIFY); 11037 11038 if (retval < 0) 11039 return retval; 11040 11041 if (tdata->plaintext.len > MBUF_SIZE) 11042 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool); 11043 else 11044 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11045 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11046 "Failed to allocate input buffer in mempool"); 11047 11048 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11049 rte_pktmbuf_tailroom(ut_params->ibuf)); 11050 11051 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16); 11052 11053 /* 11054 * Runtime generate the large plain text instead of use hard code 11055 * plain text vector. It is done to avoid create huge source file 11056 * with the test vector. 11057 */ 11058 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH) 11059 generate_gmac_large_plaintext(tdata->plaintext.data); 11060 11061 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11062 plaintext_pad_len); 11063 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11064 11065 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len); 11066 debug_hexdump(stdout, "plaintext:", plaintext, 11067 tdata->plaintext.len); 11068 11069 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY, 11070 tdata); 11071 11072 if (retval < 0) 11073 return retval; 11074 11075 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11076 11077 ut_params->op->sym->m_src = ut_params->ibuf; 11078 11079 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11080 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11081 ut_params->op); 11082 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11083 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11084 ut_params->op, 0, 1, 0, 0); 11085 else 11086 TEST_ASSERT_NOT_NULL( 11087 process_crypto_request(ts_params->valid_devs[0], 11088 ut_params->op), "failed to process sym crypto op"); 11089 11090 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11091 "crypto op processing failed"); 11092 11093 return 0; 11094 11095 } 11096 11097 static int 11098 test_AES_GMAC_authentication_verify_test_case_1(void) 11099 { 11100 return test_AES_GMAC_authentication_verify(&gmac_test_case_1); 11101 } 11102 11103 static int 11104 test_AES_GMAC_authentication_verify_test_case_2(void) 11105 { 11106 return test_AES_GMAC_authentication_verify(&gmac_test_case_2); 11107 } 11108 11109 static int 11110 test_AES_GMAC_authentication_verify_test_case_3(void) 11111 { 11112 return test_AES_GMAC_authentication_verify(&gmac_test_case_3); 11113 } 11114 11115 static int 11116 test_AES_GMAC_authentication_verify_test_case_4(void) 11117 { 11118 return test_AES_GMAC_authentication_verify(&gmac_test_case_4); 11119 } 11120 11121 static int 11122 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata, 11123 uint32_t fragsz) 11124 { 11125 struct crypto_testsuite_params *ts_params = &testsuite_params; 11126 struct crypto_unittest_params *ut_params = &unittest_params; 11127 struct rte_cryptodev_info dev_info; 11128 uint64_t feature_flags; 11129 unsigned int trn_data = 0; 11130 void *digest_mem = NULL; 11131 uint32_t segs = 1; 11132 unsigned int to_trn = 0; 11133 struct rte_mbuf *buf = NULL; 11134 uint8_t *auth_tag, *plaintext; 11135 int retval; 11136 11137 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0, 11138 "No GMAC length in the source data"); 11139 11140 /* Verify the capabilities */ 11141 struct rte_cryptodev_sym_capability_idx cap_idx; 11142 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11143 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC; 11144 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11145 &cap_idx) == NULL) 11146 return -ENOTSUP; 11147 11148 /* Check for any input SGL support */ 11149 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11150 feature_flags = dev_info.feature_flags; 11151 11152 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) || 11153 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) || 11154 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))) 11155 return -ENOTSUP; 11156 11157 if (fragsz > tdata->plaintext.len) 11158 fragsz = tdata->plaintext.len; 11159 11160 uint16_t plaintext_len = fragsz; 11161 11162 retval = create_gmac_session(ts_params->valid_devs[0], 11163 tdata, RTE_CRYPTO_AUTH_OP_GENERATE); 11164 11165 if (retval < 0) 11166 return retval; 11167 11168 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11169 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11170 "Failed to allocate input buffer in mempool"); 11171 11172 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11173 rte_pktmbuf_tailroom(ut_params->ibuf)); 11174 11175 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11176 plaintext_len); 11177 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11178 11179 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 11180 11181 trn_data += plaintext_len; 11182 11183 buf = ut_params->ibuf; 11184 11185 /* 11186 * Loop until no more fragments 11187 */ 11188 11189 while (trn_data < tdata->plaintext.len) { 11190 ++segs; 11191 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 11192 (tdata->plaintext.len - trn_data) : fragsz; 11193 11194 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11195 buf = buf->next; 11196 11197 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 11198 rte_pktmbuf_tailroom(buf)); 11199 11200 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 11201 to_trn); 11202 11203 memcpy(plaintext, tdata->plaintext.data + trn_data, 11204 to_trn); 11205 trn_data += to_trn; 11206 if (trn_data == tdata->plaintext.len) 11207 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 11208 tdata->gmac_tag.len); 11209 } 11210 ut_params->ibuf->nb_segs = segs; 11211 11212 /* 11213 * Place digest at the end of the last buffer 11214 */ 11215 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn; 11216 11217 if (!digest_mem) { 11218 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11219 + tdata->gmac_tag.len); 11220 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 11221 tdata->plaintext.len); 11222 } 11223 11224 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE, 11225 tdata, digest_mem, digest_phys); 11226 11227 if (retval < 0) 11228 return retval; 11229 11230 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11231 11232 ut_params->op->sym->m_src = ut_params->ibuf; 11233 11234 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 11235 return -ENOTSUP; 11236 11237 TEST_ASSERT_NOT_NULL( 11238 process_crypto_request(ts_params->valid_devs[0], 11239 ut_params->op), "failed to process sym crypto op"); 11240 11241 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 11242 "crypto op processing failed"); 11243 11244 auth_tag = digest_mem; 11245 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len); 11246 TEST_ASSERT_BUFFERS_ARE_EQUAL( 11247 auth_tag, 11248 tdata->gmac_tag.data, 11249 tdata->gmac_tag.len, 11250 "GMAC Generated auth tag not as expected"); 11251 11252 return 0; 11253 } 11254 11255 /* Segment size not multiple of block size (16B) */ 11256 static int 11257 test_AES_GMAC_authentication_SGL_40B(void) 11258 { 11259 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40); 11260 } 11261 11262 static int 11263 test_AES_GMAC_authentication_SGL_80B(void) 11264 { 11265 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80); 11266 } 11267 11268 static int 11269 test_AES_GMAC_authentication_SGL_2048B(void) 11270 { 11271 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048); 11272 } 11273 11274 /* Segment size not multiple of block size (16B) */ 11275 static int 11276 test_AES_GMAC_authentication_SGL_2047B(void) 11277 { 11278 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047); 11279 } 11280 11281 struct test_crypto_vector { 11282 enum rte_crypto_cipher_algorithm crypto_algo; 11283 unsigned int cipher_offset; 11284 unsigned int cipher_len; 11285 11286 struct { 11287 uint8_t data[64]; 11288 unsigned int len; 11289 } cipher_key; 11290 11291 struct { 11292 uint8_t data[64]; 11293 unsigned int len; 11294 } iv; 11295 11296 struct { 11297 const uint8_t *data; 11298 unsigned int len; 11299 } plaintext; 11300 11301 struct { 11302 const uint8_t *data; 11303 unsigned int len; 11304 } ciphertext; 11305 11306 enum rte_crypto_auth_algorithm auth_algo; 11307 unsigned int auth_offset; 11308 11309 struct { 11310 uint8_t data[128]; 11311 unsigned int len; 11312 } auth_key; 11313 11314 struct { 11315 const uint8_t *data; 11316 unsigned int len; 11317 } aad; 11318 11319 struct { 11320 uint8_t data[128]; 11321 unsigned int len; 11322 } digest; 11323 }; 11324 11325 static const struct test_crypto_vector 11326 hmac_sha1_test_crypto_vector = { 11327 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 11328 .plaintext = { 11329 .data = plaintext_hash, 11330 .len = 512 11331 }, 11332 .auth_key = { 11333 .data = { 11334 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 11335 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 11336 0xDE, 0xF4, 0xDE, 0xAD 11337 }, 11338 .len = 20 11339 }, 11340 .digest = { 11341 .data = { 11342 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77, 11343 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17, 11344 0x3F, 0x91, 0x64, 0x59 11345 }, 11346 .len = 20 11347 } 11348 }; 11349 11350 static const struct test_crypto_vector 11351 aes128_gmac_test_vector = { 11352 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC, 11353 .plaintext = { 11354 .data = plaintext_hash, 11355 .len = 512 11356 }, 11357 .iv = { 11358 .data = { 11359 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11360 0x08, 0x09, 0x0A, 0x0B 11361 }, 11362 .len = 12 11363 }, 11364 .auth_key = { 11365 .data = { 11366 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 11367 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA 11368 }, 11369 .len = 16 11370 }, 11371 .digest = { 11372 .data = { 11373 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56, 11374 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A 11375 }, 11376 .len = 16 11377 } 11378 }; 11379 11380 static const struct test_crypto_vector 11381 aes128cbc_hmac_sha1_test_vector = { 11382 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 11383 .cipher_offset = 0, 11384 .cipher_len = 512, 11385 .cipher_key = { 11386 .data = { 11387 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 11388 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 11389 }, 11390 .len = 16 11391 }, 11392 .iv = { 11393 .data = { 11394 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11395 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 11396 }, 11397 .len = 16 11398 }, 11399 .plaintext = { 11400 .data = plaintext_hash, 11401 .len = 512 11402 }, 11403 .ciphertext = { 11404 .data = ciphertext512_aes128cbc, 11405 .len = 512 11406 }, 11407 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 11408 .auth_offset = 0, 11409 .auth_key = { 11410 .data = { 11411 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 11412 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 11413 0xDE, 0xF4, 0xDE, 0xAD 11414 }, 11415 .len = 20 11416 }, 11417 .digest = { 11418 .data = { 11419 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60, 11420 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1, 11421 0x18, 0x8C, 0x1D, 0x32 11422 }, 11423 .len = 20 11424 } 11425 }; 11426 11427 static const struct test_crypto_vector 11428 aes128cbc_hmac_sha1_aad_test_vector = { 11429 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC, 11430 .cipher_offset = 8, 11431 .cipher_len = 496, 11432 .cipher_key = { 11433 .data = { 11434 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2, 11435 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A 11436 }, 11437 .len = 16 11438 }, 11439 .iv = { 11440 .data = { 11441 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 11442 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F 11443 }, 11444 .len = 16 11445 }, 11446 .plaintext = { 11447 .data = plaintext_hash, 11448 .len = 512 11449 }, 11450 .ciphertext = { 11451 .data = ciphertext512_aes128cbc_aad, 11452 .len = 512 11453 }, 11454 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC, 11455 .auth_offset = 0, 11456 .auth_key = { 11457 .data = { 11458 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA, 11459 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD, 11460 0xDE, 0xF4, 0xDE, 0xAD 11461 }, 11462 .len = 20 11463 }, 11464 .digest = { 11465 .data = { 11466 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F, 11467 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B, 11468 0x62, 0x0F, 0xFB, 0x10 11469 }, 11470 .len = 20 11471 } 11472 }; 11473 11474 static void 11475 data_corruption(uint8_t *data) 11476 { 11477 data[0] += 1; 11478 } 11479 11480 static void 11481 tag_corruption(uint8_t *data, unsigned int tag_offset) 11482 { 11483 data[tag_offset] += 1; 11484 } 11485 11486 static int 11487 create_auth_session(struct crypto_unittest_params *ut_params, 11488 uint8_t dev_id, 11489 const struct test_crypto_vector *reference, 11490 enum rte_crypto_auth_operation auth_op) 11491 { 11492 struct crypto_testsuite_params *ts_params = &testsuite_params; 11493 uint8_t auth_key[reference->auth_key.len + 1]; 11494 11495 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 11496 11497 /* Setup Authentication Parameters */ 11498 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11499 ut_params->auth_xform.auth.op = auth_op; 11500 ut_params->auth_xform.next = NULL; 11501 ut_params->auth_xform.auth.algo = reference->auth_algo; 11502 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 11503 ut_params->auth_xform.auth.key.data = auth_key; 11504 ut_params->auth_xform.auth.digest_length = reference->digest.len; 11505 11506 /* Create Crypto session*/ 11507 ut_params->sess = rte_cryptodev_sym_session_create( 11508 ts_params->session_mpool); 11509 11510 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 11511 &ut_params->auth_xform, 11512 ts_params->session_priv_mpool); 11513 11514 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11515 11516 return 0; 11517 } 11518 11519 static int 11520 create_auth_cipher_session(struct crypto_unittest_params *ut_params, 11521 uint8_t dev_id, 11522 const struct test_crypto_vector *reference, 11523 enum rte_crypto_auth_operation auth_op, 11524 enum rte_crypto_cipher_operation cipher_op) 11525 { 11526 struct crypto_testsuite_params *ts_params = &testsuite_params; 11527 uint8_t cipher_key[reference->cipher_key.len + 1]; 11528 uint8_t auth_key[reference->auth_key.len + 1]; 11529 11530 memcpy(cipher_key, reference->cipher_key.data, 11531 reference->cipher_key.len); 11532 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 11533 11534 /* Setup Authentication Parameters */ 11535 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11536 ut_params->auth_xform.auth.op = auth_op; 11537 ut_params->auth_xform.auth.algo = reference->auth_algo; 11538 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 11539 ut_params->auth_xform.auth.key.data = auth_key; 11540 ut_params->auth_xform.auth.digest_length = reference->digest.len; 11541 11542 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) { 11543 ut_params->auth_xform.auth.iv.offset = IV_OFFSET; 11544 ut_params->auth_xform.auth.iv.length = reference->iv.len; 11545 } else { 11546 ut_params->auth_xform.next = &ut_params->cipher_xform; 11547 11548 /* Setup Cipher Parameters */ 11549 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11550 ut_params->cipher_xform.next = NULL; 11551 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 11552 ut_params->cipher_xform.cipher.op = cipher_op; 11553 ut_params->cipher_xform.cipher.key.data = cipher_key; 11554 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 11555 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 11556 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 11557 } 11558 11559 /* Create Crypto session*/ 11560 ut_params->sess = rte_cryptodev_sym_session_create( 11561 ts_params->session_mpool); 11562 11563 rte_cryptodev_sym_session_init(dev_id, ut_params->sess, 11564 &ut_params->auth_xform, 11565 ts_params->session_priv_mpool); 11566 11567 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 11568 11569 return 0; 11570 } 11571 11572 static int 11573 create_auth_operation(struct crypto_testsuite_params *ts_params, 11574 struct crypto_unittest_params *ut_params, 11575 const struct test_crypto_vector *reference, 11576 unsigned int auth_generate) 11577 { 11578 /* Generate Crypto op data structure */ 11579 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11580 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11581 TEST_ASSERT_NOT_NULL(ut_params->op, 11582 "Failed to allocate pktmbuf offload"); 11583 11584 /* Set crypto operation data parameters */ 11585 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11586 11587 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 11588 11589 /* set crypto operation source mbuf */ 11590 sym_op->m_src = ut_params->ibuf; 11591 11592 /* digest */ 11593 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11594 ut_params->ibuf, reference->digest.len); 11595 11596 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11597 "no room to append auth tag"); 11598 11599 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11600 ut_params->ibuf, reference->plaintext.len); 11601 11602 if (auth_generate) 11603 memset(sym_op->auth.digest.data, 0, reference->digest.len); 11604 else 11605 memcpy(sym_op->auth.digest.data, 11606 reference->digest.data, 11607 reference->digest.len); 11608 11609 debug_hexdump(stdout, "digest:", 11610 sym_op->auth.digest.data, 11611 reference->digest.len); 11612 11613 sym_op->auth.data.length = reference->plaintext.len; 11614 sym_op->auth.data.offset = 0; 11615 11616 return 0; 11617 } 11618 11619 static int 11620 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params, 11621 struct crypto_unittest_params *ut_params, 11622 const struct test_crypto_vector *reference, 11623 unsigned int auth_generate) 11624 { 11625 /* Generate Crypto op data structure */ 11626 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11627 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11628 TEST_ASSERT_NOT_NULL(ut_params->op, 11629 "Failed to allocate pktmbuf offload"); 11630 11631 /* Set crypto operation data parameters */ 11632 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11633 11634 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 11635 11636 /* set crypto operation source mbuf */ 11637 sym_op->m_src = ut_params->ibuf; 11638 11639 /* digest */ 11640 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11641 ut_params->ibuf, reference->digest.len); 11642 11643 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11644 "no room to append auth tag"); 11645 11646 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11647 ut_params->ibuf, reference->ciphertext.len); 11648 11649 if (auth_generate) 11650 memset(sym_op->auth.digest.data, 0, reference->digest.len); 11651 else 11652 memcpy(sym_op->auth.digest.data, 11653 reference->digest.data, 11654 reference->digest.len); 11655 11656 debug_hexdump(stdout, "digest:", 11657 sym_op->auth.digest.data, 11658 reference->digest.len); 11659 11660 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 11661 reference->iv.data, reference->iv.len); 11662 11663 sym_op->cipher.data.length = 0; 11664 sym_op->cipher.data.offset = 0; 11665 11666 sym_op->auth.data.length = reference->plaintext.len; 11667 sym_op->auth.data.offset = 0; 11668 11669 return 0; 11670 } 11671 11672 static int 11673 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params, 11674 struct crypto_unittest_params *ut_params, 11675 const struct test_crypto_vector *reference, 11676 unsigned int auth_generate) 11677 { 11678 /* Generate Crypto op data structure */ 11679 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 11680 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 11681 TEST_ASSERT_NOT_NULL(ut_params->op, 11682 "Failed to allocate pktmbuf offload"); 11683 11684 /* Set crypto operation data parameters */ 11685 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 11686 11687 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 11688 11689 /* set crypto operation source mbuf */ 11690 sym_op->m_src = ut_params->ibuf; 11691 11692 /* digest */ 11693 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append( 11694 ut_params->ibuf, reference->digest.len); 11695 11696 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data, 11697 "no room to append auth tag"); 11698 11699 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset( 11700 ut_params->ibuf, reference->ciphertext.len); 11701 11702 if (auth_generate) 11703 memset(sym_op->auth.digest.data, 0, reference->digest.len); 11704 else 11705 memcpy(sym_op->auth.digest.data, 11706 reference->digest.data, 11707 reference->digest.len); 11708 11709 debug_hexdump(stdout, "digest:", 11710 sym_op->auth.digest.data, 11711 reference->digest.len); 11712 11713 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET), 11714 reference->iv.data, reference->iv.len); 11715 11716 sym_op->cipher.data.length = reference->cipher_len; 11717 sym_op->cipher.data.offset = reference->cipher_offset; 11718 11719 sym_op->auth.data.length = reference->plaintext.len; 11720 sym_op->auth.data.offset = reference->auth_offset; 11721 11722 return 0; 11723 } 11724 11725 static int 11726 create_auth_verify_operation(struct crypto_testsuite_params *ts_params, 11727 struct crypto_unittest_params *ut_params, 11728 const struct test_crypto_vector *reference) 11729 { 11730 return create_auth_operation(ts_params, ut_params, reference, 0); 11731 } 11732 11733 static int 11734 create_auth_verify_GMAC_operation( 11735 struct crypto_testsuite_params *ts_params, 11736 struct crypto_unittest_params *ut_params, 11737 const struct test_crypto_vector *reference) 11738 { 11739 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0); 11740 } 11741 11742 static int 11743 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params, 11744 struct crypto_unittest_params *ut_params, 11745 const struct test_crypto_vector *reference) 11746 { 11747 return create_cipher_auth_operation(ts_params, ut_params, reference, 0); 11748 } 11749 11750 static int 11751 test_authentication_verify_fail_when_data_corruption( 11752 struct crypto_testsuite_params *ts_params, 11753 struct crypto_unittest_params *ut_params, 11754 const struct test_crypto_vector *reference, 11755 unsigned int data_corrupted) 11756 { 11757 int retval; 11758 11759 uint8_t *plaintext; 11760 struct rte_cryptodev_info dev_info; 11761 11762 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11763 uint64_t feat_flags = dev_info.feature_flags; 11764 11765 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11766 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11767 printf("Device doesn't support RAW data-path APIs.\n"); 11768 return -ENOTSUP; 11769 } 11770 11771 /* Verify the capabilities */ 11772 struct rte_cryptodev_sym_capability_idx cap_idx; 11773 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11774 cap_idx.algo.auth = reference->auth_algo; 11775 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11776 &cap_idx) == NULL) 11777 return -ENOTSUP; 11778 11779 11780 /* Create session */ 11781 retval = create_auth_session(ut_params, 11782 ts_params->valid_devs[0], 11783 reference, 11784 RTE_CRYPTO_AUTH_OP_VERIFY); 11785 if (retval < 0) 11786 return retval; 11787 11788 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11789 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11790 "Failed to allocate input buffer in mempool"); 11791 11792 /* clear mbuf payload */ 11793 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11794 rte_pktmbuf_tailroom(ut_params->ibuf)); 11795 11796 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11797 reference->plaintext.len); 11798 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11799 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 11800 11801 debug_hexdump(stdout, "plaintext:", plaintext, 11802 reference->plaintext.len); 11803 11804 /* Create operation */ 11805 retval = create_auth_verify_operation(ts_params, ut_params, reference); 11806 11807 if (retval < 0) 11808 return retval; 11809 11810 if (data_corrupted) 11811 data_corruption(plaintext); 11812 else 11813 tag_corruption(plaintext, reference->plaintext.len); 11814 11815 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 11816 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11817 ut_params->op); 11818 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 11819 RTE_CRYPTO_OP_STATUS_SUCCESS, 11820 "authentication not failed"); 11821 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11822 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11823 ut_params->op, 0, 1, 0, 0); 11824 else { 11825 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 11826 ut_params->op); 11827 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 11828 } 11829 11830 return 0; 11831 } 11832 11833 static int 11834 test_authentication_verify_GMAC_fail_when_corruption( 11835 struct crypto_testsuite_params *ts_params, 11836 struct crypto_unittest_params *ut_params, 11837 const struct test_crypto_vector *reference, 11838 unsigned int data_corrupted) 11839 { 11840 int retval; 11841 uint8_t *plaintext; 11842 struct rte_cryptodev_info dev_info; 11843 11844 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11845 uint64_t feat_flags = dev_info.feature_flags; 11846 11847 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11848 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11849 printf("Device doesn't support RAW data-path APIs.\n"); 11850 return -ENOTSUP; 11851 } 11852 11853 /* Verify the capabilities */ 11854 struct rte_cryptodev_sym_capability_idx cap_idx; 11855 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11856 cap_idx.algo.auth = reference->auth_algo; 11857 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11858 &cap_idx) == NULL) 11859 return -ENOTSUP; 11860 11861 /* Create session */ 11862 retval = create_auth_cipher_session(ut_params, 11863 ts_params->valid_devs[0], 11864 reference, 11865 RTE_CRYPTO_AUTH_OP_VERIFY, 11866 RTE_CRYPTO_CIPHER_OP_DECRYPT); 11867 if (retval < 0) 11868 return retval; 11869 11870 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11871 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11872 "Failed to allocate input buffer in mempool"); 11873 11874 /* clear mbuf payload */ 11875 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11876 rte_pktmbuf_tailroom(ut_params->ibuf)); 11877 11878 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11879 reference->plaintext.len); 11880 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 11881 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 11882 11883 debug_hexdump(stdout, "plaintext:", plaintext, 11884 reference->plaintext.len); 11885 11886 /* Create operation */ 11887 retval = create_auth_verify_GMAC_operation(ts_params, 11888 ut_params, 11889 reference); 11890 11891 if (retval < 0) 11892 return retval; 11893 11894 if (data_corrupted) 11895 data_corruption(plaintext); 11896 else 11897 tag_corruption(plaintext, reference->aad.len); 11898 11899 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 11900 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11901 ut_params->op); 11902 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 11903 RTE_CRYPTO_OP_STATUS_SUCCESS, 11904 "authentication not failed"); 11905 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11906 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11907 ut_params->op, 0, 1, 0, 0); 11908 else { 11909 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 11910 ut_params->op); 11911 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 11912 } 11913 11914 return 0; 11915 } 11916 11917 static int 11918 test_authenticated_decryption_fail_when_corruption( 11919 struct crypto_testsuite_params *ts_params, 11920 struct crypto_unittest_params *ut_params, 11921 const struct test_crypto_vector *reference, 11922 unsigned int data_corrupted) 11923 { 11924 int retval; 11925 11926 uint8_t *ciphertext; 11927 struct rte_cryptodev_info dev_info; 11928 11929 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 11930 uint64_t feat_flags = dev_info.feature_flags; 11931 11932 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 11933 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 11934 printf("Device doesn't support RAW data-path APIs.\n"); 11935 return -ENOTSUP; 11936 } 11937 11938 /* Verify the capabilities */ 11939 struct rte_cryptodev_sym_capability_idx cap_idx; 11940 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 11941 cap_idx.algo.auth = reference->auth_algo; 11942 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11943 &cap_idx) == NULL) 11944 return -ENOTSUP; 11945 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 11946 cap_idx.algo.cipher = reference->crypto_algo; 11947 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 11948 &cap_idx) == NULL) 11949 return -ENOTSUP; 11950 11951 /* Create session */ 11952 retval = create_auth_cipher_session(ut_params, 11953 ts_params->valid_devs[0], 11954 reference, 11955 RTE_CRYPTO_AUTH_OP_VERIFY, 11956 RTE_CRYPTO_CIPHER_OP_DECRYPT); 11957 if (retval < 0) 11958 return retval; 11959 11960 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 11961 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 11962 "Failed to allocate input buffer in mempool"); 11963 11964 /* clear mbuf payload */ 11965 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 11966 rte_pktmbuf_tailroom(ut_params->ibuf)); 11967 11968 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 11969 reference->ciphertext.len); 11970 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 11971 memcpy(ciphertext, reference->ciphertext.data, 11972 reference->ciphertext.len); 11973 11974 /* Create operation */ 11975 retval = create_cipher_auth_verify_operation(ts_params, 11976 ut_params, 11977 reference); 11978 11979 if (retval < 0) 11980 return retval; 11981 11982 if (data_corrupted) 11983 data_corruption(ciphertext); 11984 else 11985 tag_corruption(ciphertext, reference->ciphertext.len); 11986 11987 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) { 11988 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 11989 ut_params->op); 11990 TEST_ASSERT_NOT_EQUAL(ut_params->op->status, 11991 RTE_CRYPTO_OP_STATUS_SUCCESS, 11992 "authentication not failed"); 11993 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 11994 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 11995 ut_params->op, 1, 1, 0, 0); 11996 else { 11997 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 11998 ut_params->op); 11999 TEST_ASSERT_NULL(ut_params->op, "authentication not failed"); 12000 } 12001 12002 return 0; 12003 } 12004 12005 static int 12006 test_authenticated_encryt_with_esn( 12007 struct crypto_testsuite_params *ts_params, 12008 struct crypto_unittest_params *ut_params, 12009 const struct test_crypto_vector *reference) 12010 { 12011 int retval; 12012 12013 uint8_t *authciphertext, *plaintext, *auth_tag; 12014 uint16_t plaintext_pad_len; 12015 uint8_t cipher_key[reference->cipher_key.len + 1]; 12016 uint8_t auth_key[reference->auth_key.len + 1]; 12017 struct rte_cryptodev_info dev_info; 12018 12019 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12020 uint64_t feat_flags = dev_info.feature_flags; 12021 12022 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12023 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12024 printf("Device doesn't support RAW data-path APIs.\n"); 12025 return -ENOTSUP; 12026 } 12027 12028 /* Verify the capabilities */ 12029 struct rte_cryptodev_sym_capability_idx cap_idx; 12030 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12031 cap_idx.algo.auth = reference->auth_algo; 12032 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12033 &cap_idx) == NULL) 12034 return -ENOTSUP; 12035 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12036 cap_idx.algo.cipher = reference->crypto_algo; 12037 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12038 &cap_idx) == NULL) 12039 return -ENOTSUP; 12040 12041 /* Create session */ 12042 memcpy(cipher_key, reference->cipher_key.data, 12043 reference->cipher_key.len); 12044 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12045 12046 /* Setup Cipher Parameters */ 12047 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12048 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12049 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT; 12050 ut_params->cipher_xform.cipher.key.data = cipher_key; 12051 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12052 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12053 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12054 12055 ut_params->cipher_xform.next = &ut_params->auth_xform; 12056 12057 /* Setup Authentication Parameters */ 12058 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12059 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE; 12060 ut_params->auth_xform.auth.algo = reference->auth_algo; 12061 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12062 ut_params->auth_xform.auth.key.data = auth_key; 12063 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12064 ut_params->auth_xform.next = NULL; 12065 12066 /* Create Crypto session*/ 12067 ut_params->sess = rte_cryptodev_sym_session_create( 12068 ts_params->session_mpool); 12069 12070 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12071 ut_params->sess, 12072 &ut_params->cipher_xform, 12073 ts_params->session_priv_mpool); 12074 12075 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12076 12077 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12078 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12079 "Failed to allocate input buffer in mempool"); 12080 12081 /* clear mbuf payload */ 12082 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12083 rte_pktmbuf_tailroom(ut_params->ibuf)); 12084 12085 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12086 reference->plaintext.len); 12087 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext"); 12088 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len); 12089 12090 /* Create operation */ 12091 retval = create_cipher_auth_operation(ts_params, 12092 ut_params, 12093 reference, 0); 12094 12095 if (retval < 0) 12096 return retval; 12097 12098 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12099 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12100 ut_params->op); 12101 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12102 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12103 ut_params->op, 1, 1, 0, 0); 12104 else 12105 ut_params->op = process_crypto_request( 12106 ts_params->valid_devs[0], ut_params->op); 12107 12108 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned"); 12109 12110 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12111 "crypto op processing failed"); 12112 12113 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16); 12114 12115 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *, 12116 ut_params->op->sym->auth.data.offset); 12117 auth_tag = authciphertext + plaintext_pad_len; 12118 debug_hexdump(stdout, "ciphertext:", authciphertext, 12119 reference->ciphertext.len); 12120 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len); 12121 12122 /* Validate obuf */ 12123 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12124 authciphertext, 12125 reference->ciphertext.data, 12126 reference->ciphertext.len, 12127 "Ciphertext data not as expected"); 12128 12129 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12130 auth_tag, 12131 reference->digest.data, 12132 reference->digest.len, 12133 "Generated digest not as expected"); 12134 12135 return TEST_SUCCESS; 12136 12137 } 12138 12139 static int 12140 test_authenticated_decrypt_with_esn( 12141 struct crypto_testsuite_params *ts_params, 12142 struct crypto_unittest_params *ut_params, 12143 const struct test_crypto_vector *reference) 12144 { 12145 int retval; 12146 12147 uint8_t *ciphertext; 12148 uint8_t cipher_key[reference->cipher_key.len + 1]; 12149 uint8_t auth_key[reference->auth_key.len + 1]; 12150 struct rte_cryptodev_info dev_info; 12151 12152 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12153 uint64_t feat_flags = dev_info.feature_flags; 12154 12155 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12156 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12157 printf("Device doesn't support RAW data-path APIs.\n"); 12158 return -ENOTSUP; 12159 } 12160 12161 /* Verify the capabilities */ 12162 struct rte_cryptodev_sym_capability_idx cap_idx; 12163 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12164 cap_idx.algo.auth = reference->auth_algo; 12165 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12166 &cap_idx) == NULL) 12167 return -ENOTSUP; 12168 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12169 cap_idx.algo.cipher = reference->crypto_algo; 12170 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12171 &cap_idx) == NULL) 12172 return -ENOTSUP; 12173 12174 /* Create session */ 12175 memcpy(cipher_key, reference->cipher_key.data, 12176 reference->cipher_key.len); 12177 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len); 12178 12179 /* Setup Authentication Parameters */ 12180 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH; 12181 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY; 12182 ut_params->auth_xform.auth.algo = reference->auth_algo; 12183 ut_params->auth_xform.auth.key.length = reference->auth_key.len; 12184 ut_params->auth_xform.auth.key.data = auth_key; 12185 ut_params->auth_xform.auth.digest_length = reference->digest.len; 12186 ut_params->auth_xform.next = &ut_params->cipher_xform; 12187 12188 /* Setup Cipher Parameters */ 12189 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER; 12190 ut_params->cipher_xform.next = NULL; 12191 ut_params->cipher_xform.cipher.algo = reference->crypto_algo; 12192 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT; 12193 ut_params->cipher_xform.cipher.key.data = cipher_key; 12194 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len; 12195 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET; 12196 ut_params->cipher_xform.cipher.iv.length = reference->iv.len; 12197 12198 /* Create Crypto session*/ 12199 ut_params->sess = rte_cryptodev_sym_session_create( 12200 ts_params->session_mpool); 12201 12202 rte_cryptodev_sym_session_init(ts_params->valid_devs[0], 12203 ut_params->sess, 12204 &ut_params->auth_xform, 12205 ts_params->session_priv_mpool); 12206 12207 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed"); 12208 12209 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12210 TEST_ASSERT_NOT_NULL(ut_params->ibuf, 12211 "Failed to allocate input buffer in mempool"); 12212 12213 /* clear mbuf payload */ 12214 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12215 rte_pktmbuf_tailroom(ut_params->ibuf)); 12216 12217 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12218 reference->ciphertext.len); 12219 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext"); 12220 memcpy(ciphertext, reference->ciphertext.data, 12221 reference->ciphertext.len); 12222 12223 /* Create operation */ 12224 retval = create_cipher_auth_verify_operation(ts_params, 12225 ut_params, 12226 reference); 12227 12228 if (retval < 0) 12229 return retval; 12230 12231 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12232 process_cpu_crypt_auth_op(ts_params->valid_devs[0], 12233 ut_params->op); 12234 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12235 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12236 ut_params->op, 1, 1, 0, 0); 12237 else 12238 ut_params->op = process_crypto_request(ts_params->valid_devs[0], 12239 ut_params->op); 12240 12241 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process"); 12242 TEST_ASSERT_EQUAL(ut_params->op->status, 12243 RTE_CRYPTO_OP_STATUS_SUCCESS, 12244 "crypto op processing passed"); 12245 12246 ut_params->obuf = ut_params->op->sym->m_src; 12247 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf"); 12248 12249 return 0; 12250 } 12251 12252 static int 12253 create_aead_operation_SGL(enum rte_crypto_aead_operation op, 12254 const struct aead_test_data *tdata, 12255 void *digest_mem, uint64_t digest_phys) 12256 { 12257 struct crypto_testsuite_params *ts_params = &testsuite_params; 12258 struct crypto_unittest_params *ut_params = &unittest_params; 12259 12260 const unsigned int auth_tag_len = tdata->auth_tag.len; 12261 const unsigned int iv_len = tdata->iv.len; 12262 unsigned int aad_len = tdata->aad.len; 12263 unsigned int aad_len_pad = 0; 12264 12265 /* Generate Crypto op data structure */ 12266 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool, 12267 RTE_CRYPTO_OP_TYPE_SYMMETRIC); 12268 TEST_ASSERT_NOT_NULL(ut_params->op, 12269 "Failed to allocate symmetric crypto operation struct"); 12270 12271 struct rte_crypto_sym_op *sym_op = ut_params->op->sym; 12272 12273 sym_op->aead.digest.data = digest_mem; 12274 12275 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data, 12276 "no room to append digest"); 12277 12278 sym_op->aead.digest.phys_addr = digest_phys; 12279 12280 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) { 12281 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data, 12282 auth_tag_len); 12283 debug_hexdump(stdout, "digest:", 12284 sym_op->aead.digest.data, 12285 auth_tag_len); 12286 } 12287 12288 /* Append aad data */ 12289 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) { 12290 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12291 uint8_t *, IV_OFFSET); 12292 12293 /* Copy IV 1 byte after the IV pointer, according to the API */ 12294 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len); 12295 12296 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16); 12297 12298 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12299 ut_params->ibuf, aad_len); 12300 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12301 "no room to prepend aad"); 12302 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12303 ut_params->ibuf); 12304 12305 memset(sym_op->aead.aad.data, 0, aad_len); 12306 /* Copy AAD 18 bytes after the AAD pointer, according to the API */ 12307 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12308 12309 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12310 debug_hexdump(stdout, "aad:", 12311 sym_op->aead.aad.data, aad_len); 12312 } else { 12313 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, 12314 uint8_t *, IV_OFFSET); 12315 12316 rte_memcpy(iv_ptr, tdata->iv.data, iv_len); 12317 12318 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16); 12319 12320 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend( 12321 ut_params->ibuf, aad_len_pad); 12322 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data, 12323 "no room to prepend aad"); 12324 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova( 12325 ut_params->ibuf); 12326 12327 memset(sym_op->aead.aad.data, 0, aad_len); 12328 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len); 12329 12330 debug_hexdump(stdout, "iv:", iv_ptr, iv_len); 12331 debug_hexdump(stdout, "aad:", 12332 sym_op->aead.aad.data, aad_len); 12333 } 12334 12335 sym_op->aead.data.length = tdata->plaintext.len; 12336 sym_op->aead.data.offset = aad_len_pad; 12337 12338 return 0; 12339 } 12340 12341 #define SGL_MAX_NO 16 12342 12343 static int 12344 test_authenticated_encryption_SGL(const struct aead_test_data *tdata, 12345 const int oop, uint32_t fragsz, uint32_t fragsz_oop) 12346 { 12347 struct crypto_testsuite_params *ts_params = &testsuite_params; 12348 struct crypto_unittest_params *ut_params = &unittest_params; 12349 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL; 12350 int retval; 12351 int to_trn = 0; 12352 int to_trn_tbl[SGL_MAX_NO]; 12353 int segs = 1; 12354 unsigned int trn_data = 0; 12355 uint8_t *plaintext, *ciphertext, *auth_tag; 12356 struct rte_cryptodev_info dev_info; 12357 12358 /* Verify the capabilities */ 12359 struct rte_cryptodev_sym_capability_idx cap_idx; 12360 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD; 12361 cap_idx.algo.aead = tdata->algo; 12362 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0], 12363 &cap_idx) == NULL) 12364 return -ENOTSUP; 12365 12366 /* OOP not supported with CPU crypto */ 12367 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12368 return -ENOTSUP; 12369 12370 /* Detailed check for the particular SGL support flag */ 12371 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info); 12372 if (!oop) { 12373 unsigned int sgl_in = fragsz < tdata->plaintext.len; 12374 if (sgl_in && (!(dev_info.feature_flags & 12375 RTE_CRYPTODEV_FF_IN_PLACE_SGL))) 12376 return -ENOTSUP; 12377 12378 uint64_t feat_flags = dev_info.feature_flags; 12379 12380 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) && 12381 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) { 12382 printf("Device doesn't support RAW data-path APIs.\n"); 12383 return -ENOTSUP; 12384 } 12385 } else { 12386 unsigned int sgl_in = fragsz < tdata->plaintext.len; 12387 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) < 12388 tdata->plaintext.len; 12389 /* Raw data path API does not support OOP */ 12390 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12391 return -ENOTSUP; 12392 if (sgl_in && !sgl_out) { 12393 if (!(dev_info.feature_flags & 12394 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) 12395 return -ENOTSUP; 12396 } else if (!sgl_in && sgl_out) { 12397 if (!(dev_info.feature_flags & 12398 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT)) 12399 return -ENOTSUP; 12400 } else if (sgl_in && sgl_out) { 12401 if (!(dev_info.feature_flags & 12402 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) 12403 return -ENOTSUP; 12404 } 12405 } 12406 12407 if (fragsz > tdata->plaintext.len) 12408 fragsz = tdata->plaintext.len; 12409 12410 uint16_t plaintext_len = fragsz; 12411 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz; 12412 12413 if (fragsz_oop > tdata->plaintext.len) 12414 frag_size_oop = tdata->plaintext.len; 12415 12416 int ecx = 0; 12417 void *digest_mem = NULL; 12418 12419 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16); 12420 12421 if (tdata->plaintext.len % fragsz != 0) { 12422 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO) 12423 return 1; 12424 } else { 12425 if (tdata->plaintext.len / fragsz > SGL_MAX_NO) 12426 return 1; 12427 } 12428 12429 /* 12430 * For out-op-place we need to alloc another mbuf 12431 */ 12432 if (oop) { 12433 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12434 rte_pktmbuf_append(ut_params->obuf, 12435 frag_size_oop + prepend_len); 12436 buf_oop = ut_params->obuf; 12437 } 12438 12439 /* Create AEAD session */ 12440 retval = create_aead_session(ts_params->valid_devs[0], 12441 tdata->algo, 12442 RTE_CRYPTO_AEAD_OP_ENCRYPT, 12443 tdata->key.data, tdata->key.len, 12444 tdata->aad.len, tdata->auth_tag.len, 12445 tdata->iv.len); 12446 if (retval < 0) 12447 return retval; 12448 12449 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12450 12451 /* clear mbuf payload */ 12452 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0, 12453 rte_pktmbuf_tailroom(ut_params->ibuf)); 12454 12455 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12456 plaintext_len); 12457 12458 memcpy(plaintext, tdata->plaintext.data, plaintext_len); 12459 12460 trn_data += plaintext_len; 12461 12462 buf = ut_params->ibuf; 12463 12464 /* 12465 * Loop until no more fragments 12466 */ 12467 12468 while (trn_data < tdata->plaintext.len) { 12469 ++segs; 12470 to_trn = (tdata->plaintext.len - trn_data < fragsz) ? 12471 (tdata->plaintext.len - trn_data) : fragsz; 12472 12473 to_trn_tbl[ecx++] = to_trn; 12474 12475 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool); 12476 buf = buf->next; 12477 12478 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0, 12479 rte_pktmbuf_tailroom(buf)); 12480 12481 /* OOP */ 12482 if (oop && !fragsz_oop) { 12483 buf_last_oop = buf_oop->next = 12484 rte_pktmbuf_alloc(ts_params->mbuf_pool); 12485 buf_oop = buf_oop->next; 12486 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 12487 0, rte_pktmbuf_tailroom(buf_oop)); 12488 rte_pktmbuf_append(buf_oop, to_trn); 12489 } 12490 12491 plaintext = (uint8_t *)rte_pktmbuf_append(buf, 12492 to_trn); 12493 12494 memcpy(plaintext, tdata->plaintext.data + trn_data, 12495 to_trn); 12496 trn_data += to_trn; 12497 if (trn_data == tdata->plaintext.len) { 12498 if (oop) { 12499 if (!fragsz_oop) 12500 digest_mem = rte_pktmbuf_append(buf_oop, 12501 tdata->auth_tag.len); 12502 } else 12503 digest_mem = (uint8_t *)rte_pktmbuf_append(buf, 12504 tdata->auth_tag.len); 12505 } 12506 } 12507 12508 uint64_t digest_phys = 0; 12509 12510 ut_params->ibuf->nb_segs = segs; 12511 12512 segs = 1; 12513 if (fragsz_oop && oop) { 12514 to_trn = 0; 12515 ecx = 0; 12516 12517 if (frag_size_oop == tdata->plaintext.len) { 12518 digest_mem = rte_pktmbuf_append(ut_params->obuf, 12519 tdata->auth_tag.len); 12520 12521 digest_phys = rte_pktmbuf_iova_offset( 12522 ut_params->obuf, 12523 tdata->plaintext.len + prepend_len); 12524 } 12525 12526 trn_data = frag_size_oop; 12527 while (trn_data < tdata->plaintext.len) { 12528 ++segs; 12529 to_trn = 12530 (tdata->plaintext.len - trn_data < 12531 frag_size_oop) ? 12532 (tdata->plaintext.len - trn_data) : 12533 frag_size_oop; 12534 12535 to_trn_tbl[ecx++] = to_trn; 12536 12537 buf_last_oop = buf_oop->next = 12538 rte_pktmbuf_alloc(ts_params->mbuf_pool); 12539 buf_oop = buf_oop->next; 12540 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *), 12541 0, rte_pktmbuf_tailroom(buf_oop)); 12542 rte_pktmbuf_append(buf_oop, to_trn); 12543 12544 trn_data += to_trn; 12545 12546 if (trn_data == tdata->plaintext.len) { 12547 digest_mem = rte_pktmbuf_append(buf_oop, 12548 tdata->auth_tag.len); 12549 } 12550 } 12551 12552 ut_params->obuf->nb_segs = segs; 12553 } 12554 12555 /* 12556 * Place digest at the end of the last buffer 12557 */ 12558 if (!digest_phys) 12559 digest_phys = rte_pktmbuf_iova(buf) + to_trn; 12560 if (oop && buf_last_oop) 12561 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn; 12562 12563 if (!digest_mem && !oop) { 12564 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf, 12565 + tdata->auth_tag.len); 12566 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf, 12567 tdata->plaintext.len); 12568 } 12569 12570 /* Create AEAD operation */ 12571 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT, 12572 tdata, digest_mem, digest_phys); 12573 12574 if (retval < 0) 12575 return retval; 12576 12577 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess); 12578 12579 ut_params->op->sym->m_src = ut_params->ibuf; 12580 if (oop) 12581 ut_params->op->sym->m_dst = ut_params->obuf; 12582 12583 /* Process crypto operation */ 12584 if (oop == IN_PLACE && 12585 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) 12586 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op); 12587 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST) 12588 process_sym_raw_dp_op(ts_params->valid_devs[0], 0, 12589 ut_params->op, 0, 0, 0, 0); 12590 else 12591 TEST_ASSERT_NOT_NULL( 12592 process_crypto_request(ts_params->valid_devs[0], 12593 ut_params->op), "failed to process sym crypto op"); 12594 12595 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS, 12596 "crypto op processing failed"); 12597 12598 12599 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src, 12600 uint8_t *, prepend_len); 12601 if (oop) { 12602 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst, 12603 uint8_t *, prepend_len); 12604 } 12605 12606 if (fragsz_oop) 12607 fragsz = fragsz_oop; 12608 12609 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12610 ciphertext, 12611 tdata->ciphertext.data, 12612 fragsz, 12613 "Ciphertext data not as expected"); 12614 12615 buf = ut_params->op->sym->m_src->next; 12616 if (oop) 12617 buf = ut_params->op->sym->m_dst->next; 12618 12619 unsigned int off = fragsz; 12620 12621 ecx = 0; 12622 while (buf) { 12623 ciphertext = rte_pktmbuf_mtod(buf, 12624 uint8_t *); 12625 12626 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12627 ciphertext, 12628 tdata->ciphertext.data + off, 12629 to_trn_tbl[ecx], 12630 "Ciphertext data not as expected"); 12631 12632 off += to_trn_tbl[ecx++]; 12633 buf = buf->next; 12634 } 12635 12636 auth_tag = digest_mem; 12637 TEST_ASSERT_BUFFERS_ARE_EQUAL( 12638 auth_tag, 12639 tdata->auth_tag.data, 12640 tdata->auth_tag.len, 12641 "Generated auth tag not as expected"); 12642 12643 return 0; 12644 } 12645 12646 static int 12647 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void) 12648 { 12649 return test_authenticated_encryption_SGL( 12650 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400); 12651 } 12652 12653 static int 12654 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void) 12655 { 12656 return test_authenticated_encryption_SGL( 12657 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000); 12658 } 12659 12660 static int 12661 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void) 12662 { 12663 return test_authenticated_encryption_SGL( 12664 &gcm_test_case_8, OUT_OF_PLACE, 400, 12665 gcm_test_case_8.plaintext.len); 12666 } 12667 12668 static int 12669 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void) 12670 { 12671 /* This test is not for OPENSSL PMD */ 12672 if (gbl_driver_id == rte_cryptodev_driver_id_get( 12673 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) 12674 return -ENOTSUP; 12675 12676 return test_authenticated_encryption_SGL( 12677 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0); 12678 } 12679 12680 static int 12681 test_authentication_verify_fail_when_data_corrupted( 12682 struct crypto_testsuite_params *ts_params, 12683 struct crypto_unittest_params *ut_params, 12684 const struct test_crypto_vector *reference) 12685 { 12686 return test_authentication_verify_fail_when_data_corruption( 12687 ts_params, ut_params, reference, 1); 12688 } 12689 12690 static int 12691 test_authentication_verify_fail_when_tag_corrupted( 12692 struct crypto_testsuite_params *ts_params, 12693 struct crypto_unittest_params *ut_params, 12694 const struct test_crypto_vector *reference) 12695 { 12696 return test_authentication_verify_fail_when_data_corruption( 12697 ts_params, ut_params, reference, 0); 12698 } 12699 12700 static int 12701 test_authentication_verify_GMAC_fail_when_data_corrupted( 12702 struct crypto_testsuite_params *ts_params, 12703 struct crypto_unittest_params *ut_params, 12704 const struct test_crypto_vector *reference) 12705 { 12706 return test_authentication_verify_GMAC_fail_when_corruption( 12707 ts_params, ut_params, reference, 1); 12708 } 12709 12710 static int 12711 test_authentication_verify_GMAC_fail_when_tag_corrupted( 12712 struct crypto_testsuite_params *ts_params, 12713 struct crypto_unittest_params *ut_params, 12714 const struct test_crypto_vector *reference) 12715 { 12716 return test_authentication_verify_GMAC_fail_when_corruption( 12717 ts_params, ut_params, reference, 0); 12718 } 12719 12720 static int 12721 test_authenticated_decryption_fail_when_data_corrupted( 12722 struct crypto_testsuite_params *ts_params, 12723 struct crypto_unittest_params *ut_params, 12724 const struct test_crypto_vector *reference) 12725 { 12726 return test_authenticated_decryption_fail_when_corruption( 12727 ts_params, ut_params, reference, 1); 12728 } 12729 12730 static int 12731 test_authenticated_decryption_fail_when_tag_corrupted( 12732 struct crypto_testsuite_params *ts_params, 12733 struct crypto_unittest_params *ut_params, 12734 const struct test_crypto_vector *reference) 12735 { 12736 return test_authenticated_decryption_fail_when_corruption( 12737 ts_params, ut_params, reference, 0); 12738 } 12739 12740 static int 12741 authentication_verify_HMAC_SHA1_fail_data_corrupt(void) 12742 { 12743 return test_authentication_verify_fail_when_data_corrupted( 12744 &testsuite_params, &unittest_params, 12745 &hmac_sha1_test_crypto_vector); 12746 } 12747 12748 static int 12749 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void) 12750 { 12751 return test_authentication_verify_fail_when_tag_corrupted( 12752 &testsuite_params, &unittest_params, 12753 &hmac_sha1_test_crypto_vector); 12754 } 12755 12756 static int 12757 authentication_verify_AES128_GMAC_fail_data_corrupt(void) 12758 { 12759 return test_authentication_verify_GMAC_fail_when_data_corrupted( 12760 &testsuite_params, &unittest_params, 12761 &aes128_gmac_test_vector); 12762 } 12763 12764 static int 12765 authentication_verify_AES128_GMAC_fail_tag_corrupt(void) 12766 { 12767 return test_authentication_verify_GMAC_fail_when_tag_corrupted( 12768 &testsuite_params, &unittest_params, 12769 &aes128_gmac_test_vector); 12770 } 12771 12772 static int 12773 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void) 12774 { 12775 return test_authenticated_decryption_fail_when_data_corrupted( 12776 &testsuite_params, 12777 &unittest_params, 12778 &aes128cbc_hmac_sha1_test_vector); 12779 } 12780 12781 static int 12782 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void) 12783 { 12784 return test_authenticated_decryption_fail_when_tag_corrupted( 12785 &testsuite_params, 12786 &unittest_params, 12787 &aes128cbc_hmac_sha1_test_vector); 12788 } 12789 12790 static int 12791 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void) 12792 { 12793 return test_authenticated_encryt_with_esn( 12794 &testsuite_params, 12795 &unittest_params, 12796 &aes128cbc_hmac_sha1_aad_test_vector); 12797 } 12798 12799 static int 12800 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void) 12801 { 12802 return test_authenticated_decrypt_with_esn( 12803 &testsuite_params, 12804 &unittest_params, 12805 &aes128cbc_hmac_sha1_aad_test_vector); 12806 } 12807 12808 static int 12809 test_chacha20_poly1305_encrypt_test_case_rfc8439(void) 12810 { 12811 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439); 12812 } 12813 12814 static int 12815 test_chacha20_poly1305_decrypt_test_case_rfc8439(void) 12816 { 12817 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439); 12818 } 12819 12820 #ifdef RTE_CRYPTO_SCHEDULER 12821 12822 /* global AESNI worker IDs for the scheduler test */ 12823 uint8_t aesni_ids[2]; 12824 12825 static int 12826 test_scheduler_attach_slave_op(void) 12827 { 12828 struct crypto_testsuite_params *ts_params = &testsuite_params; 12829 uint8_t sched_id = ts_params->valid_devs[0]; 12830 uint32_t nb_devs, i, nb_devs_attached = 0; 12831 int ret; 12832 char vdev_name[32]; 12833 12834 /* create 2 AESNI_MB if necessary */ 12835 nb_devs = rte_cryptodev_device_count_by_driver( 12836 rte_cryptodev_driver_id_get( 12837 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))); 12838 if (nb_devs < 2) { 12839 for (i = nb_devs; i < 2; i++) { 12840 snprintf(vdev_name, sizeof(vdev_name), "%s_%u", 12841 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), 12842 i); 12843 ret = rte_vdev_init(vdev_name, NULL); 12844 12845 TEST_ASSERT(ret == 0, 12846 "Failed to create instance %u of" 12847 " pmd : %s", 12848 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 12849 } 12850 } 12851 12852 /* attach 2 AESNI_MB cdevs */ 12853 for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2; 12854 i++) { 12855 struct rte_cryptodev_info info; 12856 unsigned int session_size; 12857 12858 rte_cryptodev_info_get(i, &info); 12859 if (info.driver_id != rte_cryptodev_driver_id_get( 12860 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) 12861 continue; 12862 12863 session_size = rte_cryptodev_sym_get_private_session_size(i); 12864 /* 12865 * Create the session mempool again, since now there are new devices 12866 * to use the mempool. 12867 */ 12868 if (ts_params->session_mpool) { 12869 rte_mempool_free(ts_params->session_mpool); 12870 ts_params->session_mpool = NULL; 12871 } 12872 if (ts_params->session_priv_mpool) { 12873 rte_mempool_free(ts_params->session_priv_mpool); 12874 ts_params->session_priv_mpool = NULL; 12875 } 12876 12877 if (info.sym.max_nb_sessions != 0 && 12878 info.sym.max_nb_sessions < MAX_NB_SESSIONS) { 12879 RTE_LOG(ERR, USER1, 12880 "Device does not support " 12881 "at least %u sessions\n", 12882 MAX_NB_SESSIONS); 12883 return TEST_FAILED; 12884 } 12885 /* 12886 * Create mempool with maximum number of sessions, 12887 * to include the session headers 12888 */ 12889 if (ts_params->session_mpool == NULL) { 12890 ts_params->session_mpool = 12891 rte_cryptodev_sym_session_pool_create( 12892 "test_sess_mp", 12893 MAX_NB_SESSIONS, 0, 0, 0, 12894 SOCKET_ID_ANY); 12895 TEST_ASSERT_NOT_NULL(ts_params->session_mpool, 12896 "session mempool allocation failed"); 12897 } 12898 12899 /* 12900 * Create mempool with maximum number of sessions, 12901 * to include device specific session private data 12902 */ 12903 if (ts_params->session_priv_mpool == NULL) { 12904 ts_params->session_priv_mpool = rte_mempool_create( 12905 "test_sess_mp_priv", 12906 MAX_NB_SESSIONS, 12907 session_size, 12908 0, 0, NULL, NULL, NULL, 12909 NULL, SOCKET_ID_ANY, 12910 0); 12911 12912 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool, 12913 "session mempool allocation failed"); 12914 } 12915 12916 ts_params->qp_conf.mp_session = ts_params->session_mpool; 12917 ts_params->qp_conf.mp_session_private = 12918 ts_params->session_priv_mpool; 12919 12920 ret = rte_cryptodev_scheduler_worker_attach(sched_id, 12921 (uint8_t)i); 12922 12923 TEST_ASSERT(ret == 0, 12924 "Failed to attach device %u of pmd : %s", i, 12925 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 12926 12927 aesni_ids[nb_devs_attached] = (uint8_t)i; 12928 12929 nb_devs_attached++; 12930 } 12931 12932 return 0; 12933 } 12934 12935 static int 12936 test_scheduler_detach_slave_op(void) 12937 { 12938 struct crypto_testsuite_params *ts_params = &testsuite_params; 12939 uint8_t sched_id = ts_params->valid_devs[0]; 12940 uint32_t i; 12941 int ret; 12942 12943 for (i = 0; i < 2; i++) { 12944 ret = rte_cryptodev_scheduler_worker_detach(sched_id, 12945 aesni_ids[i]); 12946 TEST_ASSERT(ret == 0, 12947 "Failed to detach device %u", aesni_ids[i]); 12948 } 12949 12950 return 0; 12951 } 12952 12953 static int 12954 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode) 12955 { 12956 struct crypto_testsuite_params *ts_params = &testsuite_params; 12957 uint8_t sched_id = ts_params->valid_devs[0]; 12958 /* set mode */ 12959 return rte_cryptodev_scheduler_mode_set(sched_id, 12960 scheduler_mode); 12961 } 12962 12963 static int 12964 test_scheduler_mode_roundrobin_op(void) 12965 { 12966 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) == 12967 0, "Failed to set roundrobin mode"); 12968 return 0; 12969 12970 } 12971 12972 static int 12973 test_scheduler_mode_multicore_op(void) 12974 { 12975 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) == 12976 0, "Failed to set multicore mode"); 12977 12978 return 0; 12979 } 12980 12981 static int 12982 test_scheduler_mode_failover_op(void) 12983 { 12984 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) == 12985 0, "Failed to set failover mode"); 12986 12987 return 0; 12988 } 12989 12990 static int 12991 test_scheduler_mode_pkt_size_distr_op(void) 12992 { 12993 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) == 12994 0, "Failed to set pktsize mode"); 12995 12996 return 0; 12997 } 12998 12999 static struct unit_test_suite cryptodev_scheduler_testsuite = { 13000 .suite_name = "Crypto Device Scheduler Unit Test Suite", 13001 .setup = testsuite_setup, 13002 .teardown = testsuite_teardown, 13003 .unit_test_cases = { 13004 /* Multi Core */ 13005 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 13006 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op), 13007 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13008 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13009 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13010 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 13011 13012 /* Round Robin */ 13013 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 13014 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op), 13015 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13016 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13017 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13018 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 13019 13020 /* Fail over */ 13021 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 13022 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op), 13023 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13024 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13025 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13026 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 13027 13028 /* PKT SIZE */ 13029 TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op), 13030 TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op), 13031 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13032 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13033 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13034 TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op), 13035 13036 TEST_CASES_END() /**< NULL terminate unit test array */ 13037 } 13038 }; 13039 13040 #endif /* RTE_CRYPTO_SCHEDULER */ 13041 13042 static struct unit_test_suite cryptodev_testsuite = { 13043 .suite_name = "Crypto Unit Test Suite", 13044 .setup = testsuite_setup, 13045 .teardown = testsuite_teardown, 13046 .unit_test_cases = { 13047 TEST_CASE_ST(ut_setup, ut_teardown, 13048 test_device_configure_invalid_dev_id), 13049 TEST_CASE_ST(ut_setup, ut_teardown, 13050 test_queue_pair_descriptor_setup), 13051 TEST_CASE_ST(ut_setup, ut_teardown, 13052 test_device_configure_invalid_queue_pair_ids), 13053 13054 TEST_CASE_ST(ut_setup, ut_teardown, 13055 test_multi_session), 13056 TEST_CASE_ST(ut_setup, ut_teardown, 13057 test_multi_session_random_usage), 13058 13059 TEST_CASE_ST(ut_setup, ut_teardown, 13060 test_null_invalid_operation), 13061 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation), 13062 13063 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13064 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13065 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13066 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 13067 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all), 13068 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all), 13069 TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all), 13070 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13071 TEST_CASE_ST(ut_setup, ut_teardown, test_stats), 13072 13073 /** AES CCM Authenticated Encryption 128 bits key */ 13074 TEST_CASE_ST(ut_setup, ut_teardown, 13075 test_AES_CCM_authenticated_encryption_test_case_128_1), 13076 TEST_CASE_ST(ut_setup, ut_teardown, 13077 test_AES_CCM_authenticated_encryption_test_case_128_2), 13078 TEST_CASE_ST(ut_setup, ut_teardown, 13079 test_AES_CCM_authenticated_encryption_test_case_128_3), 13080 13081 /** AES CCM Authenticated Decryption 128 bits key*/ 13082 TEST_CASE_ST(ut_setup, ut_teardown, 13083 test_AES_CCM_authenticated_decryption_test_case_128_1), 13084 TEST_CASE_ST(ut_setup, ut_teardown, 13085 test_AES_CCM_authenticated_decryption_test_case_128_2), 13086 TEST_CASE_ST(ut_setup, ut_teardown, 13087 test_AES_CCM_authenticated_decryption_test_case_128_3), 13088 13089 /** AES CCM Authenticated Encryption 192 bits key */ 13090 TEST_CASE_ST(ut_setup, ut_teardown, 13091 test_AES_CCM_authenticated_encryption_test_case_192_1), 13092 TEST_CASE_ST(ut_setup, ut_teardown, 13093 test_AES_CCM_authenticated_encryption_test_case_192_2), 13094 TEST_CASE_ST(ut_setup, ut_teardown, 13095 test_AES_CCM_authenticated_encryption_test_case_192_3), 13096 13097 /** AES CCM Authenticated Decryption 192 bits key*/ 13098 TEST_CASE_ST(ut_setup, ut_teardown, 13099 test_AES_CCM_authenticated_decryption_test_case_192_1), 13100 TEST_CASE_ST(ut_setup, ut_teardown, 13101 test_AES_CCM_authenticated_decryption_test_case_192_2), 13102 TEST_CASE_ST(ut_setup, ut_teardown, 13103 test_AES_CCM_authenticated_decryption_test_case_192_3), 13104 13105 /** AES CCM Authenticated Encryption 256 bits key */ 13106 TEST_CASE_ST(ut_setup, ut_teardown, 13107 test_AES_CCM_authenticated_encryption_test_case_256_1), 13108 TEST_CASE_ST(ut_setup, ut_teardown, 13109 test_AES_CCM_authenticated_encryption_test_case_256_2), 13110 TEST_CASE_ST(ut_setup, ut_teardown, 13111 test_AES_CCM_authenticated_encryption_test_case_256_3), 13112 13113 /** AES CCM Authenticated Decryption 256 bits key*/ 13114 TEST_CASE_ST(ut_setup, ut_teardown, 13115 test_AES_CCM_authenticated_decryption_test_case_256_1), 13116 TEST_CASE_ST(ut_setup, ut_teardown, 13117 test_AES_CCM_authenticated_decryption_test_case_256_2), 13118 TEST_CASE_ST(ut_setup, ut_teardown, 13119 test_AES_CCM_authenticated_decryption_test_case_256_3), 13120 13121 /** AES GCM Authenticated Encryption */ 13122 TEST_CASE_ST(ut_setup, ut_teardown, 13123 test_AES_GCM_auth_encrypt_SGL_in_place_1500B), 13124 TEST_CASE_ST(ut_setup, ut_teardown, 13125 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B), 13126 TEST_CASE_ST(ut_setup, ut_teardown, 13127 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B), 13128 TEST_CASE_ST(ut_setup, ut_teardown, 13129 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg), 13130 TEST_CASE_ST(ut_setup, ut_teardown, 13131 test_AES_GCM_authenticated_encryption_test_case_1), 13132 TEST_CASE_ST(ut_setup, ut_teardown, 13133 test_AES_GCM_authenticated_encryption_test_case_2), 13134 TEST_CASE_ST(ut_setup, ut_teardown, 13135 test_AES_GCM_authenticated_encryption_test_case_3), 13136 TEST_CASE_ST(ut_setup, ut_teardown, 13137 test_AES_GCM_authenticated_encryption_test_case_4), 13138 TEST_CASE_ST(ut_setup, ut_teardown, 13139 test_AES_GCM_authenticated_encryption_test_case_5), 13140 TEST_CASE_ST(ut_setup, ut_teardown, 13141 test_AES_GCM_authenticated_encryption_test_case_6), 13142 TEST_CASE_ST(ut_setup, ut_teardown, 13143 test_AES_GCM_authenticated_encryption_test_case_7), 13144 TEST_CASE_ST(ut_setup, ut_teardown, 13145 test_AES_GCM_authenticated_encryption_test_case_8), 13146 TEST_CASE_ST(ut_setup, ut_teardown, 13147 test_AES_GCM_J0_authenticated_encryption_test_case_1), 13148 13149 /** AES GCM Authenticated Decryption */ 13150 TEST_CASE_ST(ut_setup, ut_teardown, 13151 test_AES_GCM_authenticated_decryption_test_case_1), 13152 TEST_CASE_ST(ut_setup, ut_teardown, 13153 test_AES_GCM_authenticated_decryption_test_case_2), 13154 TEST_CASE_ST(ut_setup, ut_teardown, 13155 test_AES_GCM_authenticated_decryption_test_case_3), 13156 TEST_CASE_ST(ut_setup, ut_teardown, 13157 test_AES_GCM_authenticated_decryption_test_case_4), 13158 TEST_CASE_ST(ut_setup, ut_teardown, 13159 test_AES_GCM_authenticated_decryption_test_case_5), 13160 TEST_CASE_ST(ut_setup, ut_teardown, 13161 test_AES_GCM_authenticated_decryption_test_case_6), 13162 TEST_CASE_ST(ut_setup, ut_teardown, 13163 test_AES_GCM_authenticated_decryption_test_case_7), 13164 TEST_CASE_ST(ut_setup, ut_teardown, 13165 test_AES_GCM_authenticated_decryption_test_case_8), 13166 TEST_CASE_ST(ut_setup, ut_teardown, 13167 test_AES_GCM_J0_authenticated_decryption_test_case_1), 13168 13169 /** AES GCM Authenticated Encryption 192 bits key */ 13170 TEST_CASE_ST(ut_setup, ut_teardown, 13171 test_AES_GCM_auth_encryption_test_case_192_1), 13172 TEST_CASE_ST(ut_setup, ut_teardown, 13173 test_AES_GCM_auth_encryption_test_case_192_2), 13174 TEST_CASE_ST(ut_setup, ut_teardown, 13175 test_AES_GCM_auth_encryption_test_case_192_3), 13176 TEST_CASE_ST(ut_setup, ut_teardown, 13177 test_AES_GCM_auth_encryption_test_case_192_4), 13178 TEST_CASE_ST(ut_setup, ut_teardown, 13179 test_AES_GCM_auth_encryption_test_case_192_5), 13180 TEST_CASE_ST(ut_setup, ut_teardown, 13181 test_AES_GCM_auth_encryption_test_case_192_6), 13182 TEST_CASE_ST(ut_setup, ut_teardown, 13183 test_AES_GCM_auth_encryption_test_case_192_7), 13184 13185 /** AES GCM Authenticated Decryption 192 bits key */ 13186 TEST_CASE_ST(ut_setup, ut_teardown, 13187 test_AES_GCM_auth_decryption_test_case_192_1), 13188 TEST_CASE_ST(ut_setup, ut_teardown, 13189 test_AES_GCM_auth_decryption_test_case_192_2), 13190 TEST_CASE_ST(ut_setup, ut_teardown, 13191 test_AES_GCM_auth_decryption_test_case_192_3), 13192 TEST_CASE_ST(ut_setup, ut_teardown, 13193 test_AES_GCM_auth_decryption_test_case_192_4), 13194 TEST_CASE_ST(ut_setup, ut_teardown, 13195 test_AES_GCM_auth_decryption_test_case_192_5), 13196 TEST_CASE_ST(ut_setup, ut_teardown, 13197 test_AES_GCM_auth_decryption_test_case_192_6), 13198 TEST_CASE_ST(ut_setup, ut_teardown, 13199 test_AES_GCM_auth_decryption_test_case_192_7), 13200 13201 /** AES GCM Authenticated Encryption 256 bits key */ 13202 TEST_CASE_ST(ut_setup, ut_teardown, 13203 test_AES_GCM_auth_encryption_test_case_256_1), 13204 TEST_CASE_ST(ut_setup, ut_teardown, 13205 test_AES_GCM_auth_encryption_test_case_256_2), 13206 TEST_CASE_ST(ut_setup, ut_teardown, 13207 test_AES_GCM_auth_encryption_test_case_256_3), 13208 TEST_CASE_ST(ut_setup, ut_teardown, 13209 test_AES_GCM_auth_encryption_test_case_256_4), 13210 TEST_CASE_ST(ut_setup, ut_teardown, 13211 test_AES_GCM_auth_encryption_test_case_256_5), 13212 TEST_CASE_ST(ut_setup, ut_teardown, 13213 test_AES_GCM_auth_encryption_test_case_256_6), 13214 TEST_CASE_ST(ut_setup, ut_teardown, 13215 test_AES_GCM_auth_encryption_test_case_256_7), 13216 13217 /** AES GCM Authenticated Decryption 256 bits key */ 13218 TEST_CASE_ST(ut_setup, ut_teardown, 13219 test_AES_GCM_auth_decryption_test_case_256_1), 13220 TEST_CASE_ST(ut_setup, ut_teardown, 13221 test_AES_GCM_auth_decryption_test_case_256_2), 13222 TEST_CASE_ST(ut_setup, ut_teardown, 13223 test_AES_GCM_auth_decryption_test_case_256_3), 13224 TEST_CASE_ST(ut_setup, ut_teardown, 13225 test_AES_GCM_auth_decryption_test_case_256_4), 13226 TEST_CASE_ST(ut_setup, ut_teardown, 13227 test_AES_GCM_auth_decryption_test_case_256_5), 13228 TEST_CASE_ST(ut_setup, ut_teardown, 13229 test_AES_GCM_auth_decryption_test_case_256_6), 13230 TEST_CASE_ST(ut_setup, ut_teardown, 13231 test_AES_GCM_auth_decryption_test_case_256_7), 13232 13233 /** AES GCM Authenticated Encryption big aad size */ 13234 TEST_CASE_ST(ut_setup, ut_teardown, 13235 test_AES_GCM_auth_encryption_test_case_aad_1), 13236 TEST_CASE_ST(ut_setup, ut_teardown, 13237 test_AES_GCM_auth_encryption_test_case_aad_2), 13238 13239 /** AES GCM Authenticated Decryption big aad size */ 13240 TEST_CASE_ST(ut_setup, ut_teardown, 13241 test_AES_GCM_auth_decryption_test_case_aad_1), 13242 TEST_CASE_ST(ut_setup, ut_teardown, 13243 test_AES_GCM_auth_decryption_test_case_aad_2), 13244 13245 /** Out of place tests */ 13246 TEST_CASE_ST(ut_setup, ut_teardown, 13247 test_AES_GCM_authenticated_encryption_oop_test_case_1), 13248 TEST_CASE_ST(ut_setup, ut_teardown, 13249 test_AES_GCM_authenticated_decryption_oop_test_case_1), 13250 13251 /** Session-less tests */ 13252 TEST_CASE_ST(ut_setup, ut_teardown, 13253 test_AES_GCM_authenticated_encryption_sessionless_test_case_1), 13254 TEST_CASE_ST(ut_setup, ut_teardown, 13255 test_AES_GCM_authenticated_decryption_sessionless_test_case_1), 13256 13257 /** AES GMAC Authentication */ 13258 TEST_CASE_ST(ut_setup, ut_teardown, 13259 test_AES_GMAC_authentication_test_case_1), 13260 TEST_CASE_ST(ut_setup, ut_teardown, 13261 test_AES_GMAC_authentication_verify_test_case_1), 13262 TEST_CASE_ST(ut_setup, ut_teardown, 13263 test_AES_GMAC_authentication_test_case_2), 13264 TEST_CASE_ST(ut_setup, ut_teardown, 13265 test_AES_GMAC_authentication_verify_test_case_2), 13266 TEST_CASE_ST(ut_setup, ut_teardown, 13267 test_AES_GMAC_authentication_test_case_3), 13268 TEST_CASE_ST(ut_setup, ut_teardown, 13269 test_AES_GMAC_authentication_verify_test_case_3), 13270 TEST_CASE_ST(ut_setup, ut_teardown, 13271 test_AES_GMAC_authentication_test_case_4), 13272 TEST_CASE_ST(ut_setup, ut_teardown, 13273 test_AES_GMAC_authentication_verify_test_case_4), 13274 TEST_CASE_ST(ut_setup, ut_teardown, 13275 test_AES_GMAC_authentication_SGL_40B), 13276 TEST_CASE_ST(ut_setup, ut_teardown, 13277 test_AES_GMAC_authentication_SGL_80B), 13278 TEST_CASE_ST(ut_setup, ut_teardown, 13279 test_AES_GMAC_authentication_SGL_2048B), 13280 TEST_CASE_ST(ut_setup, ut_teardown, 13281 test_AES_GMAC_authentication_SGL_2047B), 13282 13283 /** Chacha20-Poly1305 */ 13284 TEST_CASE_ST(ut_setup, ut_teardown, 13285 test_chacha20_poly1305_encrypt_test_case_rfc8439), 13286 TEST_CASE_ST(ut_setup, ut_teardown, 13287 test_chacha20_poly1305_decrypt_test_case_rfc8439), 13288 /** SNOW 3G encrypt only (UEA2) */ 13289 TEST_CASE_ST(ut_setup, ut_teardown, 13290 test_snow3g_encryption_test_case_1), 13291 TEST_CASE_ST(ut_setup, ut_teardown, 13292 test_snow3g_encryption_test_case_2), 13293 TEST_CASE_ST(ut_setup, ut_teardown, 13294 test_snow3g_encryption_test_case_3), 13295 TEST_CASE_ST(ut_setup, ut_teardown, 13296 test_snow3g_encryption_test_case_4), 13297 TEST_CASE_ST(ut_setup, ut_teardown, 13298 test_snow3g_encryption_test_case_5), 13299 13300 TEST_CASE_ST(ut_setup, ut_teardown, 13301 test_snow3g_encryption_test_case_1_oop), 13302 TEST_CASE_ST(ut_setup, ut_teardown, 13303 test_snow3g_encryption_test_case_1_oop_sgl), 13304 TEST_CASE_ST(ut_setup, ut_teardown, 13305 test_snow3g_encryption_test_case_1_offset_oop), 13306 TEST_CASE_ST(ut_setup, ut_teardown, 13307 test_snow3g_decryption_test_case_1_oop), 13308 13309 /** SNOW 3G generate auth, then encrypt (UEA2) */ 13310 TEST_CASE_ST(ut_setup, ut_teardown, 13311 test_snow3g_auth_cipher_test_case_1), 13312 TEST_CASE_ST(ut_setup, ut_teardown, 13313 test_snow3g_auth_cipher_test_case_2), 13314 TEST_CASE_ST(ut_setup, ut_teardown, 13315 test_snow3g_auth_cipher_test_case_2_oop), 13316 TEST_CASE_ST(ut_setup, ut_teardown, 13317 test_snow3g_auth_cipher_part_digest_enc), 13318 TEST_CASE_ST(ut_setup, ut_teardown, 13319 test_snow3g_auth_cipher_part_digest_enc_oop), 13320 TEST_CASE_ST(ut_setup, ut_teardown, 13321 test_snow3g_auth_cipher_test_case_3_sgl), 13322 TEST_CASE_ST(ut_setup, ut_teardown, 13323 test_snow3g_auth_cipher_test_case_3_oop_sgl), 13324 TEST_CASE_ST(ut_setup, ut_teardown, 13325 test_snow3g_auth_cipher_part_digest_enc_sgl), 13326 TEST_CASE_ST(ut_setup, ut_teardown, 13327 test_snow3g_auth_cipher_part_digest_enc_oop_sgl), 13328 13329 /** SNOW 3G decrypt (UEA2), then verify auth */ 13330 TEST_CASE_ST(ut_setup, ut_teardown, 13331 test_snow3g_auth_cipher_verify_test_case_1), 13332 TEST_CASE_ST(ut_setup, ut_teardown, 13333 test_snow3g_auth_cipher_verify_test_case_2), 13334 TEST_CASE_ST(ut_setup, ut_teardown, 13335 test_snow3g_auth_cipher_verify_test_case_2_oop), 13336 TEST_CASE_ST(ut_setup, ut_teardown, 13337 test_snow3g_auth_cipher_verify_part_digest_enc), 13338 TEST_CASE_ST(ut_setup, ut_teardown, 13339 test_snow3g_auth_cipher_verify_part_digest_enc_oop), 13340 TEST_CASE_ST(ut_setup, ut_teardown, 13341 test_snow3g_auth_cipher_verify_test_case_3_sgl), 13342 TEST_CASE_ST(ut_setup, ut_teardown, 13343 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl), 13344 TEST_CASE_ST(ut_setup, ut_teardown, 13345 test_snow3g_auth_cipher_verify_part_digest_enc_sgl), 13346 TEST_CASE_ST(ut_setup, ut_teardown, 13347 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl), 13348 13349 /** SNOW 3G decrypt only (UEA2) */ 13350 TEST_CASE_ST(ut_setup, ut_teardown, 13351 test_snow3g_decryption_test_case_1), 13352 TEST_CASE_ST(ut_setup, ut_teardown, 13353 test_snow3g_decryption_test_case_2), 13354 TEST_CASE_ST(ut_setup, ut_teardown, 13355 test_snow3g_decryption_test_case_3), 13356 TEST_CASE_ST(ut_setup, ut_teardown, 13357 test_snow3g_decryption_test_case_4), 13358 TEST_CASE_ST(ut_setup, ut_teardown, 13359 test_snow3g_decryption_test_case_5), 13360 TEST_CASE_ST(ut_setup, ut_teardown, 13361 test_snow3g_decryption_with_digest_test_case_1), 13362 TEST_CASE_ST(ut_setup, ut_teardown, 13363 test_snow3g_hash_generate_test_case_1), 13364 TEST_CASE_ST(ut_setup, ut_teardown, 13365 test_snow3g_hash_generate_test_case_2), 13366 TEST_CASE_ST(ut_setup, ut_teardown, 13367 test_snow3g_hash_generate_test_case_3), 13368 /* Tests with buffers which length is not byte-aligned */ 13369 TEST_CASE_ST(ut_setup, ut_teardown, 13370 test_snow3g_hash_generate_test_case_4), 13371 TEST_CASE_ST(ut_setup, ut_teardown, 13372 test_snow3g_hash_generate_test_case_5), 13373 TEST_CASE_ST(ut_setup, ut_teardown, 13374 test_snow3g_hash_generate_test_case_6), 13375 TEST_CASE_ST(ut_setup, ut_teardown, 13376 test_snow3g_hash_verify_test_case_1), 13377 TEST_CASE_ST(ut_setup, ut_teardown, 13378 test_snow3g_hash_verify_test_case_2), 13379 TEST_CASE_ST(ut_setup, ut_teardown, 13380 test_snow3g_hash_verify_test_case_3), 13381 /* Tests with buffers which length is not byte-aligned */ 13382 TEST_CASE_ST(ut_setup, ut_teardown, 13383 test_snow3g_hash_verify_test_case_4), 13384 TEST_CASE_ST(ut_setup, ut_teardown, 13385 test_snow3g_hash_verify_test_case_5), 13386 TEST_CASE_ST(ut_setup, ut_teardown, 13387 test_snow3g_hash_verify_test_case_6), 13388 TEST_CASE_ST(ut_setup, ut_teardown, 13389 test_snow3g_cipher_auth_test_case_1), 13390 TEST_CASE_ST(ut_setup, ut_teardown, 13391 test_snow3g_auth_cipher_with_digest_test_case_1), 13392 13393 /** ZUC encrypt only (EEA3) */ 13394 TEST_CASE_ST(ut_setup, ut_teardown, 13395 test_zuc_encryption_test_case_1), 13396 TEST_CASE_ST(ut_setup, ut_teardown, 13397 test_zuc_encryption_test_case_2), 13398 TEST_CASE_ST(ut_setup, ut_teardown, 13399 test_zuc_encryption_test_case_3), 13400 TEST_CASE_ST(ut_setup, ut_teardown, 13401 test_zuc_encryption_test_case_4), 13402 TEST_CASE_ST(ut_setup, ut_teardown, 13403 test_zuc_encryption_test_case_5), 13404 TEST_CASE_ST(ut_setup, ut_teardown, 13405 test_zuc_encryption_test_case_6_sgl), 13406 13407 /** ZUC authenticate (EIA3) */ 13408 TEST_CASE_ST(ut_setup, ut_teardown, 13409 test_zuc_hash_generate_test_case_1), 13410 TEST_CASE_ST(ut_setup, ut_teardown, 13411 test_zuc_hash_generate_test_case_2), 13412 TEST_CASE_ST(ut_setup, ut_teardown, 13413 test_zuc_hash_generate_test_case_3), 13414 TEST_CASE_ST(ut_setup, ut_teardown, 13415 test_zuc_hash_generate_test_case_4), 13416 TEST_CASE_ST(ut_setup, ut_teardown, 13417 test_zuc_hash_generate_test_case_5), 13418 TEST_CASE_ST(ut_setup, ut_teardown, 13419 test_zuc_hash_generate_test_case_6), 13420 TEST_CASE_ST(ut_setup, ut_teardown, 13421 test_zuc_hash_generate_test_case_7), 13422 TEST_CASE_ST(ut_setup, ut_teardown, 13423 test_zuc_hash_generate_test_case_8), 13424 13425 /** ZUC alg-chain (EEA3/EIA3) */ 13426 TEST_CASE_ST(ut_setup, ut_teardown, 13427 test_zuc_cipher_auth_test_case_1), 13428 TEST_CASE_ST(ut_setup, ut_teardown, 13429 test_zuc_cipher_auth_test_case_2), 13430 13431 /** ZUC generate auth, then encrypt (EEA3) */ 13432 TEST_CASE_ST(ut_setup, ut_teardown, 13433 test_zuc_auth_cipher_test_case_1), 13434 TEST_CASE_ST(ut_setup, ut_teardown, 13435 test_zuc_auth_cipher_test_case_1_oop), 13436 TEST_CASE_ST(ut_setup, ut_teardown, 13437 test_zuc_auth_cipher_test_case_1_sgl), 13438 TEST_CASE_ST(ut_setup, ut_teardown, 13439 test_zuc_auth_cipher_test_case_1_oop_sgl), 13440 13441 /** ZUC decrypt (EEA3), then verify auth */ 13442 TEST_CASE_ST(ut_setup, ut_teardown, 13443 test_zuc_auth_cipher_verify_test_case_1), 13444 TEST_CASE_ST(ut_setup, ut_teardown, 13445 test_zuc_auth_cipher_verify_test_case_1_oop), 13446 TEST_CASE_ST(ut_setup, ut_teardown, 13447 test_zuc_auth_cipher_verify_test_case_1_sgl), 13448 TEST_CASE_ST(ut_setup, ut_teardown, 13449 test_zuc_auth_cipher_verify_test_case_1_oop_sgl), 13450 13451 /** HMAC_MD5 Authentication */ 13452 TEST_CASE_ST(ut_setup, ut_teardown, 13453 test_MD5_HMAC_generate_case_1), 13454 TEST_CASE_ST(ut_setup, ut_teardown, 13455 test_MD5_HMAC_verify_case_1), 13456 TEST_CASE_ST(ut_setup, ut_teardown, 13457 test_MD5_HMAC_generate_case_2), 13458 TEST_CASE_ST(ut_setup, ut_teardown, 13459 test_MD5_HMAC_verify_case_2), 13460 13461 /** KASUMI hash only (UIA1) */ 13462 TEST_CASE_ST(ut_setup, ut_teardown, 13463 test_kasumi_hash_generate_test_case_1), 13464 TEST_CASE_ST(ut_setup, ut_teardown, 13465 test_kasumi_hash_generate_test_case_2), 13466 TEST_CASE_ST(ut_setup, ut_teardown, 13467 test_kasumi_hash_generate_test_case_3), 13468 TEST_CASE_ST(ut_setup, ut_teardown, 13469 test_kasumi_hash_generate_test_case_4), 13470 TEST_CASE_ST(ut_setup, ut_teardown, 13471 test_kasumi_hash_generate_test_case_5), 13472 TEST_CASE_ST(ut_setup, ut_teardown, 13473 test_kasumi_hash_generate_test_case_6), 13474 13475 TEST_CASE_ST(ut_setup, ut_teardown, 13476 test_kasumi_hash_verify_test_case_1), 13477 TEST_CASE_ST(ut_setup, ut_teardown, 13478 test_kasumi_hash_verify_test_case_2), 13479 TEST_CASE_ST(ut_setup, ut_teardown, 13480 test_kasumi_hash_verify_test_case_3), 13481 TEST_CASE_ST(ut_setup, ut_teardown, 13482 test_kasumi_hash_verify_test_case_4), 13483 TEST_CASE_ST(ut_setup, ut_teardown, 13484 test_kasumi_hash_verify_test_case_5), 13485 13486 /** KASUMI encrypt only (UEA1) */ 13487 TEST_CASE_ST(ut_setup, ut_teardown, 13488 test_kasumi_encryption_test_case_1), 13489 TEST_CASE_ST(ut_setup, ut_teardown, 13490 test_kasumi_encryption_test_case_1_sgl), 13491 TEST_CASE_ST(ut_setup, ut_teardown, 13492 test_kasumi_encryption_test_case_1_oop), 13493 TEST_CASE_ST(ut_setup, ut_teardown, 13494 test_kasumi_encryption_test_case_1_oop_sgl), 13495 TEST_CASE_ST(ut_setup, ut_teardown, 13496 test_kasumi_encryption_test_case_2), 13497 TEST_CASE_ST(ut_setup, ut_teardown, 13498 test_kasumi_encryption_test_case_3), 13499 TEST_CASE_ST(ut_setup, ut_teardown, 13500 test_kasumi_encryption_test_case_4), 13501 TEST_CASE_ST(ut_setup, ut_teardown, 13502 test_kasumi_encryption_test_case_5), 13503 13504 /** KASUMI decrypt only (UEA1) */ 13505 TEST_CASE_ST(ut_setup, ut_teardown, 13506 test_kasumi_decryption_test_case_1), 13507 TEST_CASE_ST(ut_setup, ut_teardown, 13508 test_kasumi_decryption_test_case_2), 13509 TEST_CASE_ST(ut_setup, ut_teardown, 13510 test_kasumi_decryption_test_case_3), 13511 TEST_CASE_ST(ut_setup, ut_teardown, 13512 test_kasumi_decryption_test_case_4), 13513 TEST_CASE_ST(ut_setup, ut_teardown, 13514 test_kasumi_decryption_test_case_5), 13515 TEST_CASE_ST(ut_setup, ut_teardown, 13516 test_kasumi_decryption_test_case_1_oop), 13517 13518 TEST_CASE_ST(ut_setup, ut_teardown, 13519 test_kasumi_cipher_auth_test_case_1), 13520 13521 /** KASUMI generate auth, then encrypt (F8) */ 13522 TEST_CASE_ST(ut_setup, ut_teardown, 13523 test_kasumi_auth_cipher_test_case_1), 13524 TEST_CASE_ST(ut_setup, ut_teardown, 13525 test_kasumi_auth_cipher_test_case_2), 13526 TEST_CASE_ST(ut_setup, ut_teardown, 13527 test_kasumi_auth_cipher_test_case_2_oop), 13528 TEST_CASE_ST(ut_setup, ut_teardown, 13529 test_kasumi_auth_cipher_test_case_2_sgl), 13530 TEST_CASE_ST(ut_setup, ut_teardown, 13531 test_kasumi_auth_cipher_test_case_2_oop_sgl), 13532 13533 /** KASUMI decrypt (F8), then verify auth */ 13534 TEST_CASE_ST(ut_setup, ut_teardown, 13535 test_kasumi_auth_cipher_verify_test_case_1), 13536 TEST_CASE_ST(ut_setup, ut_teardown, 13537 test_kasumi_auth_cipher_verify_test_case_2), 13538 TEST_CASE_ST(ut_setup, ut_teardown, 13539 test_kasumi_auth_cipher_verify_test_case_2_oop), 13540 TEST_CASE_ST(ut_setup, ut_teardown, 13541 test_kasumi_auth_cipher_verify_test_case_2_sgl), 13542 TEST_CASE_ST(ut_setup, ut_teardown, 13543 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl), 13544 13545 /** ESN Testcase */ 13546 TEST_CASE_ST(ut_setup, ut_teardown, 13547 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check), 13548 TEST_CASE_ST(ut_setup, ut_teardown, 13549 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check), 13550 13551 /** Negative tests */ 13552 TEST_CASE_ST(ut_setup, ut_teardown, 13553 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13554 TEST_CASE_ST(ut_setup, ut_teardown, 13555 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13556 TEST_CASE_ST(ut_setup, ut_teardown, 13557 test_AES_GCM_auth_encryption_fail_iv_corrupt), 13558 TEST_CASE_ST(ut_setup, ut_teardown, 13559 test_AES_GCM_auth_encryption_fail_in_data_corrupt), 13560 TEST_CASE_ST(ut_setup, ut_teardown, 13561 test_AES_GCM_auth_encryption_fail_out_data_corrupt), 13562 TEST_CASE_ST(ut_setup, ut_teardown, 13563 test_AES_GCM_auth_encryption_fail_aad_len_corrupt), 13564 TEST_CASE_ST(ut_setup, ut_teardown, 13565 test_AES_GCM_auth_encryption_fail_aad_corrupt), 13566 TEST_CASE_ST(ut_setup, ut_teardown, 13567 test_AES_GCM_auth_encryption_fail_tag_corrupt), 13568 TEST_CASE_ST(ut_setup, ut_teardown, 13569 test_AES_GCM_auth_decryption_fail_iv_corrupt), 13570 TEST_CASE_ST(ut_setup, ut_teardown, 13571 test_AES_GCM_auth_decryption_fail_in_data_corrupt), 13572 TEST_CASE_ST(ut_setup, ut_teardown, 13573 test_AES_GCM_auth_decryption_fail_out_data_corrupt), 13574 TEST_CASE_ST(ut_setup, ut_teardown, 13575 test_AES_GCM_auth_decryption_fail_aad_len_corrupt), 13576 TEST_CASE_ST(ut_setup, ut_teardown, 13577 test_AES_GCM_auth_decryption_fail_aad_corrupt), 13578 TEST_CASE_ST(ut_setup, ut_teardown, 13579 test_AES_GCM_auth_decryption_fail_tag_corrupt), 13580 TEST_CASE_ST(ut_setup, ut_teardown, 13581 authentication_verify_AES128_GMAC_fail_data_corrupt), 13582 TEST_CASE_ST(ut_setup, ut_teardown, 13583 authentication_verify_AES128_GMAC_fail_tag_corrupt), 13584 TEST_CASE_ST(ut_setup, ut_teardown, 13585 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13586 TEST_CASE_ST(ut_setup, ut_teardown, 13587 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13588 13589 /** Mixed CIPHER + HASH algorithms */ 13590 /** AUTH AES CMAC + CIPHER AES CTR */ 13591 TEST_CASE_ST(ut_setup, ut_teardown, 13592 test_aes_cmac_aes_ctr_digest_enc_test_case_1), 13593 TEST_CASE_ST(ut_setup, ut_teardown, 13594 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 13595 TEST_CASE_ST(ut_setup, ut_teardown, 13596 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 13597 TEST_CASE_ST(ut_setup, ut_teardown, 13598 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 13599 TEST_CASE_ST(ut_setup, ut_teardown, 13600 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1), 13601 TEST_CASE_ST(ut_setup, ut_teardown, 13602 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop), 13603 TEST_CASE_ST(ut_setup, ut_teardown, 13604 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl), 13605 TEST_CASE_ST(ut_setup, ut_teardown, 13606 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl), 13607 13608 /** AUTH ZUC + CIPHER SNOW3G */ 13609 TEST_CASE_ST(ut_setup, ut_teardown, 13610 test_auth_zuc_cipher_snow_test_case_1), 13611 TEST_CASE_ST(ut_setup, ut_teardown, 13612 test_verify_auth_zuc_cipher_snow_test_case_1), 13613 /** AUTH AES CMAC + CIPHER SNOW3G */ 13614 TEST_CASE_ST(ut_setup, ut_teardown, 13615 test_auth_aes_cmac_cipher_snow_test_case_1), 13616 TEST_CASE_ST(ut_setup, ut_teardown, 13617 test_verify_auth_aes_cmac_cipher_snow_test_case_1), 13618 /** AUTH ZUC + CIPHER AES CTR */ 13619 TEST_CASE_ST(ut_setup, ut_teardown, 13620 test_auth_zuc_cipher_aes_ctr_test_case_1), 13621 TEST_CASE_ST(ut_setup, ut_teardown, 13622 test_verify_auth_zuc_cipher_aes_ctr_test_case_1), 13623 /** AUTH SNOW3G + CIPHER AES CTR */ 13624 TEST_CASE_ST(ut_setup, ut_teardown, 13625 test_auth_snow_cipher_aes_ctr_test_case_1), 13626 TEST_CASE_ST(ut_setup, ut_teardown, 13627 test_verify_auth_snow_cipher_aes_ctr_test_case_1), 13628 /** AUTH SNOW3G + CIPHER ZUC */ 13629 TEST_CASE_ST(ut_setup, ut_teardown, 13630 test_auth_snow_cipher_zuc_test_case_1), 13631 TEST_CASE_ST(ut_setup, ut_teardown, 13632 test_verify_auth_snow_cipher_zuc_test_case_1), 13633 /** AUTH AES CMAC + CIPHER ZUC */ 13634 TEST_CASE_ST(ut_setup, ut_teardown, 13635 test_auth_aes_cmac_cipher_zuc_test_case_1), 13636 TEST_CASE_ST(ut_setup, ut_teardown, 13637 test_verify_auth_aes_cmac_cipher_zuc_test_case_1), 13638 13639 /** AUTH NULL + CIPHER SNOW3G */ 13640 TEST_CASE_ST(ut_setup, ut_teardown, 13641 test_auth_null_cipher_snow_test_case_1), 13642 TEST_CASE_ST(ut_setup, ut_teardown, 13643 test_verify_auth_null_cipher_snow_test_case_1), 13644 /** AUTH NULL + CIPHER ZUC */ 13645 TEST_CASE_ST(ut_setup, ut_teardown, 13646 test_auth_null_cipher_zuc_test_case_1), 13647 TEST_CASE_ST(ut_setup, ut_teardown, 13648 test_verify_auth_null_cipher_zuc_test_case_1), 13649 /** AUTH SNOW3G + CIPHER NULL */ 13650 TEST_CASE_ST(ut_setup, ut_teardown, 13651 test_auth_snow_cipher_null_test_case_1), 13652 TEST_CASE_ST(ut_setup, ut_teardown, 13653 test_verify_auth_snow_cipher_null_test_case_1), 13654 /** AUTH ZUC + CIPHER NULL */ 13655 TEST_CASE_ST(ut_setup, ut_teardown, 13656 test_auth_zuc_cipher_null_test_case_1), 13657 TEST_CASE_ST(ut_setup, ut_teardown, 13658 test_verify_auth_zuc_cipher_null_test_case_1), 13659 /** AUTH NULL + CIPHER AES CTR */ 13660 TEST_CASE_ST(ut_setup, ut_teardown, 13661 test_auth_null_cipher_aes_ctr_test_case_1), 13662 TEST_CASE_ST(ut_setup, ut_teardown, 13663 test_verify_auth_null_cipher_aes_ctr_test_case_1), 13664 /** AUTH AES CMAC + CIPHER NULL */ 13665 TEST_CASE_ST(ut_setup, ut_teardown, 13666 test_auth_aes_cmac_cipher_null_test_case_1), 13667 TEST_CASE_ST(ut_setup, ut_teardown, 13668 test_verify_auth_aes_cmac_cipher_null_test_case_1), 13669 13670 #ifdef RTE_LIB_SECURITY 13671 TEST_CASE_ST(ut_setup_security, ut_teardown, 13672 test_PDCP_PROTO_all), 13673 TEST_CASE_ST(ut_setup_security, ut_teardown, 13674 test_DOCSIS_PROTO_all), 13675 #endif 13676 TEST_CASES_END() /**< NULL terminate unit test array */ 13677 } 13678 }; 13679 13680 static struct unit_test_suite cryptodev_virtio_testsuite = { 13681 .suite_name = "Crypto VIRTIO Unit Test Suite", 13682 .setup = testsuite_setup, 13683 .teardown = testsuite_teardown, 13684 .unit_test_cases = { 13685 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13686 13687 TEST_CASES_END() /**< NULL terminate unit test array */ 13688 } 13689 }; 13690 13691 static struct unit_test_suite cryptodev_caam_jr_testsuite = { 13692 .suite_name = "Crypto CAAM JR Unit Test Suite", 13693 .setup = testsuite_setup, 13694 .teardown = testsuite_teardown, 13695 .unit_test_cases = { 13696 TEST_CASE_ST(ut_setup, ut_teardown, 13697 test_device_configure_invalid_dev_id), 13698 TEST_CASE_ST(ut_setup, ut_teardown, 13699 test_multi_session), 13700 13701 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13702 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13703 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13704 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 13705 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13706 13707 TEST_CASES_END() /**< NULL terminate unit test array */ 13708 } 13709 }; 13710 13711 static struct unit_test_suite cryptodev_mrvl_testsuite = { 13712 .suite_name = "Crypto Device Marvell Component Test Suite", 13713 .setup = testsuite_setup, 13714 .teardown = testsuite_teardown, 13715 .unit_test_cases = { 13716 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 13717 TEST_CASE_ST(ut_setup, ut_teardown, 13718 test_multi_session_random_usage), 13719 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13720 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13721 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13722 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13723 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 13724 13725 /** Negative tests */ 13726 TEST_CASE_ST(ut_setup, ut_teardown, 13727 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13728 TEST_CASE_ST(ut_setup, ut_teardown, 13729 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13730 TEST_CASE_ST(ut_setup, ut_teardown, 13731 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13732 TEST_CASE_ST(ut_setup, ut_teardown, 13733 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13734 13735 TEST_CASES_END() /**< NULL terminate unit test array */ 13736 } 13737 }; 13738 13739 static struct unit_test_suite cryptodev_ccp_testsuite = { 13740 .suite_name = "Crypto Device CCP Unit Test Suite", 13741 .setup = testsuite_setup, 13742 .teardown = testsuite_teardown, 13743 .unit_test_cases = { 13744 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session), 13745 TEST_CASE_ST(ut_setup, ut_teardown, 13746 test_multi_session_random_usage), 13747 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all), 13748 TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all), 13749 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all), 13750 TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all), 13751 TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all), 13752 13753 /** Negative tests */ 13754 TEST_CASE_ST(ut_setup, ut_teardown, 13755 authentication_verify_HMAC_SHA1_fail_data_corrupt), 13756 TEST_CASE_ST(ut_setup, ut_teardown, 13757 authentication_verify_HMAC_SHA1_fail_tag_corrupt), 13758 TEST_CASE_ST(ut_setup, ut_teardown, 13759 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt), 13760 TEST_CASE_ST(ut_setup, ut_teardown, 13761 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt), 13762 13763 TEST_CASES_END() /**< NULL terminate unit test array */ 13764 } 13765 }; 13766 13767 static int 13768 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/) 13769 { 13770 gbl_driver_id = rte_cryptodev_driver_id_get( 13771 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 13772 13773 if (gbl_driver_id == -1) { 13774 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n"); 13775 return TEST_SKIPPED; 13776 } 13777 13778 return unit_test_suite_runner(&cryptodev_testsuite); 13779 } 13780 13781 static int 13782 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/) 13783 { 13784 gbl_driver_id = rte_cryptodev_driver_id_get( 13785 RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)); 13786 13787 if (gbl_driver_id == -1) { 13788 RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n"); 13789 return TEST_FAILED; 13790 } 13791 13792 return unit_test_suite_runner(&cryptodev_virtio_testsuite); 13793 } 13794 13795 static int 13796 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/) 13797 { 13798 gbl_driver_id = rte_cryptodev_driver_id_get( 13799 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13800 13801 if (gbl_driver_id == -1) { 13802 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 13803 return TEST_SKIPPED; 13804 } 13805 13806 return unit_test_suite_runner(&cryptodev_testsuite); 13807 } 13808 13809 static int 13810 test_cryptodev_cpu_aesni_mb(void) 13811 { 13812 int32_t rc; 13813 enum rte_security_session_action_type at; 13814 13815 gbl_driver_id = rte_cryptodev_driver_id_get( 13816 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)); 13817 13818 if (gbl_driver_id == -1) { 13819 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 13820 return TEST_SKIPPED; 13821 } 13822 13823 at = gbl_action_type; 13824 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 13825 rc = unit_test_suite_runner(&cryptodev_testsuite); 13826 gbl_action_type = at; 13827 return rc; 13828 } 13829 13830 static int 13831 test_cryptodev_openssl(void) 13832 { 13833 gbl_driver_id = rte_cryptodev_driver_id_get( 13834 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)); 13835 13836 if (gbl_driver_id == -1) { 13837 RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n"); 13838 return TEST_SKIPPED; 13839 } 13840 13841 return unit_test_suite_runner(&cryptodev_testsuite); 13842 } 13843 13844 static int 13845 test_cryptodev_aesni_gcm(void) 13846 { 13847 gbl_driver_id = rte_cryptodev_driver_id_get( 13848 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 13849 13850 if (gbl_driver_id == -1) { 13851 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n"); 13852 return TEST_SKIPPED; 13853 } 13854 13855 return unit_test_suite_runner(&cryptodev_testsuite); 13856 } 13857 13858 static int 13859 test_cryptodev_cpu_aesni_gcm(void) 13860 { 13861 int32_t rc; 13862 enum rte_security_session_action_type at; 13863 13864 gbl_driver_id = rte_cryptodev_driver_id_get( 13865 RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)); 13866 13867 if (gbl_driver_id == -1) { 13868 RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n"); 13869 return TEST_SKIPPED; 13870 } 13871 13872 at = gbl_action_type; 13873 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO; 13874 rc = unit_test_suite_runner(&cryptodev_testsuite); 13875 gbl_action_type = at; 13876 return rc; 13877 } 13878 13879 static int 13880 test_cryptodev_null(void) 13881 { 13882 gbl_driver_id = rte_cryptodev_driver_id_get( 13883 RTE_STR(CRYPTODEV_NAME_NULL_PMD)); 13884 13885 if (gbl_driver_id == -1) { 13886 RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n"); 13887 return TEST_SKIPPED; 13888 } 13889 13890 return unit_test_suite_runner(&cryptodev_testsuite); 13891 } 13892 13893 static int 13894 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/) 13895 { 13896 gbl_driver_id = rte_cryptodev_driver_id_get( 13897 RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)); 13898 13899 if (gbl_driver_id == -1) { 13900 RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n"); 13901 return TEST_SKIPPED; 13902 } 13903 13904 return unit_test_suite_runner(&cryptodev_testsuite); 13905 } 13906 13907 static int 13908 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/) 13909 { 13910 gbl_driver_id = rte_cryptodev_driver_id_get( 13911 RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)); 13912 13913 if (gbl_driver_id == -1) { 13914 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n"); 13915 return TEST_SKIPPED; 13916 } 13917 13918 return unit_test_suite_runner(&cryptodev_testsuite); 13919 } 13920 13921 static int 13922 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/) 13923 { 13924 gbl_driver_id = rte_cryptodev_driver_id_get( 13925 RTE_STR(CRYPTODEV_NAME_ZUC_PMD)); 13926 13927 if (gbl_driver_id == -1) { 13928 RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n"); 13929 return TEST_SKIPPED; 13930 } 13931 13932 return unit_test_suite_runner(&cryptodev_testsuite); 13933 } 13934 13935 static int 13936 test_cryptodev_armv8(void) 13937 { 13938 gbl_driver_id = rte_cryptodev_driver_id_get( 13939 RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)); 13940 13941 if (gbl_driver_id == -1) { 13942 RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n"); 13943 return TEST_SKIPPED; 13944 } 13945 13946 return unit_test_suite_runner(&cryptodev_testsuite); 13947 } 13948 13949 static int 13950 test_cryptodev_mrvl(void) 13951 { 13952 gbl_driver_id = rte_cryptodev_driver_id_get( 13953 RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)); 13954 13955 if (gbl_driver_id == -1) { 13956 RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n"); 13957 return TEST_SKIPPED; 13958 } 13959 13960 return unit_test_suite_runner(&cryptodev_mrvl_testsuite); 13961 } 13962 13963 #ifdef RTE_CRYPTO_SCHEDULER 13964 13965 static int 13966 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/) 13967 { 13968 gbl_driver_id = rte_cryptodev_driver_id_get( 13969 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)); 13970 13971 if (gbl_driver_id == -1) { 13972 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n"); 13973 return TEST_SKIPPED; 13974 } 13975 13976 if (rte_cryptodev_driver_id_get( 13977 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) { 13978 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n"); 13979 return TEST_SKIPPED; 13980 } 13981 return unit_test_suite_runner(&cryptodev_scheduler_testsuite); 13982 } 13983 13984 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler); 13985 13986 #endif 13987 13988 static int 13989 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/) 13990 { 13991 gbl_driver_id = rte_cryptodev_driver_id_get( 13992 RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)); 13993 13994 if (gbl_driver_id == -1) { 13995 RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n"); 13996 return TEST_SKIPPED; 13997 } 13998 13999 return unit_test_suite_runner(&cryptodev_testsuite); 14000 } 14001 14002 static int 14003 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/) 14004 { 14005 gbl_driver_id = rte_cryptodev_driver_id_get( 14006 RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)); 14007 14008 if (gbl_driver_id == -1) { 14009 RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n"); 14010 return TEST_SKIPPED; 14011 } 14012 14013 return unit_test_suite_runner(&cryptodev_testsuite); 14014 } 14015 14016 static int 14017 test_cryptodev_ccp(void) 14018 { 14019 gbl_driver_id = rte_cryptodev_driver_id_get( 14020 RTE_STR(CRYPTODEV_NAME_CCP_PMD)); 14021 14022 if (gbl_driver_id == -1) { 14023 RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n"); 14024 return TEST_FAILED; 14025 } 14026 14027 return unit_test_suite_runner(&cryptodev_ccp_testsuite); 14028 } 14029 14030 static int 14031 test_cryptodev_octeontx(void) 14032 { 14033 gbl_driver_id = rte_cryptodev_driver_id_get( 14034 RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)); 14035 if (gbl_driver_id == -1) { 14036 RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n"); 14037 return TEST_FAILED; 14038 } 14039 return unit_test_suite_runner(&cryptodev_testsuite); 14040 } 14041 14042 static int 14043 test_cryptodev_octeontx2(void) 14044 { 14045 gbl_driver_id = rte_cryptodev_driver_id_get( 14046 RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)); 14047 if (gbl_driver_id == -1) { 14048 RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n"); 14049 return TEST_FAILED; 14050 } 14051 return unit_test_suite_runner(&cryptodev_testsuite); 14052 } 14053 14054 static int 14055 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/) 14056 { 14057 gbl_driver_id = rte_cryptodev_driver_id_get( 14058 RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)); 14059 14060 if (gbl_driver_id == -1) { 14061 RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n"); 14062 return TEST_FAILED; 14063 } 14064 14065 return unit_test_suite_runner(&cryptodev_caam_jr_testsuite); 14066 } 14067 14068 static int 14069 test_cryptodev_nitrox(void) 14070 { 14071 gbl_driver_id = rte_cryptodev_driver_id_get( 14072 RTE_STR(CRYPTODEV_NAME_NITROX_PMD)); 14073 14074 if (gbl_driver_id == -1) { 14075 RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n"); 14076 return TEST_FAILED; 14077 } 14078 14079 return unit_test_suite_runner(&cryptodev_testsuite); 14080 } 14081 14082 static int 14083 test_cryptodev_bcmfs(void) 14084 { 14085 gbl_driver_id = rte_cryptodev_driver_id_get( 14086 RTE_STR(CRYPTODEV_NAME_BCMFS_PMD)); 14087 14088 if (gbl_driver_id == -1) { 14089 RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n"); 14090 return TEST_FAILED; 14091 } 14092 14093 return unit_test_suite_runner(&cryptodev_testsuite); 14094 } 14095 14096 static int 14097 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/) 14098 { 14099 int ret; 14100 14101 gbl_driver_id = rte_cryptodev_driver_id_get( 14102 RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)); 14103 14104 if (gbl_driver_id == -1) { 14105 RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n"); 14106 return TEST_SKIPPED; 14107 } 14108 14109 global_api_test_type = CRYPTODEV_RAW_API_TEST; 14110 ret = unit_test_suite_runner(&cryptodev_testsuite); 14111 global_api_test_type = CRYPTODEV_API_TEST; 14112 14113 return ret; 14114 } 14115 14116 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest, 14117 test_cryptodev_qat_raw_api); 14118 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat); 14119 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb); 14120 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest, 14121 test_cryptodev_cpu_aesni_mb); 14122 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl); 14123 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm); 14124 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest, 14125 test_cryptodev_cpu_aesni_gcm); 14126 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null); 14127 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g); 14128 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi); 14129 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc); 14130 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8); 14131 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl); 14132 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec); 14133 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec); 14134 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp); 14135 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio); 14136 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx); 14137 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2); 14138 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr); 14139 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox); 14140 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs); 14141