1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2020 Intel Corporation
8 #include <rte_common.h>
9 #include <rte_hexdump.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>
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
20 #include <rte_string_fns.h>
24 #ifdef RTE_CRYPTO_SCHEDULER
25 #include <rte_cryptodev_scheduler.h>
26 #include <rte_cryptodev_scheduler_operations.h>
29 #include <rte_lcore.h>
32 #include "test_cryptodev.h"
34 #include "test_cryptodev_blockcipher.h"
35 #include "test_cryptodev_aes_test_vectors.h"
36 #include "test_cryptodev_des_test_vectors.h"
37 #include "test_cryptodev_hash_test_vectors.h"
38 #include "test_cryptodev_kasumi_test_vectors.h"
39 #include "test_cryptodev_kasumi_hash_test_vectors.h"
40 #include "test_cryptodev_snow3g_test_vectors.h"
41 #include "test_cryptodev_snow3g_hash_test_vectors.h"
42 #include "test_cryptodev_zuc_test_vectors.h"
43 #include "test_cryptodev_aead_test_vectors.h"
44 #include "test_cryptodev_hmac_test_vectors.h"
45 #include "test_cryptodev_mixed_test_vectors.h"
46 #ifdef RTE_LIB_SECURITY
47 #include "test_cryptodev_security_ipsec.h"
48 #include "test_cryptodev_security_ipsec_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_vectors.h"
50 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_func.h"
52 #include "test_cryptodev_security_docsis_test_vectors.h"
54 #define SDAP_DISABLED 0
55 #define SDAP_ENABLED 1
58 #define VDEV_ARGS_SIZE 100
59 #define MAX_NB_SESSIONS 4
61 #define MAX_DRV_SERVICE_CTX_SIZE 256
63 #define MAX_RAW_DEQUEUE_COUNT 65535
66 #define OUT_OF_PLACE 1
68 static int gbl_driver_id;
70 static enum rte_security_session_action_type gbl_action_type =
71 RTE_SECURITY_ACTION_TYPE_NONE;
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
75 struct crypto_unittest_params {
76 struct rte_crypto_sym_xform cipher_xform;
77 struct rte_crypto_sym_xform auth_xform;
78 struct rte_crypto_sym_xform aead_xform;
79 #ifdef RTE_LIB_SECURITY
80 struct rte_security_docsis_xform docsis_xform;
84 struct rte_cryptodev_sym_session *sess;
85 #ifdef RTE_LIB_SECURITY
86 struct rte_security_session *sec_session;
89 #ifdef RTE_LIB_SECURITY
90 enum rte_security_session_action_type type;
92 struct rte_crypto_op *op;
94 struct rte_mbuf *obuf, *ibuf;
99 #define ALIGN_POW2_ROUNDUP(num, align) \
100 (((num) + (align) - 1) & ~((align) - 1))
102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts) \
103 for (j = 0; j < num_child_ts; index++, j++) \
104 parent_ts.unit_test_suites[index] = child_ts[j]
106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types) \
107 for (j = 0; j < num_blk_types; index++, j++) \
108 parent_ts.unit_test_suites[index] = \
109 build_blockcipher_test_suite(blk_types[j])
111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types) \
112 for (j = index; j < index + num_blk_types; j++) \
113 free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
116 * Forward declarations.
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120 struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
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,
132 security_proto_supported(enum rte_security_session_action_type action,
133 enum rte_security_session_protocol proto);
136 dev_configure_and_start(uint64_t ff_disable);
138 static struct rte_mbuf *
139 setup_test_string(struct rte_mempool *mpool,
140 const char *string, size_t len, uint8_t blocksize)
142 struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
143 size_t t_len = len - (blocksize ? (len % blocksize) : 0);
148 memset(m->buf_addr, 0, m->buf_len);
149 dst = rte_pktmbuf_append(m, t_len);
155 rte_memcpy(dst, string, t_len);
157 memset(dst, 0, t_len);
163 /* Get number of bytes in X bits (rounding up) */
165 ceil_byte_length(uint32_t num_bits)
168 return ((num_bits >> 3) + 1);
170 return (num_bits >> 3);
174 post_process_raw_dp_op(void *user_data, uint32_t index __rte_unused,
175 uint8_t is_op_success)
177 struct rte_crypto_op *op = user_data;
178 op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
179 RTE_CRYPTO_OP_STATUS_ERROR;
183 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
184 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
185 uint8_t len_in_bits, uint8_t cipher_iv_len)
187 struct rte_crypto_sym_op *sop = op->sym;
188 struct rte_crypto_op *ret_op = NULL;
189 struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
190 struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
191 union rte_crypto_sym_ofs ofs;
192 struct rte_crypto_sym_vec vec;
193 struct rte_crypto_sgl sgl, dest_sgl;
195 union rte_cryptodev_session_ctx sess;
197 struct rte_crypto_raw_dp_ctx *ctx;
198 uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
202 int ctx_service_size;
204 int enqueue_status, dequeue_status;
206 ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
207 if (ctx_service_size < 0) {
208 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
212 ctx = malloc(ctx_service_size);
214 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
218 /* Both are enums, setting crypto_sess will suit any session type */
219 sess.crypto_sess = op->sym->session;
221 if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
222 op->sess_type, sess, 0) < 0) {
223 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
229 aad_auth_iv.iova = 0;
230 aad_auth_iv.va = NULL;
237 vec.digest = &digest;
238 vec.aad = &aad_auth_iv;
239 vec.status = &status;
243 if (is_cipher && is_auth) {
244 cipher_offset = sop->cipher.data.offset;
245 cipher_len = sop->cipher.data.length;
246 auth_offset = sop->auth.data.offset;
247 auth_len = sop->auth.data.length;
248 max_len = RTE_MAX(cipher_offset + cipher_len,
249 auth_offset + auth_len);
251 max_len = max_len >> 3;
252 cipher_offset = cipher_offset >> 3;
253 auth_offset = auth_offset >> 3;
254 cipher_len = cipher_len >> 3;
255 auth_len = auth_len >> 3;
257 ofs.ofs.cipher.head = cipher_offset;
258 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
259 ofs.ofs.auth.head = auth_offset;
260 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
261 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
262 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
263 aad_auth_iv.va = rte_crypto_op_ctod_offset(
264 op, void *, IV_OFFSET + cipher_iv_len);
265 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
267 digest.va = (void *)sop->auth.digest.data;
268 digest.iova = sop->auth.digest.phys_addr;
270 } else if (is_cipher) {
271 cipher_offset = sop->cipher.data.offset;
272 cipher_len = sop->cipher.data.length;
273 max_len = cipher_len + cipher_offset;
275 max_len = max_len >> 3;
276 cipher_offset = cipher_offset >> 3;
277 cipher_len = cipher_len >> 3;
279 ofs.ofs.cipher.head = cipher_offset;
280 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
281 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
282 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
284 } else if (is_auth) {
285 auth_offset = sop->auth.data.offset;
286 auth_len = sop->auth.data.length;
287 max_len = auth_len + auth_offset;
289 max_len = max_len >> 3;
290 auth_offset = auth_offset >> 3;
291 auth_len = auth_len >> 3;
293 ofs.ofs.auth.head = auth_offset;
294 ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
295 aad_auth_iv.va = rte_crypto_op_ctod_offset(
296 op, void *, IV_OFFSET + cipher_iv_len);
297 aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
299 digest.va = (void *)sop->auth.digest.data;
300 digest.iova = sop->auth.digest.phys_addr;
303 cipher_offset = sop->aead.data.offset;
304 cipher_len = sop->aead.data.length;
305 max_len = cipher_len + cipher_offset;
307 max_len = max_len >> 3;
308 cipher_offset = cipher_offset >> 3;
309 cipher_len = cipher_len >> 3;
311 ofs.ofs.cipher.head = cipher_offset;
312 ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
313 cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
314 cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
315 aad_auth_iv.va = (void *)sop->aead.aad.data;
316 aad_auth_iv.iova = sop->aead.aad.phys_addr;
317 digest.va = (void *)sop->aead.digest.data;
318 digest.iova = sop->aead.digest.phys_addr;
321 n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
322 data_vec, RTE_DIM(data_vec));
323 if (n < 0 || n > sop->m_src->nb_segs) {
324 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
330 if (sop->m_dst != NULL) {
331 dest_sgl.vec = dest_data_vec;
332 vec.dest_sgl = &dest_sgl;
333 n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
334 dest_data_vec, RTE_DIM(dest_data_vec));
335 if (n < 0 || n > sop->m_dst->nb_segs) {
336 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
343 if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
344 &enqueue_status) < 1) {
345 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
349 if (enqueue_status == 0) {
350 status = rte_cryptodev_raw_enqueue_done(ctx, 1);
352 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
355 } else if (enqueue_status < 0) {
356 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
361 while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
362 n = rte_cryptodev_raw_dequeue_burst(ctx,
363 NULL, 1, post_process_raw_dp_op,
364 (void **)&ret_op, 0, &n_success,
366 if (dequeue_status < 0) {
367 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
374 if (n == 1 && dequeue_status == 0) {
375 if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
376 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
381 op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
382 ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
383 n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
384 RTE_CRYPTO_OP_STATUS_SUCCESS;
391 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
394 struct rte_crypto_sym_op *sop;
395 union rte_crypto_sym_ofs ofs;
396 struct rte_crypto_sgl sgl;
397 struct rte_crypto_sym_vec symvec;
398 struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
399 struct rte_crypto_vec vec[UINT8_MAX];
403 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
404 sop->aead.data.length, vec, RTE_DIM(vec));
406 if (n < 0 || n != sop->m_src->nb_segs) {
407 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
413 symvec.src_sgl = &sgl;
415 symvec.digest = &digest_ptr;
416 symvec.aad = &aad_ptr;
420 /* for CPU crypto the IOVA address is not required */
421 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
422 digest_ptr.va = (void *)sop->aead.digest.data;
423 aad_ptr.va = (void *)sop->aead.aad.data;
427 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
431 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
433 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
437 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
440 struct rte_crypto_sym_op *sop;
441 union rte_crypto_sym_ofs ofs;
442 struct rte_crypto_sgl sgl;
443 struct rte_crypto_sym_vec symvec;
444 struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
445 struct rte_crypto_vec vec[UINT8_MAX];
449 n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
450 sop->auth.data.length, vec, RTE_DIM(vec));
452 if (n < 0 || n != sop->m_src->nb_segs) {
453 op->status = RTE_CRYPTO_OP_STATUS_ERROR;
459 symvec.src_sgl = &sgl;
461 symvec.digest = &digest_ptr;
465 iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
466 digest_ptr.va = (void *)sop->auth.digest.data;
469 ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
470 ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
471 (sop->cipher.data.offset + sop->cipher.data.length);
473 n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
477 op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
479 op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
482 static struct rte_crypto_op *
483 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
486 RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
488 if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
489 RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
495 while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
498 if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
499 RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
506 static struct crypto_testsuite_params testsuite_params = { NULL };
507 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
508 static struct crypto_unittest_params unittest_params;
511 testsuite_setup(void)
513 struct crypto_testsuite_params *ts_params = &testsuite_params;
514 struct rte_cryptodev_info info;
515 uint32_t i = 0, nb_devs, dev_id;
518 memset(ts_params, 0, sizeof(*ts_params));
520 ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
521 if (ts_params->mbuf_pool == NULL) {
522 /* Not already created so create */
523 ts_params->mbuf_pool = rte_pktmbuf_pool_create(
525 NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
527 if (ts_params->mbuf_pool == NULL) {
528 RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
533 ts_params->large_mbuf_pool = rte_mempool_lookup(
534 "CRYPTO_LARGE_MBUFPOOL");
535 if (ts_params->large_mbuf_pool == NULL) {
536 /* Not already created so create */
537 ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
538 "CRYPTO_LARGE_MBUFPOOL",
541 if (ts_params->large_mbuf_pool == NULL) {
543 "Can't create CRYPTO_LARGE_MBUFPOOL\n");
548 ts_params->op_mpool = rte_crypto_op_pool_create(
549 "MBUF_CRYPTO_SYM_OP_POOL",
550 RTE_CRYPTO_OP_TYPE_SYMMETRIC,
551 NUM_MBUFS, MBUF_CACHE_SIZE,
553 sizeof(struct rte_crypto_sym_xform) +
556 if (ts_params->op_mpool == NULL) {
557 RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
561 nb_devs = rte_cryptodev_count();
563 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
567 if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
568 RTE_LOG(WARNING, USER1, "No %s devices found?\n",
569 rte_cryptodev_driver_name_get(gbl_driver_id));
573 /* Create list of valid crypto devs */
574 for (i = 0; i < nb_devs; i++) {
575 rte_cryptodev_info_get(i, &info);
576 if (info.driver_id == gbl_driver_id)
577 ts_params->valid_devs[ts_params->valid_dev_count++] = i;
580 if (ts_params->valid_dev_count < 1)
583 /* Set up all the qps on the first of the valid devices found */
585 dev_id = ts_params->valid_devs[0];
587 rte_cryptodev_info_get(dev_id, &info);
589 ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
590 ts_params->conf.socket_id = SOCKET_ID_ANY;
591 ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
593 unsigned int session_size =
594 rte_cryptodev_sym_get_private_session_size(dev_id);
596 #ifdef RTE_LIB_SECURITY
597 unsigned int security_session_size = rte_security_session_get_size(
598 rte_cryptodev_get_sec_ctx(dev_id));
600 if (session_size < security_session_size)
601 session_size = security_session_size;
604 * Create mempool with maximum number of sessions.
606 if (info.sym.max_nb_sessions != 0 &&
607 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
608 RTE_LOG(ERR, USER1, "Device does not support "
609 "at least %u sessions\n",
614 ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
615 "test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
617 TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
618 "session mempool allocation failed");
620 ts_params->session_priv_mpool = rte_mempool_create(
624 0, 0, NULL, NULL, NULL,
627 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
628 "session mempool allocation failed");
632 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
634 "Failed to configure cryptodev %u with %u qps",
635 dev_id, ts_params->conf.nb_queue_pairs);
637 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
638 ts_params->qp_conf.mp_session = ts_params->session_mpool;
639 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
641 for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
642 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
643 dev_id, qp_id, &ts_params->qp_conf,
644 rte_cryptodev_socket_id(dev_id)),
645 "Failed to setup queue pair %u on cryptodev %u",
653 testsuite_teardown(void)
655 struct crypto_testsuite_params *ts_params = &testsuite_params;
658 if (ts_params->mbuf_pool != NULL) {
659 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
660 rte_mempool_avail_count(ts_params->mbuf_pool));
663 if (ts_params->op_mpool != NULL) {
664 RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
665 rte_mempool_avail_count(ts_params->op_mpool));
668 /* Free session mempools */
669 if (ts_params->session_priv_mpool != NULL) {
670 rte_mempool_free(ts_params->session_priv_mpool);
671 ts_params->session_priv_mpool = NULL;
674 if (ts_params->session_mpool != NULL) {
675 rte_mempool_free(ts_params->session_mpool);
676 ts_params->session_mpool = NULL;
679 res = rte_cryptodev_close(ts_params->valid_devs[0]);
681 RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
685 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
686 const int *algs, uint16_t num_algs)
688 uint8_t dev_id = testsuite_params.valid_devs[0];
689 bool some_alg_supported = FALSE;
692 for (i = 0; i < num_algs && !some_alg_supported; i++) {
693 struct rte_cryptodev_sym_capability_idx alg = {
696 if (rte_cryptodev_sym_capability_get(dev_id,
698 some_alg_supported = TRUE;
700 if (!some_alg_supported)
707 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
708 uint16_t num_ciphers)
710 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
711 (const int *) ciphers, num_ciphers);
715 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
718 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
719 (const int *) auths, num_auths);
723 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
726 return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
727 (const int *) aeads, num_aeads);
731 null_testsuite_setup(void)
733 struct crypto_testsuite_params *ts_params = &testsuite_params;
734 uint8_t dev_id = ts_params->valid_devs[0];
735 struct rte_cryptodev_info dev_info;
736 const enum rte_crypto_cipher_algorithm ciphers[] = {
737 RTE_CRYPTO_CIPHER_NULL
739 const enum rte_crypto_auth_algorithm auths[] = {
743 rte_cryptodev_info_get(dev_id, &dev_info);
745 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
746 RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
747 "testsuite not met\n");
751 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
752 && check_auth_capabilities_supported(auths,
753 RTE_DIM(auths)) != 0) {
754 RTE_LOG(INFO, USER1, "Capability requirements for NULL "
755 "testsuite not met\n");
763 crypto_gen_testsuite_setup(void)
765 struct crypto_testsuite_params *ts_params = &testsuite_params;
766 uint8_t dev_id = ts_params->valid_devs[0];
767 struct rte_cryptodev_info dev_info;
769 rte_cryptodev_info_get(dev_id, &dev_info);
771 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
772 RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
773 "testsuite not met\n");
780 #ifdef RTE_LIB_SECURITY
782 ipsec_proto_testsuite_setup(void)
784 struct crypto_testsuite_params *ts_params = &testsuite_params;
785 struct crypto_unittest_params *ut_params = &unittest_params;
786 struct rte_cryptodev_info dev_info;
789 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
791 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
792 RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
793 "testsuite not met\n");
797 /* Reconfigure to enable security */
798 ret = dev_configure_and_start(0);
799 if (ret != TEST_SUCCESS)
802 /* Set action type */
803 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
805 if (security_proto_supported(
806 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
807 RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
808 RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
814 * Stop the device. Device would be started again by individual test
815 * case setup routine.
817 rte_cryptodev_stop(ts_params->valid_devs[0]);
823 pdcp_proto_testsuite_setup(void)
825 struct crypto_testsuite_params *ts_params = &testsuite_params;
826 uint8_t dev_id = ts_params->valid_devs[0];
827 struct rte_cryptodev_info dev_info;
828 const enum rte_crypto_cipher_algorithm ciphers[] = {
829 RTE_CRYPTO_CIPHER_NULL,
830 RTE_CRYPTO_CIPHER_AES_CTR,
831 RTE_CRYPTO_CIPHER_ZUC_EEA3,
832 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
834 const enum rte_crypto_auth_algorithm auths[] = {
835 RTE_CRYPTO_AUTH_NULL,
836 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
837 RTE_CRYPTO_AUTH_AES_CMAC,
838 RTE_CRYPTO_AUTH_ZUC_EIA3
841 rte_cryptodev_info_get(dev_id, &dev_info);
843 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
844 !(dev_info.feature_flags &
845 RTE_CRYPTODEV_FF_SECURITY)) {
846 RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
847 "testsuite not met\n");
851 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
852 && check_auth_capabilities_supported(auths,
853 RTE_DIM(auths)) != 0) {
854 RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
855 "testsuite not met\n");
863 docsis_proto_testsuite_setup(void)
865 struct crypto_testsuite_params *ts_params = &testsuite_params;
866 uint8_t dev_id = ts_params->valid_devs[0];
867 struct rte_cryptodev_info dev_info;
868 const enum rte_crypto_cipher_algorithm ciphers[] = {
869 RTE_CRYPTO_CIPHER_AES_DOCSISBPI
872 rte_cryptodev_info_get(dev_id, &dev_info);
874 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
875 !(dev_info.feature_flags &
876 RTE_CRYPTODEV_FF_SECURITY)) {
877 RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
878 "Proto testsuite not met\n");
882 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
883 RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
884 "testsuite not met\n");
893 aes_ccm_auth_testsuite_setup(void)
895 struct crypto_testsuite_params *ts_params = &testsuite_params;
896 uint8_t dev_id = ts_params->valid_devs[0];
897 struct rte_cryptodev_info dev_info;
898 const enum rte_crypto_aead_algorithm aeads[] = {
899 RTE_CRYPTO_AEAD_AES_CCM
902 rte_cryptodev_info_get(dev_id, &dev_info);
904 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
905 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
906 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
907 RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
908 "testsuite not met\n");
912 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
913 RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
914 "testsuite not met\n");
922 aes_gcm_auth_testsuite_setup(void)
924 struct crypto_testsuite_params *ts_params = &testsuite_params;
925 uint8_t dev_id = ts_params->valid_devs[0];
926 struct rte_cryptodev_info dev_info;
927 const enum rte_crypto_aead_algorithm aeads[] = {
928 RTE_CRYPTO_AEAD_AES_GCM
931 rte_cryptodev_info_get(dev_id, &dev_info);
933 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
934 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
935 "testsuite not met\n");
939 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
940 RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
941 "testsuite not met\n");
949 aes_gmac_auth_testsuite_setup(void)
951 struct crypto_testsuite_params *ts_params = &testsuite_params;
952 uint8_t dev_id = ts_params->valid_devs[0];
953 struct rte_cryptodev_info dev_info;
954 const enum rte_crypto_auth_algorithm auths[] = {
955 RTE_CRYPTO_AUTH_AES_GMAC
958 rte_cryptodev_info_get(dev_id, &dev_info);
960 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
961 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
962 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
963 RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
964 "testsuite not met\n");
968 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
969 RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
970 "testsuite not met\n");
978 chacha20_poly1305_testsuite_setup(void)
980 struct crypto_testsuite_params *ts_params = &testsuite_params;
981 uint8_t dev_id = ts_params->valid_devs[0];
982 struct rte_cryptodev_info dev_info;
983 const enum rte_crypto_aead_algorithm aeads[] = {
984 RTE_CRYPTO_AEAD_CHACHA20_POLY1305
987 rte_cryptodev_info_get(dev_id, &dev_info);
989 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
990 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
991 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
992 RTE_LOG(INFO, USER1, "Feature flag requirements for "
993 "Chacha20-Poly1305 testsuite not met\n");
997 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
998 RTE_LOG(INFO, USER1, "Capability requirements for "
999 "Chacha20-Poly1305 testsuite not met\n");
1000 return TEST_SKIPPED;
1007 snow3g_testsuite_setup(void)
1009 struct crypto_testsuite_params *ts_params = &testsuite_params;
1010 uint8_t dev_id = ts_params->valid_devs[0];
1011 struct rte_cryptodev_info dev_info;
1012 const enum rte_crypto_cipher_algorithm ciphers[] = {
1013 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1016 const enum rte_crypto_auth_algorithm auths[] = {
1017 RTE_CRYPTO_AUTH_SNOW3G_UIA2
1020 rte_cryptodev_info_get(dev_id, &dev_info);
1022 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1023 RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1024 "testsuite not met\n");
1025 return TEST_SKIPPED;
1028 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1029 && check_auth_capabilities_supported(auths,
1030 RTE_DIM(auths)) != 0) {
1031 RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1032 "testsuite not met\n");
1033 return TEST_SKIPPED;
1040 zuc_testsuite_setup(void)
1042 struct crypto_testsuite_params *ts_params = &testsuite_params;
1043 uint8_t dev_id = ts_params->valid_devs[0];
1044 struct rte_cryptodev_info dev_info;
1045 const enum rte_crypto_cipher_algorithm ciphers[] = {
1046 RTE_CRYPTO_CIPHER_ZUC_EEA3
1048 const enum rte_crypto_auth_algorithm auths[] = {
1049 RTE_CRYPTO_AUTH_ZUC_EIA3
1052 rte_cryptodev_info_get(dev_id, &dev_info);
1054 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1055 RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1056 "testsuite not met\n");
1057 return TEST_SKIPPED;
1060 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1061 && check_auth_capabilities_supported(auths,
1062 RTE_DIM(auths)) != 0) {
1063 RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1064 "testsuite not met\n");
1065 return TEST_SKIPPED;
1072 hmac_md5_auth_testsuite_setup(void)
1074 struct crypto_testsuite_params *ts_params = &testsuite_params;
1075 uint8_t dev_id = ts_params->valid_devs[0];
1076 struct rte_cryptodev_info dev_info;
1077 const enum rte_crypto_auth_algorithm auths[] = {
1078 RTE_CRYPTO_AUTH_MD5_HMAC
1081 rte_cryptodev_info_get(dev_id, &dev_info);
1083 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1084 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1085 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1086 RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1087 "Auth testsuite not met\n");
1088 return TEST_SKIPPED;
1091 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1092 RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1093 "testsuite not met\n");
1094 return TEST_SKIPPED;
1101 kasumi_testsuite_setup(void)
1103 struct crypto_testsuite_params *ts_params = &testsuite_params;
1104 uint8_t dev_id = ts_params->valid_devs[0];
1105 struct rte_cryptodev_info dev_info;
1106 const enum rte_crypto_cipher_algorithm ciphers[] = {
1107 RTE_CRYPTO_CIPHER_KASUMI_F8
1109 const enum rte_crypto_auth_algorithm auths[] = {
1110 RTE_CRYPTO_AUTH_KASUMI_F9
1113 rte_cryptodev_info_get(dev_id, &dev_info);
1115 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1116 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1117 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1118 RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1119 "testsuite not met\n");
1120 return TEST_SKIPPED;
1123 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1124 && check_auth_capabilities_supported(auths,
1125 RTE_DIM(auths)) != 0) {
1126 RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1127 "testsuite not met\n");
1128 return TEST_SKIPPED;
1135 negative_aes_gcm_testsuite_setup(void)
1137 struct crypto_testsuite_params *ts_params = &testsuite_params;
1138 uint8_t dev_id = ts_params->valid_devs[0];
1139 struct rte_cryptodev_info dev_info;
1140 const enum rte_crypto_aead_algorithm aeads[] = {
1141 RTE_CRYPTO_AEAD_AES_GCM
1144 rte_cryptodev_info_get(dev_id, &dev_info);
1146 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1147 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1148 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1149 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1150 "AES GCM testsuite not met\n");
1151 return TEST_SKIPPED;
1154 if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1155 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1156 "AES GCM testsuite not met\n");
1157 return TEST_SKIPPED;
1164 negative_aes_gmac_testsuite_setup(void)
1166 struct crypto_testsuite_params *ts_params = &testsuite_params;
1167 uint8_t dev_id = ts_params->valid_devs[0];
1168 struct rte_cryptodev_info dev_info;
1169 const enum rte_crypto_auth_algorithm auths[] = {
1170 RTE_CRYPTO_AUTH_AES_GMAC
1173 rte_cryptodev_info_get(dev_id, &dev_info);
1175 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1176 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1177 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1178 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1179 "AES GMAC testsuite not met\n");
1180 return TEST_SKIPPED;
1183 if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1184 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1185 "AES GMAC testsuite not met\n");
1186 return TEST_SKIPPED;
1193 mixed_cipher_hash_testsuite_setup(void)
1195 struct crypto_testsuite_params *ts_params = &testsuite_params;
1196 uint8_t dev_id = ts_params->valid_devs[0];
1197 struct rte_cryptodev_info dev_info;
1198 uint64_t feat_flags;
1199 const enum rte_crypto_cipher_algorithm ciphers[] = {
1200 RTE_CRYPTO_CIPHER_NULL,
1201 RTE_CRYPTO_CIPHER_AES_CTR,
1202 RTE_CRYPTO_CIPHER_ZUC_EEA3,
1203 RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1205 const enum rte_crypto_auth_algorithm auths[] = {
1206 RTE_CRYPTO_AUTH_NULL,
1207 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1208 RTE_CRYPTO_AUTH_AES_CMAC,
1209 RTE_CRYPTO_AUTH_ZUC_EIA3
1212 rte_cryptodev_info_get(dev_id, &dev_info);
1213 feat_flags = dev_info.feature_flags;
1215 if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1216 (global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1217 RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1218 "Cipher Hash testsuite not met\n");
1219 return TEST_SKIPPED;
1222 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1223 && check_auth_capabilities_supported(auths,
1224 RTE_DIM(auths)) != 0) {
1225 RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1226 "Cipher Hash testsuite not met\n");
1227 return TEST_SKIPPED;
1234 esn_testsuite_setup(void)
1236 struct crypto_testsuite_params *ts_params = &testsuite_params;
1237 uint8_t dev_id = ts_params->valid_devs[0];
1238 struct rte_cryptodev_info dev_info;
1239 const enum rte_crypto_cipher_algorithm ciphers[] = {
1240 RTE_CRYPTO_CIPHER_AES_CBC
1242 const enum rte_crypto_auth_algorithm auths[] = {
1243 RTE_CRYPTO_AUTH_SHA1_HMAC
1246 rte_cryptodev_info_get(dev_id, &dev_info);
1248 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1249 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1250 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1251 RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1252 "testsuite not met\n");
1253 return TEST_SKIPPED;
1256 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1257 && check_auth_capabilities_supported(auths,
1258 RTE_DIM(auths)) != 0) {
1259 RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1260 "testsuite not met\n");
1261 return TEST_SKIPPED;
1268 multi_session_testsuite_setup(void)
1270 struct crypto_testsuite_params *ts_params = &testsuite_params;
1271 uint8_t dev_id = ts_params->valid_devs[0];
1272 struct rte_cryptodev_info dev_info;
1273 const enum rte_crypto_cipher_algorithm ciphers[] = {
1274 RTE_CRYPTO_CIPHER_AES_CBC
1276 const enum rte_crypto_auth_algorithm auths[] = {
1277 RTE_CRYPTO_AUTH_SHA512_HMAC
1280 rte_cryptodev_info_get(dev_id, &dev_info);
1282 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1283 RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1284 "Session testsuite not met\n");
1285 return TEST_SKIPPED;
1288 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1289 && check_auth_capabilities_supported(auths,
1290 RTE_DIM(auths)) != 0) {
1291 RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1292 "Session testsuite not met\n");
1293 return TEST_SKIPPED;
1300 negative_hmac_sha1_testsuite_setup(void)
1302 struct crypto_testsuite_params *ts_params = &testsuite_params;
1303 uint8_t dev_id = ts_params->valid_devs[0];
1304 struct rte_cryptodev_info dev_info;
1305 const enum rte_crypto_cipher_algorithm ciphers[] = {
1306 RTE_CRYPTO_CIPHER_AES_CBC
1308 const enum rte_crypto_auth_algorithm auths[] = {
1309 RTE_CRYPTO_AUTH_SHA1_HMAC
1312 rte_cryptodev_info_get(dev_id, &dev_info);
1314 if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1315 ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1316 !(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1317 RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1318 "HMAC SHA1 testsuite not met\n");
1319 return TEST_SKIPPED;
1322 if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1323 && check_auth_capabilities_supported(auths,
1324 RTE_DIM(auths)) != 0) {
1325 RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1326 "HMAC SHA1 testsuite not met\n");
1327 return TEST_SKIPPED;
1334 dev_configure_and_start(uint64_t ff_disable)
1336 struct crypto_testsuite_params *ts_params = &testsuite_params;
1337 struct crypto_unittest_params *ut_params = &unittest_params;
1341 /* Clear unit test parameters before running test */
1342 memset(ut_params, 0, sizeof(*ut_params));
1344 /* Reconfigure device to default parameters */
1345 ts_params->conf.socket_id = SOCKET_ID_ANY;
1346 ts_params->conf.ff_disable = ff_disable;
1347 ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1348 ts_params->qp_conf.mp_session = ts_params->session_mpool;
1349 ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1351 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1353 "Failed to configure cryptodev %u",
1354 ts_params->valid_devs[0]);
1356 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1357 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1358 ts_params->valid_devs[0], qp_id,
1359 &ts_params->qp_conf,
1360 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1361 "Failed to setup queue pair %u on cryptodev %u",
1362 qp_id, ts_params->valid_devs[0]);
1366 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1368 /* Start the device */
1369 TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1370 "Failed to start cryptodev %u",
1371 ts_params->valid_devs[0]);
1373 return TEST_SUCCESS;
1379 /* Configure and start the device with security feature disabled */
1380 return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1384 ut_setup_security(void)
1386 /* Configure and start the device with no features disabled */
1387 return dev_configure_and_start(0);
1393 struct crypto_testsuite_params *ts_params = &testsuite_params;
1394 struct crypto_unittest_params *ut_params = &unittest_params;
1395 struct rte_cryptodev_stats stats;
1397 /* free crypto session structure */
1398 #ifdef RTE_LIB_SECURITY
1399 if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1400 if (ut_params->sec_session) {
1401 rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1402 (ts_params->valid_devs[0]),
1403 ut_params->sec_session);
1404 ut_params->sec_session = NULL;
1409 if (ut_params->sess) {
1410 rte_cryptodev_sym_session_clear(
1411 ts_params->valid_devs[0],
1413 rte_cryptodev_sym_session_free(ut_params->sess);
1414 ut_params->sess = NULL;
1418 /* free crypto operation structure */
1420 rte_crypto_op_free(ut_params->op);
1423 * free mbuf - both obuf and ibuf are usually the same,
1424 * so check if they point at the same address is necessary,
1425 * to avoid freeing the mbuf twice.
1427 if (ut_params->obuf) {
1428 rte_pktmbuf_free(ut_params->obuf);
1429 if (ut_params->ibuf == ut_params->obuf)
1430 ut_params->ibuf = 0;
1431 ut_params->obuf = 0;
1433 if (ut_params->ibuf) {
1434 rte_pktmbuf_free(ut_params->ibuf);
1435 ut_params->ibuf = 0;
1438 if (ts_params->mbuf_pool != NULL)
1439 RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1440 rte_mempool_avail_count(ts_params->mbuf_pool));
1442 rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1444 /* Stop the device */
1445 rte_cryptodev_stop(ts_params->valid_devs[0]);
1449 test_device_configure_invalid_dev_id(void)
1451 struct crypto_testsuite_params *ts_params = &testsuite_params;
1452 uint16_t dev_id, num_devs = 0;
1454 TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1455 "Need at least %d devices for test", 1);
1457 /* valid dev_id values */
1458 dev_id = ts_params->valid_devs[0];
1460 /* Stop the device in case it's started so it can be configured */
1461 rte_cryptodev_stop(dev_id);
1463 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1464 "Failed test for rte_cryptodev_configure: "
1465 "invalid dev_num %u", dev_id);
1467 /* invalid dev_id values */
1470 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1471 "Failed test for rte_cryptodev_configure: "
1472 "invalid dev_num %u", dev_id);
1476 TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1477 "Failed test for rte_cryptodev_configure:"
1478 "invalid dev_num %u", dev_id);
1480 return TEST_SUCCESS;
1484 test_device_configure_invalid_queue_pair_ids(void)
1486 struct crypto_testsuite_params *ts_params = &testsuite_params;
1487 uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1489 /* Stop the device in case it's started so it can be configured */
1490 rte_cryptodev_stop(ts_params->valid_devs[0]);
1492 /* valid - max value queue pairs */
1493 ts_params->conf.nb_queue_pairs = orig_nb_qps;
1495 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1497 "Failed to configure cryptodev: dev_id %u, qp_id %u",
1498 ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1500 /* valid - one queue pairs */
1501 ts_params->conf.nb_queue_pairs = 1;
1503 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1505 "Failed to configure cryptodev: dev_id %u, qp_id %u",
1506 ts_params->valid_devs[0],
1507 ts_params->conf.nb_queue_pairs);
1510 /* invalid - zero queue pairs */
1511 ts_params->conf.nb_queue_pairs = 0;
1513 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1515 "Failed test for rte_cryptodev_configure, dev_id %u,"
1517 ts_params->valid_devs[0],
1518 ts_params->conf.nb_queue_pairs);
1521 /* invalid - max value supported by field queue pairs */
1522 ts_params->conf.nb_queue_pairs = UINT16_MAX;
1524 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1526 "Failed test for rte_cryptodev_configure, dev_id %u,"
1528 ts_params->valid_devs[0],
1529 ts_params->conf.nb_queue_pairs);
1532 /* invalid - max value + 1 queue pairs */
1533 ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1535 TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1537 "Failed test for rte_cryptodev_configure, dev_id %u,"
1539 ts_params->valid_devs[0],
1540 ts_params->conf.nb_queue_pairs);
1542 /* revert to original testsuite value */
1543 ts_params->conf.nb_queue_pairs = orig_nb_qps;
1545 return TEST_SUCCESS;
1549 test_queue_pair_descriptor_setup(void)
1551 struct crypto_testsuite_params *ts_params = &testsuite_params;
1552 struct rte_cryptodev_qp_conf qp_conf = {
1553 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
1557 /* Stop the device in case it's started so it can be configured */
1558 rte_cryptodev_stop(ts_params->valid_devs[0]);
1560 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1562 "Failed to configure cryptodev %u",
1563 ts_params->valid_devs[0]);
1566 * Test various ring sizes on this device. memzones can't be
1567 * freed so are re-used if ring is released and re-created.
1569 qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1570 qp_conf.mp_session = ts_params->session_mpool;
1571 qp_conf.mp_session_private = ts_params->session_priv_mpool;
1573 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1574 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1575 ts_params->valid_devs[0], qp_id, &qp_conf,
1576 rte_cryptodev_socket_id(
1577 ts_params->valid_devs[0])),
1579 "rte_cryptodev_queue_pair_setup: num_inflights "
1580 "%u on qp %u on cryptodev %u",
1581 qp_conf.nb_descriptors, qp_id,
1582 ts_params->valid_devs[0]);
1585 qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1587 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1588 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1589 ts_params->valid_devs[0], qp_id, &qp_conf,
1590 rte_cryptodev_socket_id(
1591 ts_params->valid_devs[0])),
1593 " rte_cryptodev_queue_pair_setup: num_inflights"
1594 " %u on qp %u on cryptodev %u",
1595 qp_conf.nb_descriptors, qp_id,
1596 ts_params->valid_devs[0]);
1599 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1601 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1602 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1603 ts_params->valid_devs[0], qp_id, &qp_conf,
1604 rte_cryptodev_socket_id(
1605 ts_params->valid_devs[0])),
1607 "rte_cryptodev_queue_pair_setup: num_inflights"
1608 " %u on qp %u on cryptodev %u",
1609 qp_conf.nb_descriptors, qp_id,
1610 ts_params->valid_devs[0]);
1613 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1615 for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1616 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1617 ts_params->valid_devs[0], qp_id, &qp_conf,
1618 rte_cryptodev_socket_id(
1619 ts_params->valid_devs[0])),
1621 " rte_cryptodev_queue_pair_setup:"
1622 "num_inflights %u on qp %u on cryptodev %u",
1623 qp_conf.nb_descriptors, qp_id,
1624 ts_params->valid_devs[0]);
1627 /* test invalid queue pair id */
1628 qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT; /*valid */
1630 qp_id = ts_params->conf.nb_queue_pairs; /*invalid */
1632 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1633 ts_params->valid_devs[0],
1635 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1636 "Failed test for rte_cryptodev_queue_pair_setup:"
1637 "invalid qp %u on cryptodev %u",
1638 qp_id, ts_params->valid_devs[0]);
1640 qp_id = 0xffff; /*invalid*/
1642 TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1643 ts_params->valid_devs[0],
1645 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1646 "Failed test for rte_cryptodev_queue_pair_setup:"
1647 "invalid qp %u on cryptodev %u",
1648 qp_id, ts_params->valid_devs[0]);
1650 return TEST_SUCCESS;
1653 /* ***** Plaintext data for tests ***** */
1655 const char catch_22_quote_1[] =
1656 "There was only one catch and that was Catch-22, which "
1657 "specified that a concern for one's safety in the face of "
1658 "dangers that were real and immediate was the process of a "
1659 "rational mind. Orr was crazy and could be grounded. All he "
1660 "had to do was ask; and as soon as he did, he would no longer "
1661 "be crazy and would have to fly more missions. Orr would be "
1662 "crazy to fly more missions and sane if he didn't, but if he "
1663 "was sane he had to fly them. If he flew them he was crazy "
1664 "and didn't have to; but if he didn't want to he was sane and "
1665 "had to. Yossarian was moved very deeply by the absolute "
1666 "simplicity of this clause of Catch-22 and let out a "
1667 "respectful whistle. \"That's some catch, that Catch-22\", he "
1668 "observed. \"It's the best there is,\" Doc Daneeka agreed.";
1670 const char catch_22_quote[] =
1671 "What a lousy earth! He wondered how many people were "
1672 "destitute that same night even in his own prosperous country, "
1673 "how many homes were shanties, how many husbands were drunk "
1674 "and wives socked, and how many children were bullied, abused, "
1675 "or abandoned. How many families hungered for food they could "
1676 "not afford to buy? How many hearts were broken? How many "
1677 "suicides would take place that same night, how many people "
1678 "would go insane? How many cockroaches and landlords would "
1679 "triumph? How many winners were losers, successes failures, "
1680 "and rich men poor men? How many wise guys were stupid? How "
1681 "many happy endings were unhappy endings? How many honest men "
1682 "were liars, brave men cowards, loyal men traitors, how many "
1683 "sainted men were corrupt, how many people in positions of "
1684 "trust had sold their souls to bodyguards, how many had never "
1685 "had souls? How many straight-and-narrow paths were crooked "
1686 "paths? How many best families were worst families and how "
1687 "many good people were bad people? When you added them all up "
1688 "and then subtracted, you might be left with only the children, "
1689 "and perhaps with Albert Einstein and an old violinist or "
1690 "sculptor somewhere.";
1692 #define QUOTE_480_BYTES (480)
1693 #define QUOTE_512_BYTES (512)
1694 #define QUOTE_768_BYTES (768)
1695 #define QUOTE_1024_BYTES (1024)
1699 /* ***** SHA1 Hash Tests ***** */
1701 #define HMAC_KEY_LENGTH_SHA1 (DIGEST_BYTE_LENGTH_SHA1)
1703 static uint8_t hmac_sha1_key[] = {
1704 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1705 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1706 0xDE, 0xF4, 0xDE, 0xAD };
1708 /* ***** SHA224 Hash Tests ***** */
1710 #define HMAC_KEY_LENGTH_SHA224 (DIGEST_BYTE_LENGTH_SHA224)
1713 /* ***** AES-CBC Cipher Tests ***** */
1715 #define CIPHER_KEY_LENGTH_AES_CBC (16)
1716 #define CIPHER_IV_LENGTH_AES_CBC (CIPHER_KEY_LENGTH_AES_CBC)
1718 static uint8_t aes_cbc_key[] = {
1719 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1720 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1722 static uint8_t aes_cbc_iv[] = {
1723 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1724 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1727 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1729 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1730 0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1731 0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1732 0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1733 0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1734 0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1735 0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1736 0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1737 0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1738 0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1739 0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1740 0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1741 0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1742 0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1743 0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1744 0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1745 0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1746 0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1747 0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1748 0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1749 0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1750 0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1751 0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1752 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1753 0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1754 0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1755 0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1756 0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1757 0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1758 0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1759 0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1760 0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1761 0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1762 0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1763 0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1764 0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1765 0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1766 0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1767 0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1768 0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1769 0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1770 0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1771 0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1772 0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1773 0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1774 0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1775 0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1776 0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1777 0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1778 0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1779 0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1780 0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1781 0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1782 0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1783 0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1784 0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1785 0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1786 0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1787 0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1788 0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1789 0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1790 0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1791 0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1792 0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1793 0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1796 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1797 0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1798 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1799 0x18, 0x8c, 0x1d, 0x32
1803 /* Multisession Vector context Test */
1804 /*Begin Session 0 */
1805 static uint8_t ms_aes_cbc_key0[] = {
1806 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1807 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1810 static uint8_t ms_aes_cbc_iv0[] = {
1811 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1812 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1815 static const uint8_t ms_aes_cbc_cipher0[] = {
1816 0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1817 0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1818 0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1819 0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1820 0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1821 0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1822 0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1823 0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1824 0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1825 0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1826 0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1827 0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1828 0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1829 0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1830 0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1831 0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1832 0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1833 0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1834 0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1835 0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1836 0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1837 0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1838 0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1839 0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1840 0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1841 0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1842 0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1843 0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1844 0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1845 0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1846 0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1847 0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1848 0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1849 0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1850 0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1851 0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1852 0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1853 0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1854 0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1855 0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1856 0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1857 0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1858 0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1859 0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1860 0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1861 0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1862 0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1863 0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1864 0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1865 0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1866 0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1867 0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1868 0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1869 0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1870 0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1871 0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1872 0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1873 0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1874 0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1875 0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1876 0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1877 0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1878 0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1879 0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1883 static uint8_t ms_hmac_key0[] = {
1884 0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1885 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1886 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1887 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1888 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1889 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1890 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1891 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1894 static const uint8_t ms_hmac_digest0[] = {
1895 0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1896 0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1897 0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1898 0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1899 0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1900 0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1901 0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1902 0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1906 /* Begin session 1 */
1908 static uint8_t ms_aes_cbc_key1[] = {
1909 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1910 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1913 static uint8_t ms_aes_cbc_iv1[] = {
1914 0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1915 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1918 static const uint8_t ms_aes_cbc_cipher1[] = {
1919 0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1920 0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1921 0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1922 0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1923 0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1924 0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1925 0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1926 0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1927 0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1928 0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1929 0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1930 0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1931 0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1932 0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1933 0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1934 0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1935 0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1936 0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1937 0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1938 0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1939 0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1940 0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1941 0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1942 0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1943 0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1944 0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1945 0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1946 0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1947 0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1948 0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1949 0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1950 0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1951 0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1952 0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1953 0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1954 0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1955 0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1956 0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1957 0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1958 0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1959 0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1960 0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1961 0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1962 0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1963 0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1964 0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1965 0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1966 0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1967 0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1968 0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1969 0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1970 0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1971 0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1972 0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1973 0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1974 0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1975 0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1976 0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1977 0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1978 0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1979 0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1980 0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1981 0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1982 0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1986 static uint8_t ms_hmac_key1[] = {
1987 0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1988 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1989 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1990 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1991 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1992 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1993 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1994 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1997 static const uint8_t ms_hmac_digest1[] = {
1998 0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1999 0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2000 0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2001 0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2002 0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2003 0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2004 0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2005 0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2008 /* Begin Session 2 */
2009 static uint8_t ms_aes_cbc_key2[] = {
2010 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2011 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2014 static uint8_t ms_aes_cbc_iv2[] = {
2015 0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2016 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2019 static const uint8_t ms_aes_cbc_cipher2[] = {
2020 0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2021 0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2022 0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2023 0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2024 0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2025 0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2026 0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2027 0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2028 0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2029 0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2030 0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2031 0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2032 0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2033 0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2034 0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2035 0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2036 0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2037 0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2038 0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2039 0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2040 0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2041 0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2042 0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2043 0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2044 0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2045 0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2046 0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2047 0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2048 0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2049 0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2050 0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2051 0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2052 0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2053 0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2054 0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2055 0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2056 0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2057 0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2058 0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2059 0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2060 0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2061 0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2062 0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2063 0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2064 0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2065 0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2066 0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2067 0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2068 0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2069 0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2070 0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2071 0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2072 0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2073 0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2074 0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2075 0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2076 0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2077 0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2078 0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2079 0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2080 0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2081 0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2082 0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2083 0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2086 static uint8_t ms_hmac_key2[] = {
2087 0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2088 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2089 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2090 0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2091 0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2092 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2093 0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2094 0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2097 static const uint8_t ms_hmac_digest2[] = {
2098 0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2099 0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2100 0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2101 0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2102 0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2103 0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2104 0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2105 0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2112 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2114 struct crypto_testsuite_params *ts_params = &testsuite_params;
2115 struct crypto_unittest_params *ut_params = &unittest_params;
2117 /* Verify the capabilities */
2118 struct rte_cryptodev_sym_capability_idx cap_idx;
2119 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2120 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2121 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2123 return TEST_SKIPPED;
2124 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2125 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2126 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2128 return TEST_SKIPPED;
2130 /* Generate test mbuf data and space for digest */
2131 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2132 catch_22_quote, QUOTE_512_BYTES, 0);
2134 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2135 DIGEST_BYTE_LENGTH_SHA1);
2136 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2138 /* Setup Cipher Parameters */
2139 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2140 ut_params->cipher_xform.next = &ut_params->auth_xform;
2142 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2143 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2144 ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2145 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2146 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2147 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2149 /* Setup HMAC Parameters */
2150 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2152 ut_params->auth_xform.next = NULL;
2154 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2155 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2156 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2157 ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2158 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2160 ut_params->sess = rte_cryptodev_sym_session_create(
2161 ts_params->session_mpool);
2163 /* Create crypto session*/
2164 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2165 ut_params->sess, &ut_params->cipher_xform,
2166 ts_params->session_priv_mpool);
2167 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2169 /* Generate crypto op data structure */
2170 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2171 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2172 TEST_ASSERT_NOT_NULL(ut_params->op,
2173 "Failed to allocate symmetric crypto operation struct");
2175 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2177 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2179 /* set crypto operation source mbuf */
2180 sym_op->m_src = ut_params->ibuf;
2182 /* Set crypto operation authentication parameters */
2183 sym_op->auth.digest.data = ut_params->digest;
2184 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2185 ut_params->ibuf, QUOTE_512_BYTES);
2187 sym_op->auth.data.offset = 0;
2188 sym_op->auth.data.length = QUOTE_512_BYTES;
2190 /* Copy IV at the end of the crypto operation */
2191 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2192 aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2194 /* Set crypto operation cipher parameters */
2195 sym_op->cipher.data.offset = 0;
2196 sym_op->cipher.data.length = QUOTE_512_BYTES;
2198 /* Process crypto operation */
2199 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2200 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2203 TEST_ASSERT_NOT_NULL(
2204 process_crypto_request(ts_params->valid_devs[0],
2206 "failed to process sym crypto op");
2208 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2209 "crypto op processing failed");
2212 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2215 TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2216 catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2218 "ciphertext data not as expected");
2220 uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2222 TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2223 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2224 gbl_driver_id == rte_cryptodev_driver_id_get(
2225 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2226 TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2227 DIGEST_BYTE_LENGTH_SHA1,
2228 "Generated digest data not as expected");
2230 return TEST_SUCCESS;
2233 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2235 #define HMAC_KEY_LENGTH_SHA512 (DIGEST_BYTE_LENGTH_SHA512)
2237 static uint8_t hmac_sha512_key[] = {
2238 0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2239 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2240 0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2241 0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2242 0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2243 0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2244 0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2245 0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2247 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2248 0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2249 0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2250 0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2251 0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2252 0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2253 0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2254 0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2255 0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2260 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2261 struct crypto_unittest_params *ut_params,
2262 uint8_t *cipher_key,
2266 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2267 struct crypto_unittest_params *ut_params,
2268 struct crypto_testsuite_params *ts_params,
2269 const uint8_t *cipher,
2270 const uint8_t *digest,
2275 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2276 struct crypto_unittest_params *ut_params,
2277 uint8_t *cipher_key,
2281 /* Setup Cipher Parameters */
2282 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2283 ut_params->cipher_xform.next = NULL;
2285 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2286 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2287 ut_params->cipher_xform.cipher.key.data = cipher_key;
2288 ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2289 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2290 ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2292 /* Setup HMAC Parameters */
2293 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2294 ut_params->auth_xform.next = &ut_params->cipher_xform;
2296 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2297 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2298 ut_params->auth_xform.auth.key.data = hmac_key;
2299 ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2300 ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2302 return TEST_SUCCESS;
2307 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2308 struct crypto_unittest_params *ut_params,
2309 struct crypto_testsuite_params *ts_params,
2310 const uint8_t *cipher,
2311 const uint8_t *digest,
2314 /* Generate test mbuf data and digest */
2315 ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2318 QUOTE_512_BYTES, 0);
2320 ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2321 DIGEST_BYTE_LENGTH_SHA512);
2322 TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2324 rte_memcpy(ut_params->digest,
2326 DIGEST_BYTE_LENGTH_SHA512);
2328 /* Generate Crypto op data structure */
2329 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2330 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2331 TEST_ASSERT_NOT_NULL(ut_params->op,
2332 "Failed to allocate symmetric crypto operation struct");
2334 rte_crypto_op_attach_sym_session(ut_params->op, sess);
2336 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2338 /* set crypto operation source mbuf */
2339 sym_op->m_src = ut_params->ibuf;
2341 sym_op->auth.digest.data = ut_params->digest;
2342 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2343 ut_params->ibuf, QUOTE_512_BYTES);
2345 sym_op->auth.data.offset = 0;
2346 sym_op->auth.data.length = QUOTE_512_BYTES;
2348 /* Copy IV at the end of the crypto operation */
2349 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2350 iv, CIPHER_IV_LENGTH_AES_CBC);
2352 sym_op->cipher.data.offset = 0;
2353 sym_op->cipher.data.length = QUOTE_512_BYTES;
2355 /* Process crypto operation */
2356 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2357 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2359 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2360 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2361 ut_params->op, 1, 1, 0, 0);
2363 TEST_ASSERT_NOT_NULL(
2364 process_crypto_request(ts_params->valid_devs[0],
2366 "failed to process sym crypto op");
2368 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2369 "crypto op processing failed");
2371 ut_params->obuf = ut_params->op->sym->m_src;
2374 TEST_ASSERT_BUFFERS_ARE_EQUAL(
2375 rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2378 "Plaintext data not as expected");
2381 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2382 "Digest verification failed");
2384 return TEST_SUCCESS;
2387 /* ***** SNOW 3G Tests ***** */
2389 create_wireless_algo_hash_session(uint8_t dev_id,
2390 const uint8_t *key, const uint8_t key_len,
2391 const uint8_t iv_len, const uint8_t auth_len,
2392 enum rte_crypto_auth_operation op,
2393 enum rte_crypto_auth_algorithm algo)
2395 uint8_t hash_key[key_len];
2398 struct crypto_testsuite_params *ts_params = &testsuite_params;
2399 struct crypto_unittest_params *ut_params = &unittest_params;
2401 memcpy(hash_key, key, key_len);
2403 debug_hexdump(stdout, "key:", key, key_len);
2405 /* Setup Authentication Parameters */
2406 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2407 ut_params->auth_xform.next = NULL;
2409 ut_params->auth_xform.auth.op = op;
2410 ut_params->auth_xform.auth.algo = algo;
2411 ut_params->auth_xform.auth.key.length = key_len;
2412 ut_params->auth_xform.auth.key.data = hash_key;
2413 ut_params->auth_xform.auth.digest_length = auth_len;
2414 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2415 ut_params->auth_xform.auth.iv.length = iv_len;
2416 ut_params->sess = rte_cryptodev_sym_session_create(
2417 ts_params->session_mpool);
2419 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2420 &ut_params->auth_xform,
2421 ts_params->session_priv_mpool);
2422 if (status == -ENOTSUP)
2423 return TEST_SKIPPED;
2425 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2426 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2431 create_wireless_algo_cipher_session(uint8_t dev_id,
2432 enum rte_crypto_cipher_operation op,
2433 enum rte_crypto_cipher_algorithm algo,
2434 const uint8_t *key, const uint8_t key_len,
2437 uint8_t cipher_key[key_len];
2439 struct crypto_testsuite_params *ts_params = &testsuite_params;
2440 struct crypto_unittest_params *ut_params = &unittest_params;
2442 memcpy(cipher_key, key, key_len);
2444 /* Setup Cipher Parameters */
2445 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2446 ut_params->cipher_xform.next = NULL;
2448 ut_params->cipher_xform.cipher.algo = algo;
2449 ut_params->cipher_xform.cipher.op = op;
2450 ut_params->cipher_xform.cipher.key.data = cipher_key;
2451 ut_params->cipher_xform.cipher.key.length = key_len;
2452 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2453 ut_params->cipher_xform.cipher.iv.length = iv_len;
2455 debug_hexdump(stdout, "key:", key, key_len);
2457 /* Create Crypto session */
2458 ut_params->sess = rte_cryptodev_sym_session_create(
2459 ts_params->session_mpool);
2461 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2462 &ut_params->cipher_xform,
2463 ts_params->session_priv_mpool);
2464 if (status == -ENOTSUP)
2465 return TEST_SKIPPED;
2467 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2468 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2473 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2474 unsigned int cipher_len,
2475 unsigned int cipher_offset)
2477 struct crypto_testsuite_params *ts_params = &testsuite_params;
2478 struct crypto_unittest_params *ut_params = &unittest_params;
2480 /* Generate Crypto op data structure */
2481 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2482 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2483 TEST_ASSERT_NOT_NULL(ut_params->op,
2484 "Failed to allocate pktmbuf offload");
2486 /* Set crypto operation data parameters */
2487 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2489 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2491 /* set crypto operation source mbuf */
2492 sym_op->m_src = ut_params->ibuf;
2495 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2497 sym_op->cipher.data.length = cipher_len;
2498 sym_op->cipher.data.offset = cipher_offset;
2503 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2504 unsigned int cipher_len,
2505 unsigned int cipher_offset)
2507 struct crypto_testsuite_params *ts_params = &testsuite_params;
2508 struct crypto_unittest_params *ut_params = &unittest_params;
2510 /* Generate Crypto op data structure */
2511 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2512 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2513 TEST_ASSERT_NOT_NULL(ut_params->op,
2514 "Failed to allocate pktmbuf offload");
2516 /* Set crypto operation data parameters */
2517 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2519 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2521 /* set crypto operation source mbuf */
2522 sym_op->m_src = ut_params->ibuf;
2523 sym_op->m_dst = ut_params->obuf;
2526 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2528 sym_op->cipher.data.length = cipher_len;
2529 sym_op->cipher.data.offset = cipher_offset;
2534 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2535 enum rte_crypto_cipher_operation cipher_op,
2536 enum rte_crypto_auth_operation auth_op,
2537 enum rte_crypto_auth_algorithm auth_algo,
2538 enum rte_crypto_cipher_algorithm cipher_algo,
2539 const uint8_t *key, uint8_t key_len,
2540 uint8_t auth_iv_len, uint8_t auth_len,
2541 uint8_t cipher_iv_len)
2544 uint8_t cipher_auth_key[key_len];
2547 struct crypto_testsuite_params *ts_params = &testsuite_params;
2548 struct crypto_unittest_params *ut_params = &unittest_params;
2550 memcpy(cipher_auth_key, key, key_len);
2552 /* Setup Authentication Parameters */
2553 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2554 ut_params->auth_xform.next = NULL;
2556 ut_params->auth_xform.auth.op = auth_op;
2557 ut_params->auth_xform.auth.algo = auth_algo;
2558 ut_params->auth_xform.auth.key.length = key_len;
2559 /* Hash key = cipher key */
2560 ut_params->auth_xform.auth.key.data = cipher_auth_key;
2561 ut_params->auth_xform.auth.digest_length = auth_len;
2562 /* Auth IV will be after cipher IV */
2563 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2564 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2566 /* Setup Cipher Parameters */
2567 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2568 ut_params->cipher_xform.next = &ut_params->auth_xform;
2570 ut_params->cipher_xform.cipher.algo = cipher_algo;
2571 ut_params->cipher_xform.cipher.op = cipher_op;
2572 ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2573 ut_params->cipher_xform.cipher.key.length = key_len;
2574 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2575 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2577 debug_hexdump(stdout, "key:", key, key_len);
2579 /* Create Crypto session*/
2580 ut_params->sess = rte_cryptodev_sym_session_create(
2581 ts_params->session_mpool);
2582 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2584 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2585 &ut_params->cipher_xform,
2586 ts_params->session_priv_mpool);
2587 if (status == -ENOTSUP)
2588 return TEST_SKIPPED;
2590 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2595 create_wireless_cipher_auth_session(uint8_t dev_id,
2596 enum rte_crypto_cipher_operation cipher_op,
2597 enum rte_crypto_auth_operation auth_op,
2598 enum rte_crypto_auth_algorithm auth_algo,
2599 enum rte_crypto_cipher_algorithm cipher_algo,
2600 const struct wireless_test_data *tdata)
2602 const uint8_t key_len = tdata->key.len;
2603 uint8_t cipher_auth_key[key_len];
2606 struct crypto_testsuite_params *ts_params = &testsuite_params;
2607 struct crypto_unittest_params *ut_params = &unittest_params;
2608 const uint8_t *key = tdata->key.data;
2609 const uint8_t auth_len = tdata->digest.len;
2610 uint8_t cipher_iv_len = tdata->cipher_iv.len;
2611 uint8_t auth_iv_len = tdata->auth_iv.len;
2613 memcpy(cipher_auth_key, key, key_len);
2615 /* Setup Authentication Parameters */
2616 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2617 ut_params->auth_xform.next = NULL;
2619 ut_params->auth_xform.auth.op = auth_op;
2620 ut_params->auth_xform.auth.algo = auth_algo;
2621 ut_params->auth_xform.auth.key.length = key_len;
2622 /* Hash key = cipher key */
2623 ut_params->auth_xform.auth.key.data = cipher_auth_key;
2624 ut_params->auth_xform.auth.digest_length = auth_len;
2625 /* Auth IV will be after cipher IV */
2626 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2627 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2629 /* Setup Cipher Parameters */
2630 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2631 ut_params->cipher_xform.next = &ut_params->auth_xform;
2633 ut_params->cipher_xform.cipher.algo = cipher_algo;
2634 ut_params->cipher_xform.cipher.op = cipher_op;
2635 ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2636 ut_params->cipher_xform.cipher.key.length = key_len;
2637 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2638 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2641 debug_hexdump(stdout, "key:", key, key_len);
2643 /* Create Crypto session*/
2644 ut_params->sess = rte_cryptodev_sym_session_create(
2645 ts_params->session_mpool);
2647 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2648 &ut_params->cipher_xform,
2649 ts_params->session_priv_mpool);
2650 if (status == -ENOTSUP)
2651 return TEST_SKIPPED;
2653 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2654 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2659 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2660 const struct wireless_test_data *tdata)
2662 return create_wireless_cipher_auth_session(dev_id,
2663 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2664 RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2665 RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2669 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2670 enum rte_crypto_cipher_operation cipher_op,
2671 enum rte_crypto_auth_operation auth_op,
2672 enum rte_crypto_auth_algorithm auth_algo,
2673 enum rte_crypto_cipher_algorithm cipher_algo,
2674 const uint8_t *key, const uint8_t key_len,
2675 uint8_t auth_iv_len, uint8_t auth_len,
2676 uint8_t cipher_iv_len)
2678 uint8_t auth_cipher_key[key_len];
2680 struct crypto_testsuite_params *ts_params = &testsuite_params;
2681 struct crypto_unittest_params *ut_params = &unittest_params;
2683 memcpy(auth_cipher_key, key, key_len);
2685 /* Setup Authentication Parameters */
2686 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2687 ut_params->auth_xform.auth.op = auth_op;
2688 ut_params->auth_xform.next = &ut_params->cipher_xform;
2689 ut_params->auth_xform.auth.algo = auth_algo;
2690 ut_params->auth_xform.auth.key.length = key_len;
2691 ut_params->auth_xform.auth.key.data = auth_cipher_key;
2692 ut_params->auth_xform.auth.digest_length = auth_len;
2693 /* Auth IV will be after cipher IV */
2694 ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2695 ut_params->auth_xform.auth.iv.length = auth_iv_len;
2697 /* Setup Cipher Parameters */
2698 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2699 ut_params->cipher_xform.next = NULL;
2700 ut_params->cipher_xform.cipher.algo = cipher_algo;
2701 ut_params->cipher_xform.cipher.op = cipher_op;
2702 ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2703 ut_params->cipher_xform.cipher.key.length = key_len;
2704 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2705 ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2707 debug_hexdump(stdout, "key:", key, key_len);
2709 /* Create Crypto session*/
2710 ut_params->sess = rte_cryptodev_sym_session_create(
2711 ts_params->session_mpool);
2712 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2714 if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2715 ut_params->auth_xform.next = NULL;
2716 ut_params->cipher_xform.next = &ut_params->auth_xform;
2717 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2718 &ut_params->cipher_xform,
2719 ts_params->session_priv_mpool);
2722 status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2723 &ut_params->auth_xform,
2724 ts_params->session_priv_mpool);
2726 if (status == -ENOTSUP)
2727 return TEST_SKIPPED;
2729 TEST_ASSERT_EQUAL(status, 0, "session init failed");
2735 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2736 unsigned int auth_tag_len,
2737 const uint8_t *iv, unsigned int iv_len,
2738 unsigned int data_pad_len,
2739 enum rte_crypto_auth_operation op,
2740 unsigned int auth_len, unsigned int auth_offset)
2742 struct crypto_testsuite_params *ts_params = &testsuite_params;
2744 struct crypto_unittest_params *ut_params = &unittest_params;
2746 /* Generate Crypto op data structure */
2747 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2748 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2749 TEST_ASSERT_NOT_NULL(ut_params->op,
2750 "Failed to allocate pktmbuf offload");
2752 /* Set crypto operation data parameters */
2753 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2755 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2757 /* set crypto operation source mbuf */
2758 sym_op->m_src = ut_params->ibuf;
2761 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2764 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2765 ut_params->ibuf, auth_tag_len);
2767 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2768 "no room to append auth tag");
2769 ut_params->digest = sym_op->auth.digest.data;
2770 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2771 ut_params->ibuf, data_pad_len);
2772 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2773 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2775 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2777 debug_hexdump(stdout, "digest:",
2778 sym_op->auth.digest.data,
2781 sym_op->auth.data.length = auth_len;
2782 sym_op->auth.data.offset = auth_offset;
2788 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2789 enum rte_crypto_auth_operation op)
2791 struct crypto_testsuite_params *ts_params = &testsuite_params;
2792 struct crypto_unittest_params *ut_params = &unittest_params;
2794 const uint8_t *auth_tag = tdata->digest.data;
2795 const unsigned int auth_tag_len = tdata->digest.len;
2796 unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2797 unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2799 const uint8_t *cipher_iv = tdata->cipher_iv.data;
2800 const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2801 const uint8_t *auth_iv = tdata->auth_iv.data;
2802 const uint8_t auth_iv_len = tdata->auth_iv.len;
2803 const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2804 const unsigned int auth_len = tdata->validAuthLenInBits.len;
2806 /* Generate Crypto op data structure */
2807 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2808 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2809 TEST_ASSERT_NOT_NULL(ut_params->op,
2810 "Failed to allocate pktmbuf offload");
2811 /* Set crypto operation data parameters */
2812 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2814 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2816 /* set crypto operation source mbuf */
2817 sym_op->m_src = ut_params->ibuf;
2820 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2821 ut_params->ibuf, auth_tag_len);
2823 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2824 "no room to append auth tag");
2825 ut_params->digest = sym_op->auth.digest.data;
2826 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2827 ut_params->ibuf, data_pad_len);
2828 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2829 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2831 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2833 debug_hexdump(stdout, "digest:",
2834 sym_op->auth.digest.data,
2837 /* Copy cipher and auth IVs at the end of the crypto operation */
2838 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2840 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2841 iv_ptr += cipher_iv_len;
2842 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2844 sym_op->cipher.data.length = cipher_len;
2845 sym_op->cipher.data.offset = 0;
2846 sym_op->auth.data.length = auth_len;
2847 sym_op->auth.data.offset = 0;
2853 create_zuc_cipher_hash_generate_operation(
2854 const struct wireless_test_data *tdata)
2856 return create_wireless_cipher_hash_operation(tdata,
2857 RTE_CRYPTO_AUTH_OP_GENERATE);
2861 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2862 const unsigned auth_tag_len,
2863 const uint8_t *auth_iv, uint8_t auth_iv_len,
2864 unsigned data_pad_len,
2865 enum rte_crypto_auth_operation op,
2866 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2867 const unsigned cipher_len, const unsigned cipher_offset,
2868 const unsigned auth_len, const unsigned auth_offset)
2870 struct crypto_testsuite_params *ts_params = &testsuite_params;
2871 struct crypto_unittest_params *ut_params = &unittest_params;
2873 enum rte_crypto_cipher_algorithm cipher_algo =
2874 ut_params->cipher_xform.cipher.algo;
2875 enum rte_crypto_auth_algorithm auth_algo =
2876 ut_params->auth_xform.auth.algo;
2878 /* Generate Crypto op data structure */
2879 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2880 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2881 TEST_ASSERT_NOT_NULL(ut_params->op,
2882 "Failed to allocate pktmbuf offload");
2883 /* Set crypto operation data parameters */
2884 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2886 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2888 /* set crypto operation source mbuf */
2889 sym_op->m_src = ut_params->ibuf;
2892 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2893 ut_params->ibuf, auth_tag_len);
2895 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2896 "no room to append auth tag");
2897 ut_params->digest = sym_op->auth.digest.data;
2899 if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2900 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2901 ut_params->ibuf, data_pad_len);
2903 struct rte_mbuf *m = ut_params->ibuf;
2904 unsigned int offset = data_pad_len;
2906 while (offset > m->data_len && m->next != NULL) {
2907 offset -= m->data_len;
2910 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2914 if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2915 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2917 rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2919 debug_hexdump(stdout, "digest:",
2920 sym_op->auth.digest.data,
2923 /* Copy cipher and auth IVs at the end of the crypto operation */
2924 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2926 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2927 iv_ptr += cipher_iv_len;
2928 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2930 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2931 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2932 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2933 sym_op->cipher.data.length = cipher_len;
2934 sym_op->cipher.data.offset = cipher_offset;
2936 sym_op->cipher.data.length = cipher_len >> 3;
2937 sym_op->cipher.data.offset = cipher_offset >> 3;
2940 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2941 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2942 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2943 sym_op->auth.data.length = auth_len;
2944 sym_op->auth.data.offset = auth_offset;
2946 sym_op->auth.data.length = auth_len >> 3;
2947 sym_op->auth.data.offset = auth_offset >> 3;
2954 create_wireless_algo_auth_cipher_operation(
2955 const uint8_t *auth_tag, unsigned int auth_tag_len,
2956 const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2957 const uint8_t *auth_iv, uint8_t auth_iv_len,
2958 unsigned int data_pad_len,
2959 unsigned int cipher_len, unsigned int cipher_offset,
2960 unsigned int auth_len, unsigned int auth_offset,
2961 uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2963 struct crypto_testsuite_params *ts_params = &testsuite_params;
2964 struct crypto_unittest_params *ut_params = &unittest_params;
2966 enum rte_crypto_cipher_algorithm cipher_algo =
2967 ut_params->cipher_xform.cipher.algo;
2968 enum rte_crypto_auth_algorithm auth_algo =
2969 ut_params->auth_xform.auth.algo;
2971 /* Generate Crypto op data structure */
2972 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2973 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2974 TEST_ASSERT_NOT_NULL(ut_params->op,
2975 "Failed to allocate pktmbuf offload");
2977 /* Set crypto operation data parameters */
2978 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2980 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2982 /* set crypto operation mbufs */
2983 sym_op->m_src = ut_params->ibuf;
2984 if (op_mode == OUT_OF_PLACE)
2985 sym_op->m_dst = ut_params->obuf;
2989 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2990 (op_mode == IN_PLACE ?
2991 ut_params->ibuf : ut_params->obuf),
2992 uint8_t *, data_pad_len);
2993 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2994 (op_mode == IN_PLACE ?
2995 ut_params->ibuf : ut_params->obuf),
2997 memset(sym_op->auth.digest.data, 0, auth_tag_len);
2999 uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3000 struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3001 sym_op->m_src : sym_op->m_dst);
3002 while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3003 remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3004 sgl_buf = sgl_buf->next;
3006 sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3007 uint8_t *, remaining_off);
3008 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3010 memset(sym_op->auth.digest.data, 0, remaining_off);
3011 while (sgl_buf->next != NULL) {
3012 memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3013 0, rte_pktmbuf_data_len(sgl_buf));
3014 sgl_buf = sgl_buf->next;
3018 /* Copy digest for the verification */
3020 memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3022 /* Copy cipher and auth IVs at the end of the crypto operation */
3023 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3024 ut_params->op, uint8_t *, IV_OFFSET);
3026 rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3027 iv_ptr += cipher_iv_len;
3028 rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3030 /* Only copy over the offset data needed from src to dst in OOP,
3031 * if the auth and cipher offsets are not aligned
3033 if (op_mode == OUT_OF_PLACE) {
3034 if (cipher_offset > auth_offset)
3036 rte_pktmbuf_mtod_offset(
3038 uint8_t *, auth_offset >> 3),
3039 rte_pktmbuf_mtod_offset(
3041 uint8_t *, auth_offset >> 3),
3042 ((cipher_offset >> 3) - (auth_offset >> 3)));
3045 if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3046 cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3047 cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3048 sym_op->cipher.data.length = cipher_len;
3049 sym_op->cipher.data.offset = cipher_offset;
3051 sym_op->cipher.data.length = cipher_len >> 3;
3052 sym_op->cipher.data.offset = cipher_offset >> 3;
3055 if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3056 auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3057 auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3058 sym_op->auth.data.length = auth_len;
3059 sym_op->auth.data.offset = auth_offset;
3061 sym_op->auth.data.length = auth_len >> 3;
3062 sym_op->auth.data.offset = auth_offset >> 3;
3069 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3071 struct crypto_testsuite_params *ts_params = &testsuite_params;
3072 struct crypto_unittest_params *ut_params = &unittest_params;
3075 unsigned plaintext_pad_len;
3076 unsigned plaintext_len;
3078 struct rte_cryptodev_info dev_info;
3080 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3081 uint64_t feat_flags = dev_info.feature_flags;
3083 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3084 ((tdata->validAuthLenInBits.len % 8) != 0)) {
3085 printf("Device doesn't support NON-Byte Aligned Data.\n");
3086 return TEST_SKIPPED;
3089 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3090 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3091 printf("Device doesn't support RAW data-path APIs.\n");
3092 return TEST_SKIPPED;
3095 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3096 return TEST_SKIPPED;
3098 /* Verify the capabilities */
3099 struct rte_cryptodev_sym_capability_idx cap_idx;
3100 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3101 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3102 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3104 return TEST_SKIPPED;
3106 /* Create SNOW 3G session */
3107 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3108 tdata->key.data, tdata->key.len,
3109 tdata->auth_iv.len, tdata->digest.len,
3110 RTE_CRYPTO_AUTH_OP_GENERATE,
3111 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3115 /* alloc mbuf and set payload */
3116 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3118 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3119 rte_pktmbuf_tailroom(ut_params->ibuf));
3121 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3122 /* Append data which is padded to a multiple of */
3123 /* the algorithms block size */
3124 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3125 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3127 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3129 /* Create SNOW 3G operation */
3130 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3131 tdata->auth_iv.data, tdata->auth_iv.len,
3132 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3133 tdata->validAuthLenInBits.len,
3138 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3139 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3140 ut_params->op, 0, 1, 1, 0);
3142 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3144 ut_params->obuf = ut_params->op->sym->m_src;
3145 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3146 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3147 + plaintext_pad_len;
3150 TEST_ASSERT_BUFFERS_ARE_EQUAL(
3153 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3154 "SNOW 3G Generated auth tag not as expected");
3160 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3162 struct crypto_testsuite_params *ts_params = &testsuite_params;
3163 struct crypto_unittest_params *ut_params = &unittest_params;
3166 unsigned plaintext_pad_len;
3167 unsigned plaintext_len;
3169 struct rte_cryptodev_info dev_info;
3171 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3172 uint64_t feat_flags = dev_info.feature_flags;
3174 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3175 ((tdata->validAuthLenInBits.len % 8) != 0)) {
3176 printf("Device doesn't support NON-Byte Aligned Data.\n");
3177 return TEST_SKIPPED;
3180 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3181 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3182 printf("Device doesn't support RAW data-path APIs.\n");
3183 return TEST_SKIPPED;
3186 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3187 return TEST_SKIPPED;
3189 /* Verify the capabilities */
3190 struct rte_cryptodev_sym_capability_idx cap_idx;
3191 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3192 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3193 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3195 return TEST_SKIPPED;
3197 /* Create SNOW 3G session */
3198 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3199 tdata->key.data, tdata->key.len,
3200 tdata->auth_iv.len, tdata->digest.len,
3201 RTE_CRYPTO_AUTH_OP_VERIFY,
3202 RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3205 /* alloc mbuf and set payload */
3206 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3208 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3209 rte_pktmbuf_tailroom(ut_params->ibuf));
3211 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3212 /* Append data which is padded to a multiple of */
3213 /* the algorithms block size */
3214 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3215 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3217 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3219 /* Create SNOW 3G operation */
3220 retval = create_wireless_algo_hash_operation(tdata->digest.data,
3222 tdata->auth_iv.data, tdata->auth_iv.len,
3224 RTE_CRYPTO_AUTH_OP_VERIFY,
3225 tdata->validAuthLenInBits.len,
3230 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3231 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3232 ut_params->op, 0, 1, 1, 0);
3234 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3236 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3237 ut_params->obuf = ut_params->op->sym->m_src;
3238 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3239 + plaintext_pad_len;
3242 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3251 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3253 struct crypto_testsuite_params *ts_params = &testsuite_params;
3254 struct crypto_unittest_params *ut_params = &unittest_params;
3257 unsigned plaintext_pad_len;
3258 unsigned plaintext_len;
3260 struct rte_cryptodev_info dev_info;
3262 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3263 uint64_t feat_flags = dev_info.feature_flags;
3265 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3266 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3267 printf("Device doesn't support RAW data-path APIs.\n");
3268 return TEST_SKIPPED;
3271 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3272 return TEST_SKIPPED;
3274 /* Verify the capabilities */
3275 struct rte_cryptodev_sym_capability_idx cap_idx;
3276 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3277 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3278 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3280 return TEST_SKIPPED;
3282 /* Create KASUMI session */
3283 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3284 tdata->key.data, tdata->key.len,
3285 0, tdata->digest.len,
3286 RTE_CRYPTO_AUTH_OP_GENERATE,
3287 RTE_CRYPTO_AUTH_KASUMI_F9);
3291 /* alloc mbuf and set payload */
3292 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3294 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3295 rte_pktmbuf_tailroom(ut_params->ibuf));
3297 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3298 /* Append data which is padded to a multiple of */
3299 /* the algorithms block size */
3300 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3301 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3303 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3305 /* Create KASUMI operation */
3306 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3308 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3309 tdata->plaintext.len,
3314 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3315 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3317 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3318 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3319 ut_params->op, 0, 1, 1, 0);
3321 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3324 ut_params->obuf = ut_params->op->sym->m_src;
3325 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3326 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3327 + plaintext_pad_len;
3330 TEST_ASSERT_BUFFERS_ARE_EQUAL(
3333 DIGEST_BYTE_LENGTH_KASUMI_F9,
3334 "KASUMI Generated auth tag not as expected");
3340 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3342 struct crypto_testsuite_params *ts_params = &testsuite_params;
3343 struct crypto_unittest_params *ut_params = &unittest_params;
3346 unsigned plaintext_pad_len;
3347 unsigned plaintext_len;
3349 struct rte_cryptodev_info dev_info;
3351 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3352 uint64_t feat_flags = dev_info.feature_flags;
3354 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3355 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3356 printf("Device doesn't support RAW data-path APIs.\n");
3357 return TEST_SKIPPED;
3360 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3361 return TEST_SKIPPED;
3363 /* Verify the capabilities */
3364 struct rte_cryptodev_sym_capability_idx cap_idx;
3365 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3366 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3367 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3369 return TEST_SKIPPED;
3371 /* Create KASUMI session */
3372 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3373 tdata->key.data, tdata->key.len,
3374 0, tdata->digest.len,
3375 RTE_CRYPTO_AUTH_OP_VERIFY,
3376 RTE_CRYPTO_AUTH_KASUMI_F9);
3379 /* alloc mbuf and set payload */
3380 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3382 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3383 rte_pktmbuf_tailroom(ut_params->ibuf));
3385 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3386 /* Append data which is padded to a multiple */
3387 /* of the algorithms block size */
3388 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3389 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3391 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3393 /* Create KASUMI operation */
3394 retval = create_wireless_algo_hash_operation(tdata->digest.data,
3398 RTE_CRYPTO_AUTH_OP_VERIFY,
3399 tdata->plaintext.len,
3404 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3405 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3406 ut_params->op, 0, 1, 1, 0);
3408 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3410 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3411 ut_params->obuf = ut_params->op->sym->m_src;
3412 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3413 + plaintext_pad_len;
3416 if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3425 test_snow3g_hash_generate_test_case_1(void)
3427 return test_snow3g_authentication(&snow3g_hash_test_case_1);
3431 test_snow3g_hash_generate_test_case_2(void)
3433 return test_snow3g_authentication(&snow3g_hash_test_case_2);
3437 test_snow3g_hash_generate_test_case_3(void)
3439 return test_snow3g_authentication(&snow3g_hash_test_case_3);
3443 test_snow3g_hash_generate_test_case_4(void)
3445 return test_snow3g_authentication(&snow3g_hash_test_case_4);
3449 test_snow3g_hash_generate_test_case_5(void)
3451 return test_snow3g_authentication(&snow3g_hash_test_case_5);
3455 test_snow3g_hash_generate_test_case_6(void)
3457 return test_snow3g_authentication(&snow3g_hash_test_case_6);
3461 test_snow3g_hash_verify_test_case_1(void)
3463 return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3468 test_snow3g_hash_verify_test_case_2(void)
3470 return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3474 test_snow3g_hash_verify_test_case_3(void)
3476 return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3480 test_snow3g_hash_verify_test_case_4(void)
3482 return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3486 test_snow3g_hash_verify_test_case_5(void)
3488 return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3492 test_snow3g_hash_verify_test_case_6(void)
3494 return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3498 test_kasumi_hash_generate_test_case_1(void)
3500 return test_kasumi_authentication(&kasumi_hash_test_case_1);
3504 test_kasumi_hash_generate_test_case_2(void)
3506 return test_kasumi_authentication(&kasumi_hash_test_case_2);
3510 test_kasumi_hash_generate_test_case_3(void)
3512 return test_kasumi_authentication(&kasumi_hash_test_case_3);
3516 test_kasumi_hash_generate_test_case_4(void)
3518 return test_kasumi_authentication(&kasumi_hash_test_case_4);
3522 test_kasumi_hash_generate_test_case_5(void)
3524 return test_kasumi_authentication(&kasumi_hash_test_case_5);
3528 test_kasumi_hash_generate_test_case_6(void)
3530 return test_kasumi_authentication(&kasumi_hash_test_case_6);
3534 test_kasumi_hash_verify_test_case_1(void)
3536 return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3540 test_kasumi_hash_verify_test_case_2(void)
3542 return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3546 test_kasumi_hash_verify_test_case_3(void)
3548 return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3552 test_kasumi_hash_verify_test_case_4(void)
3554 return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3558 test_kasumi_hash_verify_test_case_5(void)
3560 return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3564 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3566 struct crypto_testsuite_params *ts_params = &testsuite_params;
3567 struct crypto_unittest_params *ut_params = &unittest_params;
3570 uint8_t *plaintext, *ciphertext;
3571 unsigned plaintext_pad_len;
3572 unsigned plaintext_len;
3573 struct rte_cryptodev_info dev_info;
3575 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3576 uint64_t feat_flags = dev_info.feature_flags;
3578 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3579 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3580 printf("Device doesn't support RAW data-path APIs.\n");
3581 return TEST_SKIPPED;
3584 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3585 return TEST_SKIPPED;
3587 /* Verify the capabilities */
3588 struct rte_cryptodev_sym_capability_idx cap_idx;
3589 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3590 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3591 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3593 return TEST_SKIPPED;
3595 /* Create KASUMI session */
3596 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3597 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3598 RTE_CRYPTO_CIPHER_KASUMI_F8,
3599 tdata->key.data, tdata->key.len,
3600 tdata->cipher_iv.len);
3604 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3606 /* Clear mbuf payload */
3607 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3608 rte_pktmbuf_tailroom(ut_params->ibuf));
3610 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3611 /* Append data which is padded to a multiple */
3612 /* of the algorithms block size */
3613 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3614 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3616 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3618 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3620 /* Create KASUMI operation */
3621 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3622 tdata->cipher_iv.len,
3623 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3624 tdata->validCipherOffsetInBits.len);
3628 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3629 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3630 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3632 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3634 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3636 ut_params->obuf = ut_params->op->sym->m_dst;
3637 if (ut_params->obuf)
3638 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3640 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3642 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3644 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3645 (tdata->validCipherOffsetInBits.len >> 3);
3647 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3649 reference_ciphertext,
3650 tdata->validCipherLenInBits.len,
3651 "KASUMI Ciphertext data not as expected");
3656 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3658 struct crypto_testsuite_params *ts_params = &testsuite_params;
3659 struct crypto_unittest_params *ut_params = &unittest_params;
3663 unsigned int plaintext_pad_len;
3664 unsigned int plaintext_len;
3666 uint8_t buffer[10000];
3667 const uint8_t *ciphertext;
3669 struct rte_cryptodev_info dev_info;
3671 /* Verify the capabilities */
3672 struct rte_cryptodev_sym_capability_idx cap_idx;
3673 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3674 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3675 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3677 return TEST_SKIPPED;
3679 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3681 uint64_t feat_flags = dev_info.feature_flags;
3683 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3684 printf("Device doesn't support in-place scatter-gather. "
3686 return TEST_SKIPPED;
3689 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3690 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3691 printf("Device doesn't support RAW data-path APIs.\n");
3692 return TEST_SKIPPED;
3695 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3696 return TEST_SKIPPED;
3698 /* Create KASUMI session */
3699 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3700 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3701 RTE_CRYPTO_CIPHER_KASUMI_F8,
3702 tdata->key.data, tdata->key.len,
3703 tdata->cipher_iv.len);
3707 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3710 /* Append data which is padded to a multiple */
3711 /* of the algorithms block size */
3712 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3714 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3715 plaintext_pad_len, 10, 0);
3717 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3719 /* Create KASUMI operation */
3720 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3721 tdata->cipher_iv.len,
3722 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3723 tdata->validCipherOffsetInBits.len);
3727 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3728 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3729 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3731 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3733 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3735 ut_params->obuf = ut_params->op->sym->m_dst;
3737 if (ut_params->obuf)
3738 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3739 plaintext_len, buffer);
3741 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3742 tdata->validCipherOffsetInBits.len >> 3,
3743 plaintext_len, buffer);
3746 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3748 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3749 (tdata->validCipherOffsetInBits.len >> 3);
3751 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3753 reference_ciphertext,
3754 tdata->validCipherLenInBits.len,
3755 "KASUMI Ciphertext data not as expected");
3760 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3762 struct crypto_testsuite_params *ts_params = &testsuite_params;
3763 struct crypto_unittest_params *ut_params = &unittest_params;
3766 uint8_t *plaintext, *ciphertext;
3767 unsigned plaintext_pad_len;
3768 unsigned plaintext_len;
3770 /* Verify the capabilities */
3771 struct rte_cryptodev_sym_capability_idx cap_idx;
3772 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3773 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3774 /* Data-path service does not support OOP */
3775 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3777 return TEST_SKIPPED;
3779 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3780 return TEST_SKIPPED;
3782 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3783 return TEST_SKIPPED;
3785 /* Create KASUMI session */
3786 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3787 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3788 RTE_CRYPTO_CIPHER_KASUMI_F8,
3789 tdata->key.data, tdata->key.len,
3790 tdata->cipher_iv.len);
3794 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3795 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3797 /* Clear mbuf payload */
3798 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3799 rte_pktmbuf_tailroom(ut_params->ibuf));
3801 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3802 /* Append data which is padded to a multiple */
3803 /* of the algorithms block size */
3804 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3805 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3807 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3808 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3810 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3812 /* Create KASUMI operation */
3813 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3814 tdata->cipher_iv.len,
3815 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3816 tdata->validCipherOffsetInBits.len);
3820 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3822 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3824 ut_params->obuf = ut_params->op->sym->m_dst;
3825 if (ut_params->obuf)
3826 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3828 ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3830 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3832 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3833 (tdata->validCipherOffsetInBits.len >> 3);
3835 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3837 reference_ciphertext,
3838 tdata->validCipherLenInBits.len,
3839 "KASUMI Ciphertext data not as expected");
3844 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3846 struct crypto_testsuite_params *ts_params = &testsuite_params;
3847 struct crypto_unittest_params *ut_params = &unittest_params;
3850 unsigned int plaintext_pad_len;
3851 unsigned int plaintext_len;
3853 const uint8_t *ciphertext;
3854 uint8_t buffer[2048];
3856 struct rte_cryptodev_info dev_info;
3858 /* Verify the capabilities */
3859 struct rte_cryptodev_sym_capability_idx cap_idx;
3860 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3861 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3862 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3864 return TEST_SKIPPED;
3866 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3867 return TEST_SKIPPED;
3869 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3870 return TEST_SKIPPED;
3872 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3874 uint64_t feat_flags = dev_info.feature_flags;
3875 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3876 printf("Device doesn't support out-of-place scatter-gather "
3877 "in both input and output mbufs. "
3879 return TEST_SKIPPED;
3882 /* Create KASUMI session */
3883 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3884 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3885 RTE_CRYPTO_CIPHER_KASUMI_F8,
3886 tdata->key.data, tdata->key.len,
3887 tdata->cipher_iv.len);
3891 plaintext_len = ceil_byte_length(tdata->plaintext.len);
3892 /* Append data which is padded to a multiple */
3893 /* of the algorithms block size */
3894 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3896 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3897 plaintext_pad_len, 10, 0);
3898 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3899 plaintext_pad_len, 3, 0);
3901 /* Append data which is padded to a multiple */
3902 /* of the algorithms block size */
3903 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3905 /* Create KASUMI operation */
3906 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3907 tdata->cipher_iv.len,
3908 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3909 tdata->validCipherOffsetInBits.len);
3913 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3915 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3917 ut_params->obuf = ut_params->op->sym->m_dst;
3918 if (ut_params->obuf)
3919 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3920 plaintext_pad_len, buffer);
3922 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3923 tdata->validCipherOffsetInBits.len >> 3,
3924 plaintext_pad_len, buffer);
3926 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3927 (tdata->validCipherOffsetInBits.len >> 3);
3929 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3931 reference_ciphertext,
3932 tdata->validCipherLenInBits.len,
3933 "KASUMI Ciphertext data not as expected");
3939 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3941 struct crypto_testsuite_params *ts_params = &testsuite_params;
3942 struct crypto_unittest_params *ut_params = &unittest_params;
3945 uint8_t *ciphertext, *plaintext;
3946 unsigned ciphertext_pad_len;
3947 unsigned ciphertext_len;
3949 /* Verify the capabilities */
3950 struct rte_cryptodev_sym_capability_idx cap_idx;
3951 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3952 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3953 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3955 return TEST_SKIPPED;
3957 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3958 return TEST_SKIPPED;
3960 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3961 return TEST_SKIPPED;
3963 /* Create KASUMI session */
3964 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3965 RTE_CRYPTO_CIPHER_OP_DECRYPT,
3966 RTE_CRYPTO_CIPHER_KASUMI_F8,
3967 tdata->key.data, tdata->key.len,
3968 tdata->cipher_iv.len);
3972 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3973 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3975 /* Clear mbuf payload */
3976 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3977 rte_pktmbuf_tailroom(ut_params->ibuf));
3979 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3980 /* Append data which is padded to a multiple */
3981 /* of the algorithms block size */
3982 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3983 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3984 ciphertext_pad_len);
3985 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3986 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3988 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3990 /* Create KASUMI operation */
3991 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3992 tdata->cipher_iv.len,
3993 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3994 tdata->validCipherOffsetInBits.len);
3998 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4000 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4002 ut_params->obuf = ut_params->op->sym->m_dst;
4003 if (ut_params->obuf)
4004 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4006 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4008 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4010 const uint8_t *reference_plaintext = tdata->plaintext.data +
4011 (tdata->validCipherOffsetInBits.len >> 3);
4013 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4015 reference_plaintext,
4016 tdata->validCipherLenInBits.len,
4017 "KASUMI Plaintext data not as expected");
4022 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4024 struct crypto_testsuite_params *ts_params = &testsuite_params;
4025 struct crypto_unittest_params *ut_params = &unittest_params;
4028 uint8_t *ciphertext, *plaintext;
4029 unsigned ciphertext_pad_len;
4030 unsigned ciphertext_len;
4031 struct rte_cryptodev_info dev_info;
4033 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4034 uint64_t feat_flags = dev_info.feature_flags;
4036 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4037 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4038 printf("Device doesn't support RAW data-path APIs.\n");
4039 return TEST_SKIPPED;
4042 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4043 return TEST_SKIPPED;
4045 /* Verify the capabilities */
4046 struct rte_cryptodev_sym_capability_idx cap_idx;
4047 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4048 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4049 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4051 return TEST_SKIPPED;
4053 /* Create KASUMI session */
4054 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4055 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4056 RTE_CRYPTO_CIPHER_KASUMI_F8,
4057 tdata->key.data, tdata->key.len,
4058 tdata->cipher_iv.len);
4062 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4064 /* Clear mbuf payload */
4065 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4066 rte_pktmbuf_tailroom(ut_params->ibuf));
4068 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4069 /* Append data which is padded to a multiple */
4070 /* of the algorithms block size */
4071 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4072 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4073 ciphertext_pad_len);
4074 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4076 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4078 /* Create KASUMI operation */
4079 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4080 tdata->cipher_iv.len,
4081 tdata->ciphertext.len,
4082 tdata->validCipherOffsetInBits.len);
4086 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4087 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4088 ut_params->op, 1, 0, 1, 0);
4090 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4092 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4094 ut_params->obuf = ut_params->op->sym->m_dst;
4095 if (ut_params->obuf)
4096 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4098 plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4100 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4102 const uint8_t *reference_plaintext = tdata->plaintext.data +
4103 (tdata->validCipherOffsetInBits.len >> 3);
4105 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4107 reference_plaintext,
4108 tdata->validCipherLenInBits.len,
4109 "KASUMI Plaintext data not as expected");
4114 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4116 struct crypto_testsuite_params *ts_params = &testsuite_params;
4117 struct crypto_unittest_params *ut_params = &unittest_params;
4120 uint8_t *plaintext, *ciphertext;
4121 unsigned plaintext_pad_len;
4122 unsigned plaintext_len;
4123 struct rte_cryptodev_info dev_info;
4125 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4126 uint64_t feat_flags = dev_info.feature_flags;
4128 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4129 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4130 printf("Device doesn't support RAW data-path APIs.\n");
4131 return TEST_SKIPPED;
4134 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4135 return TEST_SKIPPED;
4137 /* Verify the capabilities */
4138 struct rte_cryptodev_sym_capability_idx cap_idx;
4139 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4140 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4141 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4143 return TEST_SKIPPED;
4145 /* Create SNOW 3G session */
4146 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4147 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4148 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4149 tdata->key.data, tdata->key.len,
4150 tdata->cipher_iv.len);
4154 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4156 /* Clear mbuf payload */
4157 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4158 rte_pktmbuf_tailroom(ut_params->ibuf));
4160 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4161 /* Append data which is padded to a multiple of */
4162 /* the algorithms block size */
4163 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4164 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4166 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4168 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4170 /* Create SNOW 3G operation */
4171 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4172 tdata->cipher_iv.len,
4173 tdata->validCipherLenInBits.len,
4178 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4179 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4180 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4182 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4184 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4186 ut_params->obuf = ut_params->op->sym->m_dst;
4187 if (ut_params->obuf)
4188 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4190 ciphertext = plaintext;
4192 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4195 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4197 tdata->ciphertext.data,
4198 tdata->validDataLenInBits.len,
4199 "SNOW 3G Ciphertext data not as expected");
4205 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4207 struct crypto_testsuite_params *ts_params = &testsuite_params;
4208 struct crypto_unittest_params *ut_params = &unittest_params;
4209 uint8_t *plaintext, *ciphertext;
4212 unsigned plaintext_pad_len;
4213 unsigned plaintext_len;
4214 struct rte_cryptodev_info dev_info;
4216 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4217 uint64_t feat_flags = dev_info.feature_flags;
4219 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4220 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4221 printf("Device does not support RAW data-path APIs.\n");
4225 /* Verify the capabilities */
4226 struct rte_cryptodev_sym_capability_idx cap_idx;
4227 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4228 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4229 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4231 return TEST_SKIPPED;
4233 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4234 return TEST_SKIPPED;
4236 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4237 return TEST_SKIPPED;
4239 /* Create SNOW 3G session */
4240 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4241 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4242 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4243 tdata->key.data, tdata->key.len,
4244 tdata->cipher_iv.len);
4248 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4249 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4251 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4252 "Failed to allocate input buffer in mempool");
4253 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4254 "Failed to allocate output buffer in mempool");
4256 /* Clear mbuf payload */
4257 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4258 rte_pktmbuf_tailroom(ut_params->ibuf));
4260 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4261 /* Append data which is padded to a multiple of */
4262 /* the algorithms block size */
4263 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4264 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4266 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4267 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4269 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4271 /* Create SNOW 3G operation */
4272 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4273 tdata->cipher_iv.len,
4274 tdata->validCipherLenInBits.len,
4279 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4280 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4281 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4283 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4285 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4287 ut_params->obuf = ut_params->op->sym->m_dst;
4288 if (ut_params->obuf)
4289 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4291 ciphertext = plaintext;
4293 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4296 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4298 tdata->ciphertext.data,
4299 tdata->validDataLenInBits.len,
4300 "SNOW 3G Ciphertext data not as expected");
4305 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4307 struct crypto_testsuite_params *ts_params = &testsuite_params;
4308 struct crypto_unittest_params *ut_params = &unittest_params;
4311 unsigned int plaintext_pad_len;
4312 unsigned int plaintext_len;
4313 uint8_t buffer[10000];
4314 const uint8_t *ciphertext;
4316 struct rte_cryptodev_info dev_info;
4318 /* Verify the capabilities */
4319 struct rte_cryptodev_sym_capability_idx cap_idx;
4320 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4321 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4322 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4324 return TEST_SKIPPED;
4326 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4327 return TEST_SKIPPED;
4329 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4330 return TEST_SKIPPED;
4332 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4334 uint64_t feat_flags = dev_info.feature_flags;
4336 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4337 printf("Device doesn't support out-of-place scatter-gather "
4338 "in both input and output mbufs. "
4340 return TEST_SKIPPED;
4343 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4344 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4345 printf("Device does not support RAW data-path APIs.\n");
4349 /* Create SNOW 3G session */
4350 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4351 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4352 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4353 tdata->key.data, tdata->key.len,
4354 tdata->cipher_iv.len);
4358 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4359 /* Append data which is padded to a multiple of */
4360 /* the algorithms block size */
4361 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4363 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4364 plaintext_pad_len, 10, 0);
4365 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4366 plaintext_pad_len, 3, 0);
4368 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4369 "Failed to allocate input buffer in mempool");
4370 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4371 "Failed to allocate output buffer in mempool");
4373 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4375 /* Create SNOW 3G operation */
4376 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4377 tdata->cipher_iv.len,
4378 tdata->validCipherLenInBits.len,
4383 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4384 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4385 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4387 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4389 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4391 ut_params->obuf = ut_params->op->sym->m_dst;
4392 if (ut_params->obuf)
4393 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4394 plaintext_len, buffer);
4396 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4397 plaintext_len, buffer);
4399 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4402 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4404 tdata->ciphertext.data,
4405 tdata->validDataLenInBits.len,
4406 "SNOW 3G Ciphertext data not as expected");
4411 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4413 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4415 uint8_t curr_byte, prev_byte;
4416 uint32_t length_in_bytes = ceil_byte_length(length + offset);
4417 uint8_t lower_byte_mask = (1 << offset) - 1;
4420 prev_byte = buffer[0];
4421 buffer[0] >>= offset;
4423 for (i = 1; i < length_in_bytes; i++) {
4424 curr_byte = buffer[i];
4425 buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4426 (curr_byte >> offset);
4427 prev_byte = curr_byte;
4432 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4434 struct crypto_testsuite_params *ts_params = &testsuite_params;
4435 struct crypto_unittest_params *ut_params = &unittest_params;
4436 uint8_t *plaintext, *ciphertext;
4438 uint32_t plaintext_len;
4439 uint32_t plaintext_pad_len;
4440 uint8_t extra_offset = 4;
4441 uint8_t *expected_ciphertext_shifted;
4442 struct rte_cryptodev_info dev_info;
4444 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4445 uint64_t feat_flags = dev_info.feature_flags;
4447 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4448 ((tdata->validDataLenInBits.len % 8) != 0)) {
4449 printf("Device doesn't support NON-Byte Aligned Data.\n");
4450 return TEST_SKIPPED;
4453 /* Verify the capabilities */
4454 struct rte_cryptodev_sym_capability_idx cap_idx;
4455 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4456 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4457 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4459 return TEST_SKIPPED;
4461 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4462 return TEST_SKIPPED;
4464 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4465 return TEST_SKIPPED;
4467 /* Create SNOW 3G session */
4468 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4469 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4470 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4471 tdata->key.data, tdata->key.len,
4472 tdata->cipher_iv.len);
4476 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4477 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4479 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4480 "Failed to allocate input buffer in mempool");
4481 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4482 "Failed to allocate output buffer in mempool");
4484 /* Clear mbuf payload */
4485 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4486 rte_pktmbuf_tailroom(ut_params->ibuf));
4488 plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4490 * Append data which is padded to a
4491 * multiple of the algorithms block size
4493 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4495 plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4498 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4500 memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4501 buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4503 #ifdef RTE_APP_TEST_DEBUG
4504 rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4506 /* Create SNOW 3G operation */
4507 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4508 tdata->cipher_iv.len,
4509 tdata->validCipherLenInBits.len,
4514 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4515 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4516 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4518 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4520 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4522 ut_params->obuf = ut_params->op->sym->m_dst;
4523 if (ut_params->obuf)
4524 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4526 ciphertext = plaintext;
4528 #ifdef RTE_APP_TEST_DEBUG
4529 rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4532 expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4534 TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4535 "failed to reserve memory for ciphertext shifted\n");
4537 memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4538 ceil_byte_length(tdata->ciphertext.len));
4539 buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4542 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4544 expected_ciphertext_shifted,
4545 tdata->validDataLenInBits.len,
4547 "SNOW 3G Ciphertext data not as expected");
4551 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4553 struct crypto_testsuite_params *ts_params = &testsuite_params;
4554 struct crypto_unittest_params *ut_params = &unittest_params;
4558 uint8_t *plaintext, *ciphertext;
4559 unsigned ciphertext_pad_len;
4560 unsigned ciphertext_len;
4561 struct rte_cryptodev_info dev_info;
4563 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4564 uint64_t feat_flags = dev_info.feature_flags;
4566 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4567 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4568 printf("Device doesn't support RAW data-path APIs.\n");
4569 return TEST_SKIPPED;
4572 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4573 return TEST_SKIPPED;
4575 /* Verify the capabilities */
4576 struct rte_cryptodev_sym_capability_idx cap_idx;
4577 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4578 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4579 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4581 return TEST_SKIPPED;
4583 /* Create SNOW 3G session */
4584 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4585 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4586 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4587 tdata->key.data, tdata->key.len,
4588 tdata->cipher_iv.len);
4592 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4594 /* Clear mbuf payload */
4595 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4596 rte_pktmbuf_tailroom(ut_params->ibuf));
4598 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4599 /* Append data which is padded to a multiple of */
4600 /* the algorithms block size */
4601 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4602 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4603 ciphertext_pad_len);
4604 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4606 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4608 /* Create SNOW 3G operation */
4609 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4610 tdata->cipher_iv.len,
4611 tdata->validCipherLenInBits.len,
4612 tdata->cipher.offset_bits);
4616 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4617 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4618 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4620 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4622 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4623 ut_params->obuf = ut_params->op->sym->m_dst;
4624 if (ut_params->obuf)
4625 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4627 plaintext = ciphertext;
4629 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4632 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4633 tdata->plaintext.data,
4634 tdata->validDataLenInBits.len,
4635 "SNOW 3G Plaintext data not as expected");
4639 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4641 struct crypto_testsuite_params *ts_params = &testsuite_params;
4642 struct crypto_unittest_params *ut_params = &unittest_params;
4646 uint8_t *plaintext, *ciphertext;
4647 unsigned ciphertext_pad_len;
4648 unsigned ciphertext_len;
4649 struct rte_cryptodev_info dev_info;
4651 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4652 uint64_t feat_flags = dev_info.feature_flags;
4654 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4655 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4656 printf("Device does not support RAW data-path APIs.\n");
4659 /* Verify the capabilities */
4660 struct rte_cryptodev_sym_capability_idx cap_idx;
4661 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4662 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4663 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4665 return TEST_SKIPPED;
4667 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4668 return TEST_SKIPPED;
4670 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4671 return TEST_SKIPPED;
4673 /* Create SNOW 3G session */
4674 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4675 RTE_CRYPTO_CIPHER_OP_DECRYPT,
4676 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4677 tdata->key.data, tdata->key.len,
4678 tdata->cipher_iv.len);
4682 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4683 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4685 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4686 "Failed to allocate input buffer");
4687 TEST_ASSERT_NOT_NULL(ut_params->obuf,
4688 "Failed to allocate output buffer");
4690 /* Clear mbuf payload */
4691 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4692 rte_pktmbuf_tailroom(ut_params->ibuf));
4694 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4695 rte_pktmbuf_tailroom(ut_params->obuf));
4697 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4698 /* Append data which is padded to a multiple of */
4699 /* the algorithms block size */
4700 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4701 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4702 ciphertext_pad_len);
4703 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4704 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4706 debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4708 /* Create SNOW 3G operation */
4709 retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4710 tdata->cipher_iv.len,
4711 tdata->validCipherLenInBits.len,
4716 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4717 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4718 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4720 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4722 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4723 ut_params->obuf = ut_params->op->sym->m_dst;
4724 if (ut_params->obuf)
4725 plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4727 plaintext = ciphertext;
4729 debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4732 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4733 tdata->plaintext.data,
4734 tdata->validDataLenInBits.len,
4735 "SNOW 3G Plaintext data not as expected");
4740 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4742 struct crypto_testsuite_params *ts_params = &testsuite_params;
4743 struct crypto_unittest_params *ut_params = &unittest_params;
4747 uint8_t *plaintext, *ciphertext;
4748 unsigned int plaintext_pad_len;
4749 unsigned int plaintext_len;
4751 struct rte_cryptodev_info dev_info;
4752 struct rte_cryptodev_sym_capability_idx cap_idx;
4754 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4755 uint64_t feat_flags = dev_info.feature_flags;
4757 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4758 ((tdata->validAuthLenInBits.len % 8 != 0) ||
4759 (tdata->validDataLenInBits.len % 8 != 0))) {
4760 printf("Device doesn't support NON-Byte Aligned Data.\n");
4761 return TEST_SKIPPED;
4764 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4765 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4766 printf("Device doesn't support RAW data-path APIs.\n");
4767 return TEST_SKIPPED;
4770 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4771 return TEST_SKIPPED;
4773 /* Check if device supports ZUC EEA3 */
4774 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4775 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4777 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4779 return TEST_SKIPPED;
4781 /* Check if device supports ZUC EIA3 */
4782 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4783 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4785 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4787 return TEST_SKIPPED;
4789 /* Create ZUC session */
4790 retval = create_zuc_cipher_auth_encrypt_generate_session(
4791 ts_params->valid_devs[0],
4795 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4797 /* clear mbuf payload */
4798 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4799 rte_pktmbuf_tailroom(ut_params->ibuf));
4801 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4802 /* Append data which is padded to a multiple of */
4803 /* the algorithms block size */
4804 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4805 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4807 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4809 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4811 /* Create ZUC operation */
4812 retval = create_zuc_cipher_hash_generate_operation(tdata);
4816 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4817 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4818 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4820 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4822 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4823 ut_params->obuf = ut_params->op->sym->m_src;
4824 if (ut_params->obuf)
4825 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4827 ciphertext = plaintext;
4829 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4831 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4833 tdata->ciphertext.data,
4834 tdata->validDataLenInBits.len,
4835 "ZUC Ciphertext data not as expected");
4837 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4838 + plaintext_pad_len;
4841 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4845 "ZUC Generated auth tag not as expected");
4850 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4852 struct crypto_testsuite_params *ts_params = &testsuite_params;
4853 struct crypto_unittest_params *ut_params = &unittest_params;
4857 uint8_t *plaintext, *ciphertext;
4858 unsigned plaintext_pad_len;
4859 unsigned plaintext_len;
4860 struct rte_cryptodev_info dev_info;
4862 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4863 uint64_t feat_flags = dev_info.feature_flags;
4865 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4866 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4867 printf("Device doesn't support RAW data-path APIs.\n");
4868 return TEST_SKIPPED;
4871 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4872 return TEST_SKIPPED;
4874 /* Verify the capabilities */
4875 struct rte_cryptodev_sym_capability_idx cap_idx;
4876 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4877 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4878 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4880 return TEST_SKIPPED;
4881 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4882 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4883 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4885 return TEST_SKIPPED;
4887 /* Create SNOW 3G session */
4888 retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4889 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4890 RTE_CRYPTO_AUTH_OP_GENERATE,
4891 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4892 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4893 tdata->key.data, tdata->key.len,
4894 tdata->auth_iv.len, tdata->digest.len,
4895 tdata->cipher_iv.len);
4898 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4900 /* clear mbuf payload */
4901 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4902 rte_pktmbuf_tailroom(ut_params->ibuf));
4904 plaintext_len = ceil_byte_length(tdata->plaintext.len);
4905 /* Append data which is padded to a multiple of */
4906 /* the algorithms block size */
4907 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4908 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4910 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4912 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4914 /* Create SNOW 3G operation */
4915 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4916 tdata->digest.len, tdata->auth_iv.data,
4918 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4919 tdata->cipher_iv.data, tdata->cipher_iv.len,
4920 tdata->validCipherLenInBits.len,
4922 tdata->validAuthLenInBits.len,
4928 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4929 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4930 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4932 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4934 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4935 ut_params->obuf = ut_params->op->sym->m_src;
4936 if (ut_params->obuf)
4937 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4939 ciphertext = plaintext;
4941 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4943 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4945 tdata->ciphertext.data,
4946 tdata->validDataLenInBits.len,
4947 "SNOW 3G Ciphertext data not as expected");
4949 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4950 + plaintext_pad_len;
4953 TEST_ASSERT_BUFFERS_ARE_EQUAL(
4956 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4957 "SNOW 3G Generated auth tag not as expected");
4962 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4963 uint8_t op_mode, uint8_t verify)
4965 struct crypto_testsuite_params *ts_params = &testsuite_params;
4966 struct crypto_unittest_params *ut_params = &unittest_params;
4970 uint8_t *plaintext = NULL, *ciphertext = NULL;
4971 unsigned int plaintext_pad_len;
4972 unsigned int plaintext_len;
4973 unsigned int ciphertext_pad_len;
4974 unsigned int ciphertext_len;
4976 struct rte_cryptodev_info dev_info;
4978 /* Verify the capabilities */
4979 struct rte_cryptodev_sym_capability_idx cap_idx;
4980 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4981 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4982 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4984 return TEST_SKIPPED;
4985 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4986 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4987 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4989 return TEST_SKIPPED;
4991 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4992 return TEST_SKIPPED;
4994 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4996 uint64_t feat_flags = dev_info.feature_flags;
4998 if (op_mode == OUT_OF_PLACE) {
4999 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5000 printf("Device doesn't support digest encrypted.\n");
5001 return TEST_SKIPPED;
5003 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5004 return TEST_SKIPPED;
5007 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5008 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5009 printf("Device doesn't support RAW data-path APIs.\n");
5010 return TEST_SKIPPED;
5013 /* Create SNOW 3G session */
5014 retval = create_wireless_algo_auth_cipher_session(
5015 ts_params->valid_devs[0],
5016 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5017 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5018 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5019 : RTE_CRYPTO_AUTH_OP_GENERATE),
5020 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5021 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5022 tdata->key.data, tdata->key.len,
5023 tdata->auth_iv.len, tdata->digest.len,
5024 tdata->cipher_iv.len);
5028 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5029 if (op_mode == OUT_OF_PLACE)
5030 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5032 /* clear mbuf payload */
5033 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5034 rte_pktmbuf_tailroom(ut_params->ibuf));
5035 if (op_mode == OUT_OF_PLACE)
5036 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5037 rte_pktmbuf_tailroom(ut_params->obuf));
5039 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5040 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5041 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5042 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5045 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5046 ciphertext_pad_len);
5047 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5048 if (op_mode == OUT_OF_PLACE)
5049 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5050 debug_hexdump(stdout, "ciphertext:", ciphertext,
5053 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5055 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5056 if (op_mode == OUT_OF_PLACE)
5057 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5058 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5061 /* Create SNOW 3G operation */
5062 retval = create_wireless_algo_auth_cipher_operation(
5063 tdata->digest.data, tdata->digest.len,
5064 tdata->cipher_iv.data, tdata->cipher_iv.len,
5065 tdata->auth_iv.data, tdata->auth_iv.len,
5066 (tdata->digest.offset_bytes == 0 ?
5067 (verify ? ciphertext_pad_len : plaintext_pad_len)
5068 : tdata->digest.offset_bytes),
5069 tdata->validCipherLenInBits.len,
5070 tdata->cipher.offset_bits,
5071 tdata->validAuthLenInBits.len,
5072 tdata->auth.offset_bits,
5073 op_mode, 0, verify);
5078 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5079 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5080 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5082 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5085 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5087 ut_params->obuf = (op_mode == IN_PLACE ?
5088 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5091 if (ut_params->obuf)
5092 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5095 plaintext = ciphertext +
5096 (tdata->cipher.offset_bits >> 3);
5098 debug_hexdump(stdout, "plaintext:", plaintext,
5099 (tdata->plaintext.len >> 3) - tdata->digest.len);
5100 debug_hexdump(stdout, "plaintext expected:",
5101 tdata->plaintext.data,
5102 (tdata->plaintext.len >> 3) - tdata->digest.len);
5104 if (ut_params->obuf)
5105 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5108 ciphertext = plaintext;
5110 debug_hexdump(stdout, "ciphertext:", ciphertext,
5112 debug_hexdump(stdout, "ciphertext expected:",
5113 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5115 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5116 + (tdata->digest.offset_bytes == 0 ?
5117 plaintext_pad_len : tdata->digest.offset_bytes);
5119 debug_hexdump(stdout, "digest:", ut_params->digest,
5121 debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5127 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5129 tdata->plaintext.data,
5130 (tdata->plaintext.len - tdata->cipher.offset_bits -
5131 (tdata->digest.len << 3)),
5132 tdata->cipher.offset_bits,
5133 "SNOW 3G Plaintext data not as expected");
5135 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5137 tdata->ciphertext.data,
5138 (tdata->validDataLenInBits.len -
5139 tdata->cipher.offset_bits),
5140 tdata->cipher.offset_bits,
5141 "SNOW 3G Ciphertext data not as expected");
5143 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5146 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5147 "SNOW 3G Generated auth tag not as expected");
5153 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5154 uint8_t op_mode, uint8_t verify)
5156 struct crypto_testsuite_params *ts_params = &testsuite_params;
5157 struct crypto_unittest_params *ut_params = &unittest_params;
5161 const uint8_t *plaintext = NULL;
5162 const uint8_t *ciphertext = NULL;
5163 const uint8_t *digest = NULL;
5164 unsigned int plaintext_pad_len;
5165 unsigned int plaintext_len;
5166 unsigned int ciphertext_pad_len;
5167 unsigned int ciphertext_len;
5168 uint8_t buffer[10000];
5169 uint8_t digest_buffer[10000];
5171 struct rte_cryptodev_info dev_info;
5173 /* Verify the capabilities */
5174 struct rte_cryptodev_sym_capability_idx cap_idx;
5175 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5176 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5177 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5179 return TEST_SKIPPED;
5180 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5181 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5182 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5184 return TEST_SKIPPED;
5186 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5187 return TEST_SKIPPED;
5189 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5191 uint64_t feat_flags = dev_info.feature_flags;
5193 if (op_mode == IN_PLACE) {
5194 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5195 printf("Device doesn't support in-place scatter-gather "
5196 "in both input and output mbufs.\n");
5197 return TEST_SKIPPED;
5199 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5200 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5201 printf("Device doesn't support RAW data-path APIs.\n");
5202 return TEST_SKIPPED;
5205 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5206 return TEST_SKIPPED;
5207 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5208 printf("Device doesn't support out-of-place scatter-gather "
5209 "in both input and output mbufs.\n");
5210 return TEST_SKIPPED;
5212 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5213 printf("Device doesn't support digest encrypted.\n");
5214 return TEST_SKIPPED;
5218 /* Create SNOW 3G session */
5219 retval = create_wireless_algo_auth_cipher_session(
5220 ts_params->valid_devs[0],
5221 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5222 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5223 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5224 : RTE_CRYPTO_AUTH_OP_GENERATE),
5225 RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5226 RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5227 tdata->key.data, tdata->key.len,
5228 tdata->auth_iv.len, tdata->digest.len,
5229 tdata->cipher_iv.len);
5234 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5235 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5236 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5237 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5239 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5240 plaintext_pad_len, 15, 0);
5241 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5242 "Failed to allocate input buffer in mempool");
5244 if (op_mode == OUT_OF_PLACE) {
5245 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5246 plaintext_pad_len, 15, 0);
5247 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5248 "Failed to allocate output buffer in mempool");
5252 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5253 tdata->ciphertext.data);
5254 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5255 ciphertext_len, buffer);
5256 debug_hexdump(stdout, "ciphertext:", ciphertext,
5259 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5260 tdata->plaintext.data);
5261 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5262 plaintext_len, buffer);
5263 debug_hexdump(stdout, "plaintext:", plaintext,
5266 memset(buffer, 0, sizeof(buffer));
5268 /* Create SNOW 3G operation */
5269 retval = create_wireless_algo_auth_cipher_operation(
5270 tdata->digest.data, tdata->digest.len,
5271 tdata->cipher_iv.data, tdata->cipher_iv.len,
5272 tdata->auth_iv.data, tdata->auth_iv.len,
5273 (tdata->digest.offset_bytes == 0 ?
5274 (verify ? ciphertext_pad_len : plaintext_pad_len)
5275 : tdata->digest.offset_bytes),
5276 tdata->validCipherLenInBits.len,
5277 tdata->cipher.offset_bits,
5278 tdata->validAuthLenInBits.len,
5279 tdata->auth.offset_bits,
5280 op_mode, 1, verify);
5285 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5286 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5287 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5289 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5292 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5294 ut_params->obuf = (op_mode == IN_PLACE ?
5295 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5298 if (ut_params->obuf)
5299 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5300 plaintext_len, buffer);
5302 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5303 plaintext_len, buffer);
5305 debug_hexdump(stdout, "plaintext:", plaintext,
5306 (tdata->plaintext.len >> 3) - tdata->digest.len);
5307 debug_hexdump(stdout, "plaintext expected:",
5308 tdata->plaintext.data,
5309 (tdata->plaintext.len >> 3) - tdata->digest.len);
5311 if (ut_params->obuf)
5312 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5313 ciphertext_len, buffer);
5315 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5316 ciphertext_len, buffer);
5318 debug_hexdump(stdout, "ciphertext:", ciphertext,
5320 debug_hexdump(stdout, "ciphertext expected:",
5321 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5323 if (ut_params->obuf)
5324 digest = rte_pktmbuf_read(ut_params->obuf,
5325 (tdata->digest.offset_bytes == 0 ?
5326 plaintext_pad_len : tdata->digest.offset_bytes),
5327 tdata->digest.len, digest_buffer);
5329 digest = rte_pktmbuf_read(ut_params->ibuf,
5330 (tdata->digest.offset_bytes == 0 ?
5331 plaintext_pad_len : tdata->digest.offset_bytes),
5332 tdata->digest.len, digest_buffer);
5334 debug_hexdump(stdout, "digest:", digest,
5336 debug_hexdump(stdout, "digest expected:",
5337 tdata->digest.data, tdata->digest.len);
5342 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5344 tdata->plaintext.data,
5345 (tdata->plaintext.len - tdata->cipher.offset_bits -
5346 (tdata->digest.len << 3)),
5347 tdata->cipher.offset_bits,
5348 "SNOW 3G Plaintext data not as expected");
5350 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5352 tdata->ciphertext.data,
5353 (tdata->validDataLenInBits.len -
5354 tdata->cipher.offset_bits),
5355 tdata->cipher.offset_bits,
5356 "SNOW 3G Ciphertext data not as expected");
5358 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5361 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5362 "SNOW 3G Generated auth tag not as expected");
5368 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5369 uint8_t op_mode, uint8_t verify)
5371 struct crypto_testsuite_params *ts_params = &testsuite_params;
5372 struct crypto_unittest_params *ut_params = &unittest_params;
5376 uint8_t *plaintext = NULL, *ciphertext = NULL;
5377 unsigned int plaintext_pad_len;
5378 unsigned int plaintext_len;
5379 unsigned int ciphertext_pad_len;
5380 unsigned int ciphertext_len;
5382 struct rte_cryptodev_info dev_info;
5384 /* Verify the capabilities */
5385 struct rte_cryptodev_sym_capability_idx cap_idx;
5386 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5387 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5388 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5390 return TEST_SKIPPED;
5391 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5392 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5393 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5395 return TEST_SKIPPED;
5397 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5399 uint64_t feat_flags = dev_info.feature_flags;
5401 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5402 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5403 printf("Device doesn't support RAW data-path APIs.\n");
5404 return TEST_SKIPPED;
5407 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5408 return TEST_SKIPPED;
5410 if (op_mode == OUT_OF_PLACE) {
5411 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5412 return TEST_SKIPPED;
5413 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5414 printf("Device doesn't support digest encrypted.\n");
5415 return TEST_SKIPPED;
5419 /* Create KASUMI session */
5420 retval = create_wireless_algo_auth_cipher_session(
5421 ts_params->valid_devs[0],
5422 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5423 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5424 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5425 : RTE_CRYPTO_AUTH_OP_GENERATE),
5426 RTE_CRYPTO_AUTH_KASUMI_F9,
5427 RTE_CRYPTO_CIPHER_KASUMI_F8,
5428 tdata->key.data, tdata->key.len,
5429 0, tdata->digest.len,
5430 tdata->cipher_iv.len);
5435 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5436 if (op_mode == OUT_OF_PLACE)
5437 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5439 /* clear mbuf payload */
5440 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5441 rte_pktmbuf_tailroom(ut_params->ibuf));
5442 if (op_mode == OUT_OF_PLACE)
5443 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5444 rte_pktmbuf_tailroom(ut_params->obuf));
5446 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5447 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5448 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5449 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5452 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5453 ciphertext_pad_len);
5454 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5455 if (op_mode == OUT_OF_PLACE)
5456 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5457 debug_hexdump(stdout, "ciphertext:", ciphertext,
5460 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5462 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5463 if (op_mode == OUT_OF_PLACE)
5464 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5465 debug_hexdump(stdout, "plaintext:", plaintext,
5469 /* Create KASUMI operation */
5470 retval = create_wireless_algo_auth_cipher_operation(
5471 tdata->digest.data, tdata->digest.len,
5472 tdata->cipher_iv.data, tdata->cipher_iv.len,
5474 (tdata->digest.offset_bytes == 0 ?
5475 (verify ? ciphertext_pad_len : plaintext_pad_len)
5476 : tdata->digest.offset_bytes),
5477 tdata->validCipherLenInBits.len,
5478 tdata->validCipherOffsetInBits.len,
5479 tdata->validAuthLenInBits.len,
5481 op_mode, 0, verify);
5486 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5487 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5488 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5490 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5493 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5495 ut_params->obuf = (op_mode == IN_PLACE ?
5496 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5500 if (ut_params->obuf)
5501 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5504 plaintext = ciphertext;
5506 debug_hexdump(stdout, "plaintext:", plaintext,
5507 (tdata->plaintext.len >> 3) - tdata->digest.len);
5508 debug_hexdump(stdout, "plaintext expected:",
5509 tdata->plaintext.data,
5510 (tdata->plaintext.len >> 3) - tdata->digest.len);
5512 if (ut_params->obuf)
5513 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5516 ciphertext = plaintext;
5518 debug_hexdump(stdout, "ciphertext:", ciphertext,
5520 debug_hexdump(stdout, "ciphertext expected:",
5521 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5523 ut_params->digest = rte_pktmbuf_mtod(
5524 ut_params->obuf, uint8_t *) +
5525 (tdata->digest.offset_bytes == 0 ?
5526 plaintext_pad_len : tdata->digest.offset_bytes);
5528 debug_hexdump(stdout, "digest:", ut_params->digest,
5530 debug_hexdump(stdout, "digest expected:",
5531 tdata->digest.data, tdata->digest.len);
5536 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5538 tdata->plaintext.data,
5539 tdata->plaintext.len >> 3,
5540 "KASUMI Plaintext data not as expected");
5542 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5544 tdata->ciphertext.data,
5545 tdata->ciphertext.len >> 3,
5546 "KASUMI Ciphertext data not as expected");
5548 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5551 DIGEST_BYTE_LENGTH_KASUMI_F9,
5552 "KASUMI Generated auth tag not as expected");
5558 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5559 uint8_t op_mode, uint8_t verify)
5561 struct crypto_testsuite_params *ts_params = &testsuite_params;
5562 struct crypto_unittest_params *ut_params = &unittest_params;
5566 const uint8_t *plaintext = NULL;
5567 const uint8_t *ciphertext = NULL;
5568 const uint8_t *digest = NULL;
5569 unsigned int plaintext_pad_len;
5570 unsigned int plaintext_len;
5571 unsigned int ciphertext_pad_len;
5572 unsigned int ciphertext_len;
5573 uint8_t buffer[10000];
5574 uint8_t digest_buffer[10000];
5576 struct rte_cryptodev_info dev_info;
5578 /* Verify the capabilities */
5579 struct rte_cryptodev_sym_capability_idx cap_idx;
5580 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5581 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5582 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5584 return TEST_SKIPPED;
5585 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5586 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5587 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5589 return TEST_SKIPPED;
5591 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5592 return TEST_SKIPPED;
5594 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5596 uint64_t feat_flags = dev_info.feature_flags;
5598 if (op_mode == IN_PLACE) {
5599 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5600 printf("Device doesn't support in-place scatter-gather "
5601 "in both input and output mbufs.\n");
5602 return TEST_SKIPPED;
5604 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5605 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5606 printf("Device doesn't support RAW data-path APIs.\n");
5607 return TEST_SKIPPED;
5610 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5611 return TEST_SKIPPED;
5612 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5613 printf("Device doesn't support out-of-place scatter-gather "
5614 "in both input and output mbufs.\n");
5615 return TEST_SKIPPED;
5617 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5618 printf("Device doesn't support digest encrypted.\n");
5619 return TEST_SKIPPED;
5623 /* Create KASUMI session */
5624 retval = create_wireless_algo_auth_cipher_session(
5625 ts_params->valid_devs[0],
5626 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5627 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5628 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5629 : RTE_CRYPTO_AUTH_OP_GENERATE),
5630 RTE_CRYPTO_AUTH_KASUMI_F9,
5631 RTE_CRYPTO_CIPHER_KASUMI_F8,
5632 tdata->key.data, tdata->key.len,
5633 0, tdata->digest.len,
5634 tdata->cipher_iv.len);
5639 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5640 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5641 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5642 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5644 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5645 plaintext_pad_len, 15, 0);
5646 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5647 "Failed to allocate input buffer in mempool");
5649 if (op_mode == OUT_OF_PLACE) {
5650 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5651 plaintext_pad_len, 15, 0);
5652 TEST_ASSERT_NOT_NULL(ut_params->obuf,
5653 "Failed to allocate output buffer in mempool");
5657 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5658 tdata->ciphertext.data);
5659 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5660 ciphertext_len, buffer);
5661 debug_hexdump(stdout, "ciphertext:", ciphertext,
5664 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5665 tdata->plaintext.data);
5666 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5667 plaintext_len, buffer);
5668 debug_hexdump(stdout, "plaintext:", plaintext,
5671 memset(buffer, 0, sizeof(buffer));
5673 /* Create KASUMI operation */
5674 retval = create_wireless_algo_auth_cipher_operation(
5675 tdata->digest.data, tdata->digest.len,
5676 tdata->cipher_iv.data, tdata->cipher_iv.len,
5678 (tdata->digest.offset_bytes == 0 ?
5679 (verify ? ciphertext_pad_len : plaintext_pad_len)
5680 : tdata->digest.offset_bytes),
5681 tdata->validCipherLenInBits.len,
5682 tdata->validCipherOffsetInBits.len,
5683 tdata->validAuthLenInBits.len,
5685 op_mode, 1, verify);
5690 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5691 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5692 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5694 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5697 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5699 ut_params->obuf = (op_mode == IN_PLACE ?
5700 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5703 if (ut_params->obuf)
5704 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5705 plaintext_len, buffer);
5707 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5708 plaintext_len, buffer);
5710 debug_hexdump(stdout, "plaintext:", plaintext,
5711 (tdata->plaintext.len >> 3) - tdata->digest.len);
5712 debug_hexdump(stdout, "plaintext expected:",
5713 tdata->plaintext.data,
5714 (tdata->plaintext.len >> 3) - tdata->digest.len);
5716 if (ut_params->obuf)
5717 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5718 ciphertext_len, buffer);
5720 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5721 ciphertext_len, buffer);
5723 debug_hexdump(stdout, "ciphertext:", ciphertext,
5725 debug_hexdump(stdout, "ciphertext expected:",
5726 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5728 if (ut_params->obuf)
5729 digest = rte_pktmbuf_read(ut_params->obuf,
5730 (tdata->digest.offset_bytes == 0 ?
5731 plaintext_pad_len : tdata->digest.offset_bytes),
5732 tdata->digest.len, digest_buffer);
5734 digest = rte_pktmbuf_read(ut_params->ibuf,
5735 (tdata->digest.offset_bytes == 0 ?
5736 plaintext_pad_len : tdata->digest.offset_bytes),
5737 tdata->digest.len, digest_buffer);
5739 debug_hexdump(stdout, "digest:", digest,
5741 debug_hexdump(stdout, "digest expected:",
5742 tdata->digest.data, tdata->digest.len);
5747 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5749 tdata->plaintext.data,
5750 tdata->plaintext.len >> 3,
5751 "KASUMI Plaintext data not as expected");
5753 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5755 tdata->ciphertext.data,
5756 tdata->validDataLenInBits.len,
5757 "KASUMI Ciphertext data not as expected");
5759 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5762 DIGEST_BYTE_LENGTH_KASUMI_F9,
5763 "KASUMI Generated auth tag not as expected");
5769 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5771 struct crypto_testsuite_params *ts_params = &testsuite_params;
5772 struct crypto_unittest_params *ut_params = &unittest_params;
5776 uint8_t *plaintext, *ciphertext;
5777 unsigned plaintext_pad_len;
5778 unsigned plaintext_len;
5779 struct rte_cryptodev_info dev_info;
5781 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5782 uint64_t feat_flags = dev_info.feature_flags;
5784 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5785 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5786 printf("Device doesn't support RAW data-path APIs.\n");
5787 return TEST_SKIPPED;
5790 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5791 return TEST_SKIPPED;
5793 /* Verify the capabilities */
5794 struct rte_cryptodev_sym_capability_idx cap_idx;
5795 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5796 cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5797 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5799 return TEST_SKIPPED;
5800 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5801 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5802 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5804 return TEST_SKIPPED;
5806 /* Create KASUMI session */
5807 retval = create_wireless_algo_cipher_auth_session(
5808 ts_params->valid_devs[0],
5809 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5810 RTE_CRYPTO_AUTH_OP_GENERATE,
5811 RTE_CRYPTO_AUTH_KASUMI_F9,
5812 RTE_CRYPTO_CIPHER_KASUMI_F8,
5813 tdata->key.data, tdata->key.len,
5814 0, tdata->digest.len,
5815 tdata->cipher_iv.len);
5819 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5821 /* clear mbuf payload */
5822 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5823 rte_pktmbuf_tailroom(ut_params->ibuf));
5825 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5826 /* Append data which is padded to a multiple of */
5827 /* the algorithms block size */
5828 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5829 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5831 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5833 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5835 /* Create KASUMI operation */
5836 retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5837 tdata->digest.len, NULL, 0,
5838 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5839 tdata->cipher_iv.data, tdata->cipher_iv.len,
5840 RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5841 tdata->validCipherOffsetInBits.len,
5842 tdata->validAuthLenInBits.len,
5848 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5849 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5850 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5852 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5854 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5856 if (ut_params->op->sym->m_dst)
5857 ut_params->obuf = ut_params->op->sym->m_dst;
5859 ut_params->obuf = ut_params->op->sym->m_src;
5861 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5862 tdata->validCipherOffsetInBits.len >> 3);
5864 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5865 + plaintext_pad_len;
5867 const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5868 (tdata->validCipherOffsetInBits.len >> 3);
5870 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5872 reference_ciphertext,
5873 tdata->validCipherLenInBits.len,
5874 "KASUMI Ciphertext data not as expected");
5877 TEST_ASSERT_BUFFERS_ARE_EQUAL(
5880 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5881 "KASUMI Generated auth tag not as expected");
5886 test_zuc_encryption(const struct wireless_test_data *tdata)
5888 struct crypto_testsuite_params *ts_params = &testsuite_params;
5889 struct crypto_unittest_params *ut_params = &unittest_params;
5892 uint8_t *plaintext, *ciphertext;
5893 unsigned plaintext_pad_len;
5894 unsigned plaintext_len;
5895 struct rte_cryptodev_info dev_info;
5897 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5898 uint64_t feat_flags = dev_info.feature_flags;
5900 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5901 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5902 printf("Device doesn't support RAW data-path APIs.\n");
5903 return TEST_SKIPPED;
5906 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5907 return TEST_SKIPPED;
5909 struct rte_cryptodev_sym_capability_idx cap_idx;
5911 /* Check if device supports ZUC EEA3 */
5912 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5913 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5915 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5917 return TEST_SKIPPED;
5919 /* Create ZUC session */
5920 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5921 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5922 RTE_CRYPTO_CIPHER_ZUC_EEA3,
5923 tdata->key.data, tdata->key.len,
5924 tdata->cipher_iv.len);
5928 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5930 /* Clear mbuf payload */
5931 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5932 rte_pktmbuf_tailroom(ut_params->ibuf));
5934 plaintext_len = ceil_byte_length(tdata->plaintext.len);
5935 /* Append data which is padded to a multiple */
5936 /* of the algorithms block size */
5937 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5938 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5940 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5942 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5944 /* Create ZUC operation */
5945 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5946 tdata->cipher_iv.len,
5947 tdata->plaintext.len,
5952 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5953 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5954 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5956 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5958 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5960 ut_params->obuf = ut_params->op->sym->m_dst;
5961 if (ut_params->obuf)
5962 ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5964 ciphertext = plaintext;
5966 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5969 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5971 tdata->ciphertext.data,
5972 tdata->validCipherLenInBits.len,
5973 "ZUC Ciphertext data not as expected");
5978 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5980 struct crypto_testsuite_params *ts_params = &testsuite_params;
5981 struct crypto_unittest_params *ut_params = &unittest_params;
5985 unsigned int plaintext_pad_len;
5986 unsigned int plaintext_len;
5987 const uint8_t *ciphertext;
5988 uint8_t ciphertext_buffer[2048];
5989 struct rte_cryptodev_info dev_info;
5991 struct rte_cryptodev_sym_capability_idx cap_idx;
5993 /* Check if device supports ZUC EEA3 */
5994 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5995 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5997 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5999 return TEST_SKIPPED;
6001 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6002 return TEST_SKIPPED;
6004 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6006 uint64_t feat_flags = dev_info.feature_flags;
6008 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6009 printf("Device doesn't support in-place scatter-gather. "
6011 return TEST_SKIPPED;
6014 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6015 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6016 printf("Device doesn't support RAW data-path APIs.\n");
6017 return TEST_SKIPPED;
6020 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6022 /* Append data which is padded to a multiple */
6023 /* of the algorithms block size */
6024 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6026 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6027 plaintext_pad_len, 10, 0);
6029 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6030 tdata->plaintext.data);
6032 /* Create ZUC session */
6033 retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6034 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6035 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6036 tdata->key.data, tdata->key.len,
6037 tdata->cipher_iv.len);
6041 /* Clear mbuf payload */
6043 pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6045 /* Create ZUC operation */
6046 retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6047 tdata->cipher_iv.len, tdata->plaintext.len,
6052 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6053 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6054 ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6056 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6058 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6060 ut_params->obuf = ut_params->op->sym->m_dst;
6061 if (ut_params->obuf)
6062 ciphertext = rte_pktmbuf_read(ut_params->obuf,
6063 0, plaintext_len, ciphertext_buffer);
6065 ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6066 0, plaintext_len, ciphertext_buffer);
6069 debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6072 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6074 tdata->ciphertext.data,
6075 tdata->validCipherLenInBits.len,
6076 "ZUC Ciphertext data not as expected");
6082 test_zuc_authentication(const struct wireless_test_data *tdata)
6084 struct crypto_testsuite_params *ts_params = &testsuite_params;
6085 struct crypto_unittest_params *ut_params = &unittest_params;
6088 unsigned plaintext_pad_len;
6089 unsigned plaintext_len;
6092 struct rte_cryptodev_sym_capability_idx cap_idx;
6093 struct rte_cryptodev_info dev_info;
6095 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6096 uint64_t feat_flags = dev_info.feature_flags;
6098 if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6099 (tdata->validAuthLenInBits.len % 8 != 0)) {
6100 printf("Device doesn't support NON-Byte Aligned Data.\n");
6101 return TEST_SKIPPED;
6104 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6105 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6106 printf("Device doesn't support RAW data-path APIs.\n");
6107 return TEST_SKIPPED;
6110 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6111 return TEST_SKIPPED;
6113 /* Check if device supports ZUC EIA3 */
6114 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6115 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6117 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6119 return TEST_SKIPPED;
6121 /* Create ZUC session */
6122 retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6123 tdata->key.data, tdata->key.len,
6124 tdata->auth_iv.len, tdata->digest.len,
6125 RTE_CRYPTO_AUTH_OP_GENERATE,
6126 RTE_CRYPTO_AUTH_ZUC_EIA3);
6130 /* alloc mbuf and set payload */
6131 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6133 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6134 rte_pktmbuf_tailroom(ut_params->ibuf));
6136 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6137 /* Append data which is padded to a multiple of */
6138 /* the algorithms block size */
6139 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6140 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6142 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6144 /* Create ZUC operation */
6145 retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6146 tdata->auth_iv.data, tdata->auth_iv.len,
6147 plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6148 tdata->validAuthLenInBits.len,
6153 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6154 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6155 ut_params->op, 0, 1, 1, 0);
6157 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6159 ut_params->obuf = ut_params->op->sym->m_src;
6160 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6161 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6162 + plaintext_pad_len;
6165 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6169 "ZUC Generated auth tag not as expected");
6175 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6176 uint8_t op_mode, uint8_t verify)
6178 struct crypto_testsuite_params *ts_params = &testsuite_params;
6179 struct crypto_unittest_params *ut_params = &unittest_params;
6183 uint8_t *plaintext = NULL, *ciphertext = NULL;
6184 unsigned int plaintext_pad_len;
6185 unsigned int plaintext_len;
6186 unsigned int ciphertext_pad_len;
6187 unsigned int ciphertext_len;
6189 struct rte_cryptodev_info dev_info;
6190 struct rte_cryptodev_sym_capability_idx cap_idx;
6192 /* Check if device supports ZUC EIA3 */
6193 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6194 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6196 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6198 return TEST_SKIPPED;
6200 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6202 uint64_t feat_flags = dev_info.feature_flags;
6204 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6205 printf("Device doesn't support digest encrypted.\n");
6206 return TEST_SKIPPED;
6208 if (op_mode == IN_PLACE) {
6209 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6210 printf("Device doesn't support in-place scatter-gather "
6211 "in both input and output mbufs.\n");
6212 return TEST_SKIPPED;
6215 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6216 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6217 printf("Device doesn't support RAW data-path APIs.\n");
6218 return TEST_SKIPPED;
6221 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6222 return TEST_SKIPPED;
6223 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6224 printf("Device doesn't support out-of-place scatter-gather "
6225 "in both input and output mbufs.\n");
6226 return TEST_SKIPPED;
6230 /* Create ZUC session */
6231 retval = create_wireless_algo_auth_cipher_session(
6232 ts_params->valid_devs[0],
6233 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6234 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6235 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6236 : RTE_CRYPTO_AUTH_OP_GENERATE),
6237 RTE_CRYPTO_AUTH_ZUC_EIA3,
6238 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6239 tdata->key.data, tdata->key.len,
6240 tdata->auth_iv.len, tdata->digest.len,
6241 tdata->cipher_iv.len);
6246 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6247 if (op_mode == OUT_OF_PLACE)
6248 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6250 /* clear mbuf payload */
6251 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6252 rte_pktmbuf_tailroom(ut_params->ibuf));
6253 if (op_mode == OUT_OF_PLACE)
6254 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6255 rte_pktmbuf_tailroom(ut_params->obuf));
6257 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6258 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6259 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6260 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6263 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6264 ciphertext_pad_len);
6265 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6266 if (op_mode == OUT_OF_PLACE)
6267 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6268 debug_hexdump(stdout, "ciphertext:", ciphertext,
6271 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6273 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6274 if (op_mode == OUT_OF_PLACE)
6275 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6276 debug_hexdump(stdout, "plaintext:", plaintext,
6280 /* Create ZUC operation */
6281 retval = create_wireless_algo_auth_cipher_operation(
6282 tdata->digest.data, tdata->digest.len,
6283 tdata->cipher_iv.data, tdata->cipher_iv.len,
6284 tdata->auth_iv.data, tdata->auth_iv.len,
6285 (tdata->digest.offset_bytes == 0 ?
6286 (verify ? ciphertext_pad_len : plaintext_pad_len)
6287 : tdata->digest.offset_bytes),
6288 tdata->validCipherLenInBits.len,
6289 tdata->validCipherOffsetInBits.len,
6290 tdata->validAuthLenInBits.len,
6292 op_mode, 0, verify);
6297 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6298 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6299 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6301 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6304 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6306 ut_params->obuf = (op_mode == IN_PLACE ?
6307 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6311 if (ut_params->obuf)
6312 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6315 plaintext = ciphertext;
6317 debug_hexdump(stdout, "plaintext:", plaintext,
6318 (tdata->plaintext.len >> 3) - tdata->digest.len);
6319 debug_hexdump(stdout, "plaintext expected:",
6320 tdata->plaintext.data,
6321 (tdata->plaintext.len >> 3) - tdata->digest.len);
6323 if (ut_params->obuf)
6324 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6327 ciphertext = plaintext;
6329 debug_hexdump(stdout, "ciphertext:", ciphertext,
6331 debug_hexdump(stdout, "ciphertext expected:",
6332 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6334 ut_params->digest = rte_pktmbuf_mtod(
6335 ut_params->obuf, uint8_t *) +
6336 (tdata->digest.offset_bytes == 0 ?
6337 plaintext_pad_len : tdata->digest.offset_bytes);
6339 debug_hexdump(stdout, "digest:", ut_params->digest,
6341 debug_hexdump(stdout, "digest expected:",
6342 tdata->digest.data, tdata->digest.len);
6347 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6349 tdata->plaintext.data,
6350 tdata->plaintext.len >> 3,
6351 "ZUC Plaintext data not as expected");
6353 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6355 tdata->ciphertext.data,
6356 tdata->ciphertext.len >> 3,
6357 "ZUC Ciphertext data not as expected");
6359 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6362 DIGEST_BYTE_LENGTH_KASUMI_F9,
6363 "ZUC Generated auth tag not as expected");
6369 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6370 uint8_t op_mode, uint8_t verify)
6372 struct crypto_testsuite_params *ts_params = &testsuite_params;
6373 struct crypto_unittest_params *ut_params = &unittest_params;
6377 const uint8_t *plaintext = NULL;
6378 const uint8_t *ciphertext = NULL;
6379 const uint8_t *digest = NULL;
6380 unsigned int plaintext_pad_len;
6381 unsigned int plaintext_len;
6382 unsigned int ciphertext_pad_len;
6383 unsigned int ciphertext_len;
6384 uint8_t buffer[10000];
6385 uint8_t digest_buffer[10000];
6387 struct rte_cryptodev_info dev_info;
6388 struct rte_cryptodev_sym_capability_idx cap_idx;
6390 /* Check if device supports ZUC EIA3 */
6391 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6392 cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6394 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6396 return TEST_SKIPPED;
6398 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6400 uint64_t feat_flags = dev_info.feature_flags;
6402 if (op_mode == IN_PLACE) {
6403 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6404 printf("Device doesn't support in-place scatter-gather "
6405 "in both input and output mbufs.\n");
6406 return TEST_SKIPPED;
6409 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6410 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6411 printf("Device doesn't support RAW data-path APIs.\n");
6412 return TEST_SKIPPED;
6415 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6416 return TEST_SKIPPED;
6417 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6418 printf("Device doesn't support out-of-place scatter-gather "
6419 "in both input and output mbufs.\n");
6420 return TEST_SKIPPED;
6422 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6423 printf("Device doesn't support digest encrypted.\n");
6424 return TEST_SKIPPED;
6428 /* Create ZUC session */
6429 retval = create_wireless_algo_auth_cipher_session(
6430 ts_params->valid_devs[0],
6431 (verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6432 : RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6433 (verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6434 : RTE_CRYPTO_AUTH_OP_GENERATE),
6435 RTE_CRYPTO_AUTH_ZUC_EIA3,
6436 RTE_CRYPTO_CIPHER_ZUC_EEA3,
6437 tdata->key.data, tdata->key.len,
6438 tdata->auth_iv.len, tdata->digest.len,
6439 tdata->cipher_iv.len);
6444 ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6445 plaintext_len = ceil_byte_length(tdata->plaintext.len);
6446 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6447 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6449 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6450 plaintext_pad_len, 15, 0);
6451 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6452 "Failed to allocate input buffer in mempool");
6454 if (op_mode == OUT_OF_PLACE) {
6455 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6456 plaintext_pad_len, 15, 0);
6457 TEST_ASSERT_NOT_NULL(ut_params->obuf,
6458 "Failed to allocate output buffer in mempool");
6462 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6463 tdata->ciphertext.data);
6464 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6465 ciphertext_len, buffer);
6466 debug_hexdump(stdout, "ciphertext:", ciphertext,
6469 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6470 tdata->plaintext.data);
6471 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6472 plaintext_len, buffer);
6473 debug_hexdump(stdout, "plaintext:", plaintext,
6476 memset(buffer, 0, sizeof(buffer));
6478 /* Create ZUC operation */
6479 retval = create_wireless_algo_auth_cipher_operation(
6480 tdata->digest.data, tdata->digest.len,
6481 tdata->cipher_iv.data, tdata->cipher_iv.len,
6483 (tdata->digest.offset_bytes == 0 ?
6484 (verify ? ciphertext_pad_len : plaintext_pad_len)
6485 : tdata->digest.offset_bytes),
6486 tdata->validCipherLenInBits.len,
6487 tdata->validCipherOffsetInBits.len,
6488 tdata->validAuthLenInBits.len,
6490 op_mode, 1, verify);
6495 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6496 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6497 ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6499 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6502 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6504 ut_params->obuf = (op_mode == IN_PLACE ?
6505 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6508 if (ut_params->obuf)
6509 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6510 plaintext_len, buffer);
6512 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6513 plaintext_len, buffer);
6515 debug_hexdump(stdout, "plaintext:", plaintext,
6516 (tdata->plaintext.len >> 3) - tdata->digest.len);
6517 debug_hexdump(stdout, "plaintext expected:",
6518 tdata->plaintext.data,
6519 (tdata->plaintext.len >> 3) - tdata->digest.len);
6521 if (ut_params->obuf)
6522 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6523 ciphertext_len, buffer);
6525 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6526 ciphertext_len, buffer);
6528 debug_hexdump(stdout, "ciphertext:", ciphertext,
6530 debug_hexdump(stdout, "ciphertext expected:",
6531 tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6533 if (ut_params->obuf)
6534 digest = rte_pktmbuf_read(ut_params->obuf,
6535 (tdata->digest.offset_bytes == 0 ?
6536 plaintext_pad_len : tdata->digest.offset_bytes),
6537 tdata->digest.len, digest_buffer);
6539 digest = rte_pktmbuf_read(ut_params->ibuf,
6540 (tdata->digest.offset_bytes == 0 ?
6541 plaintext_pad_len : tdata->digest.offset_bytes),
6542 tdata->digest.len, digest_buffer);
6544 debug_hexdump(stdout, "digest:", digest,
6546 debug_hexdump(stdout, "digest expected:",
6547 tdata->digest.data, tdata->digest.len);
6552 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6554 tdata->plaintext.data,
6555 tdata->plaintext.len >> 3,
6556 "ZUC Plaintext data not as expected");
6558 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6560 tdata->ciphertext.data,
6561 tdata->validDataLenInBits.len,
6562 "ZUC Ciphertext data not as expected");
6564 TEST_ASSERT_BUFFERS_ARE_EQUAL(
6567 DIGEST_BYTE_LENGTH_KASUMI_F9,
6568 "ZUC Generated auth tag not as expected");
6574 test_kasumi_encryption_test_case_1(void)
6576 return test_kasumi_encryption(&kasumi_test_case_1);
6580 test_kasumi_encryption_test_case_1_sgl(void)
6582 return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6586 test_kasumi_encryption_test_case_1_oop(void)
6588 return test_kasumi_encryption_oop(&kasumi_test_case_1);
6592 test_kasumi_encryption_test_case_1_oop_sgl(void)
6594 return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6598 test_kasumi_encryption_test_case_2(void)
6600 return test_kasumi_encryption(&kasumi_test_case_2);
6604 test_kasumi_encryption_test_case_3(void)
6606 return test_kasumi_encryption(&kasumi_test_case_3);
6610 test_kasumi_encryption_test_case_4(void)
6612 return test_kasumi_encryption(&kasumi_test_case_4);
6616 test_kasumi_encryption_test_case_5(void)
6618 return test_kasumi_encryption(&kasumi_test_case_5);
6622 test_kasumi_decryption_test_case_1(void)
6624 return test_kasumi_decryption(&kasumi_test_case_1);
6628 test_kasumi_decryption_test_case_1_oop(void)
6630 return test_kasumi_decryption_oop(&kasumi_test_case_1);
6634 test_kasumi_decryption_test_case_2(void)
6636 return test_kasumi_decryption(&kasumi_test_case_2);
6640 test_kasumi_decryption_test_case_3(void)
6642 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6643 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6644 return TEST_SKIPPED;
6645 return test_kasumi_decryption(&kasumi_test_case_3);
6649 test_kasumi_decryption_test_case_4(void)
6651 return test_kasumi_decryption(&kasumi_test_case_4);
6655 test_kasumi_decryption_test_case_5(void)
6657 return test_kasumi_decryption(&kasumi_test_case_5);
6660 test_snow3g_encryption_test_case_1(void)
6662 return test_snow3g_encryption(&snow3g_test_case_1);
6666 test_snow3g_encryption_test_case_1_oop(void)
6668 return test_snow3g_encryption_oop(&snow3g_test_case_1);
6672 test_snow3g_encryption_test_case_1_oop_sgl(void)
6674 return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6679 test_snow3g_encryption_test_case_1_offset_oop(void)
6681 return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6685 test_snow3g_encryption_test_case_2(void)
6687 return test_snow3g_encryption(&snow3g_test_case_2);
6691 test_snow3g_encryption_test_case_3(void)
6693 return test_snow3g_encryption(&snow3g_test_case_3);
6697 test_snow3g_encryption_test_case_4(void)
6699 return test_snow3g_encryption(&snow3g_test_case_4);
6703 test_snow3g_encryption_test_case_5(void)
6705 return test_snow3g_encryption(&snow3g_test_case_5);
6709 test_snow3g_decryption_test_case_1(void)
6711 return test_snow3g_decryption(&snow3g_test_case_1);
6715 test_snow3g_decryption_test_case_1_oop(void)
6717 return test_snow3g_decryption_oop(&snow3g_test_case_1);
6721 test_snow3g_decryption_test_case_2(void)
6723 return test_snow3g_decryption(&snow3g_test_case_2);
6727 test_snow3g_decryption_test_case_3(void)
6729 return test_snow3g_decryption(&snow3g_test_case_3);
6733 test_snow3g_decryption_test_case_4(void)
6735 return test_snow3g_decryption(&snow3g_test_case_4);
6739 test_snow3g_decryption_test_case_5(void)
6741 return test_snow3g_decryption(&snow3g_test_case_5);
6745 * Function prepares snow3g_hash_test_data from snow3g_test_data.
6746 * Pattern digest from snow3g_test_data must be allocated as
6747 * 4 last bytes in plaintext.
6750 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6751 struct snow3g_hash_test_data *output)
6753 if ((pattern != NULL) && (output != NULL)) {
6754 output->key.len = pattern->key.len;
6756 memcpy(output->key.data,
6757 pattern->key.data, pattern->key.len);
6759 output->auth_iv.len = pattern->auth_iv.len;
6761 memcpy(output->auth_iv.data,
6762 pattern->auth_iv.data, pattern->auth_iv.len);
6764 output->plaintext.len = pattern->plaintext.len;
6766 memcpy(output->plaintext.data,
6767 pattern->plaintext.data, pattern->plaintext.len >> 3);
6769 output->digest.len = pattern->digest.len;
6771 memcpy(output->digest.data,
6772 &pattern->plaintext.data[pattern->digest.offset_bytes],
6773 pattern->digest.len);
6775 output->validAuthLenInBits.len =
6776 pattern->validAuthLenInBits.len;
6781 * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6784 test_snow3g_decryption_with_digest_test_case_1(void)
6786 struct snow3g_hash_test_data snow3g_hash_data;
6787 struct rte_cryptodev_info dev_info;
6788 struct crypto_testsuite_params *ts_params = &testsuite_params;
6790 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6791 uint64_t feat_flags = dev_info.feature_flags;
6793 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6794 printf("Device doesn't support encrypted digest operations.\n");
6795 return TEST_SKIPPED;
6799 * Function prepare data for hash veryfication test case.
6800 * Digest is allocated in 4 last bytes in plaintext, pattern.
6802 snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6804 return test_snow3g_decryption(&snow3g_test_case_7) &
6805 test_snow3g_authentication_verify(&snow3g_hash_data);
6809 test_snow3g_cipher_auth_test_case_1(void)
6811 return test_snow3g_cipher_auth(&snow3g_test_case_3);
6815 test_snow3g_auth_cipher_test_case_1(void)
6817 return test_snow3g_auth_cipher(
6818 &snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6822 test_snow3g_auth_cipher_test_case_2(void)
6824 return test_snow3g_auth_cipher(
6825 &snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6829 test_snow3g_auth_cipher_test_case_2_oop(void)
6831 return test_snow3g_auth_cipher(
6832 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6836 test_snow3g_auth_cipher_part_digest_enc(void)
6838 return test_snow3g_auth_cipher(
6839 &snow3g_auth_cipher_partial_digest_encryption,
6844 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6846 return test_snow3g_auth_cipher(
6847 &snow3g_auth_cipher_partial_digest_encryption,
6852 test_snow3g_auth_cipher_test_case_3_sgl(void)
6854 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6855 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6856 return TEST_SKIPPED;
6857 return test_snow3g_auth_cipher_sgl(
6858 &snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6862 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6864 return test_snow3g_auth_cipher_sgl(
6865 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6869 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6871 /* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6872 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6873 return TEST_SKIPPED;
6874 return test_snow3g_auth_cipher_sgl(
6875 &snow3g_auth_cipher_partial_digest_encryption,
6880 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6882 return test_snow3g_auth_cipher_sgl(
6883 &snow3g_auth_cipher_partial_digest_encryption,
6888 test_snow3g_auth_cipher_verify_test_case_1(void)
6890 return test_snow3g_auth_cipher(
6891 &snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6895 test_snow3g_auth_cipher_verify_test_case_2(void)
6897 return test_snow3g_auth_cipher(
6898 &snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6902 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6904 return test_snow3g_auth_cipher(
6905 &snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6909 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6911 return test_snow3g_auth_cipher(
6912 &snow3g_auth_cipher_partial_digest_encryption,
6917 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6919 return test_snow3g_auth_cipher(
6920 &snow3g_auth_cipher_partial_digest_encryption,
6925 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6927 return test_snow3g_auth_cipher_sgl(
6928 &snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6932 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6934 return test_snow3g_auth_cipher_sgl(
6935 &snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6939 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6941 return test_snow3g_auth_cipher_sgl(
6942 &snow3g_auth_cipher_partial_digest_encryption,
6947 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6949 return test_snow3g_auth_cipher_sgl(
6950 &snow3g_auth_cipher_partial_digest_encryption,
6955 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6957 return test_snow3g_auth_cipher(
6958 &snow3g_test_case_7, IN_PLACE, 0);
6962 test_kasumi_auth_cipher_test_case_1(void)
6964 return test_kasumi_auth_cipher(
6965 &kasumi_test_case_3, IN_PLACE, 0);
6969 test_kasumi_auth_cipher_test_case_2(void)
6971 return test_kasumi_auth_cipher(
6972 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6976 test_kasumi_auth_cipher_test_case_2_oop(void)
6978 return test_kasumi_auth_cipher(
6979 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6983 test_kasumi_auth_cipher_test_case_2_sgl(void)
6985 return test_kasumi_auth_cipher_sgl(
6986 &kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6990 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6992 return test_kasumi_auth_cipher_sgl(
6993 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6997 test_kasumi_auth_cipher_verify_test_case_1(void)
6999 return test_kasumi_auth_cipher(
7000 &kasumi_test_case_3, IN_PLACE, 1);
7004 test_kasumi_auth_cipher_verify_test_case_2(void)
7006 return test_kasumi_auth_cipher(
7007 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7011 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7013 return test_kasumi_auth_cipher(
7014 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7018 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7020 return test_kasumi_auth_cipher_sgl(
7021 &kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7025 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7027 return test_kasumi_auth_cipher_sgl(
7028 &kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7032 test_kasumi_cipher_auth_test_case_1(void)
7034 return test_kasumi_cipher_auth(&kasumi_test_case_6);
7038 test_zuc_encryption_test_case_1(void)
7040 return test_zuc_encryption(&zuc_test_case_cipher_193b);
7044 test_zuc_encryption_test_case_2(void)
7046 return test_zuc_encryption(&zuc_test_case_cipher_800b);
7050 test_zuc_encryption_test_case_3(void)
7052 return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7056 test_zuc_encryption_test_case_4(void)
7058 return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7062 test_zuc_encryption_test_case_5(void)
7064 return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7068 test_zuc_encryption_test_case_6_sgl(void)
7070 return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7074 test_zuc_encryption_test_case_7(void)
7076 return test_zuc_encryption(&zuc_test_case_cipher_800b_key_256b);
7080 test_zuc_hash_generate_test_case_1(void)
7082 return test_zuc_authentication(&zuc_test_case_auth_1b);
7086 test_zuc_hash_generate_test_case_2(void)
7088 return test_zuc_authentication(&zuc_test_case_auth_90b);
7092 test_zuc_hash_generate_test_case_3(void)
7094 return test_zuc_authentication(&zuc_test_case_auth_577b);
7098 test_zuc_hash_generate_test_case_4(void)
7100 return test_zuc_authentication(&zuc_test_case_auth_2079b);
7104 test_zuc_hash_generate_test_case_5(void)
7106 return test_zuc_authentication(&zuc_test_auth_5670b);
7110 test_zuc_hash_generate_test_case_6(void)
7112 return test_zuc_authentication(&zuc_test_case_auth_128b);
7116 test_zuc_hash_generate_test_case_7(void)
7118 return test_zuc_authentication(&zuc_test_case_auth_2080b);
7122 test_zuc_hash_generate_test_case_8(void)
7124 return test_zuc_authentication(&zuc_test_case_auth_584b);
7128 test_zuc_hash_generate_test_case_9(void)
7130 return test_zuc_authentication(&zuc_test_case_auth_584b_mac_64b);
7134 test_zuc_hash_generate_test_case_10(void)
7136 return test_zuc_authentication(&zuc_test_case_auth_2080b_mac_128b);
7140 test_zuc_cipher_auth_test_case_1(void)
7142 return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7146 test_zuc_cipher_auth_test_case_2(void)
7148 return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7152 test_zuc_auth_cipher_test_case_1(void)
7154 return test_zuc_auth_cipher(
7155 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7159 test_zuc_auth_cipher_test_case_1_oop(void)
7161 return test_zuc_auth_cipher(
7162 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7166 test_zuc_auth_cipher_test_case_1_sgl(void)
7168 return test_zuc_auth_cipher_sgl(
7169 &zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7173 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7175 return test_zuc_auth_cipher_sgl(
7176 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7180 test_zuc_auth_cipher_verify_test_case_1(void)
7182 return test_zuc_auth_cipher(
7183 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7187 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7189 return test_zuc_auth_cipher(
7190 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7194 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7196 return test_zuc_auth_cipher_sgl(
7197 &zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7201 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7203 return test_zuc_auth_cipher_sgl(
7204 &zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7208 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7210 uint8_t dev_id = testsuite_params.valid_devs[0];
7212 struct rte_cryptodev_sym_capability_idx cap_idx;
7214 /* Check if device supports particular cipher algorithm */
7215 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7216 cap_idx.algo.cipher = tdata->cipher_algo;
7217 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7218 return TEST_SKIPPED;
7220 /* Check if device supports particular hash algorithm */
7221 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7222 cap_idx.algo.auth = tdata->auth_algo;
7223 if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7224 return TEST_SKIPPED;
7230 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7231 uint8_t op_mode, uint8_t verify)
7233 struct crypto_testsuite_params *ts_params = &testsuite_params;
7234 struct crypto_unittest_params *ut_params = &unittest_params;
7238 uint8_t *plaintext = NULL, *ciphertext = NULL;
7239 unsigned int plaintext_pad_len;
7240 unsigned int plaintext_len;
7241 unsigned int ciphertext_pad_len;
7242 unsigned int ciphertext_len;
7244 struct rte_cryptodev_info dev_info;
7245 struct rte_crypto_op *op;
7247 /* Check if device supports particular algorithms separately */
7248 if (test_mixed_check_if_unsupported(tdata))
7249 return TEST_SKIPPED;
7250 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7251 return TEST_SKIPPED;
7253 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7255 uint64_t feat_flags = dev_info.feature_flags;
7257 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7258 printf("Device doesn't support digest encrypted.\n");
7259 return TEST_SKIPPED;
7262 /* Create the session */
7264 retval = create_wireless_algo_cipher_auth_session(
7265 ts_params->valid_devs[0],
7266 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7267 RTE_CRYPTO_AUTH_OP_VERIFY,
7270 tdata->auth_key.data, tdata->auth_key.len,
7271 tdata->auth_iv.len, tdata->digest_enc.len,
7272 tdata->cipher_iv.len);
7274 retval = create_wireless_algo_auth_cipher_session(
7275 ts_params->valid_devs[0],
7276 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7277 RTE_CRYPTO_AUTH_OP_GENERATE,
7280 tdata->auth_key.data, tdata->auth_key.len,
7281 tdata->auth_iv.len, tdata->digest_enc.len,
7282 tdata->cipher_iv.len);
7286 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7287 if (op_mode == OUT_OF_PLACE)
7288 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7290 /* clear mbuf payload */
7291 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7292 rte_pktmbuf_tailroom(ut_params->ibuf));
7293 if (op_mode == OUT_OF_PLACE) {
7295 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7296 rte_pktmbuf_tailroom(ut_params->obuf));
7299 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7300 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7301 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7302 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7305 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7306 ciphertext_pad_len);
7307 memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7308 if (op_mode == OUT_OF_PLACE)
7309 rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7310 debug_hexdump(stdout, "ciphertext:", ciphertext,
7313 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7315 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7316 if (op_mode == OUT_OF_PLACE)
7317 rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7318 debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7321 /* Create the operation */
7322 retval = create_wireless_algo_auth_cipher_operation(
7323 tdata->digest_enc.data, tdata->digest_enc.len,
7324 tdata->cipher_iv.data, tdata->cipher_iv.len,
7325 tdata->auth_iv.data, tdata->auth_iv.len,
7326 (tdata->digest_enc.offset == 0 ?
7328 : tdata->digest_enc.offset),
7329 tdata->validCipherLen.len_bits,
7330 tdata->cipher.offset_bits,
7331 tdata->validAuthLen.len_bits,
7332 tdata->auth.offset_bits,
7333 op_mode, 0, verify);
7338 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7340 /* Check if the op failed because the device doesn't */
7341 /* support this particular combination of algorithms */
7342 if (op == NULL && ut_params->op->status ==
7343 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7344 printf("Device doesn't support this mixed combination. "
7346 return TEST_SKIPPED;
7350 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7352 ut_params->obuf = (op_mode == IN_PLACE ?
7353 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7356 if (ut_params->obuf)
7357 plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7360 plaintext = ciphertext +
7361 (tdata->cipher.offset_bits >> 3);
7363 debug_hexdump(stdout, "plaintext:", plaintext,
7364 tdata->plaintext.len_bits >> 3);
7365 debug_hexdump(stdout, "plaintext expected:",
7366 tdata->plaintext.data,
7367 tdata->plaintext.len_bits >> 3);
7369 if (ut_params->obuf)
7370 ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7373 ciphertext = plaintext;
7375 debug_hexdump(stdout, "ciphertext:", ciphertext,
7377 debug_hexdump(stdout, "ciphertext expected:",
7378 tdata->ciphertext.data,
7379 tdata->ciphertext.len_bits >> 3);
7381 ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7382 + (tdata->digest_enc.offset == 0 ?
7383 plaintext_pad_len : tdata->digest_enc.offset);
7385 debug_hexdump(stdout, "digest:", ut_params->digest,
7386 tdata->digest_enc.len);
7387 debug_hexdump(stdout, "digest expected:",
7388 tdata->digest_enc.data,
7389 tdata->digest_enc.len);
7394 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7396 tdata->plaintext.data,
7397 tdata->plaintext.len_bits >> 3,
7398 "Plaintext data not as expected");
7400 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7402 tdata->ciphertext.data,
7403 tdata->validDataLen.len_bits,
7404 "Ciphertext data not as expected");
7406 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7408 tdata->digest_enc.data,
7409 DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7410 "Generated auth tag not as expected");
7413 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7414 "crypto op processing failed");
7420 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7421 uint8_t op_mode, uint8_t verify)
7423 struct crypto_testsuite_params *ts_params = &testsuite_params;
7424 struct crypto_unittest_params *ut_params = &unittest_params;
7428 const uint8_t *plaintext = NULL;
7429 const uint8_t *ciphertext = NULL;
7430 const uint8_t *digest = NULL;
7431 unsigned int plaintext_pad_len;
7432 unsigned int plaintext_len;
7433 unsigned int ciphertext_pad_len;
7434 unsigned int ciphertext_len;
7435 uint8_t buffer[10000];
7436 uint8_t digest_buffer[10000];
7438 struct rte_cryptodev_info dev_info;
7439 struct rte_crypto_op *op;
7441 /* Check if device supports particular algorithms */
7442 if (test_mixed_check_if_unsupported(tdata))
7443 return TEST_SKIPPED;
7444 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7445 return TEST_SKIPPED;
7447 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7449 uint64_t feat_flags = dev_info.feature_flags;
7451 if (op_mode == IN_PLACE) {
7452 if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7453 printf("Device doesn't support in-place scatter-gather "
7454 "in both input and output mbufs.\n");
7455 return TEST_SKIPPED;
7458 if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7459 printf("Device doesn't support out-of-place scatter-gather "
7460 "in both input and output mbufs.\n");
7461 return TEST_SKIPPED;
7463 if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7464 printf("Device doesn't support digest encrypted.\n");
7465 return TEST_SKIPPED;
7469 /* Create the session */
7471 retval = create_wireless_algo_cipher_auth_session(
7472 ts_params->valid_devs[0],
7473 RTE_CRYPTO_CIPHER_OP_DECRYPT,
7474 RTE_CRYPTO_AUTH_OP_VERIFY,
7477 tdata->auth_key.data, tdata->auth_key.len,
7478 tdata->auth_iv.len, tdata->digest_enc.len,
7479 tdata->cipher_iv.len);
7481 retval = create_wireless_algo_auth_cipher_session(
7482 ts_params->valid_devs[0],
7483 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7484 RTE_CRYPTO_AUTH_OP_GENERATE,
7487 tdata->auth_key.data, tdata->auth_key.len,
7488 tdata->auth_iv.len, tdata->digest_enc.len,
7489 tdata->cipher_iv.len);
7493 ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7494 plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7495 ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7496 plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7498 ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7499 ciphertext_pad_len, 15, 0);
7500 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7501 "Failed to allocate input buffer in mempool");
7503 if (op_mode == OUT_OF_PLACE) {
7504 ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7505 plaintext_pad_len, 15, 0);
7506 TEST_ASSERT_NOT_NULL(ut_params->obuf,
7507 "Failed to allocate output buffer in mempool");
7511 pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7512 tdata->ciphertext.data);
7513 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7514 ciphertext_len, buffer);
7515 debug_hexdump(stdout, "ciphertext:", ciphertext,
7518 pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7519 tdata->plaintext.data);
7520 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7521 plaintext_len, buffer);
7522 debug_hexdump(stdout, "plaintext:", plaintext,
7525 memset(buffer, 0, sizeof(buffer));
7527 /* Create the operation */
7528 retval = create_wireless_algo_auth_cipher_operation(
7529 tdata->digest_enc.data, tdata->digest_enc.len,
7530 tdata->cipher_iv.data, tdata->cipher_iv.len,
7531 tdata->auth_iv.data, tdata->auth_iv.len,
7532 (tdata->digest_enc.offset == 0 ?
7534 : tdata->digest_enc.offset),
7535 tdata->validCipherLen.len_bits,
7536 tdata->cipher.offset_bits,
7537 tdata->validAuthLen.len_bits,
7538 tdata->auth.offset_bits,
7539 op_mode, 1, verify);
7544 op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7546 /* Check if the op failed because the device doesn't */
7547 /* support this particular combination of algorithms */
7548 if (op == NULL && ut_params->op->status ==
7549 RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7550 printf("Device doesn't support this mixed combination. "
7552 return TEST_SKIPPED;
7556 TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7558 ut_params->obuf = (op_mode == IN_PLACE ?
7559 ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7562 if (ut_params->obuf)
7563 plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7564 plaintext_len, buffer);
7566 plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7567 plaintext_len, buffer);
7569 debug_hexdump(stdout, "plaintext:", plaintext,
7570 (tdata->plaintext.len_bits >> 3) -
7571 tdata->digest_enc.len);
7572 debug_hexdump(stdout, "plaintext expected:",
7573 tdata->plaintext.data,
7574 (tdata->plaintext.len_bits >> 3) -
7575 tdata->digest_enc.len);
7577 if (ut_params->obuf)
7578 ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7579 ciphertext_len, buffer);
7581 ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7582 ciphertext_len, buffer);
7584 debug_hexdump(stdout, "ciphertext:", ciphertext,
7586 debug_hexdump(stdout, "ciphertext expected:",
7587 tdata->ciphertext.data,
7588 tdata->ciphertext.len_bits >> 3);
7590 if (ut_params->obuf)
7591 digest = rte_pktmbuf_read(ut_params->obuf,
7592 (tdata->digest_enc.offset == 0 ?
7594 tdata->digest_enc.offset),
7595 tdata->digest_enc.len, digest_buffer);
7597 digest = rte_pktmbuf_read(ut_params->ibuf,
7598 (tdata->digest_enc.offset == 0 ?
7600 tdata->digest_enc.offset),
7601 tdata->digest_enc.len, digest_buffer);
7603 debug_hexdump(stdout, "digest:", digest,
7604 tdata->digest_enc.len);
7605 debug_hexdump(stdout, "digest expected:",
7606 tdata->digest_enc.data, tdata->digest_enc.len);
7611 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7613 tdata->plaintext.data,
7614 tdata->plaintext.len_bits >> 3,
7615 "Plaintext data not as expected");
7617 TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7619 tdata->ciphertext.data,
7620 tdata->validDataLen.len_bits,
7621 "Ciphertext data not as expected");
7622 TEST_ASSERT_BUFFERS_ARE_EQUAL(
7624 tdata->digest_enc.data,
7625 tdata->digest_enc.len,
7626 "Generated auth tag not as expected");
7629 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7630 "crypto op processing failed");
7635 /** AUTH AES CMAC + CIPHER AES CTR */
7638 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7640 return test_mixed_auth_cipher(
7641 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7645 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7647 return test_mixed_auth_cipher(
7648 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7652 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7654 return test_mixed_auth_cipher_sgl(
7655 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7659 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7661 return test_mixed_auth_cipher_sgl(
7662 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7666 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7668 return test_mixed_auth_cipher(
7669 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7673 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7675 return test_mixed_auth_cipher(
7676 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7680 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7682 return test_mixed_auth_cipher_sgl(
7683 &auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7687 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7689 return test_mixed_auth_cipher_sgl(
7690 &auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7693 /** MIXED AUTH + CIPHER */
7696 test_auth_zuc_cipher_snow_test_case_1(void)
7698 return test_mixed_auth_cipher(
7699 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7703 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7705 return test_mixed_auth_cipher(
7706 &auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7710 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7712 return test_mixed_auth_cipher(
7713 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7717 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7719 return test_mixed_auth_cipher(
7720 &auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7724 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7726 return test_mixed_auth_cipher(
7727 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7731 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7733 return test_mixed_auth_cipher(
7734 &auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7738 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7740 return test_mixed_auth_cipher(
7741 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7745 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7747 return test_mixed_auth_cipher(
7748 &auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7752 test_auth_snow_cipher_zuc_test_case_1(void)
7754 return test_mixed_auth_cipher(
7755 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7759 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7761 return test_mixed_auth_cipher(
7762 &auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7766 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7768 return test_mixed_auth_cipher(
7769 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7773 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7775 return test_mixed_auth_cipher(
7776 &auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7780 test_auth_null_cipher_snow_test_case_1(void)
7782 return test_mixed_auth_cipher(
7783 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7787 test_verify_auth_null_cipher_snow_test_case_1(void)
7789 return test_mixed_auth_cipher(
7790 &auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7794 test_auth_null_cipher_zuc_test_case_1(void)
7796 return test_mixed_auth_cipher(
7797 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7801 test_verify_auth_null_cipher_zuc_test_case_1(void)
7803 return test_mixed_auth_cipher(
7804 &auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7808 test_auth_snow_cipher_null_test_case_1(void)
7810 return test_mixed_auth_cipher(
7811 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7815 test_verify_auth_snow_cipher_null_test_case_1(void)
7817 return test_mixed_auth_cipher(
7818 &auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7822 test_auth_zuc_cipher_null_test_case_1(void)
7824 return test_mixed_auth_cipher(
7825 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7829 test_verify_auth_zuc_cipher_null_test_case_1(void)
7831 return test_mixed_auth_cipher(
7832 &auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7836 test_auth_null_cipher_aes_ctr_test_case_1(void)
7838 return test_mixed_auth_cipher(
7839 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7843 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7845 return test_mixed_auth_cipher(
7846 &auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7850 test_auth_aes_cmac_cipher_null_test_case_1(void)
7852 return test_mixed_auth_cipher(
7853 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7857 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7859 return test_mixed_auth_cipher(
7860 &auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7863 /* ***** AEAD algorithm Tests ***** */
7866 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7867 enum rte_crypto_aead_operation op,
7868 const uint8_t *key, const uint8_t key_len,
7869 const uint16_t aad_len, const uint8_t auth_len,
7872 uint8_t aead_key[key_len];
7874 struct crypto_testsuite_params *ts_params = &testsuite_params;
7875 struct crypto_unittest_params *ut_params = &unittest_params;
7877 memcpy(aead_key, key, key_len);
7879 /* Setup AEAD Parameters */
7880 ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7881 ut_params->aead_xform.next = NULL;
7882 ut_params->aead_xform.aead.algo = algo;
7883 ut_params->aead_xform.aead.op = op;
7884 ut_params->aead_xform.aead.key.data = aead_key;
7885 ut_params->aead_xform.aead.key.length = key_len;
7886 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7887 ut_params->aead_xform.aead.iv.length = iv_len;
7888 ut_params->aead_xform.aead.digest_length = auth_len;
7889 ut_params->aead_xform.aead.aad_length = aad_len;
7891 debug_hexdump(stdout, "key:", key, key_len);
7893 /* Create Crypto session*/
7894 ut_params->sess = rte_cryptodev_sym_session_create(
7895 ts_params->session_mpool);
7897 rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7898 &ut_params->aead_xform,
7899 ts_params->session_priv_mpool);
7901 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7907 create_aead_xform(struct rte_crypto_op *op,
7908 enum rte_crypto_aead_algorithm algo,
7909 enum rte_crypto_aead_operation aead_op,
7910 uint8_t *key, const uint8_t key_len,
7911 const uint8_t aad_len, const uint8_t auth_len,
7914 TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7915 "failed to allocate space for crypto transform");
7917 struct rte_crypto_sym_op *sym_op = op->sym;
7919 /* Setup AEAD Parameters */
7920 sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7921 sym_op->xform->next = NULL;
7922 sym_op->xform->aead.algo = algo;
7923 sym_op->xform->aead.op = aead_op;
7924 sym_op->xform->aead.key.data = key;
7925 sym_op->xform->aead.key.length = key_len;
7926 sym_op->xform->aead.iv.offset = IV_OFFSET;
7927 sym_op->xform->aead.iv.length = iv_len;
7928 sym_op->xform->aead.digest_length = auth_len;
7929 sym_op->xform->aead.aad_length = aad_len;
7931 debug_hexdump(stdout, "key:", key, key_len);
7937 create_aead_operation(enum rte_crypto_aead_operation op,
7938 const struct aead_test_data *tdata)
7940 struct crypto_testsuite_params *ts_params = &testsuite_params;
7941 struct crypto_unittest_params *ut_params = &unittest_params;
7943 uint8_t *plaintext, *ciphertext;
7944 unsigned int aad_pad_len, plaintext_pad_len;
7946 /* Generate Crypto op data structure */
7947 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7948 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7949 TEST_ASSERT_NOT_NULL(ut_params->op,
7950 "Failed to allocate symmetric crypto operation struct");
7952 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7954 /* Append aad data */
7955 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7956 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7957 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7959 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7960 "no room to append aad");
7962 sym_op->aead.aad.phys_addr =
7963 rte_pktmbuf_iova(ut_params->ibuf);
7964 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
7965 memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7966 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7969 /* Append IV at the end of the crypto operation*/
7970 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7971 uint8_t *, IV_OFFSET);
7973 /* Copy IV 1 byte after the IV pointer, according to the API */
7974 rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7975 debug_hexdump(stdout, "iv:", iv_ptr,
7978 aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7979 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7981 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7982 "no room to append aad");
7984 sym_op->aead.aad.phys_addr =
7985 rte_pktmbuf_iova(ut_params->ibuf);
7986 memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7987 debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7990 /* Append IV at the end of the crypto operation*/
7991 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7992 uint8_t *, IV_OFFSET);
7994 if (tdata->iv.len == 0) {
7995 rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7996 debug_hexdump(stdout, "iv:", iv_ptr,
7999 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8000 debug_hexdump(stdout, "iv:", iv_ptr,
8005 /* Append plaintext/ciphertext */
8006 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8007 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8008 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8010 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8012 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8013 debug_hexdump(stdout, "plaintext:", plaintext,
8014 tdata->plaintext.len);
8016 if (ut_params->obuf) {
8017 ciphertext = (uint8_t *)rte_pktmbuf_append(
8019 plaintext_pad_len + aad_pad_len);
8020 TEST_ASSERT_NOT_NULL(ciphertext,
8021 "no room to append ciphertext");
8023 memset(ciphertext + aad_pad_len, 0,
8024 tdata->ciphertext.len);
8027 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8028 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8030 TEST_ASSERT_NOT_NULL(ciphertext,
8031 "no room to append ciphertext");
8033 memcpy(ciphertext, tdata->ciphertext.data,
8034 tdata->ciphertext.len);
8035 debug_hexdump(stdout, "ciphertext:", ciphertext,
8036 tdata->ciphertext.len);
8038 if (ut_params->obuf) {
8039 plaintext = (uint8_t *)rte_pktmbuf_append(
8041 plaintext_pad_len + aad_pad_len);
8042 TEST_ASSERT_NOT_NULL(plaintext,
8043 "no room to append plaintext");
8045 memset(plaintext + aad_pad_len, 0,
8046 tdata->plaintext.len);
8050 /* Append digest data */
8051 if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8052 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8053 ut_params->obuf ? ut_params->obuf :
8055 tdata->auth_tag.len);
8056 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8057 "no room to append digest");
8058 memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8059 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8060 ut_params->obuf ? ut_params->obuf :
8065 sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8066 ut_params->ibuf, tdata->auth_tag.len);
8067 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8068 "no room to append digest");
8069 sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8071 plaintext_pad_len + aad_pad_len);
8073 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8074 tdata->auth_tag.len);
8075 debug_hexdump(stdout, "digest:",
8076 sym_op->aead.digest.data,
8077 tdata->auth_tag.len);
8080 sym_op->aead.data.length = tdata->plaintext.len;
8081 sym_op->aead.data.offset = aad_pad_len;
8087 test_authenticated_encryption(const struct aead_test_data *tdata)
8089 struct crypto_testsuite_params *ts_params = &testsuite_params;
8090 struct crypto_unittest_params *ut_params = &unittest_params;
8093 uint8_t *ciphertext, *auth_tag;
8094 uint16_t plaintext_pad_len;
8096 struct rte_cryptodev_info dev_info;
8098 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8099 uint64_t feat_flags = dev_info.feature_flags;
8101 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8102 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8103 printf("Device doesn't support RAW data-path APIs.\n");
8104 return TEST_SKIPPED;
8107 /* Verify the capabilities */
8108 struct rte_cryptodev_sym_capability_idx cap_idx;
8109 const struct rte_cryptodev_symmetric_capability *capability;
8110 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8111 cap_idx.algo.aead = tdata->algo;
8112 capability = rte_cryptodev_sym_capability_get(
8113 ts_params->valid_devs[0], &cap_idx);
8114 if (capability == NULL)
8115 return TEST_SKIPPED;
8116 if (rte_cryptodev_sym_capability_check_aead(
8117 capability, tdata->key.len, tdata->auth_tag.len,
8118 tdata->aad.len, tdata->iv.len))
8119 return TEST_SKIPPED;
8121 /* Create AEAD session */
8122 retval = create_aead_session(ts_params->valid_devs[0],
8124 RTE_CRYPTO_AEAD_OP_ENCRYPT,
8125 tdata->key.data, tdata->key.len,
8126 tdata->aad.len, tdata->auth_tag.len,
8131 if (tdata->aad.len > MBUF_SIZE) {
8132 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8133 /* Populate full size of add data */
8134 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8135 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8137 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8139 /* clear mbuf payload */
8140 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8141 rte_pktmbuf_tailroom(ut_params->ibuf));
8143 /* Create AEAD operation */
8144 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8148 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8150 ut_params->op->sym->m_src = ut_params->ibuf;
8152 /* Process crypto operation */
8153 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8154 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8155 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8156 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8157 ut_params->op, 0, 0, 0, 0);
8159 TEST_ASSERT_NOT_NULL(
8160 process_crypto_request(ts_params->valid_devs[0],
8161 ut_params->op), "failed to process sym crypto op");
8163 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8164 "crypto op processing failed");
8166 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8168 if (ut_params->op->sym->m_dst) {
8169 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8171 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8172 uint8_t *, plaintext_pad_len);
8174 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8176 ut_params->op->sym->cipher.data.offset);
8177 auth_tag = ciphertext + plaintext_pad_len;
8180 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8181 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8184 TEST_ASSERT_BUFFERS_ARE_EQUAL(
8186 tdata->ciphertext.data,
8187 tdata->ciphertext.len,
8188 "Ciphertext data not as expected");
8190 TEST_ASSERT_BUFFERS_ARE_EQUAL(
8192 tdata->auth_tag.data,
8193 tdata->auth_tag.len,
8194 "Generated auth tag not as expected");
8200 #ifdef RTE_LIB_SECURITY
8202 security_proto_supported(enum rte_security_session_action_type action,
8203 enum rte_security_session_protocol proto)
8205 struct crypto_testsuite_params *ts_params = &testsuite_params;
8207 const struct rte_security_capability *capabilities;
8208 const struct rte_security_capability *capability;
8211 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8212 rte_cryptodev_get_sec_ctx(
8213 ts_params->valid_devs[0]);
8216 capabilities = rte_security_capabilities_get(ctx);
8218 if (capabilities == NULL)
8221 while ((capability = &capabilities[i++])->action !=
8222 RTE_SECURITY_ACTION_TYPE_NONE) {
8223 if (capability->action == action &&
8224 capability->protocol == proto)
8231 /* Basic algorithm run function for async inplace mode.
8232 * Creates a session from input parameters and runs one operation
8233 * on input_vec. Checks the output of the crypto operation against
8236 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8237 enum rte_crypto_auth_operation opa,
8238 const uint8_t *input_vec, unsigned int input_vec_len,
8239 const uint8_t *output_vec,
8240 unsigned int output_vec_len,
8241 enum rte_crypto_cipher_algorithm cipher_alg,
8242 const uint8_t *cipher_key, uint32_t cipher_key_len,
8243 enum rte_crypto_auth_algorithm auth_alg,
8244 const uint8_t *auth_key, uint32_t auth_key_len,
8245 uint8_t bearer, enum rte_security_pdcp_domain domain,
8246 uint8_t packet_direction, uint8_t sn_size,
8247 uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8249 struct crypto_testsuite_params *ts_params = &testsuite_params;
8250 struct crypto_unittest_params *ut_params = &unittest_params;
8252 int ret = TEST_SUCCESS;
8253 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8254 rte_cryptodev_get_sec_ctx(
8255 ts_params->valid_devs[0]);
8257 /* Verify the capabilities */
8258 struct rte_security_capability_idx sec_cap_idx;
8260 sec_cap_idx.action = ut_params->type;
8261 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8262 sec_cap_idx.pdcp.domain = domain;
8263 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8264 return TEST_SKIPPED;
8266 /* Generate test mbuf data */
8267 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8269 /* clear mbuf payload */
8270 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8271 rte_pktmbuf_tailroom(ut_params->ibuf));
8273 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8275 memcpy(plaintext, input_vec, input_vec_len);
8277 /* Out of place support */
8280 * For out-op-place we need to alloc another mbuf
8282 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8283 rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8286 /* Setup Cipher Parameters */
8287 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8288 ut_params->cipher_xform.cipher.algo = cipher_alg;
8289 ut_params->cipher_xform.cipher.op = opc;
8290 ut_params->cipher_xform.cipher.key.data = cipher_key;
8291 ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8292 ut_params->cipher_xform.cipher.iv.length =
8293 packet_direction ? 4 : 0;
8294 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8296 /* Setup HMAC Parameters if ICV header is required */
8297 if (auth_alg != 0) {
8298 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8299 ut_params->auth_xform.next = NULL;
8300 ut_params->auth_xform.auth.algo = auth_alg;
8301 ut_params->auth_xform.auth.op = opa;
8302 ut_params->auth_xform.auth.key.data = auth_key;
8303 ut_params->auth_xform.auth.key.length = auth_key_len;
8305 ut_params->cipher_xform.next = &ut_params->auth_xform;
8307 ut_params->cipher_xform.next = NULL;
8310 struct rte_security_session_conf sess_conf = {
8311 .action_type = ut_params->type,
8312 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8316 .pkt_dir = packet_direction,
8318 .hfn = packet_direction ? 0 : hfn,
8320 * hfn can be set as pdcp_test_hfn[i]
8321 * if hfn_ovrd is not set. Here, PDCP
8322 * packet direction is just used to
8323 * run half of the cases with session
8324 * HFN and other half with per packet
8327 .hfn_threshold = hfn_threshold,
8328 .hfn_ovrd = packet_direction ? 1 : 0,
8329 .sdap_enabled = sdap,
8331 .crypto_xform = &ut_params->cipher_xform
8334 /* Create security session */
8335 ut_params->sec_session = rte_security_session_create(ctx,
8336 &sess_conf, ts_params->session_mpool,
8337 ts_params->session_priv_mpool);
8339 if (!ut_params->sec_session) {
8340 printf("TestCase %s()-%d line %d failed %s: ",
8341 __func__, i, __LINE__, "Failed to allocate session");
8346 /* Generate crypto op data structure */
8347 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8348 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8349 if (!ut_params->op) {
8350 printf("TestCase %s()-%d line %d failed %s: ",
8351 __func__, i, __LINE__,
8352 "Failed to allocate symmetric crypto operation struct");
8357 uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8358 uint32_t *, IV_OFFSET);
8359 *per_pkt_hfn = packet_direction ? hfn : 0;
8361 rte_security_attach_session(ut_params->op, ut_params->sec_session);
8363 /* set crypto operation source mbuf */
8364 ut_params->op->sym->m_src = ut_params->ibuf;
8366 ut_params->op->sym->m_dst = ut_params->obuf;
8368 /* Process crypto operation */
8369 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8371 printf("TestCase %s()-%d line %d failed %s: ",
8372 __func__, i, __LINE__,
8373 "failed to process sym crypto op");
8378 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8379 printf("TestCase %s()-%d line %d failed %s: ",
8380 __func__, i, __LINE__, "crypto op processing failed");
8386 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8389 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8393 if (memcmp(ciphertext, output_vec, output_vec_len)) {
8394 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8395 rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8396 rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8402 rte_crypto_op_free(ut_params->op);
8403 ut_params->op = NULL;
8405 if (ut_params->sec_session)
8406 rte_security_session_destroy(ctx, ut_params->sec_session);
8407 ut_params->sec_session = NULL;
8409 rte_pktmbuf_free(ut_params->ibuf);
8410 ut_params->ibuf = NULL;
8412 rte_pktmbuf_free(ut_params->obuf);
8413 ut_params->obuf = NULL;
8420 test_pdcp_proto_SGL(int i, int oop,
8421 enum rte_crypto_cipher_operation opc,
8422 enum rte_crypto_auth_operation opa,
8424 unsigned int input_vec_len,
8425 uint8_t *output_vec,
8426 unsigned int output_vec_len,
8428 uint32_t fragsz_oop)
8430 struct crypto_testsuite_params *ts_params = &testsuite_params;
8431 struct crypto_unittest_params *ut_params = &unittest_params;
8433 struct rte_mbuf *buf, *buf_oop = NULL;
8434 int ret = TEST_SUCCESS;
8438 unsigned int trn_data = 0;
8439 struct rte_cryptodev_info dev_info;
8440 uint64_t feat_flags;
8441 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8442 rte_cryptodev_get_sec_ctx(
8443 ts_params->valid_devs[0]);
8444 struct rte_mbuf *temp_mbuf;
8446 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8447 feat_flags = dev_info.feature_flags;
8449 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8450 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8451 printf("Device does not support RAW data-path APIs.\n");
8454 /* Verify the capabilities */
8455 struct rte_security_capability_idx sec_cap_idx;
8457 sec_cap_idx.action = ut_params->type;
8458 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8459 sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8460 if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8461 return TEST_SKIPPED;
8463 if (fragsz > input_vec_len)
8464 fragsz = input_vec_len;
8466 uint16_t plaintext_len = fragsz;
8467 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8469 if (fragsz_oop > output_vec_len)
8470 frag_size_oop = output_vec_len;
8473 if (input_vec_len % fragsz != 0) {
8474 if (input_vec_len / fragsz + 1 > 16)
8476 } else if (input_vec_len / fragsz > 16)
8479 /* Out of place support */
8482 * For out-op-place we need to alloc another mbuf
8484 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8485 rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8486 buf_oop = ut_params->obuf;
8489 /* Generate test mbuf data */
8490 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8492 /* clear mbuf payload */
8493 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8494 rte_pktmbuf_tailroom(ut_params->ibuf));
8496 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8498 memcpy(plaintext, input_vec, plaintext_len);
8499 trn_data += plaintext_len;
8501 buf = ut_params->ibuf;
8504 * Loop until no more fragments
8507 while (trn_data < input_vec_len) {
8509 to_trn = (input_vec_len - trn_data < fragsz) ?
8510 (input_vec_len - trn_data) : fragsz;
8512 to_trn_tbl[ecx++] = to_trn;
8514 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8517 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8518 rte_pktmbuf_tailroom(buf));
8521 if (oop && !fragsz_oop) {
8523 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8524 buf_oop = buf_oop->next;
8525 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8526 0, rte_pktmbuf_tailroom(buf_oop));
8527 rte_pktmbuf_append(buf_oop, to_trn);
8530 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8533 memcpy(plaintext, input_vec + trn_data, to_trn);
8537 ut_params->ibuf->nb_segs = segs;
8540 if (fragsz_oop && oop) {
8544 trn_data = frag_size_oop;
8545 while (trn_data < output_vec_len) {
8548 (output_vec_len - trn_data <
8550 (output_vec_len - trn_data) :
8553 to_trn_tbl[ecx++] = to_trn;
8556 rte_pktmbuf_alloc(ts_params->mbuf_pool);
8557 buf_oop = buf_oop->next;
8558 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8559 0, rte_pktmbuf_tailroom(buf_oop));
8560 rte_pktmbuf_append(buf_oop, to_trn);
8564 ut_params->obuf->nb_segs = segs;
8567 /* Setup Cipher Parameters */
8568 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8569 ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8570 ut_params->cipher_xform.cipher.op = opc;
8571 ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8572 ut_params->cipher_xform.cipher.key.length =
8573 pdcp_test_params[i].cipher_key_len;
8574 ut_params->cipher_xform.cipher.iv.length = 0;
8576 /* Setup HMAC Parameters if ICV header is required */
8577 if (pdcp_test_params[i].auth_alg != 0) {
8578 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8579 ut_params->auth_xform.next = NULL;
8580 ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8581 ut_params->auth_xform.auth.op = opa;
8582 ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8583 ut_params->auth_xform.auth.key.length =
8584 pdcp_test_params[i].auth_key_len;
8586 ut_params->cipher_xform.next = &ut_params->auth_xform;
8588 ut_params->cipher_xform.next = NULL;
8591 struct rte_security_session_conf sess_conf = {
8592 .action_type = ut_params->type,
8593 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
8595 .bearer = pdcp_test_bearer[i],
8596 .domain = pdcp_test_params[i].domain,
8597 .pkt_dir = pdcp_test_packet_direction[i],
8598 .sn_size = pdcp_test_data_sn_size[i],
8599 .hfn = pdcp_test_hfn[i],
8600 .hfn_threshold = pdcp_test_hfn_threshold[i],
8603 .crypto_xform = &ut_params->cipher_xform
8606 /* Create security session */
8607 ut_params->sec_session = rte_security_session_create(ctx,
8608 &sess_conf, ts_params->session_mpool,
8609 ts_params->session_priv_mpool);
8611 if (!ut_params->sec_session) {
8612 printf("TestCase %s()-%d line %d failed %s: ",
8613 __func__, i, __LINE__, "Failed to allocate session");
8618 /* Generate crypto op data structure */
8619 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8620 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8621 if (!ut_params->op) {
8622 printf("TestCase %s()-%d line %d failed %s: ",
8623 __func__, i, __LINE__,
8624 "Failed to allocate symmetric crypto operation struct");
8629 rte_security_attach_session(ut_params->op, ut_params->sec_session);
8631 /* set crypto operation source mbuf */
8632 ut_params->op->sym->m_src = ut_params->ibuf;
8634 ut_params->op->sym->m_dst = ut_params->obuf;
8636 /* Process crypto operation */
8637 temp_mbuf = ut_params->op->sym->m_src;
8638 if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8639 /* filling lengths */
8641 ut_params->op->sym->cipher.data.length
8642 += temp_mbuf->pkt_len;
8643 ut_params->op->sym->auth.data.length
8644 += temp_mbuf->pkt_len;
8645 temp_mbuf = temp_mbuf->next;
8647 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8648 ut_params->op, 1, 1, 0, 0);
8650 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8653 if (ut_params->op == NULL) {
8654 printf("TestCase %s()-%d line %d failed %s: ",
8655 __func__, i, __LINE__,
8656 "failed to process sym crypto op");
8661 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8662 printf("TestCase %s()-%d line %d failed %s: ",
8663 __func__, i, __LINE__, "crypto op processing failed");
8669 uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8672 ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8676 fragsz = frag_size_oop;
8677 if (memcmp(ciphertext, output_vec, fragsz)) {
8678 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8679 rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8680 rte_hexdump(stdout, "reference", output_vec, fragsz);
8685 buf = ut_params->op->sym->m_src->next;
8687 buf = ut_params->op->sym->m_dst->next;
8689 unsigned int off = fragsz;
8693 ciphertext = rte_pktmbuf_mtod(buf,
8695 if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8696 printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8697 rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8698 rte_hexdump(stdout, "reference", output_vec + off,
8703 off += to_trn_tbl[ecx++];
8707 rte_crypto_op_free(ut_params->op);
8708 ut_params->op = NULL;
8710 if (ut_params->sec_session)
8711 rte_security_session_destroy(ctx, ut_params->sec_session);
8712 ut_params->sec_session = NULL;
8714 rte_pktmbuf_free(ut_params->ibuf);
8715 ut_params->ibuf = NULL;
8717 rte_pktmbuf_free(ut_params->obuf);
8718 ut_params->obuf = NULL;
8725 test_pdcp_proto_cplane_encap(int i)
8727 return test_pdcp_proto(
8728 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8729 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8730 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8731 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8732 pdcp_test_params[i].cipher_key_len,
8733 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8734 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8735 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8736 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8737 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8741 test_pdcp_proto_uplane_encap(int i)
8743 return test_pdcp_proto(
8744 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8745 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8746 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8747 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8748 pdcp_test_params[i].cipher_key_len,
8749 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8750 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8751 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8752 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8753 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8757 test_pdcp_proto_uplane_encap_with_int(int i)
8759 return test_pdcp_proto(
8760 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8761 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8762 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8763 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8764 pdcp_test_params[i].cipher_key_len,
8765 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8766 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8767 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8768 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8769 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8773 test_pdcp_proto_cplane_decap(int i)
8775 return test_pdcp_proto(
8776 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8777 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8778 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8779 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8780 pdcp_test_params[i].cipher_key_len,
8781 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8782 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8783 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8784 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8785 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8789 test_pdcp_proto_uplane_decap(int i)
8791 return test_pdcp_proto(
8792 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8793 pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8794 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8795 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8796 pdcp_test_params[i].cipher_key_len,
8797 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8798 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8799 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8800 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8801 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8805 test_pdcp_proto_uplane_decap_with_int(int i)
8807 return test_pdcp_proto(
8808 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8809 pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8810 pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8811 pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8812 pdcp_test_params[i].cipher_key_len,
8813 pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8814 pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8815 pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8816 pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8817 pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8821 test_PDCP_PROTO_SGL_in_place_32B(void)
8823 /* i can be used for running any PDCP case
8824 * In this case it is uplane 12-bit AES-SNOW DL encap
8826 int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8827 return test_pdcp_proto_SGL(i, IN_PLACE,
8828 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8829 RTE_CRYPTO_AUTH_OP_GENERATE,
8830 pdcp_test_data_in[i],
8831 pdcp_test_data_in_len[i],
8832 pdcp_test_data_out[i],
8833 pdcp_test_data_in_len[i]+4,
8837 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8839 /* i can be used for running any PDCP case
8840 * In this case it is uplane 18-bit NULL-NULL DL encap
8842 int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8843 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8844 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8845 RTE_CRYPTO_AUTH_OP_GENERATE,
8846 pdcp_test_data_in[i],
8847 pdcp_test_data_in_len[i],
8848 pdcp_test_data_out[i],
8849 pdcp_test_data_in_len[i]+4,
8853 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8855 /* i can be used for running any PDCP case
8856 * In this case it is uplane 18-bit AES DL encap
8858 int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8860 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8861 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8862 RTE_CRYPTO_AUTH_OP_GENERATE,
8863 pdcp_test_data_in[i],
8864 pdcp_test_data_in_len[i],
8865 pdcp_test_data_out[i],
8866 pdcp_test_data_in_len[i],
8870 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8872 /* i can be used for running any PDCP case
8873 * In this case it is cplane 12-bit AES-ZUC DL encap
8875 int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8876 return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8877 RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8878 RTE_CRYPTO_AUTH_OP_GENERATE,
8879 pdcp_test_data_in[i],
8880 pdcp_test_data_in_len[i],
8881 pdcp_test_data_out[i],
8882 pdcp_test_data_in_len[i]+4,
8887 test_PDCP_SDAP_PROTO_encap_all(void)
8889 int i = 0, size = 0;
8890 int err, all_err = TEST_SUCCESS;
8891 const struct pdcp_sdap_test *cur_test;
8893 size = RTE_DIM(list_pdcp_sdap_tests);
8895 for (i = 0; i < size; i++) {
8896 cur_test = &list_pdcp_sdap_tests[i];
8897 err = test_pdcp_proto(
8898 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8899 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8900 cur_test->in_len, cur_test->data_out,
8901 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8902 cur_test->param.cipher_alg, cur_test->cipher_key,
8903 cur_test->param.cipher_key_len,
8904 cur_test->param.auth_alg,
8905 cur_test->auth_key, cur_test->param.auth_key_len,
8906 cur_test->bearer, cur_test->param.domain,
8907 cur_test->packet_direction, cur_test->sn_size,
8909 cur_test->hfn_threshold, SDAP_ENABLED);
8911 printf("\t%d) %s: Encapsulation failed\n",
8913 cur_test->param.name);
8916 printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8917 cur_test->param.name);
8923 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8925 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8929 test_PDCP_PROTO_short_mac(void)
8931 int i = 0, size = 0;
8932 int err, all_err = TEST_SUCCESS;
8933 const struct pdcp_short_mac_test *cur_test;
8935 size = RTE_DIM(list_pdcp_smac_tests);
8937 for (i = 0; i < size; i++) {
8938 cur_test = &list_pdcp_smac_tests[i];
8939 err = test_pdcp_proto(
8940 i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8941 RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8942 cur_test->in_len, cur_test->data_out,
8943 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8944 RTE_CRYPTO_CIPHER_NULL, NULL,
8945 0, cur_test->param.auth_alg,
8946 cur_test->auth_key, cur_test->param.auth_key_len,
8947 0, cur_test->param.domain, 0, 0,
8950 printf("\t%d) %s: Short MAC test failed\n",
8952 cur_test->param.name);
8955 printf("\t%d) %s: Short MAC test PASS\n",
8957 cur_test->param.name);
8958 rte_hexdump(stdout, "MAC I",
8959 cur_test->data_out + cur_test->in_len + 2,
8966 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8968 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8973 test_PDCP_SDAP_PROTO_decap_all(void)
8975 int i = 0, size = 0;
8976 int err, all_err = TEST_SUCCESS;
8977 const struct pdcp_sdap_test *cur_test;
8979 size = RTE_DIM(list_pdcp_sdap_tests);
8981 for (i = 0; i < size; i++) {
8982 cur_test = &list_pdcp_sdap_tests[i];
8983 err = test_pdcp_proto(
8984 i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8985 RTE_CRYPTO_AUTH_OP_VERIFY,
8987 cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8988 cur_test->data_in, cur_test->in_len,
8989 cur_test->param.cipher_alg,
8990 cur_test->cipher_key, cur_test->param.cipher_key_len,
8991 cur_test->param.auth_alg, cur_test->auth_key,
8992 cur_test->param.auth_key_len, cur_test->bearer,
8993 cur_test->param.domain, cur_test->packet_direction,
8994 cur_test->sn_size, cur_test->hfn,
8995 cur_test->hfn_threshold, SDAP_ENABLED);
8997 printf("\t%d) %s: Decapsulation failed\n",
8999 cur_test->param.name);
9002 printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9003 cur_test->param.name);
9009 printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9011 return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9015 test_ipsec_proto_process(const struct ipsec_test_data td[],
9016 struct ipsec_test_data res_d[],
9019 const struct ipsec_test_flags *flags)
9021 struct crypto_testsuite_params *ts_params = &testsuite_params;
9022 struct crypto_unittest_params *ut_params = &unittest_params;
9023 struct rte_security_capability_idx sec_cap_idx;
9024 const struct rte_security_capability *sec_cap;
9025 struct rte_security_ipsec_xform ipsec_xform;
9026 uint8_t dev_id = ts_params->valid_devs[0];
9027 enum rte_security_ipsec_sa_direction dir;
9028 struct ipsec_test_data *res_d_tmp = NULL;
9029 uint32_t src = RTE_IPV4(192, 168, 1, 0);
9030 uint32_t dst = RTE_IPV4(192, 168, 1, 1);
9031 int salt_len, i, ret = TEST_SUCCESS;
9032 struct rte_security_ctx *ctx;
9033 uint8_t *input_text;
9036 ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9037 gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9039 /* Use first test data to create session */
9041 /* Copy IPsec xform */
9042 memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9044 dir = ipsec_xform.direction;
9045 verify = flags->tunnel_hdr_verify;
9047 if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9048 if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9050 else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9054 memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src, sizeof(src));
9055 memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst, sizeof(dst));
9057 ctx = rte_cryptodev_get_sec_ctx(dev_id);
9059 sec_cap_idx.action = ut_params->type;
9060 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9061 sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9062 sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9063 sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9065 if (flags->udp_encap)
9066 ipsec_xform.options.udp_encap = 1;
9068 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9069 if (sec_cap == NULL)
9070 return TEST_SKIPPED;
9072 /* Copy cipher session parameters */
9074 memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9075 sizeof(ut_params->aead_xform));
9076 ut_params->aead_xform.aead.key.data = td[0].key.data;
9077 ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9079 /* Verify crypto capabilities */
9080 if (test_ipsec_crypto_caps_aead_verify(
9082 &ut_params->aead_xform) != 0) {
9084 RTE_LOG(INFO, USER1,
9085 "Crypto capabilities not supported\n");
9086 return TEST_SKIPPED;
9089 /* Only AEAD supported now */
9090 return TEST_SKIPPED;
9093 if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9094 return TEST_SKIPPED;
9096 salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9097 memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9099 struct rte_security_session_conf sess_conf = {
9100 .action_type = ut_params->type,
9101 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9102 .ipsec = ipsec_xform,
9103 .crypto_xform = &ut_params->aead_xform,
9106 /* Create security session */
9107 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9108 ts_params->session_mpool,
9109 ts_params->session_priv_mpool);
9111 if (ut_params->sec_session == NULL)
9112 return TEST_SKIPPED;
9114 for (i = 0; i < nb_td; i++) {
9115 /* Setup source mbuf payload */
9116 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9117 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9118 rte_pktmbuf_tailroom(ut_params->ibuf));
9120 input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9121 td[i].input_text.len);
9123 memcpy(input_text, td[i].input_text.data,
9124 td[i].input_text.len);
9126 /* Generate crypto op data structure */
9127 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9128 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9129 if (!ut_params->op) {
9130 printf("TestCase %s line %d: %s\n",
9132 "failed to allocate crypto op");
9134 goto crypto_op_free;
9137 /* Attach session to operation */
9138 rte_security_attach_session(ut_params->op,
9139 ut_params->sec_session);
9141 /* Set crypto operation mbufs */
9142 ut_params->op->sym->m_src = ut_params->ibuf;
9143 ut_params->op->sym->m_dst = NULL;
9145 /* Copy IV in crypto operation when IV generation is disabled */
9146 if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9147 ipsec_xform.options.iv_gen_disable == 1) {
9148 uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9154 len = td[i].xform.aead.aead.iv.length;
9156 len = td[i].xform.chain.cipher.cipher.iv.length;
9158 memcpy(iv, td[i].iv.data, len);
9161 /* Process crypto operation */
9162 process_crypto_request(dev_id, ut_params->op);
9164 ret = test_ipsec_status_check(ut_params->op, flags, dir, i + 1);
9165 if (ret != TEST_SUCCESS)
9166 goto crypto_op_free;
9169 res_d_tmp = &res_d[i];
9171 ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9172 res_d_tmp, silent, flags);
9173 if (ret != TEST_SUCCESS)
9174 goto crypto_op_free;
9176 rte_crypto_op_free(ut_params->op);
9177 ut_params->op = NULL;
9179 rte_pktmbuf_free(ut_params->ibuf);
9180 ut_params->ibuf = NULL;
9184 rte_crypto_op_free(ut_params->op);
9185 ut_params->op = NULL;
9187 rte_pktmbuf_free(ut_params->ibuf);
9188 ut_params->ibuf = NULL;
9190 if (ut_params->sec_session)
9191 rte_security_session_destroy(ctx, ut_params->sec_session);
9192 ut_params->sec_session = NULL;
9198 test_ipsec_proto_known_vec(const void *test_data)
9200 struct ipsec_test_data td_outb;
9201 struct ipsec_test_flags flags;
9203 memset(&flags, 0, sizeof(flags));
9205 memcpy(&td_outb, test_data, sizeof(td_outb));
9207 /* Disable IV gen to be able to test with known vectors */
9208 td_outb.ipsec_xform.options.iv_gen_disable = 1;
9210 return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9214 test_ipsec_proto_known_vec_inb(const void *td_outb)
9216 struct ipsec_test_flags flags;
9217 struct ipsec_test_data td_inb;
9219 memset(&flags, 0, sizeof(flags));
9221 test_ipsec_td_in_from_out(td_outb, &td_inb);
9223 return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9227 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9229 struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9230 struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9231 unsigned int i, nb_pkts = 1, pass_cnt = 0;
9234 if (flags->iv_gen ||
9235 flags->sa_expiry_pkts_soft ||
9236 flags->sa_expiry_pkts_hard)
9237 nb_pkts = IPSEC_TEST_PACKETS_MAX;
9239 for (i = 0; i < RTE_DIM(aead_list); i++) {
9240 test_ipsec_td_prepare(&aead_list[i],
9246 ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9248 if (ret == TEST_SKIPPED)
9251 if (ret == TEST_FAILED)
9254 test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9256 ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9258 if (ret == TEST_SKIPPED)
9261 if (ret == TEST_FAILED)
9264 if (flags->display_alg)
9265 test_ipsec_display_alg(&aead_list[i], NULL);
9271 return TEST_SUCCESS;
9273 return TEST_SKIPPED;
9277 test_ipsec_proto_display_list(const void *data __rte_unused)
9279 struct ipsec_test_flags flags;
9281 memset(&flags, 0, sizeof(flags));
9283 flags.display_alg = true;
9285 return test_ipsec_proto_all(&flags);
9289 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9291 struct ipsec_test_flags flags;
9293 memset(&flags, 0, sizeof(flags));
9295 flags.iv_gen = true;
9297 return test_ipsec_proto_all(&flags);
9301 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9303 struct ipsec_test_flags flags;
9305 memset(&flags, 0, sizeof(flags));
9307 flags.sa_expiry_pkts_soft = true;
9309 return test_ipsec_proto_all(&flags);
9313 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9315 struct ipsec_test_flags flags;
9317 memset(&flags, 0, sizeof(flags));
9319 flags.sa_expiry_pkts_hard = true;
9321 return test_ipsec_proto_all(&flags);
9325 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9327 struct ipsec_test_flags flags;
9329 memset(&flags, 0, sizeof(flags));
9331 flags.icv_corrupt = true;
9333 return test_ipsec_proto_all(&flags);
9337 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9339 struct ipsec_test_flags flags;
9341 memset(&flags, 0, sizeof(flags));
9343 flags.udp_encap = true;
9345 return test_ipsec_proto_all(&flags);
9349 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9351 struct ipsec_test_flags flags;
9353 memset(&flags, 0, sizeof(flags));
9355 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9357 return test_ipsec_proto_all(&flags);
9361 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9363 struct ipsec_test_flags flags;
9365 memset(&flags, 0, sizeof(flags));
9367 flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9369 return test_ipsec_proto_all(&flags);
9373 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9375 struct ipsec_test_flags flags;
9377 memset(&flags, 0, sizeof(flags));
9379 flags.udp_encap = true;
9380 flags.udp_ports_verify = true;
9382 return test_ipsec_proto_all(&flags);
9386 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9388 struct ipsec_test_flags flags;
9390 memset(&flags, 0, sizeof(flags));
9392 flags.ip_csum = true;
9394 return test_ipsec_proto_all(&flags);
9398 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9400 struct ipsec_test_flags flags;
9402 memset(&flags, 0, sizeof(flags));
9404 flags.l4_csum = true;
9406 return test_ipsec_proto_all(&flags);
9410 test_PDCP_PROTO_all(void)
9412 struct crypto_testsuite_params *ts_params = &testsuite_params;
9413 struct crypto_unittest_params *ut_params = &unittest_params;
9414 struct rte_cryptodev_info dev_info;
9417 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9418 uint64_t feat_flags = dev_info.feature_flags;
9420 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9421 return TEST_SKIPPED;
9423 /* Set action type */
9424 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9425 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9428 if (security_proto_supported(ut_params->type,
9429 RTE_SECURITY_PROTOCOL_PDCP) < 0)
9430 return TEST_SKIPPED;
9432 status = test_PDCP_PROTO_cplane_encap_all();
9433 status += test_PDCP_PROTO_cplane_decap_all();
9434 status += test_PDCP_PROTO_uplane_encap_all();
9435 status += test_PDCP_PROTO_uplane_decap_all();
9436 status += test_PDCP_PROTO_SGL_in_place_32B();
9437 status += test_PDCP_PROTO_SGL_oop_32B_128B();
9438 status += test_PDCP_PROTO_SGL_oop_32B_40B();
9439 status += test_PDCP_PROTO_SGL_oop_128B_32B();
9440 status += test_PDCP_SDAP_PROTO_encap_all();
9441 status += test_PDCP_SDAP_PROTO_decap_all();
9442 status += test_PDCP_PROTO_short_mac();
9447 return TEST_SUCCESS;
9451 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
9453 struct crypto_testsuite_params *ts_params = &testsuite_params;
9454 struct crypto_unittest_params *ut_params = &unittest_params;
9455 uint8_t *plaintext, *ciphertext;
9457 int32_t cipher_len, crc_len;
9458 uint32_t crc_data_len;
9459 int ret = TEST_SUCCESS;
9461 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9462 rte_cryptodev_get_sec_ctx(
9463 ts_params->valid_devs[0]);
9465 /* Verify the capabilities */
9466 struct rte_security_capability_idx sec_cap_idx;
9467 const struct rte_security_capability *sec_cap;
9468 const struct rte_cryptodev_capabilities *crypto_cap;
9469 const struct rte_cryptodev_symmetric_capability *sym_cap;
9472 sec_cap_idx.action = ut_params->type;
9473 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9474 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
9476 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9477 if (sec_cap == NULL)
9478 return TEST_SKIPPED;
9480 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9481 RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9482 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9483 crypto_cap->sym.xform_type ==
9484 RTE_CRYPTO_SYM_XFORM_CIPHER &&
9485 crypto_cap->sym.cipher.algo ==
9486 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9487 sym_cap = &crypto_cap->sym;
9488 if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9495 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9496 return TEST_SKIPPED;
9498 /* Setup source mbuf payload */
9499 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9500 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9501 rte_pktmbuf_tailroom(ut_params->ibuf));
9503 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9504 d_td->ciphertext.len);
9506 memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
9508 /* Setup cipher session parameters */
9509 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9510 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9511 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
9512 ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9513 ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9514 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9515 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9516 ut_params->cipher_xform.next = NULL;
9518 /* Setup DOCSIS session parameters */
9519 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
9521 struct rte_security_session_conf sess_conf = {
9522 .action_type = ut_params->type,
9523 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9524 .docsis = ut_params->docsis_xform,
9525 .crypto_xform = &ut_params->cipher_xform,
9528 /* Create security session */
9529 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9530 ts_params->session_mpool,
9531 ts_params->session_priv_mpool);
9533 if (!ut_params->sec_session) {
9534 printf("TestCase %s(%d) line %d: %s\n",
9535 __func__, i, __LINE__, "failed to allocate session");
9540 /* Generate crypto op data structure */
9541 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9542 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9543 if (!ut_params->op) {
9544 printf("TestCase %s(%d) line %d: %s\n",
9545 __func__, i, __LINE__,
9546 "failed to allocate symmetric crypto operation");
9551 /* Setup CRC operation parameters */
9552 crc_len = d_td->ciphertext.no_crc == false ?
9553 (d_td->ciphertext.len -
9554 d_td->ciphertext.crc_offset -
9555 RTE_ETHER_CRC_LEN) :
9557 crc_len = crc_len > 0 ? crc_len : 0;
9558 crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
9559 ut_params->op->sym->auth.data.length = crc_len;
9560 ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
9562 /* Setup cipher operation parameters */
9563 cipher_len = d_td->ciphertext.no_cipher == false ?
9564 (d_td->ciphertext.len -
9565 d_td->ciphertext.cipher_offset) :
9567 cipher_len = cipher_len > 0 ? cipher_len : 0;
9568 ut_params->op->sym->cipher.data.length = cipher_len;
9569 ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
9571 /* Setup cipher IV */
9572 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9573 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9575 /* Attach session to operation */
9576 rte_security_attach_session(ut_params->op, ut_params->sec_session);
9578 /* Set crypto operation mbufs */
9579 ut_params->op->sym->m_src = ut_params->ibuf;
9580 ut_params->op->sym->m_dst = NULL;
9582 /* Process crypto operation */
9583 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9585 printf("TestCase %s(%d) line %d: %s\n",
9586 __func__, i, __LINE__,
9587 "failed to process security crypto op");
9592 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9593 printf("TestCase %s(%d) line %d: %s\n",
9594 __func__, i, __LINE__, "crypto op processing failed");
9599 /* Validate plaintext */
9600 plaintext = ciphertext;
9602 if (memcmp(plaintext, d_td->plaintext.data,
9603 d_td->plaintext.len - crc_data_len)) {
9604 printf("TestCase %s(%d) line %d: %s\n",
9605 __func__, i, __LINE__, "plaintext not as expected\n");
9606 rte_hexdump(stdout, "expected", d_td->plaintext.data,
9607 d_td->plaintext.len);
9608 rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9614 rte_crypto_op_free(ut_params->op);
9615 ut_params->op = NULL;
9617 if (ut_params->sec_session)
9618 rte_security_session_destroy(ctx, ut_params->sec_session);
9619 ut_params->sec_session = NULL;
9621 rte_pktmbuf_free(ut_params->ibuf);
9622 ut_params->ibuf = NULL;
9628 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9630 struct crypto_testsuite_params *ts_params = &testsuite_params;
9631 struct crypto_unittest_params *ut_params = &unittest_params;
9632 uint8_t *plaintext, *ciphertext;
9634 int32_t cipher_len, crc_len;
9635 int ret = TEST_SUCCESS;
9637 struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9638 rte_cryptodev_get_sec_ctx(
9639 ts_params->valid_devs[0]);
9641 /* Verify the capabilities */
9642 struct rte_security_capability_idx sec_cap_idx;
9643 const struct rte_security_capability *sec_cap;
9644 const struct rte_cryptodev_capabilities *crypto_cap;
9645 const struct rte_cryptodev_symmetric_capability *sym_cap;
9648 sec_cap_idx.action = ut_params->type;
9649 sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9650 sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9652 sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9653 if (sec_cap == NULL)
9654 return TEST_SKIPPED;
9656 while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9657 RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9658 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9659 crypto_cap->sym.xform_type ==
9660 RTE_CRYPTO_SYM_XFORM_CIPHER &&
9661 crypto_cap->sym.cipher.algo ==
9662 RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9663 sym_cap = &crypto_cap->sym;
9664 if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9671 if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9672 return TEST_SKIPPED;
9674 /* Setup source mbuf payload */
9675 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9676 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9677 rte_pktmbuf_tailroom(ut_params->ibuf));
9679 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9680 d_td->plaintext.len);
9682 memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9684 /* Setup cipher session parameters */
9685 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9686 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9687 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9688 ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9689 ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9690 ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9691 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9692 ut_params->cipher_xform.next = NULL;
9694 /* Setup DOCSIS session parameters */
9695 ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9697 struct rte_security_session_conf sess_conf = {
9698 .action_type = ut_params->type,
9699 .protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9700 .docsis = ut_params->docsis_xform,
9701 .crypto_xform = &ut_params->cipher_xform,
9704 /* Create security session */
9705 ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9706 ts_params->session_mpool,
9707 ts_params->session_priv_mpool);
9709 if (!ut_params->sec_session) {
9710 printf("TestCase %s(%d) line %d: %s\n",
9711 __func__, i, __LINE__, "failed to allocate session");
9716 /* Generate crypto op data structure */
9717 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9718 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9719 if (!ut_params->op) {
9720 printf("TestCase %s(%d) line %d: %s\n",
9721 __func__, i, __LINE__,
9722 "failed to allocate security crypto operation");
9727 /* Setup CRC operation parameters */
9728 crc_len = d_td->plaintext.no_crc == false ?
9729 (d_td->plaintext.len -
9730 d_td->plaintext.crc_offset -
9731 RTE_ETHER_CRC_LEN) :
9733 crc_len = crc_len > 0 ? crc_len : 0;
9734 ut_params->op->sym->auth.data.length = crc_len;
9735 ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9737 /* Setup cipher operation parameters */
9738 cipher_len = d_td->plaintext.no_cipher == false ?
9739 (d_td->plaintext.len -
9740 d_td->plaintext.cipher_offset) :
9742 cipher_len = cipher_len > 0 ? cipher_len : 0;
9743 ut_params->op->sym->cipher.data.length = cipher_len;
9744 ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9746 /* Setup cipher IV */
9747 iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9748 rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9750 /* Attach session to operation */
9751 rte_security_attach_session(ut_params->op, ut_params->sec_session);
9753 /* Set crypto operation mbufs */
9754 ut_params->op->sym->m_src = ut_params->ibuf;
9755 ut_params->op->sym->m_dst = NULL;
9757 /* Process crypto operation */
9758 if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9760 printf("TestCase %s(%d) line %d: %s\n",
9761 __func__, i, __LINE__,
9762 "failed to process security crypto op");
9767 if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9768 printf("TestCase %s(%d) line %d: %s\n",
9769 __func__, i, __LINE__, "crypto op processing failed");
9774 /* Validate ciphertext */
9775 ciphertext = plaintext;
9777 if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9778 printf("TestCase %s(%d) line %d: %s\n",
9779 __func__, i, __LINE__, "ciphertext not as expected\n");
9780 rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9781 d_td->ciphertext.len);
9782 rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9788 rte_crypto_op_free(ut_params->op);
9789 ut_params->op = NULL;
9791 if (ut_params->sec_session)
9792 rte_security_session_destroy(ctx, ut_params->sec_session);
9793 ut_params->sec_session = NULL;
9795 rte_pktmbuf_free(ut_params->ibuf);
9796 ut_params->ibuf = NULL;
9801 #define TEST_DOCSIS_COUNT(func) do { \
9803 if (ret == TEST_SUCCESS) { \
9804 printf("\t%2d)", n++); \
9805 printf("+++++ PASSED:" #func"\n"); \
9807 } else if (ret == TEST_SKIPPED) { \
9808 printf("\t%2d)", n++); \
9809 printf("~~~~~ SKIPPED:" #func"\n"); \
9812 printf("\t%2d)", n++); \
9813 printf("----- FAILED:" #func"\n"); \
9819 test_DOCSIS_PROTO_uplink_all(void)
9821 int p = 0, s = 0, f = 0, n = 0;
9823 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9824 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9825 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9826 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9827 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9828 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9829 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9830 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9831 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9832 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9833 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9834 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9835 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9836 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9837 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9838 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9839 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9840 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9841 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9842 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9843 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9844 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9845 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9846 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9847 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9848 TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9851 printf("## %s: %d passed out of %d (%d skipped)\n",
9858 test_DOCSIS_PROTO_downlink_all(void)
9860 int p = 0, s = 0, f = 0, n = 0;
9862 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9863 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9864 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9865 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9866 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9867 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9868 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9869 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9870 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9871 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9872 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9873 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9874 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9875 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9876 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9877 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9878 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9879 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9880 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9881 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9882 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9883 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9884 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9885 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9886 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9887 TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9890 printf("## %s: %d passed out of %d (%d skipped)\n",
9897 test_DOCSIS_PROTO_all(void)
9899 struct crypto_testsuite_params *ts_params = &testsuite_params;
9900 struct crypto_unittest_params *ut_params = &unittest_params;
9901 struct rte_cryptodev_info dev_info;
9904 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9905 uint64_t feat_flags = dev_info.feature_flags;
9907 if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9908 return TEST_SKIPPED;
9910 /* Set action type */
9911 ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9912 RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9915 if (security_proto_supported(ut_params->type,
9916 RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9917 return TEST_SKIPPED;
9919 status = test_DOCSIS_PROTO_uplink_all();
9920 status += test_DOCSIS_PROTO_downlink_all();
9925 return TEST_SUCCESS;
9930 test_AES_GCM_authenticated_encryption_test_case_1(void)
9932 return test_authenticated_encryption(&gcm_test_case_1);
9936 test_AES_GCM_authenticated_encryption_test_case_2(void)
9938 return test_authenticated_encryption(&gcm_test_case_2);
9942 test_AES_GCM_authenticated_encryption_test_case_3(void)
9944 return test_authenticated_encryption(&gcm_test_case_3);
9948 test_AES_GCM_authenticated_encryption_test_case_4(void)
9950 return test_authenticated_encryption(&gcm_test_case_4);
9954 test_AES_GCM_authenticated_encryption_test_case_5(void)
9956 return test_authenticated_encryption(&gcm_test_case_5);
9960 test_AES_GCM_authenticated_encryption_test_case_6(void)
9962 return test_authenticated_encryption(&gcm_test_case_6);
9966 test_AES_GCM_authenticated_encryption_test_case_7(void)
9968 return test_authenticated_encryption(&gcm_test_case_7);
9972 test_AES_GCM_authenticated_encryption_test_case_8(void)
9974 return test_authenticated_encryption(&gcm_test_case_8);
9978 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9980 return test_authenticated_encryption(&gcm_J0_test_case_1);
9984 test_AES_GCM_auth_encryption_test_case_192_1(void)
9986 return test_authenticated_encryption(&gcm_test_case_192_1);
9990 test_AES_GCM_auth_encryption_test_case_192_2(void)
9992 return test_authenticated_encryption(&gcm_test_case_192_2);
9996 test_AES_GCM_auth_encryption_test_case_192_3(void)
9998 return test_authenticated_encryption(&gcm_test_case_192_3);
10002 test_AES_GCM_auth_encryption_test_case_192_4(void)
10004 return test_authenticated_encryption(&gcm_test_case_192_4);
10008 test_AES_GCM_auth_encryption_test_case_192_5(void)
10010 return test_authenticated_encryption(&gcm_test_case_192_5);
10014 test_AES_GCM_auth_encryption_test_case_192_6(void)
10016 return test_authenticated_encryption(&gcm_test_case_192_6);
10020 test_AES_GCM_auth_encryption_test_case_192_7(void)
10022 return test_authenticated_encryption(&gcm_test_case_192_7);
10026 test_AES_GCM_auth_encryption_test_case_256_1(void)
10028 return test_authenticated_encryption(&gcm_test_case_256_1);
10032 test_AES_GCM_auth_encryption_test_case_256_2(void)
10034 return test_authenticated_encryption(&gcm_test_case_256_2);
10038 test_AES_GCM_auth_encryption_test_case_256_3(void)
10040 return test_authenticated_encryption(&gcm_test_case_256_3);
10044 test_AES_GCM_auth_encryption_test_case_256_4(void)
10046 return test_authenticated_encryption(&gcm_test_case_256_4);
10050 test_AES_GCM_auth_encryption_test_case_256_5(void)
10052 return test_authenticated_encryption(&gcm_test_case_256_5);
10056 test_AES_GCM_auth_encryption_test_case_256_6(void)
10058 return test_authenticated_encryption(&gcm_test_case_256_6);
10062 test_AES_GCM_auth_encryption_test_case_256_7(void)
10064 return test_authenticated_encryption(&gcm_test_case_256_7);
10068 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10070 return test_authenticated_encryption(&gcm_test_case_aad_1);
10074 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10076 return test_authenticated_encryption(&gcm_test_case_aad_2);
10080 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10082 struct aead_test_data tdata;
10085 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10086 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10087 tdata.iv.data[0] += 1;
10088 res = test_authenticated_encryption(&tdata);
10089 if (res == TEST_SKIPPED)
10091 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10092 return TEST_SUCCESS;
10096 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10098 struct aead_test_data tdata;
10101 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10102 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10103 tdata.plaintext.data[0] += 1;
10104 res = test_authenticated_encryption(&tdata);
10105 if (res == TEST_SKIPPED)
10107 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10108 return TEST_SUCCESS;
10112 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10114 struct aead_test_data tdata;
10117 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10118 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10119 tdata.ciphertext.data[0] += 1;
10120 res = test_authenticated_encryption(&tdata);
10121 if (res == TEST_SKIPPED)
10123 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10124 return TEST_SUCCESS;
10128 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10130 struct aead_test_data tdata;
10133 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10134 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10135 tdata.aad.len += 1;
10136 res = test_authenticated_encryption(&tdata);
10137 if (res == TEST_SKIPPED)
10139 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10140 return TEST_SUCCESS;
10144 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10146 struct aead_test_data tdata;
10147 uint8_t aad[gcm_test_case_7.aad.len];
10150 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10151 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10152 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10154 tdata.aad.data = aad;
10155 res = test_authenticated_encryption(&tdata);
10156 if (res == TEST_SKIPPED)
10158 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10159 return TEST_SUCCESS;
10163 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10165 struct aead_test_data tdata;
10168 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10169 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10170 tdata.auth_tag.data[0] += 1;
10171 res = test_authenticated_encryption(&tdata);
10172 if (res == TEST_SKIPPED)
10174 TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10175 return TEST_SUCCESS;
10179 test_authenticated_decryption(const struct aead_test_data *tdata)
10181 struct crypto_testsuite_params *ts_params = &testsuite_params;
10182 struct crypto_unittest_params *ut_params = &unittest_params;
10185 uint8_t *plaintext;
10187 struct rte_cryptodev_info dev_info;
10189 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10190 uint64_t feat_flags = dev_info.feature_flags;
10192 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10193 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10194 printf("Device doesn't support RAW data-path APIs.\n");
10195 return TEST_SKIPPED;
10198 /* Verify the capabilities */
10199 struct rte_cryptodev_sym_capability_idx cap_idx;
10200 const struct rte_cryptodev_symmetric_capability *capability;
10201 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10202 cap_idx.algo.aead = tdata->algo;
10203 capability = rte_cryptodev_sym_capability_get(
10204 ts_params->valid_devs[0], &cap_idx);
10205 if (capability == NULL)
10206 return TEST_SKIPPED;
10207 if (rte_cryptodev_sym_capability_check_aead(
10208 capability, tdata->key.len, tdata->auth_tag.len,
10209 tdata->aad.len, tdata->iv.len))
10210 return TEST_SKIPPED;
10212 /* Create AEAD session */
10213 retval = create_aead_session(ts_params->valid_devs[0],
10215 RTE_CRYPTO_AEAD_OP_DECRYPT,
10216 tdata->key.data, tdata->key.len,
10217 tdata->aad.len, tdata->auth_tag.len,
10222 /* alloc mbuf and set payload */
10223 if (tdata->aad.len > MBUF_SIZE) {
10224 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10225 /* Populate full size of add data */
10226 for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10227 memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10229 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10231 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10232 rte_pktmbuf_tailroom(ut_params->ibuf));
10234 /* Create AEAD operation */
10235 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10239 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10241 ut_params->op->sym->m_src = ut_params->ibuf;
10243 /* Process crypto operation */
10244 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10245 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10246 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10247 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10248 ut_params->op, 0, 0, 0, 0);
10250 TEST_ASSERT_NOT_NULL(
10251 process_crypto_request(ts_params->valid_devs[0],
10252 ut_params->op), "failed to process sym crypto op");
10254 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10255 "crypto op processing failed");
10257 if (ut_params->op->sym->m_dst)
10258 plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10261 plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10263 ut_params->op->sym->cipher.data.offset);
10265 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10267 /* Validate obuf */
10268 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10270 tdata->plaintext.data,
10271 tdata->plaintext.len,
10272 "Plaintext data not as expected");
10274 TEST_ASSERT_EQUAL(ut_params->op->status,
10275 RTE_CRYPTO_OP_STATUS_SUCCESS,
10276 "Authentication failed");
10282 test_AES_GCM_authenticated_decryption_test_case_1(void)
10284 return test_authenticated_decryption(&gcm_test_case_1);
10288 test_AES_GCM_authenticated_decryption_test_case_2(void)
10290 return test_authenticated_decryption(&gcm_test_case_2);
10294 test_AES_GCM_authenticated_decryption_test_case_3(void)
10296 return test_authenticated_decryption(&gcm_test_case_3);
10300 test_AES_GCM_authenticated_decryption_test_case_4(void)
10302 return test_authenticated_decryption(&gcm_test_case_4);
10306 test_AES_GCM_authenticated_decryption_test_case_5(void)
10308 return test_authenticated_decryption(&gcm_test_case_5);
10312 test_AES_GCM_authenticated_decryption_test_case_6(void)
10314 return test_authenticated_decryption(&gcm_test_case_6);
10318 test_AES_GCM_authenticated_decryption_test_case_7(void)
10320 return test_authenticated_decryption(&gcm_test_case_7);
10324 test_AES_GCM_authenticated_decryption_test_case_8(void)
10326 return test_authenticated_decryption(&gcm_test_case_8);
10330 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
10332 return test_authenticated_decryption(&gcm_J0_test_case_1);
10336 test_AES_GCM_auth_decryption_test_case_192_1(void)
10338 return test_authenticated_decryption(&gcm_test_case_192_1);
10342 test_AES_GCM_auth_decryption_test_case_192_2(void)
10344 return test_authenticated_decryption(&gcm_test_case_192_2);
10348 test_AES_GCM_auth_decryption_test_case_192_3(void)
10350 return test_authenticated_decryption(&gcm_test_case_192_3);
10354 test_AES_GCM_auth_decryption_test_case_192_4(void)
10356 return test_authenticated_decryption(&gcm_test_case_192_4);
10360 test_AES_GCM_auth_decryption_test_case_192_5(void)
10362 return test_authenticated_decryption(&gcm_test_case_192_5);
10366 test_AES_GCM_auth_decryption_test_case_192_6(void)
10368 return test_authenticated_decryption(&gcm_test_case_192_6);
10372 test_AES_GCM_auth_decryption_test_case_192_7(void)
10374 return test_authenticated_decryption(&gcm_test_case_192_7);
10378 test_AES_GCM_auth_decryption_test_case_256_1(void)
10380 return test_authenticated_decryption(&gcm_test_case_256_1);
10384 test_AES_GCM_auth_decryption_test_case_256_2(void)
10386 return test_authenticated_decryption(&gcm_test_case_256_2);
10390 test_AES_GCM_auth_decryption_test_case_256_3(void)
10392 return test_authenticated_decryption(&gcm_test_case_256_3);
10396 test_AES_GCM_auth_decryption_test_case_256_4(void)
10398 return test_authenticated_decryption(&gcm_test_case_256_4);
10402 test_AES_GCM_auth_decryption_test_case_256_5(void)
10404 return test_authenticated_decryption(&gcm_test_case_256_5);
10408 test_AES_GCM_auth_decryption_test_case_256_6(void)
10410 return test_authenticated_decryption(&gcm_test_case_256_6);
10414 test_AES_GCM_auth_decryption_test_case_256_7(void)
10416 return test_authenticated_decryption(&gcm_test_case_256_7);
10420 test_AES_GCM_auth_decryption_test_case_aad_1(void)
10422 return test_authenticated_decryption(&gcm_test_case_aad_1);
10426 test_AES_GCM_auth_decryption_test_case_aad_2(void)
10428 return test_authenticated_decryption(&gcm_test_case_aad_2);
10432 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
10434 struct aead_test_data tdata;
10437 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10438 tdata.iv.data[0] += 1;
10439 res = test_authenticated_decryption(&tdata);
10440 if (res == TEST_SKIPPED)
10442 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10443 return TEST_SUCCESS;
10447 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
10449 struct aead_test_data tdata;
10452 RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10453 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10454 tdata.plaintext.data[0] += 1;
10455 res = test_authenticated_decryption(&tdata);
10456 if (res == TEST_SKIPPED)
10458 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10459 return TEST_SUCCESS;
10463 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
10465 struct aead_test_data tdata;
10468 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10469 tdata.ciphertext.data[0] += 1;
10470 res = test_authenticated_decryption(&tdata);
10471 if (res == TEST_SKIPPED)
10473 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10474 return TEST_SUCCESS;
10478 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
10480 struct aead_test_data tdata;
10483 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10484 tdata.aad.len += 1;
10485 res = test_authenticated_decryption(&tdata);
10486 if (res == TEST_SKIPPED)
10488 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10489 return TEST_SUCCESS;
10493 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
10495 struct aead_test_data tdata;
10496 uint8_t aad[gcm_test_case_7.aad.len];
10499 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10500 memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10502 tdata.aad.data = aad;
10503 res = test_authenticated_decryption(&tdata);
10504 if (res == TEST_SKIPPED)
10506 TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
10507 return TEST_SUCCESS;
10511 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
10513 struct aead_test_data tdata;
10516 memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10517 tdata.auth_tag.data[0] += 1;
10518 res = test_authenticated_decryption(&tdata);
10519 if (res == TEST_SKIPPED)
10521 TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
10522 return TEST_SUCCESS;
10526 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
10528 struct crypto_testsuite_params *ts_params = &testsuite_params;
10529 struct crypto_unittest_params *ut_params = &unittest_params;
10532 uint8_t *ciphertext, *auth_tag;
10533 uint16_t plaintext_pad_len;
10534 struct rte_cryptodev_info dev_info;
10536 /* Verify the capabilities */
10537 struct rte_cryptodev_sym_capability_idx cap_idx;
10538 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10539 cap_idx.algo.aead = tdata->algo;
10540 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10542 return TEST_SKIPPED;
10544 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10545 uint64_t feat_flags = dev_info.feature_flags;
10547 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10548 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
10549 return TEST_SKIPPED;
10551 /* not supported with CPU crypto */
10552 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10553 return TEST_SKIPPED;
10555 /* Create AEAD session */
10556 retval = create_aead_session(ts_params->valid_devs[0],
10558 RTE_CRYPTO_AEAD_OP_ENCRYPT,
10559 tdata->key.data, tdata->key.len,
10560 tdata->aad.len, tdata->auth_tag.len,
10565 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10566 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10568 /* clear mbuf payload */
10569 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10570 rte_pktmbuf_tailroom(ut_params->ibuf));
10571 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10572 rte_pktmbuf_tailroom(ut_params->obuf));
10574 /* Create AEAD operation */
10575 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10579 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10581 ut_params->op->sym->m_src = ut_params->ibuf;
10582 ut_params->op->sym->m_dst = ut_params->obuf;
10584 /* Process crypto operation */
10585 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10586 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10587 ut_params->op, 0, 0, 0, 0);
10589 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10590 ut_params->op), "failed to process sym crypto op");
10592 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10593 "crypto op processing failed");
10595 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10597 ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10598 ut_params->op->sym->cipher.data.offset);
10599 auth_tag = ciphertext + plaintext_pad_len;
10601 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10602 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10604 /* Validate obuf */
10605 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10607 tdata->ciphertext.data,
10608 tdata->ciphertext.len,
10609 "Ciphertext data not as expected");
10611 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10613 tdata->auth_tag.data,
10614 tdata->auth_tag.len,
10615 "Generated auth tag not as expected");
10622 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10624 return test_authenticated_encryption_oop(&gcm_test_case_5);
10628 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10630 struct crypto_testsuite_params *ts_params = &testsuite_params;
10631 struct crypto_unittest_params *ut_params = &unittest_params;
10634 uint8_t *plaintext;
10635 struct rte_cryptodev_info dev_info;
10637 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10638 uint64_t feat_flags = dev_info.feature_flags;
10640 /* Verify the capabilities */
10641 struct rte_cryptodev_sym_capability_idx cap_idx;
10642 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10643 cap_idx.algo.aead = tdata->algo;
10644 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10646 return TEST_SKIPPED;
10648 /* not supported with CPU crypto and raw data-path APIs*/
10649 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10650 global_api_test_type == CRYPTODEV_RAW_API_TEST)
10651 return TEST_SKIPPED;
10653 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10654 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10655 printf("Device does not support RAW data-path APIs.\n");
10656 return TEST_SKIPPED;
10659 /* Create AEAD session */
10660 retval = create_aead_session(ts_params->valid_devs[0],
10662 RTE_CRYPTO_AEAD_OP_DECRYPT,
10663 tdata->key.data, tdata->key.len,
10664 tdata->aad.len, tdata->auth_tag.len,
10669 /* alloc mbuf and set payload */
10670 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10671 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10673 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10674 rte_pktmbuf_tailroom(ut_params->ibuf));
10675 memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10676 rte_pktmbuf_tailroom(ut_params->obuf));
10678 /* Create AEAD operation */
10679 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10683 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10685 ut_params->op->sym->m_src = ut_params->ibuf;
10686 ut_params->op->sym->m_dst = ut_params->obuf;
10688 /* Process crypto operation */
10689 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10690 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10691 ut_params->op, 0, 0, 0, 0);
10693 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10694 ut_params->op), "failed to process sym crypto op");
10696 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10697 "crypto op processing failed");
10699 plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10700 ut_params->op->sym->cipher.data.offset);
10702 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10704 /* Validate obuf */
10705 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10707 tdata->plaintext.data,
10708 tdata->plaintext.len,
10709 "Plaintext data not as expected");
10711 TEST_ASSERT_EQUAL(ut_params->op->status,
10712 RTE_CRYPTO_OP_STATUS_SUCCESS,
10713 "Authentication failed");
10718 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10720 return test_authenticated_decryption_oop(&gcm_test_case_5);
10724 test_authenticated_encryption_sessionless(
10725 const struct aead_test_data *tdata)
10727 struct crypto_testsuite_params *ts_params = &testsuite_params;
10728 struct crypto_unittest_params *ut_params = &unittest_params;
10731 uint8_t *ciphertext, *auth_tag;
10732 uint16_t plaintext_pad_len;
10733 uint8_t key[tdata->key.len + 1];
10734 struct rte_cryptodev_info dev_info;
10736 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10737 uint64_t feat_flags = dev_info.feature_flags;
10739 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10740 printf("Device doesn't support Sessionless ops.\n");
10741 return TEST_SKIPPED;
10744 /* not supported with CPU crypto */
10745 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10746 return TEST_SKIPPED;
10748 /* Verify the capabilities */
10749 struct rte_cryptodev_sym_capability_idx cap_idx;
10750 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10751 cap_idx.algo.aead = tdata->algo;
10752 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10754 return TEST_SKIPPED;
10756 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10758 /* clear mbuf payload */
10759 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10760 rte_pktmbuf_tailroom(ut_params->ibuf));
10762 /* Create AEAD operation */
10763 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10767 /* Create GCM xform */
10768 memcpy(key, tdata->key.data, tdata->key.len);
10769 retval = create_aead_xform(ut_params->op,
10771 RTE_CRYPTO_AEAD_OP_ENCRYPT,
10772 key, tdata->key.len,
10773 tdata->aad.len, tdata->auth_tag.len,
10778 ut_params->op->sym->m_src = ut_params->ibuf;
10780 TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10781 RTE_CRYPTO_OP_SESSIONLESS,
10782 "crypto op session type not sessionless");
10784 /* Process crypto operation */
10785 TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10786 ut_params->op), "failed to process sym crypto op");
10788 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10790 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10791 "crypto op status not success");
10793 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10795 ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10796 ut_params->op->sym->cipher.data.offset);
10797 auth_tag = ciphertext + plaintext_pad_len;
10799 debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10800 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10802 /* Validate obuf */
10803 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10805 tdata->ciphertext.data,
10806 tdata->ciphertext.len,
10807 "Ciphertext data not as expected");
10809 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10811 tdata->auth_tag.data,
10812 tdata->auth_tag.len,
10813 "Generated auth tag not as expected");
10820 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10822 return test_authenticated_encryption_sessionless(
10827 test_authenticated_decryption_sessionless(
10828 const struct aead_test_data *tdata)
10830 struct crypto_testsuite_params *ts_params = &testsuite_params;
10831 struct crypto_unittest_params *ut_params = &unittest_params;
10834 uint8_t *plaintext;
10835 uint8_t key[tdata->key.len + 1];
10836 struct rte_cryptodev_info dev_info;
10838 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10839 uint64_t feat_flags = dev_info.feature_flags;
10841 if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10842 printf("Device doesn't support Sessionless ops.\n");
10843 return TEST_SKIPPED;
10846 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10847 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10848 printf("Device doesn't support RAW data-path APIs.\n");
10849 return TEST_SKIPPED;
10852 /* not supported with CPU crypto */
10853 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10854 return TEST_SKIPPED;
10856 /* Verify the capabilities */
10857 struct rte_cryptodev_sym_capability_idx cap_idx;
10858 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10859 cap_idx.algo.aead = tdata->algo;
10860 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10862 return TEST_SKIPPED;
10864 /* alloc mbuf and set payload */
10865 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10867 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10868 rte_pktmbuf_tailroom(ut_params->ibuf));
10870 /* Create AEAD operation */
10871 retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10875 /* Create AEAD xform */
10876 memcpy(key, tdata->key.data, tdata->key.len);
10877 retval = create_aead_xform(ut_params->op,
10879 RTE_CRYPTO_AEAD_OP_DECRYPT,
10880 key, tdata->key.len,
10881 tdata->aad.len, tdata->auth_tag.len,
10886 ut_params->op->sym->m_src = ut_params->ibuf;
10888 TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10889 RTE_CRYPTO_OP_SESSIONLESS,
10890 "crypto op session type not sessionless");
10892 /* Process crypto operation */
10893 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10894 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10895 ut_params->op, 0, 0, 0, 0);
10897 TEST_ASSERT_NOT_NULL(process_crypto_request(
10898 ts_params->valid_devs[0], ut_params->op),
10899 "failed to process sym crypto op");
10901 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10903 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10904 "crypto op status not success");
10906 plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10907 ut_params->op->sym->cipher.data.offset);
10909 debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10911 /* Validate obuf */
10912 TEST_ASSERT_BUFFERS_ARE_EQUAL(
10914 tdata->plaintext.data,
10915 tdata->plaintext.len,
10916 "Plaintext data not as expected");
10918 TEST_ASSERT_EQUAL(ut_params->op->status,
10919 RTE_CRYPTO_OP_STATUS_SUCCESS,
10920 "Authentication failed");
10925 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10927 return test_authenticated_decryption_sessionless(
10932 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10934 return test_authenticated_encryption(&ccm_test_case_128_1);
10938 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10940 return test_authenticated_encryption(&ccm_test_case_128_2);
10944 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10946 return test_authenticated_encryption(&ccm_test_case_128_3);
10950 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10952 return test_authenticated_decryption(&ccm_test_case_128_1);
10956 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10958 return test_authenticated_decryption(&ccm_test_case_128_2);
10962 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10964 return test_authenticated_decryption(&ccm_test_case_128_3);
10968 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10970 return test_authenticated_encryption(&ccm_test_case_192_1);
10974 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10976 return test_authenticated_encryption(&ccm_test_case_192_2);
10980 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10982 return test_authenticated_encryption(&ccm_test_case_192_3);
10986 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10988 return test_authenticated_decryption(&ccm_test_case_192_1);
10992 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10994 return test_authenticated_decryption(&ccm_test_case_192_2);
10998 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11000 return test_authenticated_decryption(&ccm_test_case_192_3);
11004 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11006 return test_authenticated_encryption(&ccm_test_case_256_1);
11010 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11012 return test_authenticated_encryption(&ccm_test_case_256_2);
11016 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11018 return test_authenticated_encryption(&ccm_test_case_256_3);
11022 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11024 return test_authenticated_decryption(&ccm_test_case_256_1);
11028 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11030 return test_authenticated_decryption(&ccm_test_case_256_2);
11034 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11036 return test_authenticated_decryption(&ccm_test_case_256_3);
11042 struct crypto_testsuite_params *ts_params = &testsuite_params;
11043 struct rte_cryptodev_stats stats;
11045 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11046 return TEST_SKIPPED;
11048 /* Verify the capabilities */
11049 struct rte_cryptodev_sym_capability_idx cap_idx;
11050 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11051 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11052 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11054 return TEST_SKIPPED;
11055 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11056 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11057 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11059 return TEST_SKIPPED;
11061 if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11063 return TEST_SKIPPED;
11065 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11066 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11067 &stats) == -ENODEV),
11068 "rte_cryptodev_stats_get invalid dev failed");
11069 TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11070 "rte_cryptodev_stats_get invalid Param failed");
11072 /* Test expected values */
11073 test_AES_CBC_HMAC_SHA1_encrypt_digest();
11074 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11076 "rte_cryptodev_stats_get failed");
11077 TEST_ASSERT((stats.enqueued_count == 1),
11078 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11079 TEST_ASSERT((stats.dequeued_count == 1),
11080 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11081 TEST_ASSERT((stats.enqueue_err_count == 0),
11082 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11083 TEST_ASSERT((stats.dequeue_err_count == 0),
11084 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11086 /* invalid device but should ignore and not reset device stats*/
11087 rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11088 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11090 "rte_cryptodev_stats_get failed");
11091 TEST_ASSERT((stats.enqueued_count == 1),
11092 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11094 /* check that a valid reset clears stats */
11095 rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11096 TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11098 "rte_cryptodev_stats_get failed");
11099 TEST_ASSERT((stats.enqueued_count == 0),
11100 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11101 TEST_ASSERT((stats.dequeued_count == 0),
11102 "rte_cryptodev_stats_get returned unexpected enqueued stat");
11104 return TEST_SUCCESS;
11107 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11108 struct crypto_unittest_params *ut_params,
11109 enum rte_crypto_auth_operation op,
11110 const struct HMAC_MD5_vector *test_case)
11114 memcpy(key, test_case->key.data, test_case->key.len);
11116 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11117 ut_params->auth_xform.next = NULL;
11118 ut_params->auth_xform.auth.op = op;
11120 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11122 ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11123 ut_params->auth_xform.auth.key.length = test_case->key.len;
11124 ut_params->auth_xform.auth.key.data = key;
11126 ut_params->sess = rte_cryptodev_sym_session_create(
11127 ts_params->session_mpool);
11129 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11130 ut_params->sess, &ut_params->auth_xform,
11131 ts_params->session_priv_mpool);
11133 if (ut_params->sess == NULL)
11134 return TEST_FAILED;
11136 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11138 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11139 rte_pktmbuf_tailroom(ut_params->ibuf));
11144 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11145 const struct HMAC_MD5_vector *test_case,
11146 uint8_t **plaintext)
11148 uint16_t plaintext_pad_len;
11150 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11152 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11155 *plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11156 plaintext_pad_len);
11157 memcpy(*plaintext, test_case->plaintext.data,
11158 test_case->plaintext.len);
11160 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11161 ut_params->ibuf, MD5_DIGEST_LEN);
11162 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11163 "no room to append digest");
11164 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11165 ut_params->ibuf, plaintext_pad_len);
11167 if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11168 rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11169 test_case->auth_tag.len);
11172 sym_op->auth.data.offset = 0;
11173 sym_op->auth.data.length = test_case->plaintext.len;
11175 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11176 ut_params->op->sym->m_src = ut_params->ibuf;
11182 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11184 uint16_t plaintext_pad_len;
11185 uint8_t *plaintext, *auth_tag;
11187 struct crypto_testsuite_params *ts_params = &testsuite_params;
11188 struct crypto_unittest_params *ut_params = &unittest_params;
11189 struct rte_cryptodev_info dev_info;
11191 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11192 uint64_t feat_flags = dev_info.feature_flags;
11194 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11195 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11196 printf("Device doesn't support RAW data-path APIs.\n");
11197 return TEST_SKIPPED;
11200 /* Verify the capabilities */
11201 struct rte_cryptodev_sym_capability_idx cap_idx;
11202 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11203 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11204 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11206 return TEST_SKIPPED;
11208 if (MD5_HMAC_create_session(ts_params, ut_params,
11209 RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11210 return TEST_FAILED;
11212 /* Generate Crypto op data structure */
11213 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11214 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11215 TEST_ASSERT_NOT_NULL(ut_params->op,
11216 "Failed to allocate symmetric crypto operation struct");
11218 plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11221 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11222 return TEST_FAILED;
11224 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11225 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11227 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11228 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11229 ut_params->op, 0, 1, 0, 0);
11231 TEST_ASSERT_NOT_NULL(
11232 process_crypto_request(ts_params->valid_devs[0],
11234 "failed to process sym crypto op");
11236 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11237 "crypto op processing failed");
11239 if (ut_params->op->sym->m_dst) {
11240 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11241 uint8_t *, plaintext_pad_len);
11243 auth_tag = plaintext + plaintext_pad_len;
11246 TEST_ASSERT_BUFFERS_ARE_EQUAL(
11248 test_case->auth_tag.data,
11249 test_case->auth_tag.len,
11250 "HMAC_MD5 generated tag not as expected");
11252 return TEST_SUCCESS;
11256 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11258 uint8_t *plaintext;
11260 struct crypto_testsuite_params *ts_params = &testsuite_params;
11261 struct crypto_unittest_params *ut_params = &unittest_params;
11262 struct rte_cryptodev_info dev_info;
11264 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11265 uint64_t feat_flags = dev_info.feature_flags;
11267 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11268 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11269 printf("Device doesn't support RAW data-path APIs.\n");
11270 return TEST_SKIPPED;
11273 /* Verify the capabilities */
11274 struct rte_cryptodev_sym_capability_idx cap_idx;
11275 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11276 cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11277 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11279 return TEST_SKIPPED;
11281 if (MD5_HMAC_create_session(ts_params, ut_params,
11282 RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11283 return TEST_FAILED;
11286 /* Generate Crypto op data structure */
11287 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11288 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11289 TEST_ASSERT_NOT_NULL(ut_params->op,
11290 "Failed to allocate symmetric crypto operation struct");
11292 if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11293 return TEST_FAILED;
11295 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11296 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11298 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11299 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11300 ut_params->op, 0, 1, 0, 0);
11302 TEST_ASSERT_NOT_NULL(
11303 process_crypto_request(ts_params->valid_devs[0],
11305 "failed to process sym crypto op");
11307 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11308 "HMAC_MD5 crypto op processing failed");
11310 return TEST_SUCCESS;
11314 test_MD5_HMAC_generate_case_1(void)
11316 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
11320 test_MD5_HMAC_verify_case_1(void)
11322 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
11326 test_MD5_HMAC_generate_case_2(void)
11328 return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
11332 test_MD5_HMAC_verify_case_2(void)
11334 return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
11338 test_multi_session(void)
11340 struct crypto_testsuite_params *ts_params = &testsuite_params;
11341 struct crypto_unittest_params *ut_params = &unittest_params;
11343 struct rte_cryptodev_info dev_info;
11344 struct rte_cryptodev_sym_session **sessions;
11348 /* Verify the capabilities */
11349 struct rte_cryptodev_sym_capability_idx cap_idx;
11350 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11351 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11352 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11354 return TEST_SKIPPED;
11355 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11356 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11357 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11359 return TEST_SKIPPED;
11361 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
11362 aes_cbc_key, hmac_sha512_key);
11365 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11367 sessions = rte_malloc(NULL,
11368 sizeof(struct rte_cryptodev_sym_session *) *
11369 (MAX_NB_SESSIONS + 1), 0);
11371 /* Create multiple crypto sessions*/
11372 for (i = 0; i < MAX_NB_SESSIONS; i++) {
11374 sessions[i] = rte_cryptodev_sym_session_create(
11375 ts_params->session_mpool);
11377 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11378 sessions[i], &ut_params->auth_xform,
11379 ts_params->session_priv_mpool);
11380 TEST_ASSERT_NOT_NULL(sessions[i],
11381 "Session creation failed at session number %u",
11384 /* Attempt to send a request on each session */
11385 TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
11389 catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
11390 catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
11392 "Failed to perform decrypt on request number %u.", i);
11393 /* free crypto operation structure */
11395 rte_crypto_op_free(ut_params->op);
11398 * free mbuf - both obuf and ibuf are usually the same,
11399 * so check if they point at the same address is necessary,
11400 * to avoid freeing the mbuf twice.
11402 if (ut_params->obuf) {
11403 rte_pktmbuf_free(ut_params->obuf);
11404 if (ut_params->ibuf == ut_params->obuf)
11405 ut_params->ibuf = 0;
11406 ut_params->obuf = 0;
11408 if (ut_params->ibuf) {
11409 rte_pktmbuf_free(ut_params->ibuf);
11410 ut_params->ibuf = 0;
11414 sessions[i] = NULL;
11415 /* Next session create should fail */
11416 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11417 sessions[i], &ut_params->auth_xform,
11418 ts_params->session_priv_mpool);
11419 TEST_ASSERT_NULL(sessions[i],
11420 "Session creation succeeded unexpectedly!");
11422 for (i = 0; i < MAX_NB_SESSIONS; i++) {
11423 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11425 rte_cryptodev_sym_session_free(sessions[i]);
11428 rte_free(sessions);
11430 return TEST_SUCCESS;
11433 struct multi_session_params {
11434 struct crypto_unittest_params ut_params;
11435 uint8_t *cipher_key;
11437 const uint8_t *cipher;
11438 const uint8_t *digest;
11442 #define MB_SESSION_NUMBER 3
11445 test_multi_session_random_usage(void)
11447 struct crypto_testsuite_params *ts_params = &testsuite_params;
11448 struct rte_cryptodev_info dev_info;
11449 struct rte_cryptodev_sym_session **sessions;
11451 struct multi_session_params ut_paramz[] = {
11454 .cipher_key = ms_aes_cbc_key0,
11455 .hmac_key = ms_hmac_key0,
11456 .cipher = ms_aes_cbc_cipher0,
11457 .digest = ms_hmac_digest0,
11458 .iv = ms_aes_cbc_iv0
11461 .cipher_key = ms_aes_cbc_key1,
11462 .hmac_key = ms_hmac_key1,
11463 .cipher = ms_aes_cbc_cipher1,
11464 .digest = ms_hmac_digest1,
11465 .iv = ms_aes_cbc_iv1
11468 .cipher_key = ms_aes_cbc_key2,
11469 .hmac_key = ms_hmac_key2,
11470 .cipher = ms_aes_cbc_cipher2,
11471 .digest = ms_hmac_digest2,
11472 .iv = ms_aes_cbc_iv2
11477 /* Verify the capabilities */
11478 struct rte_cryptodev_sym_capability_idx cap_idx;
11479 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11480 cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
11481 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11483 return TEST_SKIPPED;
11484 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11485 cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11486 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11488 return TEST_SKIPPED;
11490 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11492 sessions = rte_malloc(NULL,
11493 (sizeof(struct rte_cryptodev_sym_session *)
11494 * MAX_NB_SESSIONS) + 1, 0);
11496 for (i = 0; i < MB_SESSION_NUMBER; i++) {
11497 sessions[i] = rte_cryptodev_sym_session_create(
11498 ts_params->session_mpool);
11500 rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
11501 sizeof(struct crypto_unittest_params));
11503 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
11504 &ut_paramz[i].ut_params,
11505 ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
11507 /* Create multiple crypto sessions*/
11508 rte_cryptodev_sym_session_init(
11509 ts_params->valid_devs[0],
11511 &ut_paramz[i].ut_params.auth_xform,
11512 ts_params->session_priv_mpool);
11514 TEST_ASSERT_NOT_NULL(sessions[i],
11515 "Session creation failed at session number %u",
11521 for (i = 0; i < 40000; i++) {
11523 j = rand() % MB_SESSION_NUMBER;
11525 TEST_ASSERT_SUCCESS(
11526 test_AES_CBC_HMAC_SHA512_decrypt_perform(
11528 &ut_paramz[j].ut_params,
11529 ts_params, ut_paramz[j].cipher,
11530 ut_paramz[j].digest,
11532 "Failed to perform decrypt on request number %u.", i);
11534 if (ut_paramz[j].ut_params.op)
11535 rte_crypto_op_free(ut_paramz[j].ut_params.op);
11538 * free mbuf - both obuf and ibuf are usually the same,
11539 * so check if they point at the same address is necessary,
11540 * to avoid freeing the mbuf twice.
11542 if (ut_paramz[j].ut_params.obuf) {
11543 rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
11544 if (ut_paramz[j].ut_params.ibuf
11545 == ut_paramz[j].ut_params.obuf)
11546 ut_paramz[j].ut_params.ibuf = 0;
11547 ut_paramz[j].ut_params.obuf = 0;
11549 if (ut_paramz[j].ut_params.ibuf) {
11550 rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
11551 ut_paramz[j].ut_params.ibuf = 0;
11555 for (i = 0; i < MB_SESSION_NUMBER; i++) {
11556 rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
11558 rte_cryptodev_sym_session_free(sessions[i]);
11561 rte_free(sessions);
11563 return TEST_SUCCESS;
11566 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
11567 0xab, 0xab, 0xab, 0xab,
11568 0xab, 0xab, 0xab, 0xab,
11569 0xab, 0xab, 0xab, 0xab};
11572 test_null_invalid_operation(void)
11574 struct crypto_testsuite_params *ts_params = &testsuite_params;
11575 struct crypto_unittest_params *ut_params = &unittest_params;
11578 /* This test is for NULL PMD only */
11579 if (gbl_driver_id != rte_cryptodev_driver_id_get(
11580 RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11581 return TEST_SKIPPED;
11583 /* Setup Cipher Parameters */
11584 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11585 ut_params->cipher_xform.next = NULL;
11587 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
11588 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11590 ut_params->sess = rte_cryptodev_sym_session_create(
11591 ts_params->session_mpool);
11593 /* Create Crypto session*/
11594 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11595 ut_params->sess, &ut_params->cipher_xform,
11596 ts_params->session_priv_mpool);
11597 TEST_ASSERT(ret < 0,
11598 "Session creation succeeded unexpectedly");
11601 /* Setup HMAC Parameters */
11602 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11603 ut_params->auth_xform.next = NULL;
11605 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
11606 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11608 ut_params->sess = rte_cryptodev_sym_session_create(
11609 ts_params->session_mpool);
11611 /* Create Crypto session*/
11612 ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11613 ut_params->sess, &ut_params->auth_xform,
11614 ts_params->session_priv_mpool);
11615 TEST_ASSERT(ret < 0,
11616 "Session creation succeeded unexpectedly");
11618 return TEST_SUCCESS;
11622 #define NULL_BURST_LENGTH (32)
11625 test_null_burst_operation(void)
11627 struct crypto_testsuite_params *ts_params = &testsuite_params;
11628 struct crypto_unittest_params *ut_params = &unittest_params;
11630 unsigned i, burst_len = NULL_BURST_LENGTH;
11632 struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11633 struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11635 /* This test is for NULL PMD only */
11636 if (gbl_driver_id != rte_cryptodev_driver_id_get(
11637 RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11638 return TEST_SKIPPED;
11640 /* Setup Cipher Parameters */
11641 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11642 ut_params->cipher_xform.next = &ut_params->auth_xform;
11644 ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11645 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11647 /* Setup HMAC Parameters */
11648 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11649 ut_params->auth_xform.next = NULL;
11651 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11652 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11654 ut_params->sess = rte_cryptodev_sym_session_create(
11655 ts_params->session_mpool);
11657 /* Create Crypto session*/
11658 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11659 ut_params->sess, &ut_params->cipher_xform,
11660 ts_params->session_priv_mpool);
11661 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11663 TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11664 RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11665 burst_len, "failed to generate burst of crypto ops");
11667 /* Generate an operation for each mbuf in burst */
11668 for (i = 0; i < burst_len; i++) {
11669 struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11671 TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11673 unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11677 rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11679 burst[i]->sym->m_src = m;
11682 /* Process crypto operation */
11683 TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11684 0, burst, burst_len),
11686 "Error enqueuing burst");
11688 TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11689 0, burst_dequeued, burst_len),
11691 "Error dequeuing burst");
11694 for (i = 0; i < burst_len; i++) {
11696 *rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11697 *rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11699 "data not as expected");
11701 rte_pktmbuf_free(burst[i]->sym->m_src);
11702 rte_crypto_op_free(burst[i]);
11705 return TEST_SUCCESS;
11709 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11710 uint16_t nb_ops, void *user_param)
11712 RTE_SET_USED(dev_id);
11713 RTE_SET_USED(qp_id);
11715 RTE_SET_USED(user_param);
11717 printf("crypto enqueue callback called\n");
11722 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11723 uint16_t nb_ops, void *user_param)
11725 RTE_SET_USED(dev_id);
11726 RTE_SET_USED(qp_id);
11728 RTE_SET_USED(user_param);
11730 printf("crypto dequeue callback called\n");
11735 * Thread using enqueue/dequeue callback with RCU.
11738 test_enqdeq_callback_thread(void *arg)
11741 /* DP thread calls rte_cryptodev_enqueue_burst()/
11742 * rte_cryptodev_dequeue_burst() and invokes callback.
11744 test_null_burst_operation();
11749 test_enq_callback_setup(void)
11751 struct crypto_testsuite_params *ts_params = &testsuite_params;
11752 struct rte_cryptodev_info dev_info;
11753 struct rte_cryptodev_qp_conf qp_conf = {
11754 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11757 struct rte_cryptodev_cb *cb;
11758 uint16_t qp_id = 0;
11760 /* Stop the device in case it's started so it can be configured */
11761 rte_cryptodev_stop(ts_params->valid_devs[0]);
11763 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11765 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11767 "Failed to configure cryptodev %u",
11768 ts_params->valid_devs[0]);
11770 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11771 qp_conf.mp_session = ts_params->session_mpool;
11772 qp_conf.mp_session_private = ts_params->session_priv_mpool;
11774 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11775 ts_params->valid_devs[0], qp_id, &qp_conf,
11776 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11778 "rte_cryptodev_queue_pair_setup: num_inflights "
11779 "%u on qp %u on cryptodev %u",
11780 qp_conf.nb_descriptors, qp_id,
11781 ts_params->valid_devs[0]);
11783 /* Test with invalid crypto device */
11784 cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11785 qp_id, test_enq_callback, NULL);
11786 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11787 "cryptodev %u did not fail",
11788 qp_id, RTE_CRYPTO_MAX_DEVS);
11790 /* Test with invalid queue pair */
11791 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11792 dev_info.max_nb_queue_pairs + 1,
11793 test_enq_callback, NULL);
11794 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11795 "cryptodev %u did not fail",
11796 dev_info.max_nb_queue_pairs + 1,
11797 ts_params->valid_devs[0]);
11799 /* Test with NULL callback */
11800 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11801 qp_id, NULL, NULL);
11802 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11803 "cryptodev %u did not fail",
11804 qp_id, ts_params->valid_devs[0]);
11806 /* Test with valid configuration */
11807 cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11808 qp_id, test_enq_callback, NULL);
11809 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11810 "qp %u on cryptodev %u",
11811 qp_id, ts_params->valid_devs[0]);
11813 rte_cryptodev_start(ts_params->valid_devs[0]);
11815 /* Launch a thread */
11816 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11817 rte_get_next_lcore(-1, 1, 0));
11819 /* Wait until reader exited. */
11820 rte_eal_mp_wait_lcore();
11822 /* Test with invalid crypto device */
11823 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11824 RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11825 "Expected call to fail as crypto device is invalid");
11827 /* Test with invalid queue pair */
11828 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11829 ts_params->valid_devs[0],
11830 dev_info.max_nb_queue_pairs + 1, cb),
11831 "Expected call to fail as queue pair is invalid");
11833 /* Test with NULL callback */
11834 TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11835 ts_params->valid_devs[0], qp_id, NULL),
11836 "Expected call to fail as callback is NULL");
11838 /* Test with valid configuration */
11839 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11840 ts_params->valid_devs[0], qp_id, cb),
11841 "Failed test to remove callback on "
11842 "qp %u on cryptodev %u",
11843 qp_id, ts_params->valid_devs[0]);
11845 return TEST_SUCCESS;
11849 test_deq_callback_setup(void)
11851 struct crypto_testsuite_params *ts_params = &testsuite_params;
11852 struct rte_cryptodev_info dev_info;
11853 struct rte_cryptodev_qp_conf qp_conf = {
11854 .nb_descriptors = MAX_NUM_OPS_INFLIGHT
11857 struct rte_cryptodev_cb *cb;
11858 uint16_t qp_id = 0;
11860 /* Stop the device in case it's started so it can be configured */
11861 rte_cryptodev_stop(ts_params->valid_devs[0]);
11863 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11865 TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11867 "Failed to configure cryptodev %u",
11868 ts_params->valid_devs[0]);
11870 qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11871 qp_conf.mp_session = ts_params->session_mpool;
11872 qp_conf.mp_session_private = ts_params->session_priv_mpool;
11874 TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11875 ts_params->valid_devs[0], qp_id, &qp_conf,
11876 rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11878 "rte_cryptodev_queue_pair_setup: num_inflights "
11879 "%u on qp %u on cryptodev %u",
11880 qp_conf.nb_descriptors, qp_id,
11881 ts_params->valid_devs[0]);
11883 /* Test with invalid crypto device */
11884 cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11885 qp_id, test_deq_callback, NULL);
11886 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11887 "cryptodev %u did not fail",
11888 qp_id, RTE_CRYPTO_MAX_DEVS);
11890 /* Test with invalid queue pair */
11891 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11892 dev_info.max_nb_queue_pairs + 1,
11893 test_deq_callback, NULL);
11894 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11895 "cryptodev %u did not fail",
11896 dev_info.max_nb_queue_pairs + 1,
11897 ts_params->valid_devs[0]);
11899 /* Test with NULL callback */
11900 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11901 qp_id, NULL, NULL);
11902 TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11903 "cryptodev %u did not fail",
11904 qp_id, ts_params->valid_devs[0]);
11906 /* Test with valid configuration */
11907 cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11908 qp_id, test_deq_callback, NULL);
11909 TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11910 "qp %u on cryptodev %u",
11911 qp_id, ts_params->valid_devs[0]);
11913 rte_cryptodev_start(ts_params->valid_devs[0]);
11915 /* Launch a thread */
11916 rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11917 rte_get_next_lcore(-1, 1, 0));
11919 /* Wait until reader exited. */
11920 rte_eal_mp_wait_lcore();
11922 /* Test with invalid crypto device */
11923 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11924 RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11925 "Expected call to fail as crypto device is invalid");
11927 /* Test with invalid queue pair */
11928 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11929 ts_params->valid_devs[0],
11930 dev_info.max_nb_queue_pairs + 1, cb),
11931 "Expected call to fail as queue pair is invalid");
11933 /* Test with NULL callback */
11934 TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11935 ts_params->valid_devs[0], qp_id, NULL),
11936 "Expected call to fail as callback is NULL");
11938 /* Test with valid configuration */
11939 TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11940 ts_params->valid_devs[0], qp_id, cb),
11941 "Failed test to remove callback on "
11942 "qp %u on cryptodev %u",
11943 qp_id, ts_params->valid_devs[0]);
11945 return TEST_SUCCESS;
11949 generate_gmac_large_plaintext(uint8_t *data)
11953 for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11954 memcpy(&data[i], &data[0], 32);
11958 create_gmac_operation(enum rte_crypto_auth_operation op,
11959 const struct gmac_test_data *tdata)
11961 struct crypto_testsuite_params *ts_params = &testsuite_params;
11962 struct crypto_unittest_params *ut_params = &unittest_params;
11963 struct rte_crypto_sym_op *sym_op;
11965 uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11967 /* Generate Crypto op data structure */
11968 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11969 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11970 TEST_ASSERT_NOT_NULL(ut_params->op,
11971 "Failed to allocate symmetric crypto operation struct");
11973 sym_op = ut_params->op->sym;
11975 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11976 ut_params->ibuf, tdata->gmac_tag.len);
11977 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11978 "no room to append digest");
11980 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11981 ut_params->ibuf, plaintext_pad_len);
11983 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11984 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11985 tdata->gmac_tag.len);
11986 debug_hexdump(stdout, "digest:",
11987 sym_op->auth.digest.data,
11988 tdata->gmac_tag.len);
11991 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11992 uint8_t *, IV_OFFSET);
11994 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11996 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11998 sym_op->cipher.data.length = 0;
11999 sym_op->cipher.data.offset = 0;
12001 sym_op->auth.data.offset = 0;
12002 sym_op->auth.data.length = tdata->plaintext.len;
12008 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12009 const struct gmac_test_data *tdata,
12010 void *digest_mem, uint64_t digest_phys)
12012 struct crypto_testsuite_params *ts_params = &testsuite_params;
12013 struct crypto_unittest_params *ut_params = &unittest_params;
12014 struct rte_crypto_sym_op *sym_op;
12016 /* Generate Crypto op data structure */
12017 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12018 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12019 TEST_ASSERT_NOT_NULL(ut_params->op,
12020 "Failed to allocate symmetric crypto operation struct");
12022 sym_op = ut_params->op->sym;
12024 sym_op->auth.digest.data = digest_mem;
12025 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12026 "no room to append digest");
12028 sym_op->auth.digest.phys_addr = digest_phys;
12030 if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12031 rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12032 tdata->gmac_tag.len);
12033 debug_hexdump(stdout, "digest:",
12034 sym_op->auth.digest.data,
12035 tdata->gmac_tag.len);
12038 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12039 uint8_t *, IV_OFFSET);
12041 rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12043 debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12045 sym_op->cipher.data.length = 0;
12046 sym_op->cipher.data.offset = 0;
12048 sym_op->auth.data.offset = 0;
12049 sym_op->auth.data.length = tdata->plaintext.len;
12054 static int create_gmac_session(uint8_t dev_id,
12055 const struct gmac_test_data *tdata,
12056 enum rte_crypto_auth_operation auth_op)
12058 uint8_t auth_key[tdata->key.len];
12060 struct crypto_testsuite_params *ts_params = &testsuite_params;
12061 struct crypto_unittest_params *ut_params = &unittest_params;
12063 memcpy(auth_key, tdata->key.data, tdata->key.len);
12065 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12066 ut_params->auth_xform.next = NULL;
12068 ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12069 ut_params->auth_xform.auth.op = auth_op;
12070 ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12071 ut_params->auth_xform.auth.key.length = tdata->key.len;
12072 ut_params->auth_xform.auth.key.data = auth_key;
12073 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12074 ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12077 ut_params->sess = rte_cryptodev_sym_session_create(
12078 ts_params->session_mpool);
12080 rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12081 &ut_params->auth_xform,
12082 ts_params->session_priv_mpool);
12084 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12090 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12092 struct crypto_testsuite_params *ts_params = &testsuite_params;
12093 struct crypto_unittest_params *ut_params = &unittest_params;
12094 struct rte_cryptodev_info dev_info;
12096 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12097 uint64_t feat_flags = dev_info.feature_flags;
12099 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12100 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12101 printf("Device doesn't support RAW data-path APIs.\n");
12102 return TEST_SKIPPED;
12107 uint8_t *auth_tag, *plaintext;
12108 uint16_t plaintext_pad_len;
12110 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12111 "No GMAC length in the source data");
12113 /* Verify the capabilities */
12114 struct rte_cryptodev_sym_capability_idx cap_idx;
12115 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12116 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12117 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12119 return TEST_SKIPPED;
12121 retval = create_gmac_session(ts_params->valid_devs[0],
12122 tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12127 if (tdata->plaintext.len > MBUF_SIZE)
12128 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12130 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12131 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12132 "Failed to allocate input buffer in mempool");
12134 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12135 rte_pktmbuf_tailroom(ut_params->ibuf));
12137 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12139 * Runtime generate the large plain text instead of use hard code
12140 * plain text vector. It is done to avoid create huge source file
12141 * with the test vector.
12143 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12144 generate_gmac_large_plaintext(tdata->plaintext.data);
12146 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12147 plaintext_pad_len);
12148 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12150 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12151 debug_hexdump(stdout, "plaintext:", plaintext,
12152 tdata->plaintext.len);
12154 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12160 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12162 ut_params->op->sym->m_src = ut_params->ibuf;
12164 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12165 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12167 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12168 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12169 ut_params->op, 0, 1, 0, 0);
12171 TEST_ASSERT_NOT_NULL(
12172 process_crypto_request(ts_params->valid_devs[0],
12173 ut_params->op), "failed to process sym crypto op");
12175 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12176 "crypto op processing failed");
12178 if (ut_params->op->sym->m_dst) {
12179 auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12180 uint8_t *, plaintext_pad_len);
12182 auth_tag = plaintext + plaintext_pad_len;
12185 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12187 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12189 tdata->gmac_tag.data,
12190 tdata->gmac_tag.len,
12191 "GMAC Generated auth tag not as expected");
12197 test_AES_GMAC_authentication_test_case_1(void)
12199 return test_AES_GMAC_authentication(&gmac_test_case_1);
12203 test_AES_GMAC_authentication_test_case_2(void)
12205 return test_AES_GMAC_authentication(&gmac_test_case_2);
12209 test_AES_GMAC_authentication_test_case_3(void)
12211 return test_AES_GMAC_authentication(&gmac_test_case_3);
12215 test_AES_GMAC_authentication_test_case_4(void)
12217 return test_AES_GMAC_authentication(&gmac_test_case_4);
12221 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12223 struct crypto_testsuite_params *ts_params = &testsuite_params;
12224 struct crypto_unittest_params *ut_params = &unittest_params;
12226 uint32_t plaintext_pad_len;
12227 uint8_t *plaintext;
12228 struct rte_cryptodev_info dev_info;
12230 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12231 uint64_t feat_flags = dev_info.feature_flags;
12233 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12234 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12235 printf("Device doesn't support RAW data-path APIs.\n");
12236 return TEST_SKIPPED;
12239 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12240 "No GMAC length in the source data");
12242 /* Verify the capabilities */
12243 struct rte_cryptodev_sym_capability_idx cap_idx;
12244 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12245 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12246 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12248 return TEST_SKIPPED;
12250 retval = create_gmac_session(ts_params->valid_devs[0],
12251 tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12256 if (tdata->plaintext.len > MBUF_SIZE)
12257 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12259 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12260 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12261 "Failed to allocate input buffer in mempool");
12263 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12264 rte_pktmbuf_tailroom(ut_params->ibuf));
12266 plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12269 * Runtime generate the large plain text instead of use hard code
12270 * plain text vector. It is done to avoid create huge source file
12271 * with the test vector.
12273 if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12274 generate_gmac_large_plaintext(tdata->plaintext.data);
12276 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12277 plaintext_pad_len);
12278 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12280 memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12281 debug_hexdump(stdout, "plaintext:", plaintext,
12282 tdata->plaintext.len);
12284 retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
12290 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12292 ut_params->op->sym->m_src = ut_params->ibuf;
12294 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12295 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12297 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12298 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12299 ut_params->op, 0, 1, 0, 0);
12301 TEST_ASSERT_NOT_NULL(
12302 process_crypto_request(ts_params->valid_devs[0],
12303 ut_params->op), "failed to process sym crypto op");
12305 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12306 "crypto op processing failed");
12313 test_AES_GMAC_authentication_verify_test_case_1(void)
12315 return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
12319 test_AES_GMAC_authentication_verify_test_case_2(void)
12321 return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
12325 test_AES_GMAC_authentication_verify_test_case_3(void)
12327 return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
12331 test_AES_GMAC_authentication_verify_test_case_4(void)
12333 return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
12337 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
12340 struct crypto_testsuite_params *ts_params = &testsuite_params;
12341 struct crypto_unittest_params *ut_params = &unittest_params;
12342 struct rte_cryptodev_info dev_info;
12343 uint64_t feature_flags;
12344 unsigned int trn_data = 0;
12345 void *digest_mem = NULL;
12347 unsigned int to_trn = 0;
12348 struct rte_mbuf *buf = NULL;
12349 uint8_t *auth_tag, *plaintext;
12352 TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12353 "No GMAC length in the source data");
12355 /* Verify the capabilities */
12356 struct rte_cryptodev_sym_capability_idx cap_idx;
12357 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12358 cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12359 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12361 return TEST_SKIPPED;
12363 /* Check for any input SGL support */
12364 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12365 feature_flags = dev_info.feature_flags;
12367 if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
12368 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
12369 (!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
12370 return TEST_SKIPPED;
12372 if (fragsz > tdata->plaintext.len)
12373 fragsz = tdata->plaintext.len;
12375 uint16_t plaintext_len = fragsz;
12377 retval = create_gmac_session(ts_params->valid_devs[0],
12378 tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12383 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12384 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12385 "Failed to allocate input buffer in mempool");
12387 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12388 rte_pktmbuf_tailroom(ut_params->ibuf));
12390 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12392 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12394 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12396 trn_data += plaintext_len;
12398 buf = ut_params->ibuf;
12401 * Loop until no more fragments
12404 while (trn_data < tdata->plaintext.len) {
12406 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12407 (tdata->plaintext.len - trn_data) : fragsz;
12409 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12412 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12413 rte_pktmbuf_tailroom(buf));
12415 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12418 memcpy(plaintext, tdata->plaintext.data + trn_data,
12420 trn_data += to_trn;
12421 if (trn_data == tdata->plaintext.len)
12422 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12423 tdata->gmac_tag.len);
12425 ut_params->ibuf->nb_segs = segs;
12428 * Place digest at the end of the last buffer
12430 uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12433 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12434 + tdata->gmac_tag.len);
12435 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12436 tdata->plaintext.len);
12439 retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
12440 tdata, digest_mem, digest_phys);
12445 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12447 ut_params->op->sym->m_src = ut_params->ibuf;
12449 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12450 return TEST_SKIPPED;
12452 TEST_ASSERT_NOT_NULL(
12453 process_crypto_request(ts_params->valid_devs[0],
12454 ut_params->op), "failed to process sym crypto op");
12456 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12457 "crypto op processing failed");
12459 auth_tag = digest_mem;
12460 debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12461 TEST_ASSERT_BUFFERS_ARE_EQUAL(
12463 tdata->gmac_tag.data,
12464 tdata->gmac_tag.len,
12465 "GMAC Generated auth tag not as expected");
12470 /* Segment size not multiple of block size (16B) */
12472 test_AES_GMAC_authentication_SGL_40B(void)
12474 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
12478 test_AES_GMAC_authentication_SGL_80B(void)
12480 return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
12484 test_AES_GMAC_authentication_SGL_2048B(void)
12486 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
12489 /* Segment size not multiple of block size (16B) */
12491 test_AES_GMAC_authentication_SGL_2047B(void)
12493 return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
12496 struct test_crypto_vector {
12497 enum rte_crypto_cipher_algorithm crypto_algo;
12498 unsigned int cipher_offset;
12499 unsigned int cipher_len;
12512 const uint8_t *data;
12517 const uint8_t *data;
12521 enum rte_crypto_auth_algorithm auth_algo;
12522 unsigned int auth_offset;
12530 const uint8_t *data;
12540 static const struct test_crypto_vector
12541 hmac_sha1_test_crypto_vector = {
12542 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12544 .data = plaintext_hash,
12549 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12550 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12551 0xDE, 0xF4, 0xDE, 0xAD
12557 0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
12558 0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
12559 0x3F, 0x91, 0x64, 0x59
12565 static const struct test_crypto_vector
12566 aes128_gmac_test_vector = {
12567 .auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
12569 .data = plaintext_hash,
12574 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12575 0x08, 0x09, 0x0A, 0x0B
12581 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12582 0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
12588 0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
12589 0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
12595 static const struct test_crypto_vector
12596 aes128cbc_hmac_sha1_test_vector = {
12597 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12598 .cipher_offset = 0,
12602 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12603 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12609 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12610 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12615 .data = plaintext_hash,
12619 .data = ciphertext512_aes128cbc,
12622 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12626 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12627 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12628 0xDE, 0xF4, 0xDE, 0xAD
12634 0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12635 0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12636 0x18, 0x8C, 0x1D, 0x32
12642 static const struct test_crypto_vector
12643 aes128cbc_hmac_sha1_aad_test_vector = {
12644 .crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12645 .cipher_offset = 8,
12649 0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12650 0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12656 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12657 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12662 .data = plaintext_hash,
12666 .data = ciphertext512_aes128cbc_aad,
12669 .auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12673 0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12674 0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12675 0xDE, 0xF4, 0xDE, 0xAD
12681 0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12682 0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12683 0x62, 0x0F, 0xFB, 0x10
12690 data_corruption(uint8_t *data)
12696 tag_corruption(uint8_t *data, unsigned int tag_offset)
12698 data[tag_offset] += 1;
12702 create_auth_session(struct crypto_unittest_params *ut_params,
12704 const struct test_crypto_vector *reference,
12705 enum rte_crypto_auth_operation auth_op)
12707 struct crypto_testsuite_params *ts_params = &testsuite_params;
12708 uint8_t auth_key[reference->auth_key.len + 1];
12710 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12712 /* Setup Authentication Parameters */
12713 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12714 ut_params->auth_xform.auth.op = auth_op;
12715 ut_params->auth_xform.next = NULL;
12716 ut_params->auth_xform.auth.algo = reference->auth_algo;
12717 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12718 ut_params->auth_xform.auth.key.data = auth_key;
12719 ut_params->auth_xform.auth.digest_length = reference->digest.len;
12721 /* Create Crypto session*/
12722 ut_params->sess = rte_cryptodev_sym_session_create(
12723 ts_params->session_mpool);
12725 rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12726 &ut_params->auth_xform,
12727 ts_params->session_priv_mpool);
12729 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12735 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12737 const struct test_crypto_vector *reference,
12738 enum rte_crypto_auth_operation auth_op,
12739 enum rte_crypto_cipher_operation cipher_op)
12741 struct crypto_testsuite_params *ts_params = &testsuite_params;
12742 uint8_t cipher_key[reference->cipher_key.len + 1];
12743 uint8_t auth_key[reference->auth_key.len + 1];
12745 memcpy(cipher_key, reference->cipher_key.data,
12746 reference->cipher_key.len);
12747 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12749 /* Setup Authentication Parameters */
12750 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12751 ut_params->auth_xform.auth.op = auth_op;
12752 ut_params->auth_xform.auth.algo = reference->auth_algo;
12753 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12754 ut_params->auth_xform.auth.key.data = auth_key;
12755 ut_params->auth_xform.auth.digest_length = reference->digest.len;
12757 if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12758 ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12759 ut_params->auth_xform.auth.iv.length = reference->iv.len;
12761 ut_params->auth_xform.next = &ut_params->cipher_xform;
12763 /* Setup Cipher Parameters */
12764 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12765 ut_params->cipher_xform.next = NULL;
12766 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12767 ut_params->cipher_xform.cipher.op = cipher_op;
12768 ut_params->cipher_xform.cipher.key.data = cipher_key;
12769 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12770 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12771 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12774 /* Create Crypto session*/
12775 ut_params->sess = rte_cryptodev_sym_session_create(
12776 ts_params->session_mpool);
12778 rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12779 &ut_params->auth_xform,
12780 ts_params->session_priv_mpool);
12782 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12788 create_auth_operation(struct crypto_testsuite_params *ts_params,
12789 struct crypto_unittest_params *ut_params,
12790 const struct test_crypto_vector *reference,
12791 unsigned int auth_generate)
12793 /* Generate Crypto op data structure */
12794 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12795 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12796 TEST_ASSERT_NOT_NULL(ut_params->op,
12797 "Failed to allocate pktmbuf offload");
12799 /* Set crypto operation data parameters */
12800 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12802 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12804 /* set crypto operation source mbuf */
12805 sym_op->m_src = ut_params->ibuf;
12808 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12809 ut_params->ibuf, reference->digest.len);
12811 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12812 "no room to append auth tag");
12814 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12815 ut_params->ibuf, reference->plaintext.len);
12818 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12820 memcpy(sym_op->auth.digest.data,
12821 reference->digest.data,
12822 reference->digest.len);
12824 debug_hexdump(stdout, "digest:",
12825 sym_op->auth.digest.data,
12826 reference->digest.len);
12828 sym_op->auth.data.length = reference->plaintext.len;
12829 sym_op->auth.data.offset = 0;
12835 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12836 struct crypto_unittest_params *ut_params,
12837 const struct test_crypto_vector *reference,
12838 unsigned int auth_generate)
12840 /* Generate Crypto op data structure */
12841 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12842 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12843 TEST_ASSERT_NOT_NULL(ut_params->op,
12844 "Failed to allocate pktmbuf offload");
12846 /* Set crypto operation data parameters */
12847 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12849 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12851 /* set crypto operation source mbuf */
12852 sym_op->m_src = ut_params->ibuf;
12855 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12856 ut_params->ibuf, reference->digest.len);
12858 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12859 "no room to append auth tag");
12861 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12862 ut_params->ibuf, reference->ciphertext.len);
12865 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12867 memcpy(sym_op->auth.digest.data,
12868 reference->digest.data,
12869 reference->digest.len);
12871 debug_hexdump(stdout, "digest:",
12872 sym_op->auth.digest.data,
12873 reference->digest.len);
12875 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12876 reference->iv.data, reference->iv.len);
12878 sym_op->cipher.data.length = 0;
12879 sym_op->cipher.data.offset = 0;
12881 sym_op->auth.data.length = reference->plaintext.len;
12882 sym_op->auth.data.offset = 0;
12888 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12889 struct crypto_unittest_params *ut_params,
12890 const struct test_crypto_vector *reference,
12891 unsigned int auth_generate)
12893 /* Generate Crypto op data structure */
12894 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12895 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12896 TEST_ASSERT_NOT_NULL(ut_params->op,
12897 "Failed to allocate pktmbuf offload");
12899 /* Set crypto operation data parameters */
12900 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12902 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12904 /* set crypto operation source mbuf */
12905 sym_op->m_src = ut_params->ibuf;
12908 sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12909 ut_params->ibuf, reference->digest.len);
12911 TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12912 "no room to append auth tag");
12914 sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12915 ut_params->ibuf, reference->ciphertext.len);
12918 memset(sym_op->auth.digest.data, 0, reference->digest.len);
12920 memcpy(sym_op->auth.digest.data,
12921 reference->digest.data,
12922 reference->digest.len);
12924 debug_hexdump(stdout, "digest:",
12925 sym_op->auth.digest.data,
12926 reference->digest.len);
12928 rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12929 reference->iv.data, reference->iv.len);
12931 sym_op->cipher.data.length = reference->cipher_len;
12932 sym_op->cipher.data.offset = reference->cipher_offset;
12934 sym_op->auth.data.length = reference->plaintext.len;
12935 sym_op->auth.data.offset = reference->auth_offset;
12941 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12942 struct crypto_unittest_params *ut_params,
12943 const struct test_crypto_vector *reference)
12945 return create_auth_operation(ts_params, ut_params, reference, 0);
12949 create_auth_verify_GMAC_operation(
12950 struct crypto_testsuite_params *ts_params,
12951 struct crypto_unittest_params *ut_params,
12952 const struct test_crypto_vector *reference)
12954 return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12958 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12959 struct crypto_unittest_params *ut_params,
12960 const struct test_crypto_vector *reference)
12962 return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12966 test_authentication_verify_fail_when_data_corruption(
12967 struct crypto_testsuite_params *ts_params,
12968 struct crypto_unittest_params *ut_params,
12969 const struct test_crypto_vector *reference,
12970 unsigned int data_corrupted)
12974 uint8_t *plaintext;
12975 struct rte_cryptodev_info dev_info;
12977 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12978 uint64_t feat_flags = dev_info.feature_flags;
12980 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12981 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12982 printf("Device doesn't support RAW data-path APIs.\n");
12983 return TEST_SKIPPED;
12986 /* Verify the capabilities */
12987 struct rte_cryptodev_sym_capability_idx cap_idx;
12988 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12989 cap_idx.algo.auth = reference->auth_algo;
12990 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12992 return TEST_SKIPPED;
12995 /* Create session */
12996 retval = create_auth_session(ut_params,
12997 ts_params->valid_devs[0],
12999 RTE_CRYPTO_AUTH_OP_VERIFY);
13003 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13004 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13005 "Failed to allocate input buffer in mempool");
13007 /* clear mbuf payload */
13008 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13009 rte_pktmbuf_tailroom(ut_params->ibuf));
13011 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13012 reference->plaintext.len);
13013 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13014 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13016 debug_hexdump(stdout, "plaintext:", plaintext,
13017 reference->plaintext.len);
13019 /* Create operation */
13020 retval = create_auth_verify_operation(ts_params, ut_params, reference);
13025 if (data_corrupted)
13026 data_corruption(plaintext);
13028 tag_corruption(plaintext, reference->plaintext.len);
13030 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13031 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13033 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13034 RTE_CRYPTO_OP_STATUS_SUCCESS,
13035 "authentication not failed");
13036 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13037 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13038 ut_params->op, 0, 1, 0, 0);
13040 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13043 if (ut_params->op == NULL)
13045 else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13052 test_authentication_verify_GMAC_fail_when_corruption(
13053 struct crypto_testsuite_params *ts_params,
13054 struct crypto_unittest_params *ut_params,
13055 const struct test_crypto_vector *reference,
13056 unsigned int data_corrupted)
13059 uint8_t *plaintext;
13060 struct rte_cryptodev_info dev_info;
13062 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13063 uint64_t feat_flags = dev_info.feature_flags;
13065 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13066 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13067 printf("Device doesn't support RAW data-path APIs.\n");
13068 return TEST_SKIPPED;
13071 /* Verify the capabilities */
13072 struct rte_cryptodev_sym_capability_idx cap_idx;
13073 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13074 cap_idx.algo.auth = reference->auth_algo;
13075 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13077 return TEST_SKIPPED;
13079 /* Create session */
13080 retval = create_auth_cipher_session(ut_params,
13081 ts_params->valid_devs[0],
13083 RTE_CRYPTO_AUTH_OP_VERIFY,
13084 RTE_CRYPTO_CIPHER_OP_DECRYPT);
13088 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13089 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13090 "Failed to allocate input buffer in mempool");
13092 /* clear mbuf payload */
13093 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13094 rte_pktmbuf_tailroom(ut_params->ibuf));
13096 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13097 reference->plaintext.len);
13098 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13099 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13101 debug_hexdump(stdout, "plaintext:", plaintext,
13102 reference->plaintext.len);
13104 /* Create operation */
13105 retval = create_auth_verify_GMAC_operation(ts_params,
13112 if (data_corrupted)
13113 data_corruption(plaintext);
13115 tag_corruption(plaintext, reference->aad.len);
13117 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13118 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13120 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13121 RTE_CRYPTO_OP_STATUS_SUCCESS,
13122 "authentication not failed");
13123 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13124 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13125 ut_params->op, 0, 1, 0, 0);
13127 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13129 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13136 test_authenticated_decryption_fail_when_corruption(
13137 struct crypto_testsuite_params *ts_params,
13138 struct crypto_unittest_params *ut_params,
13139 const struct test_crypto_vector *reference,
13140 unsigned int data_corrupted)
13144 uint8_t *ciphertext;
13145 struct rte_cryptodev_info dev_info;
13147 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13148 uint64_t feat_flags = dev_info.feature_flags;
13150 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13151 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13152 printf("Device doesn't support RAW data-path APIs.\n");
13153 return TEST_SKIPPED;
13156 /* Verify the capabilities */
13157 struct rte_cryptodev_sym_capability_idx cap_idx;
13158 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13159 cap_idx.algo.auth = reference->auth_algo;
13160 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13162 return TEST_SKIPPED;
13163 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13164 cap_idx.algo.cipher = reference->crypto_algo;
13165 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13167 return TEST_SKIPPED;
13169 /* Create session */
13170 retval = create_auth_cipher_session(ut_params,
13171 ts_params->valid_devs[0],
13173 RTE_CRYPTO_AUTH_OP_VERIFY,
13174 RTE_CRYPTO_CIPHER_OP_DECRYPT);
13178 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13179 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13180 "Failed to allocate input buffer in mempool");
13182 /* clear mbuf payload */
13183 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13184 rte_pktmbuf_tailroom(ut_params->ibuf));
13186 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13187 reference->ciphertext.len);
13188 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13189 memcpy(ciphertext, reference->ciphertext.data,
13190 reference->ciphertext.len);
13192 /* Create operation */
13193 retval = create_cipher_auth_verify_operation(ts_params,
13200 if (data_corrupted)
13201 data_corruption(ciphertext);
13203 tag_corruption(ciphertext, reference->ciphertext.len);
13205 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13206 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13208 TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13209 RTE_CRYPTO_OP_STATUS_SUCCESS,
13210 "authentication not failed");
13211 } else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13212 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13213 ut_params->op, 1, 1, 0, 0);
13215 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13217 TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13224 test_authenticated_encrypt_with_esn(
13225 struct crypto_testsuite_params *ts_params,
13226 struct crypto_unittest_params *ut_params,
13227 const struct test_crypto_vector *reference)
13231 uint8_t *authciphertext, *plaintext, *auth_tag;
13232 uint16_t plaintext_pad_len;
13233 uint8_t cipher_key[reference->cipher_key.len + 1];
13234 uint8_t auth_key[reference->auth_key.len + 1];
13235 struct rte_cryptodev_info dev_info;
13237 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13238 uint64_t feat_flags = dev_info.feature_flags;
13240 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13241 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13242 printf("Device doesn't support RAW data-path APIs.\n");
13243 return TEST_SKIPPED;
13246 /* Verify the capabilities */
13247 struct rte_cryptodev_sym_capability_idx cap_idx;
13248 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13249 cap_idx.algo.auth = reference->auth_algo;
13250 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13252 return TEST_SKIPPED;
13253 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13254 cap_idx.algo.cipher = reference->crypto_algo;
13255 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13257 return TEST_SKIPPED;
13259 /* Create session */
13260 memcpy(cipher_key, reference->cipher_key.data,
13261 reference->cipher_key.len);
13262 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13264 /* Setup Cipher Parameters */
13265 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13266 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13267 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13268 ut_params->cipher_xform.cipher.key.data = cipher_key;
13269 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13270 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13271 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13273 ut_params->cipher_xform.next = &ut_params->auth_xform;
13275 /* Setup Authentication Parameters */
13276 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13277 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
13278 ut_params->auth_xform.auth.algo = reference->auth_algo;
13279 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13280 ut_params->auth_xform.auth.key.data = auth_key;
13281 ut_params->auth_xform.auth.digest_length = reference->digest.len;
13282 ut_params->auth_xform.next = NULL;
13284 /* Create Crypto session*/
13285 ut_params->sess = rte_cryptodev_sym_session_create(
13286 ts_params->session_mpool);
13288 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13290 &ut_params->cipher_xform,
13291 ts_params->session_priv_mpool);
13293 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13295 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13296 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13297 "Failed to allocate input buffer in mempool");
13299 /* clear mbuf payload */
13300 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13301 rte_pktmbuf_tailroom(ut_params->ibuf));
13303 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13304 reference->plaintext.len);
13305 TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13306 memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13308 /* Create operation */
13309 retval = create_cipher_auth_operation(ts_params,
13316 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13317 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13319 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13320 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13321 ut_params->op, 1, 1, 0, 0);
13323 ut_params->op = process_crypto_request(
13324 ts_params->valid_devs[0], ut_params->op);
13326 TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
13328 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13329 "crypto op processing failed");
13331 plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
13333 authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
13334 ut_params->op->sym->auth.data.offset);
13335 auth_tag = authciphertext + plaintext_pad_len;
13336 debug_hexdump(stdout, "ciphertext:", authciphertext,
13337 reference->ciphertext.len);
13338 debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
13340 /* Validate obuf */
13341 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13343 reference->ciphertext.data,
13344 reference->ciphertext.len,
13345 "Ciphertext data not as expected");
13347 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13349 reference->digest.data,
13350 reference->digest.len,
13351 "Generated digest not as expected");
13353 return TEST_SUCCESS;
13358 test_authenticated_decrypt_with_esn(
13359 struct crypto_testsuite_params *ts_params,
13360 struct crypto_unittest_params *ut_params,
13361 const struct test_crypto_vector *reference)
13365 uint8_t *ciphertext;
13366 uint8_t cipher_key[reference->cipher_key.len + 1];
13367 uint8_t auth_key[reference->auth_key.len + 1];
13368 struct rte_cryptodev_info dev_info;
13370 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13371 uint64_t feat_flags = dev_info.feature_flags;
13373 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13374 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13375 printf("Device doesn't support RAW data-path APIs.\n");
13376 return TEST_SKIPPED;
13379 /* Verify the capabilities */
13380 struct rte_cryptodev_sym_capability_idx cap_idx;
13381 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13382 cap_idx.algo.auth = reference->auth_algo;
13383 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13385 return TEST_SKIPPED;
13386 cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13387 cap_idx.algo.cipher = reference->crypto_algo;
13388 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13390 return TEST_SKIPPED;
13392 /* Create session */
13393 memcpy(cipher_key, reference->cipher_key.data,
13394 reference->cipher_key.len);
13395 memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13397 /* Setup Authentication Parameters */
13398 ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13399 ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
13400 ut_params->auth_xform.auth.algo = reference->auth_algo;
13401 ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13402 ut_params->auth_xform.auth.key.data = auth_key;
13403 ut_params->auth_xform.auth.digest_length = reference->digest.len;
13404 ut_params->auth_xform.next = &ut_params->cipher_xform;
13406 /* Setup Cipher Parameters */
13407 ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13408 ut_params->cipher_xform.next = NULL;
13409 ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13410 ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
13411 ut_params->cipher_xform.cipher.key.data = cipher_key;
13412 ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13413 ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13414 ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13416 /* Create Crypto session*/
13417 ut_params->sess = rte_cryptodev_sym_session_create(
13418 ts_params->session_mpool);
13420 rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
13422 &ut_params->auth_xform,
13423 ts_params->session_priv_mpool);
13425 TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13427 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13428 TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13429 "Failed to allocate input buffer in mempool");
13431 /* clear mbuf payload */
13432 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13433 rte_pktmbuf_tailroom(ut_params->ibuf));
13435 ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13436 reference->ciphertext.len);
13437 TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13438 memcpy(ciphertext, reference->ciphertext.data,
13439 reference->ciphertext.len);
13441 /* Create operation */
13442 retval = create_cipher_auth_verify_operation(ts_params,
13449 if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13450 process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13452 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13453 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13454 ut_params->op, 1, 1, 0, 0);
13456 ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13459 TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
13460 TEST_ASSERT_EQUAL(ut_params->op->status,
13461 RTE_CRYPTO_OP_STATUS_SUCCESS,
13462 "crypto op processing passed");
13464 ut_params->obuf = ut_params->op->sym->m_src;
13465 TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
13471 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
13472 const struct aead_test_data *tdata,
13473 void *digest_mem, uint64_t digest_phys)
13475 struct crypto_testsuite_params *ts_params = &testsuite_params;
13476 struct crypto_unittest_params *ut_params = &unittest_params;
13478 const unsigned int auth_tag_len = tdata->auth_tag.len;
13479 const unsigned int iv_len = tdata->iv.len;
13480 unsigned int aad_len = tdata->aad.len;
13481 unsigned int aad_len_pad = 0;
13483 /* Generate Crypto op data structure */
13484 ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13485 RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13486 TEST_ASSERT_NOT_NULL(ut_params->op,
13487 "Failed to allocate symmetric crypto operation struct");
13489 struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13491 sym_op->aead.digest.data = digest_mem;
13493 TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
13494 "no room to append digest");
13496 sym_op->aead.digest.phys_addr = digest_phys;
13498 if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
13499 rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
13501 debug_hexdump(stdout, "digest:",
13502 sym_op->aead.digest.data,
13506 /* Append aad data */
13507 if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
13508 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13509 uint8_t *, IV_OFFSET);
13511 /* Copy IV 1 byte after the IV pointer, according to the API */
13512 rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
13514 aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
13516 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13517 ut_params->ibuf, aad_len);
13518 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13519 "no room to prepend aad");
13520 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13523 memset(sym_op->aead.aad.data, 0, aad_len);
13524 /* Copy AAD 18 bytes after the AAD pointer, according to the API */
13525 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13527 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13528 debug_hexdump(stdout, "aad:",
13529 sym_op->aead.aad.data, aad_len);
13531 uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
13532 uint8_t *, IV_OFFSET);
13534 rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
13536 aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
13538 sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
13539 ut_params->ibuf, aad_len_pad);
13540 TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
13541 "no room to prepend aad");
13542 sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
13545 memset(sym_op->aead.aad.data, 0, aad_len);
13546 rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
13548 debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
13549 debug_hexdump(stdout, "aad:",
13550 sym_op->aead.aad.data, aad_len);
13553 sym_op->aead.data.length = tdata->plaintext.len;
13554 sym_op->aead.data.offset = aad_len_pad;
13559 #define SGL_MAX_NO 16
13562 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
13563 const int oop, uint32_t fragsz, uint32_t fragsz_oop)
13565 struct crypto_testsuite_params *ts_params = &testsuite_params;
13566 struct crypto_unittest_params *ut_params = &unittest_params;
13567 struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
13570 int to_trn_tbl[SGL_MAX_NO];
13572 unsigned int trn_data = 0;
13573 uint8_t *plaintext, *ciphertext, *auth_tag;
13574 struct rte_cryptodev_info dev_info;
13576 /* Verify the capabilities */
13577 struct rte_cryptodev_sym_capability_idx cap_idx;
13578 cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
13579 cap_idx.algo.aead = tdata->algo;
13580 if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13582 return TEST_SKIPPED;
13584 /* OOP not supported with CPU crypto */
13585 if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13586 return TEST_SKIPPED;
13588 /* Detailed check for the particular SGL support flag */
13589 rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13591 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13592 if (sgl_in && (!(dev_info.feature_flags &
13593 RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
13594 return TEST_SKIPPED;
13596 uint64_t feat_flags = dev_info.feature_flags;
13598 if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13599 (!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13600 printf("Device doesn't support RAW data-path APIs.\n");
13601 return TEST_SKIPPED;
13604 unsigned int sgl_in = fragsz < tdata->plaintext.len;
13605 unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
13606 tdata->plaintext.len;
13607 /* Raw data path API does not support OOP */
13608 if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13609 return TEST_SKIPPED;
13610 if (sgl_in && !sgl_out) {
13611 if (!(dev_info.feature_flags &
13612 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
13613 return TEST_SKIPPED;
13614 } else if (!sgl_in && sgl_out) {
13615 if (!(dev_info.feature_flags &
13616 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
13617 return TEST_SKIPPED;
13618 } else if (sgl_in && sgl_out) {
13619 if (!(dev_info.feature_flags &
13620 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
13621 return TEST_SKIPPED;
13625 if (fragsz > tdata->plaintext.len)
13626 fragsz = tdata->plaintext.len;
13628 uint16_t plaintext_len = fragsz;
13629 uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13631 if (fragsz_oop > tdata->plaintext.len)
13632 frag_size_oop = tdata->plaintext.len;
13635 void *digest_mem = NULL;
13637 uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13639 if (tdata->plaintext.len % fragsz != 0) {
13640 if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13643 if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13648 * For out-op-place we need to alloc another mbuf
13651 ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13652 rte_pktmbuf_append(ut_params->obuf,
13653 frag_size_oop + prepend_len);
13654 buf_oop = ut_params->obuf;
13657 /* Create AEAD session */
13658 retval = create_aead_session(ts_params->valid_devs[0],
13660 RTE_CRYPTO_AEAD_OP_ENCRYPT,
13661 tdata->key.data, tdata->key.len,
13662 tdata->aad.len, tdata->auth_tag.len,
13667 ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13669 /* clear mbuf payload */
13670 memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13671 rte_pktmbuf_tailroom(ut_params->ibuf));
13673 plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13676 memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13678 trn_data += plaintext_len;
13680 buf = ut_params->ibuf;
13683 * Loop until no more fragments
13686 while (trn_data < tdata->plaintext.len) {
13688 to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13689 (tdata->plaintext.len - trn_data) : fragsz;
13691 to_trn_tbl[ecx++] = to_trn;
13693 buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13696 memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13697 rte_pktmbuf_tailroom(buf));
13700 if (oop && !fragsz_oop) {
13701 buf_last_oop = buf_oop->next =
13702 rte_pktmbuf_alloc(ts_params->mbuf_pool);
13703 buf_oop = buf_oop->next;
13704 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13705 0, rte_pktmbuf_tailroom(buf_oop));
13706 rte_pktmbuf_append(buf_oop, to_trn);
13709 plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13712 memcpy(plaintext, tdata->plaintext.data + trn_data,
13714 trn_data += to_trn;
13715 if (trn_data == tdata->plaintext.len) {
13718 digest_mem = rte_pktmbuf_append(buf_oop,
13719 tdata->auth_tag.len);
13721 digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13722 tdata->auth_tag.len);
13726 uint64_t digest_phys = 0;
13728 ut_params->ibuf->nb_segs = segs;
13731 if (fragsz_oop && oop) {
13735 if (frag_size_oop == tdata->plaintext.len) {
13736 digest_mem = rte_pktmbuf_append(ut_params->obuf,
13737 tdata->auth_tag.len);
13739 digest_phys = rte_pktmbuf_iova_offset(
13741 tdata->plaintext.len + prepend_len);
13744 trn_data = frag_size_oop;
13745 while (trn_data < tdata->plaintext.len) {
13748 (tdata->plaintext.len - trn_data <
13750 (tdata->plaintext.len - trn_data) :
13753 to_trn_tbl[ecx++] = to_trn;
13755 buf_last_oop = buf_oop->next =
13756 rte_pktmbuf_alloc(ts_params->mbuf_pool);
13757 buf_oop = buf_oop->next;
13758 memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13759 0, rte_pktmbuf_tailroom(buf_oop));
13760 rte_pktmbuf_append(buf_oop, to_trn);
13762 trn_data += to_trn;
13764 if (trn_data == tdata->plaintext.len) {
13765 digest_mem = rte_pktmbuf_append(buf_oop,
13766 tdata->auth_tag.len);
13770 ut_params->obuf->nb_segs = segs;
13774 * Place digest at the end of the last buffer
13777 digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13778 if (oop && buf_last_oop)
13779 digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13781 if (!digest_mem && !oop) {
13782 digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13783 + tdata->auth_tag.len);
13784 digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13785 tdata->plaintext.len);
13788 /* Create AEAD operation */
13789 retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13790 tdata, digest_mem, digest_phys);
13795 rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13797 ut_params->op->sym->m_src = ut_params->ibuf;
13799 ut_params->op->sym->m_dst = ut_params->obuf;
13801 /* Process crypto operation */
13802 if (oop == IN_PLACE &&
13803 gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13804 process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13805 else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13806 process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13807 ut_params->op, 0, 0, 0, 0);
13809 TEST_ASSERT_NOT_NULL(
13810 process_crypto_request(ts_params->valid_devs[0],
13811 ut_params->op), "failed to process sym crypto op");
13813 TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13814 "crypto op processing failed");
13817 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13818 uint8_t *, prepend_len);
13820 ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13821 uint8_t *, prepend_len);
13825 fragsz = fragsz_oop;
13827 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13829 tdata->ciphertext.data,
13831 "Ciphertext data not as expected");
13833 buf = ut_params->op->sym->m_src->next;
13835 buf = ut_params->op->sym->m_dst->next;
13837 unsigned int off = fragsz;
13841 ciphertext = rte_pktmbuf_mtod(buf,
13844 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13846 tdata->ciphertext.data + off,
13848 "Ciphertext data not as expected");
13850 off += to_trn_tbl[ecx++];
13854 auth_tag = digest_mem;
13855 TEST_ASSERT_BUFFERS_ARE_EQUAL(
13857 tdata->auth_tag.data,
13858 tdata->auth_tag.len,
13859 "Generated auth tag not as expected");
13865 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13867 return test_authenticated_encryption_SGL(
13868 &gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13872 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13874 return test_authenticated_encryption_SGL(
13875 &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13879 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13881 return test_authenticated_encryption_SGL(
13882 &gcm_test_case_8, OUT_OF_PLACE, 400,
13883 gcm_test_case_8.plaintext.len);
13887 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13889 /* This test is not for OPENSSL PMD */
13890 if (gbl_driver_id == rte_cryptodev_driver_id_get(
13891 RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13892 return TEST_SKIPPED;
13894 return test_authenticated_encryption_SGL(
13895 &gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13899 test_authentication_verify_fail_when_data_corrupted(
13900 struct crypto_testsuite_params *ts_params,
13901 struct crypto_unittest_params *ut_params,
13902 const struct test_crypto_vector *reference)
13904 return test_authentication_verify_fail_when_data_corruption(
13905 ts_params, ut_params, reference, 1);
13909 test_authentication_verify_fail_when_tag_corrupted(
13910 struct crypto_testsuite_params *ts_params,
13911 struct crypto_unittest_params *ut_params,
13912 const struct test_crypto_vector *reference)
13914 return test_authentication_verify_fail_when_data_corruption(
13915 ts_params, ut_params, reference, 0);
13919 test_authentication_verify_GMAC_fail_when_data_corrupted(
13920 struct crypto_testsuite_params *ts_params,
13921 struct crypto_unittest_params *ut_params,
13922 const struct test_crypto_vector *reference)
13924 return test_authentication_verify_GMAC_fail_when_corruption(
13925 ts_params, ut_params, reference, 1);
13929 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13930 struct crypto_testsuite_params *ts_params,
13931 struct crypto_unittest_params *ut_params,
13932 const struct test_crypto_vector *reference)
13934 return test_authentication_verify_GMAC_fail_when_corruption(
13935 ts_params, ut_params, reference, 0);
13939 test_authenticated_decryption_fail_when_data_corrupted(
13940 struct crypto_testsuite_params *ts_params,
13941 struct crypto_unittest_params *ut_params,
13942 const struct test_crypto_vector *reference)
13944 return test_authenticated_decryption_fail_when_corruption(
13945 ts_params, ut_params, reference, 1);
13949 test_authenticated_decryption_fail_when_tag_corrupted(
13950 struct crypto_testsuite_params *ts_params,
13951 struct crypto_unittest_params *ut_params,
13952 const struct test_crypto_vector *reference)
13954 return test_authenticated_decryption_fail_when_corruption(
13955 ts_params, ut_params, reference, 0);
13959 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13961 return test_authentication_verify_fail_when_data_corrupted(
13962 &testsuite_params, &unittest_params,
13963 &hmac_sha1_test_crypto_vector);
13967 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13969 return test_authentication_verify_fail_when_tag_corrupted(
13970 &testsuite_params, &unittest_params,
13971 &hmac_sha1_test_crypto_vector);
13975 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13977 return test_authentication_verify_GMAC_fail_when_data_corrupted(
13978 &testsuite_params, &unittest_params,
13979 &aes128_gmac_test_vector);
13983 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13985 return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13986 &testsuite_params, &unittest_params,
13987 &aes128_gmac_test_vector);
13991 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13993 return test_authenticated_decryption_fail_when_data_corrupted(
13996 &aes128cbc_hmac_sha1_test_vector);
14000 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14002 return test_authenticated_decryption_fail_when_tag_corrupted(
14005 &aes128cbc_hmac_sha1_test_vector);
14009 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14011 return test_authenticated_encrypt_with_esn(
14014 &aes128cbc_hmac_sha1_aad_test_vector);
14018 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14020 return test_authenticated_decrypt_with_esn(
14023 &aes128cbc_hmac_sha1_aad_test_vector);
14027 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14029 return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14033 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14035 return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14038 #ifdef RTE_CRYPTO_SCHEDULER
14040 /* global AESNI worker IDs for the scheduler test */
14041 uint8_t aesni_ids[2];
14044 scheduler_testsuite_setup(void)
14047 int32_t nb_devs, ret;
14048 char vdev_args[VDEV_ARGS_SIZE] = {""};
14049 char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14050 "ordering=enable,name=cryptodev_test_scheduler,corelist="};
14051 uint16_t worker_core_count = 0;
14052 uint16_t socket_id = 0;
14054 if (gbl_driver_id == rte_cryptodev_driver_id_get(
14055 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14057 /* Identify the Worker Cores
14058 * Use 2 worker cores for the device args
14060 RTE_LCORE_FOREACH_WORKER(i) {
14061 if (worker_core_count > 1)
14063 snprintf(vdev_args, sizeof(vdev_args),
14064 "%s%d", temp_str, i);
14065 strcpy(temp_str, vdev_args);
14066 strlcat(temp_str, ";", sizeof(temp_str));
14067 worker_core_count++;
14068 socket_id = rte_lcore_to_socket_id(i);
14070 if (worker_core_count != 2) {
14071 RTE_LOG(ERR, USER1,
14072 "Cryptodev scheduler test require at least "
14073 "two worker cores to run. "
14074 "Please use the correct coremask.\n");
14075 return TEST_FAILED;
14077 strcpy(temp_str, vdev_args);
14078 snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14079 temp_str, socket_id);
14080 RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14081 nb_devs = rte_cryptodev_device_count_by_driver(
14082 rte_cryptodev_driver_id_get(
14083 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14085 ret = rte_vdev_init(
14086 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14088 TEST_ASSERT(ret == 0,
14089 "Failed to create instance %u of pmd : %s",
14090 i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14093 return testsuite_setup();
14097 test_scheduler_attach_worker_op(void)
14099 struct crypto_testsuite_params *ts_params = &testsuite_params;
14100 uint8_t sched_id = ts_params->valid_devs[0];
14101 uint32_t i, nb_devs_attached = 0;
14103 char vdev_name[32];
14104 unsigned int count = rte_cryptodev_count();
14106 /* create 2 AESNI_MB vdevs on top of existing devices */
14107 for (i = count; i < count + 2; i++) {
14108 snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14109 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14111 ret = rte_vdev_init(vdev_name, NULL);
14113 TEST_ASSERT(ret == 0,
14114 "Failed to create instance %u of"
14116 i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14119 RTE_LOG(ERR, USER1,
14120 "Failed to create 2 AESNI MB PMDs.\n");
14121 return TEST_SKIPPED;
14125 /* attach 2 AESNI_MB cdevs */
14126 for (i = count; i < count + 2; i++) {
14127 struct rte_cryptodev_info info;
14128 unsigned int session_size;
14130 rte_cryptodev_info_get(i, &info);
14131 if (info.driver_id != rte_cryptodev_driver_id_get(
14132 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14135 session_size = rte_cryptodev_sym_get_private_session_size(i);
14137 * Create the session mempool again, since now there are new devices
14138 * to use the mempool.
14140 if (ts_params->session_mpool) {
14141 rte_mempool_free(ts_params->session_mpool);
14142 ts_params->session_mpool = NULL;
14144 if (ts_params->session_priv_mpool) {
14145 rte_mempool_free(ts_params->session_priv_mpool);
14146 ts_params->session_priv_mpool = NULL;
14149 if (info.sym.max_nb_sessions != 0 &&
14150 info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14151 RTE_LOG(ERR, USER1,
14152 "Device does not support "
14153 "at least %u sessions\n",
14155 return TEST_FAILED;
14158 * Create mempool with maximum number of sessions,
14159 * to include the session headers
14161 if (ts_params->session_mpool == NULL) {
14162 ts_params->session_mpool =
14163 rte_cryptodev_sym_session_pool_create(
14165 MAX_NB_SESSIONS, 0, 0, 0,
14167 TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14168 "session mempool allocation failed");
14172 * Create mempool with maximum number of sessions,
14173 * to include device specific session private data
14175 if (ts_params->session_priv_mpool == NULL) {
14176 ts_params->session_priv_mpool = rte_mempool_create(
14177 "test_sess_mp_priv",
14180 0, 0, NULL, NULL, NULL,
14181 NULL, SOCKET_ID_ANY,
14184 TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14185 "session mempool allocation failed");
14188 ts_params->qp_conf.mp_session = ts_params->session_mpool;
14189 ts_params->qp_conf.mp_session_private =
14190 ts_params->session_priv_mpool;
14192 ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14195 TEST_ASSERT(ret == 0,
14196 "Failed to attach device %u of pmd : %s", i,
14197 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14199 aesni_ids[nb_devs_attached] = (uint8_t)i;
14201 nb_devs_attached++;
14208 test_scheduler_detach_worker_op(void)
14210 struct crypto_testsuite_params *ts_params = &testsuite_params;
14211 uint8_t sched_id = ts_params->valid_devs[0];
14215 for (i = 0; i < 2; i++) {
14216 ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14218 TEST_ASSERT(ret == 0,
14219 "Failed to detach device %u", aesni_ids[i]);
14226 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14228 struct crypto_testsuite_params *ts_params = &testsuite_params;
14229 uint8_t sched_id = ts_params->valid_devs[0];
14231 return rte_cryptodev_scheduler_mode_set(sched_id,
14236 test_scheduler_mode_roundrobin_op(void)
14238 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14239 0, "Failed to set roundrobin mode");
14245 test_scheduler_mode_multicore_op(void)
14247 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14248 0, "Failed to set multicore mode");
14254 test_scheduler_mode_failover_op(void)
14256 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
14257 0, "Failed to set failover mode");
14263 test_scheduler_mode_pkt_size_distr_op(void)
14265 TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
14266 0, "Failed to set pktsize mode");
14272 scheduler_multicore_testsuite_setup(void)
14274 if (test_scheduler_attach_worker_op() < 0)
14275 return TEST_SKIPPED;
14276 if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
14277 return TEST_SKIPPED;
14282 scheduler_roundrobin_testsuite_setup(void)
14284 if (test_scheduler_attach_worker_op() < 0)
14285 return TEST_SKIPPED;
14286 if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
14287 return TEST_SKIPPED;
14292 scheduler_failover_testsuite_setup(void)
14294 if (test_scheduler_attach_worker_op() < 0)
14295 return TEST_SKIPPED;
14296 if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
14297 return TEST_SKIPPED;
14302 scheduler_pkt_size_distr_testsuite_setup(void)
14304 if (test_scheduler_attach_worker_op() < 0)
14305 return TEST_SKIPPED;
14306 if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
14307 return TEST_SKIPPED;
14312 scheduler_mode_testsuite_teardown(void)
14314 test_scheduler_detach_worker_op();
14317 #endif /* RTE_CRYPTO_SCHEDULER */
14319 static struct unit_test_suite end_testsuite = {
14320 .suite_name = NULL,
14323 .unit_test_suites = NULL
14326 #ifdef RTE_LIB_SECURITY
14327 static struct unit_test_suite ipsec_proto_testsuite = {
14328 .suite_name = "IPsec Proto Unit Test Suite",
14329 .setup = ipsec_proto_testsuite_setup,
14330 .unit_test_cases = {
14331 TEST_CASE_NAMED_WITH_DATA(
14332 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14333 ut_setup_security, ut_teardown,
14334 test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
14335 TEST_CASE_NAMED_WITH_DATA(
14336 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14337 ut_setup_security, ut_teardown,
14338 test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
14339 TEST_CASE_NAMED_WITH_DATA(
14340 "Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14341 ut_setup_security, ut_teardown,
14342 test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
14343 TEST_CASE_NAMED_WITH_DATA(
14344 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
14345 ut_setup_security, ut_teardown,
14346 test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
14347 TEST_CASE_NAMED_WITH_DATA(
14348 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
14349 ut_setup_security, ut_teardown,
14350 test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
14351 TEST_CASE_NAMED_WITH_DATA(
14352 "Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
14353 ut_setup_security, ut_teardown,
14354 test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
14355 TEST_CASE_NAMED_ST(
14356 "Combined test alg list",
14357 ut_setup_security, ut_teardown,
14358 test_ipsec_proto_display_list),
14359 TEST_CASE_NAMED_ST(
14361 ut_setup_security, ut_teardown,
14362 test_ipsec_proto_iv_gen),
14363 TEST_CASE_NAMED_ST(
14364 "UDP encapsulation",
14365 ut_setup_security, ut_teardown,
14366 test_ipsec_proto_udp_encap),
14367 TEST_CASE_NAMED_ST(
14368 "UDP encapsulation ports verification test",
14369 ut_setup_security, ut_teardown,
14370 test_ipsec_proto_udp_ports_verify),
14371 TEST_CASE_NAMED_ST(
14372 "SA expiry packets soft",
14373 ut_setup_security, ut_teardown,
14374 test_ipsec_proto_sa_exp_pkts_soft),
14375 TEST_CASE_NAMED_ST(
14376 "SA expiry packets hard",
14377 ut_setup_security, ut_teardown,
14378 test_ipsec_proto_sa_exp_pkts_hard),
14379 TEST_CASE_NAMED_ST(
14380 "Negative test: ICV corruption",
14381 ut_setup_security, ut_teardown,
14382 test_ipsec_proto_err_icv_corrupt),
14383 TEST_CASE_NAMED_ST(
14384 "Tunnel dst addr verification",
14385 ut_setup_security, ut_teardown,
14386 test_ipsec_proto_tunnel_dst_addr_verify),
14387 TEST_CASE_NAMED_ST(
14388 "Tunnel src and dst addr verification",
14389 ut_setup_security, ut_teardown,
14390 test_ipsec_proto_tunnel_src_dst_addr_verify),
14391 TEST_CASE_NAMED_ST(
14392 "Inner IP checksum",
14393 ut_setup_security, ut_teardown,
14394 test_ipsec_proto_inner_ip_csum),
14395 TEST_CASE_NAMED_ST(
14396 "Inner L4 checksum",
14397 ut_setup_security, ut_teardown,
14398 test_ipsec_proto_inner_l4_csum),
14399 TEST_CASES_END() /**< NULL terminate unit test array */
14403 static struct unit_test_suite pdcp_proto_testsuite = {
14404 .suite_name = "PDCP Proto Unit Test Suite",
14405 .setup = pdcp_proto_testsuite_setup,
14406 .unit_test_cases = {
14407 TEST_CASE_ST(ut_setup_security, ut_teardown,
14408 test_PDCP_PROTO_all),
14409 TEST_CASES_END() /**< NULL terminate unit test array */
14413 static struct unit_test_suite docsis_proto_testsuite = {
14414 .suite_name = "Docsis Proto Unit Test Suite",
14415 .setup = docsis_proto_testsuite_setup,
14416 .unit_test_cases = {
14417 TEST_CASE_ST(ut_setup_security, ut_teardown,
14418 test_DOCSIS_PROTO_all),
14419 TEST_CASES_END() /**< NULL terminate unit test array */
14424 static struct unit_test_suite cryptodev_gen_testsuite = {
14425 .suite_name = "Crypto General Unit Test Suite",
14426 .setup = crypto_gen_testsuite_setup,
14427 .unit_test_cases = {
14428 TEST_CASE_ST(ut_setup, ut_teardown,
14429 test_device_configure_invalid_dev_id),
14430 TEST_CASE_ST(ut_setup, ut_teardown,
14431 test_queue_pair_descriptor_setup),
14432 TEST_CASE_ST(ut_setup, ut_teardown,
14433 test_device_configure_invalid_queue_pair_ids),
14434 TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
14435 TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
14436 TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
14437 TEST_CASES_END() /**< NULL terminate unit test array */
14441 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
14442 .suite_name = "Negative HMAC SHA1 Unit Test Suite",
14443 .setup = negative_hmac_sha1_testsuite_setup,
14444 .unit_test_cases = {
14445 /** Negative tests */
14446 TEST_CASE_ST(ut_setup, ut_teardown,
14447 authentication_verify_HMAC_SHA1_fail_data_corrupt),
14448 TEST_CASE_ST(ut_setup, ut_teardown,
14449 authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14450 TEST_CASE_ST(ut_setup, ut_teardown,
14451 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14452 TEST_CASE_ST(ut_setup, ut_teardown,
14453 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14455 TEST_CASES_END() /**< NULL terminate unit test array */
14459 static struct unit_test_suite cryptodev_multi_session_testsuite = {
14460 .suite_name = "Multi Session Unit Test Suite",
14461 .setup = multi_session_testsuite_setup,
14462 .unit_test_cases = {
14463 TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14464 TEST_CASE_ST(ut_setup, ut_teardown,
14465 test_multi_session_random_usage),
14467 TEST_CASES_END() /**< NULL terminate unit test array */
14471 static struct unit_test_suite cryptodev_null_testsuite = {
14472 .suite_name = "NULL Test Suite",
14473 .setup = null_testsuite_setup,
14474 .unit_test_cases = {
14475 TEST_CASE_ST(ut_setup, ut_teardown,
14476 test_null_invalid_operation),
14477 TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
14482 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite = {
14483 .suite_name = "AES CCM Authenticated Test Suite",
14484 .setup = aes_ccm_auth_testsuite_setup,
14485 .unit_test_cases = {
14486 /** AES CCM Authenticated Encryption 128 bits key*/
14487 TEST_CASE_ST(ut_setup, ut_teardown,
14488 test_AES_CCM_authenticated_encryption_test_case_128_1),
14489 TEST_CASE_ST(ut_setup, ut_teardown,
14490 test_AES_CCM_authenticated_encryption_test_case_128_2),
14491 TEST_CASE_ST(ut_setup, ut_teardown,
14492 test_AES_CCM_authenticated_encryption_test_case_128_3),
14494 /** AES CCM Authenticated Decryption 128 bits key*/
14495 TEST_CASE_ST(ut_setup, ut_teardown,
14496 test_AES_CCM_authenticated_decryption_test_case_128_1),
14497 TEST_CASE_ST(ut_setup, ut_teardown,
14498 test_AES_CCM_authenticated_decryption_test_case_128_2),
14499 TEST_CASE_ST(ut_setup, ut_teardown,
14500 test_AES_CCM_authenticated_decryption_test_case_128_3),
14502 /** AES CCM Authenticated Encryption 192 bits key */
14503 TEST_CASE_ST(ut_setup, ut_teardown,
14504 test_AES_CCM_authenticated_encryption_test_case_192_1),
14505 TEST_CASE_ST(ut_setup, ut_teardown,
14506 test_AES_CCM_authenticated_encryption_test_case_192_2),
14507 TEST_CASE_ST(ut_setup, ut_teardown,
14508 test_AES_CCM_authenticated_encryption_test_case_192_3),
14510 /** AES CCM Authenticated Decryption 192 bits key*/
14511 TEST_CASE_ST(ut_setup, ut_teardown,
14512 test_AES_CCM_authenticated_decryption_test_case_192_1),
14513 TEST_CASE_ST(ut_setup, ut_teardown,
14514 test_AES_CCM_authenticated_decryption_test_case_192_2),
14515 TEST_CASE_ST(ut_setup, ut_teardown,
14516 test_AES_CCM_authenticated_decryption_test_case_192_3),
14518 /** AES CCM Authenticated Encryption 256 bits key */
14519 TEST_CASE_ST(ut_setup, ut_teardown,
14520 test_AES_CCM_authenticated_encryption_test_case_256_1),
14521 TEST_CASE_ST(ut_setup, ut_teardown,
14522 test_AES_CCM_authenticated_encryption_test_case_256_2),
14523 TEST_CASE_ST(ut_setup, ut_teardown,
14524 test_AES_CCM_authenticated_encryption_test_case_256_3),
14526 /** AES CCM Authenticated Decryption 256 bits key*/
14527 TEST_CASE_ST(ut_setup, ut_teardown,
14528 test_AES_CCM_authenticated_decryption_test_case_256_1),
14529 TEST_CASE_ST(ut_setup, ut_teardown,
14530 test_AES_CCM_authenticated_decryption_test_case_256_2),
14531 TEST_CASE_ST(ut_setup, ut_teardown,
14532 test_AES_CCM_authenticated_decryption_test_case_256_3),
14537 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite = {
14538 .suite_name = "AES GCM Authenticated Test Suite",
14539 .setup = aes_gcm_auth_testsuite_setup,
14540 .unit_test_cases = {
14541 /** AES GCM Authenticated Encryption */
14542 TEST_CASE_ST(ut_setup, ut_teardown,
14543 test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
14544 TEST_CASE_ST(ut_setup, ut_teardown,
14545 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
14546 TEST_CASE_ST(ut_setup, ut_teardown,
14547 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
14548 TEST_CASE_ST(ut_setup, ut_teardown,
14549 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
14550 TEST_CASE_ST(ut_setup, ut_teardown,
14551 test_AES_GCM_authenticated_encryption_test_case_1),
14552 TEST_CASE_ST(ut_setup, ut_teardown,
14553 test_AES_GCM_authenticated_encryption_test_case_2),
14554 TEST_CASE_ST(ut_setup, ut_teardown,
14555 test_AES_GCM_authenticated_encryption_test_case_3),
14556 TEST_CASE_ST(ut_setup, ut_teardown,
14557 test_AES_GCM_authenticated_encryption_test_case_4),
14558 TEST_CASE_ST(ut_setup, ut_teardown,
14559 test_AES_GCM_authenticated_encryption_test_case_5),
14560 TEST_CASE_ST(ut_setup, ut_teardown,
14561 test_AES_GCM_authenticated_encryption_test_case_6),
14562 TEST_CASE_ST(ut_setup, ut_teardown,
14563 test_AES_GCM_authenticated_encryption_test_case_7),
14564 TEST_CASE_ST(ut_setup, ut_teardown,
14565 test_AES_GCM_authenticated_encryption_test_case_8),
14566 TEST_CASE_ST(ut_setup, ut_teardown,
14567 test_AES_GCM_J0_authenticated_encryption_test_case_1),
14569 /** AES GCM Authenticated Decryption */
14570 TEST_CASE_ST(ut_setup, ut_teardown,
14571 test_AES_GCM_authenticated_decryption_test_case_1),
14572 TEST_CASE_ST(ut_setup, ut_teardown,
14573 test_AES_GCM_authenticated_decryption_test_case_2),
14574 TEST_CASE_ST(ut_setup, ut_teardown,
14575 test_AES_GCM_authenticated_decryption_test_case_3),
14576 TEST_CASE_ST(ut_setup, ut_teardown,
14577 test_AES_GCM_authenticated_decryption_test_case_4),
14578 TEST_CASE_ST(ut_setup, ut_teardown,
14579 test_AES_GCM_authenticated_decryption_test_case_5),
14580 TEST_CASE_ST(ut_setup, ut_teardown,
14581 test_AES_GCM_authenticated_decryption_test_case_6),
14582 TEST_CASE_ST(ut_setup, ut_teardown,
14583 test_AES_GCM_authenticated_decryption_test_case_7),
14584 TEST_CASE_ST(ut_setup, ut_teardown,
14585 test_AES_GCM_authenticated_decryption_test_case_8),
14586 TEST_CASE_ST(ut_setup, ut_teardown,
14587 test_AES_GCM_J0_authenticated_decryption_test_case_1),
14589 /** AES GCM Authenticated Encryption 192 bits key */
14590 TEST_CASE_ST(ut_setup, ut_teardown,
14591 test_AES_GCM_auth_encryption_test_case_192_1),
14592 TEST_CASE_ST(ut_setup, ut_teardown,
14593 test_AES_GCM_auth_encryption_test_case_192_2),
14594 TEST_CASE_ST(ut_setup, ut_teardown,
14595 test_AES_GCM_auth_encryption_test_case_192_3),
14596 TEST_CASE_ST(ut_setup, ut_teardown,
14597 test_AES_GCM_auth_encryption_test_case_192_4),
14598 TEST_CASE_ST(ut_setup, ut_teardown,
14599 test_AES_GCM_auth_encryption_test_case_192_5),
14600 TEST_CASE_ST(ut_setup, ut_teardown,
14601 test_AES_GCM_auth_encryption_test_case_192_6),
14602 TEST_CASE_ST(ut_setup, ut_teardown,
14603 test_AES_GCM_auth_encryption_test_case_192_7),
14605 /** AES GCM Authenticated Decryption 192 bits key */
14606 TEST_CASE_ST(ut_setup, ut_teardown,
14607 test_AES_GCM_auth_decryption_test_case_192_1),
14608 TEST_CASE_ST(ut_setup, ut_teardown,
14609 test_AES_GCM_auth_decryption_test_case_192_2),
14610 TEST_CASE_ST(ut_setup, ut_teardown,
14611 test_AES_GCM_auth_decryption_test_case_192_3),
14612 TEST_CASE_ST(ut_setup, ut_teardown,
14613 test_AES_GCM_auth_decryption_test_case_192_4),
14614 TEST_CASE_ST(ut_setup, ut_teardown,
14615 test_AES_GCM_auth_decryption_test_case_192_5),
14616 TEST_CASE_ST(ut_setup, ut_teardown,
14617 test_AES_GCM_auth_decryption_test_case_192_6),
14618 TEST_CASE_ST(ut_setup, ut_teardown,
14619 test_AES_GCM_auth_decryption_test_case_192_7),
14621 /** AES GCM Authenticated Encryption 256 bits key */
14622 TEST_CASE_ST(ut_setup, ut_teardown,
14623 test_AES_GCM_auth_encryption_test_case_256_1),
14624 TEST_CASE_ST(ut_setup, ut_teardown,
14625 test_AES_GCM_auth_encryption_test_case_256_2),
14626 TEST_CASE_ST(ut_setup, ut_teardown,
14627 test_AES_GCM_auth_encryption_test_case_256_3),
14628 TEST_CASE_ST(ut_setup, ut_teardown,
14629 test_AES_GCM_auth_encryption_test_case_256_4),
14630 TEST_CASE_ST(ut_setup, ut_teardown,
14631 test_AES_GCM_auth_encryption_test_case_256_5),
14632 TEST_CASE_ST(ut_setup, ut_teardown,
14633 test_AES_GCM_auth_encryption_test_case_256_6),
14634 TEST_CASE_ST(ut_setup, ut_teardown,
14635 test_AES_GCM_auth_encryption_test_case_256_7),
14637 /** AES GCM Authenticated Decryption 256 bits key */
14638 TEST_CASE_ST(ut_setup, ut_teardown,
14639 test_AES_GCM_auth_decryption_test_case_256_1),
14640 TEST_CASE_ST(ut_setup, ut_teardown,
14641 test_AES_GCM_auth_decryption_test_case_256_2),
14642 TEST_CASE_ST(ut_setup, ut_teardown,
14643 test_AES_GCM_auth_decryption_test_case_256_3),
14644 TEST_CASE_ST(ut_setup, ut_teardown,
14645 test_AES_GCM_auth_decryption_test_case_256_4),
14646 TEST_CASE_ST(ut_setup, ut_teardown,
14647 test_AES_GCM_auth_decryption_test_case_256_5),
14648 TEST_CASE_ST(ut_setup, ut_teardown,
14649 test_AES_GCM_auth_decryption_test_case_256_6),
14650 TEST_CASE_ST(ut_setup, ut_teardown,
14651 test_AES_GCM_auth_decryption_test_case_256_7),
14653 /** AES GCM Authenticated Encryption big aad size */
14654 TEST_CASE_ST(ut_setup, ut_teardown,
14655 test_AES_GCM_auth_encryption_test_case_aad_1),
14656 TEST_CASE_ST(ut_setup, ut_teardown,
14657 test_AES_GCM_auth_encryption_test_case_aad_2),
14659 /** AES GCM Authenticated Decryption big aad size */
14660 TEST_CASE_ST(ut_setup, ut_teardown,
14661 test_AES_GCM_auth_decryption_test_case_aad_1),
14662 TEST_CASE_ST(ut_setup, ut_teardown,
14663 test_AES_GCM_auth_decryption_test_case_aad_2),
14665 /** Out of place tests */
14666 TEST_CASE_ST(ut_setup, ut_teardown,
14667 test_AES_GCM_authenticated_encryption_oop_test_case_1),
14668 TEST_CASE_ST(ut_setup, ut_teardown,
14669 test_AES_GCM_authenticated_decryption_oop_test_case_1),
14671 /** Session-less tests */
14672 TEST_CASE_ST(ut_setup, ut_teardown,
14673 test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
14674 TEST_CASE_ST(ut_setup, ut_teardown,
14675 test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
14681 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite = {
14682 .suite_name = "AES GMAC Authentication Test Suite",
14683 .setup = aes_gmac_auth_testsuite_setup,
14684 .unit_test_cases = {
14685 TEST_CASE_ST(ut_setup, ut_teardown,
14686 test_AES_GMAC_authentication_test_case_1),
14687 TEST_CASE_ST(ut_setup, ut_teardown,
14688 test_AES_GMAC_authentication_verify_test_case_1),
14689 TEST_CASE_ST(ut_setup, ut_teardown,
14690 test_AES_GMAC_authentication_test_case_2),
14691 TEST_CASE_ST(ut_setup, ut_teardown,
14692 test_AES_GMAC_authentication_verify_test_case_2),
14693 TEST_CASE_ST(ut_setup, ut_teardown,
14694 test_AES_GMAC_authentication_test_case_3),
14695 TEST_CASE_ST(ut_setup, ut_teardown,
14696 test_AES_GMAC_authentication_verify_test_case_3),
14697 TEST_CASE_ST(ut_setup, ut_teardown,
14698 test_AES_GMAC_authentication_test_case_4),
14699 TEST_CASE_ST(ut_setup, ut_teardown,
14700 test_AES_GMAC_authentication_verify_test_case_4),
14701 TEST_CASE_ST(ut_setup, ut_teardown,
14702 test_AES_GMAC_authentication_SGL_40B),
14703 TEST_CASE_ST(ut_setup, ut_teardown,
14704 test_AES_GMAC_authentication_SGL_80B),
14705 TEST_CASE_ST(ut_setup, ut_teardown,
14706 test_AES_GMAC_authentication_SGL_2048B),
14707 TEST_CASE_ST(ut_setup, ut_teardown,
14708 test_AES_GMAC_authentication_SGL_2047B),
14714 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite = {
14715 .suite_name = "Chacha20-Poly1305 Test Suite",
14716 .setup = chacha20_poly1305_testsuite_setup,
14717 .unit_test_cases = {
14718 TEST_CASE_ST(ut_setup, ut_teardown,
14719 test_chacha20_poly1305_encrypt_test_case_rfc8439),
14720 TEST_CASE_ST(ut_setup, ut_teardown,
14721 test_chacha20_poly1305_decrypt_test_case_rfc8439),
14726 static struct unit_test_suite cryptodev_snow3g_testsuite = {
14727 .suite_name = "SNOW 3G Test Suite",
14728 .setup = snow3g_testsuite_setup,
14729 .unit_test_cases = {
14730 /** SNOW 3G encrypt only (UEA2) */
14731 TEST_CASE_ST(ut_setup, ut_teardown,
14732 test_snow3g_encryption_test_case_1),
14733 TEST_CASE_ST(ut_setup, ut_teardown,
14734 test_snow3g_encryption_test_case_2),
14735 TEST_CASE_ST(ut_setup, ut_teardown,
14736 test_snow3g_encryption_test_case_3),
14737 TEST_CASE_ST(ut_setup, ut_teardown,
14738 test_snow3g_encryption_test_case_4),
14739 TEST_CASE_ST(ut_setup, ut_teardown,
14740 test_snow3g_encryption_test_case_5),
14742 TEST_CASE_ST(ut_setup, ut_teardown,
14743 test_snow3g_encryption_test_case_1_oop),
14744 TEST_CASE_ST(ut_setup, ut_teardown,
14745 test_snow3g_encryption_test_case_1_oop_sgl),
14746 TEST_CASE_ST(ut_setup, ut_teardown,
14747 test_snow3g_encryption_test_case_1_offset_oop),
14748 TEST_CASE_ST(ut_setup, ut_teardown,
14749 test_snow3g_decryption_test_case_1_oop),
14751 /** SNOW 3G generate auth, then encrypt (UEA2) */
14752 TEST_CASE_ST(ut_setup, ut_teardown,
14753 test_snow3g_auth_cipher_test_case_1),
14754 TEST_CASE_ST(ut_setup, ut_teardown,
14755 test_snow3g_auth_cipher_test_case_2),
14756 TEST_CASE_ST(ut_setup, ut_teardown,
14757 test_snow3g_auth_cipher_test_case_2_oop),
14758 TEST_CASE_ST(ut_setup, ut_teardown,
14759 test_snow3g_auth_cipher_part_digest_enc),
14760 TEST_CASE_ST(ut_setup, ut_teardown,
14761 test_snow3g_auth_cipher_part_digest_enc_oop),
14762 TEST_CASE_ST(ut_setup, ut_teardown,
14763 test_snow3g_auth_cipher_test_case_3_sgl),
14764 TEST_CASE_ST(ut_setup, ut_teardown,
14765 test_snow3g_auth_cipher_test_case_3_oop_sgl),
14766 TEST_CASE_ST(ut_setup, ut_teardown,
14767 test_snow3g_auth_cipher_part_digest_enc_sgl),
14768 TEST_CASE_ST(ut_setup, ut_teardown,
14769 test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14771 /** SNOW 3G decrypt (UEA2), then verify auth */
14772 TEST_CASE_ST(ut_setup, ut_teardown,
14773 test_snow3g_auth_cipher_verify_test_case_1),
14774 TEST_CASE_ST(ut_setup, ut_teardown,
14775 test_snow3g_auth_cipher_verify_test_case_2),
14776 TEST_CASE_ST(ut_setup, ut_teardown,
14777 test_snow3g_auth_cipher_verify_test_case_2_oop),
14778 TEST_CASE_ST(ut_setup, ut_teardown,
14779 test_snow3g_auth_cipher_verify_part_digest_enc),
14780 TEST_CASE_ST(ut_setup, ut_teardown,
14781 test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14782 TEST_CASE_ST(ut_setup, ut_teardown,
14783 test_snow3g_auth_cipher_verify_test_case_3_sgl),
14784 TEST_CASE_ST(ut_setup, ut_teardown,
14785 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14786 TEST_CASE_ST(ut_setup, ut_teardown,
14787 test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14788 TEST_CASE_ST(ut_setup, ut_teardown,
14789 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14791 /** SNOW 3G decrypt only (UEA2) */
14792 TEST_CASE_ST(ut_setup, ut_teardown,
14793 test_snow3g_decryption_test_case_1),
14794 TEST_CASE_ST(ut_setup, ut_teardown,
14795 test_snow3g_decryption_test_case_2),
14796 TEST_CASE_ST(ut_setup, ut_teardown,
14797 test_snow3g_decryption_test_case_3),
14798 TEST_CASE_ST(ut_setup, ut_teardown,
14799 test_snow3g_decryption_test_case_4),
14800 TEST_CASE_ST(ut_setup, ut_teardown,
14801 test_snow3g_decryption_test_case_5),
14802 TEST_CASE_ST(ut_setup, ut_teardown,
14803 test_snow3g_decryption_with_digest_test_case_1),
14804 TEST_CASE_ST(ut_setup, ut_teardown,
14805 test_snow3g_hash_generate_test_case_1),
14806 TEST_CASE_ST(ut_setup, ut_teardown,
14807 test_snow3g_hash_generate_test_case_2),
14808 TEST_CASE_ST(ut_setup, ut_teardown,
14809 test_snow3g_hash_generate_test_case_3),
14811 /* Tests with buffers which length is not byte-aligned */
14812 TEST_CASE_ST(ut_setup, ut_teardown,
14813 test_snow3g_hash_generate_test_case_4),
14814 TEST_CASE_ST(ut_setup, ut_teardown,
14815 test_snow3g_hash_generate_test_case_5),
14816 TEST_CASE_ST(ut_setup, ut_teardown,
14817 test_snow3g_hash_generate_test_case_6),
14818 TEST_CASE_ST(ut_setup, ut_teardown,
14819 test_snow3g_hash_verify_test_case_1),
14820 TEST_CASE_ST(ut_setup, ut_teardown,
14821 test_snow3g_hash_verify_test_case_2),
14822 TEST_CASE_ST(ut_setup, ut_teardown,
14823 test_snow3g_hash_verify_test_case_3),
14825 /* Tests with buffers which length is not byte-aligned */
14826 TEST_CASE_ST(ut_setup, ut_teardown,
14827 test_snow3g_hash_verify_test_case_4),
14828 TEST_CASE_ST(ut_setup, ut_teardown,
14829 test_snow3g_hash_verify_test_case_5),
14830 TEST_CASE_ST(ut_setup, ut_teardown,
14831 test_snow3g_hash_verify_test_case_6),
14832 TEST_CASE_ST(ut_setup, ut_teardown,
14833 test_snow3g_cipher_auth_test_case_1),
14834 TEST_CASE_ST(ut_setup, ut_teardown,
14835 test_snow3g_auth_cipher_with_digest_test_case_1),
14840 static struct unit_test_suite cryptodev_zuc_testsuite = {
14841 .suite_name = "ZUC Test Suite",
14842 .setup = zuc_testsuite_setup,
14843 .unit_test_cases = {
14844 /** ZUC encrypt only (EEA3) */
14845 TEST_CASE_ST(ut_setup, ut_teardown,
14846 test_zuc_encryption_test_case_1),
14847 TEST_CASE_ST(ut_setup, ut_teardown,
14848 test_zuc_encryption_test_case_2),
14849 TEST_CASE_ST(ut_setup, ut_teardown,
14850 test_zuc_encryption_test_case_3),
14851 TEST_CASE_ST(ut_setup, ut_teardown,
14852 test_zuc_encryption_test_case_4),
14853 TEST_CASE_ST(ut_setup, ut_teardown,
14854 test_zuc_encryption_test_case_5),
14855 TEST_CASE_ST(ut_setup, ut_teardown,
14856 test_zuc_encryption_test_case_6_sgl),
14857 TEST_CASE_ST(ut_setup, ut_teardown,
14858 test_zuc_encryption_test_case_7),
14860 /** ZUC authenticate (EIA3) */
14861 TEST_CASE_ST(ut_setup, ut_teardown,
14862 test_zuc_hash_generate_test_case_1),
14863 TEST_CASE_ST(ut_setup, ut_teardown,
14864 test_zuc_hash_generate_test_case_2),
14865 TEST_CASE_ST(ut_setup, ut_teardown,
14866 test_zuc_hash_generate_test_case_3),
14867 TEST_CASE_ST(ut_setup, ut_teardown,
14868 test_zuc_hash_generate_test_case_4),
14869 TEST_CASE_ST(ut_setup, ut_teardown,
14870 test_zuc_hash_generate_test_case_5),
14871 TEST_CASE_ST(ut_setup, ut_teardown,
14872 test_zuc_hash_generate_test_case_6),
14873 TEST_CASE_ST(ut_setup, ut_teardown,
14874 test_zuc_hash_generate_test_case_7),
14875 TEST_CASE_ST(ut_setup, ut_teardown,
14876 test_zuc_hash_generate_test_case_8),
14877 TEST_CASE_ST(ut_setup, ut_teardown,
14878 test_zuc_hash_generate_test_case_9),
14879 TEST_CASE_ST(ut_setup, ut_teardown,
14880 test_zuc_hash_generate_test_case_10),
14883 /** ZUC alg-chain (EEA3/EIA3) */
14884 TEST_CASE_ST(ut_setup, ut_teardown,
14885 test_zuc_cipher_auth_test_case_1),
14886 TEST_CASE_ST(ut_setup, ut_teardown,
14887 test_zuc_cipher_auth_test_case_2),
14889 /** ZUC generate auth, then encrypt (EEA3) */
14890 TEST_CASE_ST(ut_setup, ut_teardown,
14891 test_zuc_auth_cipher_test_case_1),
14892 TEST_CASE_ST(ut_setup, ut_teardown,
14893 test_zuc_auth_cipher_test_case_1_oop),
14894 TEST_CASE_ST(ut_setup, ut_teardown,
14895 test_zuc_auth_cipher_test_case_1_sgl),
14896 TEST_CASE_ST(ut_setup, ut_teardown,
14897 test_zuc_auth_cipher_test_case_1_oop_sgl),
14899 /** ZUC decrypt (EEA3), then verify auth */
14900 TEST_CASE_ST(ut_setup, ut_teardown,
14901 test_zuc_auth_cipher_verify_test_case_1),
14902 TEST_CASE_ST(ut_setup, ut_teardown,
14903 test_zuc_auth_cipher_verify_test_case_1_oop),
14904 TEST_CASE_ST(ut_setup, ut_teardown,
14905 test_zuc_auth_cipher_verify_test_case_1_sgl),
14906 TEST_CASE_ST(ut_setup, ut_teardown,
14907 test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14912 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite = {
14913 .suite_name = "HMAC_MD5 Authentication Test Suite",
14914 .setup = hmac_md5_auth_testsuite_setup,
14915 .unit_test_cases = {
14916 TEST_CASE_ST(ut_setup, ut_teardown,
14917 test_MD5_HMAC_generate_case_1),
14918 TEST_CASE_ST(ut_setup, ut_teardown,
14919 test_MD5_HMAC_verify_case_1),
14920 TEST_CASE_ST(ut_setup, ut_teardown,
14921 test_MD5_HMAC_generate_case_2),
14922 TEST_CASE_ST(ut_setup, ut_teardown,
14923 test_MD5_HMAC_verify_case_2),
14928 static struct unit_test_suite cryptodev_kasumi_testsuite = {
14929 .suite_name = "Kasumi Test Suite",
14930 .setup = kasumi_testsuite_setup,
14931 .unit_test_cases = {
14932 /** KASUMI hash only (UIA1) */
14933 TEST_CASE_ST(ut_setup, ut_teardown,
14934 test_kasumi_hash_generate_test_case_1),
14935 TEST_CASE_ST(ut_setup, ut_teardown,
14936 test_kasumi_hash_generate_test_case_2),
14937 TEST_CASE_ST(ut_setup, ut_teardown,
14938 test_kasumi_hash_generate_test_case_3),
14939 TEST_CASE_ST(ut_setup, ut_teardown,
14940 test_kasumi_hash_generate_test_case_4),
14941 TEST_CASE_ST(ut_setup, ut_teardown,
14942 test_kasumi_hash_generate_test_case_5),
14943 TEST_CASE_ST(ut_setup, ut_teardown,
14944 test_kasumi_hash_generate_test_case_6),
14946 TEST_CASE_ST(ut_setup, ut_teardown,
14947 test_kasumi_hash_verify_test_case_1),
14948 TEST_CASE_ST(ut_setup, ut_teardown,
14949 test_kasumi_hash_verify_test_case_2),
14950 TEST_CASE_ST(ut_setup, ut_teardown,
14951 test_kasumi_hash_verify_test_case_3),
14952 TEST_CASE_ST(ut_setup, ut_teardown,
14953 test_kasumi_hash_verify_test_case_4),
14954 TEST_CASE_ST(ut_setup, ut_teardown,
14955 test_kasumi_hash_verify_test_case_5),
14957 /** KASUMI encrypt only (UEA1) */
14958 TEST_CASE_ST(ut_setup, ut_teardown,
14959 test_kasumi_encryption_test_case_1),
14960 TEST_CASE_ST(ut_setup, ut_teardown,
14961 test_kasumi_encryption_test_case_1_sgl),
14962 TEST_CASE_ST(ut_setup, ut_teardown,
14963 test_kasumi_encryption_test_case_1_oop),
14964 TEST_CASE_ST(ut_setup, ut_teardown,
14965 test_kasumi_encryption_test_case_1_oop_sgl),
14966 TEST_CASE_ST(ut_setup, ut_teardown,
14967 test_kasumi_encryption_test_case_2),
14968 TEST_CASE_ST(ut_setup, ut_teardown,
14969 test_kasumi_encryption_test_case_3),
14970 TEST_CASE_ST(ut_setup, ut_teardown,
14971 test_kasumi_encryption_test_case_4),
14972 TEST_CASE_ST(ut_setup, ut_teardown,
14973 test_kasumi_encryption_test_case_5),
14975 /** KASUMI decrypt only (UEA1) */
14976 TEST_CASE_ST(ut_setup, ut_teardown,
14977 test_kasumi_decryption_test_case_1),
14978 TEST_CASE_ST(ut_setup, ut_teardown,
14979 test_kasumi_decryption_test_case_2),
14980 TEST_CASE_ST(ut_setup, ut_teardown,
14981 test_kasumi_decryption_test_case_3),
14982 TEST_CASE_ST(ut_setup, ut_teardown,
14983 test_kasumi_decryption_test_case_4),
14984 TEST_CASE_ST(ut_setup, ut_teardown,
14985 test_kasumi_decryption_test_case_5),
14986 TEST_CASE_ST(ut_setup, ut_teardown,
14987 test_kasumi_decryption_test_case_1_oop),
14988 TEST_CASE_ST(ut_setup, ut_teardown,
14989 test_kasumi_cipher_auth_test_case_1),
14991 /** KASUMI generate auth, then encrypt (F8) */
14992 TEST_CASE_ST(ut_setup, ut_teardown,
14993 test_kasumi_auth_cipher_test_case_1),
14994 TEST_CASE_ST(ut_setup, ut_teardown,
14995 test_kasumi_auth_cipher_test_case_2),
14996 TEST_CASE_ST(ut_setup, ut_teardown,
14997 test_kasumi_auth_cipher_test_case_2_oop),
14998 TEST_CASE_ST(ut_setup, ut_teardown,
14999 test_kasumi_auth_cipher_test_case_2_sgl),
15000 TEST_CASE_ST(ut_setup, ut_teardown,
15001 test_kasumi_auth_cipher_test_case_2_oop_sgl),
15003 /** KASUMI decrypt (F8), then verify auth */
15004 TEST_CASE_ST(ut_setup, ut_teardown,
15005 test_kasumi_auth_cipher_verify_test_case_1),
15006 TEST_CASE_ST(ut_setup, ut_teardown,
15007 test_kasumi_auth_cipher_verify_test_case_2),
15008 TEST_CASE_ST(ut_setup, ut_teardown,
15009 test_kasumi_auth_cipher_verify_test_case_2_oop),
15010 TEST_CASE_ST(ut_setup, ut_teardown,
15011 test_kasumi_auth_cipher_verify_test_case_2_sgl),
15012 TEST_CASE_ST(ut_setup, ut_teardown,
15013 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
15019 static struct unit_test_suite cryptodev_esn_testsuite = {
15020 .suite_name = "ESN Test Suite",
15021 .setup = esn_testsuite_setup,
15022 .unit_test_cases = {
15023 TEST_CASE_ST(ut_setup, ut_teardown,
15024 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
15025 TEST_CASE_ST(ut_setup, ut_teardown,
15026 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
15031 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite = {
15032 .suite_name = "Negative AES GCM Test Suite",
15033 .setup = negative_aes_gcm_testsuite_setup,
15034 .unit_test_cases = {
15035 TEST_CASE_ST(ut_setup, ut_teardown,
15036 test_AES_GCM_auth_encryption_fail_iv_corrupt),
15037 TEST_CASE_ST(ut_setup, ut_teardown,
15038 test_AES_GCM_auth_encryption_fail_in_data_corrupt),
15039 TEST_CASE_ST(ut_setup, ut_teardown,
15040 test_AES_GCM_auth_encryption_fail_out_data_corrupt),
15041 TEST_CASE_ST(ut_setup, ut_teardown,
15042 test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
15043 TEST_CASE_ST(ut_setup, ut_teardown,
15044 test_AES_GCM_auth_encryption_fail_aad_corrupt),
15045 TEST_CASE_ST(ut_setup, ut_teardown,
15046 test_AES_GCM_auth_encryption_fail_tag_corrupt),
15047 TEST_CASE_ST(ut_setup, ut_teardown,
15048 test_AES_GCM_auth_decryption_fail_iv_corrupt),
15049 TEST_CASE_ST(ut_setup, ut_teardown,
15050 test_AES_GCM_auth_decryption_fail_in_data_corrupt),
15051 TEST_CASE_ST(ut_setup, ut_teardown,
15052 test_AES_GCM_auth_decryption_fail_out_data_corrupt),
15053 TEST_CASE_ST(ut_setup, ut_teardown,
15054 test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
15055 TEST_CASE_ST(ut_setup, ut_teardown,
15056 test_AES_GCM_auth_decryption_fail_aad_corrupt),
15057 TEST_CASE_ST(ut_setup, ut_teardown,
15058 test_AES_GCM_auth_decryption_fail_tag_corrupt),
15064 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite = {
15065 .suite_name = "Negative AES GMAC Test Suite",
15066 .setup = negative_aes_gmac_testsuite_setup,
15067 .unit_test_cases = {
15068 TEST_CASE_ST(ut_setup, ut_teardown,
15069 authentication_verify_AES128_GMAC_fail_data_corrupt),
15070 TEST_CASE_ST(ut_setup, ut_teardown,
15071 authentication_verify_AES128_GMAC_fail_tag_corrupt),
15077 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite = {
15078 .suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
15079 .setup = mixed_cipher_hash_testsuite_setup,
15080 .unit_test_cases = {
15081 /** AUTH AES CMAC + CIPHER AES CTR */
15082 TEST_CASE_ST(ut_setup, ut_teardown,
15083 test_aes_cmac_aes_ctr_digest_enc_test_case_1),
15084 TEST_CASE_ST(ut_setup, ut_teardown,
15085 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15086 TEST_CASE_ST(ut_setup, ut_teardown,
15087 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15088 TEST_CASE_ST(ut_setup, ut_teardown,
15089 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15090 TEST_CASE_ST(ut_setup, ut_teardown,
15091 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
15092 TEST_CASE_ST(ut_setup, ut_teardown,
15093 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
15094 TEST_CASE_ST(ut_setup, ut_teardown,
15095 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
15096 TEST_CASE_ST(ut_setup, ut_teardown,
15097 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
15099 /** AUTH ZUC + CIPHER SNOW3G */
15100 TEST_CASE_ST(ut_setup, ut_teardown,
15101 test_auth_zuc_cipher_snow_test_case_1),
15102 TEST_CASE_ST(ut_setup, ut_teardown,
15103 test_verify_auth_zuc_cipher_snow_test_case_1),
15104 /** AUTH AES CMAC + CIPHER SNOW3G */
15105 TEST_CASE_ST(ut_setup, ut_teardown,
15106 test_auth_aes_cmac_cipher_snow_test_case_1),
15107 TEST_CASE_ST(ut_setup, ut_teardown,
15108 test_verify_auth_aes_cmac_cipher_snow_test_case_1),
15109 /** AUTH ZUC + CIPHER AES CTR */
15110 TEST_CASE_ST(ut_setup, ut_teardown,
15111 test_auth_zuc_cipher_aes_ctr_test_case_1),
15112 TEST_CASE_ST(ut_setup, ut_teardown,
15113 test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
15114 /** AUTH SNOW3G + CIPHER AES CTR */
15115 TEST_CASE_ST(ut_setup, ut_teardown,
15116 test_auth_snow_cipher_aes_ctr_test_case_1),
15117 TEST_CASE_ST(ut_setup, ut_teardown,
15118 test_verify_auth_snow_cipher_aes_ctr_test_case_1),
15119 /** AUTH SNOW3G + CIPHER ZUC */
15120 TEST_CASE_ST(ut_setup, ut_teardown,
15121 test_auth_snow_cipher_zuc_test_case_1),
15122 TEST_CASE_ST(ut_setup, ut_teardown,
15123 test_verify_auth_snow_cipher_zuc_test_case_1),
15124 /** AUTH AES CMAC + CIPHER ZUC */
15125 TEST_CASE_ST(ut_setup, ut_teardown,
15126 test_auth_aes_cmac_cipher_zuc_test_case_1),
15127 TEST_CASE_ST(ut_setup, ut_teardown,
15128 test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
15130 /** AUTH NULL + CIPHER SNOW3G */
15131 TEST_CASE_ST(ut_setup, ut_teardown,
15132 test_auth_null_cipher_snow_test_case_1),
15133 TEST_CASE_ST(ut_setup, ut_teardown,
15134 test_verify_auth_null_cipher_snow_test_case_1),
15135 /** AUTH NULL + CIPHER ZUC */
15136 TEST_CASE_ST(ut_setup, ut_teardown,
15137 test_auth_null_cipher_zuc_test_case_1),
15138 TEST_CASE_ST(ut_setup, ut_teardown,
15139 test_verify_auth_null_cipher_zuc_test_case_1),
15140 /** AUTH SNOW3G + CIPHER NULL */
15141 TEST_CASE_ST(ut_setup, ut_teardown,
15142 test_auth_snow_cipher_null_test_case_1),
15143 TEST_CASE_ST(ut_setup, ut_teardown,
15144 test_verify_auth_snow_cipher_null_test_case_1),
15145 /** AUTH ZUC + CIPHER NULL */
15146 TEST_CASE_ST(ut_setup, ut_teardown,
15147 test_auth_zuc_cipher_null_test_case_1),
15148 TEST_CASE_ST(ut_setup, ut_teardown,
15149 test_verify_auth_zuc_cipher_null_test_case_1),
15150 /** AUTH NULL + CIPHER AES CTR */
15151 TEST_CASE_ST(ut_setup, ut_teardown,
15152 test_auth_null_cipher_aes_ctr_test_case_1),
15153 TEST_CASE_ST(ut_setup, ut_teardown,
15154 test_verify_auth_null_cipher_aes_ctr_test_case_1),
15155 /** AUTH AES CMAC + CIPHER NULL */
15156 TEST_CASE_ST(ut_setup, ut_teardown,
15157 test_auth_aes_cmac_cipher_null_test_case_1),
15158 TEST_CASE_ST(ut_setup, ut_teardown,
15159 test_verify_auth_aes_cmac_cipher_null_test_case_1),
15165 run_cryptodev_testsuite(const char *pmd_name)
15167 uint8_t ret, j, i = 0, blk_start_idx = 0;
15168 const enum blockcipher_test_type blk_suites[] = {
15169 BLKCIPHER_AES_CHAIN_TYPE,
15170 BLKCIPHER_AES_CIPHERONLY_TYPE,
15171 BLKCIPHER_AES_DOCSIS_TYPE,
15172 BLKCIPHER_3DES_CHAIN_TYPE,
15173 BLKCIPHER_3DES_CIPHERONLY_TYPE,
15174 BLKCIPHER_DES_CIPHERONLY_TYPE,
15175 BLKCIPHER_DES_DOCSIS_TYPE,
15176 BLKCIPHER_AUTHONLY_TYPE};
15177 struct unit_test_suite *static_suites[] = {
15178 &cryptodev_multi_session_testsuite,
15179 &cryptodev_null_testsuite,
15180 &cryptodev_aes_ccm_auth_testsuite,
15181 &cryptodev_aes_gcm_auth_testsuite,
15182 &cryptodev_aes_gmac_auth_testsuite,
15183 &cryptodev_snow3g_testsuite,
15184 &cryptodev_chacha20_poly1305_testsuite,
15185 &cryptodev_zuc_testsuite,
15186 &cryptodev_hmac_md5_auth_testsuite,
15187 &cryptodev_kasumi_testsuite,
15188 &cryptodev_esn_testsuite,
15189 &cryptodev_negative_aes_gcm_testsuite,
15190 &cryptodev_negative_aes_gmac_testsuite,
15191 &cryptodev_mixed_cipher_hash_testsuite,
15192 &cryptodev_negative_hmac_sha1_testsuite,
15193 &cryptodev_gen_testsuite,
15194 #ifdef RTE_LIB_SECURITY
15195 &ipsec_proto_testsuite,
15196 &pdcp_proto_testsuite,
15197 &docsis_proto_testsuite,
15201 static struct unit_test_suite ts = {
15202 .suite_name = "Cryptodev Unit Test Suite",
15203 .setup = testsuite_setup,
15204 .teardown = testsuite_teardown,
15205 .unit_test_cases = {TEST_CASES_END()}
15208 gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
15210 if (gbl_driver_id == -1) {
15211 RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
15212 return TEST_SKIPPED;
15215 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15216 (RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
15218 ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
15219 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15220 ret = unit_test_suite_runner(&ts);
15222 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
15223 free(ts.unit_test_suites);
15228 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
15230 struct rte_cryptodev_info dev_info;
15231 uint8_t i, nb_devs;
15234 driver_id = rte_cryptodev_driver_id_get(pmd_name);
15235 if (driver_id == -1) {
15236 RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
15237 return TEST_SKIPPED;
15240 nb_devs = rte_cryptodev_count();
15242 RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
15243 return TEST_SKIPPED;
15246 for (i = 0; i < nb_devs; i++) {
15247 rte_cryptodev_info_get(i, &dev_info);
15248 if (dev_info.driver_id == driver_id) {
15249 if (!(dev_info.feature_flags & flag)) {
15250 RTE_LOG(INFO, USER1, "%s not supported\n",
15252 return TEST_SKIPPED;
15254 return 0; /* found */
15258 RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
15259 return TEST_SKIPPED;
15263 test_cryptodev_qat(void)
15265 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
15269 test_cryptodev_virtio(void)
15271 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
15275 test_cryptodev_aesni_mb(void)
15277 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15281 test_cryptodev_cpu_aesni_mb(void)
15284 enum rte_security_session_action_type at = gbl_action_type;
15285 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15286 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
15287 gbl_action_type = at;
15292 test_cryptodev_openssl(void)
15294 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
15298 test_cryptodev_aesni_gcm(void)
15300 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15304 test_cryptodev_cpu_aesni_gcm(void)
15307 enum rte_security_session_action_type at = gbl_action_type;
15308 gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
15309 rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
15310 gbl_action_type = at;
15315 test_cryptodev_mlx5(void)
15317 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
15321 test_cryptodev_null(void)
15323 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
15327 test_cryptodev_sw_snow3g(void)
15329 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
15333 test_cryptodev_sw_kasumi(void)
15335 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
15339 test_cryptodev_sw_zuc(void)
15341 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
15345 test_cryptodev_armv8(void)
15347 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
15351 test_cryptodev_mrvl(void)
15353 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
15356 #ifdef RTE_CRYPTO_SCHEDULER
15359 test_cryptodev_scheduler(void)
15361 uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
15362 const enum blockcipher_test_type blk_suites[] = {
15363 BLKCIPHER_AES_CHAIN_TYPE,
15364 BLKCIPHER_AES_CIPHERONLY_TYPE,
15365 BLKCIPHER_AUTHONLY_TYPE
15367 static struct unit_test_suite scheduler_multicore = {
15368 .suite_name = "Scheduler Multicore Unit Test Suite",
15369 .setup = scheduler_multicore_testsuite_setup,
15370 .teardown = scheduler_mode_testsuite_teardown,
15371 .unit_test_cases = {TEST_CASES_END()}
15373 static struct unit_test_suite scheduler_round_robin = {
15374 .suite_name = "Scheduler Round Robin Unit Test Suite",
15375 .setup = scheduler_roundrobin_testsuite_setup,
15376 .teardown = scheduler_mode_testsuite_teardown,
15377 .unit_test_cases = {TEST_CASES_END()}
15379 static struct unit_test_suite scheduler_failover = {
15380 .suite_name = "Scheduler Failover Unit Test Suite",
15381 .setup = scheduler_failover_testsuite_setup,
15382 .teardown = scheduler_mode_testsuite_teardown,
15383 .unit_test_cases = {TEST_CASES_END()}
15385 static struct unit_test_suite scheduler_pkt_size_distr = {
15386 .suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
15387 .setup = scheduler_pkt_size_distr_testsuite_setup,
15388 .teardown = scheduler_mode_testsuite_teardown,
15389 .unit_test_cases = {TEST_CASES_END()}
15391 struct unit_test_suite *sched_mode_suites[] = {
15392 &scheduler_multicore,
15393 &scheduler_round_robin,
15394 &scheduler_failover,
15395 &scheduler_pkt_size_distr
15397 static struct unit_test_suite scheduler_config = {
15398 .suite_name = "Crypto Device Scheduler Config Unit Test Suite",
15399 .unit_test_cases = {
15400 TEST_CASE(test_scheduler_attach_worker_op),
15401 TEST_CASE(test_scheduler_mode_multicore_op),
15402 TEST_CASE(test_scheduler_mode_roundrobin_op),
15403 TEST_CASE(test_scheduler_mode_failover_op),
15404 TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
15405 TEST_CASE(test_scheduler_detach_worker_op),
15407 TEST_CASES_END() /**< NULL terminate array */
15410 struct unit_test_suite *static_suites[] = {
15414 static struct unit_test_suite ts = {
15415 .suite_name = "Scheduler Unit Test Suite",
15416 .setup = scheduler_testsuite_setup,
15417 .teardown = testsuite_teardown,
15418 .unit_test_cases = {TEST_CASES_END()}
15421 gbl_driver_id = rte_cryptodev_driver_id_get(
15422 RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
15424 if (gbl_driver_id == -1) {
15425 RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
15426 return TEST_SKIPPED;
15429 if (rte_cryptodev_driver_id_get(
15430 RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
15431 RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
15432 return TEST_SKIPPED;
15435 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15437 sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
15438 (struct unit_test_suite *) *
15439 (RTE_DIM(blk_suites) + 1));
15440 ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
15441 blk_suites, RTE_DIM(blk_suites));
15442 sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
15445 ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
15446 (RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
15447 ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
15448 RTE_DIM(sched_mode_suites));
15449 ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
15450 ret = unit_test_suite_runner(&ts);
15452 for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
15453 FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
15454 (*sched_mode_suites[sched_i]),
15455 RTE_DIM(blk_suites));
15456 free(sched_mode_suites[sched_i]->unit_test_suites);
15458 free(ts.unit_test_suites);
15462 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
15467 test_cryptodev_dpaa2_sec(void)
15469 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
15473 test_cryptodev_dpaa_sec(void)
15475 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
15479 test_cryptodev_ccp(void)
15481 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
15485 test_cryptodev_octeontx(void)
15487 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
15491 test_cryptodev_octeontx2(void)
15493 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
15497 test_cryptodev_caam_jr(void)
15499 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
15503 test_cryptodev_nitrox(void)
15505 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
15509 test_cryptodev_bcmfs(void)
15511 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
15515 test_cryptodev_qat_raw_api(void)
15517 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
15520 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15525 global_api_test_type = CRYPTODEV_RAW_API_TEST;
15526 ret = run_cryptodev_testsuite(pmd_name);
15527 global_api_test_type = CRYPTODEV_API_TEST;
15533 test_cryptodev_cn9k(void)
15535 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
15539 test_cryptodev_cn10k(void)
15541 return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
15545 test_cryptodev_dpaa2_sec_raw_api(void)
15547 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15550 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15555 global_api_test_type = CRYPTODEV_RAW_API_TEST;
15556 ret = run_cryptodev_testsuite(pmd_name);
15557 global_api_test_type = CRYPTODEV_API_TEST;
15563 test_cryptodev_dpaa_sec_raw_api(void)
15565 static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
15568 ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
15573 global_api_test_type = CRYPTODEV_RAW_API_TEST;
15574 ret = run_cryptodev_testsuite(pmd_name);
15575 global_api_test_type = CRYPTODEV_API_TEST;
15580 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
15581 test_cryptodev_dpaa2_sec_raw_api);
15582 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
15583 test_cryptodev_dpaa_sec_raw_api);
15584 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
15585 test_cryptodev_qat_raw_api);
15586 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
15587 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
15588 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
15589 test_cryptodev_cpu_aesni_mb);
15590 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
15591 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
15592 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
15593 test_cryptodev_cpu_aesni_gcm);
15594 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
15595 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
15596 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
15597 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
15598 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
15599 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
15600 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
15601 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
15602 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
15603 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
15604 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
15605 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
15606 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
15607 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
15608 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
15609 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
15610 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
15611 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);