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