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