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