xref: /dpdk/app/test/test_cryptodev.c (revision c8e69fce7046ad912865454bc008c19eeabbdf0e)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2015-2017 Intel Corporation. All rights reserved.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *	 * Redistributions of source code must retain the above copyright
11  *	   notice, this list of conditions and the following disclaimer.
12  *	 * Redistributions in binary form must reproduce the above copyright
13  *	   notice, this list of conditions and the following disclaimer in
14  *	   the documentation and/or other materials provided with the
15  *	   distribution.
16  *	 * Neither the name of Intel Corporation nor the names of its
17  *	   contributors may be used to endorse or promote products derived
18  *	   from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <rte_common.h>
34 #include <rte_hexdump.h>
35 #include <rte_mbuf.h>
36 #include <rte_malloc.h>
37 #include <rte_memcpy.h>
38 
39 #include <rte_crypto.h>
40 #include <rte_cryptodev.h>
41 #include <rte_cryptodev_pmd.h>
42 
43 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
44 #include <rte_cryptodev_scheduler.h>
45 #include <rte_cryptodev_scheduler_operations.h>
46 #endif
47 
48 #include "test.h"
49 #include "test_cryptodev.h"
50 
51 #include "test_cryptodev_blockcipher.h"
52 #include "test_cryptodev_aes_test_vectors.h"
53 #include "test_cryptodev_des_test_vectors.h"
54 #include "test_cryptodev_hash_test_vectors.h"
55 #include "test_cryptodev_kasumi_test_vectors.h"
56 #include "test_cryptodev_kasumi_hash_test_vectors.h"
57 #include "test_cryptodev_snow3g_test_vectors.h"
58 #include "test_cryptodev_snow3g_hash_test_vectors.h"
59 #include "test_cryptodev_zuc_test_vectors.h"
60 #include "test_cryptodev_zuc_hash_test_vectors.h"
61 #include "test_cryptodev_gcm_test_vectors.h"
62 #include "test_cryptodev_hmac_test_vectors.h"
63 
64 static enum rte_cryptodev_type gbl_cryptodev_type;
65 
66 struct crypto_testsuite_params {
67 	struct rte_mempool *mbuf_pool;
68 	struct rte_mempool *large_mbuf_pool;
69 	struct rte_mempool *op_mpool;
70 	struct rte_cryptodev_config conf;
71 	struct rte_cryptodev_qp_conf qp_conf;
72 
73 	uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
74 	uint8_t valid_dev_count;
75 };
76 
77 struct crypto_unittest_params {
78 	struct rte_crypto_sym_xform cipher_xform;
79 	struct rte_crypto_sym_xform auth_xform;
80 
81 	struct rte_cryptodev_sym_session *sess;
82 
83 	struct rte_crypto_op *op;
84 
85 	struct rte_mbuf *obuf, *ibuf;
86 
87 	uint8_t *digest;
88 };
89 
90 #define ALIGN_POW2_ROUNDUP(num, align) \
91 	(((num) + (align) - 1) & ~((align) - 1))
92 
93 /*
94  * Forward declarations.
95  */
96 static int
97 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
98 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
99 		uint8_t *hmac_key);
100 
101 static int
102 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
103 		struct crypto_unittest_params *ut_params,
104 		struct crypto_testsuite_params *ts_param,
105 		const uint8_t *cipher,
106 		const uint8_t *digest,
107 		const uint8_t *iv);
108 
109 static struct rte_mbuf *
110 setup_test_string(struct rte_mempool *mpool,
111 		const char *string, size_t len, uint8_t blocksize)
112 {
113 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
114 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
115 
116 	memset(m->buf_addr, 0, m->buf_len);
117 	if (m) {
118 		char *dst = rte_pktmbuf_append(m, t_len);
119 
120 		if (!dst) {
121 			rte_pktmbuf_free(m);
122 			return NULL;
123 		}
124 		if (string != NULL)
125 			rte_memcpy(dst, string, t_len);
126 		else
127 			memset(dst, 0, t_len);
128 	}
129 
130 	return m;
131 }
132 
133 /* Get number of bytes in X bits (rounding up) */
134 static uint32_t
135 ceil_byte_length(uint32_t num_bits)
136 {
137 	if (num_bits % 8)
138 		return ((num_bits >> 3) + 1);
139 	else
140 		return (num_bits >> 3);
141 }
142 
143 static struct rte_crypto_op *
144 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
145 {
146 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
147 		printf("Error sending packet for encryption");
148 		return NULL;
149 	}
150 
151 	op = NULL;
152 
153 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
154 		rte_pause();
155 
156 	return op;
157 }
158 
159 static struct crypto_testsuite_params testsuite_params = { NULL };
160 static struct crypto_unittest_params unittest_params;
161 
162 static int
163 testsuite_setup(void)
164 {
165 	struct crypto_testsuite_params *ts_params = &testsuite_params;
166 	struct rte_cryptodev_info info;
167 	uint32_t i = 0, nb_devs, dev_id;
168 	int ret;
169 	uint16_t qp_id;
170 
171 	memset(ts_params, 0, sizeof(*ts_params));
172 
173 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
174 	if (ts_params->mbuf_pool == NULL) {
175 		/* Not already created so create */
176 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
177 				"CRYPTO_MBUFPOOL",
178 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
179 				rte_socket_id());
180 		if (ts_params->mbuf_pool == NULL) {
181 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
182 			return TEST_FAILED;
183 		}
184 	}
185 
186 	ts_params->large_mbuf_pool = rte_mempool_lookup(
187 			"CRYPTO_LARGE_MBUFPOOL");
188 	if (ts_params->large_mbuf_pool == NULL) {
189 		/* Not already created so create */
190 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
191 				"CRYPTO_LARGE_MBUFPOOL",
192 				1, 0, 0, UINT16_MAX,
193 				rte_socket_id());
194 		if (ts_params->large_mbuf_pool == NULL) {
195 			RTE_LOG(ERR, USER1,
196 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
197 			return TEST_FAILED;
198 		}
199 	}
200 
201 	ts_params->op_mpool = rte_crypto_op_pool_create(
202 			"MBUF_CRYPTO_SYM_OP_POOL",
203 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
204 			NUM_MBUFS, MBUF_CACHE_SIZE,
205 			DEFAULT_NUM_XFORMS *
206 			sizeof(struct rte_crypto_sym_xform),
207 			rte_socket_id());
208 	if (ts_params->op_mpool == NULL) {
209 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
210 		return TEST_FAILED;
211 	}
212 
213 	/* Create 2 AESNI MB devices if required */
214 	if (gbl_cryptodev_type == RTE_CRYPTODEV_AESNI_MB_PMD) {
215 #ifndef RTE_LIBRTE_PMD_AESNI_MB
216 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
217 			" enabled in config file to run this testsuite.\n");
218 		return TEST_FAILED;
219 #endif
220 		nb_devs = rte_cryptodev_count_devtype(
221 				RTE_CRYPTODEV_AESNI_MB_PMD);
222 		if (nb_devs < 2) {
223 			for (i = nb_devs; i < 2; i++) {
224 				ret = rte_eal_vdev_init(
225 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
226 
227 				TEST_ASSERT(ret == 0,
228 					"Failed to create instance %u of"
229 					" pmd : %s",
230 					i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
231 			}
232 		}
233 	}
234 
235 	/* Create 2 AESNI GCM devices if required */
236 	if (gbl_cryptodev_type == RTE_CRYPTODEV_AESNI_GCM_PMD) {
237 #ifndef RTE_LIBRTE_PMD_AESNI_GCM
238 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_GCM must be"
239 			" enabled in config file to run this testsuite.\n");
240 		return TEST_FAILED;
241 #endif
242 		nb_devs = rte_cryptodev_count_devtype(
243 				RTE_CRYPTODEV_AESNI_GCM_PMD);
244 		if (nb_devs < 2) {
245 			for (i = nb_devs; i < 2; i++) {
246 				TEST_ASSERT_SUCCESS(rte_eal_vdev_init(
247 					RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
248 					"Failed to create instance %u of"
249 					" pmd : %s",
250 					i, RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
251 			}
252 		}
253 	}
254 
255 	/* Create 2 SNOW 3G devices if required */
256 	if (gbl_cryptodev_type == RTE_CRYPTODEV_SNOW3G_PMD) {
257 #ifndef RTE_LIBRTE_PMD_SNOW3G
258 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_SNOW3G must be"
259 			" enabled in config file to run this testsuite.\n");
260 		return TEST_FAILED;
261 #endif
262 		nb_devs = rte_cryptodev_count_devtype(RTE_CRYPTODEV_SNOW3G_PMD);
263 		if (nb_devs < 2) {
264 			for (i = nb_devs; i < 2; i++) {
265 				TEST_ASSERT_SUCCESS(rte_eal_vdev_init(
266 					RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
267 					"Failed to create instance %u of"
268 					" pmd : %s",
269 					i, RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
270 			}
271 		}
272 	}
273 
274 	/* Create 2 KASUMI devices if required */
275 	if (gbl_cryptodev_type == RTE_CRYPTODEV_KASUMI_PMD) {
276 #ifndef RTE_LIBRTE_PMD_KASUMI
277 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_KASUMI must be"
278 			" enabled in config file to run this testsuite.\n");
279 		return TEST_FAILED;
280 #endif
281 		nb_devs = rte_cryptodev_count_devtype(RTE_CRYPTODEV_KASUMI_PMD);
282 		if (nb_devs < 2) {
283 			for (i = nb_devs; i < 2; i++) {
284 				TEST_ASSERT_SUCCESS(rte_eal_vdev_init(
285 					RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
286 					"Failed to create instance %u of"
287 					" pmd : %s",
288 					i, RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
289 			}
290 		}
291 	}
292 
293 	/* Create 2 ZUC devices if required */
294 	if (gbl_cryptodev_type == RTE_CRYPTODEV_ZUC_PMD) {
295 #ifndef RTE_LIBRTE_PMD_ZUC
296 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_ZUC must be"
297 			" enabled in config file to run this testsuite.\n");
298 		return TEST_FAILED;
299 #endif
300 		nb_devs = rte_cryptodev_count_devtype(RTE_CRYPTODEV_ZUC_PMD);
301 		if (nb_devs < 2) {
302 			for (i = nb_devs; i < 2; i++) {
303 				TEST_ASSERT_SUCCESS(rte_eal_vdev_init(
304 					RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
305 					"Failed to create instance %u of"
306 					" pmd : %s",
307 					i, RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
308 			}
309 		}
310 	}
311 
312 	/* Create 2 NULL devices if required */
313 	if (gbl_cryptodev_type == RTE_CRYPTODEV_NULL_PMD) {
314 #ifndef RTE_LIBRTE_PMD_NULL_CRYPTO
315 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_NULL_CRYPTO must be"
316 			" enabled in config file to run this testsuite.\n");
317 		return TEST_FAILED;
318 #endif
319 		nb_devs = rte_cryptodev_count_devtype(
320 				RTE_CRYPTODEV_NULL_PMD);
321 		if (nb_devs < 2) {
322 			for (i = nb_devs; i < 2; i++) {
323 				int dev_id = rte_eal_vdev_init(
324 					RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
325 
326 				TEST_ASSERT(dev_id >= 0,
327 					"Failed to create instance %u of"
328 					" pmd : %s",
329 					i, RTE_STR(CRYPTODEV_NAME_NULL_PMD));
330 			}
331 		}
332 	}
333 
334 	/* Create 2 OPENSSL devices if required */
335 	if (gbl_cryptodev_type == RTE_CRYPTODEV_OPENSSL_PMD) {
336 #ifndef RTE_LIBRTE_PMD_OPENSSL
337 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_OPENSSL must be"
338 			" enabled in config file to run this testsuite.\n");
339 		return TEST_FAILED;
340 #endif
341 		nb_devs = rte_cryptodev_count_devtype(
342 				RTE_CRYPTODEV_OPENSSL_PMD);
343 		if (nb_devs < 2) {
344 			for (i = nb_devs; i < 2; i++) {
345 				ret = rte_eal_vdev_init(
346 					RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
347 					NULL);
348 
349 				TEST_ASSERT(ret == 0, "Failed to create "
350 					"instance %u of pmd : %s", i,
351 					RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
352 			}
353 		}
354 	}
355 
356 	/* Create 2 ARMv8 devices if required */
357 	if (gbl_cryptodev_type == RTE_CRYPTODEV_ARMV8_PMD) {
358 #ifndef RTE_LIBRTE_PMD_ARMV8_CRYPTO
359 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_ARMV8_CRYPTO must be"
360 			" enabled in config file to run this testsuite.\n");
361 		return TEST_FAILED;
362 #endif
363 		nb_devs = rte_cryptodev_count_devtype(
364 				RTE_CRYPTODEV_ARMV8_PMD);
365 		if (nb_devs < 2) {
366 			for (i = nb_devs; i < 2; i++) {
367 				ret = rte_eal_vdev_init(
368 					RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
369 					NULL);
370 
371 				TEST_ASSERT(ret == 0, "Failed to create "
372 					"instance %u of pmd : %s", i,
373 					RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
374 			}
375 		}
376 	}
377 
378 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
379 	if (gbl_cryptodev_type == RTE_CRYPTODEV_SCHEDULER_PMD) {
380 
381 #ifndef RTE_LIBRTE_PMD_AESNI_MB
382 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_AESNI_MB must be"
383 			" enabled in config file to run this testsuite.\n");
384 		return TEST_FAILED;
385 #endif
386 		nb_devs = rte_cryptodev_count_devtype(
387 				RTE_CRYPTODEV_SCHEDULER_PMD);
388 		if (nb_devs < 1) {
389 			ret = rte_eal_vdev_init(
390 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
391 				NULL);
392 
393 			TEST_ASSERT(ret == 0,
394 				"Failed to create instance %u of"
395 				" pmd : %s",
396 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
397 		}
398 	}
399 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
400 
401 #ifndef RTE_LIBRTE_PMD_QAT
402 	if (gbl_cryptodev_type == RTE_CRYPTODEV_QAT_SYM_PMD) {
403 		RTE_LOG(ERR, USER1, "CONFIG_RTE_LIBRTE_PMD_QAT must be enabled "
404 				"in config file to run this testsuite.\n");
405 		return TEST_FAILED;
406 	}
407 #endif
408 
409 	nb_devs = rte_cryptodev_count();
410 	if (nb_devs < 1) {
411 		RTE_LOG(ERR, USER1, "No crypto devices found?\n");
412 		return TEST_FAILED;
413 	}
414 
415 	/* Create list of valid crypto devs */
416 	for (i = 0; i < nb_devs; i++) {
417 		rte_cryptodev_info_get(i, &info);
418 		if (info.dev_type == gbl_cryptodev_type)
419 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
420 	}
421 
422 	if (ts_params->valid_dev_count < 1)
423 		return TEST_FAILED;
424 
425 	/* Set up all the qps on the first of the valid devices found */
426 
427 	dev_id = ts_params->valid_devs[0];
428 
429 	rte_cryptodev_info_get(dev_id, &info);
430 
431 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
432 	ts_params->conf.socket_id = SOCKET_ID_ANY;
433 	ts_params->conf.session_mp.nb_objs = info.sym.max_nb_sessions;
434 
435 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
436 			&ts_params->conf),
437 			"Failed to configure cryptodev %u with %u qps",
438 			dev_id, ts_params->conf.nb_queue_pairs);
439 
440 	ts_params->qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
441 
442 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
443 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
444 			dev_id, qp_id, &ts_params->qp_conf,
445 			rte_cryptodev_socket_id(dev_id)),
446 			"Failed to setup queue pair %u on cryptodev %u",
447 			qp_id, dev_id);
448 	}
449 
450 	return TEST_SUCCESS;
451 }
452 
453 static void
454 testsuite_teardown(void)
455 {
456 	struct crypto_testsuite_params *ts_params = &testsuite_params;
457 
458 	if (ts_params->mbuf_pool != NULL) {
459 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
460 		rte_mempool_avail_count(ts_params->mbuf_pool));
461 	}
462 
463 	if (ts_params->op_mpool != NULL) {
464 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
465 		rte_mempool_avail_count(ts_params->op_mpool));
466 	}
467 
468 }
469 
470 static int
471 ut_setup(void)
472 {
473 	struct crypto_testsuite_params *ts_params = &testsuite_params;
474 	struct crypto_unittest_params *ut_params = &unittest_params;
475 
476 	uint16_t qp_id;
477 
478 	/* Clear unit test parameters before running test */
479 	memset(ut_params, 0, sizeof(*ut_params));
480 
481 	/* Reconfigure device to default parameters */
482 	ts_params->conf.socket_id = SOCKET_ID_ANY;
483 	ts_params->conf.session_mp.nb_objs = DEFAULT_NUM_OPS_INFLIGHT;
484 
485 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
486 			&ts_params->conf),
487 			"Failed to configure cryptodev %u",
488 			ts_params->valid_devs[0]);
489 
490 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
491 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
492 			ts_params->valid_devs[0], qp_id,
493 			&ts_params->qp_conf,
494 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
495 			"Failed to setup queue pair %u on cryptodev %u",
496 			qp_id, ts_params->valid_devs[0]);
497 	}
498 
499 
500 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
501 
502 	/* Start the device */
503 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
504 			"Failed to start cryptodev %u",
505 			ts_params->valid_devs[0]);
506 
507 	return TEST_SUCCESS;
508 }
509 
510 static void
511 ut_teardown(void)
512 {
513 	struct crypto_testsuite_params *ts_params = &testsuite_params;
514 	struct crypto_unittest_params *ut_params = &unittest_params;
515 	struct rte_cryptodev_stats stats;
516 
517 	/* free crypto session structure */
518 	if (ut_params->sess) {
519 		rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
520 				ut_params->sess);
521 		ut_params->sess = NULL;
522 	}
523 
524 	/* free crypto operation structure */
525 	if (ut_params->op)
526 		rte_crypto_op_free(ut_params->op);
527 
528 	/*
529 	 * free mbuf - both obuf and ibuf are usually the same,
530 	 * so check if they point at the same address is necessary,
531 	 * to avoid freeing the mbuf twice.
532 	 */
533 	if (ut_params->obuf) {
534 		rte_pktmbuf_free(ut_params->obuf);
535 		if (ut_params->ibuf == ut_params->obuf)
536 			ut_params->ibuf = 0;
537 		ut_params->obuf = 0;
538 	}
539 	if (ut_params->ibuf) {
540 		rte_pktmbuf_free(ut_params->ibuf);
541 		ut_params->ibuf = 0;
542 	}
543 
544 	if (ts_params->mbuf_pool != NULL)
545 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
546 			rte_mempool_avail_count(ts_params->mbuf_pool));
547 
548 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
549 
550 	/* Stop the device */
551 	rte_cryptodev_stop(ts_params->valid_devs[0]);
552 }
553 
554 static int
555 test_device_configure_invalid_dev_id(void)
556 {
557 	struct crypto_testsuite_params *ts_params = &testsuite_params;
558 	uint16_t dev_id, num_devs = 0;
559 
560 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
561 			"Need at least %d devices for test", 1);
562 
563 	/* valid dev_id values */
564 	dev_id = ts_params->valid_devs[ts_params->valid_dev_count - 1];
565 
566 	/* Stop the device in case it's started so it can be configured */
567 	rte_cryptodev_stop(ts_params->valid_devs[dev_id]);
568 
569 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
570 			"Failed test for rte_cryptodev_configure: "
571 			"invalid dev_num %u", dev_id);
572 
573 	/* invalid dev_id values */
574 	dev_id = num_devs;
575 
576 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
577 			"Failed test for rte_cryptodev_configure: "
578 			"invalid dev_num %u", dev_id);
579 
580 	dev_id = 0xff;
581 
582 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
583 			"Failed test for rte_cryptodev_configure:"
584 			"invalid dev_num %u", dev_id);
585 
586 	return TEST_SUCCESS;
587 }
588 
589 static int
590 test_device_configure_invalid_queue_pair_ids(void)
591 {
592 	struct crypto_testsuite_params *ts_params = &testsuite_params;
593 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
594 
595 	/* Stop the device in case it's started so it can be configured */
596 	rte_cryptodev_stop(ts_params->valid_devs[0]);
597 
598 	/* valid - one queue pairs */
599 	ts_params->conf.nb_queue_pairs = 1;
600 
601 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
602 			&ts_params->conf),
603 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
604 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
605 
606 
607 	/* valid - max value queue pairs */
608 	ts_params->conf.nb_queue_pairs = MAX_NUM_QPS_PER_QAT_DEVICE;
609 
610 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
611 			&ts_params->conf),
612 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
613 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
614 
615 
616 	/* invalid - zero queue pairs */
617 	ts_params->conf.nb_queue_pairs = 0;
618 
619 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
620 			&ts_params->conf),
621 			"Failed test for rte_cryptodev_configure, dev_id %u,"
622 			" invalid qps: %u",
623 			ts_params->valid_devs[0],
624 			ts_params->conf.nb_queue_pairs);
625 
626 
627 	/* invalid - max value supported by field queue pairs */
628 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
629 
630 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
631 			&ts_params->conf),
632 			"Failed test for rte_cryptodev_configure, dev_id %u,"
633 			" invalid qps: %u",
634 			ts_params->valid_devs[0],
635 			ts_params->conf.nb_queue_pairs);
636 
637 
638 	/* invalid - max value + 1 queue pairs */
639 	ts_params->conf.nb_queue_pairs = MAX_NUM_QPS_PER_QAT_DEVICE + 1;
640 
641 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
642 			&ts_params->conf),
643 			"Failed test for rte_cryptodev_configure, dev_id %u,"
644 			" invalid qps: %u",
645 			ts_params->valid_devs[0],
646 			ts_params->conf.nb_queue_pairs);
647 
648 	/* revert to original testsuite value */
649 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
650 
651 	return TEST_SUCCESS;
652 }
653 
654 static int
655 test_queue_pair_descriptor_setup(void)
656 {
657 	struct crypto_testsuite_params *ts_params = &testsuite_params;
658 	struct rte_cryptodev_info dev_info;
659 	struct rte_cryptodev_qp_conf qp_conf = {
660 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
661 	};
662 
663 	uint16_t qp_id;
664 
665 	/* Stop the device in case it's started so it can be configured */
666 	rte_cryptodev_stop(ts_params->valid_devs[0]);
667 
668 
669 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
670 
671 	ts_params->conf.session_mp.nb_objs = dev_info.sym.max_nb_sessions;
672 
673 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
674 			&ts_params->conf), "Failed to configure cryptodev %u",
675 			ts_params->valid_devs[0]);
676 
677 
678 	/*
679 	 * Test various ring sizes on this device. memzones can't be
680 	 * freed so are re-used if ring is released and re-created.
681 	 */
682 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
683 
684 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
685 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
686 				ts_params->valid_devs[0], qp_id, &qp_conf,
687 				rte_cryptodev_socket_id(
688 						ts_params->valid_devs[0])),
689 				"Failed test for "
690 				"rte_cryptodev_queue_pair_setup: num_inflights "
691 				"%u on qp %u on cryptodev %u",
692 				qp_conf.nb_descriptors, qp_id,
693 				ts_params->valid_devs[0]);
694 	}
695 
696 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
697 
698 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
699 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
700 				ts_params->valid_devs[0], qp_id, &qp_conf,
701 				rte_cryptodev_socket_id(
702 						ts_params->valid_devs[0])),
703 				"Failed test for"
704 				" rte_cryptodev_queue_pair_setup: num_inflights"
705 				" %u on qp %u on cryptodev %u",
706 				qp_conf.nb_descriptors, qp_id,
707 				ts_params->valid_devs[0]);
708 	}
709 
710 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
711 
712 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
713 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
714 				ts_params->valid_devs[0], qp_id, &qp_conf,
715 				rte_cryptodev_socket_id(
716 						ts_params->valid_devs[0])),
717 				"Failed test for "
718 				"rte_cryptodev_queue_pair_setup: num_inflights"
719 				" %u on qp %u on cryptodev %u",
720 				qp_conf.nb_descriptors, qp_id,
721 				ts_params->valid_devs[0]);
722 	}
723 
724 	/* invalid number of descriptors - max supported + 2 */
725 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT + 2;
726 
727 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
728 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
729 				ts_params->valid_devs[0], qp_id, &qp_conf,
730 				rte_cryptodev_socket_id(
731 						ts_params->valid_devs[0])),
732 				"Unexpectedly passed test for "
733 				"rte_cryptodev_queue_pair_setup:"
734 				"num_inflights %u on qp %u on cryptodev %u",
735 				qp_conf.nb_descriptors, qp_id,
736 				ts_params->valid_devs[0]);
737 	}
738 
739 	/* invalid number of descriptors - max value of parameter */
740 	qp_conf.nb_descriptors = UINT32_MAX-1;
741 
742 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
743 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
744 				ts_params->valid_devs[0], qp_id, &qp_conf,
745 				rte_cryptodev_socket_id(
746 						ts_params->valid_devs[0])),
747 				"Unexpectedly passed test for "
748 				"rte_cryptodev_queue_pair_setup:"
749 				"num_inflights %u on qp %u on cryptodev %u",
750 				qp_conf.nb_descriptors, qp_id,
751 				ts_params->valid_devs[0]);
752 	}
753 
754 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
755 
756 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
757 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
758 				ts_params->valid_devs[0], qp_id, &qp_conf,
759 				rte_cryptodev_socket_id(
760 						ts_params->valid_devs[0])),
761 				"Failed test for"
762 				" rte_cryptodev_queue_pair_setup:"
763 				"num_inflights %u on qp %u on cryptodev %u",
764 				qp_conf.nb_descriptors, qp_id,
765 				ts_params->valid_devs[0]);
766 	}
767 
768 	/* invalid number of descriptors - max supported + 1 */
769 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT + 1;
770 
771 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
772 		TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
773 				ts_params->valid_devs[0], qp_id, &qp_conf,
774 				rte_cryptodev_socket_id(
775 						ts_params->valid_devs[0])),
776 				"Unexpectedly passed test for "
777 				"rte_cryptodev_queue_pair_setup:"
778 				"num_inflights %u on qp %u on cryptodev %u",
779 				qp_conf.nb_descriptors, qp_id,
780 				ts_params->valid_devs[0]);
781 	}
782 
783 	/* test invalid queue pair id */
784 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
785 
786 	qp_id = DEFAULT_NUM_QPS_PER_QAT_DEVICE;		/*invalid */
787 
788 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
789 			ts_params->valid_devs[0],
790 			qp_id, &qp_conf,
791 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
792 			"Failed test for rte_cryptodev_queue_pair_setup:"
793 			"invalid qp %u on cryptodev %u",
794 			qp_id, ts_params->valid_devs[0]);
795 
796 	qp_id = 0xffff; /*invalid*/
797 
798 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
799 			ts_params->valid_devs[0],
800 			qp_id, &qp_conf,
801 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
802 			"Failed test for rte_cryptodev_queue_pair_setup:"
803 			"invalid qp %u on cryptodev %u",
804 			qp_id, ts_params->valid_devs[0]);
805 
806 	return TEST_SUCCESS;
807 }
808 
809 /* ***** Plaintext data for tests ***** */
810 
811 const char catch_22_quote_1[] =
812 		"There was only one catch and that was Catch-22, which "
813 		"specified that a concern for one's safety in the face of "
814 		"dangers that were real and immediate was the process of a "
815 		"rational mind. Orr was crazy and could be grounded. All he "
816 		"had to do was ask; and as soon as he did, he would no longer "
817 		"be crazy and would have to fly more missions. Orr would be "
818 		"crazy to fly more missions and sane if he didn't, but if he "
819 		"was sane he had to fly them. If he flew them he was crazy "
820 		"and didn't have to; but if he didn't want to he was sane and "
821 		"had to. Yossarian was moved very deeply by the absolute "
822 		"simplicity of this clause of Catch-22 and let out a "
823 		"respectful whistle. \"That's some catch, that Catch-22\", he "
824 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
825 
826 const char catch_22_quote[] =
827 		"What a lousy earth! He wondered how many people were "
828 		"destitute that same night even in his own prosperous country, "
829 		"how many homes were shanties, how many husbands were drunk "
830 		"and wives socked, and how many children were bullied, abused, "
831 		"or abandoned. How many families hungered for food they could "
832 		"not afford to buy? How many hearts were broken? How many "
833 		"suicides would take place that same night, how many people "
834 		"would go insane? How many cockroaches and landlords would "
835 		"triumph? How many winners were losers, successes failures, "
836 		"and rich men poor men? How many wise guys were stupid? How "
837 		"many happy endings were unhappy endings? How many honest men "
838 		"were liars, brave men cowards, loyal men traitors, how many "
839 		"sainted men were corrupt, how many people in positions of "
840 		"trust had sold their souls to bodyguards, how many had never "
841 		"had souls? How many straight-and-narrow paths were crooked "
842 		"paths? How many best families were worst families and how "
843 		"many good people were bad people? When you added them all up "
844 		"and then subtracted, you might be left with only the children, "
845 		"and perhaps with Albert Einstein and an old violinist or "
846 		"sculptor somewhere.";
847 
848 #define QUOTE_480_BYTES		(480)
849 #define QUOTE_512_BYTES		(512)
850 #define QUOTE_768_BYTES		(768)
851 #define QUOTE_1024_BYTES	(1024)
852 
853 
854 
855 /* ***** SHA1 Hash Tests ***** */
856 
857 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
858 
859 static uint8_t hmac_sha1_key[] = {
860 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
861 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
862 	0xDE, 0xF4, 0xDE, 0xAD };
863 
864 /* ***** SHA224 Hash Tests ***** */
865 
866 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
867 
868 
869 /* ***** AES-CBC Cipher Tests ***** */
870 
871 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
872 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
873 
874 static uint8_t aes_cbc_key[] = {
875 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
876 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
877 
878 static uint8_t aes_cbc_iv[] = {
879 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
880 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
881 
882 
883 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
884 
885 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
886 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
887 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
888 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
889 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
890 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
891 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
892 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
893 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
894 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
895 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
896 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
897 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
898 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
899 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
900 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
901 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
902 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
903 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
904 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
905 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
906 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
907 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
908 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
909 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
910 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
911 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
912 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
913 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
914 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
915 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
916 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
917 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
918 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
919 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
920 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
921 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
922 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
923 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
924 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
925 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
926 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
927 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
928 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
929 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
930 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
931 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
932 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
933 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
934 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
935 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
936 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
937 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
938 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
939 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
940 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
941 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
942 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
943 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
944 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
945 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
946 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
947 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
948 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
949 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
950 };
951 
952 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
953 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
954 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
955 	0x18, 0x8c, 0x1d, 0x32
956 };
957 
958 
959 /* Multisession Vector context Test */
960 /*Begin Session 0 */
961 static uint8_t ms_aes_cbc_key0[] = {
962 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
963 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
964 };
965 
966 static uint8_t ms_aes_cbc_iv0[] = {
967 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
968 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
969 };
970 
971 static const uint8_t ms_aes_cbc_cipher0[] = {
972 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
973 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
974 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
975 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
976 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
977 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
978 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
979 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
980 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
981 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
982 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
983 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
984 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
985 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
986 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
987 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
988 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
989 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
990 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
991 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
992 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
993 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
994 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
995 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
996 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
997 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
998 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
999 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1000 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1001 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1002 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1003 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1004 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1005 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1006 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1007 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1008 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1009 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1010 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1011 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1012 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1013 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1014 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1015 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1016 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1017 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1018 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1019 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1020 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1021 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1022 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1023 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1024 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1025 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1026 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1027 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1028 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1029 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1030 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1031 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1032 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1033 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1034 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1035 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1036 };
1037 
1038 
1039 static  uint8_t ms_hmac_key0[] = {
1040 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1041 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1042 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1043 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1044 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1045 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1046 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1047 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1048 };
1049 
1050 static const uint8_t ms_hmac_digest0[] = {
1051 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1052 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1053 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1054 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1055 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1056 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1057 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1058 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1059 		};
1060 
1061 /* End Session 0 */
1062 /* Begin session 1 */
1063 
1064 static  uint8_t ms_aes_cbc_key1[] = {
1065 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1066 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1067 };
1068 
1069 static  uint8_t ms_aes_cbc_iv1[] = {
1070 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1071 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1072 };
1073 
1074 static const uint8_t ms_aes_cbc_cipher1[] = {
1075 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1076 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1077 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1078 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1079 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1080 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1081 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1082 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1083 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1084 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1085 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1086 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1087 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1088 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1089 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1090 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1091 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1092 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1093 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1094 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1095 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1096 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1097 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1098 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1099 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1100 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1101 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1102 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1103 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1104 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1105 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1106 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1107 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1108 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1109 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1110 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1111 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1112 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1113 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1114 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1115 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1116 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1117 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1118 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1119 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1120 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1121 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1122 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1123 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1124 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1125 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1126 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1127 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1128 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1129 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1130 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1131 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1132 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1133 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1134 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1135 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1136 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1137 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1138 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1139 
1140 };
1141 
1142 static uint8_t ms_hmac_key1[] = {
1143 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1144 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1145 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1146 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1147 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1148 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1149 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1150 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1151 };
1152 
1153 static const uint8_t ms_hmac_digest1[] = {
1154 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1155 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1156 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1157 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1158 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1159 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1160 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1161 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1162 };
1163 /* End Session 1  */
1164 /* Begin Session 2 */
1165 static  uint8_t ms_aes_cbc_key2[] = {
1166 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1167 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1168 };
1169 
1170 static  uint8_t ms_aes_cbc_iv2[] = {
1171 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1172 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1173 };
1174 
1175 static const uint8_t ms_aes_cbc_cipher2[] = {
1176 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1177 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1178 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1179 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1180 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1181 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1182 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1183 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1184 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1185 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1186 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1187 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1188 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1189 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1190 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1191 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1192 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1193 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1194 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1195 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1196 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1197 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1198 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1199 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1200 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1201 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1202 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1203 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1204 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1205 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1206 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1207 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1208 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1209 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1210 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1211 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1212 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1213 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1214 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1215 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1216 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1217 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1218 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1219 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1220 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1221 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1222 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1223 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1224 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1225 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1226 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1227 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1228 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1229 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1230 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1231 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1232 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1233 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1234 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1235 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1236 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1237 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1238 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1239 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1240 };
1241 
1242 static  uint8_t ms_hmac_key2[] = {
1243 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1244 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1245 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1246 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1247 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1248 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1249 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1250 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1251 };
1252 
1253 static const uint8_t ms_hmac_digest2[] = {
1254 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1255 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1256 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1257 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1258 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1259 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1260 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1261 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1262 };
1263 
1264 /* End Session 2 */
1265 
1266 
1267 static int
1268 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1269 {
1270 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1271 	struct crypto_unittest_params *ut_params = &unittest_params;
1272 
1273 	/* Generate test mbuf data and space for digest */
1274 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1275 			catch_22_quote,	QUOTE_512_BYTES, 0);
1276 
1277 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1278 			DIGEST_BYTE_LENGTH_SHA1);
1279 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1280 
1281 	/* Setup Cipher Parameters */
1282 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1283 	ut_params->cipher_xform.next = &ut_params->auth_xform;
1284 
1285 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1286 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1287 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1288 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1289 
1290 	/* Setup HMAC Parameters */
1291 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1292 
1293 	ut_params->auth_xform.next = NULL;
1294 
1295 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1296 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1297 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1298 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1299 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1300 
1301 	/* Create crypto session*/
1302 	ut_params->sess = rte_cryptodev_sym_session_create(
1303 			ts_params->valid_devs[0],
1304 			&ut_params->cipher_xform);
1305 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1306 
1307 	/* Generate crypto op data structure */
1308 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1309 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1310 	TEST_ASSERT_NOT_NULL(ut_params->op,
1311 			"Failed to allocate symmetric crypto operation struct");
1312 
1313 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1314 
1315 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1316 
1317 	/* set crypto operation source mbuf */
1318 	sym_op->m_src = ut_params->ibuf;
1319 
1320 	/* Set crypto operation authentication parameters */
1321 	sym_op->auth.digest.data = ut_params->digest;
1322 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
1323 			ut_params->ibuf, QUOTE_512_BYTES);
1324 	sym_op->auth.digest.length = DIGEST_BYTE_LENGTH_SHA1;
1325 
1326 	sym_op->auth.data.offset = CIPHER_IV_LENGTH_AES_CBC;
1327 	sym_op->auth.data.length = QUOTE_512_BYTES;
1328 
1329 	/* Set crypto operation cipher parameters */
1330 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(ut_params->ibuf,
1331 			CIPHER_IV_LENGTH_AES_CBC);
1332 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
1333 	sym_op->cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1334 
1335 	rte_memcpy(sym_op->cipher.iv.data, aes_cbc_iv,
1336 			CIPHER_IV_LENGTH_AES_CBC);
1337 
1338 	sym_op->cipher.data.offset = CIPHER_IV_LENGTH_AES_CBC;
1339 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1340 
1341 	/* Process crypto operation */
1342 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1343 			ut_params->op), "failed to process sym crypto op");
1344 
1345 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1346 			"crypto op processing failed");
1347 
1348 	/* Validate obuf */
1349 	uint8_t *ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
1350 			uint8_t *, CIPHER_IV_LENGTH_AES_CBC);
1351 
1352 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1353 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1354 			QUOTE_512_BYTES,
1355 			"ciphertext data not as expected");
1356 
1357 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1358 
1359 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1360 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1361 			gbl_cryptodev_type == RTE_CRYPTODEV_AESNI_MB_PMD ?
1362 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1363 					DIGEST_BYTE_LENGTH_SHA1,
1364 			"Generated digest data not as expected");
1365 
1366 	return TEST_SUCCESS;
1367 }
1368 
1369 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1370 
1371 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1372 
1373 static uint8_t hmac_sha512_key[] = {
1374 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1375 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1376 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1377 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1378 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1379 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1380 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1381 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1382 
1383 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1384 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1385 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1386 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1387 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1388 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1389 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1390 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1391 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1392 
1393 
1394 
1395 static int
1396 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1397 		struct crypto_unittest_params *ut_params,
1398 		uint8_t *cipher_key,
1399 		uint8_t *hmac_key);
1400 
1401 static int
1402 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1403 		struct crypto_unittest_params *ut_params,
1404 		struct crypto_testsuite_params *ts_params,
1405 		const uint8_t *cipher,
1406 		const uint8_t *digest,
1407 		const uint8_t *iv);
1408 
1409 
1410 static int
1411 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1412 		struct crypto_unittest_params *ut_params,
1413 		uint8_t *cipher_key,
1414 		uint8_t *hmac_key)
1415 {
1416 
1417 	/* Setup Cipher Parameters */
1418 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1419 	ut_params->cipher_xform.next = NULL;
1420 
1421 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1422 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1423 	ut_params->cipher_xform.cipher.key.data = cipher_key;
1424 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1425 
1426 	/* Setup HMAC Parameters */
1427 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1428 	ut_params->auth_xform.next = &ut_params->cipher_xform;
1429 
1430 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1431 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1432 	ut_params->auth_xform.auth.key.data = hmac_key;
1433 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1434 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1435 
1436 	return TEST_SUCCESS;
1437 }
1438 
1439 
1440 static int
1441 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1442 		struct crypto_unittest_params *ut_params,
1443 		struct crypto_testsuite_params *ts_params,
1444 		const uint8_t *cipher,
1445 		const uint8_t *digest,
1446 		const uint8_t *iv)
1447 {
1448 	/* Generate test mbuf data and digest */
1449 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1450 			(const char *)
1451 			cipher,
1452 			QUOTE_512_BYTES, 0);
1453 
1454 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1455 			DIGEST_BYTE_LENGTH_SHA512);
1456 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1457 
1458 	rte_memcpy(ut_params->digest,
1459 			digest,
1460 			DIGEST_BYTE_LENGTH_SHA512);
1461 
1462 	/* Generate Crypto op data structure */
1463 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1464 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1465 	TEST_ASSERT_NOT_NULL(ut_params->op,
1466 			"Failed to allocate symmetric crypto operation struct");
1467 
1468 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
1469 
1470 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1471 
1472 	/* set crypto operation source mbuf */
1473 	sym_op->m_src = ut_params->ibuf;
1474 
1475 	sym_op->auth.digest.data = ut_params->digest;
1476 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
1477 			ut_params->ibuf, QUOTE_512_BYTES);
1478 	sym_op->auth.digest.length = DIGEST_BYTE_LENGTH_SHA512;
1479 
1480 	sym_op->auth.data.offset = CIPHER_IV_LENGTH_AES_CBC;
1481 	sym_op->auth.data.length = QUOTE_512_BYTES;
1482 
1483 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
1484 			ut_params->ibuf, CIPHER_IV_LENGTH_AES_CBC);
1485 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys_offset(
1486 			ut_params->ibuf, 0);
1487 	sym_op->cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1488 
1489 	rte_memcpy(sym_op->cipher.iv.data, iv,
1490 			CIPHER_IV_LENGTH_AES_CBC);
1491 
1492 	sym_op->cipher.data.offset = CIPHER_IV_LENGTH_AES_CBC;
1493 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1494 
1495 	/* Process crypto operation */
1496 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
1497 			ut_params->op), "failed to process sym crypto op");
1498 
1499 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1500 			"crypto op processing failed");
1501 
1502 	ut_params->obuf = ut_params->op->sym->m_src;
1503 
1504 	/* Validate obuf */
1505 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
1506 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *) +
1507 			CIPHER_IV_LENGTH_AES_CBC, catch_22_quote,
1508 			QUOTE_512_BYTES,
1509 			"Plaintext data not as expected");
1510 
1511 	/* Validate obuf */
1512 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1513 			"Digest verification failed");
1514 
1515 	return TEST_SUCCESS;
1516 }
1517 
1518 static int
1519 test_AES_cipheronly_mb_all(void)
1520 {
1521 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1522 	int status;
1523 
1524 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1525 		ts_params->op_mpool, ts_params->valid_devs[0],
1526 		RTE_CRYPTODEV_AESNI_MB_PMD,
1527 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1528 
1529 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1530 
1531 	return TEST_SUCCESS;
1532 }
1533 
1534 static int
1535 test_authonly_mb_all(void)
1536 {
1537 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1538 	int status;
1539 
1540 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1541 		ts_params->op_mpool, ts_params->valid_devs[0],
1542 		RTE_CRYPTODEV_AESNI_MB_PMD,
1543 		BLKCIPHER_AUTHONLY_TYPE);
1544 
1545 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1546 
1547 	return TEST_SUCCESS;
1548 }
1549 
1550 static int
1551 test_AES_chain_mb_all(void)
1552 {
1553 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1554 	int status;
1555 
1556 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1557 		ts_params->op_mpool, ts_params->valid_devs[0],
1558 		RTE_CRYPTODEV_AESNI_MB_PMD,
1559 		BLKCIPHER_AES_CHAIN_TYPE);
1560 
1561 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1562 
1563 	return TEST_SUCCESS;
1564 }
1565 
1566 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
1567 
1568 static int
1569 test_AES_cipheronly_scheduler_all(void)
1570 {
1571 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1572 	int status;
1573 
1574 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1575 		ts_params->op_mpool, ts_params->valid_devs[0],
1576 		RTE_CRYPTODEV_SCHEDULER_PMD,
1577 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1578 
1579 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1580 
1581 	return TEST_SUCCESS;
1582 }
1583 
1584 static int
1585 test_AES_chain_scheduler_all(void)
1586 {
1587 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1588 	int status;
1589 
1590 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1591 		ts_params->op_mpool, ts_params->valid_devs[0],
1592 		RTE_CRYPTODEV_SCHEDULER_PMD,
1593 		BLKCIPHER_AES_CHAIN_TYPE);
1594 
1595 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1596 
1597 	return TEST_SUCCESS;
1598 }
1599 
1600 static int
1601 test_authonly_scheduler_all(void)
1602 {
1603 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1604 	int status;
1605 
1606 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1607 		ts_params->op_mpool, ts_params->valid_devs[0],
1608 		RTE_CRYPTODEV_SCHEDULER_PMD,
1609 		BLKCIPHER_AUTHONLY_TYPE);
1610 
1611 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1612 
1613 	return TEST_SUCCESS;
1614 }
1615 
1616 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
1617 
1618 static int
1619 test_AES_chain_openssl_all(void)
1620 {
1621 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1622 	int status;
1623 
1624 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1625 		ts_params->op_mpool, ts_params->valid_devs[0],
1626 		RTE_CRYPTODEV_OPENSSL_PMD,
1627 		BLKCIPHER_AES_CHAIN_TYPE);
1628 
1629 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1630 
1631 	return TEST_SUCCESS;
1632 }
1633 
1634 static int
1635 test_AES_cipheronly_openssl_all(void)
1636 {
1637 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1638 	int status;
1639 
1640 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1641 		ts_params->op_mpool, ts_params->valid_devs[0],
1642 		RTE_CRYPTODEV_OPENSSL_PMD,
1643 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1644 
1645 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1646 
1647 	return TEST_SUCCESS;
1648 }
1649 
1650 static int
1651 test_AES_chain_qat_all(void)
1652 {
1653 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1654 	int status;
1655 
1656 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1657 		ts_params->op_mpool, ts_params->valid_devs[0],
1658 		RTE_CRYPTODEV_QAT_SYM_PMD,
1659 		BLKCIPHER_AES_CHAIN_TYPE);
1660 
1661 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1662 
1663 	return TEST_SUCCESS;
1664 }
1665 
1666 static int
1667 test_AES_cipheronly_qat_all(void)
1668 {
1669 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1670 	int status;
1671 
1672 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1673 		ts_params->op_mpool, ts_params->valid_devs[0],
1674 		RTE_CRYPTODEV_QAT_SYM_PMD,
1675 		BLKCIPHER_AES_CIPHERONLY_TYPE);
1676 
1677 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1678 
1679 	return TEST_SUCCESS;
1680 }
1681 
1682 static int
1683 test_authonly_openssl_all(void)
1684 {
1685 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1686 	int status;
1687 
1688 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1689 		ts_params->op_mpool, ts_params->valid_devs[0],
1690 		RTE_CRYPTODEV_OPENSSL_PMD,
1691 		BLKCIPHER_AUTHONLY_TYPE);
1692 
1693 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1694 
1695 	return TEST_SUCCESS;
1696 }
1697 
1698 static int
1699 test_AES_chain_armv8_all(void)
1700 {
1701 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1702 	int status;
1703 
1704 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1705 		ts_params->op_mpool, ts_params->valid_devs[0],
1706 		RTE_CRYPTODEV_ARMV8_PMD,
1707 		BLKCIPHER_AES_CHAIN_TYPE);
1708 
1709 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1710 
1711 	return TEST_SUCCESS;
1712 }
1713 
1714 /* ***** SNOW 3G Tests ***** */
1715 static int
1716 create_wireless_algo_hash_session(uint8_t dev_id,
1717 	const uint8_t *key, const uint8_t key_len,
1718 	const uint8_t aad_len, const uint8_t auth_len,
1719 	enum rte_crypto_auth_operation op,
1720 	enum rte_crypto_auth_algorithm algo)
1721 {
1722 	uint8_t hash_key[key_len];
1723 
1724 	struct crypto_unittest_params *ut_params = &unittest_params;
1725 
1726 	memcpy(hash_key, key, key_len);
1727 
1728 	TEST_HEXDUMP(stdout, "key:", key, key_len);
1729 
1730 	/* Setup Authentication Parameters */
1731 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1732 	ut_params->auth_xform.next = NULL;
1733 
1734 	ut_params->auth_xform.auth.op = op;
1735 	ut_params->auth_xform.auth.algo = algo;
1736 	ut_params->auth_xform.auth.key.length = key_len;
1737 	ut_params->auth_xform.auth.key.data = hash_key;
1738 	ut_params->auth_xform.auth.digest_length = auth_len;
1739 	ut_params->auth_xform.auth.add_auth_data_length = aad_len;
1740 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
1741 				&ut_params->auth_xform);
1742 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1743 	return 0;
1744 }
1745 
1746 static int
1747 create_wireless_algo_cipher_session(uint8_t dev_id,
1748 			enum rte_crypto_cipher_operation op,
1749 			enum rte_crypto_cipher_algorithm algo,
1750 			const uint8_t *key, const uint8_t key_len)
1751 {
1752 	uint8_t cipher_key[key_len];
1753 
1754 	struct crypto_unittest_params *ut_params = &unittest_params;
1755 
1756 	memcpy(cipher_key, key, key_len);
1757 
1758 	/* Setup Cipher Parameters */
1759 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1760 	ut_params->cipher_xform.next = NULL;
1761 
1762 	ut_params->cipher_xform.cipher.algo = algo;
1763 	ut_params->cipher_xform.cipher.op = op;
1764 	ut_params->cipher_xform.cipher.key.data = cipher_key;
1765 	ut_params->cipher_xform.cipher.key.length = key_len;
1766 
1767 	TEST_HEXDUMP(stdout, "key:", key, key_len);
1768 
1769 	/* Create Crypto session */
1770 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
1771 						&ut_params->
1772 						cipher_xform);
1773 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1774 	return 0;
1775 }
1776 
1777 static int
1778 create_wireless_algo_cipher_operation(const uint8_t *iv, const unsigned iv_len,
1779 			const unsigned cipher_len,
1780 			const unsigned cipher_offset,
1781 			enum rte_crypto_cipher_algorithm algo)
1782 {
1783 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1784 	struct crypto_unittest_params *ut_params = &unittest_params;
1785 	unsigned iv_pad_len = 0;
1786 
1787 	/* Generate Crypto op data structure */
1788 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1789 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1790 	TEST_ASSERT_NOT_NULL(ut_params->op,
1791 				"Failed to allocate pktmbuf offload");
1792 
1793 	/* Set crypto operation data parameters */
1794 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1795 
1796 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1797 
1798 	/* set crypto operation source mbuf */
1799 	sym_op->m_src = ut_params->ibuf;
1800 
1801 	/* iv */
1802 	if (algo == RTE_CRYPTO_CIPHER_KASUMI_F8)
1803 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 8);
1804 	else
1805 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 16);
1806 
1807 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(ut_params->ibuf
1808 			, iv_pad_len);
1809 
1810 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
1811 
1812 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
1813 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
1814 	sym_op->cipher.iv.length = iv_pad_len;
1815 
1816 	rte_memcpy(sym_op->cipher.iv.data, iv, iv_len);
1817 	sym_op->cipher.data.length = cipher_len;
1818 	sym_op->cipher.data.offset = cipher_offset;
1819 	return 0;
1820 }
1821 
1822 static int
1823 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, const uint8_t iv_len,
1824 			const unsigned cipher_len,
1825 			const unsigned cipher_offset,
1826 			enum rte_crypto_cipher_algorithm algo)
1827 {
1828 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1829 	struct crypto_unittest_params *ut_params = &unittest_params;
1830 	unsigned iv_pad_len = 0;
1831 
1832 	/* Generate Crypto op data structure */
1833 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1834 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1835 	TEST_ASSERT_NOT_NULL(ut_params->op,
1836 				"Failed to allocate pktmbuf offload");
1837 
1838 	/* Set crypto operation data parameters */
1839 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1840 
1841 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1842 
1843 	/* set crypto operation source mbuf */
1844 	sym_op->m_src = ut_params->ibuf;
1845 	sym_op->m_dst = ut_params->obuf;
1846 
1847 	/* iv */
1848 	if (algo == RTE_CRYPTO_CIPHER_KASUMI_F8)
1849 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 8);
1850 	else
1851 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 16);
1852 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(ut_params->ibuf,
1853 					iv_pad_len);
1854 
1855 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
1856 
1857 	/* For OOP operation both buffers must have the same size */
1858 	if (ut_params->obuf)
1859 		rte_pktmbuf_prepend(ut_params->obuf, iv_pad_len);
1860 
1861 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
1862 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
1863 	sym_op->cipher.iv.length = iv_pad_len;
1864 
1865 	rte_memcpy(sym_op->cipher.iv.data, iv, iv_len);
1866 	sym_op->cipher.data.length = cipher_len;
1867 	sym_op->cipher.data.offset = cipher_offset;
1868 	return 0;
1869 }
1870 
1871 static int
1872 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
1873 		enum rte_crypto_cipher_operation cipher_op,
1874 		enum rte_crypto_auth_operation auth_op,
1875 		enum rte_crypto_auth_algorithm auth_algo,
1876 		enum rte_crypto_cipher_algorithm cipher_algo,
1877 		const uint8_t *key, const uint8_t key_len,
1878 		const uint8_t aad_len, const uint8_t auth_len)
1879 
1880 {
1881 	uint8_t cipher_auth_key[key_len];
1882 
1883 	struct crypto_unittest_params *ut_params = &unittest_params;
1884 
1885 	memcpy(cipher_auth_key, key, key_len);
1886 
1887 	/* Setup Authentication Parameters */
1888 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1889 	ut_params->auth_xform.next = NULL;
1890 
1891 	ut_params->auth_xform.auth.op = auth_op;
1892 	ut_params->auth_xform.auth.algo = auth_algo;
1893 	ut_params->auth_xform.auth.key.length = key_len;
1894 	/* Hash key = cipher key */
1895 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
1896 	ut_params->auth_xform.auth.digest_length = auth_len;
1897 	ut_params->auth_xform.auth.add_auth_data_length = aad_len;
1898 
1899 	/* Setup Cipher Parameters */
1900 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1901 	ut_params->cipher_xform.next = &ut_params->auth_xform;
1902 
1903 	ut_params->cipher_xform.cipher.algo = cipher_algo;
1904 	ut_params->cipher_xform.cipher.op = cipher_op;
1905 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
1906 	ut_params->cipher_xform.cipher.key.length = key_len;
1907 
1908 	TEST_HEXDUMP(stdout, "key:", key, key_len);
1909 
1910 	/* Create Crypto session*/
1911 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
1912 				&ut_params->cipher_xform);
1913 
1914 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1915 	return 0;
1916 }
1917 
1918 static int
1919 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
1920 		enum rte_crypto_cipher_operation cipher_op,
1921 		enum rte_crypto_auth_operation auth_op,
1922 		enum rte_crypto_auth_algorithm auth_algo,
1923 		enum rte_crypto_cipher_algorithm cipher_algo,
1924 		const uint8_t *key, const uint8_t key_len,
1925 		const uint8_t aad_len, const uint8_t auth_len)
1926 {
1927 	uint8_t auth_cipher_key[key_len];
1928 
1929 	struct crypto_unittest_params *ut_params = &unittest_params;
1930 
1931 	memcpy(auth_cipher_key, key, key_len);
1932 
1933 	/* Setup Authentication Parameters */
1934 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1935 	ut_params->auth_xform.auth.op = auth_op;
1936 	ut_params->auth_xform.next = &ut_params->cipher_xform;
1937 	ut_params->auth_xform.auth.algo = auth_algo;
1938 	ut_params->auth_xform.auth.key.length = key_len;
1939 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
1940 	ut_params->auth_xform.auth.digest_length = auth_len;
1941 	ut_params->auth_xform.auth.add_auth_data_length = aad_len;
1942 
1943 	/* Setup Cipher Parameters */
1944 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1945 	ut_params->cipher_xform.next = NULL;
1946 	ut_params->cipher_xform.cipher.algo = cipher_algo;
1947 	ut_params->cipher_xform.cipher.op = cipher_op;
1948 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
1949 	ut_params->cipher_xform.cipher.key.length = key_len;
1950 
1951 	TEST_HEXDUMP(stdout, "key:", key, key_len);
1952 
1953 	/* Create Crypto session*/
1954 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
1955 				&ut_params->auth_xform);
1956 
1957 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1958 
1959 	return 0;
1960 }
1961 
1962 static int
1963 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
1964 		const unsigned auth_tag_len,
1965 		const uint8_t *aad, const unsigned aad_len,
1966 		unsigned data_pad_len,
1967 		enum rte_crypto_auth_operation op,
1968 		enum rte_crypto_auth_algorithm algo,
1969 		const unsigned auth_len, const unsigned auth_offset)
1970 {
1971 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1972 
1973 	struct crypto_unittest_params *ut_params = &unittest_params;
1974 
1975 	unsigned aad_buffer_len;
1976 
1977 	/* Generate Crypto op data structure */
1978 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1979 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1980 	TEST_ASSERT_NOT_NULL(ut_params->op,
1981 		"Failed to allocate pktmbuf offload");
1982 
1983 	/* Set crypto operation data parameters */
1984 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1985 
1986 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1987 
1988 	/* set crypto operation source mbuf */
1989 	sym_op->m_src = ut_params->ibuf;
1990 
1991 	/* aad */
1992 	/*
1993 	* Always allocate the aad up to the block size.
1994 	* The cryptodev API calls out -
1995 	*  - the array must be big enough to hold the AAD, plus any
1996 	*   space to round this up to the nearest multiple of the
1997 	*   block size (8 bytes for KASUMI and 16 bytes for SNOW 3G).
1998 	*/
1999 	if (algo == RTE_CRYPTO_AUTH_KASUMI_F9)
2000 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 8);
2001 	else
2002 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 16);
2003 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_prepend(
2004 			ut_params->ibuf, aad_buffer_len);
2005 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
2006 					"no room to prepend aad");
2007 	sym_op->auth.aad.phys_addr = rte_pktmbuf_mtophys(
2008 			ut_params->ibuf);
2009 	sym_op->auth.aad.length = aad_len;
2010 
2011 	memset(sym_op->auth.aad.data, 0, aad_buffer_len);
2012 	rte_memcpy(sym_op->auth.aad.data, aad, aad_len);
2013 
2014 	TEST_HEXDUMP(stdout, "aad:",
2015 			sym_op->auth.aad.data, aad_len);
2016 
2017 	/* digest */
2018 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2019 					ut_params->ibuf, auth_tag_len);
2020 
2021 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2022 				"no room to append auth tag");
2023 	ut_params->digest = sym_op->auth.digest.data;
2024 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2025 			ut_params->ibuf, data_pad_len + aad_len);
2026 	sym_op->auth.digest.length = auth_tag_len;
2027 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2028 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2029 	else
2030 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2031 
2032 	TEST_HEXDUMP(stdout, "digest:",
2033 		sym_op->auth.digest.data,
2034 		sym_op->auth.digest.length);
2035 
2036 	sym_op->auth.data.length = auth_len;
2037 	sym_op->auth.data.offset = auth_offset;
2038 
2039 	return 0;
2040 }
2041 
2042 static int
2043 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2044 		const unsigned auth_tag_len,
2045 		const uint8_t *aad, const uint8_t aad_len,
2046 		unsigned data_pad_len,
2047 		enum rte_crypto_auth_operation op,
2048 		enum rte_crypto_auth_algorithm auth_algo,
2049 		enum rte_crypto_cipher_algorithm cipher_algo,
2050 		const uint8_t *iv, const uint8_t iv_len,
2051 		const unsigned cipher_len, const unsigned cipher_offset,
2052 		const unsigned auth_len, const unsigned auth_offset)
2053 {
2054 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2055 	struct crypto_unittest_params *ut_params = &unittest_params;
2056 
2057 	unsigned iv_pad_len = 0;
2058 	unsigned aad_buffer_len;
2059 
2060 	/* Generate Crypto op data structure */
2061 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2062 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2063 	TEST_ASSERT_NOT_NULL(ut_params->op,
2064 			"Failed to allocate pktmbuf offload");
2065 	/* Set crypto operation data parameters */
2066 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2067 
2068 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2069 
2070 	/* set crypto operation source mbuf */
2071 	sym_op->m_src = ut_params->ibuf;
2072 
2073 	/* digest */
2074 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2075 			ut_params->ibuf, auth_tag_len);
2076 
2077 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2078 			"no room to append auth tag");
2079 	ut_params->digest = sym_op->auth.digest.data;
2080 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2081 			ut_params->ibuf, data_pad_len);
2082 	sym_op->auth.digest.length = auth_tag_len;
2083 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2084 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2085 	else
2086 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2087 
2088 	TEST_HEXDUMP(stdout, "digest:",
2089 		sym_op->auth.digest.data,
2090 		sym_op->auth.digest.length);
2091 
2092 	/* aad */
2093 	/*
2094 	* Always allocate the aad up to the block size.
2095 	* The cryptodev API calls out -
2096 	*  - the array must be big enough to hold the AAD, plus any
2097 	*   space to round this up to the nearest multiple of the
2098 	*   block size (8 bytes for KASUMI and 16 bytes for SNOW 3G).
2099 	*/
2100 	if (auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9)
2101 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 8);
2102 	else
2103 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 16);
2104 	sym_op->auth.aad.data =
2105 		(uint8_t *)rte_pktmbuf_prepend(
2106 			ut_params->ibuf, aad_buffer_len);
2107 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
2108 			"no room to prepend aad");
2109 	sym_op->auth.aad.phys_addr = rte_pktmbuf_mtophys(
2110 			ut_params->ibuf);
2111 	sym_op->auth.aad.length = aad_len;
2112 	memset(sym_op->auth.aad.data, 0, aad_buffer_len);
2113 	rte_memcpy(sym_op->auth.aad.data, aad, aad_len);
2114 	TEST_HEXDUMP(stdout, "aad:", sym_op->auth.aad.data, aad_len);
2115 
2116 	/* iv */
2117 	if (cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8)
2118 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 8);
2119 	else
2120 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 16);
2121 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
2122 		ut_params->ibuf, iv_pad_len);
2123 
2124 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
2125 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
2126 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
2127 	sym_op->cipher.iv.length = iv_pad_len;
2128 	rte_memcpy(sym_op->cipher.iv.data, iv, iv_len);
2129 	sym_op->cipher.data.length = cipher_len;
2130 	sym_op->cipher.data.offset = cipher_offset + auth_offset;
2131 	sym_op->auth.data.length = auth_len;
2132 	sym_op->auth.data.offset = auth_offset + cipher_offset;
2133 
2134 	return 0;
2135 }
2136 
2137 static int
2138 create_wireless_algo_auth_cipher_operation(const unsigned auth_tag_len,
2139 		const uint8_t *iv, const uint8_t iv_len,
2140 		const uint8_t *aad, const uint8_t aad_len,
2141 		unsigned data_pad_len,
2142 		const unsigned cipher_len, const unsigned cipher_offset,
2143 		const unsigned auth_len, const unsigned auth_offset,
2144 		enum rte_crypto_auth_algorithm auth_algo,
2145 		enum rte_crypto_cipher_algorithm cipher_algo)
2146 {
2147 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2148 	struct crypto_unittest_params *ut_params = &unittest_params;
2149 
2150 	unsigned iv_pad_len = 0;
2151 	unsigned aad_buffer_len = 0;
2152 
2153 	/* Generate Crypto op data structure */
2154 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2155 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2156 	TEST_ASSERT_NOT_NULL(ut_params->op,
2157 			"Failed to allocate pktmbuf offload");
2158 
2159 	/* Set crypto operation data parameters */
2160 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2161 
2162 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2163 
2164 	/* set crypto operation source mbuf */
2165 	sym_op->m_src = ut_params->ibuf;
2166 
2167 	/* digest */
2168 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2169 			ut_params->ibuf, auth_tag_len);
2170 
2171 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2172 			"no room to append auth tag");
2173 
2174 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
2175 			ut_params->ibuf, data_pad_len);
2176 	sym_op->auth.digest.length = auth_tag_len;
2177 
2178 	memset(sym_op->auth.digest.data, 0, auth_tag_len);
2179 
2180 	TEST_HEXDUMP(stdout, "digest:",
2181 			sym_op->auth.digest.data,
2182 			sym_op->auth.digest.length);
2183 
2184 	/* aad */
2185 	/*
2186 	* Always allocate the aad up to the block size.
2187 	* The cryptodev API calls out -
2188 	*  - the array must be big enough to hold the AAD, plus any
2189 	*   space to round this up to the nearest multiple of the
2190 	*   block size (8 bytes for KASUMI 16 bytes).
2191 	*/
2192 	if (auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9)
2193 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 8);
2194 	else
2195 		aad_buffer_len = ALIGN_POW2_ROUNDUP(aad_len, 16);
2196 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_prepend(
2197 	ut_params->ibuf, aad_buffer_len);
2198 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
2199 				"no room to prepend aad");
2200 	sym_op->auth.aad.phys_addr = rte_pktmbuf_mtophys(
2201 				ut_params->ibuf);
2202 	sym_op->auth.aad.length = aad_len;
2203 	memset(sym_op->auth.aad.data, 0, aad_buffer_len);
2204 	rte_memcpy(sym_op->auth.aad.data, aad, aad_len);
2205 	TEST_HEXDUMP(stdout, "aad:",
2206 			sym_op->auth.aad.data, aad_len);
2207 
2208 	/* iv */
2209 	if (cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8)
2210 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 8);
2211 	else
2212 		iv_pad_len = RTE_ALIGN_CEIL(iv_len, 16);
2213 
2214 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
2215 		ut_params->ibuf, iv_pad_len);
2216 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
2217 
2218 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
2219 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
2220 	sym_op->cipher.iv.length = iv_pad_len;
2221 
2222 	rte_memcpy(sym_op->cipher.iv.data, iv, iv_len);
2223 
2224 	sym_op->cipher.data.length = cipher_len;
2225 	sym_op->cipher.data.offset = auth_offset + cipher_offset;
2226 
2227 	sym_op->auth.data.length = auth_len;
2228 	sym_op->auth.data.offset = auth_offset + cipher_offset;
2229 
2230 	return 0;
2231 }
2232 
2233 static int
2234 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2235 {
2236 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2237 	struct crypto_unittest_params *ut_params = &unittest_params;
2238 
2239 	int retval;
2240 	unsigned plaintext_pad_len;
2241 	unsigned plaintext_len;
2242 	uint8_t *plaintext;
2243 
2244 	/* Create SNOW 3G session */
2245 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2246 			tdata->key.data, tdata->key.len,
2247 			tdata->aad.len, tdata->digest.len,
2248 			RTE_CRYPTO_AUTH_OP_GENERATE,
2249 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2250 	if (retval < 0)
2251 		return retval;
2252 
2253 	/* alloc mbuf and set payload */
2254 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2255 
2256 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2257 	rte_pktmbuf_tailroom(ut_params->ibuf));
2258 
2259 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2260 	/* Append data which is padded to a multiple of */
2261 	/* the algorithms block size */
2262 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2263 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2264 				plaintext_pad_len);
2265 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2266 
2267 	/* Create SNOW 3G operation */
2268 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2269 			tdata->aad.data, tdata->aad.len,
2270 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2271 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
2272 			tdata->validAuthLenInBits.len,
2273 			tdata->validAuthOffsetLenInBits.len);
2274 	if (retval < 0)
2275 		return retval;
2276 
2277 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2278 				ut_params->op);
2279 	ut_params->obuf = ut_params->op->sym->m_src;
2280 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2281 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2282 			+ plaintext_pad_len + tdata->aad.len;
2283 
2284 	/* Validate obuf */
2285 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2286 	ut_params->digest,
2287 	tdata->digest.data,
2288 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2289 	"SNOW 3G Generated auth tag not as expected");
2290 
2291 	return 0;
2292 }
2293 
2294 static int
2295 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2296 {
2297 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2298 	struct crypto_unittest_params *ut_params = &unittest_params;
2299 
2300 	int retval;
2301 	unsigned plaintext_pad_len;
2302 	unsigned plaintext_len;
2303 	uint8_t *plaintext;
2304 
2305 	/* Create SNOW 3G session */
2306 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2307 				tdata->key.data, tdata->key.len,
2308 				tdata->aad.len, tdata->digest.len,
2309 				RTE_CRYPTO_AUTH_OP_VERIFY,
2310 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2311 	if (retval < 0)
2312 		return retval;
2313 	/* alloc mbuf and set payload */
2314 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2315 
2316 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2317 	rte_pktmbuf_tailroom(ut_params->ibuf));
2318 
2319 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2320 	/* Append data which is padded to a multiple of */
2321 	/* the algorithms block size */
2322 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2323 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2324 				plaintext_pad_len);
2325 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2326 
2327 	/* Create SNOW 3G operation */
2328 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2329 			tdata->digest.len,
2330 			tdata->aad.data, tdata->aad.len,
2331 			plaintext_pad_len,
2332 			RTE_CRYPTO_AUTH_OP_VERIFY,
2333 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
2334 			tdata->validAuthLenInBits.len,
2335 			tdata->validAuthOffsetLenInBits.len);
2336 	if (retval < 0)
2337 		return retval;
2338 
2339 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2340 				ut_params->op);
2341 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2342 	ut_params->obuf = ut_params->op->sym->m_src;
2343 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2344 				+ plaintext_pad_len + tdata->aad.len;
2345 
2346 	/* Validate obuf */
2347 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2348 		return 0;
2349 	else
2350 		return -1;
2351 
2352 	return 0;
2353 }
2354 
2355 static int
2356 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2357 {
2358 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2359 	struct crypto_unittest_params *ut_params = &unittest_params;
2360 
2361 	int retval;
2362 	unsigned plaintext_pad_len;
2363 	unsigned plaintext_len;
2364 	uint8_t *plaintext;
2365 
2366 	/* Create KASUMI session */
2367 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2368 			tdata->key.data, tdata->key.len,
2369 			tdata->aad.len, tdata->digest.len,
2370 			RTE_CRYPTO_AUTH_OP_GENERATE,
2371 			RTE_CRYPTO_AUTH_KASUMI_F9);
2372 	if (retval < 0)
2373 		return retval;
2374 
2375 	/* alloc mbuf and set payload */
2376 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2377 
2378 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2379 	rte_pktmbuf_tailroom(ut_params->ibuf));
2380 
2381 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2382 	/* Append data which is padded to a multiple of */
2383 	/* the algorithms block size */
2384 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2385 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2386 				plaintext_pad_len);
2387 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2388 
2389 	/* Create KASUMI operation */
2390 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2391 			tdata->aad.data, tdata->aad.len,
2392 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2393 			RTE_CRYPTO_AUTH_KASUMI_F9,
2394 			tdata->validAuthLenInBits.len,
2395 			tdata->validAuthOffsetLenInBits.len);
2396 	if (retval < 0)
2397 		return retval;
2398 
2399 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2400 				ut_params->op);
2401 	ut_params->obuf = ut_params->op->sym->m_src;
2402 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2403 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2404 			+ plaintext_pad_len + ALIGN_POW2_ROUNDUP(tdata->aad.len, 8);
2405 
2406 	/* Validate obuf */
2407 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2408 	ut_params->digest,
2409 	tdata->digest.data,
2410 	DIGEST_BYTE_LENGTH_KASUMI_F9,
2411 	"KASUMI Generated auth tag not as expected");
2412 
2413 	return 0;
2414 }
2415 
2416 static int
2417 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2418 {
2419 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2420 	struct crypto_unittest_params *ut_params = &unittest_params;
2421 
2422 	int retval;
2423 	unsigned plaintext_pad_len;
2424 	unsigned plaintext_len;
2425 	uint8_t *plaintext;
2426 
2427 	/* Create KASUMI session */
2428 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2429 				tdata->key.data, tdata->key.len,
2430 				tdata->aad.len, tdata->digest.len,
2431 				RTE_CRYPTO_AUTH_OP_VERIFY,
2432 				RTE_CRYPTO_AUTH_KASUMI_F9);
2433 	if (retval < 0)
2434 		return retval;
2435 	/* alloc mbuf and set payload */
2436 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2437 
2438 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2439 	rte_pktmbuf_tailroom(ut_params->ibuf));
2440 
2441 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2442 	/* Append data which is padded to a multiple */
2443 	/* of the algorithms block size */
2444 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2445 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2446 				plaintext_pad_len);
2447 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2448 
2449 	/* Create KASUMI operation */
2450 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2451 			tdata->digest.len,
2452 			tdata->aad.data, tdata->aad.len,
2453 			plaintext_pad_len,
2454 			RTE_CRYPTO_AUTH_OP_VERIFY,
2455 			RTE_CRYPTO_AUTH_KASUMI_F9,
2456 			tdata->validAuthLenInBits.len,
2457 			tdata->validAuthOffsetLenInBits.len);
2458 	if (retval < 0)
2459 		return retval;
2460 
2461 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2462 				ut_params->op);
2463 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2464 	ut_params->obuf = ut_params->op->sym->m_src;
2465 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2466 				+ plaintext_pad_len + tdata->aad.len;
2467 
2468 	/* Validate obuf */
2469 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2470 		return 0;
2471 	else
2472 		return -1;
2473 
2474 	return 0;
2475 }
2476 
2477 static int
2478 test_snow3g_hash_generate_test_case_1(void)
2479 {
2480 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
2481 }
2482 
2483 static int
2484 test_snow3g_hash_generate_test_case_2(void)
2485 {
2486 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
2487 }
2488 
2489 static int
2490 test_snow3g_hash_generate_test_case_3(void)
2491 {
2492 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
2493 }
2494 
2495 static int
2496 test_snow3g_hash_generate_test_case_4(void)
2497 {
2498 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
2499 }
2500 
2501 static int
2502 test_snow3g_hash_generate_test_case_5(void)
2503 {
2504 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
2505 }
2506 
2507 static int
2508 test_snow3g_hash_generate_test_case_6(void)
2509 {
2510 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
2511 }
2512 
2513 static int
2514 test_snow3g_hash_verify_test_case_1(void)
2515 {
2516 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
2517 
2518 }
2519 
2520 static int
2521 test_snow3g_hash_verify_test_case_2(void)
2522 {
2523 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
2524 }
2525 
2526 static int
2527 test_snow3g_hash_verify_test_case_3(void)
2528 {
2529 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
2530 }
2531 
2532 static int
2533 test_snow3g_hash_verify_test_case_4(void)
2534 {
2535 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
2536 }
2537 
2538 static int
2539 test_snow3g_hash_verify_test_case_5(void)
2540 {
2541 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
2542 }
2543 
2544 static int
2545 test_snow3g_hash_verify_test_case_6(void)
2546 {
2547 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
2548 }
2549 
2550 static int
2551 test_kasumi_hash_generate_test_case_1(void)
2552 {
2553 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
2554 }
2555 
2556 static int
2557 test_kasumi_hash_generate_test_case_2(void)
2558 {
2559 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
2560 }
2561 
2562 static int
2563 test_kasumi_hash_generate_test_case_3(void)
2564 {
2565 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
2566 }
2567 
2568 static int
2569 test_kasumi_hash_generate_test_case_4(void)
2570 {
2571 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
2572 }
2573 
2574 static int
2575 test_kasumi_hash_generate_test_case_5(void)
2576 {
2577 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
2578 }
2579 
2580 static int
2581 test_kasumi_hash_generate_test_case_6(void)
2582 {
2583 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
2584 }
2585 
2586 static int
2587 test_kasumi_hash_verify_test_case_1(void)
2588 {
2589 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
2590 }
2591 
2592 static int
2593 test_kasumi_hash_verify_test_case_2(void)
2594 {
2595 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
2596 }
2597 
2598 static int
2599 test_kasumi_hash_verify_test_case_3(void)
2600 {
2601 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
2602 }
2603 
2604 static int
2605 test_kasumi_hash_verify_test_case_4(void)
2606 {
2607 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
2608 }
2609 
2610 static int
2611 test_kasumi_hash_verify_test_case_5(void)
2612 {
2613 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
2614 }
2615 
2616 static int
2617 test_kasumi_encryption(const struct kasumi_test_data *tdata)
2618 {
2619 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2620 	struct crypto_unittest_params *ut_params = &unittest_params;
2621 
2622 	int retval;
2623 	uint8_t *plaintext, *ciphertext;
2624 	unsigned plaintext_pad_len;
2625 	unsigned plaintext_len;
2626 
2627 	/* Create KASUMI session */
2628 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2629 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2630 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2631 					tdata->key.data, tdata->key.len);
2632 	if (retval < 0)
2633 		return retval;
2634 
2635 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2636 
2637 	/* Clear mbuf payload */
2638 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2639 	       rte_pktmbuf_tailroom(ut_params->ibuf));
2640 
2641 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2642 	/* Append data which is padded to a multiple */
2643 	/* of the algorithms block size */
2644 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2645 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2646 				plaintext_pad_len);
2647 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2648 
2649 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
2650 
2651 	/* Create KASUMI operation */
2652 	retval = create_wireless_algo_cipher_operation(tdata->iv.data, tdata->iv.len,
2653 					tdata->plaintext.len,
2654 					tdata->validCipherOffsetLenInBits.len,
2655 					RTE_CRYPTO_CIPHER_KASUMI_F8);
2656 	if (retval < 0)
2657 		return retval;
2658 
2659 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2660 						ut_params->op);
2661 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2662 
2663 	ut_params->obuf = ut_params->op->sym->m_dst;
2664 	if (ut_params->obuf)
2665 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2666 				+ tdata->iv.len;
2667 	else
2668 		ciphertext = plaintext;
2669 
2670 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
2671 
2672 	/* Validate obuf */
2673 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2674 		ciphertext,
2675 		tdata->ciphertext.data,
2676 		tdata->validCipherLenInBits.len,
2677 		"KASUMI Ciphertext data not as expected");
2678 	return 0;
2679 }
2680 
2681 static int
2682 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
2683 {
2684 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2685 	struct crypto_unittest_params *ut_params = &unittest_params;
2686 
2687 	int retval;
2688 
2689 	unsigned int plaintext_pad_len;
2690 	unsigned int plaintext_len;
2691 
2692 	uint8_t buffer[10000];
2693 	const uint8_t *ciphertext;
2694 
2695 	struct rte_cryptodev_info dev_info;
2696 
2697 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2698 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
2699 		printf("Device doesn't support scatter-gather. "
2700 				"Test Skipped.\n");
2701 		return 0;
2702 	}
2703 
2704 	/* Create KASUMI session */
2705 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2706 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2707 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2708 					tdata->key.data, tdata->key.len);
2709 	if (retval < 0)
2710 		return retval;
2711 
2712 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2713 
2714 
2715 	/* Append data which is padded to a multiple */
2716 	/* of the algorithms block size */
2717 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2718 
2719 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
2720 			plaintext_pad_len, 10, 0);
2721 
2722 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
2723 
2724 	/* Create KASUMI operation */
2725 	retval = create_wireless_algo_cipher_operation(tdata->iv.data,
2726 					tdata->iv.len,
2727 					tdata->plaintext.len,
2728 					tdata->validCipherOffsetLenInBits.len,
2729 					RTE_CRYPTO_CIPHER_KASUMI_F8);
2730 	if (retval < 0)
2731 		return retval;
2732 
2733 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2734 						ut_params->op);
2735 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2736 
2737 	ut_params->obuf = ut_params->op->sym->m_dst;
2738 
2739 	if (ut_params->obuf)
2740 		ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
2741 				plaintext_len, buffer);
2742 	else
2743 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
2744 				plaintext_len, buffer);
2745 
2746 	/* Validate obuf */
2747 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
2748 
2749 		/* Validate obuf */
2750 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2751 			ciphertext,
2752 			tdata->ciphertext.data,
2753 			tdata->validCipherLenInBits.len,
2754 			"KASUMI Ciphertext data not as expected");
2755 		return 0;
2756 }
2757 
2758 static int
2759 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
2760 {
2761 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2762 	struct crypto_unittest_params *ut_params = &unittest_params;
2763 
2764 	int retval;
2765 	uint8_t *plaintext, *ciphertext;
2766 	unsigned plaintext_pad_len;
2767 	unsigned plaintext_len;
2768 
2769 	/* Create KASUMI session */
2770 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2771 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2772 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2773 					tdata->key.data, tdata->key.len);
2774 	if (retval < 0)
2775 		return retval;
2776 
2777 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2778 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2779 
2780 	/* Clear mbuf payload */
2781 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2782 	       rte_pktmbuf_tailroom(ut_params->ibuf));
2783 
2784 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2785 	/* Append data which is padded to a multiple */
2786 	/* of the algorithms block size */
2787 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2788 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2789 				plaintext_pad_len);
2790 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
2791 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2792 
2793 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
2794 
2795 	/* Create KASUMI operation */
2796 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
2797 					tdata->iv.len,
2798 					tdata->plaintext.len,
2799 					tdata->validCipherOffsetLenInBits.len,
2800 					RTE_CRYPTO_CIPHER_KASUMI_F8);
2801 	if (retval < 0)
2802 		return retval;
2803 
2804 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2805 						ut_params->op);
2806 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2807 
2808 	ut_params->obuf = ut_params->op->sym->m_dst;
2809 	if (ut_params->obuf)
2810 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2811 				+ tdata->iv.len;
2812 	else
2813 		ciphertext = plaintext;
2814 
2815 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
2816 
2817 	/* Validate obuf */
2818 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2819 		ciphertext,
2820 		tdata->ciphertext.data,
2821 		tdata->validCipherLenInBits.len,
2822 		"KASUMI Ciphertext data not as expected");
2823 	return 0;
2824 }
2825 
2826 static int
2827 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
2828 {
2829 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2830 	struct crypto_unittest_params *ut_params = &unittest_params;
2831 
2832 	int retval;
2833 	unsigned int plaintext_pad_len;
2834 	unsigned int plaintext_len;
2835 
2836 	const uint8_t *ciphertext;
2837 	uint8_t buffer[2048];
2838 
2839 	struct rte_cryptodev_info dev_info;
2840 
2841 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2842 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
2843 		printf("Device doesn't support scatter-gather. "
2844 				"Test Skipped.\n");
2845 		return 0;
2846 	}
2847 
2848 	/* Create KASUMI session */
2849 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2850 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2851 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2852 					tdata->key.data, tdata->key.len);
2853 	if (retval < 0)
2854 		return retval;
2855 
2856 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2857 	/* Append data which is padded to a multiple */
2858 	/* of the algorithms block size */
2859 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2860 
2861 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
2862 			plaintext_pad_len, 10, 0);
2863 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
2864 			plaintext_pad_len, 3, 0);
2865 
2866 	/* Append data which is padded to a multiple */
2867 	/* of the algorithms block size */
2868 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
2869 
2870 	/* Create KASUMI operation */
2871 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
2872 					tdata->iv.len,
2873 					tdata->plaintext.len,
2874 					tdata->validCipherOffsetLenInBits.len,
2875 					RTE_CRYPTO_CIPHER_KASUMI_F8);
2876 	if (retval < 0)
2877 		return retval;
2878 
2879 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2880 						ut_params->op);
2881 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2882 
2883 	ut_params->obuf = ut_params->op->sym->m_dst;
2884 	if (ut_params->obuf)
2885 		ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
2886 				plaintext_pad_len, buffer);
2887 	else
2888 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
2889 				plaintext_pad_len, buffer);
2890 
2891 	/* Validate obuf */
2892 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2893 		ciphertext,
2894 		tdata->ciphertext.data,
2895 		tdata->validCipherLenInBits.len,
2896 		"KASUMI Ciphertext data not as expected");
2897 	return 0;
2898 }
2899 
2900 
2901 static int
2902 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
2903 {
2904 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2905 	struct crypto_unittest_params *ut_params = &unittest_params;
2906 
2907 	int retval;
2908 	uint8_t *ciphertext, *plaintext;
2909 	unsigned ciphertext_pad_len;
2910 	unsigned ciphertext_len;
2911 
2912 	/* Create KASUMI session */
2913 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2914 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
2915 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2916 					tdata->key.data, tdata->key.len);
2917 	if (retval < 0)
2918 		return retval;
2919 
2920 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2921 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2922 
2923 	/* Clear mbuf payload */
2924 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2925 	       rte_pktmbuf_tailroom(ut_params->ibuf));
2926 
2927 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
2928 	/* Append data which is padded to a multiple */
2929 	/* of the algorithms block size */
2930 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
2931 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2932 				ciphertext_pad_len);
2933 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
2934 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
2935 
2936 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
2937 
2938 	/* Create KASUMI operation */
2939 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
2940 					tdata->iv.len,
2941 					tdata->ciphertext.len,
2942 					tdata->validCipherOffsetLenInBits.len,
2943 					RTE_CRYPTO_CIPHER_KASUMI_F8);
2944 	if (retval < 0)
2945 		return retval;
2946 
2947 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2948 						ut_params->op);
2949 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2950 
2951 	ut_params->obuf = ut_params->op->sym->m_dst;
2952 	if (ut_params->obuf)
2953 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2954 				+ tdata->iv.len;
2955 	else
2956 		plaintext = ciphertext;
2957 
2958 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
2959 
2960 	/* Validate obuf */
2961 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
2962 		plaintext,
2963 		tdata->plaintext.data,
2964 		tdata->validCipherLenInBits.len,
2965 		"KASUMI Plaintext data not as expected");
2966 	return 0;
2967 }
2968 
2969 static int
2970 test_kasumi_decryption(const struct kasumi_test_data *tdata)
2971 {
2972 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2973 	struct crypto_unittest_params *ut_params = &unittest_params;
2974 
2975 	int retval;
2976 	uint8_t *ciphertext, *plaintext;
2977 	unsigned ciphertext_pad_len;
2978 	unsigned ciphertext_len;
2979 
2980 	/* Create KASUMI session */
2981 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
2982 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
2983 					RTE_CRYPTO_CIPHER_KASUMI_F8,
2984 					tdata->key.data, tdata->key.len);
2985 	if (retval < 0)
2986 		return retval;
2987 
2988 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2989 
2990 	/* Clear mbuf payload */
2991 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2992 	       rte_pktmbuf_tailroom(ut_params->ibuf));
2993 
2994 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
2995 	/* Append data which is padded to a multiple */
2996 	/* of the algorithms block size */
2997 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
2998 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2999 				ciphertext_pad_len);
3000 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3001 
3002 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3003 
3004 	/* Create KASUMI operation */
3005 	retval = create_wireless_algo_cipher_operation(tdata->iv.data,
3006 					tdata->iv.len,
3007 					tdata->ciphertext.len,
3008 					tdata->validCipherOffsetLenInBits.len,
3009 					RTE_CRYPTO_CIPHER_KASUMI_F8);
3010 	if (retval < 0)
3011 		return retval;
3012 
3013 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3014 						ut_params->op);
3015 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3016 
3017 	ut_params->obuf = ut_params->op->sym->m_dst;
3018 	if (ut_params->obuf)
3019 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3020 				+ tdata->iv.len;
3021 	else
3022 		plaintext = ciphertext;
3023 
3024 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3025 
3026 	/* Validate obuf */
3027 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3028 		plaintext,
3029 		tdata->plaintext.data,
3030 		tdata->validCipherLenInBits.len,
3031 		"KASUMI Plaintext data not as expected");
3032 	return 0;
3033 }
3034 
3035 static int
3036 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3037 {
3038 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3039 	struct crypto_unittest_params *ut_params = &unittest_params;
3040 
3041 	int retval;
3042 	uint8_t *plaintext, *ciphertext;
3043 	unsigned plaintext_pad_len;
3044 	unsigned plaintext_len;
3045 
3046 	/* Create SNOW 3G session */
3047 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3048 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3049 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3050 					tdata->key.data, tdata->key.len);
3051 	if (retval < 0)
3052 		return retval;
3053 
3054 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3055 
3056 	/* Clear mbuf payload */
3057 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3058 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3059 
3060 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3061 	/* Append data which is padded to a multiple of */
3062 	/* the algorithms block size */
3063 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3064 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3065 				plaintext_pad_len);
3066 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3067 
3068 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3069 
3070 	/* Create SNOW 3G operation */
3071 	retval = create_wireless_algo_cipher_operation(tdata->iv.data, tdata->iv.len,
3072 					tdata->validCipherLenInBits.len,
3073 					tdata->validCipherOffsetLenInBits.len,
3074 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3075 	if (retval < 0)
3076 		return retval;
3077 
3078 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3079 						ut_params->op);
3080 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3081 
3082 	ut_params->obuf = ut_params->op->sym->m_dst;
3083 	if (ut_params->obuf)
3084 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3085 				+ tdata->iv.len;
3086 	else
3087 		ciphertext = plaintext;
3088 
3089 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3090 
3091 	/* Validate obuf */
3092 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3093 		ciphertext,
3094 		tdata->ciphertext.data,
3095 		tdata->validDataLenInBits.len,
3096 		"SNOW 3G Ciphertext data not as expected");
3097 	return 0;
3098 }
3099 
3100 
3101 static int
3102 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3103 {
3104 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3105 	struct crypto_unittest_params *ut_params = &unittest_params;
3106 	uint8_t *plaintext, *ciphertext;
3107 
3108 	int retval;
3109 	unsigned plaintext_pad_len;
3110 	unsigned plaintext_len;
3111 
3112 	/* Create SNOW 3G session */
3113 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3114 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3115 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3116 					tdata->key.data, tdata->key.len);
3117 	if (retval < 0)
3118 		return retval;
3119 
3120 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3121 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3122 
3123 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3124 			"Failed to allocate input buffer in mempool");
3125 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3126 			"Failed to allocate output buffer in mempool");
3127 
3128 	/* Clear mbuf payload */
3129 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3130 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3131 
3132 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3133 	/* Append data which is padded to a multiple of */
3134 	/* the algorithms block size */
3135 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3136 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3137 				plaintext_pad_len);
3138 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3139 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3140 
3141 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3142 
3143 	/* Create SNOW 3G operation */
3144 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
3145 					tdata->iv.len,
3146 					tdata->validCipherLenInBits.len,
3147 					tdata->validCipherOffsetLenInBits.len,
3148 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3149 	if (retval < 0)
3150 		return retval;
3151 
3152 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3153 						ut_params->op);
3154 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3155 
3156 	ut_params->obuf = ut_params->op->sym->m_dst;
3157 	if (ut_params->obuf)
3158 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3159 				+ tdata->iv.len;
3160 	else
3161 		ciphertext = plaintext;
3162 
3163 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3164 
3165 	/* Validate obuf */
3166 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3167 		ciphertext,
3168 		tdata->ciphertext.data,
3169 		tdata->validDataLenInBits.len,
3170 		"SNOW 3G Ciphertext data not as expected");
3171 	return 0;
3172 }
3173 
3174 static int
3175 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3176 {
3177 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3178 	struct crypto_unittest_params *ut_params = &unittest_params;
3179 
3180 	int retval;
3181 	unsigned int plaintext_pad_len;
3182 	unsigned int plaintext_len;
3183 	uint8_t buffer[10000];
3184 	const uint8_t *ciphertext;
3185 
3186 	struct rte_cryptodev_info dev_info;
3187 
3188 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3189 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
3190 		printf("Device doesn't support scatter-gather. "
3191 				"Test Skipped.\n");
3192 		return 0;
3193 	}
3194 
3195 	/* Create SNOW 3G session */
3196 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3197 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3198 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3199 					tdata->key.data, tdata->key.len);
3200 	if (retval < 0)
3201 		return retval;
3202 
3203 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3204 	/* Append data which is padded to a multiple of */
3205 	/* the algorithms block size */
3206 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3207 
3208 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3209 			plaintext_pad_len, 10, 0);
3210 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3211 			plaintext_pad_len, 3, 0);
3212 
3213 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3214 			"Failed to allocate input buffer in mempool");
3215 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3216 			"Failed to allocate output buffer in mempool");
3217 
3218 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3219 
3220 	/* Create SNOW 3G operation */
3221 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
3222 					tdata->iv.len,
3223 					tdata->validCipherLenInBits.len,
3224 					tdata->validCipherOffsetLenInBits.len,
3225 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3226 	if (retval < 0)
3227 		return retval;
3228 
3229 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3230 						ut_params->op);
3231 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3232 
3233 	ut_params->obuf = ut_params->op->sym->m_dst;
3234 	if (ut_params->obuf)
3235 		ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
3236 				plaintext_len, buffer);
3237 	else
3238 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
3239 				plaintext_len, buffer);
3240 
3241 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3242 
3243 	/* Validate obuf */
3244 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3245 		ciphertext,
3246 		tdata->ciphertext.data,
3247 		tdata->validDataLenInBits.len,
3248 		"SNOW 3G Ciphertext data not as expected");
3249 
3250 	return 0;
3251 }
3252 
3253 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3254 static void
3255 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3256 {
3257 	uint8_t curr_byte, prev_byte;
3258 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
3259 	uint8_t lower_byte_mask = (1 << offset) - 1;
3260 	unsigned i;
3261 
3262 	prev_byte = buffer[0];
3263 	buffer[0] >>= offset;
3264 
3265 	for (i = 1; i < length_in_bytes; i++) {
3266 		curr_byte = buffer[i];
3267 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3268 				(curr_byte >> offset);
3269 		prev_byte = curr_byte;
3270 	}
3271 }
3272 
3273 static int
3274 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3275 {
3276 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3277 	struct crypto_unittest_params *ut_params = &unittest_params;
3278 	uint8_t *plaintext, *ciphertext;
3279 	int retval;
3280 	uint32_t plaintext_len;
3281 	uint32_t plaintext_pad_len;
3282 	uint8_t extra_offset = 4;
3283 	uint8_t *expected_ciphertext_shifted;
3284 
3285 	/* Create SNOW 3G session */
3286 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3287 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3288 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3289 					tdata->key.data, tdata->key.len);
3290 	if (retval < 0)
3291 		return retval;
3292 
3293 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3294 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3295 
3296 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3297 			"Failed to allocate input buffer in mempool");
3298 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3299 			"Failed to allocate output buffer in mempool");
3300 
3301 	/* Clear mbuf payload */
3302 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3303 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3304 
3305 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
3306 	/*
3307 	 * Append data which is padded to a
3308 	 * multiple of the algorithms block size
3309 	 */
3310 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3311 
3312 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
3313 						plaintext_pad_len);
3314 
3315 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3316 
3317 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
3318 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
3319 
3320 #ifdef RTE_APP_TEST_DEBUG
3321 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
3322 #endif
3323 	/* Create SNOW 3G operation */
3324 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
3325 					tdata->iv.len,
3326 					tdata->validCipherLenInBits.len,
3327 					tdata->validCipherOffsetLenInBits.len +
3328 					extra_offset,
3329 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3330 	if (retval < 0)
3331 		return retval;
3332 
3333 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3334 						ut_params->op);
3335 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3336 
3337 	ut_params->obuf = ut_params->op->sym->m_dst;
3338 	if (ut_params->obuf)
3339 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3340 				+ tdata->iv.len;
3341 	else
3342 		ciphertext = plaintext;
3343 
3344 #ifdef RTE_APP_TEST_DEBUG
3345 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3346 #endif
3347 
3348 	expected_ciphertext_shifted = rte_malloc(NULL,
3349 			ceil_byte_length(plaintext_len + extra_offset), 0);
3350 
3351 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
3352 			"failed to reserve memory for ciphertext shifted\n");
3353 
3354 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
3355 			ceil_byte_length(tdata->ciphertext.len));
3356 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
3357 			extra_offset);
3358 	/* Validate obuf */
3359 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
3360 		ciphertext,
3361 		expected_ciphertext_shifted,
3362 		tdata->validDataLenInBits.len,
3363 		extra_offset,
3364 		"SNOW 3G Ciphertext data not as expected");
3365 	return 0;
3366 }
3367 
3368 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
3369 {
3370 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3371 	struct crypto_unittest_params *ut_params = &unittest_params;
3372 
3373 	int retval;
3374 
3375 	uint8_t *plaintext, *ciphertext;
3376 	unsigned ciphertext_pad_len;
3377 	unsigned ciphertext_len;
3378 
3379 	/* Create SNOW 3G session */
3380 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3381 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3382 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3383 					tdata->key.data, tdata->key.len);
3384 	if (retval < 0)
3385 		return retval;
3386 
3387 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3388 
3389 	/* Clear mbuf payload */
3390 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3391 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3392 
3393 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3394 	/* Append data which is padded to a multiple of */
3395 	/* the algorithms block size */
3396 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3397 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3398 				ciphertext_pad_len);
3399 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3400 
3401 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3402 
3403 	/* Create SNOW 3G operation */
3404 	retval = create_wireless_algo_cipher_operation(tdata->iv.data, tdata->iv.len,
3405 					tdata->validCipherLenInBits.len,
3406 					tdata->validCipherOffsetLenInBits.len,
3407 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3408 	if (retval < 0)
3409 		return retval;
3410 
3411 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3412 						ut_params->op);
3413 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3414 	ut_params->obuf = ut_params->op->sym->m_dst;
3415 	if (ut_params->obuf)
3416 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3417 				+ tdata->iv.len;
3418 	else
3419 		plaintext = ciphertext;
3420 
3421 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3422 
3423 	/* Validate obuf */
3424 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3425 				tdata->plaintext.data,
3426 				tdata->validDataLenInBits.len,
3427 				"SNOW 3G Plaintext data not as expected");
3428 	return 0;
3429 }
3430 
3431 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
3432 {
3433 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3434 	struct crypto_unittest_params *ut_params = &unittest_params;
3435 
3436 	int retval;
3437 
3438 	uint8_t *plaintext, *ciphertext;
3439 	unsigned ciphertext_pad_len;
3440 	unsigned ciphertext_len;
3441 
3442 	/* Create SNOW 3G session */
3443 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3444 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3445 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3446 					tdata->key.data, tdata->key.len);
3447 	if (retval < 0)
3448 		return retval;
3449 
3450 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3451 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3452 
3453 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3454 			"Failed to allocate input buffer");
3455 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3456 			"Failed to allocate output buffer");
3457 
3458 	/* Clear mbuf payload */
3459 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3460 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3461 
3462 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
3463 		       rte_pktmbuf_tailroom(ut_params->obuf));
3464 
3465 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3466 	/* Append data which is padded to a multiple of */
3467 	/* the algorithms block size */
3468 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
3469 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3470 				ciphertext_pad_len);
3471 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3472 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3473 
3474 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, ciphertext_len);
3475 
3476 	/* Create SNOW 3G operation */
3477 	retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
3478 					tdata->iv.len,
3479 					tdata->validCipherLenInBits.len,
3480 					tdata->validCipherOffsetLenInBits.len,
3481 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
3482 	if (retval < 0)
3483 		return retval;
3484 
3485 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3486 						ut_params->op);
3487 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3488 	ut_params->obuf = ut_params->op->sym->m_dst;
3489 	if (ut_params->obuf)
3490 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3491 				+ tdata->iv.len;
3492 	else
3493 		plaintext = ciphertext;
3494 
3495 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, ciphertext_len);
3496 
3497 	/* Validate obuf */
3498 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
3499 				tdata->plaintext.data,
3500 				tdata->validDataLenInBits.len,
3501 				"SNOW 3G Plaintext data not as expected");
3502 	return 0;
3503 }
3504 
3505 static int
3506 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
3507 {
3508 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3509 	struct crypto_unittest_params *ut_params = &unittest_params;
3510 
3511 	int retval;
3512 
3513 	uint8_t *plaintext, *ciphertext;
3514 	unsigned plaintext_pad_len;
3515 	unsigned plaintext_len;
3516 
3517 	/* Create SNOW 3G session */
3518 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
3519 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3520 			RTE_CRYPTO_AUTH_OP_GENERATE,
3521 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3522 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3523 			tdata->key.data, tdata->key.len,
3524 			tdata->aad.len, tdata->digest.len);
3525 	if (retval < 0)
3526 		return retval;
3527 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3528 
3529 	/* clear mbuf payload */
3530 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3531 			rte_pktmbuf_tailroom(ut_params->ibuf));
3532 
3533 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3534 	/* Append data which is padded to a multiple of */
3535 	/* the algorithms block size */
3536 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3537 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3538 				plaintext_pad_len);
3539 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3540 
3541 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3542 
3543 	/* Create SNOW 3G operation */
3544 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
3545 			tdata->digest.len, tdata->aad.data,
3546 			tdata->aad.len, /*tdata->plaintext.len,*/
3547 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3548 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3549 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3550 			tdata->iv.data, tdata->iv.len,
3551 			tdata->validCipherLenInBits.len,
3552 			tdata->validCipherOffsetLenInBits.len,
3553 			tdata->validAuthLenInBits.len,
3554 			tdata->validAuthOffsetLenInBits.len
3555 			);
3556 	if (retval < 0)
3557 		return retval;
3558 
3559 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3560 			ut_params->op);
3561 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3562 	ut_params->obuf = ut_params->op->sym->m_src;
3563 	if (ut_params->obuf)
3564 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3565 				+ tdata->iv.len + tdata->aad.len;
3566 	else
3567 		ciphertext = plaintext;
3568 
3569 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3570 	/* Validate obuf */
3571 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3572 			ciphertext,
3573 			tdata->ciphertext.data,
3574 			tdata->validDataLenInBits.len,
3575 			"SNOW 3G Ciphertext data not as expected");
3576 
3577 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3578 	    + plaintext_pad_len + tdata->aad.len + tdata->iv.len;
3579 
3580 	/* Validate obuf */
3581 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3582 			ut_params->digest,
3583 			tdata->digest.data,
3584 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3585 			"SNOW 3G Generated auth tag not as expected");
3586 	return 0;
3587 }
3588 static int
3589 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata)
3590 {
3591 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3592 	struct crypto_unittest_params *ut_params = &unittest_params;
3593 
3594 	int retval;
3595 
3596 	uint8_t *plaintext, *ciphertext;
3597 	unsigned plaintext_pad_len;
3598 	unsigned plaintext_len;
3599 
3600 	/* Create SNOW 3G session */
3601 	retval = create_wireless_algo_auth_cipher_session(ts_params->valid_devs[0],
3602 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3603 			RTE_CRYPTO_AUTH_OP_GENERATE,
3604 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3605 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3606 			tdata->key.data, tdata->key.len,
3607 			tdata->aad.len, tdata->digest.len);
3608 	if (retval < 0)
3609 		return retval;
3610 
3611 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3612 
3613 	/* clear mbuf payload */
3614 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3615 			rte_pktmbuf_tailroom(ut_params->ibuf));
3616 
3617 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3618 	/* Append data which is padded to a multiple of */
3619 	/* the algorithms block size */
3620 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3621 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3622 				plaintext_pad_len);
3623 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3624 
3625 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3626 
3627 	/* Create SNOW 3G operation */
3628 	retval = create_wireless_algo_auth_cipher_operation(
3629 		tdata->digest.len,
3630 		tdata->iv.data, tdata->iv.len,
3631 		tdata->aad.data, tdata->aad.len,
3632 		plaintext_pad_len,
3633 		tdata->validCipherLenInBits.len,
3634 		tdata->validCipherOffsetLenInBits.len,
3635 		tdata->validAuthLenInBits.len,
3636 		tdata->validAuthOffsetLenInBits.len,
3637 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
3638 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
3639 	);
3640 
3641 	if (retval < 0)
3642 		return retval;
3643 
3644 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3645 			ut_params->op);
3646 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3647 	ut_params->obuf = ut_params->op->sym->m_src;
3648 	if (ut_params->obuf)
3649 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3650 				+ tdata->aad.len + tdata->iv.len;
3651 	else
3652 		ciphertext = plaintext;
3653 
3654 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3655 			+ plaintext_pad_len + tdata->aad.len + tdata->iv.len;
3656 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3657 
3658 	/* Validate obuf */
3659 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3660 		ciphertext,
3661 		tdata->ciphertext.data,
3662 		tdata->validDataLenInBits.len,
3663 		"SNOW 3G Ciphertext data not as expected");
3664 
3665 	/* Validate obuf */
3666 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3667 		ut_params->digest,
3668 		tdata->digest.data,
3669 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3670 		"SNOW 3G Generated auth tag not as expected");
3671 	return 0;
3672 }
3673 
3674 static int
3675 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata)
3676 {
3677 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3678 	struct crypto_unittest_params *ut_params = &unittest_params;
3679 
3680 	int retval;
3681 
3682 	uint8_t *plaintext, *ciphertext;
3683 	unsigned plaintext_pad_len;
3684 	unsigned plaintext_len;
3685 
3686 	/* Create KASUMI session */
3687 	retval = create_wireless_algo_auth_cipher_session(
3688 			ts_params->valid_devs[0],
3689 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3690 			RTE_CRYPTO_AUTH_OP_GENERATE,
3691 			RTE_CRYPTO_AUTH_KASUMI_F9,
3692 			RTE_CRYPTO_CIPHER_KASUMI_F8,
3693 			tdata->key.data, tdata->key.len,
3694 			tdata->aad.len, tdata->digest.len);
3695 	if (retval < 0)
3696 		return retval;
3697 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3698 
3699 	/* clear mbuf payload */
3700 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3701 			rte_pktmbuf_tailroom(ut_params->ibuf));
3702 
3703 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3704 	/* Append data which is padded to a multiple of */
3705 	/* the algorithms block size */
3706 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3707 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3708 				plaintext_pad_len);
3709 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3710 
3711 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3712 
3713 	/* Create KASUMI operation */
3714 	retval = create_wireless_algo_auth_cipher_operation(tdata->digest.len,
3715 				tdata->iv.data, tdata->iv.len,
3716 				tdata->aad.data, tdata->aad.len,
3717 				plaintext_pad_len,
3718 				tdata->validCipherLenInBits.len,
3719 				tdata->validCipherOffsetLenInBits.len,
3720 				tdata->validAuthLenInBits.len,
3721 				tdata->validAuthOffsetLenInBits.len,
3722 				RTE_CRYPTO_AUTH_KASUMI_F9,
3723 				RTE_CRYPTO_CIPHER_KASUMI_F8
3724 				);
3725 
3726 	if (retval < 0)
3727 		return retval;
3728 
3729 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3730 			ut_params->op);
3731 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3732 	ut_params->obuf = ut_params->op->sym->m_src;
3733 	if (ut_params->obuf)
3734 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3735 				+ tdata->iv.len + tdata->aad.len;
3736 	else
3737 		ciphertext = plaintext;
3738 
3739 	/* Validate obuf */
3740 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3741 			ciphertext,
3742 			tdata->ciphertext.data,
3743 			tdata->validCipherLenInBits.len,
3744 			"KASUMI Ciphertext data not as expected");
3745 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3746 	    + plaintext_pad_len + tdata->aad.len + tdata->iv.len;
3747 
3748 	/* Validate obuf */
3749 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3750 			ut_params->digest,
3751 			tdata->digest.data,
3752 			DIGEST_BYTE_LENGTH_KASUMI_F9,
3753 			"KASUMI Generated auth tag not as expected");
3754 	return 0;
3755 }
3756 
3757 static int
3758 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
3759 {
3760 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3761 	struct crypto_unittest_params *ut_params = &unittest_params;
3762 
3763 	int retval;
3764 
3765 	uint8_t *plaintext, *ciphertext;
3766 	unsigned plaintext_pad_len;
3767 	unsigned plaintext_len;
3768 
3769 	/* Create KASUMI session */
3770 	retval = create_wireless_algo_cipher_auth_session(
3771 			ts_params->valid_devs[0],
3772 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3773 			RTE_CRYPTO_AUTH_OP_GENERATE,
3774 			RTE_CRYPTO_AUTH_KASUMI_F9,
3775 			RTE_CRYPTO_CIPHER_KASUMI_F8,
3776 			tdata->key.data, tdata->key.len,
3777 			tdata->aad.len, tdata->digest.len);
3778 	if (retval < 0)
3779 		return retval;
3780 
3781 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3782 
3783 	/* clear mbuf payload */
3784 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3785 			rte_pktmbuf_tailroom(ut_params->ibuf));
3786 
3787 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3788 	/* Append data which is padded to a multiple of */
3789 	/* the algorithms block size */
3790 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3791 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3792 				plaintext_pad_len);
3793 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3794 
3795 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3796 
3797 	/* Create KASUMI operation */
3798 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
3799 				tdata->digest.len, tdata->aad.data,
3800 				tdata->aad.len,
3801 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3802 				RTE_CRYPTO_AUTH_KASUMI_F9,
3803 				RTE_CRYPTO_CIPHER_KASUMI_F8,
3804 				tdata->iv.data, tdata->iv.len,
3805 				tdata->validCipherLenInBits.len,
3806 				tdata->validCipherOffsetLenInBits.len,
3807 				tdata->validAuthLenInBits.len,
3808 				tdata->validAuthOffsetLenInBits.len
3809 				);
3810 	if (retval < 0)
3811 		return retval;
3812 
3813 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3814 			ut_params->op);
3815 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3816 	ut_params->obuf = ut_params->op->sym->m_src;
3817 	if (ut_params->obuf)
3818 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3819 				+ tdata->aad.len + tdata->iv.len;
3820 	else
3821 		ciphertext = plaintext;
3822 
3823 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3824 			+ plaintext_pad_len + tdata->aad.len + tdata->iv.len;
3825 
3826 	/* Validate obuf */
3827 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3828 		ciphertext,
3829 		tdata->ciphertext.data,
3830 		tdata->validCipherLenInBits.len,
3831 		"KASUMI Ciphertext data not as expected");
3832 
3833 	/* Validate obuf */
3834 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3835 		ut_params->digest,
3836 		tdata->digest.data,
3837 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3838 		"KASUMI Generated auth tag not as expected");
3839 	return 0;
3840 }
3841 
3842 static int
3843 test_zuc_encryption(const struct zuc_test_data *tdata)
3844 {
3845 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3846 	struct crypto_unittest_params *ut_params = &unittest_params;
3847 
3848 	int retval;
3849 	uint8_t *plaintext, *ciphertext;
3850 	unsigned plaintext_pad_len;
3851 	unsigned plaintext_len;
3852 
3853 	/* Create ZUC session */
3854 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3855 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3856 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
3857 					tdata->key.data, tdata->key.len);
3858 	if (retval < 0)
3859 		return retval;
3860 
3861 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3862 
3863 	/* Clear mbuf payload */
3864 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3865 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3866 
3867 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3868 	/* Append data which is padded to a multiple */
3869 	/* of the algorithms block size */
3870 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3871 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3872 				plaintext_pad_len);
3873 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3874 
3875 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, plaintext_len);
3876 
3877 	/* Create ZUC operation */
3878 	retval = create_wireless_algo_cipher_operation(tdata->iv.data, tdata->iv.len,
3879 					tdata->plaintext.len,
3880 					tdata->validCipherOffsetLenInBits.len,
3881 					RTE_CRYPTO_CIPHER_ZUC_EEA3);
3882 	if (retval < 0)
3883 		return retval;
3884 
3885 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3886 						ut_params->op);
3887 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3888 
3889 	ut_params->obuf = ut_params->op->sym->m_dst;
3890 	if (ut_params->obuf)
3891 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3892 				+ tdata->iv.len;
3893 	else
3894 		ciphertext = plaintext;
3895 
3896 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3897 
3898 	/* Validate obuf */
3899 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3900 		ciphertext,
3901 		tdata->ciphertext.data,
3902 		tdata->validCipherLenInBits.len,
3903 		"ZUC Ciphertext data not as expected");
3904 	return 0;
3905 }
3906 
3907 static int
3908 test_zuc_encryption_sgl(const struct zuc_test_data *tdata)
3909 {
3910 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3911 	struct crypto_unittest_params *ut_params = &unittest_params;
3912 
3913 	int retval;
3914 
3915 	unsigned int plaintext_pad_len;
3916 	unsigned int plaintext_len;
3917 	const uint8_t *ciphertext;
3918 	uint8_t ciphertext_buffer[2048];
3919 	struct rte_cryptodev_info dev_info;
3920 
3921 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3922 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
3923 		printf("Device doesn't support scatter-gather. "
3924 				"Test Skipped.\n");
3925 		return 0;
3926 	}
3927 
3928 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3929 
3930 	/* Append data which is padded to a multiple */
3931 	/* of the algorithms block size */
3932 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3933 
3934 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3935 			plaintext_pad_len, 10, 0);
3936 
3937 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
3938 			tdata->plaintext.data);
3939 
3940 	/* Create ZUC session */
3941 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3942 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3943 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
3944 			tdata->key.data, tdata->key.len);
3945 	if (retval < 0)
3946 		return retval;
3947 
3948 	/* Clear mbuf payload */
3949 
3950 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3951 
3952 	/* Create ZUC operation */
3953 	retval = create_wireless_algo_cipher_operation(tdata->iv.data,
3954 			tdata->iv.len, tdata->plaintext.len,
3955 			tdata->validCipherOffsetLenInBits.len,
3956 			RTE_CRYPTO_CIPHER_ZUC_EEA3);
3957 	if (retval < 0)
3958 		return retval;
3959 
3960 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3961 						ut_params->op);
3962 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3963 
3964 	ut_params->obuf = ut_params->op->sym->m_dst;
3965 	if (ut_params->obuf)
3966 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
3967 			tdata->iv.len, plaintext_len, ciphertext_buffer);
3968 	else
3969 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3970 			tdata->iv.len, plaintext_len, ciphertext_buffer);
3971 
3972 	/* Validate obuf */
3973 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
3974 
3975 	/* Validate obuf */
3976 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3977 		ciphertext,
3978 		tdata->ciphertext.data,
3979 		tdata->validCipherLenInBits.len,
3980 		"ZUC Ciphertext data not as expected");
3981 
3982 	return 0;
3983 }
3984 
3985 static int
3986 test_zuc_authentication(const struct zuc_hash_test_data *tdata)
3987 {
3988 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3989 	struct crypto_unittest_params *ut_params = &unittest_params;
3990 
3991 	int retval;
3992 	unsigned plaintext_pad_len;
3993 	unsigned plaintext_len;
3994 	uint8_t *plaintext;
3995 
3996 	/* Create ZUC session */
3997 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3998 			tdata->key.data, tdata->key.len,
3999 			tdata->aad.len, tdata->digest.len,
4000 			RTE_CRYPTO_AUTH_OP_GENERATE,
4001 			RTE_CRYPTO_AUTH_ZUC_EIA3);
4002 	if (retval < 0)
4003 		return retval;
4004 
4005 	/* alloc mbuf and set payload */
4006 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4007 
4008 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4009 	rte_pktmbuf_tailroom(ut_params->ibuf));
4010 
4011 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4012 	/* Append data which is padded to a multiple of */
4013 	/* the algorithms block size */
4014 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
4015 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4016 				plaintext_pad_len);
4017 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4018 
4019 	/* Create ZUC operation */
4020 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
4021 			tdata->aad.data, tdata->aad.len,
4022 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4023 			RTE_CRYPTO_AUTH_ZUC_EIA3,
4024 			tdata->validAuthLenInBits.len,
4025 			tdata->validAuthOffsetLenInBits.len);
4026 	if (retval < 0)
4027 		return retval;
4028 
4029 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4030 				ut_params->op);
4031 	ut_params->obuf = ut_params->op->sym->m_src;
4032 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4033 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4034 			+ plaintext_pad_len + ALIGN_POW2_ROUNDUP(tdata->aad.len, 8);
4035 
4036 	/* Validate obuf */
4037 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4038 	ut_params->digest,
4039 	tdata->digest.data,
4040 	DIGEST_BYTE_LENGTH_KASUMI_F9,
4041 	"ZUC Generated auth tag not as expected");
4042 
4043 	return 0;
4044 }
4045 
4046 static int
4047 test_kasumi_encryption_test_case_1(void)
4048 {
4049 	return test_kasumi_encryption(&kasumi_test_case_1);
4050 }
4051 
4052 static int
4053 test_kasumi_encryption_test_case_1_sgl(void)
4054 {
4055 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
4056 }
4057 
4058 static int
4059 test_kasumi_encryption_test_case_1_oop(void)
4060 {
4061 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
4062 }
4063 
4064 static int
4065 test_kasumi_encryption_test_case_1_oop_sgl(void)
4066 {
4067 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
4068 }
4069 
4070 static int
4071 test_kasumi_encryption_test_case_2(void)
4072 {
4073 	return test_kasumi_encryption(&kasumi_test_case_2);
4074 }
4075 
4076 static int
4077 test_kasumi_encryption_test_case_3(void)
4078 {
4079 	return test_kasumi_encryption(&kasumi_test_case_3);
4080 }
4081 
4082 static int
4083 test_kasumi_encryption_test_case_4(void)
4084 {
4085 	return test_kasumi_encryption(&kasumi_test_case_4);
4086 }
4087 
4088 static int
4089 test_kasumi_encryption_test_case_5(void)
4090 {
4091 	return test_kasumi_encryption(&kasumi_test_case_5);
4092 }
4093 
4094 static int
4095 test_kasumi_decryption_test_case_1(void)
4096 {
4097 	return test_kasumi_decryption(&kasumi_test_case_1);
4098 }
4099 
4100 static int
4101 test_kasumi_decryption_test_case_1_oop(void)
4102 {
4103 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
4104 }
4105 
4106 static int
4107 test_kasumi_decryption_test_case_2(void)
4108 {
4109 	return test_kasumi_decryption(&kasumi_test_case_2);
4110 }
4111 
4112 static int
4113 test_kasumi_decryption_test_case_3(void)
4114 {
4115 	return test_kasumi_decryption(&kasumi_test_case_3);
4116 }
4117 
4118 static int
4119 test_kasumi_decryption_test_case_4(void)
4120 {
4121 	return test_kasumi_decryption(&kasumi_test_case_4);
4122 }
4123 
4124 static int
4125 test_kasumi_decryption_test_case_5(void)
4126 {
4127 	return test_kasumi_decryption(&kasumi_test_case_5);
4128 }
4129 static int
4130 test_snow3g_encryption_test_case_1(void)
4131 {
4132 	return test_snow3g_encryption(&snow3g_test_case_1);
4133 }
4134 
4135 static int
4136 test_snow3g_encryption_test_case_1_oop(void)
4137 {
4138 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
4139 }
4140 
4141 static int
4142 test_snow3g_encryption_test_case_1_oop_sgl(void)
4143 {
4144 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
4145 }
4146 
4147 
4148 static int
4149 test_snow3g_encryption_test_case_1_offset_oop(void)
4150 {
4151 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
4152 }
4153 
4154 static int
4155 test_snow3g_encryption_test_case_2(void)
4156 {
4157 	return test_snow3g_encryption(&snow3g_test_case_2);
4158 }
4159 
4160 static int
4161 test_snow3g_encryption_test_case_3(void)
4162 {
4163 	return test_snow3g_encryption(&snow3g_test_case_3);
4164 }
4165 
4166 static int
4167 test_snow3g_encryption_test_case_4(void)
4168 {
4169 	return test_snow3g_encryption(&snow3g_test_case_4);
4170 }
4171 
4172 static int
4173 test_snow3g_encryption_test_case_5(void)
4174 {
4175 	return test_snow3g_encryption(&snow3g_test_case_5);
4176 }
4177 
4178 static int
4179 test_snow3g_decryption_test_case_1(void)
4180 {
4181 	return test_snow3g_decryption(&snow3g_test_case_1);
4182 }
4183 
4184 static int
4185 test_snow3g_decryption_test_case_1_oop(void)
4186 {
4187 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
4188 }
4189 
4190 static int
4191 test_snow3g_decryption_test_case_2(void)
4192 {
4193 	return test_snow3g_decryption(&snow3g_test_case_2);
4194 }
4195 
4196 static int
4197 test_snow3g_decryption_test_case_3(void)
4198 {
4199 	return test_snow3g_decryption(&snow3g_test_case_3);
4200 }
4201 
4202 static int
4203 test_snow3g_decryption_test_case_4(void)
4204 {
4205 	return test_snow3g_decryption(&snow3g_test_case_4);
4206 }
4207 
4208 static int
4209 test_snow3g_decryption_test_case_5(void)
4210 {
4211 	return test_snow3g_decryption(&snow3g_test_case_5);
4212 }
4213 static int
4214 test_snow3g_cipher_auth_test_case_1(void)
4215 {
4216 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
4217 }
4218 
4219 static int
4220 test_snow3g_auth_cipher_test_case_1(void)
4221 {
4222 	return test_snow3g_auth_cipher(&snow3g_test_case_6);
4223 }
4224 
4225 static int
4226 test_kasumi_auth_cipher_test_case_1(void)
4227 {
4228 	return test_kasumi_auth_cipher(&kasumi_test_case_3);
4229 }
4230 
4231 static int
4232 test_kasumi_cipher_auth_test_case_1(void)
4233 {
4234 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
4235 }
4236 
4237 static int
4238 test_zuc_encryption_test_case_1(void)
4239 {
4240 	return test_zuc_encryption(&zuc_test_case_1);
4241 }
4242 
4243 static int
4244 test_zuc_encryption_test_case_2(void)
4245 {
4246 	return test_zuc_encryption(&zuc_test_case_2);
4247 }
4248 
4249 static int
4250 test_zuc_encryption_test_case_3(void)
4251 {
4252 	return test_zuc_encryption(&zuc_test_case_3);
4253 }
4254 
4255 static int
4256 test_zuc_encryption_test_case_4(void)
4257 {
4258 	return test_zuc_encryption(&zuc_test_case_4);
4259 }
4260 
4261 static int
4262 test_zuc_encryption_test_case_5(void)
4263 {
4264 	return test_zuc_encryption(&zuc_test_case_5);
4265 }
4266 
4267 static int
4268 test_zuc_encryption_test_case_6_sgl(void)
4269 {
4270 	return test_zuc_encryption_sgl(&zuc_test_case_1);
4271 }
4272 
4273 static int
4274 test_zuc_hash_generate_test_case_1(void)
4275 {
4276 	return test_zuc_authentication(&zuc_hash_test_case_1);
4277 }
4278 
4279 static int
4280 test_zuc_hash_generate_test_case_2(void)
4281 {
4282 	return test_zuc_authentication(&zuc_hash_test_case_2);
4283 }
4284 
4285 static int
4286 test_zuc_hash_generate_test_case_3(void)
4287 {
4288 	return test_zuc_authentication(&zuc_hash_test_case_3);
4289 }
4290 
4291 static int
4292 test_zuc_hash_generate_test_case_4(void)
4293 {
4294 	return test_zuc_authentication(&zuc_hash_test_case_4);
4295 }
4296 
4297 static int
4298 test_zuc_hash_generate_test_case_5(void)
4299 {
4300 	return test_zuc_authentication(&zuc_hash_test_case_5);
4301 }
4302 
4303 static int
4304 test_3DES_chain_qat_all(void)
4305 {
4306 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4307 	int status;
4308 
4309 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4310 		ts_params->op_mpool, ts_params->valid_devs[0],
4311 		RTE_CRYPTODEV_QAT_SYM_PMD,
4312 		BLKCIPHER_3DES_CHAIN_TYPE);
4313 
4314 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
4315 
4316 	return TEST_SUCCESS;
4317 }
4318 
4319 static int
4320 test_DES_cipheronly_qat_all(void)
4321 {
4322 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4323 	int status;
4324 
4325 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4326 		ts_params->op_mpool, ts_params->valid_devs[0],
4327 		RTE_CRYPTODEV_QAT_SYM_PMD,
4328 		BLKCIPHER_DES_CIPHERONLY_TYPE);
4329 
4330 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
4331 
4332 	return TEST_SUCCESS;
4333 }
4334 
4335 static int
4336 test_3DES_cipheronly_qat_all(void)
4337 {
4338 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4339 	int status;
4340 
4341 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4342 		ts_params->op_mpool, ts_params->valid_devs[0],
4343 		RTE_CRYPTODEV_QAT_SYM_PMD,
4344 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
4345 
4346 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
4347 
4348 	return TEST_SUCCESS;
4349 }
4350 
4351 static int
4352 test_3DES_chain_openssl_all(void)
4353 {
4354 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4355 	int status;
4356 
4357 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4358 		ts_params->op_mpool, ts_params->valid_devs[0],
4359 		RTE_CRYPTODEV_OPENSSL_PMD,
4360 		BLKCIPHER_3DES_CHAIN_TYPE);
4361 
4362 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
4363 
4364 	return TEST_SUCCESS;
4365 }
4366 
4367 static int
4368 test_3DES_cipheronly_openssl_all(void)
4369 {
4370 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4371 	int status;
4372 
4373 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
4374 		ts_params->op_mpool, ts_params->valid_devs[0],
4375 		RTE_CRYPTODEV_OPENSSL_PMD,
4376 		BLKCIPHER_3DES_CIPHERONLY_TYPE);
4377 
4378 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
4379 
4380 	return TEST_SUCCESS;
4381 }
4382 
4383 /* ***** AES-GCM Tests ***** */
4384 
4385 static int
4386 create_gcm_session(uint8_t dev_id, enum rte_crypto_cipher_operation op,
4387 		const uint8_t *key, const uint8_t key_len,
4388 		const uint8_t aad_len, const uint8_t auth_len,
4389 		enum rte_crypto_auth_operation auth_op)
4390 {
4391 	uint8_t cipher_key[key_len];
4392 
4393 	struct crypto_unittest_params *ut_params = &unittest_params;
4394 
4395 	memcpy(cipher_key, key, key_len);
4396 
4397 	/* Setup Cipher Parameters */
4398 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4399 	ut_params->cipher_xform.next = NULL;
4400 
4401 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_GCM;
4402 	ut_params->auth_xform.auth.op = auth_op;
4403 	ut_params->cipher_xform.cipher.op = op;
4404 	ut_params->cipher_xform.cipher.key.data = cipher_key;
4405 	ut_params->cipher_xform.cipher.key.length = key_len;
4406 
4407 	TEST_HEXDUMP(stdout, "key:", key, key_len);
4408 
4409 	/* Setup Authentication Parameters */
4410 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4411 	ut_params->auth_xform.next = NULL;
4412 
4413 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GCM;
4414 
4415 	ut_params->auth_xform.auth.digest_length = auth_len;
4416 	ut_params->auth_xform.auth.add_auth_data_length = aad_len;
4417 	ut_params->auth_xform.auth.key.length = 0;
4418 	ut_params->auth_xform.auth.key.data = NULL;
4419 
4420 	if (op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
4421 		ut_params->cipher_xform.next = &ut_params->auth_xform;
4422 
4423 		/* Create Crypto session*/
4424 		ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
4425 				&ut_params->cipher_xform);
4426 	} else {/* Create Crypto session*/
4427 		ut_params->auth_xform.next = &ut_params->cipher_xform;
4428 		ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
4429 				&ut_params->auth_xform);
4430 	}
4431 
4432 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
4433 
4434 	return 0;
4435 }
4436 
4437 static int
4438 create_gcm_xforms(struct rte_crypto_op *op,
4439 		enum rte_crypto_cipher_operation cipher_op,
4440 		uint8_t *key, const uint8_t key_len,
4441 		const uint8_t aad_len, const uint8_t auth_len,
4442 		enum rte_crypto_auth_operation auth_op)
4443 {
4444 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 2),
4445 			"failed to allocate space for crypto transforms");
4446 
4447 	struct rte_crypto_sym_op *sym_op = op->sym;
4448 
4449 	/* Setup Cipher Parameters */
4450 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4451 	sym_op->xform->cipher.algo = RTE_CRYPTO_CIPHER_AES_GCM;
4452 	sym_op->xform->cipher.op = cipher_op;
4453 	sym_op->xform->cipher.key.data = key;
4454 	sym_op->xform->cipher.key.length = key_len;
4455 
4456 	TEST_HEXDUMP(stdout, "key:", key, key_len);
4457 
4458 	/* Setup Authentication Parameters */
4459 	sym_op->xform->next->type = RTE_CRYPTO_SYM_XFORM_AUTH;
4460 	sym_op->xform->next->auth.algo = RTE_CRYPTO_AUTH_AES_GCM;
4461 	sym_op->xform->next->auth.op = auth_op;
4462 	sym_op->xform->next->auth.digest_length = auth_len;
4463 	sym_op->xform->next->auth.add_auth_data_length = aad_len;
4464 	sym_op->xform->next->auth.key.length = 0;
4465 	sym_op->xform->next->auth.key.data = NULL;
4466 	sym_op->xform->next->next = NULL;
4467 
4468 	return 0;
4469 }
4470 
4471 static int
4472 create_gcm_operation(enum rte_crypto_cipher_operation op,
4473 		const struct gcm_test_data *tdata)
4474 {
4475 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4476 	struct crypto_unittest_params *ut_params = &unittest_params;
4477 
4478 	uint8_t *plaintext, *ciphertext;
4479 	unsigned int iv_pad_len, aad_pad_len, plaintext_pad_len;
4480 
4481 	/* Generate Crypto op data structure */
4482 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
4483 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
4484 	TEST_ASSERT_NOT_NULL(ut_params->op,
4485 			"Failed to allocate symmetric crypto operation struct");
4486 
4487 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
4488 
4489 	/* Append aad data */
4490 	aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
4491 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4492 			aad_pad_len);
4493 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
4494 			"no room to append aad");
4495 
4496 	sym_op->auth.aad.length = tdata->aad.len;
4497 	sym_op->auth.aad.phys_addr =
4498 			rte_pktmbuf_mtophys(ut_params->ibuf);
4499 	memcpy(sym_op->auth.aad.data, tdata->aad.data, tdata->aad.len);
4500 	TEST_HEXDUMP(stdout, "aad:", sym_op->auth.aad.data,
4501 		sym_op->auth.aad.length);
4502 
4503 	/* Prepend iv */
4504 	iv_pad_len = RTE_ALIGN_CEIL(tdata->iv.len, 16);
4505 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
4506 			ut_params->ibuf, iv_pad_len);
4507 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
4508 
4509 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
4510 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
4511 	sym_op->cipher.iv.length = tdata->iv.len;
4512 
4513 	rte_memcpy(sym_op->cipher.iv.data, tdata->iv.data, tdata->iv.len);
4514 	TEST_HEXDUMP(stdout, "iv:", sym_op->cipher.iv.data,
4515 		sym_op->cipher.iv.length);
4516 
4517 	/* Append plaintext/ciphertext */
4518 	if (op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
4519 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
4520 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4521 				plaintext_pad_len);
4522 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
4523 
4524 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
4525 		TEST_HEXDUMP(stdout, "plaintext:", plaintext,
4526 				tdata->plaintext.len);
4527 
4528 		if (ut_params->obuf) {
4529 			ciphertext = (uint8_t *)rte_pktmbuf_append(
4530 					ut_params->obuf,
4531 					plaintext_pad_len + aad_pad_len +
4532 					iv_pad_len);
4533 			TEST_ASSERT_NOT_NULL(ciphertext,
4534 					"no room to append ciphertext");
4535 
4536 			memset(ciphertext + aad_pad_len + iv_pad_len, 0,
4537 					tdata->ciphertext.len);
4538 		}
4539 	} else {
4540 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
4541 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4542 				plaintext_pad_len);
4543 		TEST_ASSERT_NOT_NULL(ciphertext,
4544 				"no room to append ciphertext");
4545 
4546 		memcpy(ciphertext, tdata->ciphertext.data,
4547 				tdata->ciphertext.len);
4548 		TEST_HEXDUMP(stdout, "ciphertext:", ciphertext,
4549 				tdata->ciphertext.len);
4550 
4551 		if (ut_params->obuf) {
4552 			plaintext = (uint8_t *)rte_pktmbuf_append(
4553 					ut_params->obuf,
4554 					plaintext_pad_len + aad_pad_len +
4555 					iv_pad_len);
4556 			TEST_ASSERT_NOT_NULL(plaintext,
4557 					"no room to append plaintext");
4558 
4559 			memset(plaintext + aad_pad_len + iv_pad_len, 0,
4560 					tdata->plaintext.len);
4561 		}
4562 	}
4563 
4564 	/* Append digest data */
4565 	if (op == RTE_CRYPTO_CIPHER_OP_ENCRYPT) {
4566 		sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
4567 				ut_params->obuf ? ut_params->obuf :
4568 						ut_params->ibuf,
4569 						tdata->auth_tag.len);
4570 		TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
4571 				"no room to append digest");
4572 		memset(sym_op->auth.digest.data, 0, tdata->auth_tag.len);
4573 		sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
4574 				ut_params->obuf ? ut_params->obuf :
4575 						ut_params->ibuf,
4576 						plaintext_pad_len +
4577 						aad_pad_len + iv_pad_len);
4578 		sym_op->auth.digest.length = tdata->auth_tag.len;
4579 	} else {
4580 		sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
4581 				ut_params->ibuf, tdata->auth_tag.len);
4582 		TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
4583 				"no room to append digest");
4584 		sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
4585 				ut_params->ibuf,
4586 				plaintext_pad_len + aad_pad_len + iv_pad_len);
4587 		sym_op->auth.digest.length = tdata->auth_tag.len;
4588 
4589 		rte_memcpy(sym_op->auth.digest.data, tdata->auth_tag.data,
4590 			tdata->auth_tag.len);
4591 		TEST_HEXDUMP(stdout, "digest:",
4592 			sym_op->auth.digest.data,
4593 			sym_op->auth.digest.length);
4594 	}
4595 
4596 	sym_op->cipher.data.length = tdata->plaintext.len;
4597 	sym_op->cipher.data.offset = aad_pad_len + iv_pad_len;
4598 
4599 	sym_op->auth.data.length = tdata->plaintext.len;
4600 	sym_op->auth.data.offset = aad_pad_len + iv_pad_len;
4601 
4602 	return 0;
4603 }
4604 
4605 static int
4606 test_mb_AES_GCM_authenticated_encryption(const struct gcm_test_data *tdata)
4607 {
4608 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4609 	struct crypto_unittest_params *ut_params = &unittest_params;
4610 
4611 	int retval;
4612 	uint8_t *ciphertext, *auth_tag;
4613 	uint16_t plaintext_pad_len;
4614 	uint32_t i;
4615 
4616 	/* Create GCM session */
4617 	retval = create_gcm_session(ts_params->valid_devs[0],
4618 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4619 			tdata->key.data, tdata->key.len,
4620 			tdata->aad.len, tdata->auth_tag.len,
4621 			RTE_CRYPTO_AUTH_OP_GENERATE);
4622 	if (retval < 0)
4623 		return retval;
4624 
4625 	if (tdata->aad.len > MBUF_SIZE) {
4626 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
4627 		/* Populate full size of add data */
4628 		for (i = 32; i < GCM_MAX_AAD_LENGTH; i += 32)
4629 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
4630 	} else
4631 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4632 
4633 	/* clear mbuf payload */
4634 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4635 			rte_pktmbuf_tailroom(ut_params->ibuf));
4636 
4637 	/* Create GCM operation */
4638 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_ENCRYPT, tdata);
4639 	if (retval < 0)
4640 		return retval;
4641 
4642 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
4643 
4644 	ut_params->op->sym->m_src = ut_params->ibuf;
4645 
4646 	/* Process crypto operation */
4647 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
4648 			ut_params->op), "failed to process sym crypto op");
4649 
4650 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
4651 			"crypto op processing failed");
4652 
4653 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
4654 
4655 	if (ut_params->op->sym->m_dst) {
4656 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
4657 				uint8_t *);
4658 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
4659 				uint8_t *, plaintext_pad_len);
4660 	} else {
4661 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
4662 				uint8_t *,
4663 				ut_params->op->sym->cipher.data.offset);
4664 		auth_tag = ciphertext + plaintext_pad_len;
4665 	}
4666 
4667 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
4668 	TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
4669 
4670 	/* Validate obuf */
4671 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4672 			ciphertext,
4673 			tdata->ciphertext.data,
4674 			tdata->ciphertext.len,
4675 			"GCM Ciphertext data not as expected");
4676 
4677 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4678 			auth_tag,
4679 			tdata->auth_tag.data,
4680 			tdata->auth_tag.len,
4681 			"GCM Generated auth tag not as expected");
4682 
4683 	return 0;
4684 
4685 }
4686 
4687 static int
4688 test_mb_AES_GCM_authenticated_encryption_test_case_1(void)
4689 {
4690 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_1);
4691 }
4692 
4693 static int
4694 test_mb_AES_GCM_authenticated_encryption_test_case_2(void)
4695 {
4696 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_2);
4697 }
4698 
4699 static int
4700 test_mb_AES_GCM_authenticated_encryption_test_case_3(void)
4701 {
4702 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_3);
4703 }
4704 
4705 static int
4706 test_mb_AES_GCM_authenticated_encryption_test_case_4(void)
4707 {
4708 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_4);
4709 }
4710 
4711 static int
4712 test_mb_AES_GCM_authenticated_encryption_test_case_5(void)
4713 {
4714 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_5);
4715 }
4716 
4717 static int
4718 test_mb_AES_GCM_authenticated_encryption_test_case_6(void)
4719 {
4720 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_6);
4721 }
4722 
4723 static int
4724 test_mb_AES_GCM_authenticated_encryption_test_case_7(void)
4725 {
4726 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_7);
4727 }
4728 
4729 static int
4730 test_mb_AES_GCM_auth_encryption_test_case_256_1(void)
4731 {
4732 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_1);
4733 }
4734 
4735 static int
4736 test_mb_AES_GCM_auth_encryption_test_case_256_2(void)
4737 {
4738 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_2);
4739 }
4740 
4741 static int
4742 test_mb_AES_GCM_auth_encryption_test_case_256_3(void)
4743 {
4744 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_3);
4745 }
4746 
4747 static int
4748 test_mb_AES_GCM_auth_encryption_test_case_256_4(void)
4749 {
4750 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_4);
4751 }
4752 
4753 static int
4754 test_mb_AES_GCM_auth_encryption_test_case_256_5(void)
4755 {
4756 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_5);
4757 }
4758 
4759 static int
4760 test_mb_AES_GCM_auth_encryption_test_case_256_6(void)
4761 {
4762 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_6);
4763 }
4764 
4765 static int
4766 test_mb_AES_GCM_auth_encryption_test_case_256_7(void)
4767 {
4768 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_256_7);
4769 }
4770 
4771 static int
4772 test_mb_AES_GCM_auth_encryption_test_case_aad_1(void)
4773 {
4774 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_aad_1);
4775 }
4776 
4777 static int
4778 test_mb_AES_GCM_auth_encryption_test_case_aad_2(void)
4779 {
4780 	return test_mb_AES_GCM_authenticated_encryption(&gcm_test_case_aad_2);
4781 }
4782 
4783 static int
4784 test_mb_AES_GCM_authenticated_decryption(const struct gcm_test_data *tdata)
4785 {
4786 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4787 	struct crypto_unittest_params *ut_params = &unittest_params;
4788 
4789 	int retval;
4790 	uint8_t *plaintext;
4791 	uint32_t i;
4792 
4793 	/* Create GCM session */
4794 	retval = create_gcm_session(ts_params->valid_devs[0],
4795 			RTE_CRYPTO_CIPHER_OP_DECRYPT,
4796 			tdata->key.data, tdata->key.len,
4797 			tdata->aad.len, tdata->auth_tag.len,
4798 			RTE_CRYPTO_AUTH_OP_VERIFY);
4799 	if (retval < 0)
4800 		return retval;
4801 
4802 	/* alloc mbuf and set payload */
4803 	if (tdata->aad.len > MBUF_SIZE) {
4804 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
4805 		/* Populate full size of add data */
4806 		for (i = 32; i < GCM_MAX_AAD_LENGTH; i += 32)
4807 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
4808 	} else
4809 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4810 
4811 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4812 			rte_pktmbuf_tailroom(ut_params->ibuf));
4813 
4814 	/* Create GCM operation */
4815 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_DECRYPT, tdata);
4816 	if (retval < 0)
4817 		return retval;
4818 
4819 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
4820 
4821 	ut_params->op->sym->m_src = ut_params->ibuf;
4822 
4823 	/* Process crypto operation */
4824 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
4825 			ut_params->op), "failed to process sym crypto op");
4826 
4827 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
4828 			"crypto op processing failed");
4829 
4830 	if (ut_params->op->sym->m_dst)
4831 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
4832 				uint8_t *);
4833 	else
4834 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
4835 				uint8_t *,
4836 				ut_params->op->sym->cipher.data.offset);
4837 
4838 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
4839 
4840 	/* Validate obuf */
4841 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4842 			plaintext,
4843 			tdata->plaintext.data,
4844 			tdata->plaintext.len,
4845 			"GCM plaintext data not as expected");
4846 
4847 	TEST_ASSERT_EQUAL(ut_params->op->status,
4848 			RTE_CRYPTO_OP_STATUS_SUCCESS,
4849 			"GCM authentication failed");
4850 	return 0;
4851 }
4852 
4853 static int
4854 test_mb_AES_GCM_authenticated_decryption_test_case_1(void)
4855 {
4856 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_1);
4857 }
4858 
4859 static int
4860 test_mb_AES_GCM_authenticated_decryption_test_case_2(void)
4861 {
4862 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_2);
4863 }
4864 
4865 static int
4866 test_mb_AES_GCM_authenticated_decryption_test_case_3(void)
4867 {
4868 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_3);
4869 }
4870 
4871 static int
4872 test_mb_AES_GCM_authenticated_decryption_test_case_4(void)
4873 {
4874 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_4);
4875 }
4876 
4877 static int
4878 test_mb_AES_GCM_authenticated_decryption_test_case_5(void)
4879 {
4880 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_5);
4881 }
4882 
4883 static int
4884 test_mb_AES_GCM_authenticated_decryption_test_case_6(void)
4885 {
4886 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_6);
4887 }
4888 
4889 static int
4890 test_mb_AES_GCM_authenticated_decryption_test_case_7(void)
4891 {
4892 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_7);
4893 }
4894 
4895 static int
4896 test_mb_AES_GCM_auth_decryption_test_case_256_1(void)
4897 {
4898 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_1);
4899 }
4900 
4901 static int
4902 test_mb_AES_GCM_auth_decryption_test_case_256_2(void)
4903 {
4904 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_2);
4905 }
4906 
4907 static int
4908 test_mb_AES_GCM_auth_decryption_test_case_256_3(void)
4909 {
4910 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_3);
4911 }
4912 
4913 static int
4914 test_mb_AES_GCM_auth_decryption_test_case_256_4(void)
4915 {
4916 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_4);
4917 }
4918 
4919 static int
4920 test_mb_AES_GCM_auth_decryption_test_case_256_5(void)
4921 {
4922 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_5);
4923 }
4924 
4925 static int
4926 test_mb_AES_GCM_auth_decryption_test_case_256_6(void)
4927 {
4928 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_6);
4929 }
4930 
4931 static int
4932 test_mb_AES_GCM_auth_decryption_test_case_256_7(void)
4933 {
4934 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_256_7);
4935 }
4936 
4937 static int
4938 test_mb_AES_GCM_auth_decryption_test_case_aad_1(void)
4939 {
4940 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_aad_1);
4941 }
4942 
4943 static int
4944 test_mb_AES_GCM_auth_decryption_test_case_aad_2(void)
4945 {
4946 	return test_mb_AES_GCM_authenticated_decryption(&gcm_test_case_aad_2);
4947 }
4948 
4949 static int
4950 test_AES_GCM_authenticated_encryption_oop(const struct gcm_test_data *tdata)
4951 {
4952 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4953 	struct crypto_unittest_params *ut_params = &unittest_params;
4954 
4955 	int retval;
4956 	uint8_t *ciphertext, *auth_tag;
4957 	uint16_t plaintext_pad_len;
4958 
4959 	/* Create GCM session */
4960 	retval = create_gcm_session(ts_params->valid_devs[0],
4961 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4962 			tdata->key.data, tdata->key.len,
4963 			tdata->aad.len, tdata->auth_tag.len,
4964 			RTE_CRYPTO_AUTH_OP_GENERATE);
4965 	if (retval < 0)
4966 		return retval;
4967 
4968 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4969 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4970 
4971 	/* clear mbuf payload */
4972 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4973 			rte_pktmbuf_tailroom(ut_params->ibuf));
4974 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4975 			rte_pktmbuf_tailroom(ut_params->obuf));
4976 
4977 	/* Create GCM operation */
4978 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_ENCRYPT, tdata);
4979 	if (retval < 0)
4980 		return retval;
4981 
4982 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
4983 
4984 	ut_params->op->sym->m_src = ut_params->ibuf;
4985 	ut_params->op->sym->m_dst = ut_params->obuf;
4986 
4987 	/* Process crypto operation */
4988 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
4989 			ut_params->op), "failed to process sym crypto op");
4990 
4991 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
4992 			"crypto op processing failed");
4993 
4994 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
4995 
4996 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
4997 			ut_params->op->sym->cipher.data.offset);
4998 	auth_tag = ciphertext + plaintext_pad_len;
4999 
5000 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5001 	TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5002 
5003 	/* Validate obuf */
5004 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5005 			ciphertext,
5006 			tdata->ciphertext.data,
5007 			tdata->ciphertext.len,
5008 			"GCM Ciphertext data not as expected");
5009 
5010 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5011 			auth_tag,
5012 			tdata->auth_tag.data,
5013 			tdata->auth_tag.len,
5014 			"GCM Generated auth tag not as expected");
5015 
5016 	return 0;
5017 
5018 }
5019 
5020 static int
5021 test_mb_AES_GCM_authenticated_encryption_oop(void)
5022 {
5023 	return test_AES_GCM_authenticated_encryption_oop(&gcm_test_case_5);
5024 }
5025 
5026 static int
5027 test_AES_GCM_authenticated_decryption_oop(const struct gcm_test_data *tdata)
5028 {
5029 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5030 	struct crypto_unittest_params *ut_params = &unittest_params;
5031 
5032 	int retval;
5033 	uint8_t *plaintext;
5034 
5035 	/* Create GCM session */
5036 	retval = create_gcm_session(ts_params->valid_devs[0],
5037 			RTE_CRYPTO_CIPHER_OP_DECRYPT,
5038 			tdata->key.data, tdata->key.len,
5039 			tdata->aad.len, tdata->auth_tag.len,
5040 			RTE_CRYPTO_AUTH_OP_VERIFY);
5041 	if (retval < 0)
5042 		return retval;
5043 
5044 	/* alloc mbuf and set payload */
5045 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5046 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5047 
5048 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5049 			rte_pktmbuf_tailroom(ut_params->ibuf));
5050 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5051 			rte_pktmbuf_tailroom(ut_params->obuf));
5052 
5053 	/* Create GCM operation */
5054 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_DECRYPT, tdata);
5055 	if (retval < 0)
5056 		return retval;
5057 
5058 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5059 
5060 	ut_params->op->sym->m_src = ut_params->ibuf;
5061 	ut_params->op->sym->m_dst = ut_params->obuf;
5062 
5063 	/* Process crypto operation */
5064 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5065 			ut_params->op), "failed to process sym crypto op");
5066 
5067 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5068 			"crypto op processing failed");
5069 
5070 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5071 			ut_params->op->sym->cipher.data.offset);
5072 
5073 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5074 
5075 	/* Validate obuf */
5076 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5077 			plaintext,
5078 			tdata->plaintext.data,
5079 			tdata->plaintext.len,
5080 			"GCM plaintext data not as expected");
5081 
5082 	TEST_ASSERT_EQUAL(ut_params->op->status,
5083 			RTE_CRYPTO_OP_STATUS_SUCCESS,
5084 			"GCM authentication failed");
5085 	return 0;
5086 }
5087 
5088 static int
5089 test_mb_AES_GCM_authenticated_decryption_oop(void)
5090 {
5091 	return test_AES_GCM_authenticated_decryption_oop(&gcm_test_case_5);
5092 }
5093 
5094 static int
5095 test_AES_GCM_authenticated_encryption_sessionless(
5096 		const struct gcm_test_data *tdata)
5097 {
5098 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5099 	struct crypto_unittest_params *ut_params = &unittest_params;
5100 
5101 	int retval;
5102 	uint8_t *ciphertext, *auth_tag;
5103 	uint16_t plaintext_pad_len;
5104 	uint8_t key[tdata->key.len + 1];
5105 
5106 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5107 
5108 	/* clear mbuf payload */
5109 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5110 			rte_pktmbuf_tailroom(ut_params->ibuf));
5111 
5112 	/* Create GCM operation */
5113 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_ENCRYPT, tdata);
5114 	if (retval < 0)
5115 		return retval;
5116 
5117 	/* Create GCM xforms */
5118 	memcpy(key, tdata->key.data, tdata->key.len);
5119 	retval = create_gcm_xforms(ut_params->op,
5120 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5121 			key, tdata->key.len,
5122 			tdata->aad.len, tdata->auth_tag.len,
5123 			RTE_CRYPTO_AUTH_OP_GENERATE);
5124 	if (retval < 0)
5125 		return retval;
5126 
5127 	ut_params->op->sym->m_src = ut_params->ibuf;
5128 
5129 	TEST_ASSERT_EQUAL(ut_params->op->sym->sess_type,
5130 			RTE_CRYPTO_SYM_OP_SESSIONLESS,
5131 			"crypto op session type not sessionless");
5132 
5133 	/* Process crypto operation */
5134 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5135 			ut_params->op), "failed to process sym crypto op");
5136 
5137 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5138 
5139 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5140 			"crypto op status not success");
5141 
5142 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
5143 
5144 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5145 			ut_params->op->sym->cipher.data.offset);
5146 	auth_tag = ciphertext + plaintext_pad_len;
5147 
5148 	TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
5149 	TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
5150 
5151 	/* Validate obuf */
5152 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5153 			ciphertext,
5154 			tdata->ciphertext.data,
5155 			tdata->ciphertext.len,
5156 			"GCM Ciphertext data not as expected");
5157 
5158 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5159 			auth_tag,
5160 			tdata->auth_tag.data,
5161 			tdata->auth_tag.len,
5162 			"GCM Generated auth tag not as expected");
5163 
5164 	return 0;
5165 
5166 }
5167 
5168 static int
5169 test_mb_AES_GCM_authenticated_encryption_sessionless(void)
5170 {
5171 	return test_AES_GCM_authenticated_encryption_sessionless(
5172 			&gcm_test_case_5);
5173 }
5174 
5175 static int
5176 test_AES_GCM_authenticated_decryption_sessionless(
5177 		const struct gcm_test_data *tdata)
5178 {
5179 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5180 	struct crypto_unittest_params *ut_params = &unittest_params;
5181 
5182 	int retval;
5183 	uint8_t *plaintext;
5184 	uint8_t key[tdata->key.len + 1];
5185 
5186 	/* alloc mbuf and set payload */
5187 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5188 
5189 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5190 			rte_pktmbuf_tailroom(ut_params->ibuf));
5191 
5192 	/* Create GCM operation */
5193 	retval = create_gcm_operation(RTE_CRYPTO_CIPHER_OP_DECRYPT, tdata);
5194 	if (retval < 0)
5195 		return retval;
5196 
5197 	/* Create GCM xforms */
5198 	memcpy(key, tdata->key.data, tdata->key.len);
5199 	retval = create_gcm_xforms(ut_params->op,
5200 			RTE_CRYPTO_CIPHER_OP_DECRYPT,
5201 			key, tdata->key.len,
5202 			tdata->aad.len, tdata->auth_tag.len,
5203 			RTE_CRYPTO_AUTH_OP_VERIFY);
5204 	if (retval < 0)
5205 		return retval;
5206 
5207 	ut_params->op->sym->m_src = ut_params->ibuf;
5208 
5209 	TEST_ASSERT_EQUAL(ut_params->op->sym->sess_type,
5210 			RTE_CRYPTO_SYM_OP_SESSIONLESS,
5211 			"crypto op session type not sessionless");
5212 
5213 	/* Process crypto operation */
5214 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5215 			ut_params->op), "failed to process sym crypto op");
5216 
5217 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
5218 
5219 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5220 			"crypto op status not success");
5221 
5222 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
5223 			ut_params->op->sym->cipher.data.offset);
5224 
5225 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
5226 
5227 	/* Validate obuf */
5228 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5229 			plaintext,
5230 			tdata->plaintext.data,
5231 			tdata->plaintext.len,
5232 			"GCM plaintext data not as expected");
5233 
5234 	TEST_ASSERT_EQUAL(ut_params->op->status,
5235 			RTE_CRYPTO_OP_STATUS_SUCCESS,
5236 			"GCM authentication failed");
5237 	return 0;
5238 }
5239 
5240 static int
5241 test_mb_AES_GCM_authenticated_decryption_sessionless(void)
5242 {
5243 	return test_AES_GCM_authenticated_decryption_sessionless(
5244 			&gcm_test_case_5);
5245 }
5246 
5247 static int
5248 test_stats(void)
5249 {
5250 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5251 	struct rte_cryptodev_stats stats;
5252 	struct rte_cryptodev *dev;
5253 	cryptodev_stats_get_t temp_pfn;
5254 
5255 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5256 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
5257 			&stats) == -ENODEV),
5258 		"rte_cryptodev_stats_get invalid dev failed");
5259 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
5260 		"rte_cryptodev_stats_get invalid Param failed");
5261 	dev = &rte_cryptodevs[ts_params->valid_devs[0]];
5262 	temp_pfn = dev->dev_ops->stats_get;
5263 	dev->dev_ops->stats_get = (cryptodev_stats_get_t)0;
5264 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
5265 			== -ENOTSUP),
5266 		"rte_cryptodev_stats_get invalid Param failed");
5267 	dev->dev_ops->stats_get = temp_pfn;
5268 
5269 	/* Test expected values */
5270 	ut_setup();
5271 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
5272 	ut_teardown();
5273 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5274 			&stats),
5275 		"rte_cryptodev_stats_get failed");
5276 	TEST_ASSERT((stats.enqueued_count == 1),
5277 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5278 	TEST_ASSERT((stats.dequeued_count == 1),
5279 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5280 	TEST_ASSERT((stats.enqueue_err_count == 0),
5281 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5282 	TEST_ASSERT((stats.dequeue_err_count == 0),
5283 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5284 
5285 	/* invalid device but should ignore and not reset device stats*/
5286 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
5287 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5288 			&stats),
5289 		"rte_cryptodev_stats_get failed");
5290 	TEST_ASSERT((stats.enqueued_count == 1),
5291 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5292 
5293 	/* check that a valid reset clears stats */
5294 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
5295 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
5296 			&stats),
5297 					  "rte_cryptodev_stats_get failed");
5298 	TEST_ASSERT((stats.enqueued_count == 0),
5299 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5300 	TEST_ASSERT((stats.dequeued_count == 0),
5301 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
5302 
5303 	return TEST_SUCCESS;
5304 }
5305 
5306 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
5307 				   struct crypto_unittest_params *ut_params,
5308 				   enum rte_crypto_auth_operation op,
5309 				   const struct HMAC_MD5_vector *test_case)
5310 {
5311 	uint8_t key[64];
5312 
5313 	memcpy(key, test_case->key.data, test_case->key.len);
5314 
5315 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5316 	ut_params->auth_xform.next = NULL;
5317 	ut_params->auth_xform.auth.op = op;
5318 
5319 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
5320 
5321 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
5322 	ut_params->auth_xform.auth.add_auth_data_length = 0;
5323 	ut_params->auth_xform.auth.key.length = test_case->key.len;
5324 	ut_params->auth_xform.auth.key.data = key;
5325 
5326 	ut_params->sess = rte_cryptodev_sym_session_create(
5327 		ts_params->valid_devs[0], &ut_params->auth_xform);
5328 
5329 	if (ut_params->sess == NULL)
5330 		return TEST_FAILED;
5331 
5332 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5333 
5334 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5335 			rte_pktmbuf_tailroom(ut_params->ibuf));
5336 
5337 	return 0;
5338 }
5339 
5340 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
5341 			      const struct HMAC_MD5_vector *test_case,
5342 			      uint8_t **plaintext)
5343 {
5344 	uint16_t plaintext_pad_len;
5345 
5346 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5347 
5348 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5349 				16);
5350 
5351 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5352 			plaintext_pad_len);
5353 	memcpy(*plaintext, test_case->plaintext.data,
5354 			test_case->plaintext.len);
5355 
5356 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
5357 			ut_params->ibuf, MD5_DIGEST_LEN);
5358 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
5359 			"no room to append digest");
5360 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
5361 			ut_params->ibuf, plaintext_pad_len);
5362 	sym_op->auth.digest.length = MD5_DIGEST_LEN;
5363 
5364 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
5365 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
5366 			   test_case->auth_tag.len);
5367 	}
5368 
5369 	sym_op->auth.data.offset = 0;
5370 	sym_op->auth.data.length = test_case->plaintext.len;
5371 
5372 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5373 	ut_params->op->sym->m_src = ut_params->ibuf;
5374 
5375 	return 0;
5376 }
5377 
5378 static int
5379 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
5380 {
5381 	uint16_t plaintext_pad_len;
5382 	uint8_t *plaintext, *auth_tag;
5383 
5384 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5385 	struct crypto_unittest_params *ut_params = &unittest_params;
5386 
5387 	if (MD5_HMAC_create_session(ts_params, ut_params,
5388 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
5389 		return TEST_FAILED;
5390 
5391 	/* Generate Crypto op data structure */
5392 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5393 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5394 	TEST_ASSERT_NOT_NULL(ut_params->op,
5395 			"Failed to allocate symmetric crypto operation struct");
5396 
5397 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
5398 				16);
5399 
5400 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5401 		return TEST_FAILED;
5402 
5403 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5404 			ut_params->op), "failed to process sym crypto op");
5405 
5406 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5407 			"crypto op processing failed");
5408 
5409 	if (ut_params->op->sym->m_dst) {
5410 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
5411 				uint8_t *, plaintext_pad_len);
5412 	} else {
5413 		auth_tag = plaintext + plaintext_pad_len;
5414 	}
5415 
5416 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5417 			auth_tag,
5418 			test_case->auth_tag.data,
5419 			test_case->auth_tag.len,
5420 			"HMAC_MD5 generated tag not as expected");
5421 
5422 	return TEST_SUCCESS;
5423 }
5424 
5425 static int
5426 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
5427 {
5428 	uint8_t *plaintext;
5429 
5430 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5431 	struct crypto_unittest_params *ut_params = &unittest_params;
5432 
5433 	if (MD5_HMAC_create_session(ts_params, ut_params,
5434 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
5435 		return TEST_FAILED;
5436 	}
5437 
5438 	/* Generate Crypto op data structure */
5439 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5440 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5441 	TEST_ASSERT_NOT_NULL(ut_params->op,
5442 			"Failed to allocate symmetric crypto operation struct");
5443 
5444 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
5445 		return TEST_FAILED;
5446 
5447 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
5448 			ut_params->op), "failed to process sym crypto op");
5449 
5450 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5451 			"HMAC_MD5 crypto op processing failed");
5452 
5453 	return TEST_SUCCESS;
5454 }
5455 
5456 static int
5457 test_MD5_HMAC_generate_case_1(void)
5458 {
5459 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
5460 }
5461 
5462 static int
5463 test_MD5_HMAC_verify_case_1(void)
5464 {
5465 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
5466 }
5467 
5468 static int
5469 test_MD5_HMAC_generate_case_2(void)
5470 {
5471 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
5472 }
5473 
5474 static int
5475 test_MD5_HMAC_verify_case_2(void)
5476 {
5477 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
5478 }
5479 
5480 static int
5481 test_multi_session(void)
5482 {
5483 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5484 	struct crypto_unittest_params *ut_params = &unittest_params;
5485 
5486 	struct rte_cryptodev_info dev_info;
5487 	struct rte_cryptodev_sym_session **sessions;
5488 
5489 	uint16_t i;
5490 
5491 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
5492 			aes_cbc_key, hmac_sha512_key);
5493 
5494 
5495 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5496 
5497 	sessions = rte_malloc(NULL,
5498 			(sizeof(struct rte_cryptodev_sym_session *) *
5499 			dev_info.sym.max_nb_sessions) + 1, 0);
5500 
5501 	/* Create multiple crypto sessions*/
5502 	for (i = 0; i < dev_info.sym.max_nb_sessions; i++) {
5503 		sessions[i] = rte_cryptodev_sym_session_create(
5504 				ts_params->valid_devs[0],
5505 			&ut_params->auth_xform);
5506 		TEST_ASSERT_NOT_NULL(sessions[i],
5507 				"Session creation failed at session number %u",
5508 				i);
5509 
5510 		/* Attempt to send a request on each session */
5511 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
5512 			sessions[i],
5513 			ut_params,
5514 			ts_params,
5515 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
5516 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
5517 			aes_cbc_iv),
5518 			"Failed to perform decrypt on request number %u.", i);
5519 		/* free crypto operation structure */
5520 		if (ut_params->op)
5521 			rte_crypto_op_free(ut_params->op);
5522 
5523 		/*
5524 		 * free mbuf - both obuf and ibuf are usually the same,
5525 		 * so check if they point at the same address is necessary,
5526 		 * to avoid freeing the mbuf twice.
5527 		 */
5528 		if (ut_params->obuf) {
5529 			rte_pktmbuf_free(ut_params->obuf);
5530 			if (ut_params->ibuf == ut_params->obuf)
5531 				ut_params->ibuf = 0;
5532 			ut_params->obuf = 0;
5533 		}
5534 		if (ut_params->ibuf) {
5535 			rte_pktmbuf_free(ut_params->ibuf);
5536 			ut_params->ibuf = 0;
5537 		}
5538 	}
5539 
5540 	/* Next session create should fail */
5541 	sessions[i] = rte_cryptodev_sym_session_create(ts_params->valid_devs[0],
5542 			&ut_params->auth_xform);
5543 	TEST_ASSERT_NULL(sessions[i],
5544 			"Session creation succeeded unexpectedly!");
5545 
5546 	for (i = 0; i < dev_info.sym.max_nb_sessions; i++)
5547 		rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
5548 				sessions[i]);
5549 
5550 	rte_free(sessions);
5551 
5552 	return TEST_SUCCESS;
5553 }
5554 
5555 struct multi_session_params {
5556 	struct crypto_unittest_params ut_params;
5557 	uint8_t *cipher_key;
5558 	uint8_t *hmac_key;
5559 	const uint8_t *cipher;
5560 	const uint8_t *digest;
5561 	uint8_t *iv;
5562 };
5563 
5564 #define MB_SESSION_NUMBER 3
5565 
5566 static int
5567 test_multi_session_random_usage(void)
5568 {
5569 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5570 	struct rte_cryptodev_info dev_info;
5571 	struct rte_cryptodev_sym_session **sessions;
5572 	uint32_t i, j;
5573 	struct multi_session_params ut_paramz[] = {
5574 
5575 		{
5576 			.cipher_key = ms_aes_cbc_key0,
5577 			.hmac_key = ms_hmac_key0,
5578 			.cipher = ms_aes_cbc_cipher0,
5579 			.digest = ms_hmac_digest0,
5580 			.iv = ms_aes_cbc_iv0
5581 		},
5582 		{
5583 			.cipher_key = ms_aes_cbc_key1,
5584 			.hmac_key = ms_hmac_key1,
5585 			.cipher = ms_aes_cbc_cipher1,
5586 			.digest = ms_hmac_digest1,
5587 			.iv = ms_aes_cbc_iv1
5588 		},
5589 		{
5590 			.cipher_key = ms_aes_cbc_key2,
5591 			.hmac_key = ms_hmac_key2,
5592 			.cipher = ms_aes_cbc_cipher2,
5593 			.digest = ms_hmac_digest2,
5594 			.iv = ms_aes_cbc_iv2
5595 		},
5596 
5597 	};
5598 
5599 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5600 
5601 	sessions = rte_malloc(NULL,
5602 			(sizeof(struct rte_cryptodev_sym_session *)
5603 					* dev_info.sym.max_nb_sessions) + 1, 0);
5604 
5605 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
5606 		rte_memcpy(&ut_paramz[i].ut_params, &testsuite_params,
5607 				sizeof(struct crypto_unittest_params));
5608 
5609 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
5610 				&ut_paramz[i].ut_params,
5611 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
5612 
5613 		/* Create multiple crypto sessions*/
5614 		sessions[i] = rte_cryptodev_sym_session_create(
5615 				ts_params->valid_devs[0],
5616 				&ut_paramz[i].ut_params.auth_xform);
5617 
5618 		TEST_ASSERT_NOT_NULL(sessions[i],
5619 				"Session creation failed at session number %u",
5620 				i);
5621 
5622 	}
5623 
5624 	srand(time(NULL));
5625 	for (i = 0; i < 40000; i++) {
5626 
5627 		j = rand() % MB_SESSION_NUMBER;
5628 
5629 		TEST_ASSERT_SUCCESS(
5630 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
5631 					sessions[j],
5632 					&ut_paramz[j].ut_params,
5633 					ts_params, ut_paramz[j].cipher,
5634 					ut_paramz[j].digest,
5635 					ut_paramz[j].iv),
5636 			"Failed to perform decrypt on request number %u.", i);
5637 
5638 		if (ut_paramz[j].ut_params.op)
5639 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
5640 
5641 		/*
5642 		 * free mbuf - both obuf and ibuf are usually the same,
5643 		 * so check if they point at the same address is necessary,
5644 		 * to avoid freeing the mbuf twice.
5645 		 */
5646 		if (ut_paramz[j].ut_params.obuf) {
5647 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
5648 			if (ut_paramz[j].ut_params.ibuf
5649 					== ut_paramz[j].ut_params.obuf)
5650 				ut_paramz[j].ut_params.ibuf = 0;
5651 			ut_paramz[j].ut_params.obuf = 0;
5652 		}
5653 		if (ut_paramz[j].ut_params.ibuf) {
5654 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
5655 			ut_paramz[j].ut_params.ibuf = 0;
5656 		}
5657 	}
5658 
5659 	for (i = 0; i < MB_SESSION_NUMBER; i++)
5660 		rte_cryptodev_sym_session_free(ts_params->valid_devs[0],
5661 				sessions[i]);
5662 
5663 	rte_free(sessions);
5664 
5665 	return TEST_SUCCESS;
5666 }
5667 
5668 static int
5669 test_null_cipher_only_operation(void)
5670 {
5671 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5672 	struct crypto_unittest_params *ut_params = &unittest_params;
5673 
5674 	/* Generate test mbuf data and space for digest */
5675 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
5676 			catch_22_quote, QUOTE_512_BYTES, 0);
5677 
5678 	/* Setup Cipher Parameters */
5679 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5680 	ut_params->cipher_xform.next = NULL;
5681 
5682 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
5683 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
5684 
5685 	/* Create Crypto session*/
5686 	ut_params->sess = rte_cryptodev_sym_session_create(
5687 			ts_params->valid_devs[0], &ut_params->cipher_xform);
5688 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
5689 
5690 	/* Generate Crypto op data structure */
5691 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5692 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5693 	TEST_ASSERT_NOT_NULL(ut_params->op,
5694 			"Failed to allocate symmetric crypto operation struct");
5695 
5696 	/* Set crypto operation data parameters */
5697 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5698 
5699 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5700 
5701 	/* set crypto operation source mbuf */
5702 	sym_op->m_src = ut_params->ibuf;
5703 
5704 	sym_op->cipher.data.offset = 0;
5705 	sym_op->cipher.data.length = QUOTE_512_BYTES;
5706 
5707 	/* Process crypto operation */
5708 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5709 			ut_params->op);
5710 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
5711 
5712 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5713 			"crypto operation processing failed");
5714 
5715 	/* Validate obuf */
5716 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5717 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
5718 			catch_22_quote,
5719 			QUOTE_512_BYTES,
5720 			"Ciphertext data not as expected");
5721 
5722 	return TEST_SUCCESS;
5723 }
5724 
5725 static int
5726 test_null_auth_only_operation(void)
5727 {
5728 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5729 	struct crypto_unittest_params *ut_params = &unittest_params;
5730 
5731 	/* Generate test mbuf data and space for digest */
5732 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
5733 			catch_22_quote, QUOTE_512_BYTES, 0);
5734 
5735 	/* Setup HMAC Parameters */
5736 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5737 	ut_params->auth_xform.next = NULL;
5738 
5739 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
5740 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
5741 
5742 	/* Create Crypto session*/
5743 	ut_params->sess = rte_cryptodev_sym_session_create(
5744 			ts_params->valid_devs[0], &ut_params->auth_xform);
5745 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
5746 
5747 	/* Generate Crypto op data structure */
5748 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5749 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5750 	TEST_ASSERT_NOT_NULL(ut_params->op,
5751 			"Failed to allocate symmetric crypto operation struct");
5752 
5753 	/* Set crypto operation data parameters */
5754 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5755 
5756 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5757 
5758 	sym_op->m_src = ut_params->ibuf;
5759 
5760 	sym_op->auth.data.offset = 0;
5761 	sym_op->auth.data.length = QUOTE_512_BYTES;
5762 
5763 	/* Process crypto operation */
5764 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5765 			ut_params->op);
5766 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
5767 
5768 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5769 			"crypto operation processing failed");
5770 
5771 	return TEST_SUCCESS;
5772 }
5773 
5774 static int
5775 test_null_cipher_auth_operation(void)
5776 {
5777 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5778 	struct crypto_unittest_params *ut_params = &unittest_params;
5779 
5780 	/* Generate test mbuf data and space for digest */
5781 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
5782 			catch_22_quote, QUOTE_512_BYTES, 0);
5783 
5784 	/* Setup Cipher Parameters */
5785 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5786 	ut_params->cipher_xform.next = &ut_params->auth_xform;
5787 
5788 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
5789 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
5790 
5791 	/* Setup HMAC Parameters */
5792 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5793 	ut_params->auth_xform.next = NULL;
5794 
5795 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
5796 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
5797 
5798 	/* Create Crypto session*/
5799 	ut_params->sess = rte_cryptodev_sym_session_create(
5800 			ts_params->valid_devs[0], &ut_params->cipher_xform);
5801 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
5802 
5803 	/* Generate Crypto op data structure */
5804 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5805 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5806 	TEST_ASSERT_NOT_NULL(ut_params->op,
5807 			"Failed to allocate symmetric crypto operation struct");
5808 
5809 	/* Set crypto operation data parameters */
5810 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5811 
5812 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5813 
5814 	sym_op->m_src = ut_params->ibuf;
5815 
5816 	sym_op->cipher.data.offset = 0;
5817 	sym_op->cipher.data.length = QUOTE_512_BYTES;
5818 
5819 	sym_op->auth.data.offset = 0;
5820 	sym_op->auth.data.length = QUOTE_512_BYTES;
5821 
5822 	/* Process crypto operation */
5823 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5824 			ut_params->op);
5825 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
5826 
5827 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5828 			"crypto operation processing failed");
5829 
5830 	/* Validate obuf */
5831 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5832 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
5833 			catch_22_quote,
5834 			QUOTE_512_BYTES,
5835 			"Ciphertext data not as expected");
5836 
5837 	return TEST_SUCCESS;
5838 }
5839 
5840 static int
5841 test_null_auth_cipher_operation(void)
5842 {
5843 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5844 	struct crypto_unittest_params *ut_params = &unittest_params;
5845 
5846 	/* Generate test mbuf data and space for digest */
5847 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
5848 			catch_22_quote, QUOTE_512_BYTES, 0);
5849 
5850 	/* Setup Cipher Parameters */
5851 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5852 	ut_params->cipher_xform.next = NULL;
5853 
5854 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
5855 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
5856 
5857 	/* Setup HMAC Parameters */
5858 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5859 	ut_params->auth_xform.next = &ut_params->cipher_xform;
5860 
5861 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
5862 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
5863 
5864 	/* Create Crypto session*/
5865 	ut_params->sess = rte_cryptodev_sym_session_create(
5866 			ts_params->valid_devs[0], &ut_params->cipher_xform);
5867 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
5868 
5869 	/* Generate Crypto op data structure */
5870 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
5871 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
5872 	TEST_ASSERT_NOT_NULL(ut_params->op,
5873 			"Failed to allocate symmetric crypto operation struct");
5874 
5875 	/* Set crypto operation data parameters */
5876 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
5877 
5878 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
5879 
5880 	sym_op->m_src = ut_params->ibuf;
5881 
5882 	sym_op->cipher.data.offset = 0;
5883 	sym_op->cipher.data.length = QUOTE_512_BYTES;
5884 
5885 	sym_op->auth.data.offset = 0;
5886 	sym_op->auth.data.length = QUOTE_512_BYTES;
5887 
5888 	/* Process crypto operation */
5889 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5890 			ut_params->op);
5891 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
5892 
5893 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
5894 			"crypto operation processing failed");
5895 
5896 	/* Validate obuf */
5897 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5898 			rte_pktmbuf_mtod(ut_params->op->sym->m_src, uint8_t *),
5899 			catch_22_quote,
5900 			QUOTE_512_BYTES,
5901 			"Ciphertext data not as expected");
5902 
5903 	return TEST_SUCCESS;
5904 }
5905 
5906 
5907 static int
5908 test_null_invalid_operation(void)
5909 {
5910 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5911 	struct crypto_unittest_params *ut_params = &unittest_params;
5912 
5913 	/* Setup Cipher Parameters */
5914 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5915 	ut_params->cipher_xform.next = NULL;
5916 
5917 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
5918 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
5919 
5920 	/* Create Crypto session*/
5921 	ut_params->sess = rte_cryptodev_sym_session_create(
5922 			ts_params->valid_devs[0], &ut_params->cipher_xform);
5923 	TEST_ASSERT_NULL(ut_params->sess,
5924 			"Session creation succeeded unexpectedly");
5925 
5926 
5927 	/* Setup HMAC Parameters */
5928 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5929 	ut_params->auth_xform.next = NULL;
5930 
5931 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
5932 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
5933 
5934 	/* Create Crypto session*/
5935 	ut_params->sess = rte_cryptodev_sym_session_create(
5936 			ts_params->valid_devs[0], &ut_params->auth_xform);
5937 	TEST_ASSERT_NULL(ut_params->sess,
5938 			"Session creation succeeded unexpectedly");
5939 
5940 	return TEST_SUCCESS;
5941 }
5942 
5943 
5944 #define NULL_BURST_LENGTH (32)
5945 
5946 static int
5947 test_null_burst_operation(void)
5948 {
5949 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5950 	struct crypto_unittest_params *ut_params = &unittest_params;
5951 
5952 	unsigned i, burst_len = NULL_BURST_LENGTH;
5953 
5954 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
5955 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
5956 
5957 	/* Setup Cipher Parameters */
5958 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5959 	ut_params->cipher_xform.next = &ut_params->auth_xform;
5960 
5961 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
5962 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
5963 
5964 	/* Setup HMAC Parameters */
5965 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5966 	ut_params->auth_xform.next = NULL;
5967 
5968 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
5969 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
5970 
5971 	/* Create Crypto session*/
5972 	ut_params->sess = rte_cryptodev_sym_session_create(
5973 			ts_params->valid_devs[0], &ut_params->cipher_xform);
5974 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
5975 
5976 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
5977 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
5978 			burst_len, "failed to generate burst of crypto ops");
5979 
5980 	/* Generate an operation for each mbuf in burst */
5981 	for (i = 0; i < burst_len; i++) {
5982 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5983 
5984 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
5985 
5986 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
5987 				sizeof(unsigned));
5988 		*data = i;
5989 
5990 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
5991 
5992 		burst[i]->sym->m_src = m;
5993 	}
5994 
5995 	/* Process crypto operation */
5996 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
5997 			0, burst, burst_len),
5998 			burst_len,
5999 			"Error enqueuing burst");
6000 
6001 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
6002 			0, burst_dequeued, burst_len),
6003 			burst_len,
6004 			"Error dequeuing burst");
6005 
6006 
6007 	for (i = 0; i < burst_len; i++) {
6008 		TEST_ASSERT_EQUAL(
6009 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
6010 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
6011 					uint32_t *),
6012 			"data not as expected");
6013 
6014 		rte_pktmbuf_free(burst[i]->sym->m_src);
6015 		rte_crypto_op_free(burst[i]);
6016 	}
6017 
6018 	return TEST_SUCCESS;
6019 }
6020 
6021 static void
6022 generate_gmac_large_plaintext(uint8_t *data)
6023 {
6024 	uint16_t i;
6025 
6026 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
6027 		memcpy(&data[i], &data[0], 32);
6028 }
6029 
6030 static int
6031 create_gmac_operation(enum rte_crypto_auth_operation op,
6032 		const struct gmac_test_data *tdata)
6033 {
6034 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6035 	struct crypto_unittest_params *ut_params = &unittest_params;
6036 	struct rte_crypto_sym_op *sym_op;
6037 
6038 	unsigned iv_pad_len;
6039 	unsigned aad_pad_len;
6040 
6041 	iv_pad_len = RTE_ALIGN_CEIL(tdata->iv.len, 16);
6042 	aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
6043 
6044 	/*
6045 	 * Runtime generate the large plain text instead of use hard code
6046 	 * plain text vector. It is done to avoid create huge source file
6047 	 * with the test vector.
6048 	 */
6049 	if (tdata->aad.len == GMAC_LARGE_PLAINTEXT_LENGTH)
6050 		generate_gmac_large_plaintext(tdata->aad.data);
6051 
6052 	/* Generate Crypto op data structure */
6053 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6054 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6055 	TEST_ASSERT_NOT_NULL(ut_params->op,
6056 			"Failed to allocate symmetric crypto operation struct");
6057 
6058 	sym_op = ut_params->op->sym;
6059 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6060 			aad_pad_len);
6061 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
6062 			"no room to append aad");
6063 
6064 	sym_op->auth.aad.length = tdata->aad.len;
6065 	sym_op->auth.aad.phys_addr =
6066 			rte_pktmbuf_mtophys(ut_params->ibuf);
6067 	memcpy(sym_op->auth.aad.data, tdata->aad.data, tdata->aad.len);
6068 
6069 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6070 			ut_params->ibuf, tdata->gmac_tag.len);
6071 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6072 			"no room to append digest");
6073 
6074 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6075 			ut_params->ibuf, aad_pad_len);
6076 	sym_op->auth.digest.length = tdata->gmac_tag.len;
6077 
6078 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
6079 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
6080 				tdata->gmac_tag.len);
6081 		TEST_HEXDUMP(stdout, "digest:",
6082 				sym_op->auth.digest.data,
6083 				sym_op->auth.digest.length);
6084 	}
6085 
6086 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
6087 			ut_params->ibuf, iv_pad_len);
6088 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
6089 
6090 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
6091 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
6092 	sym_op->cipher.iv.length = tdata->iv.len;
6093 
6094 	rte_memcpy(sym_op->cipher.iv.data, tdata->iv.data, tdata->iv.len);
6095 
6096 	TEST_HEXDUMP(stdout, "iv:", sym_op->cipher.iv.data, iv_pad_len);
6097 
6098 	sym_op->cipher.data.length = 0;
6099 	sym_op->cipher.data.offset = 0;
6100 
6101 	sym_op->auth.data.offset = 0;
6102 	sym_op->auth.data.length = 0;
6103 
6104 	return 0;
6105 }
6106 
6107 static int create_gmac_session(uint8_t dev_id,
6108 		enum rte_crypto_cipher_operation op,
6109 		const struct gmac_test_data *tdata,
6110 		enum rte_crypto_auth_operation auth_op)
6111 {
6112 	uint8_t cipher_key[tdata->key.len];
6113 
6114 	struct crypto_unittest_params *ut_params = &unittest_params;
6115 
6116 	memcpy(cipher_key, tdata->key.data, tdata->key.len);
6117 
6118 	/* For GMAC we setup cipher parameters */
6119 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6120 	ut_params->cipher_xform.next = NULL;
6121 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_GCM;
6122 	ut_params->cipher_xform.cipher.op = op;
6123 	ut_params->cipher_xform.cipher.key.data = cipher_key;
6124 	ut_params->cipher_xform.cipher.key.length = tdata->key.len;
6125 
6126 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6127 	ut_params->auth_xform.next = NULL;
6128 
6129 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
6130 	ut_params->auth_xform.auth.op = auth_op;
6131 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
6132 	ut_params->auth_xform.auth.add_auth_data_length = 0;
6133 	ut_params->auth_xform.auth.key.length = 0;
6134 	ut_params->auth_xform.auth.key.data = NULL;
6135 
6136 	ut_params->cipher_xform.next = &ut_params->auth_xform;
6137 
6138 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
6139 			&ut_params->cipher_xform);
6140 
6141 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6142 
6143 	return 0;
6144 }
6145 
6146 static int
6147 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
6148 {
6149 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6150 	struct crypto_unittest_params *ut_params = &unittest_params;
6151 
6152 	int retval;
6153 
6154 	uint8_t *auth_tag, *p;
6155 	uint16_t aad_pad_len;
6156 
6157 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6158 			      "No GMAC length in the source data");
6159 
6160 	retval = create_gmac_session(ts_params->valid_devs[0],
6161 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6162 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
6163 
6164 	if (retval < 0)
6165 		return retval;
6166 
6167 	if (tdata->aad.len > MBUF_SIZE)
6168 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6169 	else
6170 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6171 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6172 			"Failed to allocate input buffer in mempool");
6173 
6174 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6175 			rte_pktmbuf_tailroom(ut_params->ibuf));
6176 
6177 	aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
6178 
6179 	p = rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *);
6180 
6181 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
6182 			tdata);
6183 
6184 	if (retval < 0)
6185 		return retval;
6186 
6187 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6188 
6189 	ut_params->op->sym->m_src = ut_params->ibuf;
6190 
6191 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6192 			ut_params->op), "failed to process sym crypto op");
6193 
6194 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6195 			"crypto op processing failed");
6196 
6197 	if (ut_params->op->sym->m_dst) {
6198 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
6199 				uint8_t *, aad_pad_len);
6200 	} else {
6201 		auth_tag = p + aad_pad_len;
6202 	}
6203 
6204 	TEST_HEXDUMP(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
6205 
6206 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6207 			auth_tag,
6208 			tdata->gmac_tag.data,
6209 			tdata->gmac_tag.len,
6210 			"GMAC Generated auth tag not as expected");
6211 
6212 	return 0;
6213 }
6214 
6215 static int
6216 test_AES_GMAC_authentication_test_case_1(void)
6217 {
6218 	return test_AES_GMAC_authentication(&gmac_test_case_1);
6219 }
6220 
6221 static int
6222 test_AES_GMAC_authentication_test_case_2(void)
6223 {
6224 	return test_AES_GMAC_authentication(&gmac_test_case_2);
6225 }
6226 
6227 static int
6228 test_AES_GMAC_authentication_test_case_3(void)
6229 {
6230 	return test_AES_GMAC_authentication(&gmac_test_case_3);
6231 }
6232 
6233 static int
6234 test_AES_GMAC_authentication_test_case_4(void)
6235 {
6236 	return test_AES_GMAC_authentication(&gmac_test_case_4);
6237 }
6238 
6239 static int
6240 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
6241 {
6242 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6243 	struct crypto_unittest_params *ut_params = &unittest_params;
6244 	int retval;
6245 
6246 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
6247 			      "No GMAC length in the source data");
6248 
6249 	retval = create_gmac_session(ts_params->valid_devs[0],
6250 			RTE_CRYPTO_CIPHER_OP_DECRYPT,
6251 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
6252 
6253 	if (retval < 0)
6254 		return retval;
6255 
6256 	if (tdata->aad.len > MBUF_SIZE)
6257 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
6258 	else
6259 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6260 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6261 			"Failed to allocate input buffer in mempool");
6262 
6263 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6264 			rte_pktmbuf_tailroom(ut_params->ibuf));
6265 
6266 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
6267 			tdata);
6268 
6269 	if (retval < 0)
6270 		return retval;
6271 
6272 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6273 
6274 	ut_params->op->sym->m_src = ut_params->ibuf;
6275 
6276 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
6277 			ut_params->op), "failed to process sym crypto op");
6278 
6279 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6280 			"crypto op processing failed");
6281 
6282 	return 0;
6283 
6284 }
6285 
6286 static int
6287 test_AES_GMAC_authentication_verify_test_case_1(void)
6288 {
6289 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
6290 }
6291 
6292 static int
6293 test_AES_GMAC_authentication_verify_test_case_2(void)
6294 {
6295 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
6296 }
6297 
6298 static int
6299 test_AES_GMAC_authentication_verify_test_case_3(void)
6300 {
6301 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
6302 }
6303 
6304 static int
6305 test_AES_GMAC_authentication_verify_test_case_4(void)
6306 {
6307 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
6308 }
6309 
6310 struct test_crypto_vector {
6311 	enum rte_crypto_cipher_algorithm crypto_algo;
6312 
6313 	struct {
6314 		uint8_t data[64];
6315 		unsigned int len;
6316 	} cipher_key;
6317 
6318 	struct {
6319 		uint8_t data[64];
6320 		unsigned int len;
6321 	} iv;
6322 
6323 	struct {
6324 		const uint8_t *data;
6325 		unsigned int len;
6326 	} plaintext;
6327 
6328 	struct {
6329 		const uint8_t *data;
6330 		unsigned int len;
6331 	} ciphertext;
6332 
6333 	enum rte_crypto_auth_algorithm auth_algo;
6334 
6335 	struct {
6336 		uint8_t data[128];
6337 		unsigned int len;
6338 	} auth_key;
6339 
6340 	struct {
6341 		const uint8_t *data;
6342 		unsigned int len;
6343 	} aad;
6344 
6345 	struct {
6346 		uint8_t data[128];
6347 		unsigned int len;
6348 	} digest;
6349 };
6350 
6351 static const struct test_crypto_vector
6352 hmac_sha1_test_crypto_vector = {
6353 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
6354 	.plaintext = {
6355 		.data = plaintext_hash,
6356 		.len = 512
6357 	},
6358 	.auth_key = {
6359 		.data = {
6360 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
6361 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
6362 			0xDE, 0xF4, 0xDE, 0xAD
6363 		},
6364 		.len = 20
6365 	},
6366 	.digest = {
6367 		.data = {
6368 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
6369 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
6370 			0x3F, 0x91, 0x64, 0x59
6371 		},
6372 		.len = 20
6373 	}
6374 };
6375 
6376 static const struct test_crypto_vector
6377 aes128_gmac_test_vector = {
6378 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
6379 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_GCM,
6380 	.aad = {
6381 		.data = plaintext_hash,
6382 		.len = 512
6383 	},
6384 	.iv = {
6385 		.data = {
6386 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6387 			0x08, 0x09, 0x0A, 0x0B
6388 		},
6389 		.len = 12
6390 	},
6391 	.cipher_key = {
6392 		.data = {
6393 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
6394 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
6395 		},
6396 		.len = 16
6397 	},
6398 	.digest = {
6399 		.data = {
6400 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
6401 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
6402 		},
6403 		.len = 16
6404 	}
6405 };
6406 
6407 static const struct test_crypto_vector
6408 aes128cbc_hmac_sha1_test_vector = {
6409 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
6410 	.cipher_key = {
6411 		.data = {
6412 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
6413 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
6414 		},
6415 		.len = 16
6416 	},
6417 	.iv = {
6418 		.data = {
6419 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
6420 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
6421 		},
6422 		.len = 16
6423 	},
6424 	.plaintext = {
6425 		.data = plaintext_hash,
6426 		.len = 512
6427 	},
6428 	.ciphertext = {
6429 		.data = ciphertext512_aes128cbc,
6430 		.len = 512
6431 	},
6432 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
6433 	.auth_key = {
6434 		.data = {
6435 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
6436 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
6437 			0xDE, 0xF4, 0xDE, 0xAD
6438 		},
6439 		.len = 20
6440 	},
6441 	.digest = {
6442 		.data = {
6443 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
6444 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
6445 			0x18, 0x8C, 0x1D, 0x32
6446 		},
6447 		.len = 20
6448 	}
6449 };
6450 
6451 static void
6452 data_corruption(uint8_t *data)
6453 {
6454 	data[0] += 1;
6455 }
6456 
6457 static void
6458 tag_corruption(uint8_t *data, unsigned int tag_offset)
6459 {
6460 	data[tag_offset] += 1;
6461 }
6462 
6463 static int
6464 create_auth_session(struct crypto_unittest_params *ut_params,
6465 		uint8_t dev_id,
6466 		const struct test_crypto_vector *reference,
6467 		enum rte_crypto_auth_operation auth_op)
6468 {
6469 	uint8_t auth_key[reference->auth_key.len + 1];
6470 
6471 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
6472 
6473 	/* Setup Authentication Parameters */
6474 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6475 	ut_params->auth_xform.auth.op = auth_op;
6476 	ut_params->auth_xform.next = NULL;
6477 	ut_params->auth_xform.auth.algo = reference->auth_algo;
6478 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
6479 	ut_params->auth_xform.auth.key.data = auth_key;
6480 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
6481 	ut_params->auth_xform.auth.add_auth_data_length = reference->aad.len;
6482 
6483 	/* Create Crypto session*/
6484 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
6485 				&ut_params->auth_xform);
6486 
6487 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6488 
6489 	return 0;
6490 }
6491 
6492 static int
6493 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
6494 		uint8_t dev_id,
6495 		const struct test_crypto_vector *reference,
6496 		enum rte_crypto_auth_operation auth_op,
6497 		enum rte_crypto_cipher_operation cipher_op)
6498 {
6499 	uint8_t cipher_key[reference->cipher_key.len + 1];
6500 	uint8_t auth_key[reference->auth_key.len + 1];
6501 
6502 	memcpy(cipher_key, reference->cipher_key.data,
6503 			reference->cipher_key.len);
6504 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
6505 
6506 	/* Setup Authentication Parameters */
6507 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6508 	ut_params->auth_xform.auth.op = auth_op;
6509 	ut_params->auth_xform.next = &ut_params->cipher_xform;
6510 	ut_params->auth_xform.auth.algo = reference->auth_algo;
6511 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
6512 	ut_params->auth_xform.auth.key.data = auth_key;
6513 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
6514 	ut_params->auth_xform.auth.add_auth_data_length = reference->aad.len;
6515 
6516 	/* Setup Cipher Parameters */
6517 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6518 	ut_params->cipher_xform.next = NULL;
6519 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
6520 	ut_params->cipher_xform.cipher.op = cipher_op;
6521 	ut_params->cipher_xform.cipher.key.data = cipher_key;
6522 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
6523 
6524 	/* Create Crypto session*/
6525 	ut_params->sess = rte_cryptodev_sym_session_create(dev_id,
6526 				&ut_params->auth_xform);
6527 
6528 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
6529 
6530 	return 0;
6531 }
6532 
6533 static int
6534 create_auth_operation(struct crypto_testsuite_params *ts_params,
6535 		struct crypto_unittest_params *ut_params,
6536 		const struct test_crypto_vector *reference,
6537 		unsigned int auth_generate)
6538 {
6539 	/* Generate Crypto op data structure */
6540 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6541 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6542 	TEST_ASSERT_NOT_NULL(ut_params->op,
6543 			"Failed to allocate pktmbuf offload");
6544 
6545 	/* Set crypto operation data parameters */
6546 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6547 
6548 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6549 
6550 	/* set crypto operation source mbuf */
6551 	sym_op->m_src = ut_params->ibuf;
6552 
6553 	/* digest */
6554 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6555 			ut_params->ibuf, reference->digest.len);
6556 
6557 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6558 			"no room to append auth tag");
6559 
6560 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6561 			ut_params->ibuf, reference->plaintext.len);
6562 	sym_op->auth.digest.length = reference->digest.len;
6563 
6564 	if (auth_generate)
6565 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
6566 	else
6567 		memcpy(sym_op->auth.digest.data,
6568 				reference->digest.data,
6569 				reference->digest.len);
6570 
6571 	TEST_HEXDUMP(stdout, "digest:",
6572 			sym_op->auth.digest.data,
6573 			sym_op->auth.digest.length);
6574 
6575 	sym_op->auth.data.length = reference->plaintext.len;
6576 	sym_op->auth.data.offset = 0;
6577 
6578 	return 0;
6579 }
6580 
6581 static int
6582 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
6583 		struct crypto_unittest_params *ut_params,
6584 		const struct test_crypto_vector *reference,
6585 		unsigned int auth_generate)
6586 {
6587 	/* Generate Crypto op data structure */
6588 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6589 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6590 	TEST_ASSERT_NOT_NULL(ut_params->op,
6591 			"Failed to allocate pktmbuf offload");
6592 
6593 	/* Set crypto operation data parameters */
6594 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6595 
6596 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6597 
6598 	/* set crypto operation source mbuf */
6599 	sym_op->m_src = ut_params->ibuf;
6600 
6601 	/* aad */
6602 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6603 			reference->aad.len);
6604 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data, "no room to append AAD");
6605 	memcpy(sym_op->auth.aad.data, reference->aad.data, reference->aad.len);
6606 
6607 	TEST_HEXDUMP(stdout, "AAD:", sym_op->auth.aad.data, reference->aad.len);
6608 
6609 	sym_op->auth.aad.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
6610 	sym_op->auth.aad.length = reference->aad.len;
6611 
6612 	/* digest */
6613 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6614 			ut_params->ibuf, reference->digest.len);
6615 
6616 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6617 			"no room to append auth tag");
6618 
6619 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6620 			ut_params->ibuf, reference->ciphertext.len);
6621 	sym_op->auth.digest.length = reference->digest.len;
6622 
6623 	if (auth_generate)
6624 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
6625 	else
6626 		memcpy(sym_op->auth.digest.data,
6627 				reference->digest.data,
6628 				reference->digest.len);
6629 
6630 	TEST_HEXDUMP(stdout, "digest:",
6631 			sym_op->auth.digest.data,
6632 			sym_op->auth.digest.length);
6633 
6634 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
6635 		ut_params->ibuf, reference->iv.len);
6636 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
6637 
6638 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
6639 	sym_op->cipher.iv.length = reference->iv.len;
6640 
6641 	memcpy(sym_op->cipher.iv.data, reference->iv.data, reference->iv.len);
6642 
6643 	sym_op->cipher.data.length = 0;
6644 	sym_op->cipher.data.offset = 0;
6645 
6646 	sym_op->auth.data.length = 0;
6647 	sym_op->auth.data.offset = 0;
6648 
6649 	return 0;
6650 }
6651 
6652 static int
6653 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
6654 		struct crypto_unittest_params *ut_params,
6655 		const struct test_crypto_vector *reference,
6656 		unsigned int auth_generate)
6657 {
6658 	/* Generate Crypto op data structure */
6659 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6660 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6661 	TEST_ASSERT_NOT_NULL(ut_params->op,
6662 			"Failed to allocate pktmbuf offload");
6663 
6664 	/* Set crypto operation data parameters */
6665 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
6666 
6667 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6668 
6669 	/* set crypto operation source mbuf */
6670 	sym_op->m_src = ut_params->ibuf;
6671 
6672 	/* digest */
6673 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
6674 			ut_params->ibuf, reference->digest.len);
6675 
6676 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6677 			"no room to append auth tag");
6678 
6679 	sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
6680 			ut_params->ibuf, reference->ciphertext.len);
6681 	sym_op->auth.digest.length = reference->digest.len;
6682 
6683 	if (auth_generate)
6684 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
6685 	else
6686 		memcpy(sym_op->auth.digest.data,
6687 				reference->digest.data,
6688 				reference->digest.len);
6689 
6690 	TEST_HEXDUMP(stdout, "digest:",
6691 			sym_op->auth.digest.data,
6692 			sym_op->auth.digest.length);
6693 
6694 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
6695 		ut_params->ibuf, reference->iv.len);
6696 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
6697 
6698 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
6699 	sym_op->cipher.iv.length = reference->iv.len;
6700 
6701 	memcpy(sym_op->cipher.iv.data, reference->iv.data, reference->iv.len);
6702 
6703 	sym_op->cipher.data.length = reference->ciphertext.len;
6704 	sym_op->cipher.data.offset = reference->iv.len;
6705 
6706 	sym_op->auth.data.length = reference->ciphertext.len;
6707 	sym_op->auth.data.offset = reference->iv.len;
6708 
6709 	return 0;
6710 }
6711 
6712 static int
6713 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
6714 		struct crypto_unittest_params *ut_params,
6715 		const struct test_crypto_vector *reference)
6716 {
6717 	return create_auth_operation(ts_params, ut_params, reference, 0);
6718 }
6719 
6720 static int
6721 create_auth_verify_GMAC_operation(
6722 		struct crypto_testsuite_params *ts_params,
6723 		struct crypto_unittest_params *ut_params,
6724 		const struct test_crypto_vector *reference)
6725 {
6726 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
6727 }
6728 
6729 static int
6730 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
6731 		struct crypto_unittest_params *ut_params,
6732 		const struct test_crypto_vector *reference)
6733 {
6734 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
6735 }
6736 
6737 static int
6738 test_authentication_verify_fail_when_data_corruption(
6739 		struct crypto_testsuite_params *ts_params,
6740 		struct crypto_unittest_params *ut_params,
6741 		const struct test_crypto_vector *reference,
6742 		unsigned int data_corrupted)
6743 {
6744 	int retval;
6745 
6746 	uint8_t *plaintext;
6747 
6748 	/* Create session */
6749 	retval = create_auth_session(ut_params,
6750 			ts_params->valid_devs[0],
6751 			reference,
6752 			RTE_CRYPTO_AUTH_OP_VERIFY);
6753 	if (retval < 0)
6754 		return retval;
6755 
6756 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6757 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6758 			"Failed to allocate input buffer in mempool");
6759 
6760 	/* clear mbuf payload */
6761 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6762 			rte_pktmbuf_tailroom(ut_params->ibuf));
6763 
6764 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6765 			reference->plaintext.len);
6766 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
6767 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
6768 
6769 	TEST_HEXDUMP(stdout, "plaintext:", plaintext, reference->plaintext.len);
6770 
6771 	/* Create operation */
6772 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
6773 
6774 	if (retval < 0)
6775 		return retval;
6776 
6777 	if (data_corrupted)
6778 		data_corruption(plaintext);
6779 	else
6780 		tag_corruption(plaintext, reference->plaintext.len);
6781 
6782 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6783 			ut_params->op);
6784 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
6785 	TEST_ASSERT_EQUAL(ut_params->op->status,
6786 			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
6787 			"authentication not failed");
6788 
6789 	ut_params->obuf = ut_params->op->sym->m_src;
6790 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
6791 
6792 	return 0;
6793 }
6794 
6795 static int
6796 test_authentication_verify_GMAC_fail_when_corruption(
6797 		struct crypto_testsuite_params *ts_params,
6798 		struct crypto_unittest_params *ut_params,
6799 		const struct test_crypto_vector *reference,
6800 		unsigned int data_corrupted)
6801 {
6802 	int retval;
6803 
6804 	/* Create session */
6805 	retval = create_auth_cipher_session(ut_params,
6806 			ts_params->valid_devs[0],
6807 			reference,
6808 			RTE_CRYPTO_AUTH_OP_VERIFY,
6809 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
6810 	if (retval < 0)
6811 		return retval;
6812 
6813 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6814 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6815 			"Failed to allocate input buffer in mempool");
6816 
6817 	/* clear mbuf payload */
6818 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6819 			rte_pktmbuf_tailroom(ut_params->ibuf));
6820 
6821 	/* Create operation */
6822 	retval = create_auth_verify_GMAC_operation(ts_params,
6823 			ut_params,
6824 			reference);
6825 
6826 	if (retval < 0)
6827 		return retval;
6828 
6829 	if (data_corrupted)
6830 		data_corruption(ut_params->op->sym->auth.aad.data);
6831 	else
6832 		tag_corruption(ut_params->op->sym->auth.aad.data,
6833 				reference->aad.len);
6834 
6835 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6836 			ut_params->op);
6837 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
6838 	TEST_ASSERT_EQUAL(ut_params->op->status,
6839 			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
6840 			"authentication not failed");
6841 
6842 	ut_params->obuf = ut_params->op->sym->m_src;
6843 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
6844 
6845 	return 0;
6846 }
6847 
6848 static int
6849 test_authenticated_decryption_fail_when_corruption(
6850 		struct crypto_testsuite_params *ts_params,
6851 		struct crypto_unittest_params *ut_params,
6852 		const struct test_crypto_vector *reference,
6853 		unsigned int data_corrupted)
6854 {
6855 	int retval;
6856 
6857 	uint8_t *ciphertext;
6858 
6859 	/* Create session */
6860 	retval = create_auth_cipher_session(ut_params,
6861 			ts_params->valid_devs[0],
6862 			reference,
6863 			RTE_CRYPTO_AUTH_OP_VERIFY,
6864 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
6865 	if (retval < 0)
6866 		return retval;
6867 
6868 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6869 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6870 			"Failed to allocate input buffer in mempool");
6871 
6872 	/* clear mbuf payload */
6873 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6874 			rte_pktmbuf_tailroom(ut_params->ibuf));
6875 
6876 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6877 			reference->ciphertext.len);
6878 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
6879 	memcpy(ciphertext, reference->ciphertext.data,
6880 			reference->ciphertext.len);
6881 
6882 	/* Create operation */
6883 	retval = create_cipher_auth_verify_operation(ts_params,
6884 			ut_params,
6885 			reference);
6886 
6887 	if (retval < 0)
6888 		return retval;
6889 
6890 	if (data_corrupted)
6891 		data_corruption(ciphertext);
6892 	else
6893 		tag_corruption(ciphertext, reference->ciphertext.len);
6894 
6895 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6896 			ut_params->op);
6897 
6898 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
6899 	TEST_ASSERT_EQUAL(ut_params->op->status,
6900 			RTE_CRYPTO_OP_STATUS_AUTH_FAILED,
6901 			"authentication not failed");
6902 
6903 	ut_params->obuf = ut_params->op->sym->m_src;
6904 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
6905 
6906 	return 0;
6907 }
6908 
6909 static int
6910 create_gcm_operation_SGL(enum rte_crypto_cipher_operation op,
6911 		const struct gcm_test_data *tdata,
6912 		void *digest_mem, uint64_t digest_phys)
6913 {
6914 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6915 	struct crypto_unittest_params *ut_params = &unittest_params;
6916 
6917 	const unsigned int auth_tag_len = tdata->auth_tag.len;
6918 	const unsigned int iv_len = tdata->iv.len;
6919 	const unsigned int aad_len = tdata->aad.len;
6920 
6921 	unsigned int iv_pad_len = 0;
6922 
6923 	/* Generate Crypto op data structure */
6924 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
6925 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
6926 	TEST_ASSERT_NOT_NULL(ut_params->op,
6927 		"Failed to allocate symmetric crypto operation struct");
6928 
6929 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
6930 
6931 	sym_op->auth.digest.data = digest_mem;
6932 
6933 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
6934 			"no room to append digest");
6935 
6936 	sym_op->auth.digest.phys_addr = digest_phys;
6937 	sym_op->auth.digest.length = auth_tag_len;
6938 
6939 	if (op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
6940 		rte_memcpy(sym_op->auth.digest.data, tdata->auth_tag.data,
6941 				auth_tag_len);
6942 		TEST_HEXDUMP(stdout, "digest:",
6943 				sym_op->auth.digest.data,
6944 				sym_op->auth.digest.length);
6945 	}
6946 
6947 	iv_pad_len = RTE_ALIGN_CEIL(iv_len, 16);
6948 
6949 	sym_op->cipher.iv.data = (uint8_t *)rte_pktmbuf_prepend(
6950 			ut_params->ibuf, iv_pad_len);
6951 
6952 	TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data,
6953 			"no room to prepend iv");
6954 
6955 	memset(sym_op->cipher.iv.data, 0, iv_pad_len);
6956 	sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
6957 	sym_op->cipher.iv.length = iv_len;
6958 
6959 	rte_memcpy(sym_op->cipher.iv.data, tdata->iv.data, iv_pad_len);
6960 
6961 	sym_op->auth.aad.data = (uint8_t *)rte_pktmbuf_prepend(
6962 			ut_params->ibuf, aad_len);
6963 	TEST_ASSERT_NOT_NULL(sym_op->auth.aad.data,
6964 			"no room to prepend aad");
6965 	sym_op->auth.aad.phys_addr = rte_pktmbuf_mtophys(
6966 			ut_params->ibuf);
6967 	sym_op->auth.aad.length = aad_len;
6968 
6969 	memset(sym_op->auth.aad.data, 0, aad_len);
6970 	rte_memcpy(sym_op->auth.aad.data, tdata->aad.data, aad_len);
6971 
6972 	TEST_HEXDUMP(stdout, "iv:", sym_op->cipher.iv.data, iv_pad_len);
6973 	TEST_HEXDUMP(stdout, "aad:",
6974 			sym_op->auth.aad.data, aad_len);
6975 
6976 	sym_op->cipher.data.length = tdata->plaintext.len;
6977 	sym_op->cipher.data.offset = aad_len + iv_pad_len;
6978 
6979 	sym_op->auth.data.offset = aad_len + iv_pad_len;
6980 	sym_op->auth.data.length = tdata->plaintext.len;
6981 
6982 	return 0;
6983 }
6984 
6985 #define SGL_MAX_NO	16
6986 
6987 static int
6988 test_AES_GCM_authenticated_encryption_SGL(const struct gcm_test_data *tdata,
6989 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
6990 {
6991 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6992 	struct crypto_unittest_params *ut_params = &unittest_params;
6993 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
6994 	int retval;
6995 	int to_trn = 0;
6996 	int to_trn_tbl[SGL_MAX_NO];
6997 	int segs = 1;
6998 	unsigned int trn_data = 0;
6999 	uint8_t *plaintext, *ciphertext, *auth_tag;
7000 
7001 	if (fragsz > tdata->plaintext.len)
7002 		fragsz = tdata->plaintext.len;
7003 
7004 	uint16_t plaintext_len = fragsz;
7005 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7006 
7007 	if (fragsz_oop > tdata->plaintext.len)
7008 		frag_size_oop = tdata->plaintext.len;
7009 
7010 	int ecx = 0;
7011 	void *digest_mem = NULL;
7012 
7013 	uint32_t prepend_len = ALIGN_POW2_ROUNDUP(tdata->iv.len, 16)
7014 			+ tdata->aad.len;
7015 
7016 	if (tdata->plaintext.len % fragsz != 0) {
7017 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
7018 			return 1;
7019 	}	else {
7020 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
7021 			return 1;
7022 	}
7023 
7024 	/*
7025 	 * For out-op-place we need to alloc another mbuf
7026 	 */
7027 	if (oop) {
7028 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7029 		rte_pktmbuf_append(ut_params->obuf,
7030 				frag_size_oop + prepend_len);
7031 		buf_oop = ut_params->obuf;
7032 	}
7033 
7034 	/* Create GCM session */
7035 	retval = create_gcm_session(ts_params->valid_devs[0],
7036 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7037 			tdata->key.data, tdata->key.len,
7038 			tdata->aad.len, tdata->auth_tag.len,
7039 			RTE_CRYPTO_AUTH_OP_GENERATE);
7040 	if (retval < 0)
7041 		return retval;
7042 
7043 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7044 
7045 	/* clear mbuf payload */
7046 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7047 			rte_pktmbuf_tailroom(ut_params->ibuf));
7048 
7049 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7050 			plaintext_len);
7051 
7052 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7053 
7054 	trn_data += plaintext_len;
7055 
7056 	buf = ut_params->ibuf;
7057 
7058 	/*
7059 	 * Loop until no more fragments
7060 	 */
7061 
7062 	while (trn_data < tdata->plaintext.len) {
7063 		++segs;
7064 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
7065 				(tdata->plaintext.len - trn_data) : fragsz;
7066 
7067 		to_trn_tbl[ecx++] = to_trn;
7068 
7069 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7070 		buf = buf->next;
7071 
7072 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
7073 				rte_pktmbuf_tailroom(buf));
7074 
7075 		/* OOP */
7076 		if (oop && !fragsz_oop) {
7077 			buf_last_oop = buf_oop->next =
7078 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
7079 			buf_oop = buf_oop->next;
7080 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7081 					0, rte_pktmbuf_tailroom(buf_oop));
7082 			rte_pktmbuf_append(buf_oop, to_trn);
7083 		}
7084 
7085 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
7086 				to_trn);
7087 
7088 		memcpy(plaintext, tdata->plaintext.data + trn_data,
7089 				to_trn);
7090 		trn_data += to_trn;
7091 		if (trn_data  == tdata->plaintext.len) {
7092 			if (oop) {
7093 				if (!fragsz_oop)
7094 					digest_mem = rte_pktmbuf_append(buf_oop,
7095 						tdata->auth_tag.len);
7096 			} else
7097 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
7098 					tdata->auth_tag.len);
7099 		}
7100 	}
7101 
7102 	uint64_t digest_phys = 0;
7103 
7104 	ut_params->ibuf->nb_segs = segs;
7105 
7106 	segs = 1;
7107 	if (fragsz_oop && oop) {
7108 		to_trn = 0;
7109 		ecx = 0;
7110 
7111 		if (frag_size_oop == tdata->plaintext.len) {
7112 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
7113 				tdata->auth_tag.len);
7114 
7115 			digest_phys = rte_pktmbuf_mtophys_offset(
7116 					ut_params->obuf,
7117 					tdata->plaintext.len + prepend_len);
7118 		}
7119 
7120 		trn_data = frag_size_oop;
7121 		while (trn_data < tdata->plaintext.len) {
7122 			++segs;
7123 			to_trn =
7124 				(tdata->plaintext.len - trn_data <
7125 						frag_size_oop) ?
7126 				(tdata->plaintext.len - trn_data) :
7127 						frag_size_oop;
7128 
7129 			to_trn_tbl[ecx++] = to_trn;
7130 
7131 			buf_last_oop = buf_oop->next =
7132 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
7133 			buf_oop = buf_oop->next;
7134 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
7135 					0, rte_pktmbuf_tailroom(buf_oop));
7136 			rte_pktmbuf_append(buf_oop, to_trn);
7137 
7138 			trn_data += to_trn;
7139 
7140 			if (trn_data  == tdata->plaintext.len) {
7141 				digest_mem = rte_pktmbuf_append(buf_oop,
7142 					tdata->auth_tag.len);
7143 			}
7144 		}
7145 
7146 		ut_params->obuf->nb_segs = segs;
7147 	}
7148 
7149 	/*
7150 	 * Place digest at the end of the last buffer
7151 	 */
7152 	if (!digest_phys)
7153 		digest_phys = rte_pktmbuf_mtophys(buf) + to_trn;
7154 	if (oop && buf_last_oop)
7155 		digest_phys = rte_pktmbuf_mtophys(buf_last_oop) + to_trn;
7156 
7157 	if (!digest_mem && !oop) {
7158 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7159 				+ tdata->auth_tag.len);
7160 		digest_phys = rte_pktmbuf_mtophys_offset(ut_params->ibuf,
7161 				tdata->plaintext.len);
7162 	}
7163 
7164 	/* Create GCM opertaion */
7165 	retval = create_gcm_operation_SGL(RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7166 			tdata, digest_mem, digest_phys);
7167 
7168 	if (retval < 0)
7169 		return retval;
7170 
7171 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7172 
7173 	ut_params->op->sym->m_src = ut_params->ibuf;
7174 	if (oop)
7175 		ut_params->op->sym->m_dst = ut_params->obuf;
7176 
7177 	/* Process crypto operation */
7178 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
7179 			ut_params->op), "failed to process sym crypto op");
7180 
7181 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7182 			"crypto op processing failed");
7183 
7184 
7185 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7186 			uint8_t *, prepend_len);
7187 	if (oop) {
7188 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7189 				uint8_t *, prepend_len);
7190 	}
7191 
7192 	if (fragsz_oop)
7193 		fragsz = fragsz_oop;
7194 
7195 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7196 			ciphertext,
7197 			tdata->ciphertext.data,
7198 			fragsz,
7199 			"GCM Ciphertext data not as expected");
7200 
7201 	buf = ut_params->op->sym->m_src->next;
7202 	if (oop)
7203 		buf = ut_params->op->sym->m_dst->next;
7204 
7205 	unsigned int off = fragsz;
7206 
7207 	ecx = 0;
7208 	while (buf) {
7209 		ciphertext = rte_pktmbuf_mtod(buf,
7210 				uint8_t *);
7211 
7212 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7213 				ciphertext,
7214 				tdata->ciphertext.data + off,
7215 				to_trn_tbl[ecx],
7216 				"GCM Ciphertext data not as expected");
7217 
7218 		off += to_trn_tbl[ecx++];
7219 		buf = buf->next;
7220 	}
7221 
7222 	auth_tag = digest_mem;
7223 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7224 			auth_tag,
7225 			tdata->auth_tag.data,
7226 			tdata->auth_tag.len,
7227 			"GCM Generated auth tag not as expected");
7228 
7229 	return 0;
7230 }
7231 
7232 #define IN_PLACE	0
7233 #define OUT_OF_PLACE	1
7234 
7235 static int
7236 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
7237 {
7238 	return test_AES_GCM_authenticated_encryption_SGL(
7239 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
7240 }
7241 
7242 static int
7243 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
7244 {
7245 	return test_AES_GCM_authenticated_encryption_SGL(
7246 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
7247 }
7248 
7249 static int
7250 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
7251 {
7252 	return test_AES_GCM_authenticated_encryption_SGL(
7253 			&gcm_test_case_8, OUT_OF_PLACE, 400,
7254 			gcm_test_case_8.plaintext.len);
7255 }
7256 
7257 static int
7258 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
7259 {
7260 
7261 	return test_AES_GCM_authenticated_encryption_SGL(
7262 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
7263 }
7264 
7265 static int
7266 test_authentication_verify_fail_when_data_corrupted(
7267 		struct crypto_testsuite_params *ts_params,
7268 		struct crypto_unittest_params *ut_params,
7269 		const struct test_crypto_vector *reference)
7270 {
7271 	return test_authentication_verify_fail_when_data_corruption(
7272 			ts_params, ut_params, reference, 1);
7273 }
7274 
7275 static int
7276 test_authentication_verify_fail_when_tag_corrupted(
7277 		struct crypto_testsuite_params *ts_params,
7278 		struct crypto_unittest_params *ut_params,
7279 		const struct test_crypto_vector *reference)
7280 {
7281 	return test_authentication_verify_fail_when_data_corruption(
7282 			ts_params, ut_params, reference, 0);
7283 }
7284 
7285 static int
7286 test_authentication_verify_GMAC_fail_when_data_corrupted(
7287 		struct crypto_testsuite_params *ts_params,
7288 		struct crypto_unittest_params *ut_params,
7289 		const struct test_crypto_vector *reference)
7290 {
7291 	return test_authentication_verify_GMAC_fail_when_corruption(
7292 			ts_params, ut_params, reference, 1);
7293 }
7294 
7295 static int
7296 test_authentication_verify_GMAC_fail_when_tag_corrupted(
7297 		struct crypto_testsuite_params *ts_params,
7298 		struct crypto_unittest_params *ut_params,
7299 		const struct test_crypto_vector *reference)
7300 {
7301 	return test_authentication_verify_GMAC_fail_when_corruption(
7302 			ts_params, ut_params, reference, 0);
7303 }
7304 
7305 static int
7306 test_authenticated_decryption_fail_when_data_corrupted(
7307 		struct crypto_testsuite_params *ts_params,
7308 		struct crypto_unittest_params *ut_params,
7309 		const struct test_crypto_vector *reference)
7310 {
7311 	return test_authenticated_decryption_fail_when_corruption(
7312 			ts_params, ut_params, reference, 1);
7313 }
7314 
7315 static int
7316 test_authenticated_decryption_fail_when_tag_corrupted(
7317 		struct crypto_testsuite_params *ts_params,
7318 		struct crypto_unittest_params *ut_params,
7319 		const struct test_crypto_vector *reference)
7320 {
7321 	return test_authenticated_decryption_fail_when_corruption(
7322 			ts_params, ut_params, reference, 0);
7323 }
7324 
7325 static int
7326 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
7327 {
7328 	return test_authentication_verify_fail_when_data_corrupted(
7329 			&testsuite_params, &unittest_params,
7330 			&hmac_sha1_test_crypto_vector);
7331 }
7332 
7333 static int
7334 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
7335 {
7336 	return test_authentication_verify_fail_when_tag_corrupted(
7337 			&testsuite_params, &unittest_params,
7338 			&hmac_sha1_test_crypto_vector);
7339 }
7340 
7341 static int
7342 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
7343 {
7344 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
7345 			&testsuite_params, &unittest_params,
7346 			&aes128_gmac_test_vector);
7347 }
7348 
7349 static int
7350 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
7351 {
7352 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
7353 			&testsuite_params, &unittest_params,
7354 			&aes128_gmac_test_vector);
7355 }
7356 
7357 static int
7358 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
7359 {
7360 	return test_authenticated_decryption_fail_when_data_corrupted(
7361 			&testsuite_params,
7362 			&unittest_params,
7363 			&aes128cbc_hmac_sha1_test_vector);
7364 }
7365 
7366 static int
7367 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
7368 {
7369 	return test_authenticated_decryption_fail_when_tag_corrupted(
7370 			&testsuite_params,
7371 			&unittest_params,
7372 			&aes128cbc_hmac_sha1_test_vector);
7373 }
7374 
7375 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
7376 
7377 /* global AESNI slave IDs for the scheduler test */
7378 uint8_t aesni_ids[2];
7379 
7380 static int
7381 test_scheduler_attach_slave_op(void)
7382 {
7383 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7384 	uint8_t sched_id = ts_params->valid_devs[0];
7385 	uint32_t nb_devs, qp_id, i, nb_devs_attached = 0;
7386 	int ret;
7387 	struct rte_cryptodev_config config = {
7388 			.nb_queue_pairs = 8,
7389 			.socket_id = SOCKET_ID_ANY,
7390 			.session_mp = {
7391 				.nb_objs = 2048,
7392 				.cache_size = 256
7393 			}
7394 	};
7395 	struct rte_cryptodev_qp_conf qp_conf = {2048};
7396 
7397 	/* create 2 AESNI_MB if necessary */
7398 	nb_devs = rte_cryptodev_count_devtype(
7399 			RTE_CRYPTODEV_AESNI_MB_PMD);
7400 	if (nb_devs < 2) {
7401 		for (i = nb_devs; i < 2; i++) {
7402 			ret = rte_eal_vdev_init(
7403 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
7404 
7405 			TEST_ASSERT(ret == 0,
7406 				"Failed to create instance %u of"
7407 				" pmd : %s",
7408 				i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7409 		}
7410 	}
7411 
7412 	/* attach 2 AESNI_MB cdevs */
7413 	for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
7414 			i++) {
7415 		struct rte_cryptodev_info info;
7416 
7417 		rte_cryptodev_info_get(i, &info);
7418 		if (info.dev_type != RTE_CRYPTODEV_AESNI_MB_PMD)
7419 			continue;
7420 
7421 		ret = rte_cryptodev_configure(i, &config);
7422 		TEST_ASSERT(ret == 0,
7423 			"Failed to configure device %u of pmd : %s", i,
7424 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7425 
7426 		for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
7427 			TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
7428 				i, qp_id, &qp_conf,
7429 				rte_cryptodev_socket_id(i)),
7430 				"Failed to setup queue pair %u on "
7431 				"cryptodev %u", qp_id, i);
7432 		}
7433 
7434 		ret = rte_cryptodev_scheduler_slave_attach(sched_id,
7435 				(uint8_t)i);
7436 
7437 		TEST_ASSERT(ret == 0,
7438 			"Failed to attach device %u of pmd : %s", i,
7439 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
7440 
7441 		aesni_ids[nb_devs_attached] = (uint8_t)i;
7442 
7443 		nb_devs_attached++;
7444 	}
7445 
7446 	return 0;
7447 }
7448 
7449 static int
7450 test_scheduler_detach_slave_op(void)
7451 {
7452 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7453 	uint8_t sched_id = ts_params->valid_devs[0];
7454 	uint32_t i;
7455 	int ret;
7456 
7457 	for (i = 0; i < 2; i++) {
7458 		ret = rte_cryptodev_scheduler_slave_detach(sched_id,
7459 				aesni_ids[i]);
7460 		TEST_ASSERT(ret == 0,
7461 			"Failed to detach device %u", aesni_ids[i]);
7462 	}
7463 
7464 	return 0;
7465 }
7466 
7467 static int
7468 test_scheduler_mode_op(void)
7469 {
7470 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7471 	uint8_t sched_id = ts_params->valid_devs[0];
7472 	struct rte_cryptodev_scheduler_ops op = {0};
7473 	struct rte_cryptodev_scheduler dummy_scheduler = {
7474 		.description = "dummy scheduler to test mode",
7475 		.name = "dummy scheduler",
7476 		.mode = CDEV_SCHED_MODE_USERDEFINED,
7477 		.ops = &op
7478 	};
7479 	int ret;
7480 
7481 	/* set user defined mode */
7482 	ret = rte_cryptodev_scheduler_load_user_scheduler(sched_id,
7483 			&dummy_scheduler);
7484 	TEST_ASSERT(ret == 0,
7485 		"Failed to set cdev %u to user defined mode", sched_id);
7486 
7487 	/* set round robin mode */
7488 	ret = rte_crpytodev_scheduler_mode_set(sched_id,
7489 			CDEV_SCHED_MODE_ROUNDROBIN);
7490 	TEST_ASSERT(ret == 0,
7491 		"Failed to set cdev %u to round-robin mode", sched_id);
7492 	TEST_ASSERT(rte_crpytodev_scheduler_mode_get(sched_id) ==
7493 			CDEV_SCHED_MODE_ROUNDROBIN, "Scheduling Mode "
7494 					"not match");
7495 
7496 	return 0;
7497 }
7498 
7499 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
7500 	.suite_name = "Crypto Device Scheduler Unit Test Suite",
7501 	.setup = testsuite_setup,
7502 	.teardown = testsuite_teardown,
7503 	.unit_test_cases = {
7504 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
7505 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_op),
7506 		TEST_CASE_ST(ut_setup, ut_teardown,
7507 				test_AES_chain_scheduler_all),
7508 		TEST_CASE_ST(ut_setup, ut_teardown,
7509 				test_AES_cipheronly_scheduler_all),
7510 		TEST_CASE_ST(ut_setup, ut_teardown,
7511 				test_authonly_scheduler_all),
7512 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
7513 		TEST_CASES_END() /**< NULL terminate unit test array */
7514 	}
7515 };
7516 
7517 #endif /* RTE_LIBRTE_PMD_CRYPTO_SCHEDULER */
7518 
7519 static struct unit_test_suite cryptodev_qat_testsuite  = {
7520 	.suite_name = "Crypto QAT Unit Test Suite",
7521 	.setup = testsuite_setup,
7522 	.teardown = testsuite_teardown,
7523 	.unit_test_cases = {
7524 		TEST_CASE_ST(ut_setup, ut_teardown,
7525 				test_device_configure_invalid_dev_id),
7526 		TEST_CASE_ST(ut_setup, ut_teardown,
7527 				test_device_configure_invalid_queue_pair_ids),
7528 		TEST_CASE_ST(ut_setup, ut_teardown,
7529 				test_queue_pair_descriptor_setup),
7530 		TEST_CASE_ST(ut_setup, ut_teardown,
7531 				test_multi_session),
7532 
7533 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_qat_all),
7534 		TEST_CASE_ST(ut_setup, ut_teardown,
7535 						test_AES_cipheronly_qat_all),
7536 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_qat_all),
7537 		TEST_CASE_ST(ut_setup, ut_teardown,
7538 						test_3DES_cipheronly_qat_all),
7539 		TEST_CASE_ST(ut_setup, ut_teardown,
7540 						test_DES_cipheronly_qat_all),
7541 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
7542 
7543 		/** AES GCM Authenticated Encryption */
7544 		TEST_CASE_ST(ut_setup, ut_teardown,
7545 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
7546 		TEST_CASE_ST(ut_setup, ut_teardown,
7547 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
7548 		TEST_CASE_ST(ut_setup, ut_teardown,
7549 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
7550 		TEST_CASE_ST(ut_setup, ut_teardown,
7551 			test_mb_AES_GCM_authenticated_encryption_test_case_1),
7552 		TEST_CASE_ST(ut_setup, ut_teardown,
7553 			test_mb_AES_GCM_authenticated_encryption_test_case_2),
7554 		TEST_CASE_ST(ut_setup, ut_teardown,
7555 			test_mb_AES_GCM_authenticated_encryption_test_case_3),
7556 		TEST_CASE_ST(ut_setup, ut_teardown,
7557 			test_mb_AES_GCM_authenticated_encryption_test_case_4),
7558 		TEST_CASE_ST(ut_setup, ut_teardown,
7559 			test_mb_AES_GCM_authenticated_encryption_test_case_5),
7560 		TEST_CASE_ST(ut_setup, ut_teardown,
7561 			test_mb_AES_GCM_authenticated_encryption_test_case_6),
7562 		TEST_CASE_ST(ut_setup, ut_teardown,
7563 			test_mb_AES_GCM_authenticated_encryption_test_case_7),
7564 
7565 		/** AES GCM Authenticated Decryption */
7566 		TEST_CASE_ST(ut_setup, ut_teardown,
7567 			test_mb_AES_GCM_authenticated_decryption_test_case_1),
7568 		TEST_CASE_ST(ut_setup, ut_teardown,
7569 			test_mb_AES_GCM_authenticated_decryption_test_case_2),
7570 		TEST_CASE_ST(ut_setup, ut_teardown,
7571 			test_mb_AES_GCM_authenticated_decryption_test_case_3),
7572 		TEST_CASE_ST(ut_setup, ut_teardown,
7573 			test_mb_AES_GCM_authenticated_decryption_test_case_4),
7574 		TEST_CASE_ST(ut_setup, ut_teardown,
7575 			test_mb_AES_GCM_authenticated_decryption_test_case_5),
7576 		TEST_CASE_ST(ut_setup, ut_teardown,
7577 			test_mb_AES_GCM_authenticated_decryption_test_case_6),
7578 		TEST_CASE_ST(ut_setup, ut_teardown,
7579 			test_mb_AES_GCM_authenticated_decryption_test_case_7),
7580 
7581 		/** AES GMAC Authentication */
7582 		TEST_CASE_ST(ut_setup, ut_teardown,
7583 			test_AES_GMAC_authentication_test_case_1),
7584 		TEST_CASE_ST(ut_setup, ut_teardown,
7585 			test_AES_GMAC_authentication_verify_test_case_1),
7586 		TEST_CASE_ST(ut_setup, ut_teardown,
7587 			test_AES_GMAC_authentication_test_case_2),
7588 		TEST_CASE_ST(ut_setup, ut_teardown,
7589 			test_AES_GMAC_authentication_verify_test_case_2),
7590 		TEST_CASE_ST(ut_setup, ut_teardown,
7591 			test_AES_GMAC_authentication_test_case_3),
7592 		TEST_CASE_ST(ut_setup, ut_teardown,
7593 			test_AES_GMAC_authentication_verify_test_case_3),
7594 
7595 		/** SNOW 3G encrypt only (UEA2) */
7596 		TEST_CASE_ST(ut_setup, ut_teardown,
7597 			test_snow3g_encryption_test_case_1),
7598 		TEST_CASE_ST(ut_setup, ut_teardown,
7599 			test_snow3g_encryption_test_case_2),
7600 		TEST_CASE_ST(ut_setup, ut_teardown,
7601 			test_snow3g_encryption_test_case_3),
7602 		TEST_CASE_ST(ut_setup, ut_teardown,
7603 			test_snow3g_encryption_test_case_4),
7604 		TEST_CASE_ST(ut_setup, ut_teardown,
7605 			test_snow3g_encryption_test_case_5),
7606 
7607 		TEST_CASE_ST(ut_setup, ut_teardown,
7608 			test_snow3g_encryption_test_case_1_oop),
7609 		TEST_CASE_ST(ut_setup, ut_teardown,
7610 			test_snow3g_decryption_test_case_1_oop),
7611 
7612 		/** SNOW 3G decrypt only (UEA2) */
7613 		TEST_CASE_ST(ut_setup, ut_teardown,
7614 			test_snow3g_decryption_test_case_1),
7615 		TEST_CASE_ST(ut_setup, ut_teardown,
7616 			test_snow3g_decryption_test_case_2),
7617 		TEST_CASE_ST(ut_setup, ut_teardown,
7618 			test_snow3g_decryption_test_case_3),
7619 		TEST_CASE_ST(ut_setup, ut_teardown,
7620 			test_snow3g_decryption_test_case_4),
7621 		TEST_CASE_ST(ut_setup, ut_teardown,
7622 			test_snow3g_decryption_test_case_5),
7623 		TEST_CASE_ST(ut_setup, ut_teardown,
7624 			test_snow3g_hash_generate_test_case_1),
7625 		TEST_CASE_ST(ut_setup, ut_teardown,
7626 			test_snow3g_hash_generate_test_case_2),
7627 		TEST_CASE_ST(ut_setup, ut_teardown,
7628 			test_snow3g_hash_generate_test_case_3),
7629 		TEST_CASE_ST(ut_setup, ut_teardown,
7630 			test_snow3g_hash_verify_test_case_1),
7631 		TEST_CASE_ST(ut_setup, ut_teardown,
7632 			test_snow3g_hash_verify_test_case_2),
7633 		TEST_CASE_ST(ut_setup, ut_teardown,
7634 			test_snow3g_hash_verify_test_case_3),
7635 		TEST_CASE_ST(ut_setup, ut_teardown,
7636 			test_snow3g_cipher_auth_test_case_1),
7637 		TEST_CASE_ST(ut_setup, ut_teardown,
7638 			test_snow3g_auth_cipher_test_case_1),
7639 
7640 		/** HMAC_MD5 Authentication */
7641 		TEST_CASE_ST(ut_setup, ut_teardown,
7642 			test_MD5_HMAC_generate_case_1),
7643 		TEST_CASE_ST(ut_setup, ut_teardown,
7644 			test_MD5_HMAC_verify_case_1),
7645 		TEST_CASE_ST(ut_setup, ut_teardown,
7646 			test_MD5_HMAC_generate_case_2),
7647 		TEST_CASE_ST(ut_setup, ut_teardown,
7648 			test_MD5_HMAC_verify_case_2),
7649 
7650 		/** NULL tests */
7651 		TEST_CASE_ST(ut_setup, ut_teardown,
7652 			test_null_auth_only_operation),
7653 		TEST_CASE_ST(ut_setup, ut_teardown,
7654 			test_null_cipher_only_operation),
7655 		TEST_CASE_ST(ut_setup, ut_teardown,
7656 			test_null_cipher_auth_operation),
7657 		TEST_CASE_ST(ut_setup, ut_teardown,
7658 			test_null_auth_cipher_operation),
7659 
7660 		TEST_CASE_ST(ut_setup, ut_teardown,
7661 			test_kasumi_hash_generate_test_case_6),
7662 
7663 		/** KASUMI tests */
7664 		TEST_CASE_ST(ut_setup, ut_teardown,
7665 			test_kasumi_encryption_test_case_1),
7666 		TEST_CASE_ST(ut_setup, ut_teardown,
7667 			test_kasumi_encryption_test_case_3),
7668 		TEST_CASE_ST(ut_setup, ut_teardown,
7669 			test_kasumi_auth_cipher_test_case_1),
7670 		TEST_CASE_ST(ut_setup, ut_teardown,
7671 			test_kasumi_cipher_auth_test_case_1),
7672 
7673 		/** Negative tests */
7674 		TEST_CASE_ST(ut_setup, ut_teardown,
7675 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
7676 		TEST_CASE_ST(ut_setup, ut_teardown,
7677 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
7678 		TEST_CASE_ST(ut_setup, ut_teardown,
7679 			authentication_verify_AES128_GMAC_fail_data_corrupt),
7680 		TEST_CASE_ST(ut_setup, ut_teardown,
7681 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
7682 		TEST_CASE_ST(ut_setup, ut_teardown,
7683 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
7684 		TEST_CASE_ST(ut_setup, ut_teardown,
7685 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
7686 
7687 		TEST_CASES_END() /**< NULL terminate unit test array */
7688 	}
7689 };
7690 
7691 static struct unit_test_suite cryptodev_aesni_mb_testsuite  = {
7692 	.suite_name = "Crypto Device AESNI MB Unit Test Suite",
7693 	.setup = testsuite_setup,
7694 	.teardown = testsuite_teardown,
7695 	.unit_test_cases = {
7696 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_mb_all),
7697 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_mb_all),
7698 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_mb_all),
7699 
7700 		TEST_CASES_END() /**< NULL terminate unit test array */
7701 	}
7702 };
7703 
7704 static struct unit_test_suite cryptodev_openssl_testsuite  = {
7705 	.suite_name = "Crypto Device OPENSSL Unit Test Suite",
7706 	.setup = testsuite_setup,
7707 	.teardown = testsuite_teardown,
7708 	.unit_test_cases = {
7709 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
7710 		TEST_CASE_ST(ut_setup, ut_teardown,
7711 				test_multi_session_random_usage),
7712 		TEST_CASE_ST(ut_setup, ut_teardown,
7713 				test_AES_chain_openssl_all),
7714 		TEST_CASE_ST(ut_setup, ut_teardown,
7715 				test_AES_cipheronly_openssl_all),
7716 		TEST_CASE_ST(ut_setup, ut_teardown,
7717 				test_3DES_chain_openssl_all),
7718 		TEST_CASE_ST(ut_setup, ut_teardown,
7719 				test_3DES_cipheronly_openssl_all),
7720 		TEST_CASE_ST(ut_setup, ut_teardown,
7721 				test_authonly_openssl_all),
7722 
7723 		/** AES GCM Authenticated Encryption */
7724 		TEST_CASE_ST(ut_setup, ut_teardown,
7725 			test_mb_AES_GCM_authenticated_encryption_test_case_1),
7726 		TEST_CASE_ST(ut_setup, ut_teardown,
7727 			test_mb_AES_GCM_authenticated_encryption_test_case_2),
7728 		TEST_CASE_ST(ut_setup, ut_teardown,
7729 			test_mb_AES_GCM_authenticated_encryption_test_case_3),
7730 		TEST_CASE_ST(ut_setup, ut_teardown,
7731 			test_mb_AES_GCM_authenticated_encryption_test_case_4),
7732 		TEST_CASE_ST(ut_setup, ut_teardown,
7733 			test_mb_AES_GCM_authenticated_encryption_test_case_5),
7734 		TEST_CASE_ST(ut_setup, ut_teardown,
7735 			test_mb_AES_GCM_authenticated_encryption_test_case_6),
7736 		TEST_CASE_ST(ut_setup, ut_teardown,
7737 			test_mb_AES_GCM_authenticated_encryption_test_case_7),
7738 
7739 		/** AES GCM Authenticated Decryption */
7740 		TEST_CASE_ST(ut_setup, ut_teardown,
7741 			test_mb_AES_GCM_authenticated_decryption_test_case_1),
7742 		TEST_CASE_ST(ut_setup, ut_teardown,
7743 			test_mb_AES_GCM_authenticated_decryption_test_case_2),
7744 		TEST_CASE_ST(ut_setup, ut_teardown,
7745 			test_mb_AES_GCM_authenticated_decryption_test_case_3),
7746 		TEST_CASE_ST(ut_setup, ut_teardown,
7747 			test_mb_AES_GCM_authenticated_decryption_test_case_4),
7748 		TEST_CASE_ST(ut_setup, ut_teardown,
7749 			test_mb_AES_GCM_authenticated_decryption_test_case_5),
7750 		TEST_CASE_ST(ut_setup, ut_teardown,
7751 			test_mb_AES_GCM_authenticated_decryption_test_case_6),
7752 		TEST_CASE_ST(ut_setup, ut_teardown,
7753 			test_mb_AES_GCM_authenticated_decryption_test_case_7),
7754 
7755 		/** AES GMAC Authentication */
7756 		TEST_CASE_ST(ut_setup, ut_teardown,
7757 			test_AES_GMAC_authentication_test_case_1),
7758 		TEST_CASE_ST(ut_setup, ut_teardown,
7759 			test_AES_GMAC_authentication_verify_test_case_1),
7760 		TEST_CASE_ST(ut_setup, ut_teardown,
7761 			test_AES_GMAC_authentication_test_case_2),
7762 		TEST_CASE_ST(ut_setup, ut_teardown,
7763 			test_AES_GMAC_authentication_verify_test_case_2),
7764 		TEST_CASE_ST(ut_setup, ut_teardown,
7765 			test_AES_GMAC_authentication_test_case_3),
7766 		TEST_CASE_ST(ut_setup, ut_teardown,
7767 			test_AES_GMAC_authentication_verify_test_case_3),
7768 		TEST_CASE_ST(ut_setup, ut_teardown,
7769 			test_AES_GMAC_authentication_test_case_4),
7770 		TEST_CASE_ST(ut_setup, ut_teardown,
7771 			test_AES_GMAC_authentication_verify_test_case_4),
7772 
7773 		/** Scatter-Gather */
7774 		TEST_CASE_ST(ut_setup, ut_teardown,
7775 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
7776 
7777 		/** Negative tests */
7778 		TEST_CASE_ST(ut_setup, ut_teardown,
7779 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
7780 		TEST_CASE_ST(ut_setup, ut_teardown,
7781 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
7782 		TEST_CASE_ST(ut_setup, ut_teardown,
7783 			authentication_verify_AES128_GMAC_fail_data_corrupt),
7784 		TEST_CASE_ST(ut_setup, ut_teardown,
7785 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
7786 		TEST_CASE_ST(ut_setup, ut_teardown,
7787 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
7788 		TEST_CASE_ST(ut_setup, ut_teardown,
7789 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
7790 
7791 		TEST_CASES_END() /**< NULL terminate unit test array */
7792 	}
7793 };
7794 
7795 static struct unit_test_suite cryptodev_aesni_gcm_testsuite  = {
7796 	.suite_name = "Crypto Device AESNI GCM Unit Test Suite",
7797 	.setup = testsuite_setup,
7798 	.teardown = testsuite_teardown,
7799 	.unit_test_cases = {
7800 		/** AES GCM Authenticated Encryption */
7801 		TEST_CASE_ST(ut_setup, ut_teardown,
7802 			test_mb_AES_GCM_authenticated_encryption_test_case_1),
7803 		TEST_CASE_ST(ut_setup, ut_teardown,
7804 			test_mb_AES_GCM_authenticated_encryption_test_case_2),
7805 		TEST_CASE_ST(ut_setup, ut_teardown,
7806 			test_mb_AES_GCM_authenticated_encryption_test_case_3),
7807 		TEST_CASE_ST(ut_setup, ut_teardown,
7808 			test_mb_AES_GCM_authenticated_encryption_test_case_4),
7809 		TEST_CASE_ST(ut_setup, ut_teardown,
7810 			test_mb_AES_GCM_authenticated_encryption_test_case_5),
7811 		TEST_CASE_ST(ut_setup, ut_teardown,
7812 			test_mb_AES_GCM_authenticated_encryption_test_case_6),
7813 		TEST_CASE_ST(ut_setup, ut_teardown,
7814 			test_mb_AES_GCM_authenticated_encryption_test_case_7),
7815 
7816 		/** AES GCM Authenticated Decryption */
7817 		TEST_CASE_ST(ut_setup, ut_teardown,
7818 			test_mb_AES_GCM_authenticated_decryption_test_case_1),
7819 		TEST_CASE_ST(ut_setup, ut_teardown,
7820 			test_mb_AES_GCM_authenticated_decryption_test_case_2),
7821 		TEST_CASE_ST(ut_setup, ut_teardown,
7822 			test_mb_AES_GCM_authenticated_decryption_test_case_3),
7823 		TEST_CASE_ST(ut_setup, ut_teardown,
7824 			test_mb_AES_GCM_authenticated_decryption_test_case_4),
7825 		TEST_CASE_ST(ut_setup, ut_teardown,
7826 			test_mb_AES_GCM_authenticated_decryption_test_case_5),
7827 		TEST_CASE_ST(ut_setup, ut_teardown,
7828 			test_mb_AES_GCM_authenticated_decryption_test_case_6),
7829 		TEST_CASE_ST(ut_setup, ut_teardown,
7830 			test_mb_AES_GCM_authenticated_decryption_test_case_7),
7831 
7832 		/** AES GCM Authenticated Encryption 256 bits key */
7833 		TEST_CASE_ST(ut_setup, ut_teardown,
7834 			test_mb_AES_GCM_auth_encryption_test_case_256_1),
7835 		TEST_CASE_ST(ut_setup, ut_teardown,
7836 			test_mb_AES_GCM_auth_encryption_test_case_256_2),
7837 		TEST_CASE_ST(ut_setup, ut_teardown,
7838 			test_mb_AES_GCM_auth_encryption_test_case_256_3),
7839 		TEST_CASE_ST(ut_setup, ut_teardown,
7840 			test_mb_AES_GCM_auth_encryption_test_case_256_4),
7841 		TEST_CASE_ST(ut_setup, ut_teardown,
7842 			test_mb_AES_GCM_auth_encryption_test_case_256_5),
7843 		TEST_CASE_ST(ut_setup, ut_teardown,
7844 			test_mb_AES_GCM_auth_encryption_test_case_256_6),
7845 		TEST_CASE_ST(ut_setup, ut_teardown,
7846 			test_mb_AES_GCM_auth_encryption_test_case_256_7),
7847 
7848 		/** AES GCM Authenticated Decryption 256 bits key */
7849 		TEST_CASE_ST(ut_setup, ut_teardown,
7850 			test_mb_AES_GCM_auth_decryption_test_case_256_1),
7851 		TEST_CASE_ST(ut_setup, ut_teardown,
7852 			test_mb_AES_GCM_auth_decryption_test_case_256_2),
7853 		TEST_CASE_ST(ut_setup, ut_teardown,
7854 			test_mb_AES_GCM_auth_decryption_test_case_256_3),
7855 		TEST_CASE_ST(ut_setup, ut_teardown,
7856 			test_mb_AES_GCM_auth_decryption_test_case_256_4),
7857 		TEST_CASE_ST(ut_setup, ut_teardown,
7858 			test_mb_AES_GCM_auth_decryption_test_case_256_5),
7859 		TEST_CASE_ST(ut_setup, ut_teardown,
7860 			test_mb_AES_GCM_auth_decryption_test_case_256_6),
7861 		TEST_CASE_ST(ut_setup, ut_teardown,
7862 			test_mb_AES_GCM_auth_decryption_test_case_256_7),
7863 
7864 		/** AES GCM Authenticated Encryption big aad size */
7865 		TEST_CASE_ST(ut_setup, ut_teardown,
7866 			test_mb_AES_GCM_auth_encryption_test_case_aad_1),
7867 		TEST_CASE_ST(ut_setup, ut_teardown,
7868 			test_mb_AES_GCM_auth_encryption_test_case_aad_2),
7869 
7870 		/** AES GCM Authenticated Decryption big aad size */
7871 		TEST_CASE_ST(ut_setup, ut_teardown,
7872 			test_mb_AES_GCM_auth_decryption_test_case_aad_1),
7873 		TEST_CASE_ST(ut_setup, ut_teardown,
7874 			test_mb_AES_GCM_auth_decryption_test_case_aad_2),
7875 
7876 		/** AES GMAC Authentication */
7877 		TEST_CASE_ST(ut_setup, ut_teardown,
7878 			test_AES_GMAC_authentication_test_case_1),
7879 		TEST_CASE_ST(ut_setup, ut_teardown,
7880 			test_AES_GMAC_authentication_verify_test_case_1),
7881 		TEST_CASE_ST(ut_setup, ut_teardown,
7882 			test_AES_GMAC_authentication_test_case_3),
7883 		TEST_CASE_ST(ut_setup, ut_teardown,
7884 			test_AES_GMAC_authentication_verify_test_case_3),
7885 		TEST_CASE_ST(ut_setup, ut_teardown,
7886 			test_AES_GMAC_authentication_test_case_4),
7887 		TEST_CASE_ST(ut_setup, ut_teardown,
7888 			test_AES_GMAC_authentication_verify_test_case_4),
7889 
7890 		/** Negative tests */
7891 		TEST_CASE_ST(ut_setup, ut_teardown,
7892 			authentication_verify_AES128_GMAC_fail_data_corrupt),
7893 		TEST_CASE_ST(ut_setup, ut_teardown,
7894 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
7895 
7896 		/** Out of place tests */
7897 		TEST_CASE_ST(ut_setup, ut_teardown,
7898 			test_mb_AES_GCM_authenticated_encryption_oop),
7899 		TEST_CASE_ST(ut_setup, ut_teardown,
7900 			test_mb_AES_GCM_authenticated_decryption_oop),
7901 
7902 		/** Session-less tests */
7903 		TEST_CASE_ST(ut_setup, ut_teardown,
7904 			test_mb_AES_GCM_authenticated_encryption_sessionless),
7905 		TEST_CASE_ST(ut_setup, ut_teardown,
7906 			test_mb_AES_GCM_authenticated_decryption_sessionless),
7907 
7908 		/** Scatter-Gather */
7909 		TEST_CASE_ST(ut_setup, ut_teardown,
7910 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
7911 
7912 		TEST_CASES_END() /**< NULL terminate unit test array */
7913 	}
7914 };
7915 
7916 static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
7917 	.suite_name = "Crypto Device SW KASUMI Unit Test Suite",
7918 	.setup = testsuite_setup,
7919 	.teardown = testsuite_teardown,
7920 	.unit_test_cases = {
7921 		/** KASUMI encrypt only (UEA1) */
7922 		TEST_CASE_ST(ut_setup, ut_teardown,
7923 			test_kasumi_encryption_test_case_1),
7924 		TEST_CASE_ST(ut_setup, ut_teardown,
7925 			test_kasumi_encryption_test_case_1_sgl),
7926 		TEST_CASE_ST(ut_setup, ut_teardown,
7927 			test_kasumi_encryption_test_case_2),
7928 		TEST_CASE_ST(ut_setup, ut_teardown,
7929 			test_kasumi_encryption_test_case_3),
7930 		TEST_CASE_ST(ut_setup, ut_teardown,
7931 			test_kasumi_encryption_test_case_4),
7932 		TEST_CASE_ST(ut_setup, ut_teardown,
7933 			test_kasumi_encryption_test_case_5),
7934 		/** KASUMI decrypt only (UEA1) */
7935 		TEST_CASE_ST(ut_setup, ut_teardown,
7936 			test_kasumi_decryption_test_case_1),
7937 		TEST_CASE_ST(ut_setup, ut_teardown,
7938 			test_kasumi_decryption_test_case_2),
7939 		TEST_CASE_ST(ut_setup, ut_teardown,
7940 			test_kasumi_decryption_test_case_3),
7941 		TEST_CASE_ST(ut_setup, ut_teardown,
7942 			test_kasumi_decryption_test_case_4),
7943 		TEST_CASE_ST(ut_setup, ut_teardown,
7944 			test_kasumi_decryption_test_case_5),
7945 
7946 		TEST_CASE_ST(ut_setup, ut_teardown,
7947 			test_kasumi_encryption_test_case_1_oop),
7948 		TEST_CASE_ST(ut_setup, ut_teardown,
7949 			test_kasumi_encryption_test_case_1_oop_sgl),
7950 
7951 
7952 		TEST_CASE_ST(ut_setup, ut_teardown,
7953 			test_kasumi_decryption_test_case_1_oop),
7954 
7955 		/** KASUMI hash only (UIA1) */
7956 		TEST_CASE_ST(ut_setup, ut_teardown,
7957 			test_kasumi_hash_generate_test_case_1),
7958 		TEST_CASE_ST(ut_setup, ut_teardown,
7959 			test_kasumi_hash_generate_test_case_2),
7960 		TEST_CASE_ST(ut_setup, ut_teardown,
7961 			test_kasumi_hash_generate_test_case_3),
7962 		TEST_CASE_ST(ut_setup, ut_teardown,
7963 			test_kasumi_hash_generate_test_case_4),
7964 		TEST_CASE_ST(ut_setup, ut_teardown,
7965 			test_kasumi_hash_generate_test_case_5),
7966 		TEST_CASE_ST(ut_setup, ut_teardown,
7967 			test_kasumi_hash_generate_test_case_6),
7968 		TEST_CASE_ST(ut_setup, ut_teardown,
7969 			test_kasumi_hash_verify_test_case_1),
7970 		TEST_CASE_ST(ut_setup, ut_teardown,
7971 			test_kasumi_hash_verify_test_case_2),
7972 		TEST_CASE_ST(ut_setup, ut_teardown,
7973 			test_kasumi_hash_verify_test_case_3),
7974 		TEST_CASE_ST(ut_setup, ut_teardown,
7975 			test_kasumi_hash_verify_test_case_4),
7976 		TEST_CASE_ST(ut_setup, ut_teardown,
7977 			test_kasumi_hash_verify_test_case_5),
7978 		TEST_CASE_ST(ut_setup, ut_teardown,
7979 			test_kasumi_auth_cipher_test_case_1),
7980 		TEST_CASE_ST(ut_setup, ut_teardown,
7981 			test_kasumi_cipher_auth_test_case_1),
7982 		TEST_CASES_END() /**< NULL terminate unit test array */
7983 	}
7984 };
7985 static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {
7986 	.suite_name = "Crypto Device SW SNOW 3G Unit Test Suite",
7987 	.setup = testsuite_setup,
7988 	.teardown = testsuite_teardown,
7989 	.unit_test_cases = {
7990 		/** SNOW 3G encrypt only (UEA2) */
7991 		TEST_CASE_ST(ut_setup, ut_teardown,
7992 			test_snow3g_encryption_test_case_1),
7993 		TEST_CASE_ST(ut_setup, ut_teardown,
7994 			test_snow3g_encryption_test_case_2),
7995 		TEST_CASE_ST(ut_setup, ut_teardown,
7996 			test_snow3g_encryption_test_case_3),
7997 		TEST_CASE_ST(ut_setup, ut_teardown,
7998 			test_snow3g_encryption_test_case_4),
7999 		TEST_CASE_ST(ut_setup, ut_teardown,
8000 			test_snow3g_encryption_test_case_5),
8001 
8002 		TEST_CASE_ST(ut_setup, ut_teardown,
8003 			test_snow3g_encryption_test_case_1_oop),
8004 		TEST_CASE_ST(ut_setup, ut_teardown,
8005 				test_snow3g_encryption_test_case_1_oop_sgl),
8006 		TEST_CASE_ST(ut_setup, ut_teardown,
8007 			test_snow3g_decryption_test_case_1_oop),
8008 
8009 		TEST_CASE_ST(ut_setup, ut_teardown,
8010 			test_snow3g_encryption_test_case_1_offset_oop),
8011 
8012 		/** SNOW 3G decrypt only (UEA2) */
8013 		TEST_CASE_ST(ut_setup, ut_teardown,
8014 			test_snow3g_decryption_test_case_1),
8015 		TEST_CASE_ST(ut_setup, ut_teardown,
8016 			test_snow3g_decryption_test_case_2),
8017 		TEST_CASE_ST(ut_setup, ut_teardown,
8018 			test_snow3g_decryption_test_case_3),
8019 		TEST_CASE_ST(ut_setup, ut_teardown,
8020 			test_snow3g_decryption_test_case_4),
8021 		TEST_CASE_ST(ut_setup, ut_teardown,
8022 			test_snow3g_decryption_test_case_5),
8023 		TEST_CASE_ST(ut_setup, ut_teardown,
8024 			test_snow3g_hash_generate_test_case_1),
8025 		TEST_CASE_ST(ut_setup, ut_teardown,
8026 			test_snow3g_hash_generate_test_case_2),
8027 		TEST_CASE_ST(ut_setup, ut_teardown,
8028 			test_snow3g_hash_generate_test_case_3),
8029 		/* Tests with buffers which length is not byte-aligned */
8030 		TEST_CASE_ST(ut_setup, ut_teardown,
8031 			test_snow3g_hash_generate_test_case_4),
8032 		TEST_CASE_ST(ut_setup, ut_teardown,
8033 			test_snow3g_hash_generate_test_case_5),
8034 		TEST_CASE_ST(ut_setup, ut_teardown,
8035 			test_snow3g_hash_generate_test_case_6),
8036 		TEST_CASE_ST(ut_setup, ut_teardown,
8037 			test_snow3g_hash_verify_test_case_1),
8038 		TEST_CASE_ST(ut_setup, ut_teardown,
8039 			test_snow3g_hash_verify_test_case_2),
8040 		TEST_CASE_ST(ut_setup, ut_teardown,
8041 			test_snow3g_hash_verify_test_case_3),
8042 		/* Tests with buffers which length is not byte-aligned */
8043 		TEST_CASE_ST(ut_setup, ut_teardown,
8044 			test_snow3g_hash_verify_test_case_4),
8045 		TEST_CASE_ST(ut_setup, ut_teardown,
8046 			test_snow3g_hash_verify_test_case_5),
8047 		TEST_CASE_ST(ut_setup, ut_teardown,
8048 			test_snow3g_hash_verify_test_case_6),
8049 		TEST_CASE_ST(ut_setup, ut_teardown,
8050 			test_snow3g_cipher_auth_test_case_1),
8051 		TEST_CASE_ST(ut_setup, ut_teardown,
8052 			test_snow3g_auth_cipher_test_case_1),
8053 
8054 		TEST_CASES_END() /**< NULL terminate unit test array */
8055 	}
8056 };
8057 
8058 static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {
8059 	.suite_name = "Crypto Device SW ZUC Unit Test Suite",
8060 	.setup = testsuite_setup,
8061 	.teardown = testsuite_teardown,
8062 	.unit_test_cases = {
8063 		/** ZUC encrypt only (EEA3) */
8064 		TEST_CASE_ST(ut_setup, ut_teardown,
8065 			test_zuc_encryption_test_case_1),
8066 		TEST_CASE_ST(ut_setup, ut_teardown,
8067 			test_zuc_encryption_test_case_2),
8068 		TEST_CASE_ST(ut_setup, ut_teardown,
8069 			test_zuc_encryption_test_case_3),
8070 		TEST_CASE_ST(ut_setup, ut_teardown,
8071 			test_zuc_encryption_test_case_4),
8072 		TEST_CASE_ST(ut_setup, ut_teardown,
8073 			test_zuc_encryption_test_case_5),
8074 		TEST_CASE_ST(ut_setup, ut_teardown,
8075 			test_zuc_hash_generate_test_case_1),
8076 		TEST_CASE_ST(ut_setup, ut_teardown,
8077 			test_zuc_hash_generate_test_case_2),
8078 		TEST_CASE_ST(ut_setup, ut_teardown,
8079 			test_zuc_hash_generate_test_case_3),
8080 		TEST_CASE_ST(ut_setup, ut_teardown,
8081 			test_zuc_hash_generate_test_case_4),
8082 		TEST_CASE_ST(ut_setup, ut_teardown,
8083 			test_zuc_hash_generate_test_case_5),
8084 		TEST_CASE_ST(ut_setup, ut_teardown,
8085 			test_zuc_encryption_test_case_6_sgl),
8086 		TEST_CASES_END() /**< NULL terminate unit test array */
8087 	}
8088 };
8089 
8090 static struct unit_test_suite cryptodev_null_testsuite  = {
8091 	.suite_name = "Crypto Device NULL Unit Test Suite",
8092 	.setup = testsuite_setup,
8093 	.teardown = testsuite_teardown,
8094 	.unit_test_cases = {
8095 		TEST_CASE_ST(ut_setup, ut_teardown,
8096 			test_null_auth_only_operation),
8097 		TEST_CASE_ST(ut_setup, ut_teardown,
8098 			test_null_cipher_only_operation),
8099 		TEST_CASE_ST(ut_setup, ut_teardown,
8100 			test_null_cipher_auth_operation),
8101 		TEST_CASE_ST(ut_setup, ut_teardown,
8102 			test_null_auth_cipher_operation),
8103 		TEST_CASE_ST(ut_setup, ut_teardown,
8104 			test_null_invalid_operation),
8105 		TEST_CASE_ST(ut_setup, ut_teardown,
8106 			test_null_burst_operation),
8107 
8108 		TEST_CASES_END() /**< NULL terminate unit test array */
8109 	}
8110 };
8111 
8112 static struct unit_test_suite cryptodev_armv8_testsuite  = {
8113 	.suite_name = "Crypto Device ARMv8 Unit Test Suite",
8114 	.setup = testsuite_setup,
8115 	.teardown = testsuite_teardown,
8116 	.unit_test_cases = {
8117 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_armv8_all),
8118 
8119 		/** Negative tests */
8120 		TEST_CASE_ST(ut_setup, ut_teardown,
8121 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
8122 		TEST_CASE_ST(ut_setup, ut_teardown,
8123 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
8124 
8125 		TEST_CASES_END() /**< NULL terminate unit test array */
8126 	}
8127 };
8128 
8129 static int
8130 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
8131 {
8132 	gbl_cryptodev_type = RTE_CRYPTODEV_QAT_SYM_PMD;
8133 	return unit_test_suite_runner(&cryptodev_qat_testsuite);
8134 }
8135 
8136 static int
8137 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
8138 {
8139 	gbl_cryptodev_type = RTE_CRYPTODEV_AESNI_MB_PMD;
8140 
8141 	return unit_test_suite_runner(&cryptodev_aesni_mb_testsuite);
8142 }
8143 
8144 static int
8145 test_cryptodev_openssl(void)
8146 {
8147 	gbl_cryptodev_type = RTE_CRYPTODEV_OPENSSL_PMD;
8148 
8149 	return unit_test_suite_runner(&cryptodev_openssl_testsuite);
8150 }
8151 
8152 static int
8153 test_cryptodev_aesni_gcm(void)
8154 {
8155 	gbl_cryptodev_type = RTE_CRYPTODEV_AESNI_GCM_PMD;
8156 
8157 	return unit_test_suite_runner(&cryptodev_aesni_gcm_testsuite);
8158 }
8159 
8160 static int
8161 test_cryptodev_null(void)
8162 {
8163 	gbl_cryptodev_type = RTE_CRYPTODEV_NULL_PMD;
8164 
8165 	return unit_test_suite_runner(&cryptodev_null_testsuite);
8166 }
8167 
8168 static int
8169 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
8170 {
8171 	gbl_cryptodev_type = RTE_CRYPTODEV_SNOW3G_PMD;
8172 
8173 	return unit_test_suite_runner(&cryptodev_sw_snow3g_testsuite);
8174 }
8175 
8176 static int
8177 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
8178 {
8179 	gbl_cryptodev_type = RTE_CRYPTODEV_KASUMI_PMD;
8180 
8181 	return unit_test_suite_runner(&cryptodev_sw_kasumi_testsuite);
8182 }
8183 
8184 static int
8185 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
8186 {
8187 	gbl_cryptodev_type = RTE_CRYPTODEV_ZUC_PMD;
8188 
8189 	return unit_test_suite_runner(&cryptodev_sw_zuc_testsuite);
8190 }
8191 
8192 static int
8193 test_cryptodev_armv8(void)
8194 {
8195 	gbl_cryptodev_type = RTE_CRYPTODEV_ARMV8_PMD;
8196 
8197 	return unit_test_suite_runner(&cryptodev_armv8_testsuite);
8198 }
8199 
8200 #ifdef RTE_LIBRTE_PMD_CRYPTO_SCHEDULER
8201 
8202 static int
8203 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
8204 {
8205 	gbl_cryptodev_type = RTE_CRYPTODEV_SCHEDULER_PMD;
8206 	return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
8207 }
8208 
8209 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
8210 
8211 #endif
8212 
8213 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
8214 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
8215 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
8216 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
8217 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
8218 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
8219 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
8220 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
8221 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
8222