xref: /dpdk/app/test/test_cryptodev.c (revision 23bdcedc)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2019 Intel Corporation
3  */
4 
5 #include <time.h>
6 
7 #include <rte_common.h>
8 #include <rte_hexdump.h>
9 #include <rte_mbuf.h>
10 #include <rte_malloc.h>
11 #include <rte_memcpy.h>
12 #include <rte_pause.h>
13 #include <rte_bus_vdev.h>
14 
15 #include <rte_crypto.h>
16 #include <rte_cryptodev.h>
17 #include <rte_cryptodev_pmd.h>
18 #include <rte_string_fns.h>
19 
20 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
21 #include <rte_cryptodev_scheduler.h>
22 #include <rte_cryptodev_scheduler_operations.h>
23 #endif
24 
25 #include <rte_lcore.h>
26 
27 #include "test.h"
28 #include "test_cryptodev.h"
29 
30 #include "test_cryptodev_blockcipher.h"
31 #include "test_cryptodev_aes_test_vectors.h"
32 #include "test_cryptodev_des_test_vectors.h"
33 #include "test_cryptodev_hash_test_vectors.h"
34 #include "test_cryptodev_kasumi_test_vectors.h"
35 #include "test_cryptodev_kasumi_hash_test_vectors.h"
36 #include "test_cryptodev_snow3g_test_vectors.h"
37 #include "test_cryptodev_snow3g_hash_test_vectors.h"
38 #include "test_cryptodev_zuc_test_vectors.h"
39 #include "test_cryptodev_aead_test_vectors.h"
40 #include "test_cryptodev_hmac_test_vectors.h"
41 #include "test_cryptodev_mixed_test_vectors.h"
42 #ifdef RTE_LIBRTE_SECURITY
43 #include "test_cryptodev_security_pdcp_test_vectors.h"
44 #include "test_cryptodev_security_pdcp_test_func.h"
45 #endif
46 
47 #define VDEV_ARGS_SIZE 100
48 #define MAX_NB_SESSIONS 4
49 
50 #define IN_PLACE 0
51 #define OUT_OF_PLACE 1
52 
53 static int gbl_driver_id;
54 
55 struct crypto_testsuite_params {
56 	struct rte_mempool *mbuf_pool;
57 	struct rte_mempool *large_mbuf_pool;
58 	struct rte_mempool *op_mpool;
59 	struct rte_mempool *session_mpool;
60 	struct rte_mempool *session_priv_mpool;
61 	struct rte_cryptodev_config conf;
62 	struct rte_cryptodev_qp_conf qp_conf;
63 
64 	uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
65 	uint8_t valid_dev_count;
66 };
67 
68 struct crypto_unittest_params {
69 	struct rte_crypto_sym_xform cipher_xform;
70 	struct rte_crypto_sym_xform auth_xform;
71 	struct rte_crypto_sym_xform aead_xform;
72 
73 	union {
74 		struct rte_cryptodev_sym_session *sess;
75 #ifdef RTE_LIBRTE_SECURITY
76 		struct rte_security_session *sec_session;
77 #endif
78 	};
79 #ifdef RTE_LIBRTE_SECURITY
80 	enum rte_security_session_action_type type;
81 #endif
82 	struct rte_crypto_op *op;
83 
84 	struct rte_mbuf *obuf, *ibuf;
85 
86 	uint8_t *digest;
87 };
88 
89 #define ALIGN_POW2_ROUNDUP(num, align) \
90 	(((num) + (align) - 1) & ~((align) - 1))
91 
92 /*
93  * Forward declarations.
94  */
95 static int
96 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
97 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
98 		uint8_t *hmac_key);
99 
100 static int
101 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
102 		struct crypto_unittest_params *ut_params,
103 		struct crypto_testsuite_params *ts_param,
104 		const uint8_t *cipher,
105 		const uint8_t *digest,
106 		const uint8_t *iv);
107 
108 static struct rte_mbuf *
109 setup_test_string(struct rte_mempool *mpool,
110 		const char *string, size_t len, uint8_t blocksize)
111 {
112 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
113 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
114 
115 	memset(m->buf_addr, 0, m->buf_len);
116 	if (m) {
117 		char *dst = rte_pktmbuf_append(m, t_len);
118 
119 		if (!dst) {
120 			rte_pktmbuf_free(m);
121 			return NULL;
122 		}
123 		if (string != NULL)
124 			rte_memcpy(dst, string, t_len);
125 		else
126 			memset(dst, 0, t_len);
127 	}
128 
129 	return m;
130 }
131 
132 /* Get number of bytes in X bits (rounding up) */
133 static uint32_t
134 ceil_byte_length(uint32_t num_bits)
135 {
136 	if (num_bits % 8)
137 		return ((num_bits >> 3) + 1);
138 	else
139 		return (num_bits >> 3);
140 }
141 
142 static struct rte_crypto_op *
143 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
144 {
145 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
146 		printf("Error sending packet for encryption");
147 		return NULL;
148 	}
149 
150 	op = NULL;
151 
152 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
153 		rte_pause();
154 
155 	return op;
156 }
157 
158 static struct crypto_testsuite_params testsuite_params = { NULL };
159 static struct crypto_unittest_params unittest_params;
160 
161 static int
162 testsuite_setup(void)
163 {
164 	struct crypto_testsuite_params *ts_params = &testsuite_params;
165 	struct rte_cryptodev_info info;
166 	uint32_t i = 0, nb_devs, dev_id;
167 	int ret;
168 	uint16_t qp_id;
169 
170 	memset(ts_params, 0, sizeof(*ts_params));
171 
172 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
173 	if (ts_params->mbuf_pool == NULL) {
174 		/* Not already created so create */
175 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
176 				"CRYPTO_MBUFPOOL",
177 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
178 				rte_socket_id());
179 		if (ts_params->mbuf_pool == NULL) {
180 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
181 			return TEST_FAILED;
182 		}
183 	}
184 
185 	ts_params->large_mbuf_pool = rte_mempool_lookup(
186 			"CRYPTO_LARGE_MBUFPOOL");
187 	if (ts_params->large_mbuf_pool == NULL) {
188 		/* Not already created so create */
189 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
190 				"CRYPTO_LARGE_MBUFPOOL",
191 				1, 0, 0, UINT16_MAX,
192 				rte_socket_id());
193 		if (ts_params->large_mbuf_pool == NULL) {
194 			RTE_LOG(ERR, USER1,
195 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
196 			return TEST_FAILED;
197 		}
198 	}
199 
200 	ts_params->op_mpool = rte_crypto_op_pool_create(
201 			"MBUF_CRYPTO_SYM_OP_POOL",
202 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
203 			NUM_MBUFS, MBUF_CACHE_SIZE,
204 			DEFAULT_NUM_XFORMS *
205 			sizeof(struct rte_crypto_sym_xform) +
206 			MAXIMUM_IV_LENGTH,
207 			rte_socket_id());
208 	if (ts_params->op_mpool == NULL) {
209 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
210 		return TEST_FAILED;
211 	}
212 
213 	/* Create an AESNI MB device if required */
214 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
215 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
216 		nb_devs = rte_cryptodev_device_count_by_driver(
217 				rte_cryptodev_driver_id_get(
218 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
219 		if (nb_devs < 1) {
220 			ret = rte_vdev_init(
221 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
222 
223 			TEST_ASSERT(ret == 0,
224 				"Failed to create instance of"
225 				" pmd : %s",
226 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
227 		}
228 	}
229 
230 	/* Create an AESNI GCM device if required */
231 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
232 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
233 		nb_devs = rte_cryptodev_device_count_by_driver(
234 				rte_cryptodev_driver_id_get(
235 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
236 		if (nb_devs < 1) {
237 			TEST_ASSERT_SUCCESS(rte_vdev_init(
238 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
239 				"Failed to create instance of"
240 				" pmd : %s",
241 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
242 		}
243 	}
244 
245 	/* Create a SNOW 3G device if required */
246 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
247 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
248 		nb_devs = rte_cryptodev_device_count_by_driver(
249 				rte_cryptodev_driver_id_get(
250 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
251 		if (nb_devs < 1) {
252 			TEST_ASSERT_SUCCESS(rte_vdev_init(
253 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
254 				"Failed to create instance of"
255 				" pmd : %s",
256 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
257 		}
258 	}
259 
260 	/* Create a KASUMI device if required */
261 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
262 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
263 		nb_devs = rte_cryptodev_device_count_by_driver(
264 				rte_cryptodev_driver_id_get(
265 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
266 		if (nb_devs < 1) {
267 			TEST_ASSERT_SUCCESS(rte_vdev_init(
268 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
269 				"Failed to create instance of"
270 				" pmd : %s",
271 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
272 		}
273 	}
274 
275 	/* Create a ZUC device if required */
276 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
277 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
278 		nb_devs = rte_cryptodev_device_count_by_driver(
279 				rte_cryptodev_driver_id_get(
280 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
281 		if (nb_devs < 1) {
282 			TEST_ASSERT_SUCCESS(rte_vdev_init(
283 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
284 				"Failed to create instance of"
285 				" pmd : %s",
286 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
287 		}
288 	}
289 
290 	/* Create a NULL device if required */
291 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
292 			RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
293 		nb_devs = rte_cryptodev_device_count_by_driver(
294 				rte_cryptodev_driver_id_get(
295 				RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
296 		if (nb_devs < 1) {
297 			ret = rte_vdev_init(
298 				RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
299 
300 			TEST_ASSERT(ret == 0,
301 				"Failed to create instance of"
302 				" pmd : %s",
303 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
304 		}
305 	}
306 
307 	/* Create an OPENSSL device if required */
308 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
309 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
310 		nb_devs = rte_cryptodev_device_count_by_driver(
311 				rte_cryptodev_driver_id_get(
312 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
313 		if (nb_devs < 1) {
314 			ret = rte_vdev_init(
315 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
316 				NULL);
317 
318 			TEST_ASSERT(ret == 0, "Failed to create "
319 				"instance of pmd : %s",
320 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
321 		}
322 	}
323 
324 	/* Create a ARMv8 device if required */
325 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
326 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
327 		nb_devs = rte_cryptodev_device_count_by_driver(
328 				rte_cryptodev_driver_id_get(
329 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
330 		if (nb_devs < 1) {
331 			ret = rte_vdev_init(
332 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
333 				NULL);
334 
335 			TEST_ASSERT(ret == 0, "Failed to create "
336 				"instance of pmd : %s",
337 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
338 		}
339 	}
340 
341 	/* Create a MVSAM device if required */
342 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
343 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
344 		nb_devs = rte_cryptodev_device_count_by_driver(
345 				rte_cryptodev_driver_id_get(
346 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
347 		if (nb_devs < 1) {
348 			ret = rte_vdev_init(
349 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
350 				NULL);
351 
352 			TEST_ASSERT(ret == 0, "Failed to create "
353 				"instance of pmd : %s",
354 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
355 		}
356 	}
357 
358 	/* Create an CCP device if required */
359 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
360 			RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
361 		nb_devs = rte_cryptodev_device_count_by_driver(
362 				rte_cryptodev_driver_id_get(
363 				RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
364 		if (nb_devs < 1) {
365 			ret = rte_vdev_init(
366 				RTE_STR(CRYPTODEV_NAME_CCP_PMD),
367 				NULL);
368 
369 			TEST_ASSERT(ret == 0, "Failed to create "
370 				"instance of pmd : %s",
371 				RTE_STR(CRYPTODEV_NAME_CCP_PMD));
372 		}
373 	}
374 
375 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
376 	char vdev_args[VDEV_ARGS_SIZE] = {""};
377 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
378 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
379 	uint16_t slave_core_count = 0;
380 	uint16_t socket_id = 0;
381 
382 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
383 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
384 
385 		/* Identify the Slave Cores
386 		 * Use 2 slave cores for the device args
387 		 */
388 		RTE_LCORE_FOREACH_SLAVE(i) {
389 			if (slave_core_count > 1)
390 				break;
391 			snprintf(vdev_args, sizeof(vdev_args),
392 					"%s%d", temp_str, i);
393 			strcpy(temp_str, vdev_args);
394 			strlcat(temp_str, ";", sizeof(temp_str));
395 			slave_core_count++;
396 			socket_id = rte_lcore_to_socket_id(i);
397 		}
398 		if (slave_core_count != 2) {
399 			RTE_LOG(ERR, USER1,
400 				"Cryptodev scheduler test require at least "
401 				"two slave cores to run. "
402 				"Please use the correct coremask.\n");
403 			return TEST_FAILED;
404 		}
405 		strcpy(temp_str, vdev_args);
406 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
407 				temp_str, socket_id);
408 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
409 		nb_devs = rte_cryptodev_device_count_by_driver(
410 				rte_cryptodev_driver_id_get(
411 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
412 		if (nb_devs < 1) {
413 			ret = rte_vdev_init(
414 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
415 					vdev_args);
416 			TEST_ASSERT(ret == 0,
417 				"Failed to create instance %u of"
418 				" pmd : %s",
419 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
420 		}
421 	}
422 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
423 
424 	nb_devs = rte_cryptodev_count();
425 	if (nb_devs < 1) {
426 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
427 		return TEST_SKIPPED;
428 	}
429 
430 	/* Create list of valid crypto devs */
431 	for (i = 0; i < nb_devs; i++) {
432 		rte_cryptodev_info_get(i, &info);
433 		if (info.driver_id == gbl_driver_id)
434 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
435 	}
436 
437 	if (ts_params->valid_dev_count < 1)
438 		return TEST_FAILED;
439 
440 	/* Set up all the qps on the first of the valid devices found */
441 
442 	dev_id = ts_params->valid_devs[0];
443 
444 	rte_cryptodev_info_get(dev_id, &info);
445 
446 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
447 	ts_params->conf.socket_id = SOCKET_ID_ANY;
448 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
449 
450 	unsigned int session_size =
451 		rte_cryptodev_sym_get_private_session_size(dev_id);
452 
453 	/*
454 	 * Create mempool with maximum number of sessions * 2,
455 	 * to include the session headers
456 	 */
457 	if (info.sym.max_nb_sessions != 0 &&
458 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
459 		RTE_LOG(ERR, USER1, "Device does not support "
460 				"at least %u sessions\n",
461 				MAX_NB_SESSIONS);
462 		return TEST_FAILED;
463 	}
464 
465 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
466 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
467 			SOCKET_ID_ANY);
468 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
469 			"session mempool allocation failed");
470 
471 	ts_params->session_priv_mpool = rte_mempool_create(
472 			"test_sess_mp_priv",
473 			MAX_NB_SESSIONS,
474 			session_size,
475 			0, 0, NULL, NULL, NULL,
476 			NULL, SOCKET_ID_ANY,
477 			0);
478 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
479 			"session mempool allocation failed");
480 
481 
482 
483 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
484 			&ts_params->conf),
485 			"Failed to configure cryptodev %u with %u qps",
486 			dev_id, ts_params->conf.nb_queue_pairs);
487 
488 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
489 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
490 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
491 
492 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
493 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
494 			dev_id, qp_id, &ts_params->qp_conf,
495 			rte_cryptodev_socket_id(dev_id)),
496 			"Failed to setup queue pair %u on cryptodev %u",
497 			qp_id, dev_id);
498 	}
499 
500 	return TEST_SUCCESS;
501 }
502 
503 static void
504 testsuite_teardown(void)
505 {
506 	struct crypto_testsuite_params *ts_params = &testsuite_params;
507 
508 	if (ts_params->mbuf_pool != NULL) {
509 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
510 		rte_mempool_avail_count(ts_params->mbuf_pool));
511 	}
512 
513 	if (ts_params->op_mpool != NULL) {
514 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
515 		rte_mempool_avail_count(ts_params->op_mpool));
516 	}
517 
518 	/* Free session mempools */
519 	if (ts_params->session_priv_mpool != NULL) {
520 		rte_mempool_free(ts_params->session_priv_mpool);
521 		ts_params->session_priv_mpool = NULL;
522 	}
523 
524 	if (ts_params->session_mpool != NULL) {
525 		rte_mempool_free(ts_params->session_mpool);
526 		ts_params->session_mpool = NULL;
527 	}
528 }
529 
530 static int
531 ut_setup(void)
532 {
533 	struct crypto_testsuite_params *ts_params = &testsuite_params;
534 	struct crypto_unittest_params *ut_params = &unittest_params;
535 
536 	uint16_t qp_id;
537 
538 	/* Clear unit test parameters before running test */
539 	memset(ut_params, 0, sizeof(*ut_params));
540 
541 	/* Reconfigure device to default parameters */
542 	ts_params->conf.socket_id = SOCKET_ID_ANY;
543 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
544 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
545 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
546 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
547 
548 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
549 			&ts_params->conf),
550 			"Failed to configure cryptodev %u",
551 			ts_params->valid_devs[0]);
552 
553 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
554 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
555 			ts_params->valid_devs[0], qp_id,
556 			&ts_params->qp_conf,
557 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
558 			"Failed to setup queue pair %u on cryptodev %u",
559 			qp_id, ts_params->valid_devs[0]);
560 	}
561 
562 
563 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
564 
565 	/* Start the device */
566 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
567 			"Failed to start cryptodev %u",
568 			ts_params->valid_devs[0]);
569 
570 	return TEST_SUCCESS;
571 }
572 
573 static void
574 ut_teardown(void)
575 {
576 	struct crypto_testsuite_params *ts_params = &testsuite_params;
577 	struct crypto_unittest_params *ut_params = &unittest_params;
578 	struct rte_cryptodev_stats stats;
579 
580 	/* free crypto session structure */
581 #ifdef RTE_LIBRTE_SECURITY
582 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
583 		if (ut_params->sec_session) {
584 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
585 						(ts_params->valid_devs[0]),
586 						ut_params->sec_session);
587 			ut_params->sec_session = NULL;
588 		}
589 	} else
590 #endif
591 	{
592 		if (ut_params->sess) {
593 			rte_cryptodev_sym_session_clear(
594 					ts_params->valid_devs[0],
595 					ut_params->sess);
596 			rte_cryptodev_sym_session_free(ut_params->sess);
597 			ut_params->sess = NULL;
598 		}
599 	}
600 
601 	/* free crypto operation structure */
602 	if (ut_params->op)
603 		rte_crypto_op_free(ut_params->op);
604 
605 	/*
606 	 * free mbuf - both obuf and ibuf are usually the same,
607 	 * so check if they point at the same address is necessary,
608 	 * to avoid freeing the mbuf twice.
609 	 */
610 	if (ut_params->obuf) {
611 		rte_pktmbuf_free(ut_params->obuf);
612 		if (ut_params->ibuf == ut_params->obuf)
613 			ut_params->ibuf = 0;
614 		ut_params->obuf = 0;
615 	}
616 	if (ut_params->ibuf) {
617 		rte_pktmbuf_free(ut_params->ibuf);
618 		ut_params->ibuf = 0;
619 	}
620 
621 	if (ts_params->mbuf_pool != NULL)
622 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
623 			rte_mempool_avail_count(ts_params->mbuf_pool));
624 
625 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
626 
627 	/* Stop the device */
628 	rte_cryptodev_stop(ts_params->valid_devs[0]);
629 }
630 
631 static int
632 test_device_configure_invalid_dev_id(void)
633 {
634 	struct crypto_testsuite_params *ts_params = &testsuite_params;
635 	uint16_t dev_id, num_devs = 0;
636 
637 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
638 			"Need at least %d devices for test", 1);
639 
640 	/* valid dev_id values */
641 	dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1];
642 
643 	/* Stop the device in case it's started so it can be configured */
644 	rte_cryptodev_stop(dev_id);
645 
646 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
647 			"Failed test for rte_cryptodev_configure: "
648 			"invalid dev_num %u", dev_id);
649 
650 	/* invalid dev_id values */
651 	dev_id = num_devs;
652 
653 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
654 			"Failed test for rte_cryptodev_configure: "
655 			"invalid dev_num %u", dev_id);
656 
657 	dev_id = 0xff;
658 
659 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
660 			"Failed test for rte_cryptodev_configure:"
661 			"invalid dev_num %u", dev_id);
662 
663 	return TEST_SUCCESS;
664 }
665 
666 static int
667 test_device_configure_invalid_queue_pair_ids(void)
668 {
669 	struct crypto_testsuite_params *ts_params = &testsuite_params;
670 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
671 
672 	/* Stop the device in case it's started so it can be configured */
673 	rte_cryptodev_stop(ts_params->valid_devs[0]);
674 
675 	/* valid - one queue pairs */
676 	ts_params->conf.nb_queue_pairs = 1;
677 
678 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
679 			&ts_params->conf),
680 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
681 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
682 
683 
684 	/* valid - max value queue pairs */
685 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
686 
687 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
688 			&ts_params->conf),
689 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
690 			ts_params->valid_devs[0],
691 			ts_params->conf.nb_queue_pairs);
692 
693 
694 	/* invalid - zero queue pairs */
695 	ts_params->conf.nb_queue_pairs = 0;
696 
697 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
698 			&ts_params->conf),
699 			"Failed test for rte_cryptodev_configure, dev_id %u,"
700 			" invalid qps: %u",
701 			ts_params->valid_devs[0],
702 			ts_params->conf.nb_queue_pairs);
703 
704 
705 	/* invalid - max value supported by field queue pairs */
706 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
707 
708 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
709 			&ts_params->conf),
710 			"Failed test for rte_cryptodev_configure, dev_id %u,"
711 			" invalid qps: %u",
712 			ts_params->valid_devs[0],
713 			ts_params->conf.nb_queue_pairs);
714 
715 
716 	/* invalid - max value + 1 queue pairs */
717 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
718 
719 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
720 			&ts_params->conf),
721 			"Failed test for rte_cryptodev_configure, dev_id %u,"
722 			" invalid qps: %u",
723 			ts_params->valid_devs[0],
724 			ts_params->conf.nb_queue_pairs);
725 
726 	/* revert to original testsuite value */
727 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
728 
729 	return TEST_SUCCESS;
730 }
731 
732 static int
733 test_queue_pair_descriptor_setup(void)
734 {
735 	struct crypto_testsuite_params *ts_params = &testsuite_params;
736 	struct rte_cryptodev_info dev_info;
737 	struct rte_cryptodev_qp_conf qp_conf = {
738 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
739 	};
740 
741 	uint16_t qp_id;
742 
743 	/* Stop the device in case it's started so it can be configured */
744 	rte_cryptodev_stop(ts_params->valid_devs[0]);
745 
746 
747 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
748 
749 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
750 			&ts_params->conf),
751 			"Failed to configure cryptodev %u",
752 			ts_params->valid_devs[0]);
753 
754 	/*
755 	 * Test various ring sizes on this device. memzones can't be
756 	 * freed so are re-used if ring is released and re-created.
757 	 */
758 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
759 	qp_conf.mp_session = ts_params->session_mpool;
760 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
761 
762 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
763 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
764 				ts_params->valid_devs[0], qp_id, &qp_conf,
765 				rte_cryptodev_socket_id(
766 						ts_params->valid_devs[0])),
767 				"Failed test for "
768 				"rte_cryptodev_queue_pair_setup: num_inflights "
769 				"%u on qp %u on cryptodev %u",
770 				qp_conf.nb_descriptors, qp_id,
771 				ts_params->valid_devs[0]);
772 	}
773 
774 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
775 
776 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
777 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
778 				ts_params->valid_devs[0], qp_id, &qp_conf,
779 				rte_cryptodev_socket_id(
780 						ts_params->valid_devs[0])),
781 				"Failed test for"
782 				" rte_cryptodev_queue_pair_setup: num_inflights"
783 				" %u on qp %u on cryptodev %u",
784 				qp_conf.nb_descriptors, qp_id,
785 				ts_params->valid_devs[0]);
786 	}
787 
788 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
789 
790 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
791 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
792 				ts_params->valid_devs[0], qp_id, &qp_conf,
793 				rte_cryptodev_socket_id(
794 						ts_params->valid_devs[0])),
795 				"Failed test for "
796 				"rte_cryptodev_queue_pair_setup: num_inflights"
797 				" %u on qp %u on cryptodev %u",
798 				qp_conf.nb_descriptors, qp_id,
799 				ts_params->valid_devs[0]);
800 	}
801 
802 	/* invalid number of descriptors - max supported + 2 */
803 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT + 2;
804 
805 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
806 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
807 				ts_params->valid_devs[0], qp_id, &qp_conf,
808 				rte_cryptodev_socket_id(
809 						ts_params->valid_devs[0])),
810 				"Unexpectedly passed test for "
811 				"rte_cryptodev_queue_pair_setup:"
812 				"num_inflights %u on qp %u on cryptodev %u",
813 				qp_conf.nb_descriptors, qp_id,
814 				ts_params->valid_devs[0]);
815 	}
816 
817 	/* invalid number of descriptors - max value of parameter */
818 	qp_conf.nb_descriptors = UINT32_MAX-1;
819 
820 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
821 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
822 				ts_params->valid_devs[0], qp_id, &qp_conf,
823 				rte_cryptodev_socket_id(
824 						ts_params->valid_devs[0])),
825 				"Unexpectedly passed test for "
826 				"rte_cryptodev_queue_pair_setup:"
827 				"num_inflights %u on qp %u on cryptodev %u",
828 				qp_conf.nb_descriptors, qp_id,
829 				ts_params->valid_devs[0]);
830 	}
831 
832 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
833 
834 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
835 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
836 				ts_params->valid_devs[0], qp_id, &qp_conf,
837 				rte_cryptodev_socket_id(
838 						ts_params->valid_devs[0])),
839 				"Failed test for"
840 				" rte_cryptodev_queue_pair_setup:"
841 				"num_inflights %u on qp %u on cryptodev %u",
842 				qp_conf.nb_descriptors, qp_id,
843 				ts_params->valid_devs[0]);
844 	}
845 
846 	/* invalid number of descriptors - max supported + 1 */
847 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT + 1;
848 
849 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
850 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
851 				ts_params->valid_devs[0], qp_id, &qp_conf,
852 				rte_cryptodev_socket_id(
853 						ts_params->valid_devs[0])),
854 				"Unexpectedly passed test for "
855 				"rte_cryptodev_queue_pair_setup:"
856 				"num_inflights %u on qp %u on cryptodev %u",
857 				qp_conf.nb_descriptors, qp_id,
858 				ts_params->valid_devs[0]);
859 	}
860 
861 	/* test invalid queue pair id */
862 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
863 
864 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
865 
866 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
867 			ts_params->valid_devs[0],
868 			qp_id, &qp_conf,
869 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
870 			"Failed test for rte_cryptodev_queue_pair_setup:"
871 			"invalid qp %u on cryptodev %u",
872 			qp_id, ts_params->valid_devs[0]);
873 
874 	qp_id = 0xffff; /*invalid*/
875 
876 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
877 			ts_params->valid_devs[0],
878 			qp_id, &qp_conf,
879 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
880 			"Failed test for rte_cryptodev_queue_pair_setup:"
881 			"invalid qp %u on cryptodev %u",
882 			qp_id, ts_params->valid_devs[0]);
883 
884 	return TEST_SUCCESS;
885 }
886 
887 /* ***** Plaintext data for tests ***** */
888 
889 const char catch_22_quote_1[] =
890 		"There was only one catch and that was Catch-22, which "
891 		"specified that a concern for one's safety in the face of "
892 		"dangers that were real and immediate was the process of a "
893 		"rational mind. Orr was crazy and could be grounded. All he "
894 		"had to do was ask; and as soon as he did, he would no longer "
895 		"be crazy and would have to fly more missions. Orr would be "
896 		"crazy to fly more missions and sane if he didn't, but if he "
897 		"was sane he had to fly them. If he flew them he was crazy "
898 		"and didn't have to; but if he didn't want to he was sane and "
899 		"had to. Yossarian was moved very deeply by the absolute "
900 		"simplicity of this clause of Catch-22 and let out a "
901 		"respectful whistle. \"That's some catch, that Catch-22\", he "
902 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
903 
904 const char catch_22_quote[] =
905 		"What a lousy earth! He wondered how many people were "
906 		"destitute that same night even in his own prosperous country, "
907 		"how many homes were shanties, how many husbands were drunk "
908 		"and wives socked, and how many children were bullied, abused, "
909 		"or abandoned. How many families hungered for food they could "
910 		"not afford to buy? How many hearts were broken? How many "
911 		"suicides would take place that same night, how many people "
912 		"would go insane? How many cockroaches and landlords would "
913 		"triumph? How many winners were losers, successes failures, "
914 		"and rich men poor men? How many wise guys were stupid? How "
915 		"many happy endings were unhappy endings? How many honest men "
916 		"were liars, brave men cowards, loyal men traitors, how many "
917 		"sainted men were corrupt, how many people in positions of "
918 		"trust had sold their souls to bodyguards, how many had never "
919 		"had souls? How many straight-and-narrow paths were crooked "
920 		"paths? How many best families were worst families and how "
921 		"many good people were bad people? When you added them all up "
922 		"and then subtracted, you might be left with only the children, "
923 		"and perhaps with Albert Einstein and an old violinist or "
924 		"sculptor somewhere.";
925 
926 #define QUOTE_480_BYTES		(480)
927 #define QUOTE_512_BYTES		(512)
928 #define QUOTE_768_BYTES		(768)
929 #define QUOTE_1024_BYTES	(1024)
930 
931 
932 
933 /* ***** SHA1 Hash Tests ***** */
934 
935 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
936 
937 static uint8_t hmac_sha1_key[] = {
938 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
939 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
940 	0xDE, 0xF4, 0xDE, 0xAD };
941 
942 /* ***** SHA224 Hash Tests ***** */
943 
944 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
945 
946 
947 /* ***** AES-CBC Cipher Tests ***** */
948 
949 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
950 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
951 
952 static uint8_t aes_cbc_key[] = {
953 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
954 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
955 
956 static uint8_t aes_cbc_iv[] = {
957 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
958 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
959 
960 
961 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
962 
963 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
964 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
965 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
966 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
967 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
968 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
969 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
970 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
971 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
972 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
973 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
974 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
975 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
976 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
977 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
978 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
979 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
980 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
981 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
982 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
983 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
984 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
985 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
986 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
987 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
988 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
989 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
990 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
991 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
992 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
993 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
994 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
995 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
996 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
997 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
998 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
999 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1000 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1001 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1002 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1003 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1004 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1005 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1006 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1007 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1008 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1009 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1010 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1011 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1012 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1013 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1014 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1015 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1016 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1017 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1018 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1019 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1020 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1021 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1022 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1023 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1024 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1025 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1026 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1027 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1028 };
1029 
1030 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1031 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1032 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1033 	0x18, 0x8c, 0x1d, 0x32
1034 };
1035 
1036 
1037 /* Multisession Vector context Test */
1038 /*Begin Session 0 */
1039 static uint8_t ms_aes_cbc_key0[] = {
1040 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1041 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1042 };
1043 
1044 static uint8_t ms_aes_cbc_iv0[] = {
1045 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1046 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1047 };
1048 
1049 static const uint8_t ms_aes_cbc_cipher0[] = {
1050 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1051 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1052 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1053 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1054 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1055 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1056 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1057 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1058 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1059 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1060 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1061 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1062 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1063 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1064 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1065 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1066 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1067 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1068 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1069 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1070 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1071 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1072 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1073 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1074 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1075 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1076 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1077 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1078 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1079 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1080 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1081 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1082 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1083 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1084 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1085 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1086 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1087 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1088 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1089 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1090 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1091 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1092 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1093 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1094 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1095 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1096 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1097 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1098 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1099 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1100 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1101 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1102 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1103 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1104 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1105 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1106 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1107 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1108 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1109 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1110 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1111 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1112 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1113 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1114 };
1115 
1116 
1117 static  uint8_t ms_hmac_key0[] = {
1118 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1119 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1120 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1121 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1122 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1123 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1124 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1125 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1126 };
1127 
1128 static const uint8_t ms_hmac_digest0[] = {
1129 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1130 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1131 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1132 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1133 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1134 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1135 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1136 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1137 		};
1138 
1139 /* End Session 0 */
1140 /* Begin session 1 */
1141 
1142 static  uint8_t ms_aes_cbc_key1[] = {
1143 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1144 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1145 };
1146 
1147 static  uint8_t ms_aes_cbc_iv1[] = {
1148 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1149 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1150 };
1151 
1152 static const uint8_t ms_aes_cbc_cipher1[] = {
1153 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1154 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1155 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1156 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1157 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1158 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1159 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1160 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1161 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1162 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1163 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1164 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1165 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1166 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1167 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1168 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1169 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1170 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1171 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1172 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1173 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1174 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1175 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1176 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1177 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1178 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1179 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1180 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1181 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1182 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1183 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1184 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1185 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1186 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1187 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1188 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1189 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1190 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1191 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1192 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1193 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1194 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1195 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1196 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1197 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1198 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1199 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1200 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1201 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1202 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1203 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1204 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1205 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1206 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1207 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1208 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1209 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1210 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1211 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1212 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1213 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1214 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1215 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1216 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1217 
1218 };
1219 
1220 static uint8_t ms_hmac_key1[] = {
1221 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1222 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1223 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1224 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1225 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1226 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1227 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1228 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1229 };
1230 
1231 static const uint8_t ms_hmac_digest1[] = {
1232 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1233 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1234 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1235 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1236 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1237 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1238 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1239 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1240 };
1241 /* End Session 1  */
1242 /* Begin Session 2 */
1243 static  uint8_t ms_aes_cbc_key2[] = {
1244 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1245 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1246 };
1247 
1248 static  uint8_t ms_aes_cbc_iv2[] = {
1249 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1250 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1251 };
1252 
1253 static const uint8_t ms_aes_cbc_cipher2[] = {
1254 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1255 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1256 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1257 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1258 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1259 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1260 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1261 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1262 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1263 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1264 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1265 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1266 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1267 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1268 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1269 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1270 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1271 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1272 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1273 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1274 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1275 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1276 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1277 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1278 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1279 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1280 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1281 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1282 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1283 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1284 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1285 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1286 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1287 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1288 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1289 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1290 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1291 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1292 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1293 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1294 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1295 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1296 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1297 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1298 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1299 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1300 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1301 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1302 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1303 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1304 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1305 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1306 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1307 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1308 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1309 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1310 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1311 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1312 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1313 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1314 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1315 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1316 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1317 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1318 };
1319 
1320 static  uint8_t ms_hmac_key2[] = {
1321 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1322 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1323 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1324 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1325 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1326 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1327 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1328 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1329 };
1330 
1331 static const uint8_t ms_hmac_digest2[] = {
1332 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1333 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1334 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1335 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1336 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1337 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1338 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1339 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1340 };
1341 
1342 /* End Session 2 */
1343 
1344 
1345 static int
1346 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1347 {
1348 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1349 	struct crypto_unittest_params *ut_params = &unittest_params;
1350 
1351 	/* Generate test mbuf data and space for digest */
1352 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1353 			catch_22_quote,	QUOTE_512_BYTES, 0);
1354 
1355 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1356 			DIGEST_BYTE_LENGTH_SHA1);
1357 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1358 
1359 	/* Setup Cipher Parameters */
1360 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1361 	ut_params->cipher_xform.next = &ut_params->auth_xform;
1362 
1363 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1364 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1365 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1366 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1367 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1368 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1369 
1370 	/* Setup HMAC Parameters */
1371 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1372 
1373 	ut_params->auth_xform.next = NULL;
1374 
1375 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1376 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1377 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1378 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1379 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1380 
1381 	ut_params->sess = rte_cryptodev_sym_session_create(
1382 			ts_params->session_mpool);
1383 
1384 	/* Create crypto session*/
1385 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1386 			ut_params->sess, &ut_params->cipher_xform,
1387 			ts_params->session_priv_mpool);
1388 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1389 
1390 	/* Generate crypto op data structure */
1391 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1392 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1393 	TEST_ASSERT_NOT_NULL(ut_params->op,
1394 			"Failed to allocate symmetric crypto operation struct");
1395 
1396 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1397 
1398 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1399 
1400 	/* set crypto operation source mbuf */
1401 	sym_op->m_src = ut_params->ibuf;
1402 
1403 	/* Set crypto operation authentication parameters */
1404 	sym_op->auth.digest.data = ut_params->digest;
1405 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1406 			ut_params->ibuf, QUOTE_512_BYTES);
1407 
1408 	sym_op->auth.data.offset = 0;
1409 	sym_op->auth.data.length = QUOTE_512_BYTES;
1410 
1411 	/* Copy IV at the end of the crypto operation */
1412 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1413 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1414 
1415 	/* Set crypto operation cipher parameters */
1416 	sym_op->cipher.data.offset = 0;
1417 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1418 
1419 	/* Process crypto operation */
1420 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1421 			ut_params->op), "failed to process sym crypto op");
1422 
1423 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1424 			"crypto op processing failed");
1425 
1426 	/* Validate obuf */
1427 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1428 			uint8_t *);
1429 
1430 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1431 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1432 			QUOTE_512_BYTES,
1433 			"ciphertext data not as expected");
1434 
1435 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1436 
1437 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1438 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1439 			gbl_driver_id == rte_cryptodev_driver_id_get(
1440 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1441 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1442 					DIGEST_BYTE_LENGTH_SHA1,
1443 			"Generated digest data not as expected");
1444 
1445 	return TEST_SUCCESS;
1446 }
1447 
1448 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1449 
1450 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1451 
1452 static uint8_t hmac_sha512_key[] = {
1453 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1454 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1455 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1456 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1457 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1458 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1459 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1460 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1461 
1462 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1463 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1464 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1465 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1466 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1467 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1468 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1469 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1470 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1471 
1472 
1473 
1474 static int
1475 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1476 		struct crypto_unittest_params *ut_params,
1477 		uint8_t *cipher_key,
1478 		uint8_t *hmac_key);
1479 
1480 static int
1481 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1482 		struct crypto_unittest_params *ut_params,
1483 		struct crypto_testsuite_params *ts_params,
1484 		const uint8_t *cipher,
1485 		const uint8_t *digest,
1486 		const uint8_t *iv);
1487 
1488 
1489 static int
1490 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1491 		struct crypto_unittest_params *ut_params,
1492 		uint8_t *cipher_key,
1493 		uint8_t *hmac_key)
1494 {
1495 
1496 	/* Setup Cipher Parameters */
1497 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1498 	ut_params->cipher_xform.next = NULL;
1499 
1500 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1501 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1502 	ut_params->cipher_xform.cipher.key.data = cipher_key;
1503 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1504 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1505 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1506 
1507 	/* Setup HMAC Parameters */
1508 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1509 	ut_params->auth_xform.next = &ut_params->cipher_xform;
1510 
1511 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1512 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1513 	ut_params->auth_xform.auth.key.data = hmac_key;
1514 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1515 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1516 
1517 	return TEST_SUCCESS;
1518 }
1519 
1520 
1521 static int
1522 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1523 		struct crypto_unittest_params *ut_params,
1524 		struct crypto_testsuite_params *ts_params,
1525 		const uint8_t *cipher,
1526 		const uint8_t *digest,
1527 		const uint8_t *iv)
1528 {
1529 	/* Generate test mbuf data and digest */
1530 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1531 			(const char *)
1532 			cipher,
1533 			QUOTE_512_BYTES, 0);
1534 
1535 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1536 			DIGEST_BYTE_LENGTH_SHA512);
1537 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1538 
1539 	rte_memcpy(ut_params->digest,
1540 			digest,
1541 			DIGEST_BYTE_LENGTH_SHA512);
1542 
1543 	/* Generate Crypto op data structure */
1544 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1545 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1546 	TEST_ASSERT_NOT_NULL(ut_params->op,
1547 			"Failed to allocate symmetric crypto operation struct");
1548 
1549 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
1550 
1551 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1552 
1553 	/* set crypto operation source mbuf */
1554 	sym_op->m_src = ut_params->ibuf;
1555 
1556 	sym_op->auth.digest.data = ut_params->digest;
1557 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1558 			ut_params->ibuf, QUOTE_512_BYTES);
1559 
1560 	sym_op->auth.data.offset = 0;
1561 	sym_op->auth.data.length = QUOTE_512_BYTES;
1562 
1563 	/* Copy IV at the end of the crypto operation */
1564 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1565 			iv, CIPHER_IV_LENGTH_AES_CBC);
1566 
1567 	sym_op->cipher.data.offset = 0;
1568 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1569 
1570 	/* Process crypto operation */
1571 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1572 			ut_params->op), "failed to process sym crypto op");
1573 
1574 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1575 			"crypto op processing failed");
1576 
1577 	ut_params->obuf = ut_params->op->sym->m_src;
1578 
1579 	/* Validate obuf */
1580 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
1581 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1582 			catch_22_quote,
1583 			QUOTE_512_BYTES,
1584 			"Plaintext data not as expected");
1585 
1586 	/* Validate obuf */
1587 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1588 			"Digest verification failed");
1589 
1590 	return TEST_SUCCESS;
1591 }
1592 
1593 static int
1594 test_AES_cipheronly_mb_all(void)
1595 {
1596 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1597 	int status;
1598 
1599 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1600 		ts_params->op_mpool,
1601 		ts_params->session_mpool, ts_params->session_priv_mpool,
1602 		ts_params->valid_devs[0],
1603 		rte_cryptodev_driver_id_get(
1604 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1605 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1606 
1607 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1608 
1609 	return TEST_SUCCESS;
1610 }
1611 
1612 static int
1613 test_AES_docsis_mb_all(void)
1614 {
1615 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1616 	int status;
1617 
1618 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1619 		ts_params->op_mpool,
1620 		ts_params->session_mpool, ts_params->session_priv_mpool,
1621 		ts_params->valid_devs[0],
1622 		rte_cryptodev_driver_id_get(
1623 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1624 		BLKCIPHER_AES_DOCSIS_TYPE);
1625 
1626 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1627 
1628 	return TEST_SUCCESS;
1629 }
1630 
1631 static int
1632 test_AES_docsis_qat_all(void)
1633 {
1634 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1635 	int status;
1636 
1637 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1638 		ts_params->op_mpool,
1639 		ts_params->session_mpool, ts_params->session_priv_mpool,
1640 		ts_params->valid_devs[0],
1641 		rte_cryptodev_driver_id_get(
1642 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1643 		BLKCIPHER_AES_DOCSIS_TYPE);
1644 
1645 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1646 
1647 	return TEST_SUCCESS;
1648 }
1649 
1650 static int
1651 test_DES_docsis_qat_all(void)
1652 {
1653 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1654 	int status;
1655 
1656 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1657 		ts_params->op_mpool,
1658 		ts_params->session_mpool, ts_params->session_priv_mpool,
1659 		ts_params->valid_devs[0],
1660 		rte_cryptodev_driver_id_get(
1661 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1662 		BLKCIPHER_DES_DOCSIS_TYPE);
1663 
1664 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1665 
1666 	return TEST_SUCCESS;
1667 }
1668 
1669 static int
1670 test_authonly_mb_all(void)
1671 {
1672 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1673 	int status;
1674 
1675 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1676 		ts_params->op_mpool,
1677 		ts_params->session_mpool, ts_params->session_priv_mpool,
1678 		ts_params->valid_devs[0],
1679 		rte_cryptodev_driver_id_get(
1680 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1681 		BLKCIPHER_AUTHONLY_TYPE);
1682 
1683 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1684 
1685 	return TEST_SUCCESS;
1686 }
1687 
1688 static int
1689 test_authonly_qat_all(void)
1690 {
1691 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1692 	int status;
1693 
1694 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1695 		ts_params->op_mpool,
1696 		ts_params->session_mpool, ts_params->session_priv_mpool,
1697 		ts_params->valid_devs[0],
1698 		rte_cryptodev_driver_id_get(
1699 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1700 		BLKCIPHER_AUTHONLY_TYPE);
1701 
1702 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1703 
1704 	return TEST_SUCCESS;
1705 }
1706 
1707 static int
1708 test_AES_chain_null_all(void)
1709 {
1710 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1711 	int status;
1712 
1713 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1714 		ts_params->op_mpool,
1715 		ts_params->session_mpool, ts_params->session_priv_mpool,
1716 		ts_params->valid_devs[0],
1717 		rte_cryptodev_driver_id_get(
1718 		RTE_STR(CRYPTODEV_NAME_NULL_PMD)),
1719 		BLKCIPHER_AES_CHAIN_TYPE);
1720 
1721 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1722 
1723 	return TEST_SUCCESS;
1724 }
1725 
1726 static int
1727 test_AES_cipheronly_null_all(void)
1728 {
1729 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1730 	int status;
1731 
1732 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1733 		ts_params->op_mpool,
1734 		ts_params->session_mpool, ts_params->session_priv_mpool,
1735 		ts_params->valid_devs[0],
1736 		rte_cryptodev_driver_id_get(
1737 		RTE_STR(CRYPTODEV_NAME_NULL_PMD)),
1738 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1739 
1740 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1741 
1742 	return TEST_SUCCESS;
1743 }
1744 
1745 static int
1746 test_authonly_null_all(void)
1747 {
1748 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1749 	int status;
1750 
1751 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1752 		ts_params->op_mpool,
1753 		ts_params->session_mpool, ts_params->session_priv_mpool,
1754 		ts_params->valid_devs[0],
1755 		rte_cryptodev_driver_id_get(
1756 		RTE_STR(CRYPTODEV_NAME_NULL_PMD)),
1757 		BLKCIPHER_AUTHONLY_TYPE);
1758 
1759 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1760 
1761 	return TEST_SUCCESS;
1762 }
1763 
1764 static int
1765 test_AES_chain_mb_all(void)
1766 {
1767 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1768 	int status;
1769 
1770 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1771 		ts_params->op_mpool,
1772 		ts_params->session_mpool, ts_params->session_priv_mpool,
1773 		ts_params->valid_devs[0],
1774 		rte_cryptodev_driver_id_get(
1775 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
1776 		BLKCIPHER_AES_CHAIN_TYPE);
1777 
1778 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1779 
1780 	return TEST_SUCCESS;
1781 }
1782 
1783 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
1784 
1785 static int
1786 test_AES_cipheronly_scheduler_all(void)
1787 {
1788 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1789 	int status;
1790 
1791 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1792 		ts_params->op_mpool,
1793 		ts_params->session_mpool, ts_params->session_priv_mpool,
1794 		ts_params->valid_devs[0],
1795 		rte_cryptodev_driver_id_get(
1796 		RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1797 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1798 
1799 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1800 
1801 	return TEST_SUCCESS;
1802 }
1803 
1804 static int
1805 test_AES_chain_scheduler_all(void)
1806 {
1807 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1808 	int status;
1809 
1810 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1811 		ts_params->op_mpool,
1812 		ts_params->session_mpool, ts_params->session_priv_mpool,
1813 		ts_params->valid_devs[0],
1814 		rte_cryptodev_driver_id_get(
1815 		RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1816 		BLKCIPHER_AES_CHAIN_TYPE);
1817 
1818 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1819 
1820 	return TEST_SUCCESS;
1821 }
1822 
1823 static int
1824 test_authonly_scheduler_all(void)
1825 {
1826 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1827 	int status;
1828 
1829 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1830 		ts_params->op_mpool,
1831 		ts_params->session_mpool, ts_params->session_priv_mpool,
1832 		ts_params->valid_devs[0],
1833 		rte_cryptodev_driver_id_get(
1834 		RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)),
1835 		BLKCIPHER_AUTHONLY_TYPE);
1836 
1837 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1838 
1839 	return TEST_SUCCESS;
1840 }
1841 
1842 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
1843 
1844 static int
1845 test_AES_chain_openssl_all(void)
1846 {
1847 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1848 	int status;
1849 
1850 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1851 		ts_params->op_mpool,
1852 		ts_params->session_mpool, ts_params->session_priv_mpool,
1853 		ts_params->valid_devs[0],
1854 		rte_cryptodev_driver_id_get(
1855 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
1856 		BLKCIPHER_AES_CHAIN_TYPE);
1857 
1858 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1859 
1860 	return TEST_SUCCESS;
1861 }
1862 
1863 static int
1864 test_AES_cipheronly_openssl_all(void)
1865 {
1866 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1867 	int status;
1868 
1869 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1870 		ts_params->op_mpool,
1871 		ts_params->session_mpool, ts_params->session_priv_mpool,
1872 		ts_params->valid_devs[0],
1873 		rte_cryptodev_driver_id_get(
1874 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
1875 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1876 
1877 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1878 
1879 	return TEST_SUCCESS;
1880 }
1881 
1882 static int
1883 test_AES_chain_ccp_all(void)
1884 {
1885 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1886 	int status;
1887 
1888 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1889 		ts_params->op_mpool,
1890 		ts_params->session_mpool, ts_params->session_priv_mpool,
1891 		ts_params->valid_devs[0],
1892 		rte_cryptodev_driver_id_get(
1893 		RTE_STR(CRYPTODEV_NAME_CCP_PMD)),
1894 		BLKCIPHER_AES_CHAIN_TYPE);
1895 
1896 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1897 
1898 	return TEST_SUCCESS;
1899 }
1900 
1901 static int
1902 test_AES_cipheronly_ccp_all(void)
1903 {
1904 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1905 	int status;
1906 
1907 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1908 		ts_params->op_mpool,
1909 		ts_params->session_mpool, ts_params->session_priv_mpool,
1910 		ts_params->valid_devs[0],
1911 		rte_cryptodev_driver_id_get(
1912 		RTE_STR(CRYPTODEV_NAME_CCP_PMD)),
1913 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1914 
1915 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1916 
1917 	return TEST_SUCCESS;
1918 }
1919 
1920 static int
1921 test_AES_chain_qat_all(void)
1922 {
1923 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1924 	int status;
1925 
1926 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1927 		ts_params->op_mpool,
1928 		ts_params->session_mpool, ts_params->session_priv_mpool,
1929 		ts_params->valid_devs[0],
1930 		rte_cryptodev_driver_id_get(
1931 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1932 		BLKCIPHER_AES_CHAIN_TYPE);
1933 
1934 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1935 
1936 	return TEST_SUCCESS;
1937 }
1938 
1939 static int
1940 test_AES_cipheronly_qat_all(void)
1941 {
1942 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1943 	int status;
1944 
1945 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1946 		ts_params->op_mpool,
1947 		ts_params->session_mpool, ts_params->session_priv_mpool,
1948 		ts_params->valid_devs[0],
1949 		rte_cryptodev_driver_id_get(
1950 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
1951 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1952 
1953 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1954 
1955 	return TEST_SUCCESS;
1956 }
1957 
1958 static int
1959 test_AES_cipheronly_virtio_all(void)
1960 {
1961 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1962 	int status;
1963 
1964 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1965 		ts_params->op_mpool,
1966 		ts_params->session_mpool, ts_params->session_priv_mpool,
1967 		ts_params->valid_devs[0],
1968 		rte_cryptodev_driver_id_get(
1969 		RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD)),
1970 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1971 
1972 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1973 
1974 	return TEST_SUCCESS;
1975 }
1976 
1977 static int
1978 test_AES_chain_caam_jr_all(void)
1979 {
1980 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1981 	int status;
1982 
1983 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1984 		ts_params->op_mpool,
1985 		ts_params->session_mpool, ts_params->session_priv_mpool,
1986 		ts_params->valid_devs[0],
1987 		rte_cryptodev_driver_id_get(
1988 		RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),
1989 		BLKCIPHER_AES_CHAIN_TYPE);
1990 
1991 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1992 
1993 	return TEST_SUCCESS;
1994 }
1995 
1996 static int
1997 test_AES_cipheronly_caam_jr_all(void)
1998 {
1999 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2000 	int status;
2001 
2002 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2003 		ts_params->op_mpool,
2004 		ts_params->session_mpool, ts_params->session_priv_mpool,
2005 		ts_params->valid_devs[0],
2006 		rte_cryptodev_driver_id_get(
2007 		RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),
2008 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2009 
2010 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2011 
2012 	return TEST_SUCCESS;
2013 }
2014 
2015 static int
2016 test_authonly_caam_jr_all(void)
2017 {
2018 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2019 	int status;
2020 
2021 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2022 		ts_params->op_mpool,
2023 		ts_params->session_mpool, ts_params->session_priv_mpool,
2024 		ts_params->valid_devs[0],
2025 		rte_cryptodev_driver_id_get(
2026 		RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),
2027 		BLKCIPHER_AUTHONLY_TYPE);
2028 
2029 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2030 
2031 	return TEST_SUCCESS;
2032 }
2033 
2034 
2035 static int
2036 test_AES_chain_dpaa_sec_all(void)
2037 {
2038 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2039 	int status;
2040 
2041 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2042 		ts_params->op_mpool,
2043 		ts_params->session_mpool, ts_params->session_priv_mpool,
2044 		ts_params->valid_devs[0],
2045 		rte_cryptodev_driver_id_get(
2046 		RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),
2047 		BLKCIPHER_AES_CHAIN_TYPE);
2048 
2049 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2050 
2051 	return TEST_SUCCESS;
2052 }
2053 
2054 static int
2055 test_AES_cipheronly_dpaa_sec_all(void)
2056 {
2057 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2058 	int status;
2059 
2060 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2061 		ts_params->op_mpool,
2062 		ts_params->session_mpool, ts_params->session_priv_mpool,
2063 		ts_params->valid_devs[0],
2064 		rte_cryptodev_driver_id_get(
2065 		RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),
2066 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2067 
2068 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2069 
2070 	return TEST_SUCCESS;
2071 }
2072 
2073 static int
2074 test_authonly_dpaa_sec_all(void)
2075 {
2076 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2077 	int status;
2078 
2079 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2080 		ts_params->op_mpool,
2081 		ts_params->session_mpool, ts_params->session_priv_mpool,
2082 		ts_params->valid_devs[0],
2083 		rte_cryptodev_driver_id_get(
2084 		RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),
2085 		BLKCIPHER_AUTHONLY_TYPE);
2086 
2087 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2088 
2089 	return TEST_SUCCESS;
2090 }
2091 
2092 static int
2093 test_AES_chain_dpaa2_sec_all(void)
2094 {
2095 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2096 	int status;
2097 
2098 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2099 		ts_params->op_mpool,
2100 		ts_params->session_mpool, ts_params->session_priv_mpool,
2101 		ts_params->valid_devs[0],
2102 		rte_cryptodev_driver_id_get(
2103 		RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
2104 		BLKCIPHER_AES_CHAIN_TYPE);
2105 
2106 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2107 
2108 	return TEST_SUCCESS;
2109 }
2110 
2111 static int
2112 test_AES_cipheronly_dpaa2_sec_all(void)
2113 {
2114 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2115 	int status;
2116 
2117 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2118 		ts_params->op_mpool,
2119 		ts_params->session_mpool, ts_params->session_priv_mpool,
2120 		ts_params->valid_devs[0],
2121 		rte_cryptodev_driver_id_get(
2122 		RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
2123 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2124 
2125 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2126 
2127 	return TEST_SUCCESS;
2128 }
2129 
2130 static int
2131 test_authonly_dpaa2_sec_all(void)
2132 {
2133 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2134 	int status;
2135 
2136 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2137 		ts_params->op_mpool,
2138 		ts_params->session_mpool, ts_params->session_priv_mpool,
2139 		ts_params->valid_devs[0],
2140 		rte_cryptodev_driver_id_get(
2141 		RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
2142 		BLKCIPHER_AUTHONLY_TYPE);
2143 
2144 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2145 
2146 	return TEST_SUCCESS;
2147 }
2148 
2149 static int
2150 test_authonly_openssl_all(void)
2151 {
2152 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2153 	int status;
2154 
2155 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2156 		ts_params->op_mpool,
2157 		ts_params->session_mpool, ts_params->session_priv_mpool,
2158 		ts_params->valid_devs[0],
2159 		rte_cryptodev_driver_id_get(
2160 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
2161 		BLKCIPHER_AUTHONLY_TYPE);
2162 
2163 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2164 
2165 	return TEST_SUCCESS;
2166 }
2167 
2168 static int
2169 test_authonly_ccp_all(void)
2170 {
2171 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2172 	int status;
2173 
2174 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2175 		ts_params->op_mpool,
2176 		ts_params->session_mpool, ts_params->session_priv_mpool,
2177 		ts_params->valid_devs[0],
2178 		rte_cryptodev_driver_id_get(
2179 		RTE_STR(CRYPTODEV_NAME_CCP_PMD)),
2180 		BLKCIPHER_AUTHONLY_TYPE);
2181 
2182 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2183 
2184 	return TEST_SUCCESS;
2185 }
2186 
2187 static int
2188 test_AES_chain_armv8_all(void)
2189 {
2190 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2191 	int status;
2192 
2193 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2194 		ts_params->op_mpool,
2195 		ts_params->session_mpool, ts_params->session_priv_mpool,
2196 		ts_params->valid_devs[0],
2197 		rte_cryptodev_driver_id_get(
2198 		RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)),
2199 		BLKCIPHER_AES_CHAIN_TYPE);
2200 
2201 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2202 
2203 	return TEST_SUCCESS;
2204 }
2205 
2206 static int
2207 test_AES_chain_mrvl_all(void)
2208 {
2209 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2210 	int status;
2211 
2212 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2213 		ts_params->op_mpool,
2214 		ts_params->session_mpool, ts_params->session_priv_mpool,
2215 		ts_params->valid_devs[0],
2216 		rte_cryptodev_driver_id_get(
2217 		RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),
2218 		BLKCIPHER_AES_CHAIN_TYPE);
2219 
2220 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2221 
2222 	return TEST_SUCCESS;
2223 }
2224 
2225 static int
2226 test_AES_cipheronly_mrvl_all(void)
2227 {
2228 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2229 	int status;
2230 
2231 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2232 		ts_params->op_mpool,
2233 		ts_params->session_mpool, ts_params->session_priv_mpool,
2234 		ts_params->valid_devs[0],
2235 		rte_cryptodev_driver_id_get(
2236 		RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),
2237 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2238 
2239 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2240 
2241 	return TEST_SUCCESS;
2242 }
2243 
2244 static int
2245 test_authonly_mrvl_all(void)
2246 {
2247 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2248 	int status;
2249 
2250 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2251 		ts_params->op_mpool,
2252 		ts_params->session_mpool, ts_params->session_priv_mpool,
2253 		ts_params->valid_devs[0],
2254 		rte_cryptodev_driver_id_get(
2255 		RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),
2256 		BLKCIPHER_AUTHONLY_TYPE);
2257 
2258 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2259 
2260 	return TEST_SUCCESS;
2261 }
2262 
2263 static int
2264 test_3DES_chain_mrvl_all(void)
2265 {
2266 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2267 	int status;
2268 
2269 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2270 		ts_params->op_mpool,
2271 		ts_params->session_mpool, ts_params->session_priv_mpool,
2272 		ts_params->valid_devs[0],
2273 		rte_cryptodev_driver_id_get(
2274 		RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),
2275 		BLKCIPHER_3DES_CHAIN_TYPE);
2276 
2277 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2278 
2279 	return TEST_SUCCESS;
2280 }
2281 
2282 static int
2283 test_3DES_cipheronly_mrvl_all(void)
2284 {
2285 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2286 	int status;
2287 
2288 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2289 		ts_params->op_mpool,
2290 		ts_params->session_mpool, ts_params->session_priv_mpool,
2291 		ts_params->valid_devs[0],
2292 		rte_cryptodev_driver_id_get(
2293 		RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)),
2294 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
2295 
2296 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2297 
2298 	return TEST_SUCCESS;
2299 }
2300 
2301 static int
2302 test_AES_chain_octeontx_all(void)
2303 {
2304 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2305 	int status;
2306 
2307 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2308 		ts_params->op_mpool, ts_params->session_mpool,
2309 		ts_params->session_priv_mpool,
2310 		ts_params->valid_devs[0],
2311 		rte_cryptodev_driver_id_get(
2312 		RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),
2313 		BLKCIPHER_AES_CHAIN_TYPE);
2314 
2315 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2316 
2317 	return TEST_SUCCESS;
2318 }
2319 
2320 static int
2321 test_AES_cipheronly_octeontx_all(void)
2322 {
2323 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2324 	int status;
2325 
2326 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2327 		ts_params->op_mpool, ts_params->session_mpool,
2328 		ts_params->session_priv_mpool,
2329 		ts_params->valid_devs[0],
2330 		rte_cryptodev_driver_id_get(
2331 		RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),
2332 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2333 
2334 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2335 
2336 	return TEST_SUCCESS;
2337 }
2338 
2339 static int
2340 test_3DES_chain_octeontx_all(void)
2341 {
2342 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2343 	int status;
2344 
2345 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2346 		ts_params->op_mpool, ts_params->session_mpool,
2347 		ts_params->session_priv_mpool,
2348 		ts_params->valid_devs[0],
2349 		rte_cryptodev_driver_id_get(
2350 		RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),
2351 		BLKCIPHER_3DES_CHAIN_TYPE);
2352 
2353 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2354 
2355 	return TEST_SUCCESS;
2356 }
2357 
2358 static int
2359 test_AES_chain_nitrox_all(void)
2360 {
2361 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2362 	int status;
2363 
2364 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2365 		ts_params->op_mpool,
2366 		ts_params->session_mpool, ts_params->session_priv_mpool,
2367 		ts_params->valid_devs[0],
2368 		rte_cryptodev_driver_id_get(
2369 		RTE_STR(CRYPTODEV_NAME_NITROX_PMD)),
2370 		BLKCIPHER_AES_CHAIN_TYPE);
2371 
2372 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2373 
2374 	return TEST_SUCCESS;
2375 }
2376 
2377 static int
2378 test_3DES_cipheronly_octeontx_all(void)
2379 {
2380 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2381 	int status;
2382 
2383 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2384 		ts_params->op_mpool, ts_params->session_mpool,
2385 		ts_params->session_priv_mpool,
2386 		ts_params->valid_devs[0],
2387 		rte_cryptodev_driver_id_get(
2388 		RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),
2389 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
2390 
2391 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2392 
2393 	return TEST_SUCCESS;
2394 }
2395 
2396 static int
2397 test_authonly_octeontx_all(void)
2398 {
2399 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2400 	int status;
2401 
2402 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2403 		ts_params->op_mpool, ts_params->session_mpool,
2404 		ts_params->session_priv_mpool,
2405 		ts_params->valid_devs[0],
2406 		rte_cryptodev_driver_id_get(
2407 		RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD)),
2408 		BLKCIPHER_AUTHONLY_TYPE);
2409 
2410 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2411 
2412 	return TEST_SUCCESS;
2413 }
2414 
2415 static int
2416 test_AES_chain_octeontx2_all(void)
2417 {
2418 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2419 	int status;
2420 
2421 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2422 		ts_params->op_mpool, ts_params->session_mpool,
2423 		ts_params->session_priv_mpool,
2424 		ts_params->valid_devs[0],
2425 		rte_cryptodev_driver_id_get(
2426 		RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),
2427 		BLKCIPHER_AES_CHAIN_TYPE);
2428 
2429 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2430 
2431 	return TEST_SUCCESS;
2432 }
2433 
2434 static int
2435 test_AES_cipheronly_octeontx2_all(void)
2436 {
2437 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2438 	int status;
2439 
2440 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2441 		ts_params->op_mpool, ts_params->session_mpool,
2442 		ts_params->session_priv_mpool,
2443 		ts_params->valid_devs[0],
2444 		rte_cryptodev_driver_id_get(
2445 		RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),
2446 		BLKCIPHER_AES_CIPHERONLY_TYPE);
2447 
2448 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2449 
2450 	return TEST_SUCCESS;
2451 }
2452 
2453 static int
2454 test_3DES_chain_octeontx2_all(void)
2455 {
2456 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2457 	int status;
2458 
2459 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2460 		ts_params->op_mpool, ts_params->session_mpool,
2461 		ts_params->session_priv_mpool,
2462 		ts_params->valid_devs[0],
2463 		rte_cryptodev_driver_id_get(
2464 		RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),
2465 		BLKCIPHER_3DES_CHAIN_TYPE);
2466 
2467 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2468 
2469 	return TEST_SUCCESS;
2470 }
2471 
2472 static int
2473 test_3DES_cipheronly_octeontx2_all(void)
2474 {
2475 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2476 	int status;
2477 
2478 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2479 		ts_params->op_mpool, ts_params->session_mpool,
2480 		ts_params->session_priv_mpool,
2481 		ts_params->valid_devs[0],
2482 		rte_cryptodev_driver_id_get(
2483 		RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),
2484 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
2485 
2486 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2487 
2488 	return TEST_SUCCESS;
2489 }
2490 
2491 static int
2492 test_authonly_octeontx2_all(void)
2493 {
2494 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2495 	int status;
2496 
2497 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
2498 		ts_params->op_mpool, ts_params->session_mpool,
2499 		ts_params->session_priv_mpool,
2500 		ts_params->valid_devs[0],
2501 		rte_cryptodev_driver_id_get(
2502 		RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD)),
2503 		BLKCIPHER_AUTHONLY_TYPE);
2504 
2505 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
2506 
2507 	return TEST_SUCCESS;
2508 }
2509 
2510 /* ***** SNOW 3G Tests ***** */
2511 static int
2512 create_wireless_algo_hash_session(uint8_t dev_id,
2513 	const uint8_t *key, const uint8_t key_len,
2514 	const uint8_t iv_len, const uint8_t auth_len,
2515 	enum rte_crypto_auth_operation op,
2516 	enum rte_crypto_auth_algorithm algo)
2517 {
2518 	uint8_t hash_key[key_len];
2519 	int status;
2520 
2521 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2522 	struct crypto_unittest_params *ut_params = &unittest_params;
2523 
2524 	memcpy(hash_key, key, key_len);
2525 
2526 	debug_hexdump(stdout, "key:", key, key_len);
2527 
2528 	/* Setup Authentication Parameters */
2529 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2530 	ut_params->auth_xform.next = NULL;
2531 
2532 	ut_params->auth_xform.auth.op = op;
2533 	ut_params->auth_xform.auth.algo = algo;
2534 	ut_params->auth_xform.auth.key.length = key_len;
2535 	ut_params->auth_xform.auth.key.data = hash_key;
2536 	ut_params->auth_xform.auth.digest_length = auth_len;
2537 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2538 	ut_params->auth_xform.auth.iv.length = iv_len;
2539 	ut_params->sess = rte_cryptodev_sym_session_create(
2540 			ts_params->session_mpool);
2541 
2542 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2543 			&ut_params->auth_xform,
2544 			ts_params->session_priv_mpool);
2545 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2546 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2547 	return 0;
2548 }
2549 
2550 static int
2551 create_wireless_algo_cipher_session(uint8_t dev_id,
2552 			enum rte_crypto_cipher_operation op,
2553 			enum rte_crypto_cipher_algorithm algo,
2554 			const uint8_t *key, const uint8_t key_len,
2555 			uint8_t iv_len)
2556 {
2557 	uint8_t cipher_key[key_len];
2558 	int status;
2559 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2560 	struct crypto_unittest_params *ut_params = &unittest_params;
2561 
2562 	memcpy(cipher_key, key, key_len);
2563 
2564 	/* Setup Cipher Parameters */
2565 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2566 	ut_params->cipher_xform.next = NULL;
2567 
2568 	ut_params->cipher_xform.cipher.algo = algo;
2569 	ut_params->cipher_xform.cipher.op = op;
2570 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2571 	ut_params->cipher_xform.cipher.key.length = key_len;
2572 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2573 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2574 
2575 	debug_hexdump(stdout, "key:", key, key_len);
2576 
2577 	/* Create Crypto session */
2578 	ut_params->sess = rte_cryptodev_sym_session_create(
2579 			ts_params->session_mpool);
2580 
2581 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2582 			&ut_params->cipher_xform,
2583 			ts_params->session_priv_mpool);
2584 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2585 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2586 	return 0;
2587 }
2588 
2589 static int
2590 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2591 			unsigned int cipher_len,
2592 			unsigned int cipher_offset)
2593 {
2594 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2595 	struct crypto_unittest_params *ut_params = &unittest_params;
2596 
2597 	/* Generate Crypto op data structure */
2598 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2599 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2600 	TEST_ASSERT_NOT_NULL(ut_params->op,
2601 				"Failed to allocate pktmbuf offload");
2602 
2603 	/* Set crypto operation data parameters */
2604 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2605 
2606 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2607 
2608 	/* set crypto operation source mbuf */
2609 	sym_op->m_src = ut_params->ibuf;
2610 
2611 	/* iv */
2612 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2613 			iv, iv_len);
2614 	sym_op->cipher.data.length = cipher_len;
2615 	sym_op->cipher.data.offset = cipher_offset;
2616 	return 0;
2617 }
2618 
2619 static int
2620 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2621 			unsigned int cipher_len,
2622 			unsigned int cipher_offset)
2623 {
2624 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2625 	struct crypto_unittest_params *ut_params = &unittest_params;
2626 
2627 	/* Generate Crypto op data structure */
2628 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2629 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2630 	TEST_ASSERT_NOT_NULL(ut_params->op,
2631 				"Failed to allocate pktmbuf offload");
2632 
2633 	/* Set crypto operation data parameters */
2634 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2635 
2636 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2637 
2638 	/* set crypto operation source mbuf */
2639 	sym_op->m_src = ut_params->ibuf;
2640 	sym_op->m_dst = ut_params->obuf;
2641 
2642 	/* iv */
2643 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2644 			iv, iv_len);
2645 	sym_op->cipher.data.length = cipher_len;
2646 	sym_op->cipher.data.offset = cipher_offset;
2647 	return 0;
2648 }
2649 
2650 static int
2651 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2652 		enum rte_crypto_cipher_operation cipher_op,
2653 		enum rte_crypto_auth_operation auth_op,
2654 		enum rte_crypto_auth_algorithm auth_algo,
2655 		enum rte_crypto_cipher_algorithm cipher_algo,
2656 		const uint8_t *key, uint8_t key_len,
2657 		uint8_t auth_iv_len, uint8_t auth_len,
2658 		uint8_t cipher_iv_len)
2659 
2660 {
2661 	uint8_t cipher_auth_key[key_len];
2662 	int status;
2663 
2664 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2665 	struct crypto_unittest_params *ut_params = &unittest_params;
2666 
2667 	memcpy(cipher_auth_key, key, key_len);
2668 
2669 	/* Setup Authentication Parameters */
2670 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2671 	ut_params->auth_xform.next = NULL;
2672 
2673 	ut_params->auth_xform.auth.op = auth_op;
2674 	ut_params->auth_xform.auth.algo = auth_algo;
2675 	ut_params->auth_xform.auth.key.length = key_len;
2676 	/* Hash key = cipher key */
2677 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2678 	ut_params->auth_xform.auth.digest_length = auth_len;
2679 	/* Auth IV will be after cipher IV */
2680 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2681 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2682 
2683 	/* Setup Cipher Parameters */
2684 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2685 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2686 
2687 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2688 	ut_params->cipher_xform.cipher.op = cipher_op;
2689 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2690 	ut_params->cipher_xform.cipher.key.length = key_len;
2691 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2692 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2693 
2694 	debug_hexdump(stdout, "key:", key, key_len);
2695 
2696 	/* Create Crypto session*/
2697 	ut_params->sess = rte_cryptodev_sym_session_create(
2698 			ts_params->session_mpool);
2699 
2700 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2701 			&ut_params->cipher_xform,
2702 			ts_params->session_priv_mpool);
2703 
2704 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2705 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2706 	return 0;
2707 }
2708 
2709 static int
2710 create_wireless_cipher_auth_session(uint8_t dev_id,
2711 		enum rte_crypto_cipher_operation cipher_op,
2712 		enum rte_crypto_auth_operation auth_op,
2713 		enum rte_crypto_auth_algorithm auth_algo,
2714 		enum rte_crypto_cipher_algorithm cipher_algo,
2715 		const struct wireless_test_data *tdata)
2716 {
2717 	const uint8_t key_len = tdata->key.len;
2718 	uint8_t cipher_auth_key[key_len];
2719 	int status;
2720 
2721 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2722 	struct crypto_unittest_params *ut_params = &unittest_params;
2723 	const uint8_t *key = tdata->key.data;
2724 	const uint8_t auth_len = tdata->digest.len;
2725 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2726 	uint8_t auth_iv_len = tdata->auth_iv.len;
2727 
2728 	memcpy(cipher_auth_key, key, key_len);
2729 
2730 	/* Setup Authentication Parameters */
2731 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2732 	ut_params->auth_xform.next = NULL;
2733 
2734 	ut_params->auth_xform.auth.op = auth_op;
2735 	ut_params->auth_xform.auth.algo = auth_algo;
2736 	ut_params->auth_xform.auth.key.length = key_len;
2737 	/* Hash key = cipher key */
2738 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2739 	ut_params->auth_xform.auth.digest_length = auth_len;
2740 	/* Auth IV will be after cipher IV */
2741 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2742 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2743 
2744 	/* Setup Cipher Parameters */
2745 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2746 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2747 
2748 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2749 	ut_params->cipher_xform.cipher.op = cipher_op;
2750 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2751 	ut_params->cipher_xform.cipher.key.length = key_len;
2752 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2753 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2754 
2755 
2756 	debug_hexdump(stdout, "key:", key, key_len);
2757 
2758 	/* Create Crypto session*/
2759 	ut_params->sess = rte_cryptodev_sym_session_create(
2760 			ts_params->session_mpool);
2761 
2762 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2763 			&ut_params->cipher_xform,
2764 			ts_params->session_priv_mpool);
2765 
2766 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2767 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2768 	return 0;
2769 }
2770 
2771 static int
2772 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2773 		const struct wireless_test_data *tdata)
2774 {
2775 	return create_wireless_cipher_auth_session(dev_id,
2776 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2777 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2778 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2779 }
2780 
2781 static int
2782 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2783 		enum rte_crypto_cipher_operation cipher_op,
2784 		enum rte_crypto_auth_operation auth_op,
2785 		enum rte_crypto_auth_algorithm auth_algo,
2786 		enum rte_crypto_cipher_algorithm cipher_algo,
2787 		const uint8_t *key, const uint8_t key_len,
2788 		uint8_t auth_iv_len, uint8_t auth_len,
2789 		uint8_t cipher_iv_len)
2790 {
2791 	uint8_t auth_cipher_key[key_len];
2792 	int status;
2793 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2794 	struct crypto_unittest_params *ut_params = &unittest_params;
2795 
2796 	memcpy(auth_cipher_key, key, key_len);
2797 
2798 	/* Setup Authentication Parameters */
2799 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2800 	ut_params->auth_xform.auth.op = auth_op;
2801 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2802 	ut_params->auth_xform.auth.algo = auth_algo;
2803 	ut_params->auth_xform.auth.key.length = key_len;
2804 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2805 	ut_params->auth_xform.auth.digest_length = auth_len;
2806 	/* Auth IV will be after cipher IV */
2807 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2808 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2809 
2810 	/* Setup Cipher Parameters */
2811 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2812 	ut_params->cipher_xform.next = NULL;
2813 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2814 	ut_params->cipher_xform.cipher.op = cipher_op;
2815 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2816 	ut_params->cipher_xform.cipher.key.length = key_len;
2817 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2818 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2819 
2820 	debug_hexdump(stdout, "key:", key, key_len);
2821 
2822 	/* Create Crypto session*/
2823 	ut_params->sess = rte_cryptodev_sym_session_create(
2824 			ts_params->session_mpool);
2825 
2826 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2827 			&ut_params->auth_xform,
2828 			ts_params->session_priv_mpool);
2829 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2830 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2831 
2832 	return 0;
2833 }
2834 
2835 static int
2836 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2837 		unsigned int auth_tag_len,
2838 		const uint8_t *iv, unsigned int iv_len,
2839 		unsigned int data_pad_len,
2840 		enum rte_crypto_auth_operation op,
2841 		unsigned int auth_len, unsigned int auth_offset)
2842 {
2843 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2844 
2845 	struct crypto_unittest_params *ut_params = &unittest_params;
2846 
2847 	/* Generate Crypto op data structure */
2848 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2849 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2850 	TEST_ASSERT_NOT_NULL(ut_params->op,
2851 		"Failed to allocate pktmbuf offload");
2852 
2853 	/* Set crypto operation data parameters */
2854 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2855 
2856 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2857 
2858 	/* set crypto operation source mbuf */
2859 	sym_op->m_src = ut_params->ibuf;
2860 
2861 	/* iv */
2862 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2863 			iv, iv_len);
2864 	/* digest */
2865 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2866 					ut_params->ibuf, auth_tag_len);
2867 
2868 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2869 				"no room to append auth tag");
2870 	ut_params->digest = sym_op->auth.digest.data;
2871 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2872 			ut_params->ibuf, data_pad_len);
2873 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2874 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2875 	else
2876 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2877 
2878 	debug_hexdump(stdout, "digest:",
2879 		sym_op->auth.digest.data,
2880 		auth_tag_len);
2881 
2882 	sym_op->auth.data.length = auth_len;
2883 	sym_op->auth.data.offset = auth_offset;
2884 
2885 	return 0;
2886 }
2887 
2888 static int
2889 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2890 	enum rte_crypto_auth_operation op)
2891 {
2892 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2893 	struct crypto_unittest_params *ut_params = &unittest_params;
2894 
2895 	const uint8_t *auth_tag = tdata->digest.data;
2896 	const unsigned int auth_tag_len = tdata->digest.len;
2897 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2898 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2899 
2900 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2901 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2902 	const uint8_t *auth_iv = tdata->auth_iv.data;
2903 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2904 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2905 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2906 
2907 	/* Generate Crypto op data structure */
2908 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2909 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2910 	TEST_ASSERT_NOT_NULL(ut_params->op,
2911 			"Failed to allocate pktmbuf offload");
2912 	/* Set crypto operation data parameters */
2913 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2914 
2915 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2916 
2917 	/* set crypto operation source mbuf */
2918 	sym_op->m_src = ut_params->ibuf;
2919 
2920 	/* digest */
2921 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2922 			ut_params->ibuf, auth_tag_len);
2923 
2924 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2925 			"no room to append auth tag");
2926 	ut_params->digest = sym_op->auth.digest.data;
2927 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2928 			ut_params->ibuf, data_pad_len);
2929 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2930 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2931 	else
2932 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2933 
2934 	debug_hexdump(stdout, "digest:",
2935 		sym_op->auth.digest.data,
2936 		auth_tag_len);
2937 
2938 	/* Copy cipher and auth IVs at the end of the crypto operation */
2939 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2940 						IV_OFFSET);
2941 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2942 	iv_ptr += cipher_iv_len;
2943 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2944 
2945 	sym_op->cipher.data.length = cipher_len;
2946 	sym_op->cipher.data.offset = 0;
2947 	sym_op->auth.data.length = auth_len;
2948 	sym_op->auth.data.offset = 0;
2949 
2950 	return 0;
2951 }
2952 
2953 static int
2954 create_zuc_cipher_hash_generate_operation(
2955 		const struct wireless_test_data *tdata)
2956 {
2957 	return create_wireless_cipher_hash_operation(tdata,
2958 		RTE_CRYPTO_AUTH_OP_GENERATE);
2959 }
2960 
2961 static int
2962 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2963 		const unsigned auth_tag_len,
2964 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2965 		unsigned data_pad_len,
2966 		enum rte_crypto_auth_operation op,
2967 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2968 		const unsigned cipher_len, const unsigned cipher_offset,
2969 		const unsigned auth_len, const unsigned auth_offset)
2970 {
2971 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2972 	struct crypto_unittest_params *ut_params = &unittest_params;
2973 
2974 	/* Generate Crypto op data structure */
2975 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2976 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2977 	TEST_ASSERT_NOT_NULL(ut_params->op,
2978 			"Failed to allocate pktmbuf offload");
2979 	/* Set crypto operation data parameters */
2980 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2981 
2982 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2983 
2984 	/* set crypto operation source mbuf */
2985 	sym_op->m_src = ut_params->ibuf;
2986 
2987 	/* digest */
2988 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2989 			ut_params->ibuf, auth_tag_len);
2990 
2991 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2992 			"no room to append auth tag");
2993 	ut_params->digest = sym_op->auth.digest.data;
2994 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2995 			ut_params->ibuf, data_pad_len);
2996 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2997 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2998 	else
2999 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3000 
3001 	debug_hexdump(stdout, "digest:",
3002 		sym_op->auth.digest.data,
3003 		auth_tag_len);
3004 
3005 	/* Copy cipher and auth IVs at the end of the crypto operation */
3006 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
3007 						IV_OFFSET);
3008 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3009 	iv_ptr += cipher_iv_len;
3010 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3011 
3012 	sym_op->cipher.data.length = cipher_len;
3013 	sym_op->cipher.data.offset = cipher_offset;
3014 	sym_op->auth.data.length = auth_len;
3015 	sym_op->auth.data.offset = auth_offset;
3016 
3017 	return 0;
3018 }
3019 
3020 static int
3021 create_wireless_algo_auth_cipher_operation(unsigned int auth_tag_len,
3022 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
3023 		const uint8_t *auth_iv, uint8_t auth_iv_len,
3024 		unsigned int data_pad_len,
3025 		unsigned int cipher_len, unsigned int cipher_offset,
3026 		unsigned int auth_len, unsigned int auth_offset,
3027 		uint8_t op_mode, uint8_t do_sgl)
3028 {
3029 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3030 	struct crypto_unittest_params *ut_params = &unittest_params;
3031 
3032 	enum rte_crypto_cipher_algorithm cipher_algo =
3033 			ut_params->cipher_xform.cipher.algo;
3034 	enum rte_crypto_auth_algorithm auth_algo =
3035 			ut_params->auth_xform.auth.algo;
3036 
3037 	/* Generate Crypto op data structure */
3038 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3039 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3040 	TEST_ASSERT_NOT_NULL(ut_params->op,
3041 			"Failed to allocate pktmbuf offload");
3042 
3043 	/* Set crypto operation data parameters */
3044 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3045 
3046 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3047 
3048 	/* set crypto operation mbufs */
3049 	sym_op->m_src = ut_params->ibuf;
3050 	if (op_mode == OUT_OF_PLACE)
3051 		sym_op->m_dst = ut_params->obuf;
3052 
3053 	/* digest */
3054 	if (!do_sgl) {
3055 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3056 			(op_mode == IN_PLACE ?
3057 				ut_params->ibuf : ut_params->obuf),
3058 			uint8_t *, data_pad_len);
3059 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3060 			(op_mode == IN_PLACE ?
3061 				ut_params->ibuf : ut_params->obuf),
3062 			data_pad_len);
3063 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3064 	} else {
3065 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3066 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3067 				sym_op->m_src : sym_op->m_dst);
3068 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3069 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3070 			sgl_buf = sgl_buf->next;
3071 		}
3072 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3073 				uint8_t *, remaining_off);
3074 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3075 				remaining_off);
3076 		memset(sym_op->auth.digest.data, 0, remaining_off);
3077 		while (sgl_buf->next != NULL) {
3078 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3079 				0, rte_pktmbuf_data_len(sgl_buf));
3080 			sgl_buf = sgl_buf->next;
3081 		}
3082 	}
3083 
3084 	/* Copy cipher and auth IVs at the end of the crypto operation */
3085 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3086 			ut_params->op, uint8_t *, IV_OFFSET);
3087 
3088 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3089 	iv_ptr += cipher_iv_len;
3090 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3091 
3092 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3093 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3094 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3095 		sym_op->cipher.data.length = cipher_len;
3096 		sym_op->cipher.data.offset = cipher_offset;
3097 	} else {
3098 		sym_op->cipher.data.length = cipher_len >> 3;
3099 		sym_op->cipher.data.offset = cipher_offset >> 3;
3100 	}
3101 
3102 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3103 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3104 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3105 		sym_op->auth.data.length = auth_len;
3106 		sym_op->auth.data.offset = auth_offset;
3107 	} else {
3108 		sym_op->auth.data.length = auth_len >> 3;
3109 		sym_op->auth.data.offset = auth_offset >> 3;
3110 	}
3111 
3112 	return 0;
3113 }
3114 
3115 static int
3116 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3117 {
3118 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3119 	struct crypto_unittest_params *ut_params = &unittest_params;
3120 
3121 	int retval;
3122 	unsigned plaintext_pad_len;
3123 	unsigned plaintext_len;
3124 	uint8_t *plaintext;
3125 
3126 	/* Create SNOW 3G session */
3127 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3128 			tdata->key.data, tdata->key.len,
3129 			tdata->auth_iv.len, tdata->digest.len,
3130 			RTE_CRYPTO_AUTH_OP_GENERATE,
3131 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3132 	if (retval < 0)
3133 		return retval;
3134 
3135 	/* alloc mbuf and set payload */
3136 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3137 
3138 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3139 	rte_pktmbuf_tailroom(ut_params->ibuf));
3140 
3141 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3142 	/* Append data which is padded to a multiple of */
3143 	/* the algorithms block size */
3144 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3145 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3146 				plaintext_pad_len);
3147 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3148 
3149 	/* Create SNOW 3G operation */
3150 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3151 			tdata->auth_iv.data, tdata->auth_iv.len,
3152 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3153 			tdata->validAuthLenInBits.len,
3154 			0);
3155 	if (retval < 0)
3156 		return retval;
3157 
3158 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3159 				ut_params->op);
3160 	ut_params->obuf = ut_params->op->sym->m_src;
3161 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3162 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3163 			+ plaintext_pad_len;
3164 
3165 	/* Validate obuf */
3166 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3167 	ut_params->digest,
3168 	tdata->digest.data,
3169 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3170 	"SNOW 3G Generated auth tag not as expected");
3171 
3172 	return 0;
3173 }
3174 
3175 static int
3176 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3177 {
3178 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3179 	struct crypto_unittest_params *ut_params = &unittest_params;
3180 
3181 	int retval;
3182 	unsigned plaintext_pad_len;
3183 	unsigned plaintext_len;
3184 	uint8_t *plaintext;
3185 
3186 	/* Create SNOW 3G session */
3187 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3188 				tdata->key.data, tdata->key.len,
3189 				tdata->auth_iv.len, tdata->digest.len,
3190 				RTE_CRYPTO_AUTH_OP_VERIFY,
3191 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3192 	if (retval < 0)
3193 		return retval;
3194 	/* alloc mbuf and set payload */
3195 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3196 
3197 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3198 	rte_pktmbuf_tailroom(ut_params->ibuf));
3199 
3200 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3201 	/* Append data which is padded to a multiple of */
3202 	/* the algorithms block size */
3203 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3204 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3205 				plaintext_pad_len);
3206 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3207 
3208 	/* Create SNOW 3G operation */
3209 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3210 			tdata->digest.len,
3211 			tdata->auth_iv.data, tdata->auth_iv.len,
3212 			plaintext_pad_len,
3213 			RTE_CRYPTO_AUTH_OP_VERIFY,
3214 			tdata->validAuthLenInBits.len,
3215 			0);
3216 	if (retval < 0)
3217 		return retval;
3218 
3219 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3220 				ut_params->op);
3221 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3222 	ut_params->obuf = ut_params->op->sym->m_src;
3223 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3224 				+ plaintext_pad_len;
3225 
3226 	/* Validate obuf */
3227 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3228 		return 0;
3229 	else
3230 		return -1;
3231 
3232 	return 0;
3233 }
3234 
3235 static int
3236 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3237 {
3238 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3239 	struct crypto_unittest_params *ut_params = &unittest_params;
3240 
3241 	int retval;
3242 	unsigned plaintext_pad_len;
3243 	unsigned plaintext_len;
3244 	uint8_t *plaintext;
3245 
3246 	/* Create KASUMI session */
3247 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3248 			tdata->key.data, tdata->key.len,
3249 			0, tdata->digest.len,
3250 			RTE_CRYPTO_AUTH_OP_GENERATE,
3251 			RTE_CRYPTO_AUTH_KASUMI_F9);
3252 	if (retval < 0)
3253 		return retval;
3254 
3255 	/* alloc mbuf and set payload */
3256 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3257 
3258 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3259 	rte_pktmbuf_tailroom(ut_params->ibuf));
3260 
3261 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3262 	/* Append data which is padded to a multiple of */
3263 	/* the algorithms block size */
3264 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3265 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3266 				plaintext_pad_len);
3267 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3268 
3269 	/* Create KASUMI operation */
3270 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3271 			NULL, 0,
3272 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3273 			tdata->plaintext.len,
3274 			0);
3275 	if (retval < 0)
3276 		return retval;
3277 
3278 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3279 				ut_params->op);
3280 	ut_params->obuf = ut_params->op->sym->m_src;
3281 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3282 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3283 			+ plaintext_pad_len;
3284 
3285 	/* Validate obuf */
3286 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3287 	ut_params->digest,
3288 	tdata->digest.data,
3289 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3290 	"KASUMI Generated auth tag not as expected");
3291 
3292 	return 0;
3293 }
3294 
3295 static int
3296 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3297 {
3298 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3299 	struct crypto_unittest_params *ut_params = &unittest_params;
3300 
3301 	int retval;
3302 	unsigned plaintext_pad_len;
3303 	unsigned plaintext_len;
3304 	uint8_t *plaintext;
3305 
3306 	/* Create KASUMI session */
3307 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3308 				tdata->key.data, tdata->key.len,
3309 				0, tdata->digest.len,
3310 				RTE_CRYPTO_AUTH_OP_VERIFY,
3311 				RTE_CRYPTO_AUTH_KASUMI_F9);
3312 	if (retval < 0)
3313 		return retval;
3314 	/* alloc mbuf and set payload */
3315 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3316 
3317 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3318 	rte_pktmbuf_tailroom(ut_params->ibuf));
3319 
3320 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3321 	/* Append data which is padded to a multiple */
3322 	/* of the algorithms block size */
3323 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3324 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3325 				plaintext_pad_len);
3326 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3327 
3328 	/* Create KASUMI operation */
3329 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3330 			tdata->digest.len,
3331 			NULL, 0,
3332 			plaintext_pad_len,
3333 			RTE_CRYPTO_AUTH_OP_VERIFY,
3334 			tdata->plaintext.len,
3335 			0);
3336 	if (retval < 0)
3337 		return retval;
3338 
3339 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3340 				ut_params->op);
3341 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3342 	ut_params->obuf = ut_params->op->sym->m_src;
3343 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3344 				+ plaintext_pad_len;
3345 
3346 	/* Validate obuf */
3347 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3348 		return 0;
3349 	else
3350 		return -1;
3351 
3352 	return 0;
3353 }
3354 
3355 static int
3356 test_snow3g_hash_generate_test_case_1(void)
3357 {
3358 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3359 }
3360 
3361 static int
3362 test_snow3g_hash_generate_test_case_2(void)
3363 {
3364 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3365 }
3366 
3367 static int
3368 test_snow3g_hash_generate_test_case_3(void)
3369 {
3370 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3371 }
3372 
3373 static int
3374 test_snow3g_hash_generate_test_case_4(void)
3375 {
3376 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3377 }
3378 
3379 static int
3380 test_snow3g_hash_generate_test_case_5(void)
3381 {
3382 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3383 }
3384 
3385 static int
3386 test_snow3g_hash_generate_test_case_6(void)
3387 {
3388 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3389 }
3390 
3391 static int
3392 test_snow3g_hash_verify_test_case_1(void)
3393 {
3394 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3395 
3396 }
3397 
3398 static int
3399 test_snow3g_hash_verify_test_case_2(void)
3400 {
3401 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3402 }
3403 
3404 static int
3405 test_snow3g_hash_verify_test_case_3(void)
3406 {
3407 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3408 }
3409 
3410 static int
3411 test_snow3g_hash_verify_test_case_4(void)
3412 {
3413 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3414 }
3415 
3416 static int
3417 test_snow3g_hash_verify_test_case_5(void)
3418 {
3419 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3420 }
3421 
3422 static int
3423 test_snow3g_hash_verify_test_case_6(void)
3424 {
3425 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3426 }
3427 
3428 static int
3429 test_kasumi_hash_generate_test_case_1(void)
3430 {
3431 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3432 }
3433 
3434 static int
3435 test_kasumi_hash_generate_test_case_2(void)
3436 {
3437 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3438 }
3439 
3440 static int
3441 test_kasumi_hash_generate_test_case_3(void)
3442 {
3443 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3444 }
3445 
3446 static int
3447 test_kasumi_hash_generate_test_case_4(void)
3448 {
3449 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3450 }
3451 
3452 static int
3453 test_kasumi_hash_generate_test_case_5(void)
3454 {
3455 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3456 }
3457 
3458 static int
3459 test_kasumi_hash_generate_test_case_6(void)
3460 {
3461 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3462 }
3463 
3464 static int
3465 test_kasumi_hash_verify_test_case_1(void)
3466 {
3467 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3468 }
3469 
3470 static int
3471 test_kasumi_hash_verify_test_case_2(void)
3472 {
3473 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3474 }
3475 
3476 static int
3477 test_kasumi_hash_verify_test_case_3(void)
3478 {
3479 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3480 }
3481 
3482 static int
3483 test_kasumi_hash_verify_test_case_4(void)
3484 {
3485 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3486 }
3487 
3488 static int
3489 test_kasumi_hash_verify_test_case_5(void)
3490 {
3491 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3492 }
3493 
3494 static int
3495 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3496 {
3497 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3498 	struct crypto_unittest_params *ut_params = &unittest_params;
3499 
3500 	int retval;
3501 	uint8_t *plaintext, *ciphertext;
3502 	unsigned plaintext_pad_len;
3503 	unsigned plaintext_len;
3504 
3505 	/* Create KASUMI session */
3506 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3507 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3508 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3509 					tdata->key.data, tdata->key.len,
3510 					tdata->cipher_iv.len);
3511 	if (retval < 0)
3512 		return retval;
3513 
3514 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3515 
3516 	/* Clear mbuf payload */
3517 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3518 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3519 
3520 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3521 	/* Append data which is padded to a multiple */
3522 	/* of the algorithms block size */
3523 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3524 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3525 				plaintext_pad_len);
3526 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3527 
3528 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3529 
3530 	/* Create KASUMI operation */
3531 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3532 				tdata->cipher_iv.len,
3533 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3534 				tdata->validCipherOffsetInBits.len);
3535 	if (retval < 0)
3536 		return retval;
3537 
3538 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3539 						ut_params->op);
3540 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3541 
3542 	ut_params->obuf = ut_params->op->sym->m_dst;
3543 	if (ut_params->obuf)
3544 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3545 	else
3546 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3547 
3548 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3549 
3550 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3551 				(tdata->validCipherOffsetInBits.len >> 3);
3552 	/* Validate obuf */
3553 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3554 		ciphertext,
3555 		reference_ciphertext,
3556 		tdata->validCipherLenInBits.len,
3557 		"KASUMI Ciphertext data not as expected");
3558 	return 0;
3559 }
3560 
3561 static int
3562 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3563 {
3564 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3565 	struct crypto_unittest_params *ut_params = &unittest_params;
3566 
3567 	int retval;
3568 
3569 	unsigned int plaintext_pad_len;
3570 	unsigned int plaintext_len;
3571 
3572 	uint8_t buffer[10000];
3573 	const uint8_t *ciphertext;
3574 
3575 	struct rte_cryptodev_info dev_info;
3576 
3577 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3578 
3579 	uint64_t feat_flags = dev_info.feature_flags;
3580 
3581 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3582 		printf("Device doesn't support in-place scatter-gather. "
3583 				"Test Skipped.\n");
3584 		return -ENOTSUP;
3585 	}
3586 
3587 	/* Create KASUMI session */
3588 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3589 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3590 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3591 					tdata->key.data, tdata->key.len,
3592 					tdata->cipher_iv.len);
3593 	if (retval < 0)
3594 		return retval;
3595 
3596 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3597 
3598 
3599 	/* Append data which is padded to a multiple */
3600 	/* of the algorithms block size */
3601 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3602 
3603 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3604 			plaintext_pad_len, 10, 0);
3605 
3606 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3607 
3608 	/* Create KASUMI operation */
3609 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3610 				tdata->cipher_iv.len,
3611 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3612 				tdata->validCipherOffsetInBits.len);
3613 	if (retval < 0)
3614 		return retval;
3615 
3616 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3617 						ut_params->op);
3618 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3619 
3620 	ut_params->obuf = ut_params->op->sym->m_dst;
3621 
3622 	if (ut_params->obuf)
3623 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3624 				plaintext_len, buffer);
3625 	else
3626 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3627 				tdata->validCipherOffsetInBits.len >> 3,
3628 				plaintext_len, buffer);
3629 
3630 	/* Validate obuf */
3631 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3632 
3633 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3634 				(tdata->validCipherOffsetInBits.len >> 3);
3635 	/* Validate obuf */
3636 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3637 		ciphertext,
3638 		reference_ciphertext,
3639 		tdata->validCipherLenInBits.len,
3640 		"KASUMI Ciphertext data not as expected");
3641 	return 0;
3642 }
3643 
3644 static int
3645 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3646 {
3647 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3648 	struct crypto_unittest_params *ut_params = &unittest_params;
3649 
3650 	int retval;
3651 	uint8_t *plaintext, *ciphertext;
3652 	unsigned plaintext_pad_len;
3653 	unsigned plaintext_len;
3654 
3655 	/* Create KASUMI session */
3656 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3657 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3658 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3659 					tdata->key.data, tdata->key.len,
3660 					tdata->cipher_iv.len);
3661 	if (retval < 0)
3662 		return retval;
3663 
3664 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3665 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3666 
3667 	/* Clear mbuf payload */
3668 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3669 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3670 
3671 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3672 	/* Append data which is padded to a multiple */
3673 	/* of the algorithms block size */
3674 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3675 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3676 				plaintext_pad_len);
3677 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3678 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3679 
3680 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3681 
3682 	/* Create KASUMI operation */
3683 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3684 				tdata->cipher_iv.len,
3685 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3686 				tdata->validCipherOffsetInBits.len);
3687 	if (retval < 0)
3688 		return retval;
3689 
3690 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3691 						ut_params->op);
3692 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3693 
3694 	ut_params->obuf = ut_params->op->sym->m_dst;
3695 	if (ut_params->obuf)
3696 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3697 	else
3698 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3699 
3700 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3701 
3702 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3703 				(tdata->validCipherOffsetInBits.len >> 3);
3704 	/* Validate obuf */
3705 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3706 		ciphertext,
3707 		reference_ciphertext,
3708 		tdata->validCipherLenInBits.len,
3709 		"KASUMI Ciphertext data not as expected");
3710 	return 0;
3711 }
3712 
3713 static int
3714 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3715 {
3716 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3717 	struct crypto_unittest_params *ut_params = &unittest_params;
3718 
3719 	int retval;
3720 	unsigned int plaintext_pad_len;
3721 	unsigned int plaintext_len;
3722 
3723 	const uint8_t *ciphertext;
3724 	uint8_t buffer[2048];
3725 
3726 	struct rte_cryptodev_info dev_info;
3727 
3728 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3729 
3730 	uint64_t feat_flags = dev_info.feature_flags;
3731 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3732 		printf("Device doesn't support out-of-place scatter-gather "
3733 				"in both input and output mbufs. "
3734 				"Test Skipped.\n");
3735 		return -ENOTSUP;
3736 	}
3737 
3738 	/* Create KASUMI session */
3739 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3740 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3741 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3742 					tdata->key.data, tdata->key.len,
3743 					tdata->cipher_iv.len);
3744 	if (retval < 0)
3745 		return retval;
3746 
3747 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3748 	/* Append data which is padded to a multiple */
3749 	/* of the algorithms block size */
3750 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3751 
3752 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3753 			plaintext_pad_len, 10, 0);
3754 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3755 			plaintext_pad_len, 3, 0);
3756 
3757 	/* Append data which is padded to a multiple */
3758 	/* of the algorithms block size */
3759 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3760 
3761 	/* Create KASUMI operation */
3762 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3763 				tdata->cipher_iv.len,
3764 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3765 				tdata->validCipherOffsetInBits.len);
3766 	if (retval < 0)
3767 		return retval;
3768 
3769 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3770 						ut_params->op);
3771 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3772 
3773 	ut_params->obuf = ut_params->op->sym->m_dst;
3774 	if (ut_params->obuf)
3775 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3776 				plaintext_pad_len, buffer);
3777 	else
3778 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3779 				tdata->validCipherOffsetInBits.len >> 3,
3780 				plaintext_pad_len, buffer);
3781 
3782 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3783 				(tdata->validCipherOffsetInBits.len >> 3);
3784 	/* Validate obuf */
3785 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3786 		ciphertext,
3787 		reference_ciphertext,
3788 		tdata->validCipherLenInBits.len,
3789 		"KASUMI Ciphertext data not as expected");
3790 	return 0;
3791 }
3792 
3793 
3794 static int
3795 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3796 {
3797 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3798 	struct crypto_unittest_params *ut_params = &unittest_params;
3799 
3800 	int retval;
3801 	uint8_t *ciphertext, *plaintext;
3802 	unsigned ciphertext_pad_len;
3803 	unsigned ciphertext_len;
3804 
3805 	/* Create KASUMI session */
3806 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3807 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3808 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3809 					tdata->key.data, tdata->key.len,
3810 					tdata->cipher_iv.len);
3811 	if (retval < 0)
3812 		return retval;
3813 
3814 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3815 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3816 
3817 	/* Clear mbuf payload */
3818 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3819 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3820 
3821 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3822 	/* Append data which is padded to a multiple */
3823 	/* of the algorithms block size */
3824 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3825 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3826 				ciphertext_pad_len);
3827 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3828 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3829 
3830 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3831 
3832 	/* Create KASUMI operation */
3833 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3834 				tdata->cipher_iv.len,
3835 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3836 				tdata->validCipherOffsetInBits.len);
3837 	if (retval < 0)
3838 		return retval;
3839 
3840 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3841 						ut_params->op);
3842 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3843 
3844 	ut_params->obuf = ut_params->op->sym->m_dst;
3845 	if (ut_params->obuf)
3846 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3847 	else
3848 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3849 
3850 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3851 
3852 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3853 				(tdata->validCipherOffsetInBits.len >> 3);
3854 	/* Validate obuf */
3855 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3856 		plaintext,
3857 		reference_plaintext,
3858 		tdata->validCipherLenInBits.len,
3859 		"KASUMI Plaintext data not as expected");
3860 	return 0;
3861 }
3862 
3863 static int
3864 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3865 {
3866 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3867 	struct crypto_unittest_params *ut_params = &unittest_params;
3868 
3869 	int retval;
3870 	uint8_t *ciphertext, *plaintext;
3871 	unsigned ciphertext_pad_len;
3872 	unsigned ciphertext_len;
3873 
3874 	/* Create KASUMI session */
3875 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3876 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3877 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3878 					tdata->key.data, tdata->key.len,
3879 					tdata->cipher_iv.len);
3880 	if (retval < 0)
3881 		return retval;
3882 
3883 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3884 
3885 	/* Clear mbuf payload */
3886 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3887 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3888 
3889 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3890 	/* Append data which is padded to a multiple */
3891 	/* of the algorithms block size */
3892 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3893 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3894 				ciphertext_pad_len);
3895 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3896 
3897 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3898 
3899 	/* Create KASUMI operation */
3900 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3901 					tdata->cipher_iv.len,
3902 					tdata->ciphertext.len,
3903 					tdata->validCipherOffsetInBits.len);
3904 	if (retval < 0)
3905 		return retval;
3906 
3907 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3908 						ut_params->op);
3909 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3910 
3911 	ut_params->obuf = ut_params->op->sym->m_dst;
3912 	if (ut_params->obuf)
3913 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3914 	else
3915 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3916 
3917 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3918 
3919 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3920 				(tdata->validCipherOffsetInBits.len >> 3);
3921 	/* Validate obuf */
3922 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3923 		plaintext,
3924 		reference_plaintext,
3925 		tdata->validCipherLenInBits.len,
3926 		"KASUMI Plaintext data not as expected");
3927 	return 0;
3928 }
3929 
3930 static int
3931 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3932 {
3933 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3934 	struct crypto_unittest_params *ut_params = &unittest_params;
3935 
3936 	int retval;
3937 	uint8_t *plaintext, *ciphertext;
3938 	unsigned plaintext_pad_len;
3939 	unsigned plaintext_len;
3940 
3941 	/* Create SNOW 3G session */
3942 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3943 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3944 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3945 					tdata->key.data, tdata->key.len,
3946 					tdata->cipher_iv.len);
3947 	if (retval < 0)
3948 		return retval;
3949 
3950 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3951 
3952 	/* Clear mbuf payload */
3953 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3954 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3955 
3956 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3957 	/* Append data which is padded to a multiple of */
3958 	/* the algorithms block size */
3959 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3960 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3961 				plaintext_pad_len);
3962 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3963 
3964 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3965 
3966 	/* Create SNOW 3G operation */
3967 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3968 					tdata->cipher_iv.len,
3969 					tdata->validCipherLenInBits.len,
3970 					0);
3971 	if (retval < 0)
3972 		return retval;
3973 
3974 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3975 						ut_params->op);
3976 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3977 
3978 	ut_params->obuf = ut_params->op->sym->m_dst;
3979 	if (ut_params->obuf)
3980 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3981 	else
3982 		ciphertext = plaintext;
3983 
3984 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3985 
3986 	/* Validate obuf */
3987 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3988 		ciphertext,
3989 		tdata->ciphertext.data,
3990 		tdata->validDataLenInBits.len,
3991 		"SNOW 3G Ciphertext data not as expected");
3992 	return 0;
3993 }
3994 
3995 
3996 static int
3997 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3998 {
3999 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4000 	struct crypto_unittest_params *ut_params = &unittest_params;
4001 	uint8_t *plaintext, *ciphertext;
4002 
4003 	int retval;
4004 	unsigned plaintext_pad_len;
4005 	unsigned plaintext_len;
4006 
4007 	/* Create SNOW 3G session */
4008 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4009 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4010 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4011 					tdata->key.data, tdata->key.len,
4012 					tdata->cipher_iv.len);
4013 	if (retval < 0)
4014 		return retval;
4015 
4016 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4017 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4018 
4019 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4020 			"Failed to allocate input buffer in mempool");
4021 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4022 			"Failed to allocate output buffer in mempool");
4023 
4024 	/* Clear mbuf payload */
4025 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4026 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4027 
4028 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4029 	/* Append data which is padded to a multiple of */
4030 	/* the algorithms block size */
4031 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4032 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4033 				plaintext_pad_len);
4034 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4035 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4036 
4037 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4038 
4039 	/* Create SNOW 3G operation */
4040 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4041 					tdata->cipher_iv.len,
4042 					tdata->validCipherLenInBits.len,
4043 					0);
4044 	if (retval < 0)
4045 		return retval;
4046 
4047 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4048 						ut_params->op);
4049 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4050 
4051 	ut_params->obuf = ut_params->op->sym->m_dst;
4052 	if (ut_params->obuf)
4053 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4054 	else
4055 		ciphertext = plaintext;
4056 
4057 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4058 
4059 	/* Validate obuf */
4060 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4061 		ciphertext,
4062 		tdata->ciphertext.data,
4063 		tdata->validDataLenInBits.len,
4064 		"SNOW 3G Ciphertext data not as expected");
4065 	return 0;
4066 }
4067 
4068 static int
4069 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4070 {
4071 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4072 	struct crypto_unittest_params *ut_params = &unittest_params;
4073 
4074 	int retval;
4075 	unsigned int plaintext_pad_len;
4076 	unsigned int plaintext_len;
4077 	uint8_t buffer[10000];
4078 	const uint8_t *ciphertext;
4079 
4080 	struct rte_cryptodev_info dev_info;
4081 
4082 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4083 
4084 	uint64_t feat_flags = dev_info.feature_flags;
4085 
4086 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4087 		printf("Device doesn't support out-of-place scatter-gather "
4088 				"in both input and output mbufs. "
4089 				"Test Skipped.\n");
4090 		return -ENOTSUP;
4091 	}
4092 
4093 	/* Create SNOW 3G session */
4094 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4095 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4096 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4097 					tdata->key.data, tdata->key.len,
4098 					tdata->cipher_iv.len);
4099 	if (retval < 0)
4100 		return retval;
4101 
4102 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4103 	/* Append data which is padded to a multiple of */
4104 	/* the algorithms block size */
4105 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4106 
4107 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4108 			plaintext_pad_len, 10, 0);
4109 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4110 			plaintext_pad_len, 3, 0);
4111 
4112 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4113 			"Failed to allocate input buffer in mempool");
4114 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4115 			"Failed to allocate output buffer in mempool");
4116 
4117 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4118 
4119 	/* Create SNOW 3G operation */
4120 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4121 					tdata->cipher_iv.len,
4122 					tdata->validCipherLenInBits.len,
4123 					0);
4124 	if (retval < 0)
4125 		return retval;
4126 
4127 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4128 						ut_params->op);
4129 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4130 
4131 	ut_params->obuf = ut_params->op->sym->m_dst;
4132 	if (ut_params->obuf)
4133 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4134 				plaintext_len, buffer);
4135 	else
4136 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4137 				plaintext_len, buffer);
4138 
4139 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4140 
4141 	/* Validate obuf */
4142 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4143 		ciphertext,
4144 		tdata->ciphertext.data,
4145 		tdata->validDataLenInBits.len,
4146 		"SNOW 3G Ciphertext data not as expected");
4147 
4148 	return 0;
4149 }
4150 
4151 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4152 static void
4153 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4154 {
4155 	uint8_t curr_byte, prev_byte;
4156 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4157 	uint8_t lower_byte_mask = (1 << offset) - 1;
4158 	unsigned i;
4159 
4160 	prev_byte = buffer[0];
4161 	buffer[0] >>= offset;
4162 
4163 	for (i = 1; i < length_in_bytes; i++) {
4164 		curr_byte = buffer[i];
4165 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4166 				(curr_byte >> offset);
4167 		prev_byte = curr_byte;
4168 	}
4169 }
4170 
4171 static int
4172 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4173 {
4174 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4175 	struct crypto_unittest_params *ut_params = &unittest_params;
4176 	uint8_t *plaintext, *ciphertext;
4177 	int retval;
4178 	uint32_t plaintext_len;
4179 	uint32_t plaintext_pad_len;
4180 	uint8_t extra_offset = 4;
4181 	uint8_t *expected_ciphertext_shifted;
4182 
4183 	/* Create SNOW 3G session */
4184 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4185 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4186 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4187 					tdata->key.data, tdata->key.len,
4188 					tdata->cipher_iv.len);
4189 	if (retval < 0)
4190 		return retval;
4191 
4192 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4193 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4194 
4195 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4196 			"Failed to allocate input buffer in mempool");
4197 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4198 			"Failed to allocate output buffer in mempool");
4199 
4200 	/* Clear mbuf payload */
4201 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4202 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4203 
4204 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4205 	/*
4206 	 * Append data which is padded to a
4207 	 * multiple of the algorithms block size
4208 	 */
4209 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4210 
4211 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4212 						plaintext_pad_len);
4213 
4214 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4215 
4216 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4217 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4218 
4219 #ifdef RTE_APP_TEST_DEBUG
4220 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4221 #endif
4222 	/* Create SNOW 3G operation */
4223 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4224 					tdata->cipher_iv.len,
4225 					tdata->validCipherLenInBits.len,
4226 					extra_offset);
4227 	if (retval < 0)
4228 		return retval;
4229 
4230 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4231 						ut_params->op);
4232 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4233 
4234 	ut_params->obuf = ut_params->op->sym->m_dst;
4235 	if (ut_params->obuf)
4236 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4237 	else
4238 		ciphertext = plaintext;
4239 
4240 #ifdef RTE_APP_TEST_DEBUG
4241 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4242 #endif
4243 
4244 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4245 
4246 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4247 			"failed to reserve memory for ciphertext shifted\n");
4248 
4249 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4250 			ceil_byte_length(tdata->ciphertext.len));
4251 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4252 			extra_offset);
4253 	/* Validate obuf */
4254 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4255 		ciphertext,
4256 		expected_ciphertext_shifted,
4257 		tdata->validDataLenInBits.len,
4258 		extra_offset,
4259 		"SNOW 3G Ciphertext data not as expected");
4260 	return 0;
4261 }
4262 
4263 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4264 {
4265 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4266 	struct crypto_unittest_params *ut_params = &unittest_params;
4267 
4268 	int retval;
4269 
4270 	uint8_t *plaintext, *ciphertext;
4271 	unsigned ciphertext_pad_len;
4272 	unsigned ciphertext_len;
4273 
4274 	/* Create SNOW 3G session */
4275 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4276 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4277 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4278 					tdata->key.data, tdata->key.len,
4279 					tdata->cipher_iv.len);
4280 	if (retval < 0)
4281 		return retval;
4282 
4283 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4284 
4285 	/* Clear mbuf payload */
4286 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4287 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4288 
4289 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4290 	/* Append data which is padded to a multiple of */
4291 	/* the algorithms block size */
4292 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4293 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4294 				ciphertext_pad_len);
4295 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4296 
4297 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4298 
4299 	/* Create SNOW 3G operation */
4300 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4301 					tdata->cipher_iv.len,
4302 					tdata->validCipherLenInBits.len,
4303 					tdata->cipher.offset_bits);
4304 	if (retval < 0)
4305 		return retval;
4306 
4307 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4308 						ut_params->op);
4309 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4310 	ut_params->obuf = ut_params->op->sym->m_dst;
4311 	if (ut_params->obuf)
4312 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4313 	else
4314 		plaintext = ciphertext;
4315 
4316 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4317 
4318 	/* Validate obuf */
4319 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4320 				tdata->plaintext.data,
4321 				tdata->validDataLenInBits.len,
4322 				"SNOW 3G Plaintext data not as expected");
4323 	return 0;
4324 }
4325 
4326 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4327 {
4328 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4329 	struct crypto_unittest_params *ut_params = &unittest_params;
4330 
4331 	int retval;
4332 
4333 	uint8_t *plaintext, *ciphertext;
4334 	unsigned ciphertext_pad_len;
4335 	unsigned ciphertext_len;
4336 
4337 	/* Create SNOW 3G session */
4338 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4339 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4340 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4341 					tdata->key.data, tdata->key.len,
4342 					tdata->cipher_iv.len);
4343 	if (retval < 0)
4344 		return retval;
4345 
4346 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4347 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4348 
4349 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4350 			"Failed to allocate input buffer");
4351 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4352 			"Failed to allocate output buffer");
4353 
4354 	/* Clear mbuf payload */
4355 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4356 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4357 
4358 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4359 		       rte_pktmbuf_tailroom(ut_params->obuf));
4360 
4361 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4362 	/* Append data which is padded to a multiple of */
4363 	/* the algorithms block size */
4364 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4365 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4366 				ciphertext_pad_len);
4367 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4368 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4369 
4370 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4371 
4372 	/* Create SNOW 3G operation */
4373 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4374 					tdata->cipher_iv.len,
4375 					tdata->validCipherLenInBits.len,
4376 					0);
4377 	if (retval < 0)
4378 		return retval;
4379 
4380 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4381 						ut_params->op);
4382 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4383 	ut_params->obuf = ut_params->op->sym->m_dst;
4384 	if (ut_params->obuf)
4385 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4386 	else
4387 		plaintext = ciphertext;
4388 
4389 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4390 
4391 	/* Validate obuf */
4392 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4393 				tdata->plaintext.data,
4394 				tdata->validDataLenInBits.len,
4395 				"SNOW 3G Plaintext data not as expected");
4396 	return 0;
4397 }
4398 
4399 static int
4400 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4401 {
4402 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4403 	struct crypto_unittest_params *ut_params = &unittest_params;
4404 
4405 	int retval;
4406 
4407 	uint8_t *plaintext, *ciphertext;
4408 	unsigned int plaintext_pad_len;
4409 	unsigned int plaintext_len;
4410 
4411 	struct rte_cryptodev_sym_capability_idx cap_idx;
4412 
4413 	/* Check if device supports ZUC EEA3 */
4414 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4415 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4416 
4417 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4418 			&cap_idx) == NULL)
4419 		return -ENOTSUP;
4420 
4421 	/* Check if device supports ZUC EIA3 */
4422 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4423 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4424 
4425 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4426 			&cap_idx) == NULL)
4427 		return -ENOTSUP;
4428 
4429 	/* Create ZUC session */
4430 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4431 			ts_params->valid_devs[0],
4432 			tdata);
4433 	if (retval < 0)
4434 		return retval;
4435 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4436 
4437 	/* clear mbuf payload */
4438 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4439 			rte_pktmbuf_tailroom(ut_params->ibuf));
4440 
4441 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4442 	/* Append data which is padded to a multiple of */
4443 	/* the algorithms block size */
4444 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4445 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4446 				plaintext_pad_len);
4447 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4448 
4449 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4450 
4451 	/* Create ZUC operation */
4452 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4453 	if (retval < 0)
4454 		return retval;
4455 
4456 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4457 			ut_params->op);
4458 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4459 	ut_params->obuf = ut_params->op->sym->m_src;
4460 	if (ut_params->obuf)
4461 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4462 	else
4463 		ciphertext = plaintext;
4464 
4465 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4466 	/* Validate obuf */
4467 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4468 			ciphertext,
4469 			tdata->ciphertext.data,
4470 			tdata->validDataLenInBits.len,
4471 			"ZUC Ciphertext data not as expected");
4472 
4473 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4474 	    + plaintext_pad_len;
4475 
4476 	/* Validate obuf */
4477 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4478 			ut_params->digest,
4479 			tdata->digest.data,
4480 			4,
4481 			"ZUC Generated auth tag not as expected");
4482 	return 0;
4483 }
4484 
4485 static int
4486 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4487 {
4488 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4489 	struct crypto_unittest_params *ut_params = &unittest_params;
4490 
4491 	int retval;
4492 
4493 	uint8_t *plaintext, *ciphertext;
4494 	unsigned plaintext_pad_len;
4495 	unsigned plaintext_len;
4496 
4497 	/* Create SNOW 3G session */
4498 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4499 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4500 			RTE_CRYPTO_AUTH_OP_GENERATE,
4501 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4502 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4503 			tdata->key.data, tdata->key.len,
4504 			tdata->auth_iv.len, tdata->digest.len,
4505 			tdata->cipher_iv.len);
4506 	if (retval < 0)
4507 		return retval;
4508 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4509 
4510 	/* clear mbuf payload */
4511 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4512 			rte_pktmbuf_tailroom(ut_params->ibuf));
4513 
4514 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4515 	/* Append data which is padded to a multiple of */
4516 	/* the algorithms block size */
4517 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4518 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4519 				plaintext_pad_len);
4520 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4521 
4522 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4523 
4524 	/* Create SNOW 3G operation */
4525 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4526 			tdata->digest.len, tdata->auth_iv.data,
4527 			tdata->auth_iv.len,
4528 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4529 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4530 			tdata->validCipherLenInBits.len,
4531 			0,
4532 			tdata->validAuthLenInBits.len,
4533 			0
4534 			);
4535 	if (retval < 0)
4536 		return retval;
4537 
4538 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4539 			ut_params->op);
4540 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4541 	ut_params->obuf = ut_params->op->sym->m_src;
4542 	if (ut_params->obuf)
4543 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4544 	else
4545 		ciphertext = plaintext;
4546 
4547 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4548 	/* Validate obuf */
4549 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4550 			ciphertext,
4551 			tdata->ciphertext.data,
4552 			tdata->validDataLenInBits.len,
4553 			"SNOW 3G Ciphertext data not as expected");
4554 
4555 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4556 	    + plaintext_pad_len;
4557 
4558 	/* Validate obuf */
4559 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4560 			ut_params->digest,
4561 			tdata->digest.data,
4562 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4563 			"SNOW 3G Generated auth tag not as expected");
4564 	return 0;
4565 }
4566 
4567 static int
4568 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4569 	uint8_t op_mode, uint8_t verify)
4570 {
4571 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4572 	struct crypto_unittest_params *ut_params = &unittest_params;
4573 
4574 	int retval;
4575 
4576 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4577 	unsigned int plaintext_pad_len;
4578 	unsigned int plaintext_len;
4579 	unsigned int ciphertext_pad_len;
4580 	unsigned int ciphertext_len;
4581 
4582 	struct rte_cryptodev_info dev_info;
4583 
4584 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4585 
4586 	uint64_t feat_flags = dev_info.feature_flags;
4587 
4588 	if (op_mode == OUT_OF_PLACE) {
4589 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4590 			printf("Device doesn't support digest encrypted.\n");
4591 			return -ENOTSUP;
4592 		}
4593 	}
4594 
4595 	/* Create SNOW 3G session */
4596 	retval = create_wireless_algo_auth_cipher_session(
4597 			ts_params->valid_devs[0],
4598 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4599 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4600 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4601 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4602 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4603 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4604 			tdata->key.data, tdata->key.len,
4605 			tdata->auth_iv.len, tdata->digest.len,
4606 			tdata->cipher_iv.len);
4607 
4608 	if (retval < 0)
4609 		return retval;
4610 
4611 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4612 	if (op_mode == OUT_OF_PLACE)
4613 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4614 
4615 	/* clear mbuf payload */
4616 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4617 		rte_pktmbuf_tailroom(ut_params->ibuf));
4618 	if (op_mode == OUT_OF_PLACE)
4619 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4620 			rte_pktmbuf_tailroom(ut_params->obuf));
4621 
4622 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4623 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4624 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4625 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4626 
4627 	if (verify) {
4628 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4629 					ciphertext_pad_len);
4630 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4631 		if (op_mode == OUT_OF_PLACE)
4632 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4633 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4634 			ciphertext_len);
4635 	} else {
4636 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4637 					plaintext_pad_len);
4638 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4639 		if (op_mode == OUT_OF_PLACE)
4640 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4641 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4642 	}
4643 
4644 	/* Create SNOW 3G operation */
4645 	retval = create_wireless_algo_auth_cipher_operation(
4646 		tdata->digest.len,
4647 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4648 		tdata->auth_iv.data, tdata->auth_iv.len,
4649 		(tdata->digest.offset_bytes == 0 ?
4650 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4651 			: tdata->digest.offset_bytes),
4652 		tdata->validCipherLenInBits.len,
4653 		tdata->cipher.offset_bits,
4654 		tdata->validAuthLenInBits.len,
4655 		tdata->auth.offset_bits,
4656 		op_mode, 0);
4657 
4658 	if (retval < 0)
4659 		return retval;
4660 
4661 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4662 			ut_params->op);
4663 
4664 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4665 
4666 	ut_params->obuf = (op_mode == IN_PLACE ?
4667 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4668 
4669 	if (verify) {
4670 		if (ut_params->obuf)
4671 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4672 							uint8_t *);
4673 		else
4674 			plaintext = ciphertext +
4675 				(tdata->cipher.offset_bits >> 3);
4676 
4677 		debug_hexdump(stdout, "plaintext:", plaintext,
4678 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4679 		debug_hexdump(stdout, "plaintext expected:",
4680 			tdata->plaintext.data,
4681 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4682 	} else {
4683 		if (ut_params->obuf)
4684 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4685 							uint8_t *);
4686 		else
4687 			ciphertext = plaintext;
4688 
4689 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4690 			ciphertext_len);
4691 		debug_hexdump(stdout, "ciphertext expected:",
4692 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4693 
4694 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4695 			+ (tdata->digest.offset_bytes == 0 ?
4696 		plaintext_pad_len : tdata->digest.offset_bytes);
4697 
4698 		debug_hexdump(stdout, "digest:", ut_params->digest,
4699 			tdata->digest.len);
4700 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4701 				tdata->digest.len);
4702 	}
4703 
4704 	/* Validate obuf */
4705 	if (verify) {
4706 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4707 			plaintext,
4708 			tdata->plaintext.data,
4709 			tdata->plaintext.len >> 3,
4710 			"SNOW 3G Plaintext data not as expected");
4711 	} else {
4712 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4713 			ciphertext,
4714 			tdata->ciphertext.data,
4715 			tdata->validDataLenInBits.len,
4716 			"SNOW 3G Ciphertext data not as expected");
4717 
4718 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4719 			ut_params->digest,
4720 			tdata->digest.data,
4721 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4722 			"SNOW 3G Generated auth tag not as expected");
4723 	}
4724 	return 0;
4725 }
4726 
4727 static int
4728 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4729 	uint8_t op_mode, uint8_t verify)
4730 {
4731 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4732 	struct crypto_unittest_params *ut_params = &unittest_params;
4733 
4734 	int retval;
4735 
4736 	const uint8_t *plaintext = NULL;
4737 	const uint8_t *ciphertext = NULL;
4738 	const uint8_t *digest = NULL;
4739 	unsigned int plaintext_pad_len;
4740 	unsigned int plaintext_len;
4741 	unsigned int ciphertext_pad_len;
4742 	unsigned int ciphertext_len;
4743 	uint8_t buffer[10000];
4744 	uint8_t digest_buffer[10000];
4745 
4746 	struct rte_cryptodev_info dev_info;
4747 
4748 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4749 
4750 	uint64_t feat_flags = dev_info.feature_flags;
4751 
4752 	if (op_mode == IN_PLACE) {
4753 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4754 			printf("Device doesn't support in-place scatter-gather "
4755 					"in both input and output mbufs.\n");
4756 			return -ENOTSUP;
4757 		}
4758 	} else {
4759 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4760 			printf("Device doesn't support out-of-place scatter-gather "
4761 					"in both input and output mbufs.\n");
4762 			return -ENOTSUP;
4763 		}
4764 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4765 			printf("Device doesn't support digest encrypted.\n");
4766 			return -ENOTSUP;
4767 		}
4768 	}
4769 
4770 	/* Create SNOW 3G session */
4771 	retval = create_wireless_algo_auth_cipher_session(
4772 			ts_params->valid_devs[0],
4773 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4774 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4775 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4776 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4777 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4778 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4779 			tdata->key.data, tdata->key.len,
4780 			tdata->auth_iv.len, tdata->digest.len,
4781 			tdata->cipher_iv.len);
4782 
4783 	if (retval < 0)
4784 		return retval;
4785 
4786 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4787 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4788 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4789 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4790 
4791 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4792 			plaintext_pad_len, 15, 0);
4793 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4794 			"Failed to allocate input buffer in mempool");
4795 
4796 	if (op_mode == OUT_OF_PLACE) {
4797 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4798 				plaintext_pad_len, 15, 0);
4799 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
4800 				"Failed to allocate output buffer in mempool");
4801 	}
4802 
4803 	if (verify) {
4804 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4805 			tdata->ciphertext.data);
4806 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4807 					ciphertext_len, buffer);
4808 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4809 			ciphertext_len);
4810 	} else {
4811 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4812 			tdata->plaintext.data);
4813 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4814 					plaintext_len, buffer);
4815 		debug_hexdump(stdout, "plaintext:", plaintext,
4816 			plaintext_len);
4817 	}
4818 	memset(buffer, 0, sizeof(buffer));
4819 
4820 	/* Create SNOW 3G operation */
4821 	retval = create_wireless_algo_auth_cipher_operation(
4822 		tdata->digest.len,
4823 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4824 		tdata->auth_iv.data, tdata->auth_iv.len,
4825 		(tdata->digest.offset_bytes == 0 ?
4826 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4827 			: tdata->digest.offset_bytes),
4828 		tdata->validCipherLenInBits.len,
4829 		tdata->cipher.offset_bits,
4830 		tdata->validAuthLenInBits.len,
4831 		tdata->auth.offset_bits,
4832 		op_mode, 1);
4833 
4834 	if (retval < 0)
4835 		return retval;
4836 
4837 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4838 			ut_params->op);
4839 
4840 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4841 
4842 	ut_params->obuf = (op_mode == IN_PLACE ?
4843 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4844 
4845 	if (verify) {
4846 		if (ut_params->obuf)
4847 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4848 					plaintext_len, buffer);
4849 		else
4850 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4851 					plaintext_len, buffer);
4852 
4853 		debug_hexdump(stdout, "plaintext:", plaintext,
4854 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4855 		debug_hexdump(stdout, "plaintext expected:",
4856 			tdata->plaintext.data,
4857 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4858 	} else {
4859 		if (ut_params->obuf)
4860 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4861 					ciphertext_len, buffer);
4862 		else
4863 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4864 					ciphertext_len, buffer);
4865 
4866 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4867 			ciphertext_len);
4868 		debug_hexdump(stdout, "ciphertext expected:",
4869 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4870 
4871 		if (ut_params->obuf)
4872 			digest = rte_pktmbuf_read(ut_params->obuf,
4873 				(tdata->digest.offset_bytes == 0 ?
4874 				plaintext_pad_len : tdata->digest.offset_bytes),
4875 				tdata->digest.len, digest_buffer);
4876 		else
4877 			digest = rte_pktmbuf_read(ut_params->ibuf,
4878 				(tdata->digest.offset_bytes == 0 ?
4879 				plaintext_pad_len : tdata->digest.offset_bytes),
4880 				tdata->digest.len, digest_buffer);
4881 
4882 		debug_hexdump(stdout, "digest:", digest,
4883 			tdata->digest.len);
4884 		debug_hexdump(stdout, "digest expected:",
4885 			tdata->digest.data, tdata->digest.len);
4886 	}
4887 
4888 	/* Validate obuf */
4889 	if (verify) {
4890 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4891 			plaintext,
4892 			tdata->plaintext.data,
4893 			tdata->plaintext.len >> 3,
4894 			"SNOW 3G Plaintext data not as expected");
4895 	} else {
4896 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4897 			ciphertext,
4898 			tdata->ciphertext.data,
4899 			tdata->validDataLenInBits.len,
4900 			"SNOW 3G Ciphertext data not as expected");
4901 
4902 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4903 			digest,
4904 			tdata->digest.data,
4905 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4906 			"SNOW 3G Generated auth tag not as expected");
4907 	}
4908 	return 0;
4909 }
4910 
4911 static int
4912 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4913 	uint8_t op_mode, uint8_t verify)
4914 {
4915 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4916 	struct crypto_unittest_params *ut_params = &unittest_params;
4917 
4918 	int retval;
4919 
4920 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4921 	unsigned int plaintext_pad_len;
4922 	unsigned int plaintext_len;
4923 	unsigned int ciphertext_pad_len;
4924 	unsigned int ciphertext_len;
4925 
4926 	struct rte_cryptodev_info dev_info;
4927 
4928 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4929 
4930 	uint64_t feat_flags = dev_info.feature_flags;
4931 
4932 	if (op_mode == OUT_OF_PLACE) {
4933 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4934 			printf("Device doesn't support digest encrypted.\n");
4935 			return -ENOTSUP;
4936 		}
4937 	}
4938 
4939 	/* Create KASUMI session */
4940 	retval = create_wireless_algo_auth_cipher_session(
4941 			ts_params->valid_devs[0],
4942 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4943 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4944 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4945 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4946 			RTE_CRYPTO_AUTH_KASUMI_F9,
4947 			RTE_CRYPTO_CIPHER_KASUMI_F8,
4948 			tdata->key.data, tdata->key.len,
4949 			0, tdata->digest.len,
4950 			tdata->cipher_iv.len);
4951 
4952 	if (retval < 0)
4953 		return retval;
4954 
4955 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4956 	if (op_mode == OUT_OF_PLACE)
4957 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4958 
4959 	/* clear mbuf payload */
4960 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4961 		rte_pktmbuf_tailroom(ut_params->ibuf));
4962 	if (op_mode == OUT_OF_PLACE)
4963 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4964 			rte_pktmbuf_tailroom(ut_params->obuf));
4965 
4966 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4967 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4968 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4969 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4970 
4971 	if (verify) {
4972 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4973 					ciphertext_pad_len);
4974 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4975 		if (op_mode == OUT_OF_PLACE)
4976 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4977 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4978 			ciphertext_len);
4979 	} else {
4980 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4981 					plaintext_pad_len);
4982 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4983 		if (op_mode == OUT_OF_PLACE)
4984 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4985 		debug_hexdump(stdout, "plaintext:", plaintext,
4986 			plaintext_len);
4987 	}
4988 
4989 	/* Create KASUMI operation */
4990 	retval = create_wireless_algo_auth_cipher_operation(
4991 		tdata->digest.len,
4992 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4993 		NULL, 0,
4994 		(tdata->digest.offset_bytes == 0 ?
4995 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4996 			: tdata->digest.offset_bytes),
4997 		tdata->validCipherLenInBits.len,
4998 		tdata->validCipherOffsetInBits.len,
4999 		tdata->validAuthLenInBits.len,
5000 		0,
5001 		op_mode, 0);
5002 
5003 	if (retval < 0)
5004 		return retval;
5005 
5006 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5007 			ut_params->op);
5008 
5009 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5010 
5011 	ut_params->obuf = (op_mode == IN_PLACE ?
5012 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5013 
5014 
5015 	if (verify) {
5016 		if (ut_params->obuf)
5017 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5018 							uint8_t *);
5019 		else
5020 			plaintext = ciphertext;
5021 
5022 		debug_hexdump(stdout, "plaintext:", plaintext,
5023 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5024 		debug_hexdump(stdout, "plaintext expected:",
5025 			tdata->plaintext.data,
5026 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5027 	} else {
5028 		if (ut_params->obuf)
5029 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5030 							uint8_t *);
5031 		else
5032 			ciphertext = plaintext;
5033 
5034 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5035 			ciphertext_len);
5036 		debug_hexdump(stdout, "ciphertext expected:",
5037 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5038 
5039 		ut_params->digest = rte_pktmbuf_mtod(
5040 			ut_params->obuf, uint8_t *) +
5041 			(tdata->digest.offset_bytes == 0 ?
5042 			plaintext_pad_len : tdata->digest.offset_bytes);
5043 
5044 		debug_hexdump(stdout, "digest:", ut_params->digest,
5045 			tdata->digest.len);
5046 		debug_hexdump(stdout, "digest expected:",
5047 			tdata->digest.data, tdata->digest.len);
5048 	}
5049 
5050 	/* Validate obuf */
5051 	if (verify) {
5052 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5053 			plaintext,
5054 			tdata->plaintext.data,
5055 			tdata->plaintext.len >> 3,
5056 			"KASUMI Plaintext data not as expected");
5057 	} else {
5058 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5059 			ciphertext,
5060 			tdata->ciphertext.data,
5061 			tdata->ciphertext.len >> 3,
5062 			"KASUMI Ciphertext data not as expected");
5063 
5064 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5065 			ut_params->digest,
5066 			tdata->digest.data,
5067 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5068 			"KASUMI Generated auth tag not as expected");
5069 	}
5070 	return 0;
5071 }
5072 
5073 static int
5074 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5075 	uint8_t op_mode, uint8_t verify)
5076 {
5077 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5078 	struct crypto_unittest_params *ut_params = &unittest_params;
5079 
5080 	int retval;
5081 
5082 	const uint8_t *plaintext = NULL;
5083 	const uint8_t *ciphertext = NULL;
5084 	const uint8_t *digest = NULL;
5085 	unsigned int plaintext_pad_len;
5086 	unsigned int plaintext_len;
5087 	unsigned int ciphertext_pad_len;
5088 	unsigned int ciphertext_len;
5089 	uint8_t buffer[10000];
5090 	uint8_t digest_buffer[10000];
5091 
5092 	struct rte_cryptodev_info dev_info;
5093 
5094 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5095 
5096 	uint64_t feat_flags = dev_info.feature_flags;
5097 
5098 	if (op_mode == IN_PLACE) {
5099 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5100 			printf("Device doesn't support in-place scatter-gather "
5101 					"in both input and output mbufs.\n");
5102 			return -ENOTSUP;
5103 		}
5104 	} else {
5105 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5106 			printf("Device doesn't support out-of-place scatter-gather "
5107 					"in both input and output mbufs.\n");
5108 			return -ENOTSUP;
5109 		}
5110 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5111 			printf("Device doesn't support digest encrypted.\n");
5112 			return -ENOTSUP;
5113 		}
5114 	}
5115 
5116 	/* Create KASUMI session */
5117 	retval = create_wireless_algo_auth_cipher_session(
5118 			ts_params->valid_devs[0],
5119 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5120 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5121 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5122 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5123 			RTE_CRYPTO_AUTH_KASUMI_F9,
5124 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5125 			tdata->key.data, tdata->key.len,
5126 			0, tdata->digest.len,
5127 			tdata->cipher_iv.len);
5128 
5129 	if (retval < 0)
5130 		return retval;
5131 
5132 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5133 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5134 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5135 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5136 
5137 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5138 			plaintext_pad_len, 15, 0);
5139 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5140 			"Failed to allocate input buffer in mempool");
5141 
5142 	if (op_mode == OUT_OF_PLACE) {
5143 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5144 				plaintext_pad_len, 15, 0);
5145 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5146 				"Failed to allocate output buffer in mempool");
5147 	}
5148 
5149 	if (verify) {
5150 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5151 			tdata->ciphertext.data);
5152 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5153 					ciphertext_len, buffer);
5154 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5155 			ciphertext_len);
5156 	} else {
5157 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5158 			tdata->plaintext.data);
5159 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5160 					plaintext_len, buffer);
5161 		debug_hexdump(stdout, "plaintext:", plaintext,
5162 			plaintext_len);
5163 	}
5164 	memset(buffer, 0, sizeof(buffer));
5165 
5166 	/* Create KASUMI operation */
5167 	retval = create_wireless_algo_auth_cipher_operation(
5168 		tdata->digest.len,
5169 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5170 		NULL, 0,
5171 		(tdata->digest.offset_bytes == 0 ?
5172 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5173 			: tdata->digest.offset_bytes),
5174 		tdata->validCipherLenInBits.len,
5175 		tdata->validCipherOffsetInBits.len,
5176 		tdata->validAuthLenInBits.len,
5177 		0,
5178 		op_mode, 1);
5179 
5180 	if (retval < 0)
5181 		return retval;
5182 
5183 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5184 			ut_params->op);
5185 
5186 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5187 
5188 	ut_params->obuf = (op_mode == IN_PLACE ?
5189 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5190 
5191 	if (verify) {
5192 		if (ut_params->obuf)
5193 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5194 					plaintext_len, buffer);
5195 		else
5196 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5197 					plaintext_len, buffer);
5198 
5199 		debug_hexdump(stdout, "plaintext:", plaintext,
5200 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5201 		debug_hexdump(stdout, "plaintext expected:",
5202 			tdata->plaintext.data,
5203 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5204 	} else {
5205 		if (ut_params->obuf)
5206 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5207 					ciphertext_len, buffer);
5208 		else
5209 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5210 					ciphertext_len, buffer);
5211 
5212 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5213 			ciphertext_len);
5214 		debug_hexdump(stdout, "ciphertext expected:",
5215 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5216 
5217 		if (ut_params->obuf)
5218 			digest = rte_pktmbuf_read(ut_params->obuf,
5219 				(tdata->digest.offset_bytes == 0 ?
5220 				plaintext_pad_len : tdata->digest.offset_bytes),
5221 				tdata->digest.len, digest_buffer);
5222 		else
5223 			digest = rte_pktmbuf_read(ut_params->ibuf,
5224 				(tdata->digest.offset_bytes == 0 ?
5225 				plaintext_pad_len : tdata->digest.offset_bytes),
5226 				tdata->digest.len, digest_buffer);
5227 
5228 		debug_hexdump(stdout, "digest:", digest,
5229 			tdata->digest.len);
5230 		debug_hexdump(stdout, "digest expected:",
5231 			tdata->digest.data, tdata->digest.len);
5232 	}
5233 
5234 	/* Validate obuf */
5235 	if (verify) {
5236 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5237 			plaintext,
5238 			tdata->plaintext.data,
5239 			tdata->plaintext.len >> 3,
5240 			"KASUMI Plaintext data not as expected");
5241 	} else {
5242 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5243 			ciphertext,
5244 			tdata->ciphertext.data,
5245 			tdata->validDataLenInBits.len,
5246 			"KASUMI Ciphertext data not as expected");
5247 
5248 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5249 			digest,
5250 			tdata->digest.data,
5251 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5252 			"KASUMI Generated auth tag not as expected");
5253 	}
5254 	return 0;
5255 }
5256 
5257 static int
5258 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5259 {
5260 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5261 	struct crypto_unittest_params *ut_params = &unittest_params;
5262 
5263 	int retval;
5264 
5265 	uint8_t *plaintext, *ciphertext;
5266 	unsigned plaintext_pad_len;
5267 	unsigned plaintext_len;
5268 
5269 	/* Create KASUMI session */
5270 	retval = create_wireless_algo_cipher_auth_session(
5271 			ts_params->valid_devs[0],
5272 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5273 			RTE_CRYPTO_AUTH_OP_GENERATE,
5274 			RTE_CRYPTO_AUTH_KASUMI_F9,
5275 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5276 			tdata->key.data, tdata->key.len,
5277 			0, tdata->digest.len,
5278 			tdata->cipher_iv.len);
5279 	if (retval < 0)
5280 		return retval;
5281 
5282 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5283 
5284 	/* clear mbuf payload */
5285 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5286 			rte_pktmbuf_tailroom(ut_params->ibuf));
5287 
5288 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5289 	/* Append data which is padded to a multiple of */
5290 	/* the algorithms block size */
5291 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5292 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5293 				plaintext_pad_len);
5294 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5295 
5296 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5297 
5298 	/* Create KASUMI operation */
5299 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5300 				tdata->digest.len, NULL, 0,
5301 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5302 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5303 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5304 				tdata->validCipherOffsetInBits.len,
5305 				tdata->validAuthLenInBits.len,
5306 				0
5307 				);
5308 	if (retval < 0)
5309 		return retval;
5310 
5311 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5312 			ut_params->op);
5313 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5314 
5315 	if (ut_params->op->sym->m_dst)
5316 		ut_params->obuf = ut_params->op->sym->m_dst;
5317 	else
5318 		ut_params->obuf = ut_params->op->sym->m_src;
5319 
5320 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5321 				tdata->validCipherOffsetInBits.len >> 3);
5322 
5323 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5324 			+ plaintext_pad_len;
5325 
5326 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5327 				(tdata->validCipherOffsetInBits.len >> 3);
5328 	/* Validate obuf */
5329 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5330 		ciphertext,
5331 		reference_ciphertext,
5332 		tdata->validCipherLenInBits.len,
5333 		"KASUMI Ciphertext data not as expected");
5334 
5335 	/* Validate obuf */
5336 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5337 		ut_params->digest,
5338 		tdata->digest.data,
5339 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5340 		"KASUMI Generated auth tag not as expected");
5341 	return 0;
5342 }
5343 
5344 static int
5345 test_zuc_encryption(const struct wireless_test_data *tdata)
5346 {
5347 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5348 	struct crypto_unittest_params *ut_params = &unittest_params;
5349 
5350 	int retval;
5351 	uint8_t *plaintext, *ciphertext;
5352 	unsigned plaintext_pad_len;
5353 	unsigned plaintext_len;
5354 
5355 	struct rte_cryptodev_sym_capability_idx cap_idx;
5356 
5357 	/* Check if device supports ZUC EEA3 */
5358 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5359 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5360 
5361 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5362 			&cap_idx) == NULL)
5363 		return -ENOTSUP;
5364 
5365 	/* Create ZUC session */
5366 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5367 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5368 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5369 					tdata->key.data, tdata->key.len,
5370 					tdata->cipher_iv.len);
5371 	if (retval < 0)
5372 		return retval;
5373 
5374 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5375 
5376 	/* Clear mbuf payload */
5377 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5378 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5379 
5380 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5381 	/* Append data which is padded to a multiple */
5382 	/* of the algorithms block size */
5383 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5384 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5385 				plaintext_pad_len);
5386 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5387 
5388 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5389 
5390 	/* Create ZUC operation */
5391 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5392 					tdata->cipher_iv.len,
5393 					tdata->plaintext.len,
5394 					0);
5395 	if (retval < 0)
5396 		return retval;
5397 
5398 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5399 						ut_params->op);
5400 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5401 
5402 	ut_params->obuf = ut_params->op->sym->m_dst;
5403 	if (ut_params->obuf)
5404 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5405 	else
5406 		ciphertext = plaintext;
5407 
5408 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5409 
5410 	/* Validate obuf */
5411 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5412 		ciphertext,
5413 		tdata->ciphertext.data,
5414 		tdata->validCipherLenInBits.len,
5415 		"ZUC Ciphertext data not as expected");
5416 	return 0;
5417 }
5418 
5419 static int
5420 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5421 {
5422 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5423 	struct crypto_unittest_params *ut_params = &unittest_params;
5424 
5425 	int retval;
5426 
5427 	unsigned int plaintext_pad_len;
5428 	unsigned int plaintext_len;
5429 	const uint8_t *ciphertext;
5430 	uint8_t ciphertext_buffer[2048];
5431 	struct rte_cryptodev_info dev_info;
5432 
5433 	struct rte_cryptodev_sym_capability_idx cap_idx;
5434 
5435 	/* Check if device supports ZUC EEA3 */
5436 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5437 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5438 
5439 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5440 			&cap_idx) == NULL)
5441 		return -ENOTSUP;
5442 
5443 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5444 
5445 	uint64_t feat_flags = dev_info.feature_flags;
5446 
5447 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5448 		printf("Device doesn't support in-place scatter-gather. "
5449 				"Test Skipped.\n");
5450 		return -ENOTSUP;
5451 	}
5452 
5453 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5454 
5455 	/* Append data which is padded to a multiple */
5456 	/* of the algorithms block size */
5457 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5458 
5459 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5460 			plaintext_pad_len, 10, 0);
5461 
5462 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5463 			tdata->plaintext.data);
5464 
5465 	/* Create ZUC session */
5466 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5467 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5468 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5469 			tdata->key.data, tdata->key.len,
5470 			tdata->cipher_iv.len);
5471 	if (retval < 0)
5472 		return retval;
5473 
5474 	/* Clear mbuf payload */
5475 
5476 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5477 
5478 	/* Create ZUC operation */
5479 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5480 			tdata->cipher_iv.len, tdata->plaintext.len,
5481 			0);
5482 	if (retval < 0)
5483 		return retval;
5484 
5485 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5486 						ut_params->op);
5487 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5488 
5489 	ut_params->obuf = ut_params->op->sym->m_dst;
5490 	if (ut_params->obuf)
5491 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
5492 			0, plaintext_len, ciphertext_buffer);
5493 	else
5494 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5495 			0, plaintext_len, ciphertext_buffer);
5496 
5497 	/* Validate obuf */
5498 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5499 
5500 	/* Validate obuf */
5501 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5502 		ciphertext,
5503 		tdata->ciphertext.data,
5504 		tdata->validCipherLenInBits.len,
5505 		"ZUC Ciphertext data not as expected");
5506 
5507 	return 0;
5508 }
5509 
5510 static int
5511 test_zuc_authentication(const struct wireless_test_data *tdata)
5512 {
5513 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5514 	struct crypto_unittest_params *ut_params = &unittest_params;
5515 
5516 	int retval;
5517 	unsigned plaintext_pad_len;
5518 	unsigned plaintext_len;
5519 	uint8_t *plaintext;
5520 
5521 	struct rte_cryptodev_sym_capability_idx cap_idx;
5522 
5523 	/* Check if device supports ZUC EIA3 */
5524 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5525 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5526 
5527 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5528 			&cap_idx) == NULL)
5529 		return -ENOTSUP;
5530 
5531 	/* Create ZUC session */
5532 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5533 			tdata->key.data, tdata->key.len,
5534 			tdata->auth_iv.len, tdata->digest.len,
5535 			RTE_CRYPTO_AUTH_OP_GENERATE,
5536 			RTE_CRYPTO_AUTH_ZUC_EIA3);
5537 	if (retval < 0)
5538 		return retval;
5539 
5540 	/* alloc mbuf and set payload */
5541 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5542 
5543 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5544 	rte_pktmbuf_tailroom(ut_params->ibuf));
5545 
5546 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5547 	/* Append data which is padded to a multiple of */
5548 	/* the algorithms block size */
5549 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5550 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5551 				plaintext_pad_len);
5552 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5553 
5554 	/* Create ZUC operation */
5555 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5556 			tdata->auth_iv.data, tdata->auth_iv.len,
5557 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5558 			tdata->validAuthLenInBits.len,
5559 			0);
5560 	if (retval < 0)
5561 		return retval;
5562 
5563 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5564 				ut_params->op);
5565 	ut_params->obuf = ut_params->op->sym->m_src;
5566 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5567 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5568 			+ plaintext_pad_len;
5569 
5570 	/* Validate obuf */
5571 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5572 	ut_params->digest,
5573 	tdata->digest.data,
5574 	DIGEST_BYTE_LENGTH_KASUMI_F9,
5575 	"ZUC Generated auth tag not as expected");
5576 
5577 	return 0;
5578 }
5579 
5580 static int
5581 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5582 	uint8_t op_mode, uint8_t verify)
5583 {
5584 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5585 	struct crypto_unittest_params *ut_params = &unittest_params;
5586 
5587 	int retval;
5588 
5589 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5590 	unsigned int plaintext_pad_len;
5591 	unsigned int plaintext_len;
5592 	unsigned int ciphertext_pad_len;
5593 	unsigned int ciphertext_len;
5594 
5595 	struct rte_cryptodev_info dev_info;
5596 	struct rte_cryptodev_sym_capability_idx cap_idx;
5597 
5598 	/* Check if device supports ZUC EIA3 */
5599 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5600 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5601 
5602 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5603 			&cap_idx) == NULL)
5604 		return -ENOTSUP;
5605 
5606 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5607 
5608 	uint64_t feat_flags = dev_info.feature_flags;
5609 
5610 	if (op_mode == OUT_OF_PLACE) {
5611 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5612 			printf("Device doesn't support digest encrypted.\n");
5613 			return -ENOTSUP;
5614 		}
5615 	}
5616 
5617 	/* Create ZUC session */
5618 	retval = create_wireless_algo_auth_cipher_session(
5619 			ts_params->valid_devs[0],
5620 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5621 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5622 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5623 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5624 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5625 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5626 			tdata->key.data, tdata->key.len,
5627 			tdata->auth_iv.len, tdata->digest.len,
5628 			tdata->cipher_iv.len);
5629 
5630 	if (retval < 0)
5631 		return retval;
5632 
5633 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5634 	if (op_mode == OUT_OF_PLACE)
5635 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5636 
5637 	/* clear mbuf payload */
5638 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5639 		rte_pktmbuf_tailroom(ut_params->ibuf));
5640 	if (op_mode == OUT_OF_PLACE)
5641 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5642 			rte_pktmbuf_tailroom(ut_params->obuf));
5643 
5644 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5645 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5646 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5647 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5648 
5649 	if (verify) {
5650 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5651 					ciphertext_pad_len);
5652 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5653 		if (op_mode == OUT_OF_PLACE)
5654 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5655 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5656 			ciphertext_len);
5657 	} else {
5658 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5659 					plaintext_pad_len);
5660 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5661 		if (op_mode == OUT_OF_PLACE)
5662 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5663 		debug_hexdump(stdout, "plaintext:", plaintext,
5664 			plaintext_len);
5665 	}
5666 
5667 	/* Create ZUC operation */
5668 	retval = create_wireless_algo_auth_cipher_operation(
5669 		tdata->digest.len,
5670 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5671 		tdata->auth_iv.data, tdata->auth_iv.len,
5672 		(tdata->digest.offset_bytes == 0 ?
5673 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5674 			: tdata->digest.offset_bytes),
5675 		tdata->validCipherLenInBits.len,
5676 		tdata->validCipherOffsetInBits.len,
5677 		tdata->validAuthLenInBits.len,
5678 		0,
5679 		op_mode, 0);
5680 
5681 	if (retval < 0)
5682 		return retval;
5683 
5684 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5685 			ut_params->op);
5686 
5687 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5688 
5689 	ut_params->obuf = (op_mode == IN_PLACE ?
5690 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5691 
5692 
5693 	if (verify) {
5694 		if (ut_params->obuf)
5695 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5696 							uint8_t *);
5697 		else
5698 			plaintext = ciphertext;
5699 
5700 		debug_hexdump(stdout, "plaintext:", plaintext,
5701 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5702 		debug_hexdump(stdout, "plaintext expected:",
5703 			tdata->plaintext.data,
5704 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5705 	} else {
5706 		if (ut_params->obuf)
5707 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5708 							uint8_t *);
5709 		else
5710 			ciphertext = plaintext;
5711 
5712 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5713 			ciphertext_len);
5714 		debug_hexdump(stdout, "ciphertext expected:",
5715 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5716 
5717 		ut_params->digest = rte_pktmbuf_mtod(
5718 			ut_params->obuf, uint8_t *) +
5719 			(tdata->digest.offset_bytes == 0 ?
5720 			plaintext_pad_len : tdata->digest.offset_bytes);
5721 
5722 		debug_hexdump(stdout, "digest:", ut_params->digest,
5723 			tdata->digest.len);
5724 		debug_hexdump(stdout, "digest expected:",
5725 			tdata->digest.data, tdata->digest.len);
5726 	}
5727 
5728 	/* Validate obuf */
5729 	if (verify) {
5730 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5731 			plaintext,
5732 			tdata->plaintext.data,
5733 			tdata->plaintext.len >> 3,
5734 			"ZUC Plaintext data not as expected");
5735 	} else {
5736 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5737 			ciphertext,
5738 			tdata->ciphertext.data,
5739 			tdata->ciphertext.len >> 3,
5740 			"ZUC Ciphertext data not as expected");
5741 
5742 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5743 			ut_params->digest,
5744 			tdata->digest.data,
5745 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5746 			"ZUC Generated auth tag not as expected");
5747 	}
5748 	return 0;
5749 }
5750 
5751 static int
5752 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5753 	uint8_t op_mode, uint8_t verify)
5754 {
5755 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5756 	struct crypto_unittest_params *ut_params = &unittest_params;
5757 
5758 	int retval;
5759 
5760 	const uint8_t *plaintext = NULL;
5761 	const uint8_t *ciphertext = NULL;
5762 	const uint8_t *digest = NULL;
5763 	unsigned int plaintext_pad_len;
5764 	unsigned int plaintext_len;
5765 	unsigned int ciphertext_pad_len;
5766 	unsigned int ciphertext_len;
5767 	uint8_t buffer[10000];
5768 	uint8_t digest_buffer[10000];
5769 
5770 	struct rte_cryptodev_info dev_info;
5771 	struct rte_cryptodev_sym_capability_idx cap_idx;
5772 
5773 	/* Check if device supports ZUC EIA3 */
5774 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5775 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5776 
5777 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5778 			&cap_idx) == NULL)
5779 		return -ENOTSUP;
5780 
5781 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5782 
5783 	uint64_t feat_flags = dev_info.feature_flags;
5784 
5785 	if (op_mode == IN_PLACE) {
5786 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5787 			printf("Device doesn't support in-place scatter-gather "
5788 					"in both input and output mbufs.\n");
5789 			return -ENOTSUP;
5790 		}
5791 	} else {
5792 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5793 			printf("Device doesn't support out-of-place scatter-gather "
5794 					"in both input and output mbufs.\n");
5795 			return -ENOTSUP;
5796 		}
5797 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5798 			printf("Device doesn't support digest encrypted.\n");
5799 			return -ENOTSUP;
5800 		}
5801 	}
5802 
5803 	/* Create ZUC session */
5804 	retval = create_wireless_algo_auth_cipher_session(
5805 			ts_params->valid_devs[0],
5806 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5807 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5808 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5809 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5810 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5811 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5812 			tdata->key.data, tdata->key.len,
5813 			tdata->auth_iv.len, tdata->digest.len,
5814 			tdata->cipher_iv.len);
5815 
5816 	if (retval < 0)
5817 		return retval;
5818 
5819 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5820 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5821 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5822 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5823 
5824 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5825 			plaintext_pad_len, 15, 0);
5826 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5827 			"Failed to allocate input buffer in mempool");
5828 
5829 	if (op_mode == OUT_OF_PLACE) {
5830 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5831 				plaintext_pad_len, 15, 0);
5832 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5833 				"Failed to allocate output buffer in mempool");
5834 	}
5835 
5836 	if (verify) {
5837 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5838 			tdata->ciphertext.data);
5839 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5840 					ciphertext_len, buffer);
5841 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5842 			ciphertext_len);
5843 	} else {
5844 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5845 			tdata->plaintext.data);
5846 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5847 					plaintext_len, buffer);
5848 		debug_hexdump(stdout, "plaintext:", plaintext,
5849 			plaintext_len);
5850 	}
5851 	memset(buffer, 0, sizeof(buffer));
5852 
5853 	/* Create ZUC operation */
5854 	retval = create_wireless_algo_auth_cipher_operation(
5855 		tdata->digest.len,
5856 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5857 		NULL, 0,
5858 		(tdata->digest.offset_bytes == 0 ?
5859 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5860 			: tdata->digest.offset_bytes),
5861 		tdata->validCipherLenInBits.len,
5862 		tdata->validCipherOffsetInBits.len,
5863 		tdata->validAuthLenInBits.len,
5864 		0,
5865 		op_mode, 1);
5866 
5867 	if (retval < 0)
5868 		return retval;
5869 
5870 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5871 			ut_params->op);
5872 
5873 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5874 
5875 	ut_params->obuf = (op_mode == IN_PLACE ?
5876 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5877 
5878 	if (verify) {
5879 		if (ut_params->obuf)
5880 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5881 					plaintext_len, buffer);
5882 		else
5883 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5884 					plaintext_len, buffer);
5885 
5886 		debug_hexdump(stdout, "plaintext:", plaintext,
5887 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5888 		debug_hexdump(stdout, "plaintext expected:",
5889 			tdata->plaintext.data,
5890 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5891 	} else {
5892 		if (ut_params->obuf)
5893 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5894 					ciphertext_len, buffer);
5895 		else
5896 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5897 					ciphertext_len, buffer);
5898 
5899 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5900 			ciphertext_len);
5901 		debug_hexdump(stdout, "ciphertext expected:",
5902 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5903 
5904 		if (ut_params->obuf)
5905 			digest = rte_pktmbuf_read(ut_params->obuf,
5906 				(tdata->digest.offset_bytes == 0 ?
5907 				plaintext_pad_len : tdata->digest.offset_bytes),
5908 				tdata->digest.len, digest_buffer);
5909 		else
5910 			digest = rte_pktmbuf_read(ut_params->ibuf,
5911 				(tdata->digest.offset_bytes == 0 ?
5912 				plaintext_pad_len : tdata->digest.offset_bytes),
5913 				tdata->digest.len, digest_buffer);
5914 
5915 		debug_hexdump(stdout, "digest:", digest,
5916 			tdata->digest.len);
5917 		debug_hexdump(stdout, "digest expected:",
5918 			tdata->digest.data, tdata->digest.len);
5919 	}
5920 
5921 	/* Validate obuf */
5922 	if (verify) {
5923 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5924 			plaintext,
5925 			tdata->plaintext.data,
5926 			tdata->plaintext.len >> 3,
5927 			"ZUC Plaintext data not as expected");
5928 	} else {
5929 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5930 			ciphertext,
5931 			tdata->ciphertext.data,
5932 			tdata->validDataLenInBits.len,
5933 			"ZUC Ciphertext data not as expected");
5934 
5935 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5936 			digest,
5937 			tdata->digest.data,
5938 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5939 			"ZUC Generated auth tag not as expected");
5940 	}
5941 	return 0;
5942 }
5943 
5944 static int
5945 test_kasumi_encryption_test_case_1(void)
5946 {
5947 	return test_kasumi_encryption(&kasumi_test_case_1);
5948 }
5949 
5950 static int
5951 test_kasumi_encryption_test_case_1_sgl(void)
5952 {
5953 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
5954 }
5955 
5956 static int
5957 test_kasumi_encryption_test_case_1_oop(void)
5958 {
5959 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
5960 }
5961 
5962 static int
5963 test_kasumi_encryption_test_case_1_oop_sgl(void)
5964 {
5965 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
5966 }
5967 
5968 static int
5969 test_kasumi_encryption_test_case_2(void)
5970 {
5971 	return test_kasumi_encryption(&kasumi_test_case_2);
5972 }
5973 
5974 static int
5975 test_kasumi_encryption_test_case_3(void)
5976 {
5977 	return test_kasumi_encryption(&kasumi_test_case_3);
5978 }
5979 
5980 static int
5981 test_kasumi_encryption_test_case_4(void)
5982 {
5983 	return test_kasumi_encryption(&kasumi_test_case_4);
5984 }
5985 
5986 static int
5987 test_kasumi_encryption_test_case_5(void)
5988 {
5989 	return test_kasumi_encryption(&kasumi_test_case_5);
5990 }
5991 
5992 static int
5993 test_kasumi_decryption_test_case_1(void)
5994 {
5995 	return test_kasumi_decryption(&kasumi_test_case_1);
5996 }
5997 
5998 static int
5999 test_kasumi_decryption_test_case_1_oop(void)
6000 {
6001 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6002 }
6003 
6004 static int
6005 test_kasumi_decryption_test_case_2(void)
6006 {
6007 	return test_kasumi_decryption(&kasumi_test_case_2);
6008 }
6009 
6010 static int
6011 test_kasumi_decryption_test_case_3(void)
6012 {
6013 	return test_kasumi_decryption(&kasumi_test_case_3);
6014 }
6015 
6016 static int
6017 test_kasumi_decryption_test_case_4(void)
6018 {
6019 	return test_kasumi_decryption(&kasumi_test_case_4);
6020 }
6021 
6022 static int
6023 test_kasumi_decryption_test_case_5(void)
6024 {
6025 	return test_kasumi_decryption(&kasumi_test_case_5);
6026 }
6027 static int
6028 test_snow3g_encryption_test_case_1(void)
6029 {
6030 	return test_snow3g_encryption(&snow3g_test_case_1);
6031 }
6032 
6033 static int
6034 test_snow3g_encryption_test_case_1_oop(void)
6035 {
6036 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6037 }
6038 
6039 static int
6040 test_snow3g_encryption_test_case_1_oop_sgl(void)
6041 {
6042 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6043 }
6044 
6045 
6046 static int
6047 test_snow3g_encryption_test_case_1_offset_oop(void)
6048 {
6049 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6050 }
6051 
6052 static int
6053 test_snow3g_encryption_test_case_2(void)
6054 {
6055 	return test_snow3g_encryption(&snow3g_test_case_2);
6056 }
6057 
6058 static int
6059 test_snow3g_encryption_test_case_3(void)
6060 {
6061 	return test_snow3g_encryption(&snow3g_test_case_3);
6062 }
6063 
6064 static int
6065 test_snow3g_encryption_test_case_4(void)
6066 {
6067 	return test_snow3g_encryption(&snow3g_test_case_4);
6068 }
6069 
6070 static int
6071 test_snow3g_encryption_test_case_5(void)
6072 {
6073 	return test_snow3g_encryption(&snow3g_test_case_5);
6074 }
6075 
6076 static int
6077 test_snow3g_decryption_test_case_1(void)
6078 {
6079 	return test_snow3g_decryption(&snow3g_test_case_1);
6080 }
6081 
6082 static int
6083 test_snow3g_decryption_test_case_1_oop(void)
6084 {
6085 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6086 }
6087 
6088 static int
6089 test_snow3g_decryption_test_case_2(void)
6090 {
6091 	return test_snow3g_decryption(&snow3g_test_case_2);
6092 }
6093 
6094 static int
6095 test_snow3g_decryption_test_case_3(void)
6096 {
6097 	return test_snow3g_decryption(&snow3g_test_case_3);
6098 }
6099 
6100 static int
6101 test_snow3g_decryption_test_case_4(void)
6102 {
6103 	return test_snow3g_decryption(&snow3g_test_case_4);
6104 }
6105 
6106 static int
6107 test_snow3g_decryption_test_case_5(void)
6108 {
6109 	return test_snow3g_decryption(&snow3g_test_case_5);
6110 }
6111 
6112 /*
6113  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6114  * Pattern digest from snow3g_test_data must be allocated as
6115  * 4 last bytes in plaintext.
6116  */
6117 static void
6118 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6119 		struct snow3g_hash_test_data *output)
6120 {
6121 	if ((pattern != NULL) && (output != NULL)) {
6122 		output->key.len = pattern->key.len;
6123 
6124 		memcpy(output->key.data,
6125 		pattern->key.data, pattern->key.len);
6126 
6127 		output->auth_iv.len = pattern->auth_iv.len;
6128 
6129 		memcpy(output->auth_iv.data,
6130 		pattern->auth_iv.data, pattern->auth_iv.len);
6131 
6132 		output->plaintext.len = pattern->plaintext.len;
6133 
6134 		memcpy(output->plaintext.data,
6135 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6136 
6137 		output->digest.len = pattern->digest.len;
6138 
6139 		memcpy(output->digest.data,
6140 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6141 		pattern->digest.len);
6142 
6143 		output->validAuthLenInBits.len =
6144 		pattern->validAuthLenInBits.len;
6145 	}
6146 }
6147 
6148 /*
6149  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6150  */
6151 static int
6152 test_snow3g_decryption_with_digest_test_case_1(void)
6153 {
6154 	struct snow3g_hash_test_data snow3g_hash_data;
6155 
6156 	/*
6157 	 * Function prepare data for hash veryfication test case.
6158 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6159 	 */
6160 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6161 
6162 	return test_snow3g_decryption(&snow3g_test_case_7) &
6163 			test_snow3g_authentication_verify(&snow3g_hash_data);
6164 }
6165 
6166 static int
6167 test_snow3g_cipher_auth_test_case_1(void)
6168 {
6169 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6170 }
6171 
6172 static int
6173 test_snow3g_auth_cipher_test_case_1(void)
6174 {
6175 	return test_snow3g_auth_cipher(
6176 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6177 }
6178 
6179 static int
6180 test_snow3g_auth_cipher_test_case_2(void)
6181 {
6182 	return test_snow3g_auth_cipher(
6183 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6184 }
6185 
6186 static int
6187 test_snow3g_auth_cipher_test_case_2_oop(void)
6188 {
6189 	return test_snow3g_auth_cipher(
6190 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6191 }
6192 
6193 static int
6194 test_snow3g_auth_cipher_part_digest_enc(void)
6195 {
6196 	return test_snow3g_auth_cipher(
6197 		&snow3g_auth_cipher_partial_digest_encryption,
6198 			IN_PLACE, 0);
6199 }
6200 
6201 static int
6202 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6203 {
6204 	return test_snow3g_auth_cipher(
6205 		&snow3g_auth_cipher_partial_digest_encryption,
6206 			OUT_OF_PLACE, 0);
6207 }
6208 
6209 static int
6210 test_snow3g_auth_cipher_test_case_3_sgl(void)
6211 {
6212 	return test_snow3g_auth_cipher_sgl(
6213 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6214 }
6215 
6216 static int
6217 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6218 {
6219 	return test_snow3g_auth_cipher_sgl(
6220 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6221 }
6222 
6223 static int
6224 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6225 {
6226 	return test_snow3g_auth_cipher_sgl(
6227 		&snow3g_auth_cipher_partial_digest_encryption,
6228 			IN_PLACE, 0);
6229 }
6230 
6231 static int
6232 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6233 {
6234 	return test_snow3g_auth_cipher_sgl(
6235 		&snow3g_auth_cipher_partial_digest_encryption,
6236 			OUT_OF_PLACE, 0);
6237 }
6238 
6239 static int
6240 test_snow3g_auth_cipher_verify_test_case_1(void)
6241 {
6242 	return test_snow3g_auth_cipher(
6243 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6244 }
6245 
6246 static int
6247 test_snow3g_auth_cipher_verify_test_case_2(void)
6248 {
6249 	return test_snow3g_auth_cipher(
6250 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6251 }
6252 
6253 static int
6254 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6255 {
6256 	return test_snow3g_auth_cipher(
6257 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6258 }
6259 
6260 static int
6261 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6262 {
6263 	return test_snow3g_auth_cipher(
6264 		&snow3g_auth_cipher_partial_digest_encryption,
6265 			IN_PLACE, 1);
6266 }
6267 
6268 static int
6269 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6270 {
6271 	return test_snow3g_auth_cipher(
6272 		&snow3g_auth_cipher_partial_digest_encryption,
6273 			OUT_OF_PLACE, 1);
6274 }
6275 
6276 static int
6277 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6278 {
6279 	return test_snow3g_auth_cipher_sgl(
6280 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6281 }
6282 
6283 static int
6284 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6285 {
6286 	return test_snow3g_auth_cipher_sgl(
6287 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6288 }
6289 
6290 static int
6291 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6292 {
6293 	return test_snow3g_auth_cipher_sgl(
6294 		&snow3g_auth_cipher_partial_digest_encryption,
6295 			IN_PLACE, 1);
6296 }
6297 
6298 static int
6299 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6300 {
6301 	return test_snow3g_auth_cipher_sgl(
6302 		&snow3g_auth_cipher_partial_digest_encryption,
6303 			OUT_OF_PLACE, 1);
6304 }
6305 
6306 static int
6307 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6308 {
6309 	return test_snow3g_auth_cipher(
6310 		&snow3g_test_case_7, IN_PLACE, 0);
6311 }
6312 
6313 static int
6314 test_kasumi_auth_cipher_test_case_1(void)
6315 {
6316 	return test_kasumi_auth_cipher(
6317 		&kasumi_test_case_3, IN_PLACE, 0);
6318 }
6319 
6320 static int
6321 test_kasumi_auth_cipher_test_case_2(void)
6322 {
6323 	return test_kasumi_auth_cipher(
6324 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6325 }
6326 
6327 static int
6328 test_kasumi_auth_cipher_test_case_2_oop(void)
6329 {
6330 	return test_kasumi_auth_cipher(
6331 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6332 }
6333 
6334 static int
6335 test_kasumi_auth_cipher_test_case_2_sgl(void)
6336 {
6337 	return test_kasumi_auth_cipher_sgl(
6338 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6339 }
6340 
6341 static int
6342 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6343 {
6344 	return test_kasumi_auth_cipher_sgl(
6345 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6346 }
6347 
6348 static int
6349 test_kasumi_auth_cipher_verify_test_case_1(void)
6350 {
6351 	return test_kasumi_auth_cipher(
6352 		&kasumi_test_case_3, IN_PLACE, 1);
6353 }
6354 
6355 static int
6356 test_kasumi_auth_cipher_verify_test_case_2(void)
6357 {
6358 	return test_kasumi_auth_cipher(
6359 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6360 }
6361 
6362 static int
6363 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6364 {
6365 	return test_kasumi_auth_cipher(
6366 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6367 }
6368 
6369 static int
6370 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6371 {
6372 	return test_kasumi_auth_cipher_sgl(
6373 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6374 }
6375 
6376 static int
6377 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6378 {
6379 	return test_kasumi_auth_cipher_sgl(
6380 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6381 }
6382 
6383 static int
6384 test_kasumi_cipher_auth_test_case_1(void)
6385 {
6386 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6387 }
6388 
6389 static int
6390 test_zuc_encryption_test_case_1(void)
6391 {
6392 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6393 }
6394 
6395 static int
6396 test_zuc_encryption_test_case_2(void)
6397 {
6398 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6399 }
6400 
6401 static int
6402 test_zuc_encryption_test_case_3(void)
6403 {
6404 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6405 }
6406 
6407 static int
6408 test_zuc_encryption_test_case_4(void)
6409 {
6410 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6411 }
6412 
6413 static int
6414 test_zuc_encryption_test_case_5(void)
6415 {
6416 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6417 }
6418 
6419 static int
6420 test_zuc_encryption_test_case_6_sgl(void)
6421 {
6422 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6423 }
6424 
6425 static int
6426 test_zuc_hash_generate_test_case_1(void)
6427 {
6428 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6429 }
6430 
6431 static int
6432 test_zuc_hash_generate_test_case_2(void)
6433 {
6434 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6435 }
6436 
6437 static int
6438 test_zuc_hash_generate_test_case_3(void)
6439 {
6440 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6441 }
6442 
6443 static int
6444 test_zuc_hash_generate_test_case_4(void)
6445 {
6446 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6447 }
6448 
6449 static int
6450 test_zuc_hash_generate_test_case_5(void)
6451 {
6452 	return test_zuc_authentication(&zuc_test_auth_5670b);
6453 }
6454 
6455 static int
6456 test_zuc_hash_generate_test_case_6(void)
6457 {
6458 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6459 }
6460 
6461 static int
6462 test_zuc_hash_generate_test_case_7(void)
6463 {
6464 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
6465 }
6466 
6467 static int
6468 test_zuc_hash_generate_test_case_8(void)
6469 {
6470 	return test_zuc_authentication(&zuc_test_case_auth_584b);
6471 }
6472 
6473 static int
6474 test_zuc_cipher_auth_test_case_1(void)
6475 {
6476 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6477 }
6478 
6479 static int
6480 test_zuc_cipher_auth_test_case_2(void)
6481 {
6482 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6483 }
6484 
6485 static int
6486 test_zuc_auth_cipher_test_case_1(void)
6487 {
6488 	return test_zuc_auth_cipher(
6489 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6490 }
6491 
6492 static int
6493 test_zuc_auth_cipher_test_case_1_oop(void)
6494 {
6495 	return test_zuc_auth_cipher(
6496 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6497 }
6498 
6499 static int
6500 test_zuc_auth_cipher_test_case_1_sgl(void)
6501 {
6502 	return test_zuc_auth_cipher_sgl(
6503 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6504 }
6505 
6506 static int
6507 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6508 {
6509 	return test_zuc_auth_cipher_sgl(
6510 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6511 }
6512 
6513 static int
6514 test_zuc_auth_cipher_verify_test_case_1(void)
6515 {
6516 	return test_zuc_auth_cipher(
6517 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6518 }
6519 
6520 static int
6521 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6522 {
6523 	return test_zuc_auth_cipher(
6524 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6525 }
6526 
6527 static int
6528 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6529 {
6530 	return test_zuc_auth_cipher_sgl(
6531 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6532 }
6533 
6534 static int
6535 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6536 {
6537 	return test_zuc_auth_cipher_sgl(
6538 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6539 }
6540 
6541 static int
6542 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6543 {
6544 	uint8_t dev_id = testsuite_params.valid_devs[0];
6545 
6546 	struct rte_cryptodev_sym_capability_idx cap_idx;
6547 
6548 	/* Check if device supports particular cipher algorithm */
6549 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6550 	cap_idx.algo.cipher = tdata->cipher_algo;
6551 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6552 		return -ENOTSUP;
6553 
6554 	/* Check if device supports particular hash algorithm */
6555 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6556 	cap_idx.algo.auth = tdata->auth_algo;
6557 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6558 		return -ENOTSUP;
6559 
6560 	return 0;
6561 }
6562 
6563 static int
6564 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6565 	uint8_t op_mode, uint8_t verify)
6566 {
6567 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6568 	struct crypto_unittest_params *ut_params = &unittest_params;
6569 
6570 	int retval;
6571 
6572 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6573 	unsigned int plaintext_pad_len;
6574 	unsigned int plaintext_len;
6575 	unsigned int ciphertext_pad_len;
6576 	unsigned int ciphertext_len;
6577 
6578 	struct rte_cryptodev_info dev_info;
6579 
6580 	/* Check if device supports particular algorithms */
6581 	if (test_mixed_check_if_unsupported(tdata))
6582 		return -ENOTSUP;
6583 
6584 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6585 
6586 	uint64_t feat_flags = dev_info.feature_flags;
6587 
6588 	if (op_mode == OUT_OF_PLACE) {
6589 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6590 			printf("Device doesn't support digest encrypted.\n");
6591 			return -ENOTSUP;
6592 		}
6593 	}
6594 
6595 	/* Create the session */
6596 	retval = create_wireless_algo_auth_cipher_session(
6597 			ts_params->valid_devs[0],
6598 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6599 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6600 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6601 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6602 			tdata->auth_algo,
6603 			tdata->cipher_algo,
6604 			tdata->auth_key.data, tdata->auth_key.len,
6605 			tdata->auth_iv.len, tdata->digest_enc.len,
6606 			tdata->cipher_iv.len);
6607 
6608 	if (retval < 0)
6609 		return retval;
6610 
6611 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6612 	if (op_mode == OUT_OF_PLACE)
6613 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6614 
6615 	/* clear mbuf payload */
6616 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6617 		rte_pktmbuf_tailroom(ut_params->ibuf));
6618 	if (op_mode == OUT_OF_PLACE)
6619 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6620 				rte_pktmbuf_tailroom(ut_params->obuf));
6621 
6622 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6623 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6624 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6625 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6626 
6627 	if (verify) {
6628 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6629 				ciphertext_pad_len);
6630 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6631 		if (op_mode == OUT_OF_PLACE)
6632 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6633 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6634 				ciphertext_len);
6635 	} else {
6636 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6637 				plaintext_pad_len);
6638 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6639 		if (op_mode == OUT_OF_PLACE)
6640 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6641 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6642 	}
6643 
6644 	/* Create the operation */
6645 	retval = create_wireless_algo_auth_cipher_operation(
6646 			tdata->digest_enc.len,
6647 			tdata->cipher_iv.data, tdata->cipher_iv.len,
6648 			tdata->auth_iv.data, tdata->auth_iv.len,
6649 			(tdata->digest_enc.offset == 0 ?
6650 			(verify ? ciphertext_pad_len : plaintext_pad_len)
6651 				: tdata->digest_enc.offset),
6652 			tdata->validCipherLen.len_bits,
6653 			tdata->cipher.offset_bits,
6654 			tdata->validAuthLen.len_bits,
6655 			tdata->auth.offset_bits,
6656 			op_mode, 0);
6657 
6658 	if (retval < 0)
6659 		return retval;
6660 
6661 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6662 			ut_params->op);
6663 
6664 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6665 
6666 	ut_params->obuf = (op_mode == IN_PLACE ?
6667 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6668 
6669 	if (verify) {
6670 		if (ut_params->obuf)
6671 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6672 							uint8_t *);
6673 		else
6674 			plaintext = ciphertext +
6675 					(tdata->cipher.offset_bits >> 3);
6676 
6677 		debug_hexdump(stdout, "plaintext:", plaintext,
6678 				(tdata->plaintext.len_bits >> 3) -
6679 				tdata->digest_enc.len);
6680 		debug_hexdump(stdout, "plaintext expected:",
6681 				tdata->plaintext.data,
6682 				(tdata->plaintext.len_bits >> 3) -
6683 				tdata->digest_enc.len);
6684 	} else {
6685 		if (ut_params->obuf)
6686 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6687 					uint8_t *);
6688 		else
6689 			ciphertext = plaintext;
6690 
6691 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6692 				ciphertext_len);
6693 		debug_hexdump(stdout, "ciphertext expected:",
6694 				tdata->ciphertext.data,
6695 				tdata->ciphertext.len_bits >> 3);
6696 
6697 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6698 				+ (tdata->digest_enc.offset == 0 ?
6699 		plaintext_pad_len : tdata->digest_enc.offset);
6700 
6701 		debug_hexdump(stdout, "digest:", ut_params->digest,
6702 				tdata->digest_enc.len);
6703 		debug_hexdump(stdout, "digest expected:",
6704 				tdata->digest_enc.data,
6705 				tdata->digest_enc.len);
6706 	}
6707 
6708 	/* Validate obuf */
6709 	if (verify) {
6710 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6711 				plaintext,
6712 				tdata->plaintext.data,
6713 				tdata->plaintext.len_bits >> 3,
6714 				"Plaintext data not as expected");
6715 	} else {
6716 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6717 				ciphertext,
6718 				tdata->ciphertext.data,
6719 				tdata->validDataLen.len_bits,
6720 				"Ciphertext data not as expected");
6721 
6722 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6723 				ut_params->digest,
6724 				tdata->digest_enc.data,
6725 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6726 				"Generated auth tag not as expected");
6727 	}
6728 	return 0;
6729 }
6730 
6731 static int
6732 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6733 	uint8_t op_mode, uint8_t verify)
6734 {
6735 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6736 	struct crypto_unittest_params *ut_params = &unittest_params;
6737 
6738 	int retval;
6739 
6740 	const uint8_t *plaintext = NULL;
6741 	const uint8_t *ciphertext = NULL;
6742 	const uint8_t *digest = NULL;
6743 	unsigned int plaintext_pad_len;
6744 	unsigned int plaintext_len;
6745 	unsigned int ciphertext_pad_len;
6746 	unsigned int ciphertext_len;
6747 	uint8_t buffer[10000];
6748 	uint8_t digest_buffer[10000];
6749 
6750 	struct rte_cryptodev_info dev_info;
6751 
6752 	/* Check if device supports particular algorithms */
6753 	if (test_mixed_check_if_unsupported(tdata))
6754 		return -ENOTSUP;
6755 
6756 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6757 
6758 	uint64_t feat_flags = dev_info.feature_flags;
6759 
6760 	if (op_mode == IN_PLACE) {
6761 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6762 			printf("Device doesn't support in-place scatter-gather "
6763 					"in both input and output mbufs.\n");
6764 			return -ENOTSUP;
6765 		}
6766 	} else {
6767 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6768 			printf("Device doesn't support out-of-place scatter-gather "
6769 					"in both input and output mbufs.\n");
6770 			return -ENOTSUP;
6771 		}
6772 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6773 			printf("Device doesn't support digest encrypted.\n");
6774 			return -ENOTSUP;
6775 		}
6776 	}
6777 
6778 	/* Create the session */
6779 	retval = create_wireless_algo_auth_cipher_session(
6780 			ts_params->valid_devs[0],
6781 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6782 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6783 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6784 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6785 			tdata->auth_algo,
6786 			tdata->cipher_algo,
6787 			tdata->auth_key.data, tdata->auth_key.len,
6788 			tdata->auth_iv.len, tdata->digest_enc.len,
6789 			tdata->cipher_iv.len);
6790 
6791 	if (retval < 0)
6792 		return retval;
6793 
6794 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6795 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6796 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6797 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6798 
6799 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6800 			plaintext_pad_len, 15, 0);
6801 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6802 			"Failed to allocate input buffer in mempool");
6803 
6804 	if (op_mode == OUT_OF_PLACE) {
6805 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6806 				plaintext_pad_len, 15, 0);
6807 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6808 				"Failed to allocate output buffer in mempool");
6809 	}
6810 
6811 	if (verify) {
6812 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6813 			tdata->ciphertext.data);
6814 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6815 					ciphertext_len, buffer);
6816 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6817 			ciphertext_len);
6818 	} else {
6819 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6820 			tdata->plaintext.data);
6821 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6822 					plaintext_len, buffer);
6823 		debug_hexdump(stdout, "plaintext:", plaintext,
6824 			plaintext_len);
6825 	}
6826 	memset(buffer, 0, sizeof(buffer));
6827 
6828 	/* Create the operation */
6829 	retval = create_wireless_algo_auth_cipher_operation(
6830 			tdata->digest_enc.len,
6831 			tdata->cipher_iv.data, tdata->cipher_iv.len,
6832 			tdata->auth_iv.data, tdata->auth_iv.len,
6833 			(tdata->digest_enc.offset == 0 ?
6834 			(verify ? ciphertext_pad_len : plaintext_pad_len)
6835 				: tdata->digest_enc.offset),
6836 			tdata->validCipherLen.len_bits,
6837 			tdata->cipher.offset_bits,
6838 			tdata->validAuthLen.len_bits,
6839 			tdata->auth.offset_bits,
6840 			op_mode, 1);
6841 
6842 	if (retval < 0)
6843 		return retval;
6844 
6845 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6846 			ut_params->op);
6847 
6848 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6849 
6850 	ut_params->obuf = (op_mode == IN_PLACE ?
6851 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6852 
6853 	if (verify) {
6854 		if (ut_params->obuf)
6855 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6856 					plaintext_len, buffer);
6857 		else
6858 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6859 					plaintext_len, buffer);
6860 
6861 		debug_hexdump(stdout, "plaintext:", plaintext,
6862 				(tdata->plaintext.len_bits >> 3) -
6863 				tdata->digest_enc.len);
6864 		debug_hexdump(stdout, "plaintext expected:",
6865 				tdata->plaintext.data,
6866 				(tdata->plaintext.len_bits >> 3) -
6867 				tdata->digest_enc.len);
6868 	} else {
6869 		if (ut_params->obuf)
6870 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6871 					ciphertext_len, buffer);
6872 		else
6873 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6874 					ciphertext_len, buffer);
6875 
6876 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6877 			ciphertext_len);
6878 		debug_hexdump(stdout, "ciphertext expected:",
6879 			tdata->ciphertext.data,
6880 			tdata->ciphertext.len_bits >> 3);
6881 
6882 		if (ut_params->obuf)
6883 			digest = rte_pktmbuf_read(ut_params->obuf,
6884 					(tdata->digest_enc.offset == 0 ?
6885 						plaintext_pad_len :
6886 						tdata->digest_enc.offset),
6887 					tdata->digest_enc.len, digest_buffer);
6888 		else
6889 			digest = rte_pktmbuf_read(ut_params->ibuf,
6890 					(tdata->digest_enc.offset == 0 ?
6891 						plaintext_pad_len :
6892 						tdata->digest_enc.offset),
6893 					tdata->digest_enc.len, digest_buffer);
6894 
6895 		debug_hexdump(stdout, "digest:", digest,
6896 				tdata->digest_enc.len);
6897 		debug_hexdump(stdout, "digest expected:",
6898 				tdata->digest_enc.data, tdata->digest_enc.len);
6899 	}
6900 
6901 	/* Validate obuf */
6902 	if (verify) {
6903 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6904 				plaintext,
6905 				tdata->plaintext.data,
6906 				tdata->plaintext.len_bits >> 3,
6907 				"Plaintext data not as expected");
6908 	} else {
6909 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6910 				ciphertext,
6911 				tdata->ciphertext.data,
6912 				tdata->validDataLen.len_bits,
6913 				"Ciphertext data not as expected");
6914 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6915 				digest,
6916 				tdata->digest_enc.data,
6917 				tdata->digest_enc.len,
6918 				"Generated auth tag not as expected");
6919 	}
6920 	return 0;
6921 }
6922 
6923 /** AUTH AES CMAC + CIPHER AES CTR */
6924 
6925 static int
6926 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
6927 {
6928 	return test_mixed_auth_cipher(
6929 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
6930 }
6931 
6932 static int
6933 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
6934 {
6935 	return test_mixed_auth_cipher(
6936 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6937 }
6938 
6939 static int
6940 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
6941 {
6942 	return test_mixed_auth_cipher_sgl(
6943 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
6944 }
6945 
6946 static int
6947 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
6948 {
6949 	return test_mixed_auth_cipher_sgl(
6950 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
6951 }
6952 
6953 static int
6954 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
6955 {
6956 	return test_mixed_auth_cipher(
6957 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
6958 }
6959 
6960 static int
6961 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
6962 {
6963 	return test_mixed_auth_cipher(
6964 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6965 }
6966 
6967 static int
6968 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
6969 {
6970 	return test_mixed_auth_cipher_sgl(
6971 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
6972 }
6973 
6974 static int
6975 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
6976 {
6977 	return test_mixed_auth_cipher_sgl(
6978 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
6979 }
6980 
6981 static int
6982 test_3DES_chain_qat_all(void)
6983 {
6984 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6985 	int status;
6986 
6987 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
6988 		ts_params->op_mpool,
6989 		ts_params->session_mpool, ts_params->session_priv_mpool,
6990 		ts_params->valid_devs[0],
6991 		rte_cryptodev_driver_id_get(
6992 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
6993 		BLKCIPHER_3DES_CHAIN_TYPE);
6994 
6995 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
6996 
6997 	return TEST_SUCCESS;
6998 }
6999 
7000 static int
7001 test_DES_cipheronly_qat_all(void)
7002 {
7003 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7004 	int status;
7005 
7006 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7007 		ts_params->op_mpool,
7008 		ts_params->session_mpool, ts_params->session_priv_mpool,
7009 		ts_params->valid_devs[0],
7010 		rte_cryptodev_driver_id_get(
7011 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
7012 		BLKCIPHER_DES_CIPHERONLY_TYPE);
7013 
7014 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7015 
7016 	return TEST_SUCCESS;
7017 }
7018 
7019 static int
7020 test_DES_cipheronly_openssl_all(void)
7021 {
7022 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7023 	int status;
7024 
7025 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7026 		ts_params->op_mpool,
7027 		ts_params->session_mpool, ts_params->session_priv_mpool,
7028 		ts_params->valid_devs[0],
7029 		rte_cryptodev_driver_id_get(
7030 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
7031 		BLKCIPHER_DES_CIPHERONLY_TYPE);
7032 
7033 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7034 
7035 	return TEST_SUCCESS;
7036 }
7037 
7038 static int
7039 test_DES_docsis_openssl_all(void)
7040 {
7041 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7042 	int status;
7043 
7044 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7045 		ts_params->op_mpool,
7046 		ts_params->session_mpool, ts_params->session_priv_mpool,
7047 		ts_params->valid_devs[0],
7048 		rte_cryptodev_driver_id_get(
7049 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
7050 		BLKCIPHER_DES_DOCSIS_TYPE);
7051 
7052 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7053 
7054 	return TEST_SUCCESS;
7055 }
7056 
7057 static int
7058 test_DES_cipheronly_mb_all(void)
7059 {
7060 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7061 	int status;
7062 
7063 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7064 		ts_params->op_mpool,
7065 		ts_params->session_mpool, ts_params->session_priv_mpool,
7066 		ts_params->valid_devs[0],
7067 		rte_cryptodev_driver_id_get(
7068 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
7069 		BLKCIPHER_DES_CIPHERONLY_TYPE);
7070 
7071 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7072 
7073 	return TEST_SUCCESS;
7074 }
7075 static int
7076 test_3DES_cipheronly_mb_all(void)
7077 {
7078 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7079 	int status;
7080 
7081 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7082 		ts_params->op_mpool,
7083 		ts_params->session_mpool, ts_params->session_priv_mpool,
7084 		ts_params->valid_devs[0],
7085 		rte_cryptodev_driver_id_get(
7086 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
7087 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7088 
7089 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7090 
7091 	return TEST_SUCCESS;
7092 }
7093 
7094 static int
7095 test_DES_docsis_mb_all(void)
7096 {
7097 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7098 	int status;
7099 
7100 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7101 		ts_params->op_mpool,
7102 		ts_params->session_mpool, ts_params->session_priv_mpool,
7103 		ts_params->valid_devs[0],
7104 		rte_cryptodev_driver_id_get(
7105 		RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)),
7106 		BLKCIPHER_DES_DOCSIS_TYPE);
7107 
7108 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7109 
7110 	return TEST_SUCCESS;
7111 }
7112 
7113 static int
7114 test_3DES_chain_caam_jr_all(void)
7115 {
7116 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7117 	int status;
7118 
7119 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7120 		ts_params->op_mpool,
7121 		ts_params->session_mpool, ts_params->session_priv_mpool,
7122 		ts_params->valid_devs[0],
7123 		rte_cryptodev_driver_id_get(
7124 		RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),
7125 		BLKCIPHER_3DES_CHAIN_TYPE);
7126 
7127 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7128 
7129 	return TEST_SUCCESS;
7130 }
7131 
7132 static int
7133 test_3DES_cipheronly_caam_jr_all(void)
7134 {
7135 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7136 	int status;
7137 
7138 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7139 		ts_params->op_mpool,
7140 		ts_params->session_mpool, ts_params->session_priv_mpool,
7141 		ts_params->valid_devs[0],
7142 		rte_cryptodev_driver_id_get(
7143 		RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD)),
7144 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7145 
7146 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7147 
7148 	return TEST_SUCCESS;
7149 }
7150 
7151 static int
7152 test_3DES_chain_dpaa_sec_all(void)
7153 {
7154 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7155 	int status;
7156 
7157 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7158 		ts_params->op_mpool,
7159 		ts_params->session_mpool, ts_params->session_priv_mpool,
7160 		ts_params->valid_devs[0],
7161 		rte_cryptodev_driver_id_get(
7162 		RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),
7163 		BLKCIPHER_3DES_CHAIN_TYPE);
7164 
7165 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7166 
7167 	return TEST_SUCCESS;
7168 }
7169 
7170 static int
7171 test_3DES_cipheronly_dpaa_sec_all(void)
7172 {
7173 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7174 	int status;
7175 
7176 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7177 		ts_params->op_mpool,
7178 		ts_params->session_mpool, ts_params->session_priv_mpool,
7179 		ts_params->valid_devs[0],
7180 		rte_cryptodev_driver_id_get(
7181 		RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD)),
7182 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7183 
7184 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7185 
7186 	return TEST_SUCCESS;
7187 }
7188 
7189 static int
7190 test_3DES_chain_dpaa2_sec_all(void)
7191 {
7192 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7193 	int status;
7194 
7195 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7196 		ts_params->op_mpool,
7197 		ts_params->session_mpool, ts_params->session_priv_mpool,
7198 		ts_params->valid_devs[0],
7199 		rte_cryptodev_driver_id_get(
7200 		RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
7201 		BLKCIPHER_3DES_CHAIN_TYPE);
7202 
7203 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7204 
7205 	return TEST_SUCCESS;
7206 }
7207 
7208 static int
7209 test_3DES_cipheronly_dpaa2_sec_all(void)
7210 {
7211 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7212 	int status;
7213 
7214 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7215 		ts_params->op_mpool,
7216 		ts_params->session_mpool, ts_params->session_priv_mpool,
7217 		ts_params->valid_devs[0],
7218 		rte_cryptodev_driver_id_get(
7219 		RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD)),
7220 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7221 
7222 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7223 
7224 	return TEST_SUCCESS;
7225 }
7226 
7227 static int
7228 test_3DES_chain_ccp_all(void)
7229 {
7230 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7231 	int status;
7232 
7233 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7234 		ts_params->op_mpool,
7235 		ts_params->session_mpool, ts_params->session_priv_mpool,
7236 		ts_params->valid_devs[0],
7237 		rte_cryptodev_driver_id_get(
7238 		RTE_STR(CRYPTODEV_NAME_CCP_PMD)),
7239 		BLKCIPHER_3DES_CHAIN_TYPE);
7240 
7241 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7242 
7243 	return TEST_SUCCESS;
7244 }
7245 
7246 static int
7247 test_3DES_cipheronly_ccp_all(void)
7248 {
7249 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7250 	int status;
7251 
7252 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7253 		ts_params->op_mpool,
7254 		ts_params->session_mpool, ts_params->session_priv_mpool,
7255 		ts_params->valid_devs[0],
7256 		rte_cryptodev_driver_id_get(
7257 		RTE_STR(CRYPTODEV_NAME_CCP_PMD)),
7258 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7259 
7260 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7261 
7262 	return TEST_SUCCESS;
7263 }
7264 
7265 static int
7266 test_3DES_cipheronly_qat_all(void)
7267 {
7268 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7269 	int status;
7270 
7271 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7272 		ts_params->op_mpool,
7273 		ts_params->session_mpool, ts_params->session_priv_mpool,
7274 		ts_params->valid_devs[0],
7275 		rte_cryptodev_driver_id_get(
7276 		RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD)),
7277 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7278 
7279 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7280 
7281 	return TEST_SUCCESS;
7282 }
7283 
7284 static int
7285 test_3DES_chain_openssl_all(void)
7286 {
7287 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7288 	int status;
7289 
7290 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7291 		ts_params->op_mpool,
7292 		ts_params->session_mpool, ts_params->session_priv_mpool,
7293 		ts_params->valid_devs[0],
7294 		rte_cryptodev_driver_id_get(
7295 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
7296 		BLKCIPHER_3DES_CHAIN_TYPE);
7297 
7298 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7299 
7300 	return TEST_SUCCESS;
7301 }
7302 
7303 static int
7304 test_3DES_cipheronly_openssl_all(void)
7305 {
7306 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7307 	int status;
7308 
7309 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
7310 		ts_params->op_mpool,
7311 		ts_params->session_mpool, ts_params->session_priv_mpool,
7312 		ts_params->valid_devs[0],
7313 		rte_cryptodev_driver_id_get(
7314 		RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)),
7315 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
7316 
7317 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
7318 
7319 	return TEST_SUCCESS;
7320 }
7321 
7322 /* ***** AEAD algorithm Tests ***** */
7323 
7324 static int
7325 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7326 		enum rte_crypto_aead_operation op,
7327 		const uint8_t *key, const uint8_t key_len,
7328 		const uint16_t aad_len, const uint8_t auth_len,
7329 		uint8_t iv_len)
7330 {
7331 	uint8_t aead_key[key_len];
7332 
7333 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7334 	struct crypto_unittest_params *ut_params = &unittest_params;
7335 
7336 	memcpy(aead_key, key, key_len);
7337 
7338 	/* Setup AEAD Parameters */
7339 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7340 	ut_params->aead_xform.next = NULL;
7341 	ut_params->aead_xform.aead.algo = algo;
7342 	ut_params->aead_xform.aead.op = op;
7343 	ut_params->aead_xform.aead.key.data = aead_key;
7344 	ut_params->aead_xform.aead.key.length = key_len;
7345 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7346 	ut_params->aead_xform.aead.iv.length = iv_len;
7347 	ut_params->aead_xform.aead.digest_length = auth_len;
7348 	ut_params->aead_xform.aead.aad_length = aad_len;
7349 
7350 	debug_hexdump(stdout, "key:", key, key_len);
7351 
7352 	/* Create Crypto session*/
7353 	ut_params->sess = rte_cryptodev_sym_session_create(
7354 			ts_params->session_mpool);
7355 
7356 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7357 			&ut_params->aead_xform,
7358 			ts_params->session_priv_mpool);
7359 
7360 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7361 
7362 	return 0;
7363 }
7364 
7365 static int
7366 create_aead_xform(struct rte_crypto_op *op,
7367 		enum rte_crypto_aead_algorithm algo,
7368 		enum rte_crypto_aead_operation aead_op,
7369 		uint8_t *key, const uint8_t key_len,
7370 		const uint8_t aad_len, const uint8_t auth_len,
7371 		uint8_t iv_len)
7372 {
7373 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7374 			"failed to allocate space for crypto transform");
7375 
7376 	struct rte_crypto_sym_op *sym_op = op->sym;
7377 
7378 	/* Setup AEAD Parameters */
7379 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7380 	sym_op->xform->next = NULL;
7381 	sym_op->xform->aead.algo = algo;
7382 	sym_op->xform->aead.op = aead_op;
7383 	sym_op->xform->aead.key.data = key;
7384 	sym_op->xform->aead.key.length = key_len;
7385 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7386 	sym_op->xform->aead.iv.length = iv_len;
7387 	sym_op->xform->aead.digest_length = auth_len;
7388 	sym_op->xform->aead.aad_length = aad_len;
7389 
7390 	debug_hexdump(stdout, "key:", key, key_len);
7391 
7392 	return 0;
7393 }
7394 
7395 static int
7396 create_aead_operation(enum rte_crypto_aead_operation op,
7397 		const struct aead_test_data *tdata)
7398 {
7399 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7400 	struct crypto_unittest_params *ut_params = &unittest_params;
7401 
7402 	uint8_t *plaintext, *ciphertext;
7403 	unsigned int aad_pad_len, plaintext_pad_len;
7404 
7405 	/* Generate Crypto op data structure */
7406 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7407 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7408 	TEST_ASSERT_NOT_NULL(ut_params->op,
7409 			"Failed to allocate symmetric crypto operation struct");
7410 
7411 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7412 
7413 	/* Append aad data */
7414 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7415 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7416 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7417 				aad_pad_len);
7418 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7419 				"no room to append aad");
7420 
7421 		sym_op->aead.aad.phys_addr =
7422 				rte_pktmbuf_iova(ut_params->ibuf);
7423 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7424 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7425 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7426 			tdata->aad.len);
7427 
7428 		/* Append IV at the end of the crypto operation*/
7429 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7430 				uint8_t *, IV_OFFSET);
7431 
7432 		/* Copy IV 1 byte after the IV pointer, according to the API */
7433 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7434 		debug_hexdump(stdout, "iv:", iv_ptr,
7435 			tdata->iv.len);
7436 	} else {
7437 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7438 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7439 				aad_pad_len);
7440 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7441 				"no room to append aad");
7442 
7443 		sym_op->aead.aad.phys_addr =
7444 				rte_pktmbuf_iova(ut_params->ibuf);
7445 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7446 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7447 			tdata->aad.len);
7448 
7449 		/* Append IV at the end of the crypto operation*/
7450 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7451 				uint8_t *, IV_OFFSET);
7452 
7453 		rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7454 		debug_hexdump(stdout, "iv:", iv_ptr,
7455 			tdata->iv.len);
7456 	}
7457 
7458 	/* Append plaintext/ciphertext */
7459 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7460 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7461 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7462 				plaintext_pad_len);
7463 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7464 
7465 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7466 		debug_hexdump(stdout, "plaintext:", plaintext,
7467 				tdata->plaintext.len);
7468 
7469 		if (ut_params->obuf) {
7470 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7471 					ut_params->obuf,
7472 					plaintext_pad_len + aad_pad_len);
7473 			TEST_ASSERT_NOT_NULL(ciphertext,
7474 					"no room to append ciphertext");
7475 
7476 			memset(ciphertext + aad_pad_len, 0,
7477 					tdata->ciphertext.len);
7478 		}
7479 	} else {
7480 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7481 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7482 				plaintext_pad_len);
7483 		TEST_ASSERT_NOT_NULL(ciphertext,
7484 				"no room to append ciphertext");
7485 
7486 		memcpy(ciphertext, tdata->ciphertext.data,
7487 				tdata->ciphertext.len);
7488 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7489 				tdata->ciphertext.len);
7490 
7491 		if (ut_params->obuf) {
7492 			plaintext = (uint8_t *)rte_pktmbuf_append(
7493 					ut_params->obuf,
7494 					plaintext_pad_len + aad_pad_len);
7495 			TEST_ASSERT_NOT_NULL(plaintext,
7496 					"no room to append plaintext");
7497 
7498 			memset(plaintext + aad_pad_len, 0,
7499 					tdata->plaintext.len);
7500 		}
7501 	}
7502 
7503 	/* Append digest data */
7504 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7505 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7506 				ut_params->obuf ? ut_params->obuf :
7507 						ut_params->ibuf,
7508 						tdata->auth_tag.len);
7509 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7510 				"no room to append digest");
7511 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7512 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7513 				ut_params->obuf ? ut_params->obuf :
7514 						ut_params->ibuf,
7515 						plaintext_pad_len +
7516 						aad_pad_len);
7517 	} else {
7518 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7519 				ut_params->ibuf, tdata->auth_tag.len);
7520 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7521 				"no room to append digest");
7522 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7523 				ut_params->ibuf,
7524 				plaintext_pad_len + aad_pad_len);
7525 
7526 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7527 			tdata->auth_tag.len);
7528 		debug_hexdump(stdout, "digest:",
7529 			sym_op->aead.digest.data,
7530 			tdata->auth_tag.len);
7531 	}
7532 
7533 	sym_op->aead.data.length = tdata->plaintext.len;
7534 	sym_op->aead.data.offset = aad_pad_len;
7535 
7536 	return 0;
7537 }
7538 
7539 static int
7540 test_authenticated_encryption(const struct aead_test_data *tdata)
7541 {
7542 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7543 	struct crypto_unittest_params *ut_params = &unittest_params;
7544 
7545 	int retval;
7546 	uint8_t *ciphertext, *auth_tag;
7547 	uint16_t plaintext_pad_len;
7548 	uint32_t i;
7549 
7550 	/* Create AEAD session */
7551 	retval = create_aead_session(ts_params->valid_devs[0],
7552 			tdata->algo,
7553 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7554 			tdata->key.data, tdata->key.len,
7555 			tdata->aad.len, tdata->auth_tag.len,
7556 			tdata->iv.len);
7557 	if (retval < 0)
7558 		return retval;
7559 
7560 	if (tdata->aad.len > MBUF_SIZE) {
7561 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7562 		/* Populate full size of add data */
7563 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7564 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7565 	} else
7566 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7567 
7568 	/* clear mbuf payload */
7569 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7570 			rte_pktmbuf_tailroom(ut_params->ibuf));
7571 
7572 	/* Create AEAD operation */
7573 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7574 	if (retval < 0)
7575 		return retval;
7576 
7577 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7578 
7579 	ut_params->op->sym->m_src = ut_params->ibuf;
7580 
7581 	/* Process crypto operation */
7582 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
7583 			ut_params->op), "failed to process sym crypto op");
7584 
7585 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7586 			"crypto op processing failed");
7587 
7588 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7589 
7590 	if (ut_params->op->sym->m_dst) {
7591 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7592 				uint8_t *);
7593 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7594 				uint8_t *, plaintext_pad_len);
7595 	} else {
7596 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7597 				uint8_t *,
7598 				ut_params->op->sym->cipher.data.offset);
7599 		auth_tag = ciphertext + plaintext_pad_len;
7600 	}
7601 
7602 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7603 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7604 
7605 	/* Validate obuf */
7606 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7607 			ciphertext,
7608 			tdata->ciphertext.data,
7609 			tdata->ciphertext.len,
7610 			"Ciphertext data not as expected");
7611 
7612 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7613 			auth_tag,
7614 			tdata->auth_tag.data,
7615 			tdata->auth_tag.len,
7616 			"Generated auth tag not as expected");
7617 
7618 	return 0;
7619 
7620 }
7621 
7622 #ifdef RTE_LIBRTE_SECURITY
7623 /* Basic algorithm run function for async inplace mode.
7624  * Creates a session from input parameters and runs one operation
7625  * on input_vec. Checks the output of the crypto operation against
7626  * output_vec.
7627  */
7628 static int
7629 test_pdcp_proto(int i, int oop,
7630 	enum rte_crypto_cipher_operation opc,
7631 	enum rte_crypto_auth_operation opa,
7632 	uint8_t *input_vec,
7633 	unsigned int input_vec_len,
7634 	uint8_t *output_vec,
7635 	unsigned int output_vec_len)
7636 {
7637 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7638 	struct crypto_unittest_params *ut_params = &unittest_params;
7639 	uint8_t *plaintext;
7640 	int ret = TEST_SUCCESS;
7641 
7642 	/* Generate test mbuf data */
7643 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7644 
7645 	/* clear mbuf payload */
7646 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7647 			rte_pktmbuf_tailroom(ut_params->ibuf));
7648 
7649 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7650 						  input_vec_len);
7651 	memcpy(plaintext, input_vec, input_vec_len);
7652 
7653 	/* Out of place support */
7654 	if (oop) {
7655 		/*
7656 		 * For out-op-place we need to alloc another mbuf
7657 		 */
7658 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7659 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7660 	}
7661 
7662 	/* Set crypto type as IPSEC */
7663 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7664 
7665 	/* Setup Cipher Parameters */
7666 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7667 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
7668 	ut_params->cipher_xform.cipher.op = opc;
7669 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
7670 	ut_params->cipher_xform.cipher.key.length =
7671 					pdcp_test_params[i].cipher_key_len;
7672 	ut_params->cipher_xform.cipher.iv.length = 0;
7673 
7674 	/* Setup HMAC Parameters if ICV header is required */
7675 	if (pdcp_test_params[i].auth_alg != 0) {
7676 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7677 		ut_params->auth_xform.next = NULL;
7678 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
7679 		ut_params->auth_xform.auth.op = opa;
7680 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
7681 		ut_params->auth_xform.auth.key.length =
7682 					pdcp_test_params[i].auth_key_len;
7683 
7684 		ut_params->cipher_xform.next = &ut_params->auth_xform;
7685 	} else {
7686 		ut_params->cipher_xform.next = NULL;
7687 	}
7688 
7689 	struct rte_security_session_conf sess_conf = {
7690 		.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
7691 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
7692 		{.pdcp = {
7693 			.bearer = pdcp_test_bearer[i],
7694 			.domain = pdcp_test_params[i].domain,
7695 			.pkt_dir = pdcp_test_packet_direction[i],
7696 			.sn_size = pdcp_test_data_sn_size[i],
7697 			.hfn = pdcp_test_hfn[i],
7698 			.hfn_threshold = pdcp_test_hfn_threshold[i],
7699 		} },
7700 		.crypto_xform = &ut_params->cipher_xform
7701 	};
7702 
7703 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7704 				rte_cryptodev_get_sec_ctx(
7705 				ts_params->valid_devs[0]);
7706 
7707 	/* Create security session */
7708 	ut_params->sec_session = rte_security_session_create(ctx,
7709 				&sess_conf, ts_params->session_priv_mpool);
7710 
7711 	if (!ut_params->sec_session) {
7712 		printf("TestCase %s()-%d line %d failed %s: ",
7713 			__func__, i, __LINE__, "Failed to allocate session");
7714 		ret = TEST_FAILED;
7715 		goto on_err;
7716 	}
7717 
7718 	/* Generate crypto op data structure */
7719 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7720 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7721 	if (!ut_params->op) {
7722 		printf("TestCase %s()-%d line %d failed %s: ",
7723 			__func__, i, __LINE__,
7724 			"Failed to allocate symmetric crypto operation struct");
7725 		ret = TEST_FAILED;
7726 		goto on_err;
7727 	}
7728 
7729 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
7730 
7731 	/* set crypto operation source mbuf */
7732 	ut_params->op->sym->m_src = ut_params->ibuf;
7733 	if (oop)
7734 		ut_params->op->sym->m_dst = ut_params->obuf;
7735 
7736 	/* Process crypto operation */
7737 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7738 		== NULL) {
7739 		printf("TestCase %s()-%d line %d failed %s: ",
7740 			__func__, i, __LINE__,
7741 			"failed to process sym crypto op");
7742 		ret = TEST_FAILED;
7743 		goto on_err;
7744 	}
7745 
7746 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7747 		printf("TestCase %s()-%d line %d failed %s: ",
7748 			__func__, i, __LINE__, "crypto op processing failed");
7749 		ret = TEST_FAILED;
7750 		goto on_err;
7751 	}
7752 
7753 	/* Validate obuf */
7754 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7755 			uint8_t *);
7756 	if (oop) {
7757 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7758 				uint8_t *);
7759 	}
7760 
7761 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
7762 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7763 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7764 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7765 		ret = TEST_FAILED;
7766 		goto on_err;
7767 	}
7768 
7769 on_err:
7770 	rte_crypto_op_free(ut_params->op);
7771 	ut_params->op = NULL;
7772 
7773 	if (ut_params->sec_session)
7774 		rte_security_session_destroy(ctx, ut_params->sec_session);
7775 	ut_params->sec_session = NULL;
7776 
7777 	rte_pktmbuf_free(ut_params->ibuf);
7778 	ut_params->ibuf = NULL;
7779 	if (oop) {
7780 		rte_pktmbuf_free(ut_params->obuf);
7781 		ut_params->obuf = NULL;
7782 	}
7783 
7784 	return ret;
7785 }
7786 
7787 static int
7788 test_pdcp_proto_SGL(int i, int oop,
7789 	enum rte_crypto_cipher_operation opc,
7790 	enum rte_crypto_auth_operation opa,
7791 	uint8_t *input_vec,
7792 	unsigned int input_vec_len,
7793 	uint8_t *output_vec,
7794 	unsigned int output_vec_len,
7795 	uint32_t fragsz,
7796 	uint32_t fragsz_oop)
7797 {
7798 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7799 	struct crypto_unittest_params *ut_params = &unittest_params;
7800 	uint8_t *plaintext;
7801 	struct rte_mbuf *buf, *buf_oop = NULL;
7802 	int ret = TEST_SUCCESS;
7803 	int to_trn = 0;
7804 	int to_trn_tbl[16];
7805 	int segs = 1;
7806 	unsigned int trn_data = 0;
7807 
7808 	if (fragsz > input_vec_len)
7809 		fragsz = input_vec_len;
7810 
7811 	uint16_t plaintext_len = fragsz;
7812 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7813 
7814 	if (fragsz_oop > output_vec_len)
7815 		frag_size_oop = output_vec_len;
7816 
7817 	int ecx = 0;
7818 	if (input_vec_len % fragsz != 0) {
7819 		if (input_vec_len / fragsz + 1 > 16)
7820 			return 1;
7821 	} else if (input_vec_len / fragsz > 16)
7822 		return 1;
7823 
7824 	/* Out of place support */
7825 	if (oop) {
7826 		/*
7827 		 * For out-op-place we need to alloc another mbuf
7828 		 */
7829 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7830 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7831 		buf_oop = ut_params->obuf;
7832 	}
7833 
7834 	/* Generate test mbuf data */
7835 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7836 
7837 	/* clear mbuf payload */
7838 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7839 			rte_pktmbuf_tailroom(ut_params->ibuf));
7840 
7841 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7842 						  plaintext_len);
7843 	memcpy(plaintext, input_vec, plaintext_len);
7844 	trn_data += plaintext_len;
7845 
7846 	buf = ut_params->ibuf;
7847 
7848 	/*
7849 	 * Loop until no more fragments
7850 	 */
7851 
7852 	while (trn_data < input_vec_len) {
7853 		++segs;
7854 		to_trn = (input_vec_len - trn_data < fragsz) ?
7855 				(input_vec_len - trn_data) : fragsz;
7856 
7857 		to_trn_tbl[ecx++] = to_trn;
7858 
7859 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7860 		buf = buf->next;
7861 
7862 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
7863 				rte_pktmbuf_tailroom(buf));
7864 
7865 		/* OOP */
7866 		if (oop && !fragsz_oop) {
7867 			buf_oop->next =
7868 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
7869 			buf_oop = buf_oop->next;
7870 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7871 					0, rte_pktmbuf_tailroom(buf_oop));
7872 			rte_pktmbuf_append(buf_oop, to_trn);
7873 		}
7874 
7875 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
7876 				to_trn);
7877 
7878 		memcpy(plaintext, input_vec + trn_data, to_trn);
7879 		trn_data += to_trn;
7880 	}
7881 
7882 	ut_params->ibuf->nb_segs = segs;
7883 
7884 	segs = 1;
7885 	if (fragsz_oop && oop) {
7886 		to_trn = 0;
7887 		ecx = 0;
7888 
7889 		trn_data = frag_size_oop;
7890 		while (trn_data < output_vec_len) {
7891 			++segs;
7892 			to_trn =
7893 				(output_vec_len - trn_data <
7894 						frag_size_oop) ?
7895 				(output_vec_len - trn_data) :
7896 						frag_size_oop;
7897 
7898 			to_trn_tbl[ecx++] = to_trn;
7899 
7900 			buf_oop->next =
7901 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
7902 			buf_oop = buf_oop->next;
7903 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7904 					0, rte_pktmbuf_tailroom(buf_oop));
7905 			rte_pktmbuf_append(buf_oop, to_trn);
7906 
7907 			trn_data += to_trn;
7908 		}
7909 		ut_params->obuf->nb_segs = segs;
7910 	}
7911 
7912 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
7913 
7914 	/* Setup Cipher Parameters */
7915 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7916 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
7917 	ut_params->cipher_xform.cipher.op = opc;
7918 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
7919 	ut_params->cipher_xform.cipher.key.length =
7920 					pdcp_test_params[i].cipher_key_len;
7921 	ut_params->cipher_xform.cipher.iv.length = 0;
7922 
7923 	/* Setup HMAC Parameters if ICV header is required */
7924 	if (pdcp_test_params[i].auth_alg != 0) {
7925 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7926 		ut_params->auth_xform.next = NULL;
7927 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
7928 		ut_params->auth_xform.auth.op = opa;
7929 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
7930 		ut_params->auth_xform.auth.key.length =
7931 					pdcp_test_params[i].auth_key_len;
7932 
7933 		ut_params->cipher_xform.next = &ut_params->auth_xform;
7934 	} else {
7935 		ut_params->cipher_xform.next = NULL;
7936 	}
7937 
7938 	struct rte_security_session_conf sess_conf = {
7939 		.action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
7940 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
7941 		{.pdcp = {
7942 			.bearer = pdcp_test_bearer[i],
7943 			.domain = pdcp_test_params[i].domain,
7944 			.pkt_dir = pdcp_test_packet_direction[i],
7945 			.sn_size = pdcp_test_data_sn_size[i],
7946 			.hfn = pdcp_test_hfn[i],
7947 			.hfn_threshold = pdcp_test_hfn_threshold[i],
7948 		} },
7949 		.crypto_xform = &ut_params->cipher_xform
7950 	};
7951 
7952 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7953 				rte_cryptodev_get_sec_ctx(
7954 				ts_params->valid_devs[0]);
7955 
7956 	/* Create security session */
7957 	ut_params->sec_session = rte_security_session_create(ctx,
7958 				&sess_conf, ts_params->session_priv_mpool);
7959 
7960 	if (!ut_params->sec_session) {
7961 		printf("TestCase %s()-%d line %d failed %s: ",
7962 			__func__, i, __LINE__, "Failed to allocate session");
7963 		ret = TEST_FAILED;
7964 		goto on_err;
7965 	}
7966 
7967 	/* Generate crypto op data structure */
7968 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7969 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7970 	if (!ut_params->op) {
7971 		printf("TestCase %s()-%d line %d failed %s: ",
7972 			__func__, i, __LINE__,
7973 			"Failed to allocate symmetric crypto operation struct");
7974 		ret = TEST_FAILED;
7975 		goto on_err;
7976 	}
7977 
7978 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
7979 
7980 	/* set crypto operation source mbuf */
7981 	ut_params->op->sym->m_src = ut_params->ibuf;
7982 	if (oop)
7983 		ut_params->op->sym->m_dst = ut_params->obuf;
7984 
7985 	/* Process crypto operation */
7986 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7987 		== NULL) {
7988 		printf("TestCase %s()-%d line %d failed %s: ",
7989 			__func__, i, __LINE__,
7990 			"failed to process sym crypto op");
7991 		ret = TEST_FAILED;
7992 		goto on_err;
7993 	}
7994 
7995 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7996 		printf("TestCase %s()-%d line %d failed %s: ",
7997 			__func__, i, __LINE__, "crypto op processing failed");
7998 		ret = TEST_FAILED;
7999 		goto on_err;
8000 	}
8001 
8002 	/* Validate obuf */
8003 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8004 			uint8_t *);
8005 	if (oop) {
8006 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8007 				uint8_t *);
8008 	}
8009 	if (fragsz_oop)
8010 		fragsz = frag_size_oop;
8011 	if (memcmp(ciphertext, output_vec, fragsz)) {
8012 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8013 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8014 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8015 		ret = TEST_FAILED;
8016 		goto on_err;
8017 	}
8018 
8019 	buf = ut_params->op->sym->m_src->next;
8020 	if (oop)
8021 		buf = ut_params->op->sym->m_dst->next;
8022 
8023 	unsigned int off = fragsz;
8024 
8025 	ecx = 0;
8026 	while (buf) {
8027 		ciphertext = rte_pktmbuf_mtod(buf,
8028 				uint8_t *);
8029 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8030 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8031 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8032 			rte_hexdump(stdout, "reference", output_vec + off,
8033 					to_trn_tbl[ecx]);
8034 			ret = TEST_FAILED;
8035 			goto on_err;
8036 		}
8037 		off += to_trn_tbl[ecx++];
8038 		buf = buf->next;
8039 	}
8040 on_err:
8041 	rte_crypto_op_free(ut_params->op);
8042 	ut_params->op = NULL;
8043 
8044 	if (ut_params->sec_session)
8045 		rte_security_session_destroy(ctx, ut_params->sec_session);
8046 	ut_params->sec_session = NULL;
8047 
8048 	rte_pktmbuf_free(ut_params->ibuf);
8049 	ut_params->ibuf = NULL;
8050 	if (oop) {
8051 		rte_pktmbuf_free(ut_params->obuf);
8052 		ut_params->obuf = NULL;
8053 	}
8054 
8055 	return ret;
8056 }
8057 
8058 int
8059 test_pdcp_proto_cplane_encap(int i)
8060 {
8061 	return test_pdcp_proto(i, 0,
8062 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8063 		RTE_CRYPTO_AUTH_OP_GENERATE,
8064 		pdcp_test_data_in[i],
8065 		pdcp_test_data_in_len[i],
8066 		pdcp_test_data_out[i],
8067 		pdcp_test_data_in_len[i]+4);
8068 }
8069 
8070 int
8071 test_pdcp_proto_uplane_encap(int i)
8072 {
8073 	return test_pdcp_proto(i, 0,
8074 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8075 		RTE_CRYPTO_AUTH_OP_GENERATE,
8076 		pdcp_test_data_in[i],
8077 		pdcp_test_data_in_len[i],
8078 		pdcp_test_data_out[i],
8079 		pdcp_test_data_in_len[i]);
8080 
8081 }
8082 
8083 int
8084 test_pdcp_proto_uplane_encap_with_int(int i)
8085 {
8086 	return test_pdcp_proto(i, 0,
8087 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8088 		RTE_CRYPTO_AUTH_OP_GENERATE,
8089 		pdcp_test_data_in[i],
8090 		pdcp_test_data_in_len[i],
8091 		pdcp_test_data_out[i],
8092 		pdcp_test_data_in_len[i] + 4);
8093 }
8094 
8095 int
8096 test_pdcp_proto_cplane_decap(int i)
8097 {
8098 	return test_pdcp_proto(i, 0,
8099 		RTE_CRYPTO_CIPHER_OP_DECRYPT,
8100 		RTE_CRYPTO_AUTH_OP_VERIFY,
8101 		pdcp_test_data_out[i],
8102 		pdcp_test_data_in_len[i] + 4,
8103 		pdcp_test_data_in[i],
8104 		pdcp_test_data_in_len[i]);
8105 }
8106 
8107 int
8108 test_pdcp_proto_uplane_decap(int i)
8109 {
8110 	return test_pdcp_proto(i, 0,
8111 		RTE_CRYPTO_CIPHER_OP_DECRYPT,
8112 		RTE_CRYPTO_AUTH_OP_VERIFY,
8113 		pdcp_test_data_out[i],
8114 		pdcp_test_data_in_len[i],
8115 		pdcp_test_data_in[i],
8116 		pdcp_test_data_in_len[i]);
8117 }
8118 
8119 int
8120 test_pdcp_proto_uplane_decap_with_int(int i)
8121 {
8122 	return test_pdcp_proto(i, 0,
8123 		RTE_CRYPTO_CIPHER_OP_DECRYPT,
8124 		RTE_CRYPTO_AUTH_OP_VERIFY,
8125 		pdcp_test_data_out[i],
8126 		pdcp_test_data_in_len[i] + 4,
8127 		pdcp_test_data_in[i],
8128 		pdcp_test_data_in_len[i]);
8129 }
8130 
8131 static int
8132 test_PDCP_PROTO_SGL_in_place_32B(void)
8133 {
8134 	/* i can be used for running any PDCP case
8135 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8136 	 */
8137 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8138 	return test_pdcp_proto_SGL(i, IN_PLACE,
8139 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8140 			RTE_CRYPTO_AUTH_OP_GENERATE,
8141 			pdcp_test_data_in[i],
8142 			pdcp_test_data_in_len[i],
8143 			pdcp_test_data_out[i],
8144 			pdcp_test_data_in_len[i]+4,
8145 			32, 0);
8146 }
8147 static int
8148 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8149 {
8150 	/* i can be used for running any PDCP case
8151 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8152 	 */
8153 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8154 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8155 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8156 			RTE_CRYPTO_AUTH_OP_GENERATE,
8157 			pdcp_test_data_in[i],
8158 			pdcp_test_data_in_len[i],
8159 			pdcp_test_data_out[i],
8160 			pdcp_test_data_in_len[i]+4,
8161 			32, 128);
8162 }
8163 static int
8164 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8165 {
8166 	/* i can be used for running any PDCP case
8167 	 * In this case it is uplane 18-bit AES DL encap
8168 	 */
8169 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8170 			+ DOWNLINK;
8171 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8172 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8173 			RTE_CRYPTO_AUTH_OP_GENERATE,
8174 			pdcp_test_data_in[i],
8175 			pdcp_test_data_in_len[i],
8176 			pdcp_test_data_out[i],
8177 			pdcp_test_data_in_len[i],
8178 			32, 40);
8179 }
8180 static int
8181 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8182 {
8183 	/* i can be used for running any PDCP case
8184 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8185 	 */
8186 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8187 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8188 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8189 			RTE_CRYPTO_AUTH_OP_GENERATE,
8190 			pdcp_test_data_in[i],
8191 			pdcp_test_data_in_len[i],
8192 			pdcp_test_data_out[i],
8193 			pdcp_test_data_in_len[i]+4,
8194 			128, 32);
8195 }
8196 #endif
8197 
8198 static int
8199 test_AES_GCM_authenticated_encryption_test_case_1(void)
8200 {
8201 	return test_authenticated_encryption(&gcm_test_case_1);
8202 }
8203 
8204 static int
8205 test_AES_GCM_authenticated_encryption_test_case_2(void)
8206 {
8207 	return test_authenticated_encryption(&gcm_test_case_2);
8208 }
8209 
8210 static int
8211 test_AES_GCM_authenticated_encryption_test_case_3(void)
8212 {
8213 	return test_authenticated_encryption(&gcm_test_case_3);
8214 }
8215 
8216 static int
8217 test_AES_GCM_authenticated_encryption_test_case_4(void)
8218 {
8219 	return test_authenticated_encryption(&gcm_test_case_4);
8220 }
8221 
8222 static int
8223 test_AES_GCM_authenticated_encryption_test_case_5(void)
8224 {
8225 	return test_authenticated_encryption(&gcm_test_case_5);
8226 }
8227 
8228 static int
8229 test_AES_GCM_authenticated_encryption_test_case_6(void)
8230 {
8231 	return test_authenticated_encryption(&gcm_test_case_6);
8232 }
8233 
8234 static int
8235 test_AES_GCM_authenticated_encryption_test_case_7(void)
8236 {
8237 	return test_authenticated_encryption(&gcm_test_case_7);
8238 }
8239 
8240 static int
8241 test_AES_GCM_authenticated_encryption_test_case_8(void)
8242 {
8243 	return test_authenticated_encryption(&gcm_test_case_8);
8244 }
8245 
8246 static int
8247 test_AES_GCM_auth_encryption_test_case_192_1(void)
8248 {
8249 	return test_authenticated_encryption(&gcm_test_case_192_1);
8250 }
8251 
8252 static int
8253 test_AES_GCM_auth_encryption_test_case_192_2(void)
8254 {
8255 	return test_authenticated_encryption(&gcm_test_case_192_2);
8256 }
8257 
8258 static int
8259 test_AES_GCM_auth_encryption_test_case_192_3(void)
8260 {
8261 	return test_authenticated_encryption(&gcm_test_case_192_3);
8262 }
8263 
8264 static int
8265 test_AES_GCM_auth_encryption_test_case_192_4(void)
8266 {
8267 	return test_authenticated_encryption(&gcm_test_case_192_4);
8268 }
8269 
8270 static int
8271 test_AES_GCM_auth_encryption_test_case_192_5(void)
8272 {
8273 	return test_authenticated_encryption(&gcm_test_case_192_5);
8274 }
8275 
8276 static int
8277 test_AES_GCM_auth_encryption_test_case_192_6(void)
8278 {
8279 	return test_authenticated_encryption(&gcm_test_case_192_6);
8280 }
8281 
8282 static int
8283 test_AES_GCM_auth_encryption_test_case_192_7(void)
8284 {
8285 	return test_authenticated_encryption(&gcm_test_case_192_7);
8286 }
8287 
8288 static int
8289 test_AES_GCM_auth_encryption_test_case_256_1(void)
8290 {
8291 	return test_authenticated_encryption(&gcm_test_case_256_1);
8292 }
8293 
8294 static int
8295 test_AES_GCM_auth_encryption_test_case_256_2(void)
8296 {
8297 	return test_authenticated_encryption(&gcm_test_case_256_2);
8298 }
8299 
8300 static int
8301 test_AES_GCM_auth_encryption_test_case_256_3(void)
8302 {
8303 	return test_authenticated_encryption(&gcm_test_case_256_3);
8304 }
8305 
8306 static int
8307 test_AES_GCM_auth_encryption_test_case_256_4(void)
8308 {
8309 	return test_authenticated_encryption(&gcm_test_case_256_4);
8310 }
8311 
8312 static int
8313 test_AES_GCM_auth_encryption_test_case_256_5(void)
8314 {
8315 	return test_authenticated_encryption(&gcm_test_case_256_5);
8316 }
8317 
8318 static int
8319 test_AES_GCM_auth_encryption_test_case_256_6(void)
8320 {
8321 	return test_authenticated_encryption(&gcm_test_case_256_6);
8322 }
8323 
8324 static int
8325 test_AES_GCM_auth_encryption_test_case_256_7(void)
8326 {
8327 	return test_authenticated_encryption(&gcm_test_case_256_7);
8328 }
8329 
8330 static int
8331 test_AES_GCM_auth_encryption_test_case_aad_1(void)
8332 {
8333 	return test_authenticated_encryption(&gcm_test_case_aad_1);
8334 }
8335 
8336 static int
8337 test_AES_GCM_auth_encryption_test_case_aad_2(void)
8338 {
8339 	return test_authenticated_encryption(&gcm_test_case_aad_2);
8340 }
8341 
8342 static int
8343 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
8344 {
8345 	struct aead_test_data tdata;
8346 	int res;
8347 
8348 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8349 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8350 	tdata.iv.data[0] += 1;
8351 	res = test_authenticated_encryption(&tdata);
8352 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8353 	return TEST_SUCCESS;
8354 }
8355 
8356 static int
8357 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
8358 {
8359 	struct aead_test_data tdata;
8360 	int res;
8361 
8362 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8363 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8364 	tdata.plaintext.data[0] += 1;
8365 	res = test_authenticated_encryption(&tdata);
8366 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8367 	return TEST_SUCCESS;
8368 }
8369 
8370 static int
8371 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
8372 {
8373 	struct aead_test_data tdata;
8374 	int res;
8375 
8376 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8377 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8378 	tdata.ciphertext.data[0] += 1;
8379 	res = test_authenticated_encryption(&tdata);
8380 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8381 	return TEST_SUCCESS;
8382 }
8383 
8384 static int
8385 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
8386 {
8387 	struct aead_test_data tdata;
8388 	int res;
8389 
8390 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8391 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8392 	tdata.aad.len += 1;
8393 	res = test_authenticated_encryption(&tdata);
8394 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8395 	return TEST_SUCCESS;
8396 }
8397 
8398 static int
8399 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
8400 {
8401 	struct aead_test_data tdata;
8402 	uint8_t aad[gcm_test_case_7.aad.len];
8403 	int res;
8404 
8405 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8406 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8407 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
8408 	aad[0] += 1;
8409 	tdata.aad.data = aad;
8410 	res = test_authenticated_encryption(&tdata);
8411 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8412 	return TEST_SUCCESS;
8413 }
8414 
8415 static int
8416 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
8417 {
8418 	struct aead_test_data tdata;
8419 	int res;
8420 
8421 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8422 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8423 	tdata.auth_tag.data[0] += 1;
8424 	res = test_authenticated_encryption(&tdata);
8425 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
8426 	return TEST_SUCCESS;
8427 }
8428 
8429 static int
8430 test_authenticated_decryption(const struct aead_test_data *tdata)
8431 {
8432 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8433 	struct crypto_unittest_params *ut_params = &unittest_params;
8434 
8435 	int retval;
8436 	uint8_t *plaintext;
8437 	uint32_t i;
8438 
8439 	/* Create AEAD session */
8440 	retval = create_aead_session(ts_params->valid_devs[0],
8441 			tdata->algo,
8442 			RTE_CRYPTO_AEAD_OP_DECRYPT,
8443 			tdata->key.data, tdata->key.len,
8444 			tdata->aad.len, tdata->auth_tag.len,
8445 			tdata->iv.len);
8446 	if (retval < 0)
8447 		return retval;
8448 
8449 	/* alloc mbuf and set payload */
8450 	if (tdata->aad.len > MBUF_SIZE) {
8451 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8452 		/* Populate full size of add data */
8453 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8454 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8455 	} else
8456 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8457 
8458 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8459 			rte_pktmbuf_tailroom(ut_params->ibuf));
8460 
8461 	/* Create AEAD operation */
8462 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
8463 	if (retval < 0)
8464 		return retval;
8465 
8466 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8467 
8468 	ut_params->op->sym->m_src = ut_params->ibuf;
8469 
8470 	/* Process crypto operation */
8471 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8472 			ut_params->op), "failed to process sym crypto op");
8473 
8474 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8475 			"crypto op processing failed");
8476 
8477 	if (ut_params->op->sym->m_dst)
8478 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8479 				uint8_t *);
8480 	else
8481 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8482 				uint8_t *,
8483 				ut_params->op->sym->cipher.data.offset);
8484 
8485 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
8486 
8487 	/* Validate obuf */
8488 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8489 			plaintext,
8490 			tdata->plaintext.data,
8491 			tdata->plaintext.len,
8492 			"Plaintext data not as expected");
8493 
8494 	TEST_ASSERT_EQUAL(ut_params->op->status,
8495 			RTE_CRYPTO_OP_STATUS_SUCCESS,
8496 			"Authentication failed");
8497 
8498 	return 0;
8499 }
8500 
8501 static int
8502 test_AES_GCM_authenticated_decryption_test_case_1(void)
8503 {
8504 	return test_authenticated_decryption(&gcm_test_case_1);
8505 }
8506 
8507 static int
8508 test_AES_GCM_authenticated_decryption_test_case_2(void)
8509 {
8510 	return test_authenticated_decryption(&gcm_test_case_2);
8511 }
8512 
8513 static int
8514 test_AES_GCM_authenticated_decryption_test_case_3(void)
8515 {
8516 	return test_authenticated_decryption(&gcm_test_case_3);
8517 }
8518 
8519 static int
8520 test_AES_GCM_authenticated_decryption_test_case_4(void)
8521 {
8522 	return test_authenticated_decryption(&gcm_test_case_4);
8523 }
8524 
8525 static int
8526 test_AES_GCM_authenticated_decryption_test_case_5(void)
8527 {
8528 	return test_authenticated_decryption(&gcm_test_case_5);
8529 }
8530 
8531 static int
8532 test_AES_GCM_authenticated_decryption_test_case_6(void)
8533 {
8534 	return test_authenticated_decryption(&gcm_test_case_6);
8535 }
8536 
8537 static int
8538 test_AES_GCM_authenticated_decryption_test_case_7(void)
8539 {
8540 	return test_authenticated_decryption(&gcm_test_case_7);
8541 }
8542 
8543 static int
8544 test_AES_GCM_authenticated_decryption_test_case_8(void)
8545 {
8546 	return test_authenticated_decryption(&gcm_test_case_8);
8547 }
8548 
8549 static int
8550 test_AES_GCM_auth_decryption_test_case_192_1(void)
8551 {
8552 	return test_authenticated_decryption(&gcm_test_case_192_1);
8553 }
8554 
8555 static int
8556 test_AES_GCM_auth_decryption_test_case_192_2(void)
8557 {
8558 	return test_authenticated_decryption(&gcm_test_case_192_2);
8559 }
8560 
8561 static int
8562 test_AES_GCM_auth_decryption_test_case_192_3(void)
8563 {
8564 	return test_authenticated_decryption(&gcm_test_case_192_3);
8565 }
8566 
8567 static int
8568 test_AES_GCM_auth_decryption_test_case_192_4(void)
8569 {
8570 	return test_authenticated_decryption(&gcm_test_case_192_4);
8571 }
8572 
8573 static int
8574 test_AES_GCM_auth_decryption_test_case_192_5(void)
8575 {
8576 	return test_authenticated_decryption(&gcm_test_case_192_5);
8577 }
8578 
8579 static int
8580 test_AES_GCM_auth_decryption_test_case_192_6(void)
8581 {
8582 	return test_authenticated_decryption(&gcm_test_case_192_6);
8583 }
8584 
8585 static int
8586 test_AES_GCM_auth_decryption_test_case_192_7(void)
8587 {
8588 	return test_authenticated_decryption(&gcm_test_case_192_7);
8589 }
8590 
8591 static int
8592 test_AES_GCM_auth_decryption_test_case_256_1(void)
8593 {
8594 	return test_authenticated_decryption(&gcm_test_case_256_1);
8595 }
8596 
8597 static int
8598 test_AES_GCM_auth_decryption_test_case_256_2(void)
8599 {
8600 	return test_authenticated_decryption(&gcm_test_case_256_2);
8601 }
8602 
8603 static int
8604 test_AES_GCM_auth_decryption_test_case_256_3(void)
8605 {
8606 	return test_authenticated_decryption(&gcm_test_case_256_3);
8607 }
8608 
8609 static int
8610 test_AES_GCM_auth_decryption_test_case_256_4(void)
8611 {
8612 	return test_authenticated_decryption(&gcm_test_case_256_4);
8613 }
8614 
8615 static int
8616 test_AES_GCM_auth_decryption_test_case_256_5(void)
8617 {
8618 	return test_authenticated_decryption(&gcm_test_case_256_5);
8619 }
8620 
8621 static int
8622 test_AES_GCM_auth_decryption_test_case_256_6(void)
8623 {
8624 	return test_authenticated_decryption(&gcm_test_case_256_6);
8625 }
8626 
8627 static int
8628 test_AES_GCM_auth_decryption_test_case_256_7(void)
8629 {
8630 	return test_authenticated_decryption(&gcm_test_case_256_7);
8631 }
8632 
8633 static int
8634 test_AES_GCM_auth_decryption_test_case_aad_1(void)
8635 {
8636 	return test_authenticated_decryption(&gcm_test_case_aad_1);
8637 }
8638 
8639 static int
8640 test_AES_GCM_auth_decryption_test_case_aad_2(void)
8641 {
8642 	return test_authenticated_decryption(&gcm_test_case_aad_2);
8643 }
8644 
8645 static int
8646 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
8647 {
8648 	struct aead_test_data tdata;
8649 	int res;
8650 
8651 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8652 	tdata.iv.data[0] += 1;
8653 	res = test_authenticated_decryption(&tdata);
8654 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8655 	return TEST_SUCCESS;
8656 }
8657 
8658 static int
8659 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
8660 {
8661 	struct aead_test_data tdata;
8662 	int res;
8663 
8664 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
8665 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8666 	tdata.plaintext.data[0] += 1;
8667 	res = test_authenticated_decryption(&tdata);
8668 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8669 	return TEST_SUCCESS;
8670 }
8671 
8672 static int
8673 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
8674 {
8675 	struct aead_test_data tdata;
8676 	int res;
8677 
8678 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8679 	tdata.ciphertext.data[0] += 1;
8680 	res = test_authenticated_decryption(&tdata);
8681 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8682 	return TEST_SUCCESS;
8683 }
8684 
8685 static int
8686 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
8687 {
8688 	struct aead_test_data tdata;
8689 	int res;
8690 
8691 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8692 	tdata.aad.len += 1;
8693 	res = test_authenticated_decryption(&tdata);
8694 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8695 	return TEST_SUCCESS;
8696 }
8697 
8698 static int
8699 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
8700 {
8701 	struct aead_test_data tdata;
8702 	uint8_t aad[gcm_test_case_7.aad.len];
8703 	int res;
8704 
8705 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8706 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
8707 	aad[0] += 1;
8708 	tdata.aad.data = aad;
8709 	res = test_authenticated_decryption(&tdata);
8710 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
8711 	return TEST_SUCCESS;
8712 }
8713 
8714 static int
8715 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
8716 {
8717 	struct aead_test_data tdata;
8718 	int res;
8719 
8720 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
8721 	tdata.auth_tag.data[0] += 1;
8722 	res = test_authenticated_decryption(&tdata);
8723 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
8724 	return TEST_SUCCESS;
8725 }
8726 
8727 static int
8728 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
8729 {
8730 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8731 	struct crypto_unittest_params *ut_params = &unittest_params;
8732 
8733 	int retval;
8734 	uint8_t *ciphertext, *auth_tag;
8735 	uint16_t plaintext_pad_len;
8736 
8737 	/* Create AEAD session */
8738 	retval = create_aead_session(ts_params->valid_devs[0],
8739 			tdata->algo,
8740 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8741 			tdata->key.data, tdata->key.len,
8742 			tdata->aad.len, tdata->auth_tag.len,
8743 			tdata->iv.len);
8744 	if (retval < 0)
8745 		return retval;
8746 
8747 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8748 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8749 
8750 	/* clear mbuf payload */
8751 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8752 			rte_pktmbuf_tailroom(ut_params->ibuf));
8753 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
8754 			rte_pktmbuf_tailroom(ut_params->obuf));
8755 
8756 	/* Create AEAD operation */
8757 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8758 	if (retval < 0)
8759 		return retval;
8760 
8761 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8762 
8763 	ut_params->op->sym->m_src = ut_params->ibuf;
8764 	ut_params->op->sym->m_dst = ut_params->obuf;
8765 
8766 	/* Process crypto operation */
8767 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8768 			ut_params->op), "failed to process sym crypto op");
8769 
8770 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8771 			"crypto op processing failed");
8772 
8773 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8774 
8775 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
8776 			ut_params->op->sym->cipher.data.offset);
8777 	auth_tag = ciphertext + plaintext_pad_len;
8778 
8779 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8780 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8781 
8782 	/* Validate obuf */
8783 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8784 			ciphertext,
8785 			tdata->ciphertext.data,
8786 			tdata->ciphertext.len,
8787 			"Ciphertext data not as expected");
8788 
8789 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8790 			auth_tag,
8791 			tdata->auth_tag.data,
8792 			tdata->auth_tag.len,
8793 			"Generated auth tag not as expected");
8794 
8795 	return 0;
8796 
8797 }
8798 
8799 static int
8800 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
8801 {
8802 	return test_authenticated_encryption_oop(&gcm_test_case_5);
8803 }
8804 
8805 static int
8806 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
8807 {
8808 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8809 	struct crypto_unittest_params *ut_params = &unittest_params;
8810 
8811 	int retval;
8812 	uint8_t *plaintext;
8813 
8814 	/* Create AEAD session */
8815 	retval = create_aead_session(ts_params->valid_devs[0],
8816 			tdata->algo,
8817 			RTE_CRYPTO_AEAD_OP_DECRYPT,
8818 			tdata->key.data, tdata->key.len,
8819 			tdata->aad.len, tdata->auth_tag.len,
8820 			tdata->iv.len);
8821 	if (retval < 0)
8822 		return retval;
8823 
8824 	/* alloc mbuf and set payload */
8825 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8826 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8827 
8828 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8829 			rte_pktmbuf_tailroom(ut_params->ibuf));
8830 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
8831 			rte_pktmbuf_tailroom(ut_params->obuf));
8832 
8833 	/* Create AEAD operation */
8834 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
8835 	if (retval < 0)
8836 		return retval;
8837 
8838 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8839 
8840 	ut_params->op->sym->m_src = ut_params->ibuf;
8841 	ut_params->op->sym->m_dst = ut_params->obuf;
8842 
8843 	/* Process crypto operation */
8844 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8845 			ut_params->op), "failed to process sym crypto op");
8846 
8847 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8848 			"crypto op processing failed");
8849 
8850 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
8851 			ut_params->op->sym->cipher.data.offset);
8852 
8853 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
8854 
8855 	/* Validate obuf */
8856 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8857 			plaintext,
8858 			tdata->plaintext.data,
8859 			tdata->plaintext.len,
8860 			"Plaintext data not as expected");
8861 
8862 	TEST_ASSERT_EQUAL(ut_params->op->status,
8863 			RTE_CRYPTO_OP_STATUS_SUCCESS,
8864 			"Authentication failed");
8865 	return 0;
8866 }
8867 
8868 static int
8869 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
8870 {
8871 	return test_authenticated_decryption_oop(&gcm_test_case_5);
8872 }
8873 
8874 static int
8875 test_authenticated_encryption_sessionless(
8876 		const struct aead_test_data *tdata)
8877 {
8878 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8879 	struct crypto_unittest_params *ut_params = &unittest_params;
8880 
8881 	int retval;
8882 	uint8_t *ciphertext, *auth_tag;
8883 	uint16_t plaintext_pad_len;
8884 	uint8_t key[tdata->key.len + 1];
8885 
8886 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8887 
8888 	/* clear mbuf payload */
8889 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8890 			rte_pktmbuf_tailroom(ut_params->ibuf));
8891 
8892 	/* Create AEAD operation */
8893 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8894 	if (retval < 0)
8895 		return retval;
8896 
8897 	/* Create GCM xform */
8898 	memcpy(key, tdata->key.data, tdata->key.len);
8899 	retval = create_aead_xform(ut_params->op,
8900 			tdata->algo,
8901 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8902 			key, tdata->key.len,
8903 			tdata->aad.len, tdata->auth_tag.len,
8904 			tdata->iv.len);
8905 	if (retval < 0)
8906 		return retval;
8907 
8908 	ut_params->op->sym->m_src = ut_params->ibuf;
8909 
8910 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
8911 			RTE_CRYPTO_OP_SESSIONLESS,
8912 			"crypto op session type not sessionless");
8913 
8914 	/* Process crypto operation */
8915 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8916 			ut_params->op), "failed to process sym crypto op");
8917 
8918 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
8919 
8920 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8921 			"crypto op status not success");
8922 
8923 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8924 
8925 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
8926 			ut_params->op->sym->cipher.data.offset);
8927 	auth_tag = ciphertext + plaintext_pad_len;
8928 
8929 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8930 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8931 
8932 	/* Validate obuf */
8933 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8934 			ciphertext,
8935 			tdata->ciphertext.data,
8936 			tdata->ciphertext.len,
8937 			"Ciphertext data not as expected");
8938 
8939 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8940 			auth_tag,
8941 			tdata->auth_tag.data,
8942 			tdata->auth_tag.len,
8943 			"Generated auth tag not as expected");
8944 
8945 	return 0;
8946 
8947 }
8948 
8949 static int
8950 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
8951 {
8952 	return test_authenticated_encryption_sessionless(
8953 			&gcm_test_case_5);
8954 }
8955 
8956 static int
8957 test_authenticated_decryption_sessionless(
8958 		const struct aead_test_data *tdata)
8959 {
8960 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8961 	struct crypto_unittest_params *ut_params = &unittest_params;
8962 
8963 	int retval;
8964 	uint8_t *plaintext;
8965 	uint8_t key[tdata->key.len + 1];
8966 
8967 	/* alloc mbuf and set payload */
8968 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8969 
8970 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8971 			rte_pktmbuf_tailroom(ut_params->ibuf));
8972 
8973 	/* Create AEAD operation */
8974 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
8975 	if (retval < 0)
8976 		return retval;
8977 
8978 	/* Create AEAD xform */
8979 	memcpy(key, tdata->key.data, tdata->key.len);
8980 	retval = create_aead_xform(ut_params->op,
8981 			tdata->algo,
8982 			RTE_CRYPTO_AEAD_OP_DECRYPT,
8983 			key, tdata->key.len,
8984 			tdata->aad.len, tdata->auth_tag.len,
8985 			tdata->iv.len);
8986 	if (retval < 0)
8987 		return retval;
8988 
8989 	ut_params->op->sym->m_src = ut_params->ibuf;
8990 
8991 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
8992 			RTE_CRYPTO_OP_SESSIONLESS,
8993 			"crypto op session type not sessionless");
8994 
8995 	/* Process crypto operation */
8996 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
8997 			ut_params->op), "failed to process sym crypto op");
8998 
8999 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9000 
9001 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9002 			"crypto op status not success");
9003 
9004 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9005 			ut_params->op->sym->cipher.data.offset);
9006 
9007 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9008 
9009 	/* Validate obuf */
9010 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9011 			plaintext,
9012 			tdata->plaintext.data,
9013 			tdata->plaintext.len,
9014 			"Plaintext data not as expected");
9015 
9016 	TEST_ASSERT_EQUAL(ut_params->op->status,
9017 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9018 			"Authentication failed");
9019 	return 0;
9020 }
9021 
9022 static int
9023 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9024 {
9025 	return test_authenticated_decryption_sessionless(
9026 			&gcm_test_case_5);
9027 }
9028 
9029 static int
9030 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9031 {
9032 	return test_authenticated_encryption(&ccm_test_case_128_1);
9033 }
9034 
9035 static int
9036 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9037 {
9038 	return test_authenticated_encryption(&ccm_test_case_128_2);
9039 }
9040 
9041 static int
9042 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9043 {
9044 	return test_authenticated_encryption(&ccm_test_case_128_3);
9045 }
9046 
9047 static int
9048 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9049 {
9050 	return test_authenticated_decryption(&ccm_test_case_128_1);
9051 }
9052 
9053 static int
9054 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9055 {
9056 	return test_authenticated_decryption(&ccm_test_case_128_2);
9057 }
9058 
9059 static int
9060 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
9061 {
9062 	return test_authenticated_decryption(&ccm_test_case_128_3);
9063 }
9064 
9065 static int
9066 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
9067 {
9068 	return test_authenticated_encryption(&ccm_test_case_192_1);
9069 }
9070 
9071 static int
9072 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
9073 {
9074 	return test_authenticated_encryption(&ccm_test_case_192_2);
9075 }
9076 
9077 static int
9078 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
9079 {
9080 	return test_authenticated_encryption(&ccm_test_case_192_3);
9081 }
9082 
9083 static int
9084 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
9085 {
9086 	return test_authenticated_decryption(&ccm_test_case_192_1);
9087 }
9088 
9089 static int
9090 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
9091 {
9092 	return test_authenticated_decryption(&ccm_test_case_192_2);
9093 }
9094 
9095 static int
9096 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
9097 {
9098 	return test_authenticated_decryption(&ccm_test_case_192_3);
9099 }
9100 
9101 static int
9102 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
9103 {
9104 	return test_authenticated_encryption(&ccm_test_case_256_1);
9105 }
9106 
9107 static int
9108 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
9109 {
9110 	return test_authenticated_encryption(&ccm_test_case_256_2);
9111 }
9112 
9113 static int
9114 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
9115 {
9116 	return test_authenticated_encryption(&ccm_test_case_256_3);
9117 }
9118 
9119 static int
9120 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
9121 {
9122 	return test_authenticated_decryption(&ccm_test_case_256_1);
9123 }
9124 
9125 static int
9126 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
9127 {
9128 	return test_authenticated_decryption(&ccm_test_case_256_2);
9129 }
9130 
9131 static int
9132 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
9133 {
9134 	return test_authenticated_decryption(&ccm_test_case_256_3);
9135 }
9136 
9137 static int
9138 test_stats(void)
9139 {
9140 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9141 	struct rte_cryptodev_stats stats;
9142 	struct rte_cryptodev *dev;
9143 	cryptodev_stats_get_t temp_pfn;
9144 
9145 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
9146 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
9147 			&stats) == -ENODEV),
9148 		"rte_cryptodev_stats_get invalid dev failed");
9149 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
9150 		"rte_cryptodev_stats_get invalid Param failed");
9151 	dev = &rte_cryptodevs[ts_params->valid_devs[0]];
9152 	temp_pfn = dev->dev_ops->stats_get;
9153 	dev->dev_ops->stats_get = (cryptodev_stats_get_t)0;
9154 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
9155 			== -ENOTSUP),
9156 		"rte_cryptodev_stats_get invalid Param failed");
9157 	dev->dev_ops->stats_get = temp_pfn;
9158 
9159 	/* Test expected values */
9160 	ut_setup();
9161 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
9162 	ut_teardown();
9163 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
9164 			&stats),
9165 		"rte_cryptodev_stats_get failed");
9166 	TEST_ASSERT((stats.enqueued_count == 1),
9167 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9168 	TEST_ASSERT((stats.dequeued_count == 1),
9169 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9170 	TEST_ASSERT((stats.enqueue_err_count == 0),
9171 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9172 	TEST_ASSERT((stats.dequeue_err_count == 0),
9173 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9174 
9175 	/* invalid device but should ignore and not reset device stats*/
9176 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
9177 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
9178 			&stats),
9179 		"rte_cryptodev_stats_get failed");
9180 	TEST_ASSERT((stats.enqueued_count == 1),
9181 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9182 
9183 	/* check that a valid reset clears stats */
9184 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
9185 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
9186 			&stats),
9187 					  "rte_cryptodev_stats_get failed");
9188 	TEST_ASSERT((stats.enqueued_count == 0),
9189 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9190 	TEST_ASSERT((stats.dequeued_count == 0),
9191 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
9192 
9193 	return TEST_SUCCESS;
9194 }
9195 
9196 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
9197 				   struct crypto_unittest_params *ut_params,
9198 				   enum rte_crypto_auth_operation op,
9199 				   const struct HMAC_MD5_vector *test_case)
9200 {
9201 	uint8_t key[64];
9202 
9203 	memcpy(key, test_case->key.data, test_case->key.len);
9204 
9205 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9206 	ut_params->auth_xform.next = NULL;
9207 	ut_params->auth_xform.auth.op = op;
9208 
9209 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
9210 
9211 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
9212 	ut_params->auth_xform.auth.key.length = test_case->key.len;
9213 	ut_params->auth_xform.auth.key.data = key;
9214 
9215 	ut_params->sess = rte_cryptodev_sym_session_create(
9216 			ts_params->session_mpool);
9217 
9218 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9219 			ut_params->sess, &ut_params->auth_xform,
9220 			ts_params->session_priv_mpool);
9221 
9222 	if (ut_params->sess == NULL)
9223 		return TEST_FAILED;
9224 
9225 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9226 
9227 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9228 			rte_pktmbuf_tailroom(ut_params->ibuf));
9229 
9230 	return 0;
9231 }
9232 
9233 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
9234 			      const struct HMAC_MD5_vector *test_case,
9235 			      uint8_t **plaintext)
9236 {
9237 	uint16_t plaintext_pad_len;
9238 
9239 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9240 
9241 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
9242 				16);
9243 
9244 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9245 			plaintext_pad_len);
9246 	memcpy(*plaintext, test_case->plaintext.data,
9247 			test_case->plaintext.len);
9248 
9249 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
9250 			ut_params->ibuf, MD5_DIGEST_LEN);
9251 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
9252 			"no room to append digest");
9253 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
9254 			ut_params->ibuf, plaintext_pad_len);
9255 
9256 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
9257 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
9258 			   test_case->auth_tag.len);
9259 	}
9260 
9261 	sym_op->auth.data.offset = 0;
9262 	sym_op->auth.data.length = test_case->plaintext.len;
9263 
9264 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9265 	ut_params->op->sym->m_src = ut_params->ibuf;
9266 
9267 	return 0;
9268 }
9269 
9270 static int
9271 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
9272 {
9273 	uint16_t plaintext_pad_len;
9274 	uint8_t *plaintext, *auth_tag;
9275 
9276 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9277 	struct crypto_unittest_params *ut_params = &unittest_params;
9278 
9279 	if (MD5_HMAC_create_session(ts_params, ut_params,
9280 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
9281 		return TEST_FAILED;
9282 
9283 	/* Generate Crypto op data structure */
9284 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9285 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9286 	TEST_ASSERT_NOT_NULL(ut_params->op,
9287 			"Failed to allocate symmetric crypto operation struct");
9288 
9289 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
9290 				16);
9291 
9292 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
9293 		return TEST_FAILED;
9294 
9295 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9296 			ut_params->op), "failed to process sym crypto op");
9297 
9298 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9299 			"crypto op processing failed");
9300 
9301 	if (ut_params->op->sym->m_dst) {
9302 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
9303 				uint8_t *, plaintext_pad_len);
9304 	} else {
9305 		auth_tag = plaintext + plaintext_pad_len;
9306 	}
9307 
9308 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9309 			auth_tag,
9310 			test_case->auth_tag.data,
9311 			test_case->auth_tag.len,
9312 			"HMAC_MD5 generated tag not as expected");
9313 
9314 	return TEST_SUCCESS;
9315 }
9316 
9317 static int
9318 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
9319 {
9320 	uint8_t *plaintext;
9321 
9322 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9323 	struct crypto_unittest_params *ut_params = &unittest_params;
9324 
9325 	if (MD5_HMAC_create_session(ts_params, ut_params,
9326 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
9327 		return TEST_FAILED;
9328 	}
9329 
9330 	/* Generate Crypto op data structure */
9331 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9332 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9333 	TEST_ASSERT_NOT_NULL(ut_params->op,
9334 			"Failed to allocate symmetric crypto operation struct");
9335 
9336 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
9337 		return TEST_FAILED;
9338 
9339 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9340 			ut_params->op), "failed to process sym crypto op");
9341 
9342 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9343 			"HMAC_MD5 crypto op processing failed");
9344 
9345 	return TEST_SUCCESS;
9346 }
9347 
9348 static int
9349 test_MD5_HMAC_generate_case_1(void)
9350 {
9351 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
9352 }
9353 
9354 static int
9355 test_MD5_HMAC_verify_case_1(void)
9356 {
9357 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
9358 }
9359 
9360 static int
9361 test_MD5_HMAC_generate_case_2(void)
9362 {
9363 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
9364 }
9365 
9366 static int
9367 test_MD5_HMAC_verify_case_2(void)
9368 {
9369 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
9370 }
9371 
9372 static int
9373 test_multi_session(void)
9374 {
9375 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9376 	struct crypto_unittest_params *ut_params = &unittest_params;
9377 
9378 	struct rte_cryptodev_info dev_info;
9379 	struct rte_cryptodev_sym_session **sessions;
9380 
9381 	uint16_t i;
9382 
9383 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
9384 			aes_cbc_key, hmac_sha512_key);
9385 
9386 
9387 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9388 
9389 	sessions = rte_malloc(NULL,
9390 			(sizeof(struct rte_cryptodev_sym_session *) *
9391 			MAX_NB_SESSIONS) + 1, 0);
9392 
9393 	/* Create multiple crypto sessions*/
9394 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
9395 
9396 		sessions[i] = rte_cryptodev_sym_session_create(
9397 				ts_params->session_mpool);
9398 
9399 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9400 				sessions[i], &ut_params->auth_xform,
9401 				ts_params->session_priv_mpool);
9402 		TEST_ASSERT_NOT_NULL(sessions[i],
9403 				"Session creation failed at session number %u",
9404 				i);
9405 
9406 		/* Attempt to send a request on each session */
9407 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
9408 			sessions[i],
9409 			ut_params,
9410 			ts_params,
9411 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
9412 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
9413 			aes_cbc_iv),
9414 			"Failed to perform decrypt on request number %u.", i);
9415 		/* free crypto operation structure */
9416 		if (ut_params->op)
9417 			rte_crypto_op_free(ut_params->op);
9418 
9419 		/*
9420 		 * free mbuf - both obuf and ibuf are usually the same,
9421 		 * so check if they point at the same address is necessary,
9422 		 * to avoid freeing the mbuf twice.
9423 		 */
9424 		if (ut_params->obuf) {
9425 			rte_pktmbuf_free(ut_params->obuf);
9426 			if (ut_params->ibuf == ut_params->obuf)
9427 				ut_params->ibuf = 0;
9428 			ut_params->obuf = 0;
9429 		}
9430 		if (ut_params->ibuf) {
9431 			rte_pktmbuf_free(ut_params->ibuf);
9432 			ut_params->ibuf = 0;
9433 		}
9434 	}
9435 
9436 	/* Next session create should fail */
9437 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9438 			sessions[i], &ut_params->auth_xform,
9439 			ts_params->session_priv_mpool);
9440 	TEST_ASSERT_NULL(sessions[i],
9441 			"Session creation succeeded unexpectedly!");
9442 
9443 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
9444 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
9445 				sessions[i]);
9446 		rte_cryptodev_sym_session_free(sessions[i]);
9447 	}
9448 
9449 	rte_free(sessions);
9450 
9451 	return TEST_SUCCESS;
9452 }
9453 
9454 struct multi_session_params {
9455 	struct crypto_unittest_params ut_params;
9456 	uint8_t *cipher_key;
9457 	uint8_t *hmac_key;
9458 	const uint8_t *cipher;
9459 	const uint8_t *digest;
9460 	uint8_t *iv;
9461 };
9462 
9463 #define MB_SESSION_NUMBER 3
9464 
9465 static int
9466 test_multi_session_random_usage(void)
9467 {
9468 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9469 	struct rte_cryptodev_info dev_info;
9470 	struct rte_cryptodev_sym_session **sessions;
9471 	uint32_t i, j;
9472 	struct multi_session_params ut_paramz[] = {
9473 
9474 		{
9475 			.cipher_key = ms_aes_cbc_key0,
9476 			.hmac_key = ms_hmac_key0,
9477 			.cipher = ms_aes_cbc_cipher0,
9478 			.digest = ms_hmac_digest0,
9479 			.iv = ms_aes_cbc_iv0
9480 		},
9481 		{
9482 			.cipher_key = ms_aes_cbc_key1,
9483 			.hmac_key = ms_hmac_key1,
9484 			.cipher = ms_aes_cbc_cipher1,
9485 			.digest = ms_hmac_digest1,
9486 			.iv = ms_aes_cbc_iv1
9487 		},
9488 		{
9489 			.cipher_key = ms_aes_cbc_key2,
9490 			.hmac_key = ms_hmac_key2,
9491 			.cipher = ms_aes_cbc_cipher2,
9492 			.digest = ms_hmac_digest2,
9493 			.iv = ms_aes_cbc_iv2
9494 		},
9495 
9496 	};
9497 
9498 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9499 
9500 	sessions = rte_malloc(NULL,
9501 			(sizeof(struct rte_cryptodev_sym_session *)
9502 					* MAX_NB_SESSIONS) + 1, 0);
9503 
9504 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
9505 		sessions[i] = rte_cryptodev_sym_session_create(
9506 				ts_params->session_mpool);
9507 
9508 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
9509 				sizeof(struct crypto_unittest_params));
9510 
9511 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
9512 				&ut_paramz[i].ut_params,
9513 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
9514 
9515 		/* Create multiple crypto sessions*/
9516 		rte_cryptodev_sym_session_init(
9517 				ts_params->valid_devs[0],
9518 				sessions[i],
9519 				&ut_paramz[i].ut_params.auth_xform,
9520 				ts_params->session_priv_mpool);
9521 
9522 		TEST_ASSERT_NOT_NULL(sessions[i],
9523 				"Session creation failed at session number %u",
9524 				i);
9525 
9526 	}
9527 
9528 	srand(time(NULL));
9529 	for (i = 0; i < 40000; i++) {
9530 
9531 		j = rand() % MB_SESSION_NUMBER;
9532 
9533 		TEST_ASSERT_SUCCESS(
9534 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
9535 					sessions[j],
9536 					&ut_paramz[j].ut_params,
9537 					ts_params, ut_paramz[j].cipher,
9538 					ut_paramz[j].digest,
9539 					ut_paramz[j].iv),
9540 			"Failed to perform decrypt on request number %u.", i);
9541 
9542 		if (ut_paramz[j].ut_params.op)
9543 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
9544 
9545 		/*
9546 		 * free mbuf - both obuf and ibuf are usually the same,
9547 		 * so check if they point at the same address is necessary,
9548 		 * to avoid freeing the mbuf twice.
9549 		 */
9550 		if (ut_paramz[j].ut_params.obuf) {
9551 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
9552 			if (ut_paramz[j].ut_params.ibuf
9553 					== ut_paramz[j].ut_params.obuf)
9554 				ut_paramz[j].ut_params.ibuf = 0;
9555 			ut_paramz[j].ut_params.obuf = 0;
9556 		}
9557 		if (ut_paramz[j].ut_params.ibuf) {
9558 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
9559 			ut_paramz[j].ut_params.ibuf = 0;
9560 		}
9561 	}
9562 
9563 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
9564 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
9565 				sessions[i]);
9566 		rte_cryptodev_sym_session_free(sessions[i]);
9567 	}
9568 
9569 	rte_free(sessions);
9570 
9571 	return TEST_SUCCESS;
9572 }
9573 
9574 static int
9575 test_null_cipher_only_operation(void)
9576 {
9577 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9578 	struct crypto_unittest_params *ut_params = &unittest_params;
9579 
9580 	/* Generate test mbuf data and space for digest */
9581 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9582 			catch_22_quote, QUOTE_512_BYTES, 0);
9583 
9584 	/* Setup Cipher Parameters */
9585 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9586 	ut_params->cipher_xform.next = NULL;
9587 
9588 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9589 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9590 
9591 	ut_params->sess = rte_cryptodev_sym_session_create(
9592 			ts_params->session_mpool);
9593 
9594 	/* Create Crypto session*/
9595 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9596 				ut_params->sess,
9597 				&ut_params->cipher_xform,
9598 				ts_params->session_priv_mpool);
9599 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9600 
9601 	/* Generate Crypto op data structure */
9602 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9603 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9604 	TEST_ASSERT_NOT_NULL(ut_params->op,
9605 			"Failed to allocate symmetric crypto operation struct");
9606 
9607 	/* Set crypto operation data parameters */
9608 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9609 
9610 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9611 
9612 	/* set crypto operation source mbuf */
9613 	sym_op->m_src = ut_params->ibuf;
9614 
9615 	sym_op->cipher.data.offset = 0;
9616 	sym_op->cipher.data.length = QUOTE_512_BYTES;
9617 
9618 	/* Process crypto operation */
9619 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9620 			ut_params->op);
9621 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9622 
9623 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9624 			"crypto operation processing failed");
9625 
9626 	/* Validate obuf */
9627 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9628 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9629 			catch_22_quote,
9630 			QUOTE_512_BYTES,
9631 			"Ciphertext data not as expected");
9632 
9633 	return TEST_SUCCESS;
9634 }
9635 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
9636 			0xab, 0xab, 0xab, 0xab,
9637 			0xab, 0xab, 0xab, 0xab,
9638 			0xab, 0xab, 0xab, 0xab};
9639 static int
9640 test_null_auth_only_operation(void)
9641 {
9642 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9643 	struct crypto_unittest_params *ut_params = &unittest_params;
9644 	uint8_t *digest;
9645 
9646 	/* Generate test mbuf data and space for digest */
9647 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9648 			catch_22_quote, QUOTE_512_BYTES, 0);
9649 
9650 	/* create a pointer for digest, but don't expect anything to be written
9651 	 * here in a NULL auth algo so no mbuf append done.
9652 	 */
9653 	digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9654 			QUOTE_512_BYTES);
9655 	/* prefill the memory pointed to by digest */
9656 	memcpy(digest, orig_data, sizeof(orig_data));
9657 
9658 	/* Setup HMAC Parameters */
9659 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9660 	ut_params->auth_xform.next = NULL;
9661 
9662 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9663 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9664 
9665 	ut_params->sess = rte_cryptodev_sym_session_create(
9666 			ts_params->session_mpool);
9667 
9668 	/* Create Crypto session*/
9669 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9670 			ut_params->sess, &ut_params->auth_xform,
9671 			ts_params->session_priv_mpool);
9672 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9673 
9674 	/* Generate Crypto op data structure */
9675 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9676 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9677 	TEST_ASSERT_NOT_NULL(ut_params->op,
9678 			"Failed to allocate symmetric crypto operation struct");
9679 
9680 	/* Set crypto operation data parameters */
9681 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9682 
9683 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9684 
9685 	sym_op->m_src = ut_params->ibuf;
9686 
9687 	sym_op->auth.data.offset = 0;
9688 	sym_op->auth.data.length = QUOTE_512_BYTES;
9689 	sym_op->auth.digest.data = digest;
9690 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9691 			QUOTE_512_BYTES);
9692 
9693 	/* Process crypto operation */
9694 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9695 			ut_params->op);
9696 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9697 
9698 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9699 			"crypto operation processing failed");
9700 	/* Make sure memory pointed to by digest hasn't been overwritten */
9701 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9702 			orig_data,
9703 			digest,
9704 			sizeof(orig_data),
9705 			"Memory at digest ptr overwritten unexpectedly");
9706 
9707 	return TEST_SUCCESS;
9708 }
9709 
9710 
9711 static int
9712 test_null_cipher_auth_operation(void)
9713 {
9714 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9715 	struct crypto_unittest_params *ut_params = &unittest_params;
9716 	uint8_t *digest;
9717 
9718 	/* Generate test mbuf data and space for digest */
9719 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9720 			catch_22_quote, QUOTE_512_BYTES, 0);
9721 
9722 	/* create a pointer for digest, but don't expect anything to be written
9723 	 * here in a NULL auth algo so no mbuf append done.
9724 	 */
9725 	digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9726 			QUOTE_512_BYTES);
9727 	/* prefill the memory pointed to by digest */
9728 	memcpy(digest, orig_data, sizeof(orig_data));
9729 
9730 	/* Setup Cipher Parameters */
9731 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9732 	ut_params->cipher_xform.next = &ut_params->auth_xform;
9733 
9734 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9735 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9736 
9737 	/* Setup HMAC Parameters */
9738 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9739 	ut_params->auth_xform.next = NULL;
9740 
9741 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9742 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9743 
9744 	ut_params->sess = rte_cryptodev_sym_session_create(
9745 			ts_params->session_mpool);
9746 
9747 	/* Create Crypto session*/
9748 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9749 			ut_params->sess, &ut_params->cipher_xform,
9750 			ts_params->session_priv_mpool);
9751 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9752 
9753 	/* Generate Crypto op data structure */
9754 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9755 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9756 	TEST_ASSERT_NOT_NULL(ut_params->op,
9757 			"Failed to allocate symmetric crypto operation struct");
9758 
9759 	/* Set crypto operation data parameters */
9760 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9761 
9762 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9763 
9764 	sym_op->m_src = ut_params->ibuf;
9765 
9766 	sym_op->cipher.data.offset = 0;
9767 	sym_op->cipher.data.length = QUOTE_512_BYTES;
9768 
9769 	sym_op->auth.data.offset = 0;
9770 	sym_op->auth.data.length = QUOTE_512_BYTES;
9771 	sym_op->auth.digest.data = digest;
9772 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9773 			QUOTE_512_BYTES);
9774 
9775 	/* Process crypto operation */
9776 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9777 			ut_params->op);
9778 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9779 
9780 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9781 			"crypto operation processing failed");
9782 
9783 	/* Validate obuf */
9784 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9785 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9786 			catch_22_quote,
9787 			QUOTE_512_BYTES,
9788 			"Ciphertext data not as expected");
9789 	/* Make sure memory pointed to by digest hasn't been overwritten */
9790 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9791 			orig_data,
9792 			digest,
9793 			sizeof(orig_data),
9794 			"Memory at digest ptr overwritten unexpectedly");
9795 
9796 	return TEST_SUCCESS;
9797 }
9798 
9799 static int
9800 test_null_auth_cipher_operation(void)
9801 {
9802 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9803 	struct crypto_unittest_params *ut_params = &unittest_params;
9804 	uint8_t *digest;
9805 
9806 	/* Generate test mbuf data */
9807 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
9808 			catch_22_quote, QUOTE_512_BYTES, 0);
9809 
9810 	/* create a pointer for digest, but don't expect anything to be written
9811 	 * here in a NULL auth algo so no mbuf append done.
9812 	 */
9813 	digest = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9814 				QUOTE_512_BYTES);
9815 	/* prefill the memory pointed to by digest */
9816 	memcpy(digest, orig_data, sizeof(orig_data));
9817 
9818 	/* Setup Cipher Parameters */
9819 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9820 	ut_params->cipher_xform.next = NULL;
9821 
9822 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9823 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9824 
9825 	/* Setup HMAC Parameters */
9826 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9827 	ut_params->auth_xform.next = &ut_params->cipher_xform;
9828 
9829 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9830 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9831 
9832 	ut_params->sess = rte_cryptodev_sym_session_create(
9833 			ts_params->session_mpool);
9834 
9835 	/* Create Crypto session*/
9836 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9837 			ut_params->sess, &ut_params->cipher_xform,
9838 			ts_params->session_priv_mpool);
9839 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9840 
9841 	/* Generate Crypto op data structure */
9842 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9843 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9844 	TEST_ASSERT_NOT_NULL(ut_params->op,
9845 			"Failed to allocate symmetric crypto operation struct");
9846 
9847 	/* Set crypto operation data parameters */
9848 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9849 
9850 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
9851 
9852 	sym_op->m_src = ut_params->ibuf;
9853 
9854 	sym_op->cipher.data.offset = 0;
9855 	sym_op->cipher.data.length = QUOTE_512_BYTES;
9856 
9857 	sym_op->auth.data.offset = 0;
9858 	sym_op->auth.data.length = QUOTE_512_BYTES;
9859 	sym_op->auth.digest.data = digest;
9860 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(ut_params->ibuf,
9861 					QUOTE_512_BYTES);
9862 
9863 	/* Process crypto operation */
9864 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
9865 			ut_params->op);
9866 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
9867 
9868 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9869 			"crypto operation processing failed");
9870 
9871 	/* Validate obuf */
9872 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9873 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
9874 			catch_22_quote,
9875 			QUOTE_512_BYTES,
9876 			"Ciphertext data not as expected");
9877 	/* Make sure memory pointed to by digest hasn't been overwritten */
9878 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9879 			orig_data,
9880 			digest,
9881 			sizeof(orig_data),
9882 			"Memory at digest ptr overwritten unexpectedly");
9883 
9884 	return TEST_SUCCESS;
9885 }
9886 
9887 
9888 static int
9889 test_null_invalid_operation(void)
9890 {
9891 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9892 	struct crypto_unittest_params *ut_params = &unittest_params;
9893 	int ret;
9894 
9895 	/* Setup Cipher Parameters */
9896 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9897 	ut_params->cipher_xform.next = NULL;
9898 
9899 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
9900 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9901 
9902 	ut_params->sess = rte_cryptodev_sym_session_create(
9903 			ts_params->session_mpool);
9904 
9905 	/* Create Crypto session*/
9906 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9907 			ut_params->sess, &ut_params->cipher_xform,
9908 			ts_params->session_priv_mpool);
9909 	TEST_ASSERT(ret < 0,
9910 			"Session creation succeeded unexpectedly");
9911 
9912 
9913 	/* Setup HMAC Parameters */
9914 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9915 	ut_params->auth_xform.next = NULL;
9916 
9917 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
9918 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9919 
9920 	ut_params->sess = rte_cryptodev_sym_session_create(
9921 			ts_params->session_mpool);
9922 
9923 	/* Create Crypto session*/
9924 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9925 			ut_params->sess, &ut_params->auth_xform,
9926 			ts_params->session_priv_mpool);
9927 	TEST_ASSERT(ret < 0,
9928 			"Session creation succeeded unexpectedly");
9929 
9930 	return TEST_SUCCESS;
9931 }
9932 
9933 
9934 #define NULL_BURST_LENGTH (32)
9935 
9936 static int
9937 test_null_burst_operation(void)
9938 {
9939 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9940 	struct crypto_unittest_params *ut_params = &unittest_params;
9941 
9942 	unsigned i, burst_len = NULL_BURST_LENGTH;
9943 
9944 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
9945 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
9946 
9947 	/* Setup Cipher Parameters */
9948 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9949 	ut_params->cipher_xform.next = &ut_params->auth_xform;
9950 
9951 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
9952 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9953 
9954 	/* Setup HMAC Parameters */
9955 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
9956 	ut_params->auth_xform.next = NULL;
9957 
9958 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
9959 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
9960 
9961 	ut_params->sess = rte_cryptodev_sym_session_create(
9962 			ts_params->session_mpool);
9963 
9964 	/* Create Crypto session*/
9965 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
9966 			ut_params->sess, &ut_params->cipher_xform,
9967 			ts_params->session_priv_mpool);
9968 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
9969 
9970 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
9971 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
9972 			burst_len, "failed to generate burst of crypto ops");
9973 
9974 	/* Generate an operation for each mbuf in burst */
9975 	for (i = 0; i < burst_len; i++) {
9976 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9977 
9978 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
9979 
9980 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
9981 				sizeof(unsigned));
9982 		*data = i;
9983 
9984 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
9985 
9986 		burst[i]->sym->m_src = m;
9987 	}
9988 
9989 	/* Process crypto operation */
9990 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
9991 			0, burst, burst_len),
9992 			burst_len,
9993 			"Error enqueuing burst");
9994 
9995 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
9996 			0, burst_dequeued, burst_len),
9997 			burst_len,
9998 			"Error dequeuing burst");
9999 
10000 
10001 	for (i = 0; i < burst_len; i++) {
10002 		TEST_ASSERT_EQUAL(
10003 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10004 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10005 					uint32_t *),
10006 			"data not as expected");
10007 
10008 		rte_pktmbuf_free(burst[i]->sym->m_src);
10009 		rte_crypto_op_free(burst[i]);
10010 	}
10011 
10012 	return TEST_SUCCESS;
10013 }
10014 
10015 static void
10016 generate_gmac_large_plaintext(uint8_t *data)
10017 {
10018 	uint16_t i;
10019 
10020 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10021 		memcpy(&data[i], &data[0], 32);
10022 }
10023 
10024 static int
10025 create_gmac_operation(enum rte_crypto_auth_operation op,
10026 		const struct gmac_test_data *tdata)
10027 {
10028 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10029 	struct crypto_unittest_params *ut_params = &unittest_params;
10030 	struct rte_crypto_sym_op *sym_op;
10031 
10032 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10033 
10034 	/* Generate Crypto op data structure */
10035 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10036 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10037 	TEST_ASSERT_NOT_NULL(ut_params->op,
10038 			"Failed to allocate symmetric crypto operation struct");
10039 
10040 	sym_op = ut_params->op->sym;
10041 
10042 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10043 			ut_params->ibuf, tdata->gmac_tag.len);
10044 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10045 			"no room to append digest");
10046 
10047 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10048 			ut_params->ibuf, plaintext_pad_len);
10049 
10050 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10051 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
10052 				tdata->gmac_tag.len);
10053 		debug_hexdump(stdout, "digest:",
10054 				sym_op->auth.digest.data,
10055 				tdata->gmac_tag.len);
10056 	}
10057 
10058 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
10059 			uint8_t *, IV_OFFSET);
10060 
10061 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
10062 
10063 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
10064 
10065 	sym_op->cipher.data.length = 0;
10066 	sym_op->cipher.data.offset = 0;
10067 
10068 	sym_op->auth.data.offset = 0;
10069 	sym_op->auth.data.length = tdata->plaintext.len;
10070 
10071 	return 0;
10072 }
10073 
10074 static int create_gmac_session(uint8_t dev_id,
10075 		const struct gmac_test_data *tdata,
10076 		enum rte_crypto_auth_operation auth_op)
10077 {
10078 	uint8_t auth_key[tdata->key.len];
10079 
10080 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10081 	struct crypto_unittest_params *ut_params = &unittest_params;
10082 
10083 	memcpy(auth_key, tdata->key.data, tdata->key.len);
10084 
10085 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10086 	ut_params->auth_xform.next = NULL;
10087 
10088 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
10089 	ut_params->auth_xform.auth.op = auth_op;
10090 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
10091 	ut_params->auth_xform.auth.key.length = tdata->key.len;
10092 	ut_params->auth_xform.auth.key.data = auth_key;
10093 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
10094 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
10095 
10096 
10097 	ut_params->sess = rte_cryptodev_sym_session_create(
10098 			ts_params->session_mpool);
10099 
10100 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10101 			&ut_params->auth_xform,
10102 			ts_params->session_priv_mpool);
10103 
10104 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10105 
10106 	return 0;
10107 }
10108 
10109 static int
10110 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
10111 {
10112 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10113 	struct crypto_unittest_params *ut_params = &unittest_params;
10114 
10115 	int retval;
10116 
10117 	uint8_t *auth_tag, *plaintext;
10118 	uint16_t plaintext_pad_len;
10119 
10120 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
10121 			      "No GMAC length in the source data");
10122 
10123 	retval = create_gmac_session(ts_params->valid_devs[0],
10124 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
10125 
10126 	if (retval < 0)
10127 		return retval;
10128 
10129 	if (tdata->plaintext.len > MBUF_SIZE)
10130 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10131 	else
10132 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10133 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10134 			"Failed to allocate input buffer in mempool");
10135 
10136 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10137 			rte_pktmbuf_tailroom(ut_params->ibuf));
10138 
10139 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10140 	/*
10141 	 * Runtime generate the large plain text instead of use hard code
10142 	 * plain text vector. It is done to avoid create huge source file
10143 	 * with the test vector.
10144 	 */
10145 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
10146 		generate_gmac_large_plaintext(tdata->plaintext.data);
10147 
10148 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10149 				plaintext_pad_len);
10150 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10151 
10152 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
10153 	debug_hexdump(stdout, "plaintext:", plaintext,
10154 			tdata->plaintext.len);
10155 
10156 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
10157 			tdata);
10158 
10159 	if (retval < 0)
10160 		return retval;
10161 
10162 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10163 
10164 	ut_params->op->sym->m_src = ut_params->ibuf;
10165 
10166 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10167 			ut_params->op), "failed to process sym crypto op");
10168 
10169 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10170 			"crypto op processing failed");
10171 
10172 	if (ut_params->op->sym->m_dst) {
10173 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10174 				uint8_t *, plaintext_pad_len);
10175 	} else {
10176 		auth_tag = plaintext + plaintext_pad_len;
10177 	}
10178 
10179 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
10180 
10181 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10182 			auth_tag,
10183 			tdata->gmac_tag.data,
10184 			tdata->gmac_tag.len,
10185 			"GMAC Generated auth tag not as expected");
10186 
10187 	return 0;
10188 }
10189 
10190 static int
10191 test_AES_GMAC_authentication_test_case_1(void)
10192 {
10193 	return test_AES_GMAC_authentication(&gmac_test_case_1);
10194 }
10195 
10196 static int
10197 test_AES_GMAC_authentication_test_case_2(void)
10198 {
10199 	return test_AES_GMAC_authentication(&gmac_test_case_2);
10200 }
10201 
10202 static int
10203 test_AES_GMAC_authentication_test_case_3(void)
10204 {
10205 	return test_AES_GMAC_authentication(&gmac_test_case_3);
10206 }
10207 
10208 static int
10209 test_AES_GMAC_authentication_test_case_4(void)
10210 {
10211 	return test_AES_GMAC_authentication(&gmac_test_case_4);
10212 }
10213 
10214 static int
10215 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
10216 {
10217 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10218 	struct crypto_unittest_params *ut_params = &unittest_params;
10219 	int retval;
10220 	uint32_t plaintext_pad_len;
10221 	uint8_t *plaintext;
10222 
10223 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
10224 			      "No GMAC length in the source data");
10225 
10226 	retval = create_gmac_session(ts_params->valid_devs[0],
10227 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
10228 
10229 	if (retval < 0)
10230 		return retval;
10231 
10232 	if (tdata->plaintext.len > MBUF_SIZE)
10233 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10234 	else
10235 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10236 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10237 			"Failed to allocate input buffer in mempool");
10238 
10239 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10240 			rte_pktmbuf_tailroom(ut_params->ibuf));
10241 
10242 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10243 
10244 	/*
10245 	 * Runtime generate the large plain text instead of use hard code
10246 	 * plain text vector. It is done to avoid create huge source file
10247 	 * with the test vector.
10248 	 */
10249 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
10250 		generate_gmac_large_plaintext(tdata->plaintext.data);
10251 
10252 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10253 				plaintext_pad_len);
10254 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10255 
10256 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
10257 	debug_hexdump(stdout, "plaintext:", plaintext,
10258 			tdata->plaintext.len);
10259 
10260 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
10261 			tdata);
10262 
10263 	if (retval < 0)
10264 		return retval;
10265 
10266 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10267 
10268 	ut_params->op->sym->m_src = ut_params->ibuf;
10269 
10270 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10271 			ut_params->op), "failed to process sym crypto op");
10272 
10273 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10274 			"crypto op processing failed");
10275 
10276 	return 0;
10277 
10278 }
10279 
10280 static int
10281 test_AES_GMAC_authentication_verify_test_case_1(void)
10282 {
10283 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
10284 }
10285 
10286 static int
10287 test_AES_GMAC_authentication_verify_test_case_2(void)
10288 {
10289 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
10290 }
10291 
10292 static int
10293 test_AES_GMAC_authentication_verify_test_case_3(void)
10294 {
10295 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
10296 }
10297 
10298 static int
10299 test_AES_GMAC_authentication_verify_test_case_4(void)
10300 {
10301 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
10302 }
10303 
10304 struct test_crypto_vector {
10305 	enum rte_crypto_cipher_algorithm crypto_algo;
10306 	unsigned int cipher_offset;
10307 	unsigned int cipher_len;
10308 
10309 	struct {
10310 		uint8_t data[64];
10311 		unsigned int len;
10312 	} cipher_key;
10313 
10314 	struct {
10315 		uint8_t data[64];
10316 		unsigned int len;
10317 	} iv;
10318 
10319 	struct {
10320 		const uint8_t *data;
10321 		unsigned int len;
10322 	} plaintext;
10323 
10324 	struct {
10325 		const uint8_t *data;
10326 		unsigned int len;
10327 	} ciphertext;
10328 
10329 	enum rte_crypto_auth_algorithm auth_algo;
10330 	unsigned int auth_offset;
10331 
10332 	struct {
10333 		uint8_t data[128];
10334 		unsigned int len;
10335 	} auth_key;
10336 
10337 	struct {
10338 		const uint8_t *data;
10339 		unsigned int len;
10340 	} aad;
10341 
10342 	struct {
10343 		uint8_t data[128];
10344 		unsigned int len;
10345 	} digest;
10346 };
10347 
10348 static const struct test_crypto_vector
10349 hmac_sha1_test_crypto_vector = {
10350 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10351 	.plaintext = {
10352 		.data = plaintext_hash,
10353 		.len = 512
10354 	},
10355 	.auth_key = {
10356 		.data = {
10357 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10358 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10359 			0xDE, 0xF4, 0xDE, 0xAD
10360 		},
10361 		.len = 20
10362 	},
10363 	.digest = {
10364 		.data = {
10365 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
10366 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
10367 			0x3F, 0x91, 0x64, 0x59
10368 		},
10369 		.len = 20
10370 	}
10371 };
10372 
10373 static const struct test_crypto_vector
10374 aes128_gmac_test_vector = {
10375 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
10376 	.plaintext = {
10377 		.data = plaintext_hash,
10378 		.len = 512
10379 	},
10380 	.iv = {
10381 		.data = {
10382 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10383 			0x08, 0x09, 0x0A, 0x0B
10384 		},
10385 		.len = 12
10386 	},
10387 	.auth_key = {
10388 		.data = {
10389 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
10390 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
10391 		},
10392 		.len = 16
10393 	},
10394 	.digest = {
10395 		.data = {
10396 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
10397 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
10398 		},
10399 		.len = 16
10400 	}
10401 };
10402 
10403 static const struct test_crypto_vector
10404 aes128cbc_hmac_sha1_test_vector = {
10405 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
10406 	.cipher_offset = 0,
10407 	.cipher_len = 512,
10408 	.cipher_key = {
10409 		.data = {
10410 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
10411 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
10412 		},
10413 		.len = 16
10414 	},
10415 	.iv = {
10416 		.data = {
10417 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10418 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
10419 		},
10420 		.len = 16
10421 	},
10422 	.plaintext = {
10423 		.data = plaintext_hash,
10424 		.len = 512
10425 	},
10426 	.ciphertext = {
10427 		.data = ciphertext512_aes128cbc,
10428 		.len = 512
10429 	},
10430 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10431 	.auth_offset = 0,
10432 	.auth_key = {
10433 		.data = {
10434 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10435 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10436 			0xDE, 0xF4, 0xDE, 0xAD
10437 		},
10438 		.len = 20
10439 	},
10440 	.digest = {
10441 		.data = {
10442 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
10443 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
10444 			0x18, 0x8C, 0x1D, 0x32
10445 		},
10446 		.len = 20
10447 	}
10448 };
10449 
10450 static const struct test_crypto_vector
10451 aes128cbc_hmac_sha1_aad_test_vector = {
10452 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
10453 	.cipher_offset = 12,
10454 	.cipher_len = 496,
10455 	.cipher_key = {
10456 		.data = {
10457 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
10458 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
10459 		},
10460 		.len = 16
10461 	},
10462 	.iv = {
10463 		.data = {
10464 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10465 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
10466 		},
10467 		.len = 16
10468 	},
10469 	.plaintext = {
10470 		.data = plaintext_hash,
10471 		.len = 512
10472 	},
10473 	.ciphertext = {
10474 		.data = ciphertext512_aes128cbc_aad,
10475 		.len = 512
10476 	},
10477 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
10478 	.auth_offset = 0,
10479 	.auth_key = {
10480 		.data = {
10481 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
10482 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
10483 			0xDE, 0xF4, 0xDE, 0xAD
10484 		},
10485 		.len = 20
10486 	},
10487 	.digest = {
10488 		.data = {
10489 			0x1F, 0x6A, 0xD2, 0x8B, 0x4B, 0xB3, 0xC0, 0x9E,
10490 			0x86, 0x9B, 0x3A, 0xF2, 0x00, 0x5B, 0x4F, 0x08,
10491 			0x62, 0x8D, 0x62, 0x65
10492 		},
10493 		.len = 20
10494 	}
10495 };
10496 
10497 static void
10498 data_corruption(uint8_t *data)
10499 {
10500 	data[0] += 1;
10501 }
10502 
10503 static void
10504 tag_corruption(uint8_t *data, unsigned int tag_offset)
10505 {
10506 	data[tag_offset] += 1;
10507 }
10508 
10509 static int
10510 create_auth_session(struct crypto_unittest_params *ut_params,
10511 		uint8_t dev_id,
10512 		const struct test_crypto_vector *reference,
10513 		enum rte_crypto_auth_operation auth_op)
10514 {
10515 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10516 	uint8_t auth_key[reference->auth_key.len + 1];
10517 
10518 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10519 
10520 	/* Setup Authentication Parameters */
10521 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10522 	ut_params->auth_xform.auth.op = auth_op;
10523 	ut_params->auth_xform.next = NULL;
10524 	ut_params->auth_xform.auth.algo = reference->auth_algo;
10525 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10526 	ut_params->auth_xform.auth.key.data = auth_key;
10527 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
10528 
10529 	/* Create Crypto session*/
10530 	ut_params->sess = rte_cryptodev_sym_session_create(
10531 			ts_params->session_mpool);
10532 
10533 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10534 				&ut_params->auth_xform,
10535 				ts_params->session_priv_mpool);
10536 
10537 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10538 
10539 	return 0;
10540 }
10541 
10542 static int
10543 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
10544 		uint8_t dev_id,
10545 		const struct test_crypto_vector *reference,
10546 		enum rte_crypto_auth_operation auth_op,
10547 		enum rte_crypto_cipher_operation cipher_op)
10548 {
10549 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10550 	uint8_t cipher_key[reference->cipher_key.len + 1];
10551 	uint8_t auth_key[reference->auth_key.len + 1];
10552 
10553 	memcpy(cipher_key, reference->cipher_key.data,
10554 			reference->cipher_key.len);
10555 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10556 
10557 	/* Setup Authentication Parameters */
10558 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10559 	ut_params->auth_xform.auth.op = auth_op;
10560 	ut_params->auth_xform.auth.algo = reference->auth_algo;
10561 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10562 	ut_params->auth_xform.auth.key.data = auth_key;
10563 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
10564 
10565 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
10566 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
10567 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
10568 	} else {
10569 		ut_params->auth_xform.next = &ut_params->cipher_xform;
10570 
10571 		/* Setup Cipher Parameters */
10572 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10573 		ut_params->cipher_xform.next = NULL;
10574 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
10575 		ut_params->cipher_xform.cipher.op = cipher_op;
10576 		ut_params->cipher_xform.cipher.key.data = cipher_key;
10577 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
10578 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10579 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
10580 	}
10581 
10582 	/* Create Crypto session*/
10583 	ut_params->sess = rte_cryptodev_sym_session_create(
10584 			ts_params->session_mpool);
10585 
10586 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10587 				&ut_params->auth_xform,
10588 				ts_params->session_priv_mpool);
10589 
10590 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10591 
10592 	return 0;
10593 }
10594 
10595 static int
10596 create_auth_operation(struct crypto_testsuite_params *ts_params,
10597 		struct crypto_unittest_params *ut_params,
10598 		const struct test_crypto_vector *reference,
10599 		unsigned int auth_generate)
10600 {
10601 	/* Generate Crypto op data structure */
10602 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10603 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10604 	TEST_ASSERT_NOT_NULL(ut_params->op,
10605 			"Failed to allocate pktmbuf offload");
10606 
10607 	/* Set crypto operation data parameters */
10608 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10609 
10610 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10611 
10612 	/* set crypto operation source mbuf */
10613 	sym_op->m_src = ut_params->ibuf;
10614 
10615 	/* digest */
10616 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10617 			ut_params->ibuf, reference->digest.len);
10618 
10619 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10620 			"no room to append auth tag");
10621 
10622 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10623 			ut_params->ibuf, reference->plaintext.len);
10624 
10625 	if (auth_generate)
10626 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
10627 	else
10628 		memcpy(sym_op->auth.digest.data,
10629 				reference->digest.data,
10630 				reference->digest.len);
10631 
10632 	debug_hexdump(stdout, "digest:",
10633 			sym_op->auth.digest.data,
10634 			reference->digest.len);
10635 
10636 	sym_op->auth.data.length = reference->plaintext.len;
10637 	sym_op->auth.data.offset = 0;
10638 
10639 	return 0;
10640 }
10641 
10642 static int
10643 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
10644 		struct crypto_unittest_params *ut_params,
10645 		const struct test_crypto_vector *reference,
10646 		unsigned int auth_generate)
10647 {
10648 	/* Generate Crypto op data structure */
10649 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10650 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10651 	TEST_ASSERT_NOT_NULL(ut_params->op,
10652 			"Failed to allocate pktmbuf offload");
10653 
10654 	/* Set crypto operation data parameters */
10655 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10656 
10657 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10658 
10659 	/* set crypto operation source mbuf */
10660 	sym_op->m_src = ut_params->ibuf;
10661 
10662 	/* digest */
10663 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10664 			ut_params->ibuf, reference->digest.len);
10665 
10666 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10667 			"no room to append auth tag");
10668 
10669 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10670 			ut_params->ibuf, reference->ciphertext.len);
10671 
10672 	if (auth_generate)
10673 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
10674 	else
10675 		memcpy(sym_op->auth.digest.data,
10676 				reference->digest.data,
10677 				reference->digest.len);
10678 
10679 	debug_hexdump(stdout, "digest:",
10680 			sym_op->auth.digest.data,
10681 			reference->digest.len);
10682 
10683 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
10684 			reference->iv.data, reference->iv.len);
10685 
10686 	sym_op->cipher.data.length = 0;
10687 	sym_op->cipher.data.offset = 0;
10688 
10689 	sym_op->auth.data.length = reference->plaintext.len;
10690 	sym_op->auth.data.offset = 0;
10691 
10692 	return 0;
10693 }
10694 
10695 static int
10696 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
10697 		struct crypto_unittest_params *ut_params,
10698 		const struct test_crypto_vector *reference,
10699 		unsigned int auth_generate)
10700 {
10701 	/* Generate Crypto op data structure */
10702 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10703 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10704 	TEST_ASSERT_NOT_NULL(ut_params->op,
10705 			"Failed to allocate pktmbuf offload");
10706 
10707 	/* Set crypto operation data parameters */
10708 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10709 
10710 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10711 
10712 	/* set crypto operation source mbuf */
10713 	sym_op->m_src = ut_params->ibuf;
10714 
10715 	/* digest */
10716 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10717 			ut_params->ibuf, reference->digest.len);
10718 
10719 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10720 			"no room to append auth tag");
10721 
10722 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10723 			ut_params->ibuf, reference->ciphertext.len);
10724 
10725 	if (auth_generate)
10726 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
10727 	else
10728 		memcpy(sym_op->auth.digest.data,
10729 				reference->digest.data,
10730 				reference->digest.len);
10731 
10732 	debug_hexdump(stdout, "digest:",
10733 			sym_op->auth.digest.data,
10734 			reference->digest.len);
10735 
10736 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
10737 			reference->iv.data, reference->iv.len);
10738 
10739 	sym_op->cipher.data.length = reference->cipher_len;
10740 	sym_op->cipher.data.offset = reference->cipher_offset;
10741 
10742 	sym_op->auth.data.length = reference->plaintext.len;
10743 	sym_op->auth.data.offset = reference->auth_offset;
10744 
10745 	return 0;
10746 }
10747 
10748 static int
10749 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
10750 		struct crypto_unittest_params *ut_params,
10751 		const struct test_crypto_vector *reference)
10752 {
10753 	return create_auth_operation(ts_params, ut_params, reference, 0);
10754 }
10755 
10756 static int
10757 create_auth_verify_GMAC_operation(
10758 		struct crypto_testsuite_params *ts_params,
10759 		struct crypto_unittest_params *ut_params,
10760 		const struct test_crypto_vector *reference)
10761 {
10762 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
10763 }
10764 
10765 static int
10766 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
10767 		struct crypto_unittest_params *ut_params,
10768 		const struct test_crypto_vector *reference)
10769 {
10770 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
10771 }
10772 
10773 static int
10774 test_authentication_verify_fail_when_data_corruption(
10775 		struct crypto_testsuite_params *ts_params,
10776 		struct crypto_unittest_params *ut_params,
10777 		const struct test_crypto_vector *reference,
10778 		unsigned int data_corrupted)
10779 {
10780 	int retval;
10781 
10782 	uint8_t *plaintext;
10783 
10784 	/* Create session */
10785 	retval = create_auth_session(ut_params,
10786 			ts_params->valid_devs[0],
10787 			reference,
10788 			RTE_CRYPTO_AUTH_OP_VERIFY);
10789 	if (retval < 0)
10790 		return retval;
10791 
10792 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10793 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10794 			"Failed to allocate input buffer in mempool");
10795 
10796 	/* clear mbuf payload */
10797 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10798 			rte_pktmbuf_tailroom(ut_params->ibuf));
10799 
10800 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10801 			reference->plaintext.len);
10802 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10803 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
10804 
10805 	debug_hexdump(stdout, "plaintext:", plaintext,
10806 		reference->plaintext.len);
10807 
10808 	/* Create operation */
10809 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
10810 
10811 	if (retval < 0)
10812 		return retval;
10813 
10814 	if (data_corrupted)
10815 		data_corruption(plaintext);
10816 	else
10817 		tag_corruption(plaintext, reference->plaintext.len);
10818 
10819 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10820 			ut_params->op);
10821 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10822 	TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10823 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10824 			"authentication not failed");
10825 
10826 	ut_params->obuf = ut_params->op->sym->m_src;
10827 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
10828 
10829 	return 0;
10830 }
10831 
10832 static int
10833 test_authentication_verify_GMAC_fail_when_corruption(
10834 		struct crypto_testsuite_params *ts_params,
10835 		struct crypto_unittest_params *ut_params,
10836 		const struct test_crypto_vector *reference,
10837 		unsigned int data_corrupted)
10838 {
10839 	int retval;
10840 	uint8_t *plaintext;
10841 
10842 	/* Create session */
10843 	retval = create_auth_cipher_session(ut_params,
10844 			ts_params->valid_devs[0],
10845 			reference,
10846 			RTE_CRYPTO_AUTH_OP_VERIFY,
10847 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
10848 	if (retval < 0)
10849 		return retval;
10850 
10851 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10852 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10853 			"Failed to allocate input buffer in mempool");
10854 
10855 	/* clear mbuf payload */
10856 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10857 			rte_pktmbuf_tailroom(ut_params->ibuf));
10858 
10859 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10860 			reference->plaintext.len);
10861 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10862 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
10863 
10864 	debug_hexdump(stdout, "plaintext:", plaintext,
10865 		reference->plaintext.len);
10866 
10867 	/* Create operation */
10868 	retval = create_auth_verify_GMAC_operation(ts_params,
10869 			ut_params,
10870 			reference);
10871 
10872 	if (retval < 0)
10873 		return retval;
10874 
10875 	if (data_corrupted)
10876 		data_corruption(plaintext);
10877 	else
10878 		tag_corruption(plaintext, reference->aad.len);
10879 
10880 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10881 			ut_params->op);
10882 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10883 	TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10884 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10885 			"authentication not failed");
10886 
10887 	ut_params->obuf = ut_params->op->sym->m_src;
10888 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
10889 
10890 	return 0;
10891 }
10892 
10893 static int
10894 test_authenticated_decryption_fail_when_corruption(
10895 		struct crypto_testsuite_params *ts_params,
10896 		struct crypto_unittest_params *ut_params,
10897 		const struct test_crypto_vector *reference,
10898 		unsigned int data_corrupted)
10899 {
10900 	int retval;
10901 
10902 	uint8_t *ciphertext;
10903 
10904 	/* Create session */
10905 	retval = create_auth_cipher_session(ut_params,
10906 			ts_params->valid_devs[0],
10907 			reference,
10908 			RTE_CRYPTO_AUTH_OP_VERIFY,
10909 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
10910 	if (retval < 0)
10911 		return retval;
10912 
10913 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10914 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10915 			"Failed to allocate input buffer in mempool");
10916 
10917 	/* clear mbuf payload */
10918 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10919 			rte_pktmbuf_tailroom(ut_params->ibuf));
10920 
10921 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10922 			reference->ciphertext.len);
10923 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
10924 	memcpy(ciphertext, reference->ciphertext.data,
10925 			reference->ciphertext.len);
10926 
10927 	/* Create operation */
10928 	retval = create_cipher_auth_verify_operation(ts_params,
10929 			ut_params,
10930 			reference);
10931 
10932 	if (retval < 0)
10933 		return retval;
10934 
10935 	if (data_corrupted)
10936 		data_corruption(ciphertext);
10937 	else
10938 		tag_corruption(ciphertext, reference->ciphertext.len);
10939 
10940 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
10941 			ut_params->op);
10942 
10943 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10944 	TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
10945 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10946 			"authentication not failed");
10947 
10948 	ut_params->obuf = ut_params->op->sym->m_src;
10949 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
10950 
10951 	return 0;
10952 }
10953 
10954 static int
10955 test_authenticated_encryt_with_esn(
10956 		struct crypto_testsuite_params *ts_params,
10957 		struct crypto_unittest_params *ut_params,
10958 		const struct test_crypto_vector *reference)
10959 {
10960 	int retval;
10961 
10962 	uint8_t *authciphertext, *plaintext, *auth_tag;
10963 	uint16_t plaintext_pad_len;
10964 	uint8_t cipher_key[reference->cipher_key.len + 1];
10965 	uint8_t auth_key[reference->auth_key.len + 1];
10966 
10967 	/* Create session */
10968 	memcpy(cipher_key, reference->cipher_key.data,
10969 			reference->cipher_key.len);
10970 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
10971 
10972 	/* Setup Cipher Parameters */
10973 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10974 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
10975 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10976 	ut_params->cipher_xform.cipher.key.data = cipher_key;
10977 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
10978 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10979 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
10980 
10981 	ut_params->cipher_xform.next = &ut_params->auth_xform;
10982 
10983 	/* Setup Authentication Parameters */
10984 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10985 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10986 	ut_params->auth_xform.auth.algo = reference->auth_algo;
10987 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
10988 	ut_params->auth_xform.auth.key.data = auth_key;
10989 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
10990 	ut_params->auth_xform.next = NULL;
10991 
10992 	/* Create Crypto session*/
10993 	ut_params->sess = rte_cryptodev_sym_session_create(
10994 			ts_params->session_mpool);
10995 
10996 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10997 				ut_params->sess,
10998 				&ut_params->cipher_xform,
10999 				ts_params->session_priv_mpool);
11000 
11001 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11002 
11003 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11004 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11005 			"Failed to allocate input buffer in mempool");
11006 
11007 	/* clear mbuf payload */
11008 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11009 			rte_pktmbuf_tailroom(ut_params->ibuf));
11010 
11011 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11012 			reference->plaintext.len);
11013 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11014 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
11015 
11016 	/* Create operation */
11017 	retval = create_cipher_auth_operation(ts_params,
11018 			ut_params,
11019 			reference, 0);
11020 
11021 	if (retval < 0)
11022 		return retval;
11023 
11024 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11025 			ut_params->op);
11026 
11027 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
11028 
11029 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11030 			"crypto op processing failed");
11031 
11032 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
11033 
11034 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11035 			ut_params->op->sym->auth.data.offset);
11036 	auth_tag = authciphertext + plaintext_pad_len;
11037 	debug_hexdump(stdout, "ciphertext:", authciphertext,
11038 			reference->ciphertext.len);
11039 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
11040 
11041 	/* Validate obuf */
11042 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11043 			authciphertext,
11044 			reference->ciphertext.data,
11045 			reference->ciphertext.len,
11046 			"Ciphertext data not as expected");
11047 
11048 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11049 			auth_tag,
11050 			reference->digest.data,
11051 			reference->digest.len,
11052 			"Generated digest not as expected");
11053 
11054 	return TEST_SUCCESS;
11055 
11056 }
11057 
11058 static int
11059 test_authenticated_decrypt_with_esn(
11060 		struct crypto_testsuite_params *ts_params,
11061 		struct crypto_unittest_params *ut_params,
11062 		const struct test_crypto_vector *reference)
11063 {
11064 	int retval;
11065 
11066 	uint8_t *ciphertext;
11067 	uint8_t cipher_key[reference->cipher_key.len + 1];
11068 	uint8_t auth_key[reference->auth_key.len + 1];
11069 
11070 	/* Create session */
11071 	memcpy(cipher_key, reference->cipher_key.data,
11072 			reference->cipher_key.len);
11073 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11074 
11075 	/* Setup Authentication Parameters */
11076 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11077 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
11078 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11079 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11080 	ut_params->auth_xform.auth.key.data = auth_key;
11081 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11082 	ut_params->auth_xform.next = &ut_params->cipher_xform;
11083 
11084 	/* Setup Cipher Parameters */
11085 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11086 	ut_params->cipher_xform.next = NULL;
11087 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11088 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
11089 	ut_params->cipher_xform.cipher.key.data = cipher_key;
11090 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11091 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11092 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11093 
11094 	/* Create Crypto session*/
11095 	ut_params->sess = rte_cryptodev_sym_session_create(
11096 			ts_params->session_mpool);
11097 
11098 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11099 				ut_params->sess,
11100 				&ut_params->auth_xform,
11101 				ts_params->session_priv_mpool);
11102 
11103 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11104 
11105 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11106 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11107 			"Failed to allocate input buffer in mempool");
11108 
11109 	/* clear mbuf payload */
11110 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11111 			rte_pktmbuf_tailroom(ut_params->ibuf));
11112 
11113 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11114 			reference->ciphertext.len);
11115 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
11116 	memcpy(ciphertext, reference->ciphertext.data,
11117 			reference->ciphertext.len);
11118 
11119 	/* Create operation */
11120 	retval = create_cipher_auth_verify_operation(ts_params,
11121 			ut_params,
11122 			reference);
11123 
11124 	if (retval < 0)
11125 		return retval;
11126 
11127 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11128 			ut_params->op);
11129 
11130 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11131 	TEST_ASSERT_EQUAL(ut_params->op->status,
11132 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11133 			"crypto op processing passed");
11134 
11135 	ut_params->obuf = ut_params->op->sym->m_src;
11136 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
11137 
11138 	return 0;
11139 }
11140 
11141 static int
11142 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
11143 		const struct aead_test_data *tdata,
11144 		void *digest_mem, uint64_t digest_phys)
11145 {
11146 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11147 	struct crypto_unittest_params *ut_params = &unittest_params;
11148 
11149 	const unsigned int auth_tag_len = tdata->auth_tag.len;
11150 	const unsigned int iv_len = tdata->iv.len;
11151 	unsigned int aad_len = tdata->aad.len;
11152 
11153 	/* Generate Crypto op data structure */
11154 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11155 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11156 	TEST_ASSERT_NOT_NULL(ut_params->op,
11157 		"Failed to allocate symmetric crypto operation struct");
11158 
11159 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11160 
11161 	sym_op->aead.digest.data = digest_mem;
11162 
11163 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
11164 			"no room to append digest");
11165 
11166 	sym_op->aead.digest.phys_addr = digest_phys;
11167 
11168 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
11169 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
11170 				auth_tag_len);
11171 		debug_hexdump(stdout, "digest:",
11172 				sym_op->aead.digest.data,
11173 				auth_tag_len);
11174 	}
11175 
11176 	/* Append aad data */
11177 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
11178 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11179 				uint8_t *, IV_OFFSET);
11180 
11181 		/* Copy IV 1 byte after the IV pointer, according to the API */
11182 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
11183 
11184 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
11185 
11186 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
11187 				ut_params->ibuf, aad_len);
11188 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
11189 				"no room to prepend aad");
11190 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
11191 				ut_params->ibuf);
11192 
11193 		memset(sym_op->aead.aad.data, 0, aad_len);
11194 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
11195 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
11196 
11197 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
11198 		debug_hexdump(stdout, "aad:",
11199 				sym_op->aead.aad.data, aad_len);
11200 	} else {
11201 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11202 				uint8_t *, IV_OFFSET);
11203 
11204 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
11205 
11206 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
11207 				ut_params->ibuf, aad_len);
11208 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
11209 				"no room to prepend aad");
11210 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
11211 				ut_params->ibuf);
11212 
11213 		memset(sym_op->aead.aad.data, 0, aad_len);
11214 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
11215 
11216 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
11217 		debug_hexdump(stdout, "aad:",
11218 				sym_op->aead.aad.data, aad_len);
11219 	}
11220 
11221 	sym_op->aead.data.length = tdata->plaintext.len;
11222 	sym_op->aead.data.offset = aad_len;
11223 
11224 	return 0;
11225 }
11226 
11227 #define SGL_MAX_NO	16
11228 
11229 static int
11230 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
11231 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
11232 {
11233 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11234 	struct crypto_unittest_params *ut_params = &unittest_params;
11235 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
11236 	int retval;
11237 	int to_trn = 0;
11238 	int to_trn_tbl[SGL_MAX_NO];
11239 	int segs = 1;
11240 	unsigned int trn_data = 0;
11241 	uint8_t *plaintext, *ciphertext, *auth_tag;
11242 
11243 	if (fragsz > tdata->plaintext.len)
11244 		fragsz = tdata->plaintext.len;
11245 
11246 	uint16_t plaintext_len = fragsz;
11247 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
11248 
11249 	if (fragsz_oop > tdata->plaintext.len)
11250 		frag_size_oop = tdata->plaintext.len;
11251 
11252 	int ecx = 0;
11253 	void *digest_mem = NULL;
11254 
11255 	uint32_t prepend_len = tdata->aad.len;
11256 
11257 	if (tdata->plaintext.len % fragsz != 0) {
11258 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
11259 			return 1;
11260 	}	else {
11261 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
11262 			return 1;
11263 	}
11264 
11265 	/*
11266 	 * For out-op-place we need to alloc another mbuf
11267 	 */
11268 	if (oop) {
11269 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11270 		rte_pktmbuf_append(ut_params->obuf,
11271 				frag_size_oop + prepend_len);
11272 		buf_oop = ut_params->obuf;
11273 	}
11274 
11275 	/* Create AEAD session */
11276 	retval = create_aead_session(ts_params->valid_devs[0],
11277 			tdata->algo,
11278 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
11279 			tdata->key.data, tdata->key.len,
11280 			tdata->aad.len, tdata->auth_tag.len,
11281 			tdata->iv.len);
11282 	if (retval < 0)
11283 		return retval;
11284 
11285 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11286 
11287 	/* clear mbuf payload */
11288 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11289 			rte_pktmbuf_tailroom(ut_params->ibuf));
11290 
11291 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11292 			plaintext_len);
11293 
11294 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11295 
11296 	trn_data += plaintext_len;
11297 
11298 	buf = ut_params->ibuf;
11299 
11300 	/*
11301 	 * Loop until no more fragments
11302 	 */
11303 
11304 	while (trn_data < tdata->plaintext.len) {
11305 		++segs;
11306 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11307 				(tdata->plaintext.len - trn_data) : fragsz;
11308 
11309 		to_trn_tbl[ecx++] = to_trn;
11310 
11311 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11312 		buf = buf->next;
11313 
11314 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11315 				rte_pktmbuf_tailroom(buf));
11316 
11317 		/* OOP */
11318 		if (oop && !fragsz_oop) {
11319 			buf_last_oop = buf_oop->next =
11320 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
11321 			buf_oop = buf_oop->next;
11322 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
11323 					0, rte_pktmbuf_tailroom(buf_oop));
11324 			rte_pktmbuf_append(buf_oop, to_trn);
11325 		}
11326 
11327 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11328 				to_trn);
11329 
11330 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11331 				to_trn);
11332 		trn_data += to_trn;
11333 		if (trn_data  == tdata->plaintext.len) {
11334 			if (oop) {
11335 				if (!fragsz_oop)
11336 					digest_mem = rte_pktmbuf_append(buf_oop,
11337 						tdata->auth_tag.len);
11338 			} else
11339 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11340 					tdata->auth_tag.len);
11341 		}
11342 	}
11343 
11344 	uint64_t digest_phys = 0;
11345 
11346 	ut_params->ibuf->nb_segs = segs;
11347 
11348 	segs = 1;
11349 	if (fragsz_oop && oop) {
11350 		to_trn = 0;
11351 		ecx = 0;
11352 
11353 		if (frag_size_oop == tdata->plaintext.len) {
11354 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
11355 				tdata->auth_tag.len);
11356 
11357 			digest_phys = rte_pktmbuf_iova_offset(
11358 					ut_params->obuf,
11359 					tdata->plaintext.len + prepend_len);
11360 		}
11361 
11362 		trn_data = frag_size_oop;
11363 		while (trn_data < tdata->plaintext.len) {
11364 			++segs;
11365 			to_trn =
11366 				(tdata->plaintext.len - trn_data <
11367 						frag_size_oop) ?
11368 				(tdata->plaintext.len - trn_data) :
11369 						frag_size_oop;
11370 
11371 			to_trn_tbl[ecx++] = to_trn;
11372 
11373 			buf_last_oop = buf_oop->next =
11374 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
11375 			buf_oop = buf_oop->next;
11376 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
11377 					0, rte_pktmbuf_tailroom(buf_oop));
11378 			rte_pktmbuf_append(buf_oop, to_trn);
11379 
11380 			trn_data += to_trn;
11381 
11382 			if (trn_data  == tdata->plaintext.len) {
11383 				digest_mem = rte_pktmbuf_append(buf_oop,
11384 					tdata->auth_tag.len);
11385 			}
11386 		}
11387 
11388 		ut_params->obuf->nb_segs = segs;
11389 	}
11390 
11391 	/*
11392 	 * Place digest at the end of the last buffer
11393 	 */
11394 	if (!digest_phys)
11395 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11396 	if (oop && buf_last_oop)
11397 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
11398 
11399 	if (!digest_mem && !oop) {
11400 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11401 				+ tdata->auth_tag.len);
11402 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11403 				tdata->plaintext.len);
11404 	}
11405 
11406 	/* Create AEAD operation */
11407 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
11408 			tdata, digest_mem, digest_phys);
11409 
11410 	if (retval < 0)
11411 		return retval;
11412 
11413 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11414 
11415 	ut_params->op->sym->m_src = ut_params->ibuf;
11416 	if (oop)
11417 		ut_params->op->sym->m_dst = ut_params->obuf;
11418 
11419 	/* Process crypto operation */
11420 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11421 			ut_params->op), "failed to process sym crypto op");
11422 
11423 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11424 			"crypto op processing failed");
11425 
11426 
11427 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
11428 			uint8_t *, prepend_len);
11429 	if (oop) {
11430 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11431 				uint8_t *, prepend_len);
11432 	}
11433 
11434 	if (fragsz_oop)
11435 		fragsz = fragsz_oop;
11436 
11437 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11438 			ciphertext,
11439 			tdata->ciphertext.data,
11440 			fragsz,
11441 			"Ciphertext data not as expected");
11442 
11443 	buf = ut_params->op->sym->m_src->next;
11444 	if (oop)
11445 		buf = ut_params->op->sym->m_dst->next;
11446 
11447 	unsigned int off = fragsz;
11448 
11449 	ecx = 0;
11450 	while (buf) {
11451 		ciphertext = rte_pktmbuf_mtod(buf,
11452 				uint8_t *);
11453 
11454 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
11455 				ciphertext,
11456 				tdata->ciphertext.data + off,
11457 				to_trn_tbl[ecx],
11458 				"Ciphertext data not as expected");
11459 
11460 		off += to_trn_tbl[ecx++];
11461 		buf = buf->next;
11462 	}
11463 
11464 	auth_tag = digest_mem;
11465 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11466 			auth_tag,
11467 			tdata->auth_tag.data,
11468 			tdata->auth_tag.len,
11469 			"Generated auth tag not as expected");
11470 
11471 	return 0;
11472 }
11473 
11474 static int
11475 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
11476 {
11477 	return test_authenticated_encryption_SGL(
11478 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
11479 }
11480 
11481 static int
11482 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
11483 {
11484 	return test_authenticated_encryption_SGL(
11485 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
11486 }
11487 
11488 static int
11489 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
11490 {
11491 	return test_authenticated_encryption_SGL(
11492 			&gcm_test_case_8, OUT_OF_PLACE, 400,
11493 			gcm_test_case_8.plaintext.len);
11494 }
11495 
11496 static int
11497 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
11498 {
11499 
11500 	return test_authenticated_encryption_SGL(
11501 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
11502 }
11503 
11504 static int
11505 test_authentication_verify_fail_when_data_corrupted(
11506 		struct crypto_testsuite_params *ts_params,
11507 		struct crypto_unittest_params *ut_params,
11508 		const struct test_crypto_vector *reference)
11509 {
11510 	return test_authentication_verify_fail_when_data_corruption(
11511 			ts_params, ut_params, reference, 1);
11512 }
11513 
11514 static int
11515 test_authentication_verify_fail_when_tag_corrupted(
11516 		struct crypto_testsuite_params *ts_params,
11517 		struct crypto_unittest_params *ut_params,
11518 		const struct test_crypto_vector *reference)
11519 {
11520 	return test_authentication_verify_fail_when_data_corruption(
11521 			ts_params, ut_params, reference, 0);
11522 }
11523 
11524 static int
11525 test_authentication_verify_GMAC_fail_when_data_corrupted(
11526 		struct crypto_testsuite_params *ts_params,
11527 		struct crypto_unittest_params *ut_params,
11528 		const struct test_crypto_vector *reference)
11529 {
11530 	return test_authentication_verify_GMAC_fail_when_corruption(
11531 			ts_params, ut_params, reference, 1);
11532 }
11533 
11534 static int
11535 test_authentication_verify_GMAC_fail_when_tag_corrupted(
11536 		struct crypto_testsuite_params *ts_params,
11537 		struct crypto_unittest_params *ut_params,
11538 		const struct test_crypto_vector *reference)
11539 {
11540 	return test_authentication_verify_GMAC_fail_when_corruption(
11541 			ts_params, ut_params, reference, 0);
11542 }
11543 
11544 static int
11545 test_authenticated_decryption_fail_when_data_corrupted(
11546 		struct crypto_testsuite_params *ts_params,
11547 		struct crypto_unittest_params *ut_params,
11548 		const struct test_crypto_vector *reference)
11549 {
11550 	return test_authenticated_decryption_fail_when_corruption(
11551 			ts_params, ut_params, reference, 1);
11552 }
11553 
11554 static int
11555 test_authenticated_decryption_fail_when_tag_corrupted(
11556 		struct crypto_testsuite_params *ts_params,
11557 		struct crypto_unittest_params *ut_params,
11558 		const struct test_crypto_vector *reference)
11559 {
11560 	return test_authenticated_decryption_fail_when_corruption(
11561 			ts_params, ut_params, reference, 0);
11562 }
11563 
11564 static int
11565 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
11566 {
11567 	return test_authentication_verify_fail_when_data_corrupted(
11568 			&testsuite_params, &unittest_params,
11569 			&hmac_sha1_test_crypto_vector);
11570 }
11571 
11572 static int
11573 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
11574 {
11575 	return test_authentication_verify_fail_when_tag_corrupted(
11576 			&testsuite_params, &unittest_params,
11577 			&hmac_sha1_test_crypto_vector);
11578 }
11579 
11580 static int
11581 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
11582 {
11583 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
11584 			&testsuite_params, &unittest_params,
11585 			&aes128_gmac_test_vector);
11586 }
11587 
11588 static int
11589 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
11590 {
11591 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
11592 			&testsuite_params, &unittest_params,
11593 			&aes128_gmac_test_vector);
11594 }
11595 
11596 static int
11597 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
11598 {
11599 	return test_authenticated_decryption_fail_when_data_corrupted(
11600 			&testsuite_params,
11601 			&unittest_params,
11602 			&aes128cbc_hmac_sha1_test_vector);
11603 }
11604 
11605 static int
11606 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
11607 {
11608 	return test_authenticated_decryption_fail_when_tag_corrupted(
11609 			&testsuite_params,
11610 			&unittest_params,
11611 			&aes128cbc_hmac_sha1_test_vector);
11612 }
11613 
11614 static int
11615 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
11616 {
11617 	return test_authenticated_encryt_with_esn(
11618 			&testsuite_params,
11619 			&unittest_params,
11620 			&aes128cbc_hmac_sha1_aad_test_vector);
11621 }
11622 
11623 static int
11624 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
11625 {
11626 	return test_authenticated_decrypt_with_esn(
11627 			&testsuite_params,
11628 			&unittest_params,
11629 			&aes128cbc_hmac_sha1_aad_test_vector);
11630 }
11631 
11632 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
11633 
11634 /* global AESNI slave IDs for the scheduler test */
11635 uint8_t aesni_ids[2];
11636 
11637 static int
11638 test_scheduler_attach_slave_op(void)
11639 {
11640 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11641 	uint8_t sched_id = ts_params->valid_devs[0];
11642 	uint32_t nb_devs, i, nb_devs_attached = 0;
11643 	int ret;
11644 	char vdev_name[32];
11645 
11646 	/* create 2 AESNI_MB if necessary */
11647 	nb_devs = rte_cryptodev_device_count_by_driver(
11648 			rte_cryptodev_driver_id_get(
11649 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
11650 	if (nb_devs < 2) {
11651 		for (i = nb_devs; i < 2; i++) {
11652 			snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
11653 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
11654 					i);
11655 			ret = rte_vdev_init(vdev_name, NULL);
11656 
11657 			TEST_ASSERT(ret == 0,
11658 				"Failed to create instance %u of"
11659 				" pmd : %s",
11660 				i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
11661 		}
11662 	}
11663 
11664 	/* attach 2 AESNI_MB cdevs */
11665 	for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
11666 			i++) {
11667 		struct rte_cryptodev_info info;
11668 		unsigned int session_size;
11669 
11670 		rte_cryptodev_info_get(i, &info);
11671 		if (info.driver_id != rte_cryptodev_driver_id_get(
11672 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
11673 			continue;
11674 
11675 		session_size = rte_cryptodev_sym_get_private_session_size(i);
11676 		/*
11677 		 * Create the session mempool again, since now there are new devices
11678 		 * to use the mempool.
11679 		 */
11680 		if (ts_params->session_mpool) {
11681 			rte_mempool_free(ts_params->session_mpool);
11682 			ts_params->session_mpool = NULL;
11683 		}
11684 		if (ts_params->session_priv_mpool) {
11685 			rte_mempool_free(ts_params->session_priv_mpool);
11686 			ts_params->session_priv_mpool = NULL;
11687 		}
11688 
11689 		if (info.sym.max_nb_sessions != 0 &&
11690 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
11691 			RTE_LOG(ERR, USER1,
11692 					"Device does not support "
11693 					"at least %u sessions\n",
11694 					MAX_NB_SESSIONS);
11695 			return TEST_FAILED;
11696 		}
11697 		/*
11698 		 * Create mempool with maximum number of sessions,
11699 		 * to include the session headers
11700 		 */
11701 		if (ts_params->session_mpool == NULL) {
11702 			ts_params->session_mpool =
11703 				rte_cryptodev_sym_session_pool_create(
11704 						"test_sess_mp",
11705 						MAX_NB_SESSIONS, 0, 0, 0,
11706 						SOCKET_ID_ANY);
11707 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
11708 					"session mempool allocation failed");
11709 		}
11710 
11711 		/*
11712 		 * Create mempool with maximum number of sessions,
11713 		 * to include device specific session private data
11714 		 */
11715 		if (ts_params->session_priv_mpool == NULL) {
11716 			ts_params->session_priv_mpool = rte_mempool_create(
11717 					"test_sess_mp_priv",
11718 					MAX_NB_SESSIONS,
11719 					session_size,
11720 					0, 0, NULL, NULL, NULL,
11721 					NULL, SOCKET_ID_ANY,
11722 					0);
11723 
11724 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
11725 					"session mempool allocation failed");
11726 		}
11727 
11728 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
11729 		ts_params->qp_conf.mp_session_private =
11730 				ts_params->session_priv_mpool;
11731 
11732 		ret = rte_cryptodev_scheduler_slave_attach(sched_id,
11733 				(uint8_t)i);
11734 
11735 		TEST_ASSERT(ret == 0,
11736 			"Failed to attach device %u of pmd : %s", i,
11737 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
11738 
11739 		aesni_ids[nb_devs_attached] = (uint8_t)i;
11740 
11741 		nb_devs_attached++;
11742 	}
11743 
11744 	return 0;
11745 }
11746 
11747 static int
11748 test_scheduler_detach_slave_op(void)
11749 {
11750 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11751 	uint8_t sched_id = ts_params->valid_devs[0];
11752 	uint32_t i;
11753 	int ret;
11754 
11755 	for (i = 0; i < 2; i++) {
11756 		ret = rte_cryptodev_scheduler_slave_detach(sched_id,
11757 				aesni_ids[i]);
11758 		TEST_ASSERT(ret == 0,
11759 			"Failed to detach device %u", aesni_ids[i]);
11760 	}
11761 
11762 	return 0;
11763 }
11764 
11765 static int
11766 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
11767 {
11768 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11769 	uint8_t sched_id = ts_params->valid_devs[0];
11770 	/* set mode */
11771 	return rte_cryptodev_scheduler_mode_set(sched_id,
11772 		scheduler_mode);
11773 }
11774 
11775 static int
11776 test_scheduler_mode_roundrobin_op(void)
11777 {
11778 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
11779 			0, "Failed to set roundrobin mode");
11780 	return 0;
11781 
11782 }
11783 
11784 static int
11785 test_scheduler_mode_multicore_op(void)
11786 {
11787 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
11788 			0, "Failed to set multicore mode");
11789 
11790 	return 0;
11791 }
11792 
11793 static int
11794 test_scheduler_mode_failover_op(void)
11795 {
11796 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
11797 			0, "Failed to set failover mode");
11798 
11799 	return 0;
11800 }
11801 
11802 static int
11803 test_scheduler_mode_pkt_size_distr_op(void)
11804 {
11805 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
11806 			0, "Failed to set pktsize mode");
11807 
11808 	return 0;
11809 }
11810 
11811 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
11812 	.suite_name = "Crypto Device Scheduler Unit Test Suite",
11813 	.setup = testsuite_setup,
11814 	.teardown = testsuite_teardown,
11815 	.unit_test_cases = {
11816 		/* Multi Core */
11817 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11818 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
11819 		TEST_CASE_ST(ut_setup, ut_teardown,
11820 					test_AES_chain_scheduler_all),
11821 		TEST_CASE_ST(ut_setup, ut_teardown,
11822 					test_AES_cipheronly_scheduler_all),
11823 		TEST_CASE_ST(ut_setup, ut_teardown,
11824 					test_authonly_scheduler_all),
11825 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11826 
11827 		/* Round Robin */
11828 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11829 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
11830 		TEST_CASE_ST(ut_setup, ut_teardown,
11831 				test_AES_chain_scheduler_all),
11832 		TEST_CASE_ST(ut_setup, ut_teardown,
11833 				test_AES_cipheronly_scheduler_all),
11834 		TEST_CASE_ST(ut_setup, ut_teardown,
11835 				test_authonly_scheduler_all),
11836 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11837 
11838 		/* Fail over */
11839 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11840 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
11841 		TEST_CASE_ST(ut_setup, ut_teardown,
11842 					test_AES_chain_scheduler_all),
11843 		TEST_CASE_ST(ut_setup, ut_teardown,
11844 					test_AES_cipheronly_scheduler_all),
11845 		TEST_CASE_ST(ut_setup, ut_teardown,
11846 					test_authonly_scheduler_all),
11847 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11848 
11849 		/* PKT SIZE */
11850 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
11851 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
11852 		TEST_CASE_ST(ut_setup, ut_teardown,
11853 					test_AES_chain_scheduler_all),
11854 		TEST_CASE_ST(ut_setup, ut_teardown,
11855 					test_AES_cipheronly_scheduler_all),
11856 		TEST_CASE_ST(ut_setup, ut_teardown,
11857 					test_authonly_scheduler_all),
11858 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
11859 
11860 		TEST_CASES_END() /**< NULL terminate unit test array */
11861 	}
11862 };
11863 
11864 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
11865 
11866 static struct unit_test_suite cryptodev_qat_testsuite  = {
11867 	.suite_name = "Crypto QAT Unit Test Suite",
11868 	.setup = testsuite_setup,
11869 	.teardown = testsuite_teardown,
11870 	.unit_test_cases = {
11871 		TEST_CASE_ST(ut_setup, ut_teardown,
11872 				test_device_configure_invalid_dev_id),
11873 		TEST_CASE_ST(ut_setup, ut_teardown,
11874 				test_device_configure_invalid_queue_pair_ids),
11875 		TEST_CASE_ST(ut_setup, ut_teardown,
11876 				test_queue_pair_descriptor_setup),
11877 		TEST_CASE_ST(ut_setup, ut_teardown,
11878 				test_multi_session),
11879 
11880 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_qat_all),
11881 		TEST_CASE_ST(ut_setup, ut_teardown,
11882 						test_AES_cipheronly_qat_all),
11883 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_qat_all),
11884 		TEST_CASE_ST(ut_setup, ut_teardown,
11885 						test_3DES_cipheronly_qat_all),
11886 		TEST_CASE_ST(ut_setup, ut_teardown,
11887 						test_DES_cipheronly_qat_all),
11888 		TEST_CASE_ST(ut_setup, ut_teardown,
11889 						test_AES_docsis_qat_all),
11890 		TEST_CASE_ST(ut_setup, ut_teardown,
11891 						test_DES_docsis_qat_all),
11892 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_qat_all),
11893 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
11894 
11895 		/** AES CCM Authenticated Encryption 128 bits key */
11896 		TEST_CASE_ST(ut_setup, ut_teardown,
11897 			test_AES_CCM_authenticated_encryption_test_case_128_1),
11898 		TEST_CASE_ST(ut_setup, ut_teardown,
11899 			test_AES_CCM_authenticated_encryption_test_case_128_2),
11900 		TEST_CASE_ST(ut_setup, ut_teardown,
11901 			test_AES_CCM_authenticated_encryption_test_case_128_3),
11902 
11903 		/** AES CCM Authenticated Decryption 128 bits key*/
11904 		TEST_CASE_ST(ut_setup, ut_teardown,
11905 			test_AES_CCM_authenticated_decryption_test_case_128_1),
11906 		TEST_CASE_ST(ut_setup, ut_teardown,
11907 			test_AES_CCM_authenticated_decryption_test_case_128_2),
11908 		TEST_CASE_ST(ut_setup, ut_teardown,
11909 			test_AES_CCM_authenticated_decryption_test_case_128_3),
11910 
11911 		/** AES GCM Authenticated Encryption */
11912 		TEST_CASE_ST(ut_setup, ut_teardown,
11913 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
11914 		TEST_CASE_ST(ut_setup, ut_teardown,
11915 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
11916 		TEST_CASE_ST(ut_setup, ut_teardown,
11917 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
11918 		TEST_CASE_ST(ut_setup, ut_teardown,
11919 			test_AES_GCM_authenticated_encryption_test_case_1),
11920 		TEST_CASE_ST(ut_setup, ut_teardown,
11921 			test_AES_GCM_authenticated_encryption_test_case_2),
11922 		TEST_CASE_ST(ut_setup, ut_teardown,
11923 			test_AES_GCM_authenticated_encryption_test_case_3),
11924 		TEST_CASE_ST(ut_setup, ut_teardown,
11925 			test_AES_GCM_authenticated_encryption_test_case_4),
11926 		TEST_CASE_ST(ut_setup, ut_teardown,
11927 			test_AES_GCM_authenticated_encryption_test_case_5),
11928 		TEST_CASE_ST(ut_setup, ut_teardown,
11929 			test_AES_GCM_authenticated_encryption_test_case_6),
11930 		TEST_CASE_ST(ut_setup, ut_teardown,
11931 			test_AES_GCM_authenticated_encryption_test_case_7),
11932 		TEST_CASE_ST(ut_setup, ut_teardown,
11933 			test_AES_GCM_authenticated_encryption_test_case_8),
11934 
11935 		/** AES GCM Authenticated Decryption */
11936 		TEST_CASE_ST(ut_setup, ut_teardown,
11937 			test_AES_GCM_authenticated_decryption_test_case_1),
11938 		TEST_CASE_ST(ut_setup, ut_teardown,
11939 			test_AES_GCM_authenticated_decryption_test_case_2),
11940 		TEST_CASE_ST(ut_setup, ut_teardown,
11941 			test_AES_GCM_authenticated_decryption_test_case_3),
11942 		TEST_CASE_ST(ut_setup, ut_teardown,
11943 			test_AES_GCM_authenticated_decryption_test_case_4),
11944 		TEST_CASE_ST(ut_setup, ut_teardown,
11945 			test_AES_GCM_authenticated_decryption_test_case_5),
11946 		TEST_CASE_ST(ut_setup, ut_teardown,
11947 			test_AES_GCM_authenticated_decryption_test_case_6),
11948 		TEST_CASE_ST(ut_setup, ut_teardown,
11949 			test_AES_GCM_authenticated_decryption_test_case_7),
11950 		TEST_CASE_ST(ut_setup, ut_teardown,
11951 			test_AES_GCM_authenticated_decryption_test_case_8),
11952 
11953 		/** AES GCM Authenticated Encryption 192 bits key */
11954 		TEST_CASE_ST(ut_setup, ut_teardown,
11955 			test_AES_GCM_auth_encryption_test_case_192_1),
11956 		TEST_CASE_ST(ut_setup, ut_teardown,
11957 			test_AES_GCM_auth_encryption_test_case_192_2),
11958 		TEST_CASE_ST(ut_setup, ut_teardown,
11959 			test_AES_GCM_auth_encryption_test_case_192_3),
11960 		TEST_CASE_ST(ut_setup, ut_teardown,
11961 			test_AES_GCM_auth_encryption_test_case_192_4),
11962 		TEST_CASE_ST(ut_setup, ut_teardown,
11963 			test_AES_GCM_auth_encryption_test_case_192_5),
11964 		TEST_CASE_ST(ut_setup, ut_teardown,
11965 			test_AES_GCM_auth_encryption_test_case_192_6),
11966 		TEST_CASE_ST(ut_setup, ut_teardown,
11967 			test_AES_GCM_auth_encryption_test_case_192_7),
11968 
11969 		/** AES GCM Authenticated Decryption 192 bits key */
11970 		TEST_CASE_ST(ut_setup, ut_teardown,
11971 			test_AES_GCM_auth_decryption_test_case_192_1),
11972 		TEST_CASE_ST(ut_setup, ut_teardown,
11973 			test_AES_GCM_auth_decryption_test_case_192_2),
11974 		TEST_CASE_ST(ut_setup, ut_teardown,
11975 			test_AES_GCM_auth_decryption_test_case_192_3),
11976 		TEST_CASE_ST(ut_setup, ut_teardown,
11977 			test_AES_GCM_auth_decryption_test_case_192_4),
11978 		TEST_CASE_ST(ut_setup, ut_teardown,
11979 			test_AES_GCM_auth_decryption_test_case_192_5),
11980 		TEST_CASE_ST(ut_setup, ut_teardown,
11981 			test_AES_GCM_auth_decryption_test_case_192_6),
11982 		TEST_CASE_ST(ut_setup, ut_teardown,
11983 			test_AES_GCM_auth_decryption_test_case_192_7),
11984 
11985 		/** AES GCM Authenticated Encryption 256 bits key */
11986 		TEST_CASE_ST(ut_setup, ut_teardown,
11987 			test_AES_GCM_auth_encryption_test_case_256_1),
11988 		TEST_CASE_ST(ut_setup, ut_teardown,
11989 			test_AES_GCM_auth_encryption_test_case_256_2),
11990 		TEST_CASE_ST(ut_setup, ut_teardown,
11991 			test_AES_GCM_auth_encryption_test_case_256_3),
11992 		TEST_CASE_ST(ut_setup, ut_teardown,
11993 			test_AES_GCM_auth_encryption_test_case_256_4),
11994 		TEST_CASE_ST(ut_setup, ut_teardown,
11995 			test_AES_GCM_auth_encryption_test_case_256_5),
11996 		TEST_CASE_ST(ut_setup, ut_teardown,
11997 			test_AES_GCM_auth_encryption_test_case_256_6),
11998 		TEST_CASE_ST(ut_setup, ut_teardown,
11999 			test_AES_GCM_auth_encryption_test_case_256_7),
12000 
12001 		/** AES GCM Authenticated Decryption 256 bits key */
12002 		TEST_CASE_ST(ut_setup, ut_teardown,
12003 			test_AES_GCM_auth_decryption_test_case_256_1),
12004 		TEST_CASE_ST(ut_setup, ut_teardown,
12005 			test_AES_GCM_auth_decryption_test_case_256_2),
12006 		TEST_CASE_ST(ut_setup, ut_teardown,
12007 			test_AES_GCM_auth_decryption_test_case_256_3),
12008 		TEST_CASE_ST(ut_setup, ut_teardown,
12009 			test_AES_GCM_auth_decryption_test_case_256_4),
12010 		TEST_CASE_ST(ut_setup, ut_teardown,
12011 			test_AES_GCM_auth_decryption_test_case_256_5),
12012 		TEST_CASE_ST(ut_setup, ut_teardown,
12013 			test_AES_GCM_auth_decryption_test_case_256_6),
12014 		TEST_CASE_ST(ut_setup, ut_teardown,
12015 			test_AES_GCM_auth_decryption_test_case_256_7),
12016 
12017 		/** AES GMAC Authentication */
12018 		TEST_CASE_ST(ut_setup, ut_teardown,
12019 			test_AES_GMAC_authentication_test_case_1),
12020 		TEST_CASE_ST(ut_setup, ut_teardown,
12021 			test_AES_GMAC_authentication_verify_test_case_1),
12022 		TEST_CASE_ST(ut_setup, ut_teardown,
12023 			test_AES_GMAC_authentication_test_case_2),
12024 		TEST_CASE_ST(ut_setup, ut_teardown,
12025 			test_AES_GMAC_authentication_verify_test_case_2),
12026 		TEST_CASE_ST(ut_setup, ut_teardown,
12027 			test_AES_GMAC_authentication_test_case_3),
12028 		TEST_CASE_ST(ut_setup, ut_teardown,
12029 			test_AES_GMAC_authentication_verify_test_case_3),
12030 
12031 		/** SNOW 3G encrypt only (UEA2) */
12032 		TEST_CASE_ST(ut_setup, ut_teardown,
12033 			test_snow3g_encryption_test_case_1),
12034 		TEST_CASE_ST(ut_setup, ut_teardown,
12035 			test_snow3g_encryption_test_case_2),
12036 		TEST_CASE_ST(ut_setup, ut_teardown,
12037 			test_snow3g_encryption_test_case_3),
12038 		TEST_CASE_ST(ut_setup, ut_teardown,
12039 			test_snow3g_encryption_test_case_4),
12040 		TEST_CASE_ST(ut_setup, ut_teardown,
12041 			test_snow3g_encryption_test_case_5),
12042 
12043 		TEST_CASE_ST(ut_setup, ut_teardown,
12044 			test_snow3g_encryption_test_case_1_oop),
12045 		TEST_CASE_ST(ut_setup, ut_teardown,
12046 			test_snow3g_decryption_test_case_1_oop),
12047 
12048 		/** SNOW 3G generate auth, then encrypt (UEA2) */
12049 		TEST_CASE_ST(ut_setup, ut_teardown,
12050 			test_snow3g_auth_cipher_test_case_1),
12051 		TEST_CASE_ST(ut_setup, ut_teardown,
12052 			test_snow3g_auth_cipher_test_case_2),
12053 		TEST_CASE_ST(ut_setup, ut_teardown,
12054 			test_snow3g_auth_cipher_test_case_2_oop),
12055 		TEST_CASE_ST(ut_setup, ut_teardown,
12056 			test_snow3g_auth_cipher_part_digest_enc),
12057 		TEST_CASE_ST(ut_setup, ut_teardown,
12058 			test_snow3g_auth_cipher_part_digest_enc_oop),
12059 		TEST_CASE_ST(ut_setup, ut_teardown,
12060 			test_snow3g_auth_cipher_test_case_3_sgl),
12061 		TEST_CASE_ST(ut_setup, ut_teardown,
12062 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
12063 		TEST_CASE_ST(ut_setup, ut_teardown,
12064 			test_snow3g_auth_cipher_part_digest_enc_sgl),
12065 		TEST_CASE_ST(ut_setup, ut_teardown,
12066 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
12067 
12068 		/** SNOW 3G decrypt (UEA2), then verify auth */
12069 		TEST_CASE_ST(ut_setup, ut_teardown,
12070 			test_snow3g_auth_cipher_verify_test_case_1),
12071 		TEST_CASE_ST(ut_setup, ut_teardown,
12072 			test_snow3g_auth_cipher_verify_test_case_2),
12073 		TEST_CASE_ST(ut_setup, ut_teardown,
12074 			test_snow3g_auth_cipher_verify_test_case_2_oop),
12075 		TEST_CASE_ST(ut_setup, ut_teardown,
12076 			test_snow3g_auth_cipher_verify_part_digest_enc),
12077 		TEST_CASE_ST(ut_setup, ut_teardown,
12078 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
12079 		TEST_CASE_ST(ut_setup, ut_teardown,
12080 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
12081 		TEST_CASE_ST(ut_setup, ut_teardown,
12082 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
12083 		TEST_CASE_ST(ut_setup, ut_teardown,
12084 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
12085 		TEST_CASE_ST(ut_setup, ut_teardown,
12086 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
12087 
12088 		/** SNOW 3G decrypt only (UEA2) */
12089 		TEST_CASE_ST(ut_setup, ut_teardown,
12090 			test_snow3g_decryption_test_case_1),
12091 		TEST_CASE_ST(ut_setup, ut_teardown,
12092 			test_snow3g_decryption_test_case_2),
12093 		TEST_CASE_ST(ut_setup, ut_teardown,
12094 			test_snow3g_decryption_test_case_3),
12095 		TEST_CASE_ST(ut_setup, ut_teardown,
12096 			test_snow3g_decryption_test_case_4),
12097 		TEST_CASE_ST(ut_setup, ut_teardown,
12098 			test_snow3g_decryption_test_case_5),
12099 		TEST_CASE_ST(ut_setup, ut_teardown,
12100 			test_snow3g_decryption_with_digest_test_case_1),
12101 		TEST_CASE_ST(ut_setup, ut_teardown,
12102 			test_snow3g_hash_generate_test_case_1),
12103 		TEST_CASE_ST(ut_setup, ut_teardown,
12104 			test_snow3g_hash_generate_test_case_2),
12105 		TEST_CASE_ST(ut_setup, ut_teardown,
12106 			test_snow3g_hash_generate_test_case_3),
12107 		TEST_CASE_ST(ut_setup, ut_teardown,
12108 			test_snow3g_hash_verify_test_case_1),
12109 		TEST_CASE_ST(ut_setup, ut_teardown,
12110 			test_snow3g_hash_verify_test_case_2),
12111 		TEST_CASE_ST(ut_setup, ut_teardown,
12112 			test_snow3g_hash_verify_test_case_3),
12113 		TEST_CASE_ST(ut_setup, ut_teardown,
12114 			test_snow3g_cipher_auth_test_case_1),
12115 		TEST_CASE_ST(ut_setup, ut_teardown,
12116 			test_snow3g_auth_cipher_with_digest_test_case_1),
12117 
12118 		/** ZUC encrypt only (EEA3) */
12119 		TEST_CASE_ST(ut_setup, ut_teardown,
12120 			test_zuc_encryption_test_case_1),
12121 		TEST_CASE_ST(ut_setup, ut_teardown,
12122 			test_zuc_encryption_test_case_2),
12123 		TEST_CASE_ST(ut_setup, ut_teardown,
12124 			test_zuc_encryption_test_case_3),
12125 		TEST_CASE_ST(ut_setup, ut_teardown,
12126 			test_zuc_encryption_test_case_4),
12127 		TEST_CASE_ST(ut_setup, ut_teardown,
12128 			test_zuc_encryption_test_case_5),
12129 
12130 		/** ZUC authenticate (EIA3) */
12131 		TEST_CASE_ST(ut_setup, ut_teardown,
12132 			test_zuc_hash_generate_test_case_6),
12133 		TEST_CASE_ST(ut_setup, ut_teardown,
12134 			test_zuc_hash_generate_test_case_7),
12135 		TEST_CASE_ST(ut_setup, ut_teardown,
12136 			test_zuc_hash_generate_test_case_8),
12137 
12138 		/** ZUC alg-chain (EEA3/EIA3) */
12139 		TEST_CASE_ST(ut_setup, ut_teardown,
12140 			test_zuc_cipher_auth_test_case_1),
12141 		TEST_CASE_ST(ut_setup, ut_teardown,
12142 			test_zuc_cipher_auth_test_case_2),
12143 
12144 		/** ZUC generate auth, then encrypt (EEA3) */
12145 		TEST_CASE_ST(ut_setup, ut_teardown,
12146 			test_zuc_auth_cipher_test_case_1),
12147 		TEST_CASE_ST(ut_setup, ut_teardown,
12148 			test_zuc_auth_cipher_test_case_1_oop),
12149 		TEST_CASE_ST(ut_setup, ut_teardown,
12150 			test_zuc_auth_cipher_test_case_1_sgl),
12151 		TEST_CASE_ST(ut_setup, ut_teardown,
12152 			test_zuc_auth_cipher_test_case_1_oop_sgl),
12153 
12154 		/** ZUC decrypt (EEA3), then verify auth */
12155 		TEST_CASE_ST(ut_setup, ut_teardown,
12156 			test_zuc_auth_cipher_verify_test_case_1),
12157 		TEST_CASE_ST(ut_setup, ut_teardown,
12158 			test_zuc_auth_cipher_verify_test_case_1_oop),
12159 		TEST_CASE_ST(ut_setup, ut_teardown,
12160 			test_zuc_auth_cipher_verify_test_case_1_sgl),
12161 		TEST_CASE_ST(ut_setup, ut_teardown,
12162 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
12163 
12164 		/** HMAC_MD5 Authentication */
12165 		TEST_CASE_ST(ut_setup, ut_teardown,
12166 			test_MD5_HMAC_generate_case_1),
12167 		TEST_CASE_ST(ut_setup, ut_teardown,
12168 			test_MD5_HMAC_verify_case_1),
12169 		TEST_CASE_ST(ut_setup, ut_teardown,
12170 			test_MD5_HMAC_generate_case_2),
12171 		TEST_CASE_ST(ut_setup, ut_teardown,
12172 			test_MD5_HMAC_verify_case_2),
12173 
12174 		/** NULL algo tests done in chain_all,
12175 		 * cipheronly and authonly suites
12176 		 */
12177 
12178 		/** KASUMI tests */
12179 		TEST_CASE_ST(ut_setup, ut_teardown,
12180 			test_kasumi_hash_generate_test_case_1),
12181 		TEST_CASE_ST(ut_setup, ut_teardown,
12182 			test_kasumi_hash_generate_test_case_2),
12183 		TEST_CASE_ST(ut_setup, ut_teardown,
12184 			test_kasumi_hash_generate_test_case_3),
12185 		TEST_CASE_ST(ut_setup, ut_teardown,
12186 			test_kasumi_hash_generate_test_case_4),
12187 		TEST_CASE_ST(ut_setup, ut_teardown,
12188 			test_kasumi_hash_generate_test_case_5),
12189 		TEST_CASE_ST(ut_setup, ut_teardown,
12190 			test_kasumi_hash_generate_test_case_6),
12191 
12192 		TEST_CASE_ST(ut_setup, ut_teardown,
12193 			test_kasumi_hash_verify_test_case_1),
12194 		TEST_CASE_ST(ut_setup, ut_teardown,
12195 			test_kasumi_hash_verify_test_case_2),
12196 		TEST_CASE_ST(ut_setup, ut_teardown,
12197 			test_kasumi_hash_verify_test_case_3),
12198 		TEST_CASE_ST(ut_setup, ut_teardown,
12199 			test_kasumi_hash_verify_test_case_4),
12200 		TEST_CASE_ST(ut_setup, ut_teardown,
12201 			test_kasumi_hash_verify_test_case_5),
12202 
12203 		TEST_CASE_ST(ut_setup, ut_teardown,
12204 			test_kasumi_encryption_test_case_1),
12205 		TEST_CASE_ST(ut_setup, ut_teardown,
12206 			test_kasumi_encryption_test_case_3),
12207 		TEST_CASE_ST(ut_setup, ut_teardown,
12208 			test_kasumi_cipher_auth_test_case_1),
12209 
12210 		/** KASUMI generate auth, then encrypt (F8) */
12211 		TEST_CASE_ST(ut_setup, ut_teardown,
12212 			test_kasumi_auth_cipher_test_case_1),
12213 		TEST_CASE_ST(ut_setup, ut_teardown,
12214 			test_kasumi_auth_cipher_test_case_2),
12215 		TEST_CASE_ST(ut_setup, ut_teardown,
12216 			test_kasumi_auth_cipher_test_case_2_oop),
12217 		TEST_CASE_ST(ut_setup, ut_teardown,
12218 			test_kasumi_auth_cipher_test_case_2_sgl),
12219 		TEST_CASE_ST(ut_setup, ut_teardown,
12220 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
12221 
12222 		/** KASUMI decrypt (F8), then verify auth */
12223 		TEST_CASE_ST(ut_setup, ut_teardown,
12224 			test_kasumi_auth_cipher_verify_test_case_1),
12225 		TEST_CASE_ST(ut_setup, ut_teardown,
12226 			test_kasumi_auth_cipher_verify_test_case_2),
12227 		TEST_CASE_ST(ut_setup, ut_teardown,
12228 			test_kasumi_auth_cipher_verify_test_case_2_oop),
12229 		TEST_CASE_ST(ut_setup, ut_teardown,
12230 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
12231 		TEST_CASE_ST(ut_setup, ut_teardown,
12232 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
12233 
12234 		/** Negative tests */
12235 		TEST_CASE_ST(ut_setup, ut_teardown,
12236 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
12237 		TEST_CASE_ST(ut_setup, ut_teardown,
12238 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12239 		TEST_CASE_ST(ut_setup, ut_teardown,
12240 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
12241 		TEST_CASE_ST(ut_setup, ut_teardown,
12242 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
12243 		TEST_CASE_ST(ut_setup, ut_teardown,
12244 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
12245 		TEST_CASE_ST(ut_setup, ut_teardown,
12246 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
12247 		TEST_CASE_ST(ut_setup, ut_teardown,
12248 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
12249 		TEST_CASE_ST(ut_setup, ut_teardown,
12250 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
12251 		TEST_CASE_ST(ut_setup, ut_teardown,
12252 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
12253 		TEST_CASE_ST(ut_setup, ut_teardown,
12254 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
12255 		TEST_CASE_ST(ut_setup, ut_teardown,
12256 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
12257 		TEST_CASE_ST(ut_setup, ut_teardown,
12258 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
12259 		TEST_CASE_ST(ut_setup, ut_teardown,
12260 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
12261 		TEST_CASE_ST(ut_setup, ut_teardown,
12262 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
12263 		TEST_CASE_ST(ut_setup, ut_teardown,
12264 			authentication_verify_AES128_GMAC_fail_data_corrupt),
12265 		TEST_CASE_ST(ut_setup, ut_teardown,
12266 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
12267 		TEST_CASE_ST(ut_setup, ut_teardown,
12268 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12269 		TEST_CASE_ST(ut_setup, ut_teardown,
12270 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12271 
12272 		/** Mixed CIPHER + HASH algorithms */
12273 		/** AUTH AES CMAC + CIPHER AES CTR */
12274 		TEST_CASE_ST(ut_setup, ut_teardown,
12275 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
12276 		TEST_CASE_ST(ut_setup, ut_teardown,
12277 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
12278 		TEST_CASE_ST(ut_setup, ut_teardown,
12279 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
12280 		TEST_CASE_ST(ut_setup, ut_teardown,
12281 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
12282 		TEST_CASE_ST(ut_setup, ut_teardown,
12283 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
12284 		TEST_CASE_ST(ut_setup, ut_teardown,
12285 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
12286 		TEST_CASE_ST(ut_setup, ut_teardown,
12287 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
12288 		TEST_CASE_ST(ut_setup, ut_teardown,
12289 		   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
12290 
12291 		TEST_CASES_END() /**< NULL terminate unit test array */
12292 	}
12293 };
12294 
12295 static struct unit_test_suite cryptodev_virtio_testsuite = {
12296 	.suite_name = "Crypto VIRTIO Unit Test Suite",
12297 	.setup = testsuite_setup,
12298 	.teardown = testsuite_teardown,
12299 	.unit_test_cases = {
12300 		TEST_CASE_ST(ut_setup, ut_teardown,
12301 				test_AES_cipheronly_virtio_all),
12302 
12303 		TEST_CASES_END() /**< NULL terminate unit test array */
12304 	}
12305 };
12306 
12307 static struct unit_test_suite cryptodev_aesni_mb_testsuite  = {
12308 	.suite_name = "Crypto Device AESNI MB Unit Test Suite",
12309 	.setup = testsuite_setup,
12310 	.teardown = testsuite_teardown,
12311 	.unit_test_cases = {
12312 #if IMB_VERSION_NUM >= IMB_VERSION(0, 51, 0)
12313 		TEST_CASE_ST(ut_setup, ut_teardown,
12314 			test_AES_GCM_authenticated_encryption_test_case_1),
12315 		TEST_CASE_ST(ut_setup, ut_teardown,
12316 			test_AES_GCM_authenticated_encryption_test_case_2),
12317 		TEST_CASE_ST(ut_setup, ut_teardown,
12318 			test_AES_GCM_authenticated_encryption_test_case_3),
12319 		TEST_CASE_ST(ut_setup, ut_teardown,
12320 			test_AES_GCM_authenticated_encryption_test_case_4),
12321 		TEST_CASE_ST(ut_setup, ut_teardown,
12322 			test_AES_GCM_authenticated_encryption_test_case_5),
12323 		TEST_CASE_ST(ut_setup, ut_teardown,
12324 			test_AES_GCM_authenticated_encryption_test_case_6),
12325 		TEST_CASE_ST(ut_setup, ut_teardown,
12326 			test_AES_GCM_authenticated_encryption_test_case_7),
12327 
12328 		/** AES GCM Authenticated Decryption */
12329 		TEST_CASE_ST(ut_setup, ut_teardown,
12330 			test_AES_GCM_authenticated_decryption_test_case_1),
12331 		TEST_CASE_ST(ut_setup, ut_teardown,
12332 			test_AES_GCM_authenticated_decryption_test_case_2),
12333 		TEST_CASE_ST(ut_setup, ut_teardown,
12334 			test_AES_GCM_authenticated_decryption_test_case_3),
12335 		TEST_CASE_ST(ut_setup, ut_teardown,
12336 			test_AES_GCM_authenticated_decryption_test_case_4),
12337 		TEST_CASE_ST(ut_setup, ut_teardown,
12338 			test_AES_GCM_authenticated_decryption_test_case_5),
12339 		TEST_CASE_ST(ut_setup, ut_teardown,
12340 			test_AES_GCM_authenticated_decryption_test_case_6),
12341 		TEST_CASE_ST(ut_setup, ut_teardown,
12342 			test_AES_GCM_authenticated_decryption_test_case_7),
12343 
12344 		/** AES GCM Authenticated Encryption 192 bits key */
12345 		TEST_CASE_ST(ut_setup, ut_teardown,
12346 			test_AES_GCM_auth_encryption_test_case_192_1),
12347 		TEST_CASE_ST(ut_setup, ut_teardown,
12348 			test_AES_GCM_auth_encryption_test_case_192_2),
12349 		TEST_CASE_ST(ut_setup, ut_teardown,
12350 			test_AES_GCM_auth_encryption_test_case_192_3),
12351 		TEST_CASE_ST(ut_setup, ut_teardown,
12352 			test_AES_GCM_auth_encryption_test_case_192_4),
12353 		TEST_CASE_ST(ut_setup, ut_teardown,
12354 			test_AES_GCM_auth_encryption_test_case_192_5),
12355 		TEST_CASE_ST(ut_setup, ut_teardown,
12356 			test_AES_GCM_auth_encryption_test_case_192_6),
12357 		TEST_CASE_ST(ut_setup, ut_teardown,
12358 			test_AES_GCM_auth_encryption_test_case_192_7),
12359 
12360 		/** AES GCM Authenticated Decryption 192 bits key */
12361 		TEST_CASE_ST(ut_setup, ut_teardown,
12362 			test_AES_GCM_auth_decryption_test_case_192_1),
12363 		TEST_CASE_ST(ut_setup, ut_teardown,
12364 			test_AES_GCM_auth_decryption_test_case_192_2),
12365 		TEST_CASE_ST(ut_setup, ut_teardown,
12366 			test_AES_GCM_auth_decryption_test_case_192_3),
12367 		TEST_CASE_ST(ut_setup, ut_teardown,
12368 			test_AES_GCM_auth_decryption_test_case_192_4),
12369 		TEST_CASE_ST(ut_setup, ut_teardown,
12370 			test_AES_GCM_auth_decryption_test_case_192_5),
12371 		TEST_CASE_ST(ut_setup, ut_teardown,
12372 			test_AES_GCM_auth_decryption_test_case_192_6),
12373 		TEST_CASE_ST(ut_setup, ut_teardown,
12374 			test_AES_GCM_auth_decryption_test_case_192_7),
12375 
12376 		/** AES GCM Authenticated Encryption 256 bits key */
12377 		TEST_CASE_ST(ut_setup, ut_teardown,
12378 			test_AES_GCM_auth_encryption_test_case_256_1),
12379 		TEST_CASE_ST(ut_setup, ut_teardown,
12380 			test_AES_GCM_auth_encryption_test_case_256_2),
12381 		TEST_CASE_ST(ut_setup, ut_teardown,
12382 			test_AES_GCM_auth_encryption_test_case_256_3),
12383 		TEST_CASE_ST(ut_setup, ut_teardown,
12384 			test_AES_GCM_auth_encryption_test_case_256_4),
12385 		TEST_CASE_ST(ut_setup, ut_teardown,
12386 			test_AES_GCM_auth_encryption_test_case_256_5),
12387 		TEST_CASE_ST(ut_setup, ut_teardown,
12388 			test_AES_GCM_auth_encryption_test_case_256_6),
12389 		TEST_CASE_ST(ut_setup, ut_teardown,
12390 			test_AES_GCM_auth_encryption_test_case_256_7),
12391 
12392 		/** AES GCM Authenticated Decryption 256 bits key */
12393 		TEST_CASE_ST(ut_setup, ut_teardown,
12394 			test_AES_GCM_auth_decryption_test_case_256_1),
12395 		TEST_CASE_ST(ut_setup, ut_teardown,
12396 			test_AES_GCM_auth_decryption_test_case_256_2),
12397 		TEST_CASE_ST(ut_setup, ut_teardown,
12398 			test_AES_GCM_auth_decryption_test_case_256_3),
12399 		TEST_CASE_ST(ut_setup, ut_teardown,
12400 			test_AES_GCM_auth_decryption_test_case_256_4),
12401 		TEST_CASE_ST(ut_setup, ut_teardown,
12402 			test_AES_GCM_auth_decryption_test_case_256_5),
12403 		TEST_CASE_ST(ut_setup, ut_teardown,
12404 			test_AES_GCM_auth_decryption_test_case_256_6),
12405 		TEST_CASE_ST(ut_setup, ut_teardown,
12406 			test_AES_GCM_auth_decryption_test_case_256_7),
12407 
12408 		/** AES GCM Authenticated Encryption big aad size */
12409 		TEST_CASE_ST(ut_setup, ut_teardown,
12410 			test_AES_GCM_auth_encryption_test_case_aad_1),
12411 		TEST_CASE_ST(ut_setup, ut_teardown,
12412 			test_AES_GCM_auth_encryption_test_case_aad_2),
12413 
12414 		/** AES GCM Authenticated Decryption big aad size */
12415 		TEST_CASE_ST(ut_setup, ut_teardown,
12416 			test_AES_GCM_auth_decryption_test_case_aad_1),
12417 		TEST_CASE_ST(ut_setup, ut_teardown,
12418 			test_AES_GCM_auth_decryption_test_case_aad_2),
12419 
12420 		/** Session-less tests */
12421 		TEST_CASE_ST(ut_setup, ut_teardown,
12422 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
12423 		TEST_CASE_ST(ut_setup, ut_teardown,
12424 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
12425 
12426 		/** AES GMAC Authentication */
12427 		TEST_CASE_ST(ut_setup, ut_teardown,
12428 			test_AES_GMAC_authentication_test_case_1),
12429 		TEST_CASE_ST(ut_setup, ut_teardown,
12430 			test_AES_GMAC_authentication_verify_test_case_1),
12431 		TEST_CASE_ST(ut_setup, ut_teardown,
12432 			test_AES_GMAC_authentication_test_case_2),
12433 		TEST_CASE_ST(ut_setup, ut_teardown,
12434 			test_AES_GMAC_authentication_verify_test_case_2),
12435 		TEST_CASE_ST(ut_setup, ut_teardown,
12436 			test_AES_GMAC_authentication_test_case_3),
12437 		TEST_CASE_ST(ut_setup, ut_teardown,
12438 			test_AES_GMAC_authentication_verify_test_case_3),
12439 #endif /* IMB_VERSION_NUM >= IMB_VERSION(0, 51, 0) */
12440 
12441 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_mb_all),
12442 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_mb_all),
12443 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_mb_all),
12444 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_mb_all),
12445 		TEST_CASE_ST(ut_setup, ut_teardown,
12446 						test_DES_cipheronly_mb_all),
12447 		TEST_CASE_ST(ut_setup, ut_teardown,
12448 						test_DES_docsis_mb_all),
12449 		TEST_CASE_ST(ut_setup, ut_teardown,
12450 						test_3DES_cipheronly_mb_all),
12451 		TEST_CASE_ST(ut_setup, ut_teardown,
12452 			test_AES_CCM_authenticated_encryption_test_case_128_1),
12453 		TEST_CASE_ST(ut_setup, ut_teardown,
12454 			test_AES_CCM_authenticated_decryption_test_case_128_1),
12455 		TEST_CASE_ST(ut_setup, ut_teardown,
12456 			test_AES_CCM_authenticated_encryption_test_case_128_2),
12457 		TEST_CASE_ST(ut_setup, ut_teardown,
12458 			test_AES_CCM_authenticated_decryption_test_case_128_2),
12459 		TEST_CASE_ST(ut_setup, ut_teardown,
12460 			test_AES_CCM_authenticated_encryption_test_case_128_3),
12461 		TEST_CASE_ST(ut_setup, ut_teardown,
12462 			test_AES_CCM_authenticated_decryption_test_case_128_3),
12463 
12464 		TEST_CASES_END() /**< NULL terminate unit test array */
12465 	}
12466 };
12467 
12468 static struct unit_test_suite cryptodev_openssl_testsuite  = {
12469 	.suite_name = "Crypto Device OPENSSL Unit Test Suite",
12470 	.setup = testsuite_setup,
12471 	.teardown = testsuite_teardown,
12472 	.unit_test_cases = {
12473 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
12474 		TEST_CASE_ST(ut_setup, ut_teardown,
12475 				test_multi_session_random_usage),
12476 		TEST_CASE_ST(ut_setup, ut_teardown,
12477 				test_AES_chain_openssl_all),
12478 		TEST_CASE_ST(ut_setup, ut_teardown,
12479 				test_AES_cipheronly_openssl_all),
12480 		TEST_CASE_ST(ut_setup, ut_teardown,
12481 				test_3DES_chain_openssl_all),
12482 		TEST_CASE_ST(ut_setup, ut_teardown,
12483 				test_3DES_cipheronly_openssl_all),
12484 		TEST_CASE_ST(ut_setup, ut_teardown,
12485 				test_DES_cipheronly_openssl_all),
12486 		TEST_CASE_ST(ut_setup, ut_teardown,
12487 				test_DES_docsis_openssl_all),
12488 		TEST_CASE_ST(ut_setup, ut_teardown,
12489 				test_authonly_openssl_all),
12490 
12491 		/** AES GCM Authenticated Encryption */
12492 		TEST_CASE_ST(ut_setup, ut_teardown,
12493 			test_AES_GCM_authenticated_encryption_test_case_1),
12494 		TEST_CASE_ST(ut_setup, ut_teardown,
12495 			test_AES_GCM_authenticated_encryption_test_case_2),
12496 		TEST_CASE_ST(ut_setup, ut_teardown,
12497 			test_AES_GCM_authenticated_encryption_test_case_3),
12498 		TEST_CASE_ST(ut_setup, ut_teardown,
12499 			test_AES_GCM_authenticated_encryption_test_case_4),
12500 		TEST_CASE_ST(ut_setup, ut_teardown,
12501 			test_AES_GCM_authenticated_encryption_test_case_5),
12502 		TEST_CASE_ST(ut_setup, ut_teardown,
12503 			test_AES_GCM_authenticated_encryption_test_case_6),
12504 		TEST_CASE_ST(ut_setup, ut_teardown,
12505 			test_AES_GCM_authenticated_encryption_test_case_7),
12506 
12507 		/** AES GCM Authenticated Decryption */
12508 		TEST_CASE_ST(ut_setup, ut_teardown,
12509 			test_AES_GCM_authenticated_decryption_test_case_1),
12510 		TEST_CASE_ST(ut_setup, ut_teardown,
12511 			test_AES_GCM_authenticated_decryption_test_case_2),
12512 		TEST_CASE_ST(ut_setup, ut_teardown,
12513 			test_AES_GCM_authenticated_decryption_test_case_3),
12514 		TEST_CASE_ST(ut_setup, ut_teardown,
12515 			test_AES_GCM_authenticated_decryption_test_case_4),
12516 		TEST_CASE_ST(ut_setup, ut_teardown,
12517 			test_AES_GCM_authenticated_decryption_test_case_5),
12518 		TEST_CASE_ST(ut_setup, ut_teardown,
12519 			test_AES_GCM_authenticated_decryption_test_case_6),
12520 		TEST_CASE_ST(ut_setup, ut_teardown,
12521 			test_AES_GCM_authenticated_decryption_test_case_7),
12522 
12523 
12524 		/** AES GCM Authenticated Encryption 192 bits key */
12525 		TEST_CASE_ST(ut_setup, ut_teardown,
12526 			test_AES_GCM_auth_encryption_test_case_192_1),
12527 		TEST_CASE_ST(ut_setup, ut_teardown,
12528 			test_AES_GCM_auth_encryption_test_case_192_2),
12529 		TEST_CASE_ST(ut_setup, ut_teardown,
12530 			test_AES_GCM_auth_encryption_test_case_192_3),
12531 		TEST_CASE_ST(ut_setup, ut_teardown,
12532 			test_AES_GCM_auth_encryption_test_case_192_4),
12533 		TEST_CASE_ST(ut_setup, ut_teardown,
12534 			test_AES_GCM_auth_encryption_test_case_192_5),
12535 		TEST_CASE_ST(ut_setup, ut_teardown,
12536 			test_AES_GCM_auth_encryption_test_case_192_6),
12537 		TEST_CASE_ST(ut_setup, ut_teardown,
12538 			test_AES_GCM_auth_encryption_test_case_192_7),
12539 
12540 		/** AES GCM Authenticated Decryption 192 bits key */
12541 		TEST_CASE_ST(ut_setup, ut_teardown,
12542 			test_AES_GCM_auth_decryption_test_case_192_1),
12543 		TEST_CASE_ST(ut_setup, ut_teardown,
12544 			test_AES_GCM_auth_decryption_test_case_192_2),
12545 		TEST_CASE_ST(ut_setup, ut_teardown,
12546 			test_AES_GCM_auth_decryption_test_case_192_3),
12547 		TEST_CASE_ST(ut_setup, ut_teardown,
12548 			test_AES_GCM_auth_decryption_test_case_192_4),
12549 		TEST_CASE_ST(ut_setup, ut_teardown,
12550 			test_AES_GCM_auth_decryption_test_case_192_5),
12551 		TEST_CASE_ST(ut_setup, ut_teardown,
12552 			test_AES_GCM_auth_decryption_test_case_192_6),
12553 		TEST_CASE_ST(ut_setup, ut_teardown,
12554 			test_AES_GCM_auth_decryption_test_case_192_7),
12555 
12556 		/** AES GCM Authenticated Encryption 256 bits key */
12557 		TEST_CASE_ST(ut_setup, ut_teardown,
12558 			test_AES_GCM_auth_encryption_test_case_256_1),
12559 		TEST_CASE_ST(ut_setup, ut_teardown,
12560 			test_AES_GCM_auth_encryption_test_case_256_2),
12561 		TEST_CASE_ST(ut_setup, ut_teardown,
12562 			test_AES_GCM_auth_encryption_test_case_256_3),
12563 		TEST_CASE_ST(ut_setup, ut_teardown,
12564 			test_AES_GCM_auth_encryption_test_case_256_4),
12565 		TEST_CASE_ST(ut_setup, ut_teardown,
12566 			test_AES_GCM_auth_encryption_test_case_256_5),
12567 		TEST_CASE_ST(ut_setup, ut_teardown,
12568 			test_AES_GCM_auth_encryption_test_case_256_6),
12569 		TEST_CASE_ST(ut_setup, ut_teardown,
12570 			test_AES_GCM_auth_encryption_test_case_256_7),
12571 
12572 		/** AES GCM Authenticated Decryption 256 bits key */
12573 		TEST_CASE_ST(ut_setup, ut_teardown,
12574 			test_AES_GCM_auth_decryption_test_case_256_1),
12575 		TEST_CASE_ST(ut_setup, ut_teardown,
12576 			test_AES_GCM_auth_decryption_test_case_256_2),
12577 		TEST_CASE_ST(ut_setup, ut_teardown,
12578 			test_AES_GCM_auth_decryption_test_case_256_3),
12579 		TEST_CASE_ST(ut_setup, ut_teardown,
12580 			test_AES_GCM_auth_decryption_test_case_256_4),
12581 		TEST_CASE_ST(ut_setup, ut_teardown,
12582 			test_AES_GCM_auth_decryption_test_case_256_5),
12583 		TEST_CASE_ST(ut_setup, ut_teardown,
12584 			test_AES_GCM_auth_decryption_test_case_256_6),
12585 		TEST_CASE_ST(ut_setup, ut_teardown,
12586 			test_AES_GCM_auth_decryption_test_case_256_7),
12587 
12588 		/** AES GMAC Authentication */
12589 		TEST_CASE_ST(ut_setup, ut_teardown,
12590 			test_AES_GMAC_authentication_test_case_1),
12591 		TEST_CASE_ST(ut_setup, ut_teardown,
12592 			test_AES_GMAC_authentication_verify_test_case_1),
12593 		TEST_CASE_ST(ut_setup, ut_teardown,
12594 			test_AES_GMAC_authentication_test_case_2),
12595 		TEST_CASE_ST(ut_setup, ut_teardown,
12596 			test_AES_GMAC_authentication_verify_test_case_2),
12597 		TEST_CASE_ST(ut_setup, ut_teardown,
12598 			test_AES_GMAC_authentication_test_case_3),
12599 		TEST_CASE_ST(ut_setup, ut_teardown,
12600 			test_AES_GMAC_authentication_verify_test_case_3),
12601 		TEST_CASE_ST(ut_setup, ut_teardown,
12602 			test_AES_GMAC_authentication_test_case_4),
12603 		TEST_CASE_ST(ut_setup, ut_teardown,
12604 			test_AES_GMAC_authentication_verify_test_case_4),
12605 
12606 		/** AES CCM Authenticated Encryption 128 bits key */
12607 		TEST_CASE_ST(ut_setup, ut_teardown,
12608 			test_AES_CCM_authenticated_encryption_test_case_128_1),
12609 		TEST_CASE_ST(ut_setup, ut_teardown,
12610 			test_AES_CCM_authenticated_encryption_test_case_128_2),
12611 		TEST_CASE_ST(ut_setup, ut_teardown,
12612 			test_AES_CCM_authenticated_encryption_test_case_128_3),
12613 
12614 		/** AES CCM Authenticated Decryption 128 bits key*/
12615 		TEST_CASE_ST(ut_setup, ut_teardown,
12616 			test_AES_CCM_authenticated_decryption_test_case_128_1),
12617 		TEST_CASE_ST(ut_setup, ut_teardown,
12618 			test_AES_CCM_authenticated_decryption_test_case_128_2),
12619 		TEST_CASE_ST(ut_setup, ut_teardown,
12620 			test_AES_CCM_authenticated_decryption_test_case_128_3),
12621 
12622 		/** AES CCM Authenticated Encryption 192 bits key */
12623 		TEST_CASE_ST(ut_setup, ut_teardown,
12624 			test_AES_CCM_authenticated_encryption_test_case_192_1),
12625 		TEST_CASE_ST(ut_setup, ut_teardown,
12626 			test_AES_CCM_authenticated_encryption_test_case_192_2),
12627 		TEST_CASE_ST(ut_setup, ut_teardown,
12628 			test_AES_CCM_authenticated_encryption_test_case_192_3),
12629 
12630 		/** AES CCM Authenticated Decryption 192 bits key*/
12631 		TEST_CASE_ST(ut_setup, ut_teardown,
12632 			test_AES_CCM_authenticated_decryption_test_case_192_1),
12633 		TEST_CASE_ST(ut_setup, ut_teardown,
12634 			test_AES_CCM_authenticated_decryption_test_case_192_2),
12635 		TEST_CASE_ST(ut_setup, ut_teardown,
12636 			test_AES_CCM_authenticated_decryption_test_case_192_3),
12637 
12638 		/** AES CCM Authenticated Encryption 256 bits key */
12639 		TEST_CASE_ST(ut_setup, ut_teardown,
12640 			test_AES_CCM_authenticated_encryption_test_case_256_1),
12641 		TEST_CASE_ST(ut_setup, ut_teardown,
12642 			test_AES_CCM_authenticated_encryption_test_case_256_2),
12643 		TEST_CASE_ST(ut_setup, ut_teardown,
12644 			test_AES_CCM_authenticated_encryption_test_case_256_3),
12645 
12646 		/** AES CCM Authenticated Decryption 256 bits key*/
12647 		TEST_CASE_ST(ut_setup, ut_teardown,
12648 			test_AES_CCM_authenticated_decryption_test_case_256_1),
12649 		TEST_CASE_ST(ut_setup, ut_teardown,
12650 			test_AES_CCM_authenticated_decryption_test_case_256_2),
12651 		TEST_CASE_ST(ut_setup, ut_teardown,
12652 			test_AES_CCM_authenticated_decryption_test_case_256_3),
12653 
12654 		/** Scatter-Gather */
12655 		TEST_CASE_ST(ut_setup, ut_teardown,
12656 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
12657 
12658 		/** Negative tests */
12659 		TEST_CASE_ST(ut_setup, ut_teardown,
12660 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
12661 		TEST_CASE_ST(ut_setup, ut_teardown,
12662 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
12663 		TEST_CASE_ST(ut_setup, ut_teardown,
12664 			authentication_verify_AES128_GMAC_fail_data_corrupt),
12665 		TEST_CASE_ST(ut_setup, ut_teardown,
12666 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
12667 		TEST_CASE_ST(ut_setup, ut_teardown,
12668 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
12669 		TEST_CASE_ST(ut_setup, ut_teardown,
12670 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
12671 
12672 		/* ESN Testcase */
12673 		TEST_CASE_ST(ut_setup, ut_teardown,
12674 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
12675 
12676 		TEST_CASE_ST(ut_setup, ut_teardown,
12677 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
12678 
12679 		TEST_CASES_END() /**< NULL terminate unit test array */
12680 	}
12681 };
12682 
12683 static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {
12684 	.suite_name = "Crypto Device AESNI GCM Unit Test Suite",
12685 	.setup = testsuite_setup,
12686 	.teardown = testsuite_teardown,
12687 	.unit_test_cases = {
12688 		/** AES GCM Authenticated Encryption */
12689 		TEST_CASE_ST(ut_setup, ut_teardown,
12690 			test_AES_GCM_authenticated_encryption_test_case_1),
12691 		TEST_CASE_ST(ut_setup, ut_teardown,
12692 			test_AES_GCM_authenticated_encryption_test_case_2),
12693 		TEST_CASE_ST(ut_setup, ut_teardown,
12694 			test_AES_GCM_authenticated_encryption_test_case_3),
12695 		TEST_CASE_ST(ut_setup, ut_teardown,
12696 			test_AES_GCM_authenticated_encryption_test_case_4),
12697 		TEST_CASE_ST(ut_setup, ut_teardown,
12698 			test_AES_GCM_authenticated_encryption_test_case_5),
12699 		TEST_CASE_ST(ut_setup, ut_teardown,
12700 			test_AES_GCM_authenticated_encryption_test_case_6),
12701 		TEST_CASE_ST(ut_setup, ut_teardown,
12702 			test_AES_GCM_authenticated_encryption_test_case_7),
12703 
12704 		/** AES GCM Authenticated Decryption */
12705 		TEST_CASE_ST(ut_setup, ut_teardown,
12706 			test_AES_GCM_authenticated_decryption_test_case_1),
12707 		TEST_CASE_ST(ut_setup, ut_teardown,
12708 			test_AES_GCM_authenticated_decryption_test_case_2),
12709 		TEST_CASE_ST(ut_setup, ut_teardown,
12710 			test_AES_GCM_authenticated_decryption_test_case_3),
12711 		TEST_CASE_ST(ut_setup, ut_teardown,
12712 			test_AES_GCM_authenticated_decryption_test_case_4),
12713 		TEST_CASE_ST(ut_setup, ut_teardown,
12714 			test_AES_GCM_authenticated_decryption_test_case_5),
12715 		TEST_CASE_ST(ut_setup, ut_teardown,
12716 			test_AES_GCM_authenticated_decryption_test_case_6),
12717 		TEST_CASE_ST(ut_setup, ut_teardown,
12718 			test_AES_GCM_authenticated_decryption_test_case_7),
12719 
12720 		/** AES GCM Authenticated Encryption 192 bits key */
12721 		TEST_CASE_ST(ut_setup, ut_teardown,
12722 			test_AES_GCM_auth_encryption_test_case_192_1),
12723 		TEST_CASE_ST(ut_setup, ut_teardown,
12724 			test_AES_GCM_auth_encryption_test_case_192_2),
12725 		TEST_CASE_ST(ut_setup, ut_teardown,
12726 			test_AES_GCM_auth_encryption_test_case_192_3),
12727 		TEST_CASE_ST(ut_setup, ut_teardown,
12728 			test_AES_GCM_auth_encryption_test_case_192_4),
12729 		TEST_CASE_ST(ut_setup, ut_teardown,
12730 			test_AES_GCM_auth_encryption_test_case_192_5),
12731 		TEST_CASE_ST(ut_setup, ut_teardown,
12732 			test_AES_GCM_auth_encryption_test_case_192_6),
12733 		TEST_CASE_ST(ut_setup, ut_teardown,
12734 			test_AES_GCM_auth_encryption_test_case_192_7),
12735 
12736 		/** AES GCM Authenticated Decryption 192 bits key */
12737 		TEST_CASE_ST(ut_setup, ut_teardown,
12738 			test_AES_GCM_auth_decryption_test_case_192_1),
12739 		TEST_CASE_ST(ut_setup, ut_teardown,
12740 			test_AES_GCM_auth_decryption_test_case_192_2),
12741 		TEST_CASE_ST(ut_setup, ut_teardown,
12742 			test_AES_GCM_auth_decryption_test_case_192_3),
12743 		TEST_CASE_ST(ut_setup, ut_teardown,
12744 			test_AES_GCM_auth_decryption_test_case_192_4),
12745 		TEST_CASE_ST(ut_setup, ut_teardown,
12746 			test_AES_GCM_auth_decryption_test_case_192_5),
12747 		TEST_CASE_ST(ut_setup, ut_teardown,
12748 			test_AES_GCM_auth_decryption_test_case_192_6),
12749 		TEST_CASE_ST(ut_setup, ut_teardown,
12750 			test_AES_GCM_auth_decryption_test_case_192_7),
12751 
12752 		/** AES GCM Authenticated Encryption 256 bits key */
12753 		TEST_CASE_ST(ut_setup, ut_teardown,
12754 			test_AES_GCM_auth_encryption_test_case_256_1),
12755 		TEST_CASE_ST(ut_setup, ut_teardown,
12756 			test_AES_GCM_auth_encryption_test_case_256_2),
12757 		TEST_CASE_ST(ut_setup, ut_teardown,
12758 			test_AES_GCM_auth_encryption_test_case_256_3),
12759 		TEST_CASE_ST(ut_setup, ut_teardown,
12760 			test_AES_GCM_auth_encryption_test_case_256_4),
12761 		TEST_CASE_ST(ut_setup, ut_teardown,
12762 			test_AES_GCM_auth_encryption_test_case_256_5),
12763 		TEST_CASE_ST(ut_setup, ut_teardown,
12764 			test_AES_GCM_auth_encryption_test_case_256_6),
12765 		TEST_CASE_ST(ut_setup, ut_teardown,
12766 			test_AES_GCM_auth_encryption_test_case_256_7),
12767 
12768 		/** AES GCM Authenticated Decryption 256 bits key */
12769 		TEST_CASE_ST(ut_setup, ut_teardown,
12770 			test_AES_GCM_auth_decryption_test_case_256_1),
12771 		TEST_CASE_ST(ut_setup, ut_teardown,
12772 			test_AES_GCM_auth_decryption_test_case_256_2),
12773 		TEST_CASE_ST(ut_setup, ut_teardown,
12774 			test_AES_GCM_auth_decryption_test_case_256_3),
12775 		TEST_CASE_ST(ut_setup, ut_teardown,
12776 			test_AES_GCM_auth_decryption_test_case_256_4),
12777 		TEST_CASE_ST(ut_setup, ut_teardown,
12778 			test_AES_GCM_auth_decryption_test_case_256_5),
12779 		TEST_CASE_ST(ut_setup, ut_teardown,
12780 			test_AES_GCM_auth_decryption_test_case_256_6),
12781 		TEST_CASE_ST(ut_setup, ut_teardown,
12782 			test_AES_GCM_auth_decryption_test_case_256_7),
12783 
12784 		/** AES GCM Authenticated Encryption big aad size */
12785 		TEST_CASE_ST(ut_setup, ut_teardown,
12786 			test_AES_GCM_auth_encryption_test_case_aad_1),
12787 		TEST_CASE_ST(ut_setup, ut_teardown,
12788 			test_AES_GCM_auth_encryption_test_case_aad_2),
12789 
12790 		/** AES GCM Authenticated Decryption big aad size */
12791 		TEST_CASE_ST(ut_setup, ut_teardown,
12792 			test_AES_GCM_auth_decryption_test_case_aad_1),
12793 		TEST_CASE_ST(ut_setup, ut_teardown,
12794 			test_AES_GCM_auth_decryption_test_case_aad_2),
12795 
12796 		/** AES GMAC Authentication */
12797 		TEST_CASE_ST(ut_setup, ut_teardown,
12798 			test_AES_GMAC_authentication_test_case_1),
12799 		TEST_CASE_ST(ut_setup, ut_teardown,
12800 			test_AES_GMAC_authentication_verify_test_case_1),
12801 		TEST_CASE_ST(ut_setup, ut_teardown,
12802 			test_AES_GMAC_authentication_test_case_3),
12803 		TEST_CASE_ST(ut_setup, ut_teardown,
12804 			test_AES_GMAC_authentication_verify_test_case_3),
12805 		TEST_CASE_ST(ut_setup, ut_teardown,
12806 			test_AES_GMAC_authentication_test_case_4),
12807 		TEST_CASE_ST(ut_setup, ut_teardown,
12808 			test_AES_GMAC_authentication_verify_test_case_4),
12809 
12810 		/** Negative tests */
12811 		TEST_CASE_ST(ut_setup, ut_teardown,
12812 			authentication_verify_AES128_GMAC_fail_data_corrupt),
12813 		TEST_CASE_ST(ut_setup, ut_teardown,
12814 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
12815 
12816 		/** Out of place tests */
12817 		TEST_CASE_ST(ut_setup, ut_teardown,
12818 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
12819 		TEST_CASE_ST(ut_setup, ut_teardown,
12820 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
12821 
12822 		/** Session-less tests */
12823 		TEST_CASE_ST(ut_setup, ut_teardown,
12824 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
12825 		TEST_CASE_ST(ut_setup, ut_teardown,
12826 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
12827 
12828 		/** Scatter-Gather */
12829 		TEST_CASE_ST(ut_setup, ut_teardown,
12830 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
12831 
12832 		TEST_CASES_END() /**< NULL terminate unit test array */
12833 	}
12834 };
12835 
12836 static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
12837 	.suite_name = "Crypto Device SW KASUMI Unit Test Suite",
12838 	.setup = testsuite_setup,
12839 	.teardown = testsuite_teardown,
12840 	.unit_test_cases = {
12841 		/** KASUMI encrypt only (UEA1) */
12842 		TEST_CASE_ST(ut_setup, ut_teardown,
12843 			test_kasumi_encryption_test_case_1),
12844 		TEST_CASE_ST(ut_setup, ut_teardown,
12845 			test_kasumi_encryption_test_case_1_sgl),
12846 		TEST_CASE_ST(ut_setup, ut_teardown,
12847 			test_kasumi_encryption_test_case_2),
12848 		TEST_CASE_ST(ut_setup, ut_teardown,
12849 			test_kasumi_encryption_test_case_3),
12850 		TEST_CASE_ST(ut_setup, ut_teardown,
12851 			test_kasumi_encryption_test_case_4),
12852 		TEST_CASE_ST(ut_setup, ut_teardown,
12853 			test_kasumi_encryption_test_case_5),
12854 		/** KASUMI decrypt only (UEA1) */
12855 		TEST_CASE_ST(ut_setup, ut_teardown,
12856 			test_kasumi_decryption_test_case_1),
12857 		TEST_CASE_ST(ut_setup, ut_teardown,
12858 			test_kasumi_decryption_test_case_2),
12859 		TEST_CASE_ST(ut_setup, ut_teardown,
12860 			test_kasumi_decryption_test_case_3),
12861 		TEST_CASE_ST(ut_setup, ut_teardown,
12862 			test_kasumi_decryption_test_case_4),
12863 		TEST_CASE_ST(ut_setup, ut_teardown,
12864 			test_kasumi_decryption_test_case_5),
12865 
12866 		TEST_CASE_ST(ut_setup, ut_teardown,
12867 			test_kasumi_encryption_test_case_1_oop),
12868 		TEST_CASE_ST(ut_setup, ut_teardown,
12869 			test_kasumi_encryption_test_case_1_oop_sgl),
12870 
12871 
12872 		TEST_CASE_ST(ut_setup, ut_teardown,
12873 			test_kasumi_decryption_test_case_1_oop),
12874 
12875 		/** KASUMI hash only (UIA1) */
12876 		TEST_CASE_ST(ut_setup, ut_teardown,
12877 			test_kasumi_hash_generate_test_case_1),
12878 		TEST_CASE_ST(ut_setup, ut_teardown,
12879 			test_kasumi_hash_generate_test_case_2),
12880 		TEST_CASE_ST(ut_setup, ut_teardown,
12881 			test_kasumi_hash_generate_test_case_3),
12882 		TEST_CASE_ST(ut_setup, ut_teardown,
12883 			test_kasumi_hash_generate_test_case_4),
12884 		TEST_CASE_ST(ut_setup, ut_teardown,
12885 			test_kasumi_hash_generate_test_case_5),
12886 		TEST_CASE_ST(ut_setup, ut_teardown,
12887 			test_kasumi_hash_generate_test_case_6),
12888 		TEST_CASE_ST(ut_setup, ut_teardown,
12889 			test_kasumi_hash_verify_test_case_1),
12890 		TEST_CASE_ST(ut_setup, ut_teardown,
12891 			test_kasumi_hash_verify_test_case_2),
12892 		TEST_CASE_ST(ut_setup, ut_teardown,
12893 			test_kasumi_hash_verify_test_case_3),
12894 		TEST_CASE_ST(ut_setup, ut_teardown,
12895 			test_kasumi_hash_verify_test_case_4),
12896 		TEST_CASE_ST(ut_setup, ut_teardown,
12897 			test_kasumi_hash_verify_test_case_5),
12898 		TEST_CASE_ST(ut_setup, ut_teardown,
12899 			test_kasumi_cipher_auth_test_case_1),
12900 
12901 		/** KASUMI generate auth, then encrypt (F8) */
12902 		TEST_CASE_ST(ut_setup, ut_teardown,
12903 			test_kasumi_auth_cipher_test_case_1),
12904 		TEST_CASE_ST(ut_setup, ut_teardown,
12905 			test_kasumi_auth_cipher_test_case_2),
12906 		TEST_CASE_ST(ut_setup, ut_teardown,
12907 			test_kasumi_auth_cipher_test_case_2_oop),
12908 		TEST_CASE_ST(ut_setup, ut_teardown,
12909 			test_kasumi_auth_cipher_test_case_2_sgl),
12910 		TEST_CASE_ST(ut_setup, ut_teardown,
12911 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
12912 
12913 		/** KASUMI decrypt (F8), then verify auth */
12914 		TEST_CASE_ST(ut_setup, ut_teardown,
12915 			test_kasumi_auth_cipher_verify_test_case_1),
12916 		TEST_CASE_ST(ut_setup, ut_teardown,
12917 			test_kasumi_auth_cipher_verify_test_case_2),
12918 		TEST_CASE_ST(ut_setup, ut_teardown,
12919 			test_kasumi_auth_cipher_verify_test_case_2_oop),
12920 		TEST_CASE_ST(ut_setup, ut_teardown,
12921 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
12922 		TEST_CASE_ST(ut_setup, ut_teardown,
12923 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
12924 		TEST_CASES_END() /**< NULL terminate unit test array */
12925 	}
12926 };
12927 static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {
12928 	.suite_name = "Crypto Device SW SNOW 3G Unit Test Suite",
12929 	.setup = testsuite_setup,
12930 	.teardown = testsuite_teardown,
12931 	.unit_test_cases = {
12932 		/** SNOW 3G encrypt only (UEA2) */
12933 		TEST_CASE_ST(ut_setup, ut_teardown,
12934 			test_snow3g_encryption_test_case_1),
12935 		TEST_CASE_ST(ut_setup, ut_teardown,
12936 			test_snow3g_encryption_test_case_2),
12937 		TEST_CASE_ST(ut_setup, ut_teardown,
12938 			test_snow3g_encryption_test_case_3),
12939 		TEST_CASE_ST(ut_setup, ut_teardown,
12940 			test_snow3g_encryption_test_case_4),
12941 		TEST_CASE_ST(ut_setup, ut_teardown,
12942 			test_snow3g_encryption_test_case_5),
12943 		TEST_CASE_ST(ut_setup, ut_teardown,
12944 			test_snow3g_auth_cipher_with_digest_test_case_1),
12945 
12946 		TEST_CASE_ST(ut_setup, ut_teardown,
12947 			test_snow3g_encryption_test_case_1_oop),
12948 		TEST_CASE_ST(ut_setup, ut_teardown,
12949 				test_snow3g_encryption_test_case_1_oop_sgl),
12950 		TEST_CASE_ST(ut_setup, ut_teardown,
12951 			test_snow3g_decryption_test_case_1_oop),
12952 
12953 		TEST_CASE_ST(ut_setup, ut_teardown,
12954 			test_snow3g_encryption_test_case_1_offset_oop),
12955 
12956 		/** SNOW 3G decrypt only (UEA2) */
12957 		TEST_CASE_ST(ut_setup, ut_teardown,
12958 			test_snow3g_decryption_test_case_1),
12959 		TEST_CASE_ST(ut_setup, ut_teardown,
12960 			test_snow3g_decryption_test_case_2),
12961 		TEST_CASE_ST(ut_setup, ut_teardown,
12962 			test_snow3g_decryption_test_case_3),
12963 		TEST_CASE_ST(ut_setup, ut_teardown,
12964 			test_snow3g_decryption_test_case_4),
12965 		TEST_CASE_ST(ut_setup, ut_teardown,
12966 			test_snow3g_decryption_test_case_5),
12967 		TEST_CASE_ST(ut_setup, ut_teardown,
12968 			test_snow3g_decryption_with_digest_test_case_1),
12969 		TEST_CASE_ST(ut_setup, ut_teardown,
12970 			test_snow3g_hash_generate_test_case_1),
12971 		TEST_CASE_ST(ut_setup, ut_teardown,
12972 			test_snow3g_hash_generate_test_case_2),
12973 		TEST_CASE_ST(ut_setup, ut_teardown,
12974 			test_snow3g_hash_generate_test_case_3),
12975 		/* Tests with buffers which length is not byte-aligned */
12976 		TEST_CASE_ST(ut_setup, ut_teardown,
12977 			test_snow3g_hash_generate_test_case_4),
12978 		TEST_CASE_ST(ut_setup, ut_teardown,
12979 			test_snow3g_hash_generate_test_case_5),
12980 		TEST_CASE_ST(ut_setup, ut_teardown,
12981 			test_snow3g_hash_generate_test_case_6),
12982 		TEST_CASE_ST(ut_setup, ut_teardown,
12983 			test_snow3g_hash_verify_test_case_1),
12984 		TEST_CASE_ST(ut_setup, ut_teardown,
12985 			test_snow3g_hash_verify_test_case_2),
12986 		TEST_CASE_ST(ut_setup, ut_teardown,
12987 			test_snow3g_hash_verify_test_case_3),
12988 		/* Tests with buffers which length is not byte-aligned */
12989 		TEST_CASE_ST(ut_setup, ut_teardown,
12990 			test_snow3g_hash_verify_test_case_4),
12991 		TEST_CASE_ST(ut_setup, ut_teardown,
12992 			test_snow3g_hash_verify_test_case_5),
12993 		TEST_CASE_ST(ut_setup, ut_teardown,
12994 			test_snow3g_hash_verify_test_case_6),
12995 		TEST_CASE_ST(ut_setup, ut_teardown,
12996 			test_snow3g_cipher_auth_test_case_1),
12997 
12998 		/** SNOW 3G generate auth, then encrypt (UEA2) */
12999 		TEST_CASE_ST(ut_setup, ut_teardown,
13000 			test_snow3g_auth_cipher_test_case_1),
13001 		TEST_CASE_ST(ut_setup, ut_teardown,
13002 			test_snow3g_auth_cipher_test_case_2),
13003 		TEST_CASE_ST(ut_setup, ut_teardown,
13004 			test_snow3g_auth_cipher_test_case_2_oop),
13005 		TEST_CASE_ST(ut_setup, ut_teardown,
13006 			test_snow3g_auth_cipher_part_digest_enc),
13007 		TEST_CASE_ST(ut_setup, ut_teardown,
13008 			test_snow3g_auth_cipher_part_digest_enc_oop),
13009 		TEST_CASE_ST(ut_setup, ut_teardown,
13010 			test_snow3g_auth_cipher_test_case_3_sgl),
13011 		TEST_CASE_ST(ut_setup, ut_teardown,
13012 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
13013 		TEST_CASE_ST(ut_setup, ut_teardown,
13014 			test_snow3g_auth_cipher_part_digest_enc_sgl),
13015 		TEST_CASE_ST(ut_setup, ut_teardown,
13016 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13017 
13018 		/** SNOW 3G decrypt (UEA2), then verify auth */
13019 		TEST_CASE_ST(ut_setup, ut_teardown,
13020 			test_snow3g_auth_cipher_verify_test_case_1),
13021 		TEST_CASE_ST(ut_setup, ut_teardown,
13022 			test_snow3g_auth_cipher_verify_test_case_2),
13023 		TEST_CASE_ST(ut_setup, ut_teardown,
13024 			test_snow3g_auth_cipher_verify_test_case_2_oop),
13025 		TEST_CASE_ST(ut_setup, ut_teardown,
13026 			test_snow3g_auth_cipher_verify_part_digest_enc),
13027 		TEST_CASE_ST(ut_setup, ut_teardown,
13028 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13029 		TEST_CASE_ST(ut_setup, ut_teardown,
13030 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
13031 		TEST_CASE_ST(ut_setup, ut_teardown,
13032 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13033 		TEST_CASE_ST(ut_setup, ut_teardown,
13034 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13035 		TEST_CASE_ST(ut_setup, ut_teardown,
13036 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13037 
13038 		TEST_CASES_END() /**< NULL terminate unit test array */
13039 	}
13040 };
13041 
13042 static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {
13043 	.suite_name = "Crypto Device SW ZUC Unit Test Suite",
13044 	.setup = testsuite_setup,
13045 	.teardown = testsuite_teardown,
13046 	.unit_test_cases = {
13047 		/** ZUC encrypt only (EEA3) */
13048 		TEST_CASE_ST(ut_setup, ut_teardown,
13049 			test_zuc_encryption_test_case_1),
13050 		TEST_CASE_ST(ut_setup, ut_teardown,
13051 			test_zuc_encryption_test_case_2),
13052 		TEST_CASE_ST(ut_setup, ut_teardown,
13053 			test_zuc_encryption_test_case_3),
13054 		TEST_CASE_ST(ut_setup, ut_teardown,
13055 			test_zuc_encryption_test_case_4),
13056 		TEST_CASE_ST(ut_setup, ut_teardown,
13057 			test_zuc_encryption_test_case_5),
13058 		TEST_CASE_ST(ut_setup, ut_teardown,
13059 			test_zuc_hash_generate_test_case_1),
13060 		TEST_CASE_ST(ut_setup, ut_teardown,
13061 			test_zuc_hash_generate_test_case_2),
13062 		TEST_CASE_ST(ut_setup, ut_teardown,
13063 			test_zuc_hash_generate_test_case_3),
13064 		TEST_CASE_ST(ut_setup, ut_teardown,
13065 			test_zuc_hash_generate_test_case_4),
13066 		TEST_CASE_ST(ut_setup, ut_teardown,
13067 			test_zuc_hash_generate_test_case_5),
13068 		TEST_CASE_ST(ut_setup, ut_teardown,
13069 			test_zuc_encryption_test_case_6_sgl),
13070 		TEST_CASES_END() /**< NULL terminate unit test array */
13071 	}
13072 };
13073 
13074 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13075 	.suite_name = "Crypto CAAM JR Unit Test Suite",
13076 	.setup = testsuite_setup,
13077 	.teardown = testsuite_teardown,
13078 	.unit_test_cases = {
13079 		TEST_CASE_ST(ut_setup, ut_teardown,
13080 			     test_device_configure_invalid_dev_id),
13081 		TEST_CASE_ST(ut_setup, ut_teardown,
13082 			     test_multi_session),
13083 
13084 		TEST_CASE_ST(ut_setup, ut_teardown,
13085 			     test_AES_chain_caam_jr_all),
13086 		TEST_CASE_ST(ut_setup, ut_teardown,
13087 			     test_3DES_chain_caam_jr_all),
13088 		TEST_CASE_ST(ut_setup, ut_teardown,
13089 			     test_AES_cipheronly_caam_jr_all),
13090 		TEST_CASE_ST(ut_setup, ut_teardown,
13091 			     test_3DES_cipheronly_caam_jr_all),
13092 		TEST_CASE_ST(ut_setup, ut_teardown,
13093 			     test_authonly_caam_jr_all),
13094 
13095 		TEST_CASES_END() /**< NULL terminate unit test array */
13096 	}
13097 };
13098 
13099 static struct unit_test_suite cryptodev_dpaa_sec_testsuite  = {
13100 	.suite_name = "Crypto DPAA_SEC Unit Test Suite",
13101 	.setup = testsuite_setup,
13102 	.teardown = testsuite_teardown,
13103 	.unit_test_cases = {
13104 		TEST_CASE_ST(ut_setup, ut_teardown,
13105 			     test_device_configure_invalid_dev_id),
13106 		TEST_CASE_ST(ut_setup, ut_teardown,
13107 			     test_multi_session),
13108 
13109 		TEST_CASE_ST(ut_setup, ut_teardown,
13110 			     test_AES_chain_dpaa_sec_all),
13111 		TEST_CASE_ST(ut_setup, ut_teardown,
13112 			     test_3DES_chain_dpaa_sec_all),
13113 		TEST_CASE_ST(ut_setup, ut_teardown,
13114 			     test_AES_cipheronly_dpaa_sec_all),
13115 		TEST_CASE_ST(ut_setup, ut_teardown,
13116 			     test_3DES_cipheronly_dpaa_sec_all),
13117 		TEST_CASE_ST(ut_setup, ut_teardown,
13118 			     test_authonly_dpaa_sec_all),
13119 
13120 #ifdef RTE_LIBRTE_SECURITY
13121 		TEST_CASE_ST(ut_setup, ut_teardown,
13122 			test_PDCP_PROTO_cplane_encap_all),
13123 
13124 		TEST_CASE_ST(ut_setup, ut_teardown,
13125 			test_PDCP_PROTO_cplane_decap_all),
13126 
13127 		TEST_CASE_ST(ut_setup, ut_teardown,
13128 			test_PDCP_PROTO_uplane_encap_all),
13129 
13130 		TEST_CASE_ST(ut_setup, ut_teardown,
13131 			test_PDCP_PROTO_uplane_decap_all),
13132 
13133 		TEST_CASE_ST(ut_setup, ut_teardown,
13134 			test_PDCP_PROTO_SGL_in_place_32B),
13135 		TEST_CASE_ST(ut_setup, ut_teardown,
13136 			test_PDCP_PROTO_SGL_oop_32B_128B),
13137 		TEST_CASE_ST(ut_setup, ut_teardown,
13138 			test_PDCP_PROTO_SGL_oop_32B_40B),
13139 		TEST_CASE_ST(ut_setup, ut_teardown,
13140 			test_PDCP_PROTO_SGL_oop_128B_32B),
13141 #endif
13142 		/** AES GCM Authenticated Encryption */
13143 		TEST_CASE_ST(ut_setup, ut_teardown,
13144 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13145 		TEST_CASE_ST(ut_setup, ut_teardown,
13146 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13147 		TEST_CASE_ST(ut_setup, ut_teardown,
13148 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13149 		TEST_CASE_ST(ut_setup, ut_teardown,
13150 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13151 		TEST_CASE_ST(ut_setup, ut_teardown,
13152 			test_AES_GCM_authenticated_encryption_test_case_1),
13153 		TEST_CASE_ST(ut_setup, ut_teardown,
13154 			test_AES_GCM_authenticated_encryption_test_case_2),
13155 		TEST_CASE_ST(ut_setup, ut_teardown,
13156 			test_AES_GCM_authenticated_encryption_test_case_3),
13157 		TEST_CASE_ST(ut_setup, ut_teardown,
13158 			test_AES_GCM_authenticated_encryption_test_case_4),
13159 		TEST_CASE_ST(ut_setup, ut_teardown,
13160 			test_AES_GCM_authenticated_encryption_test_case_5),
13161 		TEST_CASE_ST(ut_setup, ut_teardown,
13162 			test_AES_GCM_authenticated_encryption_test_case_6),
13163 		TEST_CASE_ST(ut_setup, ut_teardown,
13164 			test_AES_GCM_authenticated_encryption_test_case_7),
13165 		TEST_CASE_ST(ut_setup, ut_teardown,
13166 			test_AES_GCM_authenticated_encryption_test_case_8),
13167 
13168 		/** AES GCM Authenticated Decryption */
13169 		TEST_CASE_ST(ut_setup, ut_teardown,
13170 			test_AES_GCM_authenticated_decryption_test_case_1),
13171 		TEST_CASE_ST(ut_setup, ut_teardown,
13172 			test_AES_GCM_authenticated_decryption_test_case_2),
13173 		TEST_CASE_ST(ut_setup, ut_teardown,
13174 			test_AES_GCM_authenticated_decryption_test_case_3),
13175 		TEST_CASE_ST(ut_setup, ut_teardown,
13176 			test_AES_GCM_authenticated_decryption_test_case_4),
13177 		TEST_CASE_ST(ut_setup, ut_teardown,
13178 			test_AES_GCM_authenticated_decryption_test_case_5),
13179 		TEST_CASE_ST(ut_setup, ut_teardown,
13180 			test_AES_GCM_authenticated_decryption_test_case_6),
13181 		TEST_CASE_ST(ut_setup, ut_teardown,
13182 			test_AES_GCM_authenticated_decryption_test_case_7),
13183 		TEST_CASE_ST(ut_setup, ut_teardown,
13184 			test_AES_GCM_authenticated_decryption_test_case_8),
13185 
13186 		/** AES GCM Authenticated Encryption 192 bits key */
13187 		TEST_CASE_ST(ut_setup, ut_teardown,
13188 			test_AES_GCM_auth_encryption_test_case_192_1),
13189 		TEST_CASE_ST(ut_setup, ut_teardown,
13190 			test_AES_GCM_auth_encryption_test_case_192_2),
13191 		TEST_CASE_ST(ut_setup, ut_teardown,
13192 			test_AES_GCM_auth_encryption_test_case_192_3),
13193 		TEST_CASE_ST(ut_setup, ut_teardown,
13194 			test_AES_GCM_auth_encryption_test_case_192_4),
13195 		TEST_CASE_ST(ut_setup, ut_teardown,
13196 			test_AES_GCM_auth_encryption_test_case_192_5),
13197 		TEST_CASE_ST(ut_setup, ut_teardown,
13198 			test_AES_GCM_auth_encryption_test_case_192_6),
13199 		TEST_CASE_ST(ut_setup, ut_teardown,
13200 			test_AES_GCM_auth_encryption_test_case_192_7),
13201 
13202 		/** AES GCM Authenticated Decryption 192 bits key */
13203 		TEST_CASE_ST(ut_setup, ut_teardown,
13204 			test_AES_GCM_auth_decryption_test_case_192_1),
13205 		TEST_CASE_ST(ut_setup, ut_teardown,
13206 			test_AES_GCM_auth_decryption_test_case_192_2),
13207 		TEST_CASE_ST(ut_setup, ut_teardown,
13208 			test_AES_GCM_auth_decryption_test_case_192_3),
13209 		TEST_CASE_ST(ut_setup, ut_teardown,
13210 			test_AES_GCM_auth_decryption_test_case_192_4),
13211 		TEST_CASE_ST(ut_setup, ut_teardown,
13212 			test_AES_GCM_auth_decryption_test_case_192_5),
13213 		TEST_CASE_ST(ut_setup, ut_teardown,
13214 			test_AES_GCM_auth_decryption_test_case_192_6),
13215 		TEST_CASE_ST(ut_setup, ut_teardown,
13216 			test_AES_GCM_auth_decryption_test_case_192_7),
13217 
13218 		/** AES GCM Authenticated Encryption 256 bits key */
13219 		TEST_CASE_ST(ut_setup, ut_teardown,
13220 			test_AES_GCM_auth_encryption_test_case_256_1),
13221 		TEST_CASE_ST(ut_setup, ut_teardown,
13222 			test_AES_GCM_auth_encryption_test_case_256_2),
13223 		TEST_CASE_ST(ut_setup, ut_teardown,
13224 			test_AES_GCM_auth_encryption_test_case_256_3),
13225 		TEST_CASE_ST(ut_setup, ut_teardown,
13226 			test_AES_GCM_auth_encryption_test_case_256_4),
13227 		TEST_CASE_ST(ut_setup, ut_teardown,
13228 			test_AES_GCM_auth_encryption_test_case_256_5),
13229 		TEST_CASE_ST(ut_setup, ut_teardown,
13230 			test_AES_GCM_auth_encryption_test_case_256_6),
13231 		TEST_CASE_ST(ut_setup, ut_teardown,
13232 			test_AES_GCM_auth_encryption_test_case_256_7),
13233 
13234 		/** AES GCM Authenticated Decryption 256 bits key */
13235 		TEST_CASE_ST(ut_setup, ut_teardown,
13236 			test_AES_GCM_auth_decryption_test_case_256_1),
13237 		TEST_CASE_ST(ut_setup, ut_teardown,
13238 			test_AES_GCM_auth_decryption_test_case_256_2),
13239 		TEST_CASE_ST(ut_setup, ut_teardown,
13240 			test_AES_GCM_auth_decryption_test_case_256_3),
13241 		TEST_CASE_ST(ut_setup, ut_teardown,
13242 			test_AES_GCM_auth_decryption_test_case_256_4),
13243 		TEST_CASE_ST(ut_setup, ut_teardown,
13244 			test_AES_GCM_auth_decryption_test_case_256_5),
13245 		TEST_CASE_ST(ut_setup, ut_teardown,
13246 			test_AES_GCM_auth_decryption_test_case_256_6),
13247 		TEST_CASE_ST(ut_setup, ut_teardown,
13248 			test_AES_GCM_auth_decryption_test_case_256_7),
13249 
13250 		/** Out of place tests */
13251 		TEST_CASE_ST(ut_setup, ut_teardown,
13252 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13253 		TEST_CASE_ST(ut_setup, ut_teardown,
13254 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13255 
13256 		/** SNOW 3G encrypt only (UEA2) */
13257 		TEST_CASE_ST(ut_setup, ut_teardown,
13258 			test_snow3g_encryption_test_case_1),
13259 		TEST_CASE_ST(ut_setup, ut_teardown,
13260 			test_snow3g_encryption_test_case_2),
13261 		TEST_CASE_ST(ut_setup, ut_teardown,
13262 			test_snow3g_encryption_test_case_3),
13263 		TEST_CASE_ST(ut_setup, ut_teardown,
13264 			test_snow3g_encryption_test_case_4),
13265 		TEST_CASE_ST(ut_setup, ut_teardown,
13266 			test_snow3g_encryption_test_case_5),
13267 
13268 		TEST_CASE_ST(ut_setup, ut_teardown,
13269 			test_snow3g_encryption_test_case_1_oop),
13270 		TEST_CASE_ST(ut_setup, ut_teardown,
13271 				test_snow3g_encryption_test_case_1_oop_sgl),
13272 		TEST_CASE_ST(ut_setup, ut_teardown,
13273 			test_snow3g_decryption_test_case_1_oop),
13274 
13275 		/** SNOW 3G decrypt only (UEA2) */
13276 		TEST_CASE_ST(ut_setup, ut_teardown,
13277 			test_snow3g_decryption_test_case_1),
13278 		TEST_CASE_ST(ut_setup, ut_teardown,
13279 			test_snow3g_decryption_test_case_2),
13280 		TEST_CASE_ST(ut_setup, ut_teardown,
13281 			test_snow3g_decryption_test_case_3),
13282 		TEST_CASE_ST(ut_setup, ut_teardown,
13283 			test_snow3g_decryption_test_case_4),
13284 		TEST_CASE_ST(ut_setup, ut_teardown,
13285 			test_snow3g_decryption_test_case_5),
13286 
13287 		TEST_CASE_ST(ut_setup, ut_teardown,
13288 			test_snow3g_hash_generate_test_case_1),
13289 		TEST_CASE_ST(ut_setup, ut_teardown,
13290 			test_snow3g_hash_generate_test_case_2),
13291 		TEST_CASE_ST(ut_setup, ut_teardown,
13292 			test_snow3g_hash_generate_test_case_3),
13293 		TEST_CASE_ST(ut_setup, ut_teardown,
13294 			test_snow3g_hash_verify_test_case_1),
13295 		TEST_CASE_ST(ut_setup, ut_teardown,
13296 			test_snow3g_hash_verify_test_case_2),
13297 		TEST_CASE_ST(ut_setup, ut_teardown,
13298 			test_snow3g_hash_verify_test_case_3),
13299 
13300 		/** ZUC encrypt only (EEA3) */
13301 		TEST_CASE_ST(ut_setup, ut_teardown,
13302 			test_zuc_encryption_test_case_1),
13303 		TEST_CASE_ST(ut_setup, ut_teardown,
13304 			test_zuc_encryption_test_case_2),
13305 		TEST_CASE_ST(ut_setup, ut_teardown,
13306 			test_zuc_encryption_test_case_3),
13307 		TEST_CASE_ST(ut_setup, ut_teardown,
13308 			test_zuc_encryption_test_case_4),
13309 		TEST_CASE_ST(ut_setup, ut_teardown,
13310 			test_zuc_encryption_test_case_5),
13311 
13312 		/** ZUC authenticate (EIA3) */
13313 		TEST_CASE_ST(ut_setup, ut_teardown,
13314 			test_zuc_hash_generate_test_case_6),
13315 		TEST_CASE_ST(ut_setup, ut_teardown,
13316 			test_zuc_hash_generate_test_case_7),
13317 		TEST_CASE_ST(ut_setup, ut_teardown,
13318 			test_zuc_hash_generate_test_case_8),
13319 
13320 		/** Negative tests */
13321 		TEST_CASE_ST(ut_setup, ut_teardown,
13322 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
13323 		TEST_CASE_ST(ut_setup, ut_teardown,
13324 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13325 		TEST_CASE_ST(ut_setup, ut_teardown,
13326 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13327 		TEST_CASE_ST(ut_setup, ut_teardown,
13328 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13329 		TEST_CASE_ST(ut_setup, ut_teardown,
13330 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
13331 		TEST_CASE_ST(ut_setup, ut_teardown,
13332 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
13333 		TEST_CASE_ST(ut_setup, ut_teardown,
13334 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
13335 		TEST_CASE_ST(ut_setup, ut_teardown,
13336 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13337 		TEST_CASE_ST(ut_setup, ut_teardown,
13338 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13339 		TEST_CASE_ST(ut_setup, ut_teardown,
13340 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13341 		TEST_CASE_ST(ut_setup, ut_teardown,
13342 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
13343 		TEST_CASE_ST(ut_setup, ut_teardown,
13344 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
13345 		TEST_CASE_ST(ut_setup, ut_teardown,
13346 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13347 		TEST_CASE_ST(ut_setup, ut_teardown,
13348 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13349 		TEST_CASE_ST(ut_setup, ut_teardown,
13350 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13351 		TEST_CASE_ST(ut_setup, ut_teardown,
13352 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13353 
13354 		/* ESN Testcase */
13355 		TEST_CASE_ST(ut_setup, ut_teardown,
13356 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13357 		TEST_CASE_ST(ut_setup, ut_teardown,
13358 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13359 
13360 		TEST_CASES_END() /**< NULL terminate unit test array */
13361 	}
13362 };
13363 
13364 static struct unit_test_suite cryptodev_dpaa2_sec_testsuite  = {
13365 	.suite_name = "Crypto DPAA2_SEC Unit Test Suite",
13366 	.setup = testsuite_setup,
13367 	.teardown = testsuite_teardown,
13368 	.unit_test_cases = {
13369 		TEST_CASE_ST(ut_setup, ut_teardown,
13370 			test_device_configure_invalid_dev_id),
13371 		TEST_CASE_ST(ut_setup, ut_teardown,
13372 			test_multi_session),
13373 		TEST_CASE_ST(ut_setup, ut_teardown,
13374 			test_AES_chain_dpaa2_sec_all),
13375 		TEST_CASE_ST(ut_setup, ut_teardown,
13376 			test_3DES_chain_dpaa2_sec_all),
13377 		TEST_CASE_ST(ut_setup, ut_teardown,
13378 			test_AES_cipheronly_dpaa2_sec_all),
13379 		TEST_CASE_ST(ut_setup, ut_teardown,
13380 			test_3DES_cipheronly_dpaa2_sec_all),
13381 		TEST_CASE_ST(ut_setup, ut_teardown,
13382 			test_authonly_dpaa2_sec_all),
13383 
13384 #ifdef RTE_LIBRTE_SECURITY
13385 		TEST_CASE_ST(ut_setup, ut_teardown,
13386 			test_PDCP_PROTO_cplane_encap_all),
13387 
13388 		TEST_CASE_ST(ut_setup, ut_teardown,
13389 			test_PDCP_PROTO_cplane_decap_all),
13390 
13391 		TEST_CASE_ST(ut_setup, ut_teardown,
13392 			test_PDCP_PROTO_uplane_encap_all),
13393 
13394 		TEST_CASE_ST(ut_setup, ut_teardown,
13395 			test_PDCP_PROTO_uplane_decap_all),
13396 
13397 		TEST_CASE_ST(ut_setup, ut_teardown,
13398 			test_PDCP_PROTO_SGL_in_place_32B),
13399 		TEST_CASE_ST(ut_setup, ut_teardown,
13400 			test_PDCP_PROTO_SGL_oop_32B_128B),
13401 		TEST_CASE_ST(ut_setup, ut_teardown,
13402 			test_PDCP_PROTO_SGL_oop_32B_40B),
13403 		TEST_CASE_ST(ut_setup, ut_teardown,
13404 			test_PDCP_PROTO_SGL_oop_128B_32B),
13405 #endif
13406 		/** AES GCM Authenticated Encryption */
13407 		TEST_CASE_ST(ut_setup, ut_teardown,
13408 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13409 		TEST_CASE_ST(ut_setup, ut_teardown,
13410 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13411 		TEST_CASE_ST(ut_setup, ut_teardown,
13412 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13413 		TEST_CASE_ST(ut_setup, ut_teardown,
13414 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13415 		TEST_CASE_ST(ut_setup, ut_teardown,
13416 			test_AES_GCM_authenticated_encryption_test_case_1),
13417 		TEST_CASE_ST(ut_setup, ut_teardown,
13418 			test_AES_GCM_authenticated_encryption_test_case_2),
13419 		TEST_CASE_ST(ut_setup, ut_teardown,
13420 			test_AES_GCM_authenticated_encryption_test_case_3),
13421 		TEST_CASE_ST(ut_setup, ut_teardown,
13422 			test_AES_GCM_authenticated_encryption_test_case_4),
13423 		TEST_CASE_ST(ut_setup, ut_teardown,
13424 			test_AES_GCM_authenticated_encryption_test_case_5),
13425 		TEST_CASE_ST(ut_setup, ut_teardown,
13426 			test_AES_GCM_authenticated_encryption_test_case_6),
13427 		TEST_CASE_ST(ut_setup, ut_teardown,
13428 			test_AES_GCM_authenticated_encryption_test_case_7),
13429 		TEST_CASE_ST(ut_setup, ut_teardown,
13430 			test_AES_GCM_authenticated_encryption_test_case_8),
13431 
13432 		/** AES GCM Authenticated Decryption */
13433 		TEST_CASE_ST(ut_setup, ut_teardown,
13434 			test_AES_GCM_authenticated_decryption_test_case_1),
13435 		TEST_CASE_ST(ut_setup, ut_teardown,
13436 			test_AES_GCM_authenticated_decryption_test_case_2),
13437 		TEST_CASE_ST(ut_setup, ut_teardown,
13438 			test_AES_GCM_authenticated_decryption_test_case_3),
13439 		TEST_CASE_ST(ut_setup, ut_teardown,
13440 			test_AES_GCM_authenticated_decryption_test_case_4),
13441 		TEST_CASE_ST(ut_setup, ut_teardown,
13442 			test_AES_GCM_authenticated_decryption_test_case_5),
13443 		TEST_CASE_ST(ut_setup, ut_teardown,
13444 			test_AES_GCM_authenticated_decryption_test_case_6),
13445 		TEST_CASE_ST(ut_setup, ut_teardown,
13446 			test_AES_GCM_authenticated_decryption_test_case_7),
13447 		TEST_CASE_ST(ut_setup, ut_teardown,
13448 			test_AES_GCM_authenticated_decryption_test_case_8),
13449 
13450 		/** AES GCM Authenticated Encryption 192 bits key */
13451 		TEST_CASE_ST(ut_setup, ut_teardown,
13452 			test_AES_GCM_auth_encryption_test_case_192_1),
13453 		TEST_CASE_ST(ut_setup, ut_teardown,
13454 			test_AES_GCM_auth_encryption_test_case_192_2),
13455 		TEST_CASE_ST(ut_setup, ut_teardown,
13456 			test_AES_GCM_auth_encryption_test_case_192_3),
13457 		TEST_CASE_ST(ut_setup, ut_teardown,
13458 			test_AES_GCM_auth_encryption_test_case_192_4),
13459 		TEST_CASE_ST(ut_setup, ut_teardown,
13460 			test_AES_GCM_auth_encryption_test_case_192_5),
13461 		TEST_CASE_ST(ut_setup, ut_teardown,
13462 			test_AES_GCM_auth_encryption_test_case_192_6),
13463 		TEST_CASE_ST(ut_setup, ut_teardown,
13464 			test_AES_GCM_auth_encryption_test_case_192_7),
13465 
13466 		/** AES GCM Authenticated Decryption 192 bits key */
13467 		TEST_CASE_ST(ut_setup, ut_teardown,
13468 			test_AES_GCM_auth_decryption_test_case_192_1),
13469 		TEST_CASE_ST(ut_setup, ut_teardown,
13470 			test_AES_GCM_auth_decryption_test_case_192_2),
13471 		TEST_CASE_ST(ut_setup, ut_teardown,
13472 			test_AES_GCM_auth_decryption_test_case_192_3),
13473 		TEST_CASE_ST(ut_setup, ut_teardown,
13474 			test_AES_GCM_auth_decryption_test_case_192_4),
13475 		TEST_CASE_ST(ut_setup, ut_teardown,
13476 			test_AES_GCM_auth_decryption_test_case_192_5),
13477 		TEST_CASE_ST(ut_setup, ut_teardown,
13478 			test_AES_GCM_auth_decryption_test_case_192_6),
13479 		TEST_CASE_ST(ut_setup, ut_teardown,
13480 			test_AES_GCM_auth_decryption_test_case_192_7),
13481 
13482 		/** AES GCM Authenticated Encryption 256 bits key */
13483 		TEST_CASE_ST(ut_setup, ut_teardown,
13484 			test_AES_GCM_auth_encryption_test_case_256_1),
13485 		TEST_CASE_ST(ut_setup, ut_teardown,
13486 			test_AES_GCM_auth_encryption_test_case_256_2),
13487 		TEST_CASE_ST(ut_setup, ut_teardown,
13488 			test_AES_GCM_auth_encryption_test_case_256_3),
13489 		TEST_CASE_ST(ut_setup, ut_teardown,
13490 			test_AES_GCM_auth_encryption_test_case_256_4),
13491 		TEST_CASE_ST(ut_setup, ut_teardown,
13492 			test_AES_GCM_auth_encryption_test_case_256_5),
13493 		TEST_CASE_ST(ut_setup, ut_teardown,
13494 			test_AES_GCM_auth_encryption_test_case_256_6),
13495 		TEST_CASE_ST(ut_setup, ut_teardown,
13496 			test_AES_GCM_auth_encryption_test_case_256_7),
13497 
13498 		/** AES GCM Authenticated Decryption 256 bits key */
13499 		TEST_CASE_ST(ut_setup, ut_teardown,
13500 			test_AES_GCM_auth_decryption_test_case_256_1),
13501 		TEST_CASE_ST(ut_setup, ut_teardown,
13502 			test_AES_GCM_auth_decryption_test_case_256_2),
13503 		TEST_CASE_ST(ut_setup, ut_teardown,
13504 			test_AES_GCM_auth_decryption_test_case_256_3),
13505 		TEST_CASE_ST(ut_setup, ut_teardown,
13506 			test_AES_GCM_auth_decryption_test_case_256_4),
13507 		TEST_CASE_ST(ut_setup, ut_teardown,
13508 			test_AES_GCM_auth_decryption_test_case_256_5),
13509 		TEST_CASE_ST(ut_setup, ut_teardown,
13510 			test_AES_GCM_auth_decryption_test_case_256_6),
13511 		TEST_CASE_ST(ut_setup, ut_teardown,
13512 			test_AES_GCM_auth_decryption_test_case_256_7),
13513 
13514 		/** Out of place tests */
13515 		TEST_CASE_ST(ut_setup, ut_teardown,
13516 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13517 		TEST_CASE_ST(ut_setup, ut_teardown,
13518 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13519 
13520 		/** SNOW 3G encrypt only (UEA2) */
13521 		TEST_CASE_ST(ut_setup, ut_teardown,
13522 			test_snow3g_encryption_test_case_1),
13523 		TEST_CASE_ST(ut_setup, ut_teardown,
13524 			test_snow3g_encryption_test_case_2),
13525 		TEST_CASE_ST(ut_setup, ut_teardown,
13526 			test_snow3g_encryption_test_case_3),
13527 		TEST_CASE_ST(ut_setup, ut_teardown,
13528 			test_snow3g_encryption_test_case_4),
13529 		TEST_CASE_ST(ut_setup, ut_teardown,
13530 			test_snow3g_encryption_test_case_5),
13531 
13532 		TEST_CASE_ST(ut_setup, ut_teardown,
13533 			test_snow3g_encryption_test_case_1_oop),
13534 		TEST_CASE_ST(ut_setup, ut_teardown,
13535 				test_snow3g_encryption_test_case_1_oop_sgl),
13536 		TEST_CASE_ST(ut_setup, ut_teardown,
13537 			test_snow3g_decryption_test_case_1_oop),
13538 
13539 		/** SNOW 3G decrypt only (UEA2) */
13540 		TEST_CASE_ST(ut_setup, ut_teardown,
13541 			test_snow3g_decryption_test_case_1),
13542 		TEST_CASE_ST(ut_setup, ut_teardown,
13543 			test_snow3g_decryption_test_case_2),
13544 		TEST_CASE_ST(ut_setup, ut_teardown,
13545 			test_snow3g_decryption_test_case_3),
13546 		TEST_CASE_ST(ut_setup, ut_teardown,
13547 			test_snow3g_decryption_test_case_4),
13548 		TEST_CASE_ST(ut_setup, ut_teardown,
13549 			test_snow3g_decryption_test_case_5),
13550 
13551 		TEST_CASE_ST(ut_setup, ut_teardown,
13552 			test_snow3g_hash_generate_test_case_1),
13553 		TEST_CASE_ST(ut_setup, ut_teardown,
13554 			test_snow3g_hash_generate_test_case_2),
13555 		TEST_CASE_ST(ut_setup, ut_teardown,
13556 			test_snow3g_hash_generate_test_case_3),
13557 		TEST_CASE_ST(ut_setup, ut_teardown,
13558 			test_snow3g_hash_verify_test_case_1),
13559 		TEST_CASE_ST(ut_setup, ut_teardown,
13560 			test_snow3g_hash_verify_test_case_2),
13561 		TEST_CASE_ST(ut_setup, ut_teardown,
13562 			test_snow3g_hash_verify_test_case_3),
13563 
13564 		/** ZUC encrypt only (EEA3) */
13565 		TEST_CASE_ST(ut_setup, ut_teardown,
13566 			test_zuc_encryption_test_case_1),
13567 		TEST_CASE_ST(ut_setup, ut_teardown,
13568 			test_zuc_encryption_test_case_2),
13569 		TEST_CASE_ST(ut_setup, ut_teardown,
13570 			test_zuc_encryption_test_case_3),
13571 		TEST_CASE_ST(ut_setup, ut_teardown,
13572 			test_zuc_encryption_test_case_4),
13573 		TEST_CASE_ST(ut_setup, ut_teardown,
13574 			test_zuc_encryption_test_case_5),
13575 
13576 		/** ZUC authenticate (EIA3) */
13577 		TEST_CASE_ST(ut_setup, ut_teardown,
13578 			test_zuc_hash_generate_test_case_6),
13579 		TEST_CASE_ST(ut_setup, ut_teardown,
13580 			test_zuc_hash_generate_test_case_7),
13581 		TEST_CASE_ST(ut_setup, ut_teardown,
13582 			test_zuc_hash_generate_test_case_8),
13583 
13584 		/** HMAC_MD5 Authentication */
13585 		TEST_CASE_ST(ut_setup, ut_teardown,
13586 			test_MD5_HMAC_generate_case_1),
13587 		TEST_CASE_ST(ut_setup, ut_teardown,
13588 			test_MD5_HMAC_verify_case_1),
13589 		TEST_CASE_ST(ut_setup, ut_teardown,
13590 			test_MD5_HMAC_generate_case_2),
13591 		TEST_CASE_ST(ut_setup, ut_teardown,
13592 			test_MD5_HMAC_verify_case_2),
13593 
13594 		/** Negative tests */
13595 		TEST_CASE_ST(ut_setup, ut_teardown,
13596 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
13597 		TEST_CASE_ST(ut_setup, ut_teardown,
13598 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13599 		TEST_CASE_ST(ut_setup, ut_teardown,
13600 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13601 		TEST_CASE_ST(ut_setup, ut_teardown,
13602 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13603 		TEST_CASE_ST(ut_setup, ut_teardown,
13604 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
13605 		TEST_CASE_ST(ut_setup, ut_teardown,
13606 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
13607 		TEST_CASE_ST(ut_setup, ut_teardown,
13608 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
13609 		TEST_CASE_ST(ut_setup, ut_teardown,
13610 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13611 		TEST_CASE_ST(ut_setup, ut_teardown,
13612 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13613 		TEST_CASE_ST(ut_setup, ut_teardown,
13614 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13615 		TEST_CASE_ST(ut_setup, ut_teardown,
13616 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
13617 		TEST_CASE_ST(ut_setup, ut_teardown,
13618 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
13619 		TEST_CASE_ST(ut_setup, ut_teardown,
13620 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13621 		TEST_CASE_ST(ut_setup, ut_teardown,
13622 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13623 		TEST_CASE_ST(ut_setup, ut_teardown,
13624 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13625 		TEST_CASE_ST(ut_setup, ut_teardown,
13626 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13627 
13628 		/* ESN Testcase */
13629 		TEST_CASE_ST(ut_setup, ut_teardown,
13630 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13631 
13632 		TEST_CASE_ST(ut_setup, ut_teardown,
13633 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13634 
13635 		TEST_CASES_END() /**< NULL terminate unit test array */
13636 	}
13637 };
13638 
13639 static struct unit_test_suite cryptodev_null_testsuite  = {
13640 	.suite_name = "Crypto Device NULL Unit Test Suite",
13641 	.setup = testsuite_setup,
13642 	.teardown = testsuite_teardown,
13643 	.unit_test_cases = {
13644 		TEST_CASE_ST(ut_setup, ut_teardown,
13645 			test_null_invalid_operation),
13646 		TEST_CASE_ST(ut_setup, ut_teardown,
13647 			test_null_burst_operation),
13648 		TEST_CASE_ST(ut_setup, ut_teardown,
13649 			test_AES_chain_null_all),
13650 		TEST_CASE_ST(ut_setup, ut_teardown,
13651 			test_AES_cipheronly_null_all),
13652 		TEST_CASE_ST(ut_setup, ut_teardown,
13653 				test_authonly_null_all),
13654 
13655 		TEST_CASES_END() /**< NULL terminate unit test array */
13656 	}
13657 };
13658 
13659 static struct unit_test_suite cryptodev_armv8_testsuite  = {
13660 	.suite_name = "Crypto Device ARMv8 Unit Test Suite",
13661 	.setup = testsuite_setup,
13662 	.teardown = testsuite_teardown,
13663 	.unit_test_cases = {
13664 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_armv8_all),
13665 
13666 		/** Negative tests */
13667 		TEST_CASE_ST(ut_setup, ut_teardown,
13668 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13669 		TEST_CASE_ST(ut_setup, ut_teardown,
13670 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13671 
13672 		TEST_CASES_END() /**< NULL terminate unit test array */
13673 	}
13674 };
13675 
13676 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13677 	.suite_name = "Crypto Device Marvell Component Test Suite",
13678 	.setup = testsuite_setup,
13679 	.teardown = testsuite_teardown,
13680 	.unit_test_cases = {
13681 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13682 		TEST_CASE_ST(ut_setup, ut_teardown,
13683 				test_multi_session_random_usage),
13684 		TEST_CASE_ST(ut_setup, ut_teardown,
13685 				test_AES_chain_mrvl_all),
13686 		TEST_CASE_ST(ut_setup, ut_teardown,
13687 				test_AES_cipheronly_mrvl_all),
13688 		TEST_CASE_ST(ut_setup, ut_teardown,
13689 				test_authonly_mrvl_all),
13690 		TEST_CASE_ST(ut_setup, ut_teardown,
13691 				test_3DES_chain_mrvl_all),
13692 		TEST_CASE_ST(ut_setup, ut_teardown,
13693 				test_3DES_cipheronly_mrvl_all),
13694 
13695 		/** Negative tests */
13696 		TEST_CASE_ST(ut_setup, ut_teardown,
13697 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13698 		TEST_CASE_ST(ut_setup, ut_teardown,
13699 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13700 		TEST_CASE_ST(ut_setup, ut_teardown,
13701 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13702 		TEST_CASE_ST(ut_setup, ut_teardown,
13703 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13704 
13705 		TEST_CASES_END() /**< NULL terminate unit test array */
13706 	}
13707 };
13708 
13709 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13710 	.suite_name = "Crypto Device CCP Unit Test Suite",
13711 	.setup = testsuite_setup,
13712 	.teardown = testsuite_teardown,
13713 	.unit_test_cases = {
13714 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13715 		TEST_CASE_ST(ut_setup, ut_teardown,
13716 				test_multi_session_random_usage),
13717 		TEST_CASE_ST(ut_setup, ut_teardown,
13718 				test_AES_chain_ccp_all),
13719 		TEST_CASE_ST(ut_setup, ut_teardown,
13720 				test_AES_cipheronly_ccp_all),
13721 		TEST_CASE_ST(ut_setup, ut_teardown,
13722 				test_3DES_chain_ccp_all),
13723 		TEST_CASE_ST(ut_setup, ut_teardown,
13724 				test_3DES_cipheronly_ccp_all),
13725 		TEST_CASE_ST(ut_setup, ut_teardown,
13726 				test_authonly_ccp_all),
13727 
13728 		/** Negative tests */
13729 		TEST_CASE_ST(ut_setup, ut_teardown,
13730 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13731 		TEST_CASE_ST(ut_setup, ut_teardown,
13732 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13733 		TEST_CASE_ST(ut_setup, ut_teardown,
13734 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13735 		TEST_CASE_ST(ut_setup, ut_teardown,
13736 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13737 
13738 		TEST_CASES_END() /**< NULL terminate unit test array */
13739 	}
13740 };
13741 
13742 static struct unit_test_suite cryptodev_octeontx_testsuite  = {
13743 	.suite_name = "Crypto Device OCTEONTX Unit Test Suite",
13744 	.setup = testsuite_setup,
13745 	.teardown = testsuite_teardown,
13746 	.unit_test_cases = {
13747 		TEST_CASE_ST(ut_setup, ut_teardown,
13748 			test_AES_chain_octeontx_all),
13749 		TEST_CASE_ST(ut_setup, ut_teardown,
13750 			test_AES_cipheronly_octeontx_all),
13751 		TEST_CASE_ST(ut_setup, ut_teardown,
13752 			test_3DES_chain_octeontx_all),
13753 		TEST_CASE_ST(ut_setup, ut_teardown,
13754 			test_3DES_cipheronly_octeontx_all),
13755 		TEST_CASE_ST(ut_setup, ut_teardown,
13756 			test_authonly_octeontx_all),
13757 
13758 		/** AES GCM Authenticated Encryption */
13759 		TEST_CASE_ST(ut_setup, ut_teardown,
13760 			test_AES_GCM_authenticated_encryption_test_case_1),
13761 		TEST_CASE_ST(ut_setup, ut_teardown,
13762 			test_AES_GCM_authenticated_encryption_test_case_2),
13763 		TEST_CASE_ST(ut_setup, ut_teardown,
13764 			test_AES_GCM_authenticated_encryption_test_case_3),
13765 		TEST_CASE_ST(ut_setup, ut_teardown,
13766 			test_AES_GCM_authenticated_encryption_test_case_4),
13767 		TEST_CASE_ST(ut_setup, ut_teardown,
13768 			test_AES_GCM_authenticated_encryption_test_case_5),
13769 		TEST_CASE_ST(ut_setup, ut_teardown,
13770 			test_AES_GCM_authenticated_encryption_test_case_6),
13771 		TEST_CASE_ST(ut_setup, ut_teardown,
13772 			test_AES_GCM_authenticated_encryption_test_case_7),
13773 
13774 		/** AES GCM Authenticated Decryption */
13775 		TEST_CASE_ST(ut_setup, ut_teardown,
13776 			test_AES_GCM_authenticated_decryption_test_case_1),
13777 		TEST_CASE_ST(ut_setup, ut_teardown,
13778 			test_AES_GCM_authenticated_decryption_test_case_2),
13779 		TEST_CASE_ST(ut_setup, ut_teardown,
13780 			test_AES_GCM_authenticated_decryption_test_case_3),
13781 		TEST_CASE_ST(ut_setup, ut_teardown,
13782 			test_AES_GCM_authenticated_decryption_test_case_4),
13783 		TEST_CASE_ST(ut_setup, ut_teardown,
13784 			test_AES_GCM_authenticated_decryption_test_case_5),
13785 		TEST_CASE_ST(ut_setup, ut_teardown,
13786 			test_AES_GCM_authenticated_decryption_test_case_6),
13787 		TEST_CASE_ST(ut_setup, ut_teardown,
13788 			test_AES_GCM_authenticated_decryption_test_case_7),
13789 		/** AES GMAC Authentication */
13790 		TEST_CASE_ST(ut_setup, ut_teardown,
13791 			test_AES_GMAC_authentication_test_case_1),
13792 		TEST_CASE_ST(ut_setup, ut_teardown,
13793 			test_AES_GMAC_authentication_verify_test_case_1),
13794 		TEST_CASE_ST(ut_setup, ut_teardown,
13795 			test_AES_GMAC_authentication_test_case_2),
13796 		TEST_CASE_ST(ut_setup, ut_teardown,
13797 			test_AES_GMAC_authentication_verify_test_case_2),
13798 		TEST_CASE_ST(ut_setup, ut_teardown,
13799 			test_AES_GMAC_authentication_test_case_3),
13800 		TEST_CASE_ST(ut_setup, ut_teardown,
13801 			test_AES_GMAC_authentication_verify_test_case_3),
13802 
13803 		/** SNOW 3G encrypt only (UEA2) */
13804 		TEST_CASE_ST(ut_setup, ut_teardown,
13805 			test_snow3g_encryption_test_case_1),
13806 		TEST_CASE_ST(ut_setup, ut_teardown,
13807 			test_snow3g_encryption_test_case_2),
13808 		TEST_CASE_ST(ut_setup, ut_teardown,
13809 			test_snow3g_encryption_test_case_3),
13810 		TEST_CASE_ST(ut_setup, ut_teardown,
13811 			test_snow3g_encryption_test_case_4),
13812 		TEST_CASE_ST(ut_setup, ut_teardown,
13813 			test_snow3g_encryption_test_case_5),
13814 
13815 		TEST_CASE_ST(ut_setup, ut_teardown,
13816 			test_snow3g_encryption_test_case_1_oop),
13817 		TEST_CASE_ST(ut_setup, ut_teardown,
13818 			test_snow3g_decryption_test_case_1_oop),
13819 		TEST_CASE_ST(ut_setup, ut_teardown,
13820 			test_snow3g_encryption_test_case_1_oop_sgl),
13821 
13822 		/** SNOW 3G decrypt only (UEA2) */
13823 		TEST_CASE_ST(ut_setup, ut_teardown,
13824 			test_snow3g_decryption_test_case_1),
13825 		TEST_CASE_ST(ut_setup, ut_teardown,
13826 			test_snow3g_decryption_test_case_2),
13827 		TEST_CASE_ST(ut_setup, ut_teardown,
13828 			test_snow3g_decryption_test_case_3),
13829 		TEST_CASE_ST(ut_setup, ut_teardown,
13830 			test_snow3g_decryption_test_case_4),
13831 		TEST_CASE_ST(ut_setup, ut_teardown,
13832 			test_snow3g_decryption_test_case_5),
13833 
13834 		TEST_CASE_ST(ut_setup, ut_teardown,
13835 			test_snow3g_hash_generate_test_case_1),
13836 		TEST_CASE_ST(ut_setup, ut_teardown,
13837 			test_snow3g_hash_generate_test_case_2),
13838 		TEST_CASE_ST(ut_setup, ut_teardown,
13839 			test_snow3g_hash_generate_test_case_3),
13840 		TEST_CASE_ST(ut_setup, ut_teardown,
13841 			test_snow3g_hash_verify_test_case_1),
13842 		TEST_CASE_ST(ut_setup, ut_teardown,
13843 			test_snow3g_hash_verify_test_case_2),
13844 		TEST_CASE_ST(ut_setup, ut_teardown,
13845 			test_snow3g_hash_verify_test_case_3),
13846 
13847 		/** ZUC encrypt only (EEA3) */
13848 		TEST_CASE_ST(ut_setup, ut_teardown,
13849 			test_zuc_encryption_test_case_1),
13850 		TEST_CASE_ST(ut_setup, ut_teardown,
13851 			test_zuc_encryption_test_case_2),
13852 		TEST_CASE_ST(ut_setup, ut_teardown,
13853 			test_zuc_encryption_test_case_3),
13854 		TEST_CASE_ST(ut_setup, ut_teardown,
13855 			test_zuc_encryption_test_case_4),
13856 		TEST_CASE_ST(ut_setup, ut_teardown,
13857 			test_zuc_encryption_test_case_5),
13858 		TEST_CASE_ST(ut_setup, ut_teardown,
13859 			test_zuc_hash_generate_test_case_1),
13860 		TEST_CASE_ST(ut_setup, ut_teardown,
13861 			test_zuc_hash_generate_test_case_2),
13862 		TEST_CASE_ST(ut_setup, ut_teardown,
13863 			test_zuc_hash_generate_test_case_3),
13864 		TEST_CASE_ST(ut_setup, ut_teardown,
13865 			test_zuc_hash_generate_test_case_4),
13866 		TEST_CASE_ST(ut_setup, ut_teardown,
13867 			test_zuc_hash_generate_test_case_5),
13868 		TEST_CASE_ST(ut_setup, ut_teardown,
13869 			test_zuc_encryption_test_case_6_sgl),
13870 
13871 		/** KASUMI encrypt only (UEA1) */
13872 		TEST_CASE_ST(ut_setup, ut_teardown,
13873 			test_kasumi_encryption_test_case_1),
13874 		TEST_CASE_ST(ut_setup, ut_teardown,
13875 			test_kasumi_encryption_test_case_2),
13876 		TEST_CASE_ST(ut_setup, ut_teardown,
13877 			test_kasumi_encryption_test_case_3),
13878 		TEST_CASE_ST(ut_setup, ut_teardown,
13879 			test_kasumi_encryption_test_case_4),
13880 		TEST_CASE_ST(ut_setup, ut_teardown,
13881 			test_kasumi_encryption_test_case_5),
13882 		TEST_CASE_ST(ut_setup, ut_teardown,
13883 			test_kasumi_encryption_test_case_1_sgl),
13884 		TEST_CASE_ST(ut_setup, ut_teardown,
13885 			test_kasumi_encryption_test_case_1_oop_sgl),
13886 		/** KASUMI decrypt only (UEA1) */
13887 		TEST_CASE_ST(ut_setup, ut_teardown,
13888 			test_kasumi_decryption_test_case_1),
13889 		TEST_CASE_ST(ut_setup, ut_teardown,
13890 			test_kasumi_decryption_test_case_2),
13891 		TEST_CASE_ST(ut_setup, ut_teardown,
13892 			test_kasumi_decryption_test_case_3),
13893 		TEST_CASE_ST(ut_setup, ut_teardown,
13894 			test_kasumi_decryption_test_case_4),
13895 		TEST_CASE_ST(ut_setup, ut_teardown,
13896 			test_kasumi_decryption_test_case_5),
13897 
13898 		TEST_CASE_ST(ut_setup, ut_teardown,
13899 			test_kasumi_encryption_test_case_1_oop),
13900 		TEST_CASE_ST(ut_setup, ut_teardown,
13901 			test_kasumi_decryption_test_case_1_oop),
13902 
13903 		/** KASUMI hash only (UIA1) */
13904 		TEST_CASE_ST(ut_setup, ut_teardown,
13905 			test_kasumi_hash_generate_test_case_1),
13906 		TEST_CASE_ST(ut_setup, ut_teardown,
13907 			test_kasumi_hash_generate_test_case_2),
13908 		TEST_CASE_ST(ut_setup, ut_teardown,
13909 			test_kasumi_hash_generate_test_case_3),
13910 		TEST_CASE_ST(ut_setup, ut_teardown,
13911 			test_kasumi_hash_generate_test_case_4),
13912 		TEST_CASE_ST(ut_setup, ut_teardown,
13913 			test_kasumi_hash_generate_test_case_5),
13914 		TEST_CASE_ST(ut_setup, ut_teardown,
13915 			test_kasumi_hash_generate_test_case_6),
13916 		TEST_CASE_ST(ut_setup, ut_teardown,
13917 			test_kasumi_hash_verify_test_case_1),
13918 		TEST_CASE_ST(ut_setup, ut_teardown,
13919 			test_kasumi_hash_verify_test_case_2),
13920 		TEST_CASE_ST(ut_setup, ut_teardown,
13921 			test_kasumi_hash_verify_test_case_3),
13922 		TEST_CASE_ST(ut_setup, ut_teardown,
13923 			test_kasumi_hash_verify_test_case_4),
13924 		TEST_CASE_ST(ut_setup, ut_teardown,
13925 			test_kasumi_hash_verify_test_case_5),
13926 
13927 		/** NULL tests */
13928 		TEST_CASE_ST(ut_setup, ut_teardown,
13929 			test_null_cipher_only_operation),
13930 		TEST_CASE_ST(ut_setup, ut_teardown,
13931 			test_null_auth_only_operation),
13932 		TEST_CASE_ST(ut_setup, ut_teardown,
13933 			test_null_cipher_auth_operation),
13934 		TEST_CASE_ST(ut_setup, ut_teardown,
13935 			test_null_auth_cipher_operation),
13936 
13937 		/** Negative tests */
13938 		TEST_CASE_ST(ut_setup, ut_teardown,
13939 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13940 		TEST_CASE_ST(ut_setup, ut_teardown,
13941 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13942 		TEST_CASE_ST(ut_setup, ut_teardown,
13943 			authentication_verify_AES128_GMAC_fail_data_corrupt),
13944 		TEST_CASE_ST(ut_setup, ut_teardown,
13945 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
13946 		TEST_CASE_ST(ut_setup, ut_teardown,
13947 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13948 		TEST_CASE_ST(ut_setup, ut_teardown,
13949 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13950 		TEST_CASES_END() /**< NULL terminate unit test array */
13951 	}
13952 };
13953 
13954 static struct unit_test_suite cryptodev_nitrox_testsuite  = {
13955 	.suite_name = "Crypto NITROX Unit Test Suite",
13956 	.setup = testsuite_setup,
13957 	.teardown = testsuite_teardown,
13958 	.unit_test_cases = {
13959 		TEST_CASE_ST(ut_setup, ut_teardown,
13960 			     test_device_configure_invalid_dev_id),
13961 		TEST_CASE_ST(ut_setup, ut_teardown,
13962 				test_device_configure_invalid_queue_pair_ids),
13963 		TEST_CASE_ST(ut_setup, ut_teardown,
13964 			     test_AES_chain_nitrox_all),
13965 
13966 		TEST_CASES_END() /**< NULL terminate unit test array */
13967 	}
13968 };
13969 
13970 static struct unit_test_suite cryptodev_octeontx2_testsuite  = {
13971 	.suite_name = "Crypto Device OCTEON TX2 Unit Test Suite",
13972 	.setup = testsuite_setup,
13973 	.teardown = testsuite_teardown,
13974 	.unit_test_cases = {
13975 		TEST_CASE_ST(ut_setup, ut_teardown,
13976 			test_AES_chain_octeontx2_all),
13977 		TEST_CASE_ST(ut_setup, ut_teardown,
13978 			test_AES_cipheronly_octeontx2_all),
13979 		TEST_CASE_ST(ut_setup, ut_teardown,
13980 			test_3DES_chain_octeontx2_all),
13981 		TEST_CASE_ST(ut_setup, ut_teardown,
13982 			test_3DES_cipheronly_octeontx2_all),
13983 		TEST_CASE_ST(ut_setup, ut_teardown,
13984 			test_authonly_octeontx2_all),
13985 
13986 		/** AES GCM Authenticated Encryption */
13987 		TEST_CASE_ST(ut_setup, ut_teardown,
13988 			test_AES_GCM_authenticated_encryption_test_case_1),
13989 		TEST_CASE_ST(ut_setup, ut_teardown,
13990 			test_AES_GCM_authenticated_encryption_test_case_2),
13991 		TEST_CASE_ST(ut_setup, ut_teardown,
13992 			test_AES_GCM_authenticated_encryption_test_case_3),
13993 		TEST_CASE_ST(ut_setup, ut_teardown,
13994 			test_AES_GCM_authenticated_encryption_test_case_4),
13995 		TEST_CASE_ST(ut_setup, ut_teardown,
13996 			test_AES_GCM_authenticated_encryption_test_case_5),
13997 		TEST_CASE_ST(ut_setup, ut_teardown,
13998 			test_AES_GCM_authenticated_encryption_test_case_6),
13999 		TEST_CASE_ST(ut_setup, ut_teardown,
14000 			test_AES_GCM_authenticated_encryption_test_case_7),
14001 
14002 		/** AES GCM Authenticated Decryption */
14003 		TEST_CASE_ST(ut_setup, ut_teardown,
14004 			test_AES_GCM_authenticated_decryption_test_case_1),
14005 		TEST_CASE_ST(ut_setup, ut_teardown,
14006 			test_AES_GCM_authenticated_decryption_test_case_2),
14007 		TEST_CASE_ST(ut_setup, ut_teardown,
14008 			test_AES_GCM_authenticated_decryption_test_case_3),
14009 		TEST_CASE_ST(ut_setup, ut_teardown,
14010 			test_AES_GCM_authenticated_decryption_test_case_4),
14011 		TEST_CASE_ST(ut_setup, ut_teardown,
14012 			test_AES_GCM_authenticated_decryption_test_case_5),
14013 		TEST_CASE_ST(ut_setup, ut_teardown,
14014 			test_AES_GCM_authenticated_decryption_test_case_6),
14015 		TEST_CASE_ST(ut_setup, ut_teardown,
14016 			test_AES_GCM_authenticated_decryption_test_case_7),
14017 		/** AES GMAC Authentication */
14018 		TEST_CASE_ST(ut_setup, ut_teardown,
14019 			test_AES_GMAC_authentication_test_case_1),
14020 		TEST_CASE_ST(ut_setup, ut_teardown,
14021 			test_AES_GMAC_authentication_verify_test_case_1),
14022 		TEST_CASE_ST(ut_setup, ut_teardown,
14023 			test_AES_GMAC_authentication_test_case_2),
14024 		TEST_CASE_ST(ut_setup, ut_teardown,
14025 			test_AES_GMAC_authentication_verify_test_case_2),
14026 		TEST_CASE_ST(ut_setup, ut_teardown,
14027 			test_AES_GMAC_authentication_test_case_3),
14028 		TEST_CASE_ST(ut_setup, ut_teardown,
14029 			test_AES_GMAC_authentication_verify_test_case_3),
14030 
14031 		/** SNOW 3G encrypt only (UEA2) */
14032 		TEST_CASE_ST(ut_setup, ut_teardown,
14033 			test_snow3g_encryption_test_case_1),
14034 		TEST_CASE_ST(ut_setup, ut_teardown,
14035 			test_snow3g_encryption_test_case_2),
14036 		TEST_CASE_ST(ut_setup, ut_teardown,
14037 			test_snow3g_encryption_test_case_3),
14038 		TEST_CASE_ST(ut_setup, ut_teardown,
14039 			test_snow3g_encryption_test_case_4),
14040 		TEST_CASE_ST(ut_setup, ut_teardown,
14041 			test_snow3g_encryption_test_case_5),
14042 
14043 		TEST_CASE_ST(ut_setup, ut_teardown,
14044 			test_snow3g_encryption_test_case_1_oop),
14045 		TEST_CASE_ST(ut_setup, ut_teardown,
14046 			test_snow3g_decryption_test_case_1_oop),
14047 		TEST_CASE_ST(ut_setup, ut_teardown,
14048 			test_snow3g_encryption_test_case_1_oop_sgl),
14049 
14050 		/** SNOW 3G decrypt only (UEA2) */
14051 		TEST_CASE_ST(ut_setup, ut_teardown,
14052 			test_snow3g_decryption_test_case_1),
14053 		TEST_CASE_ST(ut_setup, ut_teardown,
14054 			test_snow3g_decryption_test_case_2),
14055 		TEST_CASE_ST(ut_setup, ut_teardown,
14056 			test_snow3g_decryption_test_case_3),
14057 		TEST_CASE_ST(ut_setup, ut_teardown,
14058 			test_snow3g_decryption_test_case_4),
14059 		TEST_CASE_ST(ut_setup, ut_teardown,
14060 			test_snow3g_decryption_test_case_5),
14061 
14062 		TEST_CASE_ST(ut_setup, ut_teardown,
14063 			test_snow3g_hash_generate_test_case_1),
14064 		TEST_CASE_ST(ut_setup, ut_teardown,
14065 			test_snow3g_hash_generate_test_case_2),
14066 		TEST_CASE_ST(ut_setup, ut_teardown,
14067 			test_snow3g_hash_generate_test_case_3),
14068 		TEST_CASE_ST(ut_setup, ut_teardown,
14069 			test_snow3g_hash_verify_test_case_1),
14070 		TEST_CASE_ST(ut_setup, ut_teardown,
14071 			test_snow3g_hash_verify_test_case_2),
14072 		TEST_CASE_ST(ut_setup, ut_teardown,
14073 			test_snow3g_hash_verify_test_case_3),
14074 
14075 		/** ZUC encrypt only (EEA3) */
14076 		TEST_CASE_ST(ut_setup, ut_teardown,
14077 			test_zuc_encryption_test_case_1),
14078 		TEST_CASE_ST(ut_setup, ut_teardown,
14079 			test_zuc_encryption_test_case_2),
14080 		TEST_CASE_ST(ut_setup, ut_teardown,
14081 			test_zuc_encryption_test_case_3),
14082 		TEST_CASE_ST(ut_setup, ut_teardown,
14083 			test_zuc_encryption_test_case_4),
14084 		TEST_CASE_ST(ut_setup, ut_teardown,
14085 			test_zuc_encryption_test_case_5),
14086 		TEST_CASE_ST(ut_setup, ut_teardown,
14087 			test_zuc_hash_generate_test_case_1),
14088 		TEST_CASE_ST(ut_setup, ut_teardown,
14089 			test_zuc_hash_generate_test_case_2),
14090 		TEST_CASE_ST(ut_setup, ut_teardown,
14091 			test_zuc_hash_generate_test_case_3),
14092 		TEST_CASE_ST(ut_setup, ut_teardown,
14093 			test_zuc_hash_generate_test_case_4),
14094 		TEST_CASE_ST(ut_setup, ut_teardown,
14095 			test_zuc_hash_generate_test_case_5),
14096 		TEST_CASE_ST(ut_setup, ut_teardown,
14097 			test_zuc_encryption_test_case_6_sgl),
14098 
14099 		/** KASUMI encrypt only (UEA1) */
14100 		TEST_CASE_ST(ut_setup, ut_teardown,
14101 			test_kasumi_encryption_test_case_1),
14102 		TEST_CASE_ST(ut_setup, ut_teardown,
14103 			test_kasumi_encryption_test_case_2),
14104 		TEST_CASE_ST(ut_setup, ut_teardown,
14105 			test_kasumi_encryption_test_case_3),
14106 		TEST_CASE_ST(ut_setup, ut_teardown,
14107 			test_kasumi_encryption_test_case_4),
14108 		TEST_CASE_ST(ut_setup, ut_teardown,
14109 			test_kasumi_encryption_test_case_5),
14110 		TEST_CASE_ST(ut_setup, ut_teardown,
14111 			test_kasumi_encryption_test_case_1_sgl),
14112 		TEST_CASE_ST(ut_setup, ut_teardown,
14113 			test_kasumi_encryption_test_case_1_oop_sgl),
14114 		/** KASUMI decrypt only (UEA1) */
14115 		TEST_CASE_ST(ut_setup, ut_teardown,
14116 			test_kasumi_decryption_test_case_1),
14117 		TEST_CASE_ST(ut_setup, ut_teardown,
14118 			test_kasumi_decryption_test_case_2),
14119 		TEST_CASE_ST(ut_setup, ut_teardown,
14120 			test_kasumi_decryption_test_case_3),
14121 		TEST_CASE_ST(ut_setup, ut_teardown,
14122 			test_kasumi_decryption_test_case_4),
14123 		TEST_CASE_ST(ut_setup, ut_teardown,
14124 			test_kasumi_decryption_test_case_5),
14125 
14126 		TEST_CASE_ST(ut_setup, ut_teardown,
14127 			test_kasumi_encryption_test_case_1_oop),
14128 		TEST_CASE_ST(ut_setup, ut_teardown,
14129 			test_kasumi_decryption_test_case_1_oop),
14130 
14131 		/** KASUMI hash only (UIA1) */
14132 		TEST_CASE_ST(ut_setup, ut_teardown,
14133 			test_kasumi_hash_generate_test_case_1),
14134 		TEST_CASE_ST(ut_setup, ut_teardown,
14135 			test_kasumi_hash_generate_test_case_2),
14136 		TEST_CASE_ST(ut_setup, ut_teardown,
14137 			test_kasumi_hash_generate_test_case_3),
14138 		TEST_CASE_ST(ut_setup, ut_teardown,
14139 			test_kasumi_hash_generate_test_case_4),
14140 		TEST_CASE_ST(ut_setup, ut_teardown,
14141 			test_kasumi_hash_generate_test_case_5),
14142 		TEST_CASE_ST(ut_setup, ut_teardown,
14143 			test_kasumi_hash_generate_test_case_6),
14144 		TEST_CASE_ST(ut_setup, ut_teardown,
14145 			test_kasumi_hash_verify_test_case_1),
14146 		TEST_CASE_ST(ut_setup, ut_teardown,
14147 			test_kasumi_hash_verify_test_case_2),
14148 		TEST_CASE_ST(ut_setup, ut_teardown,
14149 			test_kasumi_hash_verify_test_case_3),
14150 		TEST_CASE_ST(ut_setup, ut_teardown,
14151 			test_kasumi_hash_verify_test_case_4),
14152 		TEST_CASE_ST(ut_setup, ut_teardown,
14153 			test_kasumi_hash_verify_test_case_5),
14154 
14155 		/** NULL tests */
14156 		TEST_CASE_ST(ut_setup, ut_teardown,
14157 			test_null_cipher_only_operation),
14158 		TEST_CASE_ST(ut_setup, ut_teardown,
14159 			test_null_auth_only_operation),
14160 		TEST_CASE_ST(ut_setup, ut_teardown,
14161 			test_null_cipher_auth_operation),
14162 		TEST_CASE_ST(ut_setup, ut_teardown,
14163 			test_null_auth_cipher_operation),
14164 
14165 		/** Negative tests */
14166 		TEST_CASE_ST(ut_setup, ut_teardown,
14167 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14168 		TEST_CASE_ST(ut_setup, ut_teardown,
14169 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14170 		TEST_CASE_ST(ut_setup, ut_teardown,
14171 			authentication_verify_AES128_GMAC_fail_data_corrupt),
14172 		TEST_CASE_ST(ut_setup, ut_teardown,
14173 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
14174 		TEST_CASE_ST(ut_setup, ut_teardown,
14175 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14176 		TEST_CASE_ST(ut_setup, ut_teardown,
14177 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14178 		TEST_CASES_END() /**< NULL terminate unit test array */
14179 	}
14180 };
14181 
14182 static int
14183 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14184 {
14185 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14186 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14187 
14188 	if (gbl_driver_id == -1) {
14189 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded. Check that both "
14190 		"CONFIG_RTE_LIBRTE_PMD_QAT and CONFIG_RTE_LIBRTE_PMD_QAT_SYM "
14191 		"are enabled in config file to run this testsuite.\n");
14192 		return TEST_SKIPPED;
14193 	}
14194 
14195 	return unit_test_suite_runner(&cryptodev_qat_testsuite);
14196 }
14197 
14198 static int
14199 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14200 {
14201 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14202 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14203 
14204 	if (gbl_driver_id == -1) {
14205 		RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded. Check if "
14206 				"CONFIG_RTE_LIBRTE_PMD_VIRTIO_CRYPTO is enabled "
14207 				"in config file to run this testsuite.\n");
14208 		return TEST_FAILED;
14209 	}
14210 
14211 	return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14212 }
14213 
14214 static int
14215 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14216 {
14217 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14218 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14219 
14220 	if (gbl_driver_id == -1) {
14221 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded. Check if "
14222 				"CONFIG_RTE_LIBRTE_PMD_AESNI_MB is enabled "
14223 				"in config file to run this testsuite.\n");
14224 		return TEST_SKIPPED;
14225 	}
14226 
14227 	return unit_test_suite_runner(&cryptodev_aesni_mb_testsuite);
14228 }
14229 
14230 static int
14231 test_cryptodev_openssl(void)
14232 {
14233 	gbl_driver_id = rte_cryptodev_driver_id_get(
14234 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14235 
14236 	if (gbl_driver_id == -1) {
14237 		RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded. Check if "
14238 				"CONFIG_RTE_LIBRTE_PMD_OPENSSL is enabled "
14239 				"in config file to run this testsuite.\n");
14240 		return TEST_SKIPPED;
14241 	}
14242 
14243 	return unit_test_suite_runner(&cryptodev_openssl_testsuite);
14244 }
14245 
14246 static int
14247 test_cryptodev_aesni_gcm(void)
14248 {
14249 	gbl_driver_id = rte_cryptodev_driver_id_get(
14250 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14251 
14252 	if (gbl_driver_id == -1) {
14253 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded. Check if "
14254 				"CONFIG_RTE_LIBRTE_PMD_AESNI_GCM is enabled "
14255 				"in config file to run this testsuite.\n");
14256 		return TEST_SKIPPED;
14257 	}
14258 
14259 	return unit_test_suite_runner(&cryptodev_aesni_gcm_testsuite);
14260 }
14261 
14262 static int
14263 test_cryptodev_null(void)
14264 {
14265 	gbl_driver_id = rte_cryptodev_driver_id_get(
14266 			RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14267 
14268 	if (gbl_driver_id == -1) {
14269 		RTE_LOG(ERR, USER1, "NULL PMD must be loaded. Check if "
14270 				"CONFIG_RTE_LIBRTE_PMD_NULL is enabled "
14271 				"in config file to run this testsuite.\n");
14272 		return TEST_SKIPPED;
14273 	}
14274 
14275 	return unit_test_suite_runner(&cryptodev_null_testsuite);
14276 }
14277 
14278 static int
14279 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14280 {
14281 	gbl_driver_id = rte_cryptodev_driver_id_get(
14282 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14283 
14284 	if (gbl_driver_id == -1) {
14285 		RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded. Check if "
14286 				"CONFIG_RTE_LIBRTE_PMD_SNOW3G is enabled "
14287 				"in config file to run this testsuite.\n");
14288 		return TEST_SKIPPED;
14289 	}
14290 
14291 	return unit_test_suite_runner(&cryptodev_sw_snow3g_testsuite);
14292 }
14293 
14294 static int
14295 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14296 {
14297 	gbl_driver_id = rte_cryptodev_driver_id_get(
14298 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14299 
14300 	if (gbl_driver_id == -1) {
14301 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
14302 				"CONFIG_RTE_LIBRTE_PMD_KASUMI is enabled "
14303 				"in config file to run this testsuite.\n");
14304 		return TEST_SKIPPED;
14305 	}
14306 
14307 	return unit_test_suite_runner(&cryptodev_sw_kasumi_testsuite);
14308 }
14309 
14310 static int
14311 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14312 {
14313 	gbl_driver_id = rte_cryptodev_driver_id_get(
14314 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14315 
14316 	if (gbl_driver_id == -1) {
14317 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded. Check if "
14318 				"CONFIG_RTE_LIBRTE_PMD_ZUC is enabled "
14319 				"in config file to run this testsuite.\n");
14320 		return TEST_SKIPPED;
14321 	}
14322 
14323 	return unit_test_suite_runner(&cryptodev_sw_zuc_testsuite);
14324 }
14325 
14326 static int
14327 test_cryptodev_armv8(void)
14328 {
14329 	gbl_driver_id = rte_cryptodev_driver_id_get(
14330 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14331 
14332 	if (gbl_driver_id == -1) {
14333 		RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded. Check if "
14334 				"CONFIG_RTE_LIBRTE_PMD_ARMV8 is enabled "
14335 				"in config file to run this testsuite.\n");
14336 		return TEST_SKIPPED;
14337 	}
14338 
14339 	return unit_test_suite_runner(&cryptodev_armv8_testsuite);
14340 }
14341 
14342 static int
14343 test_cryptodev_mrvl(void)
14344 {
14345 	gbl_driver_id = rte_cryptodev_driver_id_get(
14346 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14347 
14348 	if (gbl_driver_id == -1) {
14349 		RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded. Check if "
14350 				"CONFIG_RTE_LIBRTE_PMD_MVSAM_CRYPTO is enabled "
14351 				"in config file to run this testsuite.\n");
14352 		return TEST_SKIPPED;
14353 	}
14354 
14355 	return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14356 }
14357 
14358 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
14359 
14360 static int
14361 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14362 {
14363 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14364 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14365 
14366 	if (gbl_driver_id == -1) {
14367 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded. Check if "
14368 				"CONFIG_RTE_LIBRTE_PMD_SCHEDULER is enabled "
14369 				"in config file to run this testsuite.\n");
14370 		return TEST_SKIPPED;
14371 	}
14372 
14373 	if (rte_cryptodev_driver_id_get(
14374 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14375 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
14376 			" enabled in config file to run this testsuite.\n");
14377 		return TEST_SKIPPED;
14378 }
14379 	return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14380 }
14381 
14382 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14383 
14384 #endif
14385 
14386 static int
14387 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14388 {
14389 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14390 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14391 
14392 	if (gbl_driver_id == -1) {
14393 		RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded. Check if "
14394 				"CONFIG_RTE_LIBRTE_PMD_DPAA2_SEC is enabled "
14395 				"in config file to run this testsuite.\n");
14396 		return TEST_SKIPPED;
14397 	}
14398 
14399 	return unit_test_suite_runner(&cryptodev_dpaa2_sec_testsuite);
14400 }
14401 
14402 static int
14403 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14404 {
14405 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14406 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14407 
14408 	if (gbl_driver_id == -1) {
14409 		RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded. Check if "
14410 				"CONFIG_RTE_LIBRTE_PMD_DPAA_SEC is enabled "
14411 				"in config file to run this testsuite.\n");
14412 		return TEST_SKIPPED;
14413 	}
14414 
14415 	return unit_test_suite_runner(&cryptodev_dpaa_sec_testsuite);
14416 }
14417 
14418 static int
14419 test_cryptodev_ccp(void)
14420 {
14421 	gbl_driver_id = rte_cryptodev_driver_id_get(
14422 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14423 
14424 	if (gbl_driver_id == -1) {
14425 		RTE_LOG(ERR, USER1, "CCP PMD must be loaded. Check if "
14426 				"CONFIG_RTE_LIBRTE_PMD_CCP is enabled "
14427 				"in config file to run this testsuite.\n");
14428 		return TEST_FAILED;
14429 	}
14430 
14431 	return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14432 }
14433 
14434 static int
14435 test_cryptodev_octeontx(void)
14436 {
14437 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14438 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14439 	if (gbl_driver_id == -1) {
14440 		RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded. Check if "
14441 				"CONFIG_RTE_LIBRTE_PMD_OCTEONTX_CRYPTO is "
14442 				"enabled in config file to run this "
14443 				"testsuite.\n");
14444 		return TEST_FAILED;
14445 	}
14446 	return unit_test_suite_runner(&cryptodev_octeontx_testsuite);
14447 }
14448 
14449 static int
14450 test_cryptodev_octeontx2(void)
14451 {
14452 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14453 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14454 	if (gbl_driver_id == -1) {
14455 		RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded. Check if "
14456 				"CONFIG_RTE_LIBRTE_PMD_OCTEONTX2_CRYPTO is "
14457 				"enabled in config file to run this "
14458 				"testsuite.\n");
14459 		return TEST_FAILED;
14460 	}
14461 	return unit_test_suite_runner(&cryptodev_octeontx2_testsuite);
14462 }
14463 
14464 static int
14465 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14466 {
14467 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14468 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14469 
14470 	if (gbl_driver_id == -1) {
14471 		RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded. Check if "
14472 				"CONFIG_RTE_LIBRTE_PMD_CAAM_JR is enabled "
14473 				"in config file to run this testsuite.\n");
14474 		return TEST_FAILED;
14475 	}
14476 
14477 	return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14478 }
14479 
14480 static int
14481 test_cryptodev_nitrox(void)
14482 {
14483 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14484 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14485 
14486 	if (gbl_driver_id == -1) {
14487 		RTE_LOG(ERR, USER1, "NITROX PMD must be loaded. Check if "
14488 				"CONFIG_RTE_LIBRTE_PMD_NITROX is enabled "
14489 				"in config file to run this testsuite.\n");
14490 		return TEST_FAILED;
14491 	}
14492 
14493 	return unit_test_suite_runner(&cryptodev_nitrox_testsuite);
14494 }
14495 
14496 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14497 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14498 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14499 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14500 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14501 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14502 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14503 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14504 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14505 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14506 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14507 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14508 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14509 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14510 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14511 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14512 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14513 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14514