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