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