xref: /dpdk/app/test/test_cryptodev.c (revision d38febb08d57fec29fed27a2d12a507fc6fcdfa1)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2015-2020 Intel Corporation
3  * Copyright 2020 NXP
4  */
5 
6 #include <time.h>
7 
8 #include <rte_common.h>
9 #include <rte_hexdump.h>
10 #include <rte_mbuf.h>
11 #include <rte_malloc.h>
12 #include <rte_memcpy.h>
13 #include <rte_pause.h>
14 #include <rte_bus_vdev.h>
15 #include <rte_ether.h>
16 
17 #include <rte_crypto.h>
18 #include <rte_cryptodev.h>
19 #include <rte_cryptodev_pmd.h>
20 #include <rte_string_fns.h>
21 
22 #ifdef RTE_CRYPTO_SCHEDULER
23 #include <rte_cryptodev_scheduler.h>
24 #include <rte_cryptodev_scheduler_operations.h>
25 #endif
26 
27 #include <rte_lcore.h>
28 
29 #include "test.h"
30 #include "test_cryptodev.h"
31 
32 #include "test_cryptodev_blockcipher.h"
33 #include "test_cryptodev_aes_test_vectors.h"
34 #include "test_cryptodev_des_test_vectors.h"
35 #include "test_cryptodev_hash_test_vectors.h"
36 #include "test_cryptodev_kasumi_test_vectors.h"
37 #include "test_cryptodev_kasumi_hash_test_vectors.h"
38 #include "test_cryptodev_snow3g_test_vectors.h"
39 #include "test_cryptodev_snow3g_hash_test_vectors.h"
40 #include "test_cryptodev_zuc_test_vectors.h"
41 #include "test_cryptodev_aead_test_vectors.h"
42 #include "test_cryptodev_hmac_test_vectors.h"
43 #include "test_cryptodev_mixed_test_vectors.h"
44 #ifdef RTE_LIB_SECURITY
45 #include "test_cryptodev_security_pdcp_test_vectors.h"
46 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
47 #include "test_cryptodev_security_pdcp_test_func.h"
48 #include "test_cryptodev_security_docsis_test_vectors.h"
49 
50 #define SDAP_DISABLED	0
51 #define SDAP_ENABLED	1
52 #endif
53 
54 #define VDEV_ARGS_SIZE 100
55 #define MAX_NB_SESSIONS 4
56 
57 #define MAX_DRV_SERVICE_CTX_SIZE 256
58 
59 #define MAX_RAW_DEQUEUE_COUNT	65535
60 
61 #define IN_PLACE 0
62 #define OUT_OF_PLACE 1
63 
64 static int gbl_driver_id;
65 
66 static enum rte_security_session_action_type gbl_action_type =
67 	RTE_SECURITY_ACTION_TYPE_NONE;
68 
69 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
70 
71 struct crypto_unittest_params {
72 	struct rte_crypto_sym_xform cipher_xform;
73 	struct rte_crypto_sym_xform auth_xform;
74 	struct rte_crypto_sym_xform aead_xform;
75 #ifdef RTE_LIB_SECURITY
76 	struct rte_security_docsis_xform docsis_xform;
77 #endif
78 
79 	union {
80 		struct rte_cryptodev_sym_session *sess;
81 #ifdef RTE_LIB_SECURITY
82 		struct rte_security_session *sec_session;
83 #endif
84 	};
85 #ifdef RTE_LIB_SECURITY
86 	enum rte_security_session_action_type type;
87 #endif
88 	struct rte_crypto_op *op;
89 
90 	struct rte_mbuf *obuf, *ibuf;
91 
92 	uint8_t *digest;
93 };
94 
95 #define ALIGN_POW2_ROUNDUP(num, align) \
96 	(((num) + (align) - 1) & ~((align) - 1))
97 
98 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
99 	for (j = 0; j < num_child_ts; index++, j++)			\
100 		parent_ts.unit_test_suites[index] = child_ts[j]
101 
102 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
103 	for (j = 0; j < num_blk_types; index++, j++)				\
104 		parent_ts.unit_test_suites[index] =				\
105 				build_blockcipher_test_suite(blk_types[j])
106 
107 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
108 	for (j = index; j < index + num_blk_types; j++)				\
109 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
110 
111 /*
112  * Forward declarations.
113  */
114 static int
115 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
116 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
117 		uint8_t *hmac_key);
118 
119 static int
120 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
121 		struct crypto_unittest_params *ut_params,
122 		struct crypto_testsuite_params *ts_param,
123 		const uint8_t *cipher,
124 		const uint8_t *digest,
125 		const uint8_t *iv);
126 
127 static struct rte_mbuf *
128 setup_test_string(struct rte_mempool *mpool,
129 		const char *string, size_t len, uint8_t blocksize)
130 {
131 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
132 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
133 
134 	if (m) {
135 		char *dst;
136 
137 		memset(m->buf_addr, 0, m->buf_len);
138 		dst = rte_pktmbuf_append(m, t_len);
139 		if (!dst) {
140 			rte_pktmbuf_free(m);
141 			return NULL;
142 		}
143 		if (string != NULL)
144 			rte_memcpy(dst, string, t_len);
145 		else
146 			memset(dst, 0, t_len);
147 	}
148 
149 	return m;
150 }
151 
152 /* Get number of bytes in X bits (rounding up) */
153 static uint32_t
154 ceil_byte_length(uint32_t num_bits)
155 {
156 	if (num_bits % 8)
157 		return ((num_bits >> 3) + 1);
158 	else
159 		return (num_bits >> 3);
160 }
161 
162 static void
163 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
164 		uint8_t is_op_success)
165 {
166 	struct rte_crypto_op *op = user_data;
167 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
168 			RTE_CRYPTO_OP_STATUS_ERROR;
169 }
170 
171 void
172 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
173 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
174 		uint8_t len_in_bits, uint8_t cipher_iv_len)
175 {
176 	struct rte_crypto_sym_op *sop = op->sym;
177 	struct rte_crypto_op *ret_op = NULL;
178 	struct rte_crypto_vec data_vec[UINT8_MAX];
179 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
180 	union rte_crypto_sym_ofs ofs;
181 	struct rte_crypto_sym_vec vec;
182 	struct rte_crypto_sgl sgl;
183 	uint32_t max_len;
184 	union rte_cryptodev_session_ctx sess;
185 	uint32_t count = 0;
186 	struct rte_crypto_raw_dp_ctx *ctx;
187 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
188 			auth_len = 0;
189 	int32_t n;
190 	uint32_t n_success;
191 	int ctx_service_size;
192 	int32_t status = 0;
193 	int enqueue_status, dequeue_status;
194 
195 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
196 	if (ctx_service_size < 0) {
197 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
198 		return;
199 	}
200 
201 	ctx = malloc(ctx_service_size);
202 	if (!ctx) {
203 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
204 		return;
205 	}
206 
207 	/* Both are enums, setting crypto_sess will suit any session type */
208 	sess.crypto_sess = op->sym->session;
209 
210 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
211 			op->sess_type, sess, 0) < 0) {
212 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
213 		goto exit;
214 	}
215 
216 	cipher_iv.iova = 0;
217 	cipher_iv.va = NULL;
218 	aad_auth_iv.iova = 0;
219 	aad_auth_iv.va = NULL;
220 	digest.iova = 0;
221 	digest.va = NULL;
222 	sgl.vec = data_vec;
223 	vec.num = 1;
224 	vec.sgl = &sgl;
225 	vec.iv = &cipher_iv;
226 	vec.digest = &digest;
227 	vec.aad = &aad_auth_iv;
228 	vec.status = &status;
229 
230 	ofs.raw = 0;
231 
232 	if (is_cipher && is_auth) {
233 		cipher_offset = sop->cipher.data.offset;
234 		cipher_len = sop->cipher.data.length;
235 		auth_offset = sop->auth.data.offset;
236 		auth_len = sop->auth.data.length;
237 		max_len = RTE_MAX(cipher_offset + cipher_len,
238 				auth_offset + auth_len);
239 		if (len_in_bits) {
240 			max_len = max_len >> 3;
241 			cipher_offset = cipher_offset >> 3;
242 			auth_offset = auth_offset >> 3;
243 			cipher_len = cipher_len >> 3;
244 			auth_len = auth_len >> 3;
245 		}
246 		ofs.ofs.cipher.head = cipher_offset;
247 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
248 		ofs.ofs.auth.head = auth_offset;
249 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
250 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
251 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
252 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
253 				op, void *, IV_OFFSET + cipher_iv_len);
254 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
255 				cipher_iv_len);
256 		digest.va = (void *)sop->auth.digest.data;
257 		digest.iova = sop->auth.digest.phys_addr;
258 
259 	} else if (is_cipher) {
260 		cipher_offset = sop->cipher.data.offset;
261 		cipher_len = sop->cipher.data.length;
262 		max_len = cipher_len + cipher_offset;
263 		if (len_in_bits) {
264 			max_len = max_len >> 3;
265 			cipher_offset = cipher_offset >> 3;
266 			cipher_len = cipher_len >> 3;
267 		}
268 		ofs.ofs.cipher.head = cipher_offset;
269 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
270 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
271 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
272 
273 	} else if (is_auth) {
274 		auth_offset = sop->auth.data.offset;
275 		auth_len = sop->auth.data.length;
276 		max_len = auth_len + auth_offset;
277 		if (len_in_bits) {
278 			max_len = max_len >> 3;
279 			auth_offset = auth_offset >> 3;
280 			auth_len = auth_len >> 3;
281 		}
282 		ofs.ofs.auth.head = auth_offset;
283 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
284 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
285 				op, void *, IV_OFFSET + cipher_iv_len);
286 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
287 				cipher_iv_len);
288 		digest.va = (void *)sop->auth.digest.data;
289 		digest.iova = sop->auth.digest.phys_addr;
290 
291 	} else { /* aead */
292 		cipher_offset = sop->aead.data.offset;
293 		cipher_len = sop->aead.data.length;
294 		max_len = cipher_len + cipher_offset;
295 		if (len_in_bits) {
296 			max_len = max_len >> 3;
297 			cipher_offset = cipher_offset >> 3;
298 			cipher_len = cipher_len >> 3;
299 		}
300 		ofs.ofs.cipher.head = cipher_offset;
301 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
302 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
303 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
304 		aad_auth_iv.va = (void *)sop->aead.aad.data;
305 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
306 		digest.va = (void *)sop->aead.digest.data;
307 		digest.iova = sop->aead.digest.phys_addr;
308 	}
309 
310 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
311 			data_vec, RTE_DIM(data_vec));
312 	if (n < 0 || n > sop->m_src->nb_segs) {
313 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
314 		goto exit;
315 	}
316 
317 	sgl.num = n;
318 
319 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
320 			&enqueue_status) < 1) {
321 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
322 		goto exit;
323 	}
324 
325 	if (enqueue_status == 0) {
326 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
327 		if (status < 0) {
328 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
329 			goto exit;
330 		}
331 	} else if (enqueue_status < 0) {
332 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
333 		goto exit;
334 	}
335 
336 	n = n_success = 0;
337 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
338 		n = rte_cryptodev_raw_dequeue_burst(ctx,
339 			NULL, 1, post_process_raw_dp_op,
340 				(void **)&ret_op, 0, &n_success,
341 				&dequeue_status);
342 		if (dequeue_status < 0) {
343 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
344 			goto exit;
345 		}
346 		if (n == 0)
347 			rte_pause();
348 	}
349 
350 	if (n == 1 && dequeue_status == 0) {
351 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
352 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353 			goto exit;
354 		}
355 	}
356 
357 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
358 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
359 					RTE_CRYPTO_OP_STATUS_SUCCESS;
360 
361 exit:
362 	free(ctx);
363 }
364 
365 static void
366 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
367 {
368 	int32_t n, st;
369 	struct rte_crypto_sym_op *sop;
370 	union rte_crypto_sym_ofs ofs;
371 	struct rte_crypto_sgl sgl;
372 	struct rte_crypto_sym_vec symvec;
373 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
374 	struct rte_crypto_vec vec[UINT8_MAX];
375 
376 	sop = op->sym;
377 
378 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
379 		sop->aead.data.length, vec, RTE_DIM(vec));
380 
381 	if (n < 0 || n != sop->m_src->nb_segs) {
382 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
383 		return;
384 	}
385 
386 	sgl.vec = vec;
387 	sgl.num = n;
388 	symvec.sgl = &sgl;
389 	symvec.iv = &iv_ptr;
390 	symvec.digest = &digest_ptr;
391 	symvec.aad = &aad_ptr;
392 	symvec.status = &st;
393 	symvec.num = 1;
394 
395 	/* for CPU crypto the IOVA address is not required */
396 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
397 	digest_ptr.va = (void *)sop->aead.digest.data;
398 	aad_ptr.va = (void *)sop->aead.aad.data;
399 
400 	ofs.raw = 0;
401 
402 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
403 		&symvec);
404 
405 	if (n != 1)
406 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
407 	else
408 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
409 }
410 
411 static void
412 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
413 {
414 	int32_t n, st;
415 	struct rte_crypto_sym_op *sop;
416 	union rte_crypto_sym_ofs ofs;
417 	struct rte_crypto_sgl sgl;
418 	struct rte_crypto_sym_vec symvec;
419 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
420 	struct rte_crypto_vec vec[UINT8_MAX];
421 
422 	sop = op->sym;
423 
424 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
425 		sop->auth.data.length, vec, RTE_DIM(vec));
426 
427 	if (n < 0 || n != sop->m_src->nb_segs) {
428 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
429 		return;
430 	}
431 
432 	sgl.vec = vec;
433 	sgl.num = n;
434 	symvec.sgl = &sgl;
435 	symvec.iv = &iv_ptr;
436 	symvec.digest = &digest_ptr;
437 	symvec.status = &st;
438 	symvec.num = 1;
439 
440 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
441 	digest_ptr.va = (void *)sop->auth.digest.data;
442 
443 	ofs.raw = 0;
444 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
445 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
446 		(sop->cipher.data.offset + sop->cipher.data.length);
447 
448 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
449 		&symvec);
450 
451 	if (n != 1)
452 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
453 	else
454 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
455 }
456 
457 static struct rte_crypto_op *
458 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
459 {
460 
461 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
462 
463 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
464 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
465 		return NULL;
466 	}
467 
468 	op = NULL;
469 
470 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
471 		rte_pause();
472 
473 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
474 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
475 		return NULL;
476 	}
477 
478 	return op;
479 }
480 
481 static struct crypto_testsuite_params testsuite_params = { NULL };
482 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
483 static struct crypto_unittest_params unittest_params;
484 
485 static int
486 testsuite_setup(void)
487 {
488 	struct crypto_testsuite_params *ts_params = &testsuite_params;
489 	struct rte_cryptodev_info info;
490 	uint32_t i = 0, nb_devs, dev_id;
491 	uint16_t qp_id;
492 
493 	memset(ts_params, 0, sizeof(*ts_params));
494 
495 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
496 	if (ts_params->mbuf_pool == NULL) {
497 		/* Not already created so create */
498 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
499 				"CRYPTO_MBUFPOOL",
500 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
501 				rte_socket_id());
502 		if (ts_params->mbuf_pool == NULL) {
503 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
504 			return TEST_FAILED;
505 		}
506 	}
507 
508 	ts_params->large_mbuf_pool = rte_mempool_lookup(
509 			"CRYPTO_LARGE_MBUFPOOL");
510 	if (ts_params->large_mbuf_pool == NULL) {
511 		/* Not already created so create */
512 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
513 				"CRYPTO_LARGE_MBUFPOOL",
514 				1, 0, 0, UINT16_MAX,
515 				rte_socket_id());
516 		if (ts_params->large_mbuf_pool == NULL) {
517 			RTE_LOG(ERR, USER1,
518 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
519 			return TEST_FAILED;
520 		}
521 	}
522 
523 	ts_params->op_mpool = rte_crypto_op_pool_create(
524 			"MBUF_CRYPTO_SYM_OP_POOL",
525 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
526 			NUM_MBUFS, MBUF_CACHE_SIZE,
527 			DEFAULT_NUM_XFORMS *
528 			sizeof(struct rte_crypto_sym_xform) +
529 			MAXIMUM_IV_LENGTH,
530 			rte_socket_id());
531 	if (ts_params->op_mpool == NULL) {
532 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
533 		return TEST_FAILED;
534 	}
535 
536 	nb_devs = rte_cryptodev_count();
537 	if (nb_devs < 1) {
538 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
539 		return TEST_SKIPPED;
540 	}
541 
542 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
543 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
544 				rte_cryptodev_driver_name_get(gbl_driver_id));
545 		return TEST_SKIPPED;
546 	}
547 
548 	/* Create list of valid crypto devs */
549 	for (i = 0; i < nb_devs; i++) {
550 		rte_cryptodev_info_get(i, &info);
551 		if (info.driver_id == gbl_driver_id)
552 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
553 	}
554 
555 	if (ts_params->valid_dev_count < 1)
556 		return TEST_FAILED;
557 
558 	/* Set up all the qps on the first of the valid devices found */
559 
560 	dev_id = ts_params->valid_devs[0];
561 
562 	rte_cryptodev_info_get(dev_id, &info);
563 
564 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
565 	ts_params->conf.socket_id = SOCKET_ID_ANY;
566 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
567 
568 	unsigned int session_size =
569 		rte_cryptodev_sym_get_private_session_size(dev_id);
570 
571 #ifdef RTE_LIB_SECURITY
572 	unsigned int security_session_size = rte_security_session_get_size(
573 			rte_cryptodev_get_sec_ctx(dev_id));
574 
575 	if (session_size < security_session_size)
576 		session_size = security_session_size;
577 #endif
578 	/*
579 	 * Create mempool with maximum number of sessions.
580 	 */
581 	if (info.sym.max_nb_sessions != 0 &&
582 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
583 		RTE_LOG(ERR, USER1, "Device does not support "
584 				"at least %u sessions\n",
585 				MAX_NB_SESSIONS);
586 		return TEST_FAILED;
587 	}
588 
589 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
590 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
591 			SOCKET_ID_ANY);
592 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
593 			"session mempool allocation failed");
594 
595 	ts_params->session_priv_mpool = rte_mempool_create(
596 			"test_sess_mp_priv",
597 			MAX_NB_SESSIONS,
598 			session_size,
599 			0, 0, NULL, NULL, NULL,
600 			NULL, SOCKET_ID_ANY,
601 			0);
602 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
603 			"session mempool allocation failed");
604 
605 
606 
607 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
608 			&ts_params->conf),
609 			"Failed to configure cryptodev %u with %u qps",
610 			dev_id, ts_params->conf.nb_queue_pairs);
611 
612 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
613 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
614 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
615 
616 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
617 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
618 			dev_id, qp_id, &ts_params->qp_conf,
619 			rte_cryptodev_socket_id(dev_id)),
620 			"Failed to setup queue pair %u on cryptodev %u",
621 			qp_id, dev_id);
622 	}
623 
624 	return TEST_SUCCESS;
625 }
626 
627 static void
628 testsuite_teardown(void)
629 {
630 	struct crypto_testsuite_params *ts_params = &testsuite_params;
631 	int res;
632 
633 	if (ts_params->mbuf_pool != NULL) {
634 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
635 		rte_mempool_avail_count(ts_params->mbuf_pool));
636 	}
637 
638 	if (ts_params->op_mpool != NULL) {
639 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
640 		rte_mempool_avail_count(ts_params->op_mpool));
641 	}
642 
643 	/* Free session mempools */
644 	if (ts_params->session_priv_mpool != NULL) {
645 		rte_mempool_free(ts_params->session_priv_mpool);
646 		ts_params->session_priv_mpool = NULL;
647 	}
648 
649 	if (ts_params->session_mpool != NULL) {
650 		rte_mempool_free(ts_params->session_mpool);
651 		ts_params->session_mpool = NULL;
652 	}
653 
654 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
655 	if (res)
656 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
657 }
658 
659 static int
660 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
661 		const int *algs, uint16_t num_algs)
662 {
663 	uint8_t dev_id = testsuite_params.valid_devs[0];
664 	bool some_alg_supported = FALSE;
665 	uint16_t i;
666 
667 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
668 		struct rte_cryptodev_sym_capability_idx alg = {
669 			type, {algs[i]}
670 		};
671 		if (rte_cryptodev_sym_capability_get(dev_id,
672 				&alg) != NULL)
673 			some_alg_supported = TRUE;
674 	}
675 	if (!some_alg_supported)
676 		return TEST_SKIPPED;
677 
678 	return 0;
679 }
680 
681 int
682 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
683 		uint16_t num_ciphers)
684 {
685 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
686 			(const int *) ciphers, num_ciphers);
687 }
688 
689 int
690 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
691 		uint16_t num_auths)
692 {
693 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
694 			(const int *) auths, num_auths);
695 }
696 
697 int
698 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
699 		uint16_t num_aeads)
700 {
701 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
702 			(const int *) aeads, num_aeads);
703 }
704 
705 static int
706 null_testsuite_setup(void)
707 {
708 	struct crypto_testsuite_params *ts_params = &testsuite_params;
709 	uint8_t dev_id = ts_params->valid_devs[0];
710 	struct rte_cryptodev_info dev_info;
711 	const enum rte_crypto_cipher_algorithm ciphers[] = {
712 		RTE_CRYPTO_CIPHER_NULL
713 	};
714 	const enum rte_crypto_auth_algorithm auths[] = {
715 		RTE_CRYPTO_AUTH_NULL
716 	};
717 
718 	rte_cryptodev_info_get(dev_id, &dev_info);
719 
720 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
721 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
722 				"testsuite not met\n");
723 		return TEST_SKIPPED;
724 	}
725 
726 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
727 			&& check_auth_capabilities_supported(auths,
728 			RTE_DIM(auths)) != 0) {
729 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
730 				"testsuite not met\n");
731 		return TEST_SKIPPED;
732 	}
733 
734 	return 0;
735 }
736 
737 static int
738 crypto_gen_testsuite_setup(void)
739 {
740 	struct crypto_testsuite_params *ts_params = &testsuite_params;
741 	uint8_t dev_id = ts_params->valid_devs[0];
742 	struct rte_cryptodev_info dev_info;
743 
744 	rte_cryptodev_info_get(dev_id, &dev_info);
745 
746 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
747 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
748 				"testsuite not met\n");
749 		return TEST_SKIPPED;
750 	}
751 
752 	return 0;
753 }
754 
755 #ifdef RTE_LIB_SECURITY
756 static int
757 pdcp_proto_testsuite_setup(void)
758 {
759 	struct crypto_testsuite_params *ts_params = &testsuite_params;
760 	uint8_t dev_id = ts_params->valid_devs[0];
761 	struct rte_cryptodev_info dev_info;
762 	const enum rte_crypto_cipher_algorithm ciphers[] = {
763 		RTE_CRYPTO_CIPHER_NULL,
764 		RTE_CRYPTO_CIPHER_AES_CTR,
765 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
766 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
767 	};
768 	const enum rte_crypto_auth_algorithm auths[] = {
769 		RTE_CRYPTO_AUTH_NULL,
770 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
771 		RTE_CRYPTO_AUTH_AES_CMAC,
772 		RTE_CRYPTO_AUTH_ZUC_EIA3
773 	};
774 
775 	rte_cryptodev_info_get(dev_id, &dev_info);
776 
777 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
778 			!(dev_info.feature_flags &
779 			RTE_CRYPTODEV_FF_SECURITY)) {
780 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
781 				"testsuite not met\n");
782 		return TEST_SKIPPED;
783 	}
784 
785 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
786 			&& check_auth_capabilities_supported(auths,
787 			RTE_DIM(auths)) != 0) {
788 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
789 				"testsuite not met\n");
790 		return TEST_SKIPPED;
791 	}
792 
793 	return 0;
794 }
795 
796 static int
797 docsis_proto_testsuite_setup(void)
798 {
799 	struct crypto_testsuite_params *ts_params = &testsuite_params;
800 	uint8_t dev_id = ts_params->valid_devs[0];
801 	struct rte_cryptodev_info dev_info;
802 	const enum rte_crypto_cipher_algorithm ciphers[] = {
803 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
804 	};
805 
806 	rte_cryptodev_info_get(dev_id, &dev_info);
807 
808 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
809 			!(dev_info.feature_flags &
810 			RTE_CRYPTODEV_FF_SECURITY)) {
811 		RTE_LOG(INFO, USER1, "Feature flag requirements for Docsis "
812 				"Proto testsuite not met\n");
813 		return TEST_SKIPPED;
814 	}
815 
816 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
817 		RTE_LOG(INFO, USER1, "Capability requirements for Docsis Proto "
818 				"testsuite not met\n");
819 		return TEST_SKIPPED;
820 	}
821 
822 	return 0;
823 }
824 #endif
825 
826 static int
827 aes_ccm_auth_testsuite_setup(void)
828 {
829 	struct crypto_testsuite_params *ts_params = &testsuite_params;
830 	uint8_t dev_id = ts_params->valid_devs[0];
831 	struct rte_cryptodev_info dev_info;
832 	const enum rte_crypto_aead_algorithm aeads[] = {
833 		RTE_CRYPTO_AEAD_AES_CCM
834 	};
835 
836 	rte_cryptodev_info_get(dev_id, &dev_info);
837 
838 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
839 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
840 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
841 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
842 				"testsuite not met\n");
843 		return TEST_SKIPPED;
844 	}
845 
846 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
847 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
848 				"testsuite not met\n");
849 		return TEST_SKIPPED;
850 	}
851 
852 	return 0;
853 }
854 
855 static int
856 aes_gcm_auth_testsuite_setup(void)
857 {
858 	struct crypto_testsuite_params *ts_params = &testsuite_params;
859 	uint8_t dev_id = ts_params->valid_devs[0];
860 	struct rte_cryptodev_info dev_info;
861 	const enum rte_crypto_aead_algorithm aeads[] = {
862 		RTE_CRYPTO_AEAD_AES_GCM
863 	};
864 
865 	rte_cryptodev_info_get(dev_id, &dev_info);
866 
867 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
868 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
869 				"testsuite not met\n");
870 		return TEST_SKIPPED;
871 	}
872 
873 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
874 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
875 				"testsuite not met\n");
876 		return TEST_SKIPPED;
877 	}
878 
879 	return 0;
880 }
881 
882 static int
883 aes_gmac_auth_testsuite_setup(void)
884 {
885 	struct crypto_testsuite_params *ts_params = &testsuite_params;
886 	uint8_t dev_id = ts_params->valid_devs[0];
887 	struct rte_cryptodev_info dev_info;
888 	const enum rte_crypto_auth_algorithm auths[] = {
889 		RTE_CRYPTO_AUTH_AES_GMAC
890 	};
891 
892 	rte_cryptodev_info_get(dev_id, &dev_info);
893 
894 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
895 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
896 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
897 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
898 				"testsuite not met\n");
899 		return TEST_SKIPPED;
900 	}
901 
902 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
903 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
904 				"testsuite not met\n");
905 		return TEST_SKIPPED;
906 	}
907 
908 	return 0;
909 }
910 
911 static int
912 chacha20_poly1305_testsuite_setup(void)
913 {
914 	struct crypto_testsuite_params *ts_params = &testsuite_params;
915 	uint8_t dev_id = ts_params->valid_devs[0];
916 	struct rte_cryptodev_info dev_info;
917 	const enum rte_crypto_aead_algorithm aeads[] = {
918 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
919 	};
920 
921 	rte_cryptodev_info_get(dev_id, &dev_info);
922 
923 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
924 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
925 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
926 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
927 				"Chacha20-Poly1305 testsuite not met\n");
928 		return TEST_SKIPPED;
929 	}
930 
931 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
932 		RTE_LOG(INFO, USER1, "Capability requirements for "
933 				"Chacha20-Poly1305 testsuite not met\n");
934 		return TEST_SKIPPED;
935 	}
936 
937 	return 0;
938 }
939 
940 static int
941 snow3g_testsuite_setup(void)
942 {
943 	struct crypto_testsuite_params *ts_params = &testsuite_params;
944 	uint8_t dev_id = ts_params->valid_devs[0];
945 	struct rte_cryptodev_info dev_info;
946 	const enum rte_crypto_cipher_algorithm ciphers[] = {
947 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
948 
949 	};
950 	const enum rte_crypto_auth_algorithm auths[] = {
951 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
952 	};
953 
954 	rte_cryptodev_info_get(dev_id, &dev_info);
955 
956 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
957 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
958 				"testsuite not met\n");
959 		return TEST_SKIPPED;
960 	}
961 
962 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
963 			&& check_auth_capabilities_supported(auths,
964 			RTE_DIM(auths)) != 0) {
965 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
966 				"testsuite not met\n");
967 		return TEST_SKIPPED;
968 	}
969 
970 	return 0;
971 }
972 
973 static int
974 zuc_testsuite_setup(void)
975 {
976 	struct crypto_testsuite_params *ts_params = &testsuite_params;
977 	uint8_t dev_id = ts_params->valid_devs[0];
978 	struct rte_cryptodev_info dev_info;
979 	const enum rte_crypto_cipher_algorithm ciphers[] = {
980 		RTE_CRYPTO_CIPHER_ZUC_EEA3
981 	};
982 	const enum rte_crypto_auth_algorithm auths[] = {
983 		RTE_CRYPTO_AUTH_ZUC_EIA3
984 	};
985 
986 	rte_cryptodev_info_get(dev_id, &dev_info);
987 
988 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
989 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
990 				"testsuite not met\n");
991 		return TEST_SKIPPED;
992 	}
993 
994 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
995 			&& check_auth_capabilities_supported(auths,
996 			RTE_DIM(auths)) != 0) {
997 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
998 				"testsuite not met\n");
999 		return TEST_SKIPPED;
1000 	}
1001 
1002 	return 0;
1003 }
1004 
1005 static int
1006 hmac_md5_auth_testsuite_setup(void)
1007 {
1008 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1009 	uint8_t dev_id = ts_params->valid_devs[0];
1010 	struct rte_cryptodev_info dev_info;
1011 	const enum rte_crypto_auth_algorithm auths[] = {
1012 		RTE_CRYPTO_AUTH_MD5_HMAC
1013 	};
1014 
1015 	rte_cryptodev_info_get(dev_id, &dev_info);
1016 
1017 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1018 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1019 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1020 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1021 				"Auth testsuite not met\n");
1022 		return TEST_SKIPPED;
1023 	}
1024 
1025 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1026 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1027 				"testsuite not met\n");
1028 		return TEST_SKIPPED;
1029 	}
1030 
1031 	return 0;
1032 }
1033 
1034 static int
1035 kasumi_testsuite_setup(void)
1036 {
1037 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1038 	uint8_t dev_id = ts_params->valid_devs[0];
1039 	struct rte_cryptodev_info dev_info;
1040 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1041 		RTE_CRYPTO_CIPHER_KASUMI_F8
1042 	};
1043 	const enum rte_crypto_auth_algorithm auths[] = {
1044 		RTE_CRYPTO_AUTH_KASUMI_F9
1045 	};
1046 
1047 	rte_cryptodev_info_get(dev_id, &dev_info);
1048 
1049 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1050 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1051 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1052 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1053 				"testsuite not met\n");
1054 		return TEST_SKIPPED;
1055 	}
1056 
1057 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1058 			&& check_auth_capabilities_supported(auths,
1059 			RTE_DIM(auths)) != 0) {
1060 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1061 				"testsuite not met\n");
1062 		return TEST_SKIPPED;
1063 	}
1064 
1065 	return 0;
1066 }
1067 
1068 static int
1069 negative_aes_gcm_testsuite_setup(void)
1070 {
1071 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1072 	uint8_t dev_id = ts_params->valid_devs[0];
1073 	struct rte_cryptodev_info dev_info;
1074 	const enum rte_crypto_aead_algorithm aeads[] = {
1075 		RTE_CRYPTO_AEAD_AES_GCM
1076 	};
1077 
1078 	rte_cryptodev_info_get(dev_id, &dev_info);
1079 
1080 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1081 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1082 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1083 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1084 				"AES GCM testsuite not met\n");
1085 		return TEST_SKIPPED;
1086 	}
1087 
1088 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1089 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1090 				"AES GCM testsuite not met\n");
1091 		return TEST_SKIPPED;
1092 	}
1093 
1094 	return 0;
1095 }
1096 
1097 static int
1098 negative_aes_gmac_testsuite_setup(void)
1099 {
1100 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1101 	uint8_t dev_id = ts_params->valid_devs[0];
1102 	struct rte_cryptodev_info dev_info;
1103 	const enum rte_crypto_auth_algorithm auths[] = {
1104 		RTE_CRYPTO_AUTH_AES_GMAC
1105 	};
1106 
1107 	rte_cryptodev_info_get(dev_id, &dev_info);
1108 
1109 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1110 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1111 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1112 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1113 				"AES GMAC testsuite not met\n");
1114 		return TEST_SKIPPED;
1115 	}
1116 
1117 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1118 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1119 				"AES GMAC testsuite not met\n");
1120 		return TEST_SKIPPED;
1121 	}
1122 
1123 	return 0;
1124 }
1125 
1126 static int
1127 mixed_cipher_hash_testsuite_setup(void)
1128 {
1129 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1130 	uint8_t dev_id = ts_params->valid_devs[0];
1131 	struct rte_cryptodev_info dev_info;
1132 	uint64_t feat_flags;
1133 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1134 		RTE_CRYPTO_CIPHER_NULL,
1135 		RTE_CRYPTO_CIPHER_AES_CTR,
1136 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1137 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1138 	};
1139 	const enum rte_crypto_auth_algorithm auths[] = {
1140 		RTE_CRYPTO_AUTH_NULL,
1141 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1142 		RTE_CRYPTO_AUTH_AES_CMAC,
1143 		RTE_CRYPTO_AUTH_ZUC_EIA3
1144 	};
1145 
1146 	rte_cryptodev_info_get(dev_id, &dev_info);
1147 	feat_flags = dev_info.feature_flags;
1148 
1149 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1150 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1151 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1152 				"Cipher Hash testsuite not met\n");
1153 		return TEST_SKIPPED;
1154 	}
1155 
1156 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1157 			&& check_auth_capabilities_supported(auths,
1158 			RTE_DIM(auths)) != 0) {
1159 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1160 				"Cipher Hash testsuite not met\n");
1161 		return TEST_SKIPPED;
1162 	}
1163 
1164 	return 0;
1165 }
1166 
1167 static int
1168 esn_testsuite_setup(void)
1169 {
1170 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1171 	uint8_t dev_id = ts_params->valid_devs[0];
1172 	struct rte_cryptodev_info dev_info;
1173 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1174 		RTE_CRYPTO_CIPHER_AES_CBC
1175 	};
1176 	const enum rte_crypto_auth_algorithm auths[] = {
1177 		RTE_CRYPTO_AUTH_SHA1_HMAC
1178 	};
1179 
1180 	rte_cryptodev_info_get(dev_id, &dev_info);
1181 
1182 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1183 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1184 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1185 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1186 				"testsuite not met\n");
1187 		return TEST_SKIPPED;
1188 	}
1189 
1190 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1191 			&& check_auth_capabilities_supported(auths,
1192 			RTE_DIM(auths)) != 0) {
1193 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1194 				"testsuite not met\n");
1195 		return TEST_SKIPPED;
1196 	}
1197 
1198 	return 0;
1199 }
1200 
1201 static int
1202 multi_session_testsuite_setup(void)
1203 {
1204 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1205 	uint8_t dev_id = ts_params->valid_devs[0];
1206 	struct rte_cryptodev_info dev_info;
1207 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1208 		RTE_CRYPTO_CIPHER_AES_CBC
1209 	};
1210 	const enum rte_crypto_auth_algorithm auths[] = {
1211 		RTE_CRYPTO_AUTH_SHA512_HMAC
1212 	};
1213 
1214 	rte_cryptodev_info_get(dev_id, &dev_info);
1215 
1216 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1217 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1218 				"Session testsuite not met\n");
1219 		return TEST_SKIPPED;
1220 	}
1221 
1222 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1223 			&& check_auth_capabilities_supported(auths,
1224 			RTE_DIM(auths)) != 0) {
1225 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1226 				"Session testsuite not met\n");
1227 		return TEST_SKIPPED;
1228 	}
1229 
1230 	return 0;
1231 }
1232 
1233 static int
1234 negative_hmac_sha1_testsuite_setup(void)
1235 {
1236 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1237 	uint8_t dev_id = ts_params->valid_devs[0];
1238 	struct rte_cryptodev_info dev_info;
1239 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1240 		RTE_CRYPTO_CIPHER_AES_CBC
1241 	};
1242 	const enum rte_crypto_auth_algorithm auths[] = {
1243 		RTE_CRYPTO_AUTH_SHA1_HMAC
1244 	};
1245 
1246 	rte_cryptodev_info_get(dev_id, &dev_info);
1247 
1248 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1249 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1250 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1251 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1252 				"HMAC SHA1 testsuite not met\n");
1253 		return TEST_SKIPPED;
1254 	}
1255 
1256 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1257 			&& check_auth_capabilities_supported(auths,
1258 			RTE_DIM(auths)) != 0) {
1259 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1260 				"HMAC SHA1 testsuite not met\n");
1261 		return TEST_SKIPPED;
1262 	}
1263 
1264 	return 0;
1265 }
1266 
1267 static int
1268 dev_configure_and_start(uint64_t ff_disable)
1269 {
1270 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1271 	struct crypto_unittest_params *ut_params = &unittest_params;
1272 
1273 	uint16_t qp_id;
1274 
1275 	/* Clear unit test parameters before running test */
1276 	memset(ut_params, 0, sizeof(*ut_params));
1277 
1278 	/* Reconfigure device to default parameters */
1279 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1280 	ts_params->conf.ff_disable = ff_disable;
1281 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1282 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1283 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1284 
1285 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1286 			&ts_params->conf),
1287 			"Failed to configure cryptodev %u",
1288 			ts_params->valid_devs[0]);
1289 
1290 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1291 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1292 			ts_params->valid_devs[0], qp_id,
1293 			&ts_params->qp_conf,
1294 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1295 			"Failed to setup queue pair %u on cryptodev %u",
1296 			qp_id, ts_params->valid_devs[0]);
1297 	}
1298 
1299 
1300 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1301 
1302 	/* Start the device */
1303 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1304 			"Failed to start cryptodev %u",
1305 			ts_params->valid_devs[0]);
1306 
1307 	return TEST_SUCCESS;
1308 }
1309 
1310 int
1311 ut_setup(void)
1312 {
1313 	/* Configure and start the device with security feature disabled */
1314 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1315 }
1316 
1317 static int
1318 ut_setup_security(void)
1319 {
1320 	/* Configure and start the device with no features disabled */
1321 	return dev_configure_and_start(0);
1322 }
1323 
1324 void
1325 ut_teardown(void)
1326 {
1327 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1328 	struct crypto_unittest_params *ut_params = &unittest_params;
1329 	struct rte_cryptodev_stats stats;
1330 
1331 	/* free crypto session structure */
1332 #ifdef RTE_LIB_SECURITY
1333 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1334 		if (ut_params->sec_session) {
1335 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1336 						(ts_params->valid_devs[0]),
1337 						ut_params->sec_session);
1338 			ut_params->sec_session = NULL;
1339 		}
1340 	} else
1341 #endif
1342 	{
1343 		if (ut_params->sess) {
1344 			rte_cryptodev_sym_session_clear(
1345 					ts_params->valid_devs[0],
1346 					ut_params->sess);
1347 			rte_cryptodev_sym_session_free(ut_params->sess);
1348 			ut_params->sess = NULL;
1349 		}
1350 	}
1351 
1352 	/* free crypto operation structure */
1353 	if (ut_params->op)
1354 		rte_crypto_op_free(ut_params->op);
1355 
1356 	/*
1357 	 * free mbuf - both obuf and ibuf are usually the same,
1358 	 * so check if they point at the same address is necessary,
1359 	 * to avoid freeing the mbuf twice.
1360 	 */
1361 	if (ut_params->obuf) {
1362 		rte_pktmbuf_free(ut_params->obuf);
1363 		if (ut_params->ibuf == ut_params->obuf)
1364 			ut_params->ibuf = 0;
1365 		ut_params->obuf = 0;
1366 	}
1367 	if (ut_params->ibuf) {
1368 		rte_pktmbuf_free(ut_params->ibuf);
1369 		ut_params->ibuf = 0;
1370 	}
1371 
1372 	if (ts_params->mbuf_pool != NULL)
1373 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1374 			rte_mempool_avail_count(ts_params->mbuf_pool));
1375 
1376 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
1377 
1378 	/* Stop the device */
1379 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1380 }
1381 
1382 static int
1383 test_device_configure_invalid_dev_id(void)
1384 {
1385 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1386 	uint16_t dev_id, num_devs = 0;
1387 
1388 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1389 			"Need at least %d devices for test", 1);
1390 
1391 	/* valid dev_id values */
1392 	dev_id = ts_params->valid_devs[0];
1393 
1394 	/* Stop the device in case it's started so it can be configured */
1395 	rte_cryptodev_stop(dev_id);
1396 
1397 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1398 			"Failed test for rte_cryptodev_configure: "
1399 			"invalid dev_num %u", dev_id);
1400 
1401 	/* invalid dev_id values */
1402 	dev_id = num_devs;
1403 
1404 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1405 			"Failed test for rte_cryptodev_configure: "
1406 			"invalid dev_num %u", dev_id);
1407 
1408 	dev_id = 0xff;
1409 
1410 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1411 			"Failed test for rte_cryptodev_configure:"
1412 			"invalid dev_num %u", dev_id);
1413 
1414 	return TEST_SUCCESS;
1415 }
1416 
1417 static int
1418 test_device_configure_invalid_queue_pair_ids(void)
1419 {
1420 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1421 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1422 
1423 	/* Stop the device in case it's started so it can be configured */
1424 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1425 
1426 	/* valid - max value queue pairs */
1427 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1428 
1429 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1430 			&ts_params->conf),
1431 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1432 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1433 
1434 	/* valid - one queue pairs */
1435 	ts_params->conf.nb_queue_pairs = 1;
1436 
1437 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1438 			&ts_params->conf),
1439 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1440 			ts_params->valid_devs[0],
1441 			ts_params->conf.nb_queue_pairs);
1442 
1443 
1444 	/* invalid - zero queue pairs */
1445 	ts_params->conf.nb_queue_pairs = 0;
1446 
1447 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1448 			&ts_params->conf),
1449 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1450 			" invalid qps: %u",
1451 			ts_params->valid_devs[0],
1452 			ts_params->conf.nb_queue_pairs);
1453 
1454 
1455 	/* invalid - max value supported by field queue pairs */
1456 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1457 
1458 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1459 			&ts_params->conf),
1460 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1461 			" invalid qps: %u",
1462 			ts_params->valid_devs[0],
1463 			ts_params->conf.nb_queue_pairs);
1464 
1465 
1466 	/* invalid - max value + 1 queue pairs */
1467 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1468 
1469 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1470 			&ts_params->conf),
1471 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1472 			" invalid qps: %u",
1473 			ts_params->valid_devs[0],
1474 			ts_params->conf.nb_queue_pairs);
1475 
1476 	/* revert to original testsuite value */
1477 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1478 
1479 	return TEST_SUCCESS;
1480 }
1481 
1482 static int
1483 test_queue_pair_descriptor_setup(void)
1484 {
1485 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1486 	struct rte_cryptodev_qp_conf qp_conf = {
1487 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1488 	};
1489 	uint16_t qp_id;
1490 
1491 	/* Stop the device in case it's started so it can be configured */
1492 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1493 
1494 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1495 			&ts_params->conf),
1496 			"Failed to configure cryptodev %u",
1497 			ts_params->valid_devs[0]);
1498 
1499 	/*
1500 	 * Test various ring sizes on this device. memzones can't be
1501 	 * freed so are re-used if ring is released and re-created.
1502 	 */
1503 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1504 	qp_conf.mp_session = ts_params->session_mpool;
1505 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1506 
1507 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1508 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1509 				ts_params->valid_devs[0], qp_id, &qp_conf,
1510 				rte_cryptodev_socket_id(
1511 						ts_params->valid_devs[0])),
1512 				"Failed test for "
1513 				"rte_cryptodev_queue_pair_setup: num_inflights "
1514 				"%u on qp %u on cryptodev %u",
1515 				qp_conf.nb_descriptors, qp_id,
1516 				ts_params->valid_devs[0]);
1517 	}
1518 
1519 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1520 
1521 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1522 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1523 				ts_params->valid_devs[0], qp_id, &qp_conf,
1524 				rte_cryptodev_socket_id(
1525 						ts_params->valid_devs[0])),
1526 				"Failed test for"
1527 				" rte_cryptodev_queue_pair_setup: num_inflights"
1528 				" %u on qp %u on cryptodev %u",
1529 				qp_conf.nb_descriptors, qp_id,
1530 				ts_params->valid_devs[0]);
1531 	}
1532 
1533 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1534 
1535 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1536 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1537 				ts_params->valid_devs[0], qp_id, &qp_conf,
1538 				rte_cryptodev_socket_id(
1539 						ts_params->valid_devs[0])),
1540 				"Failed test for "
1541 				"rte_cryptodev_queue_pair_setup: num_inflights"
1542 				" %u on qp %u on cryptodev %u",
1543 				qp_conf.nb_descriptors, qp_id,
1544 				ts_params->valid_devs[0]);
1545 	}
1546 
1547 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1548 
1549 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1550 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1551 				ts_params->valid_devs[0], qp_id, &qp_conf,
1552 				rte_cryptodev_socket_id(
1553 						ts_params->valid_devs[0])),
1554 				"Failed test for"
1555 				" rte_cryptodev_queue_pair_setup:"
1556 				"num_inflights %u on qp %u on cryptodev %u",
1557 				qp_conf.nb_descriptors, qp_id,
1558 				ts_params->valid_devs[0]);
1559 	}
1560 
1561 	/* test invalid queue pair id */
1562 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1563 
1564 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1565 
1566 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1567 			ts_params->valid_devs[0],
1568 			qp_id, &qp_conf,
1569 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1570 			"Failed test for rte_cryptodev_queue_pair_setup:"
1571 			"invalid qp %u on cryptodev %u",
1572 			qp_id, ts_params->valid_devs[0]);
1573 
1574 	qp_id = 0xffff; /*invalid*/
1575 
1576 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1577 			ts_params->valid_devs[0],
1578 			qp_id, &qp_conf,
1579 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1580 			"Failed test for rte_cryptodev_queue_pair_setup:"
1581 			"invalid qp %u on cryptodev %u",
1582 			qp_id, ts_params->valid_devs[0]);
1583 
1584 	return TEST_SUCCESS;
1585 }
1586 
1587 /* ***** Plaintext data for tests ***** */
1588 
1589 const char catch_22_quote_1[] =
1590 		"There was only one catch and that was Catch-22, which "
1591 		"specified that a concern for one's safety in the face of "
1592 		"dangers that were real and immediate was the process of a "
1593 		"rational mind. Orr was crazy and could be grounded. All he "
1594 		"had to do was ask; and as soon as he did, he would no longer "
1595 		"be crazy and would have to fly more missions. Orr would be "
1596 		"crazy to fly more missions and sane if he didn't, but if he "
1597 		"was sane he had to fly them. If he flew them he was crazy "
1598 		"and didn't have to; but if he didn't want to he was sane and "
1599 		"had to. Yossarian was moved very deeply by the absolute "
1600 		"simplicity of this clause of Catch-22 and let out a "
1601 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1602 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1603 
1604 const char catch_22_quote[] =
1605 		"What a lousy earth! He wondered how many people were "
1606 		"destitute that same night even in his own prosperous country, "
1607 		"how many homes were shanties, how many husbands were drunk "
1608 		"and wives socked, and how many children were bullied, abused, "
1609 		"or abandoned. How many families hungered for food they could "
1610 		"not afford to buy? How many hearts were broken? How many "
1611 		"suicides would take place that same night, how many people "
1612 		"would go insane? How many cockroaches and landlords would "
1613 		"triumph? How many winners were losers, successes failures, "
1614 		"and rich men poor men? How many wise guys were stupid? How "
1615 		"many happy endings were unhappy endings? How many honest men "
1616 		"were liars, brave men cowards, loyal men traitors, how many "
1617 		"sainted men were corrupt, how many people in positions of "
1618 		"trust had sold their souls to bodyguards, how many had never "
1619 		"had souls? How many straight-and-narrow paths were crooked "
1620 		"paths? How many best families were worst families and how "
1621 		"many good people were bad people? When you added them all up "
1622 		"and then subtracted, you might be left with only the children, "
1623 		"and perhaps with Albert Einstein and an old violinist or "
1624 		"sculptor somewhere.";
1625 
1626 #define QUOTE_480_BYTES		(480)
1627 #define QUOTE_512_BYTES		(512)
1628 #define QUOTE_768_BYTES		(768)
1629 #define QUOTE_1024_BYTES	(1024)
1630 
1631 
1632 
1633 /* ***** SHA1 Hash Tests ***** */
1634 
1635 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1636 
1637 static uint8_t hmac_sha1_key[] = {
1638 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1639 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1640 	0xDE, 0xF4, 0xDE, 0xAD };
1641 
1642 /* ***** SHA224 Hash Tests ***** */
1643 
1644 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1645 
1646 
1647 /* ***** AES-CBC Cipher Tests ***** */
1648 
1649 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1650 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1651 
1652 static uint8_t aes_cbc_key[] = {
1653 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1654 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1655 
1656 static uint8_t aes_cbc_iv[] = {
1657 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1658 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1659 
1660 
1661 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1662 
1663 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1664 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1665 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1666 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1667 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1668 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1669 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1670 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1671 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1672 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1673 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1674 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1675 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1676 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1677 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1678 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1679 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1680 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1681 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1682 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1683 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1684 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1685 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1686 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1687 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1688 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1689 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1690 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1691 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1692 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1693 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1694 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1695 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1696 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1697 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1698 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1699 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1700 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1701 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1702 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1703 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1704 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1705 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1706 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1707 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1708 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1709 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1710 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1711 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1712 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1713 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1714 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1715 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1716 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1717 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1718 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1719 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1720 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1721 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1722 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1723 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1724 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1725 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1726 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1727 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1728 };
1729 
1730 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1731 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1732 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1733 	0x18, 0x8c, 0x1d, 0x32
1734 };
1735 
1736 
1737 /* Multisession Vector context Test */
1738 /*Begin Session 0 */
1739 static uint8_t ms_aes_cbc_key0[] = {
1740 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1741 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1742 };
1743 
1744 static uint8_t ms_aes_cbc_iv0[] = {
1745 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1746 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1747 };
1748 
1749 static const uint8_t ms_aes_cbc_cipher0[] = {
1750 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1751 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1752 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1753 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1754 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1755 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1756 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1757 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1758 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1759 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1760 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1761 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1762 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1763 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1764 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1765 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1766 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1767 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1768 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1769 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1770 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1771 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1772 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1773 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1774 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1775 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1776 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1777 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1778 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1779 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1780 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1781 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1782 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1783 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1784 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1785 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1786 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1787 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1788 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1789 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1790 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1791 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1792 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1793 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1794 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1795 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1796 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1797 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1798 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1799 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1800 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1801 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1802 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1803 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1804 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1805 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1806 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1807 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1808 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1809 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1810 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1811 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1812 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1813 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1814 };
1815 
1816 
1817 static  uint8_t ms_hmac_key0[] = {
1818 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1819 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1820 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1821 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1822 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1823 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1824 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1825 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1826 };
1827 
1828 static const uint8_t ms_hmac_digest0[] = {
1829 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1830 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1831 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1832 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1833 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1834 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1835 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1836 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1837 		};
1838 
1839 /* End Session 0 */
1840 /* Begin session 1 */
1841 
1842 static  uint8_t ms_aes_cbc_key1[] = {
1843 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1844 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1845 };
1846 
1847 static  uint8_t ms_aes_cbc_iv1[] = {
1848 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1849 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1850 };
1851 
1852 static const uint8_t ms_aes_cbc_cipher1[] = {
1853 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1854 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1855 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1856 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1857 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1858 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1859 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1860 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1861 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1862 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1863 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1864 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1865 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1866 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1867 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1868 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1869 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1870 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1871 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1872 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1873 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1874 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1875 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1876 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1877 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1878 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1879 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1880 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1881 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1882 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1883 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1884 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1885 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1886 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1887 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1888 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1889 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1890 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1891 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1892 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1893 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1894 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1895 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1896 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1897 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1898 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1899 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1900 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1901 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1902 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1903 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1904 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1905 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1906 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1907 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1908 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1909 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1910 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1911 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1912 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1913 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1914 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1915 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1916 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1917 
1918 };
1919 
1920 static uint8_t ms_hmac_key1[] = {
1921 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1922 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1923 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1924 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1925 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1926 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1927 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1928 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1929 };
1930 
1931 static const uint8_t ms_hmac_digest1[] = {
1932 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1933 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1934 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1935 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1936 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1937 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1938 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1939 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1940 };
1941 /* End Session 1  */
1942 /* Begin Session 2 */
1943 static  uint8_t ms_aes_cbc_key2[] = {
1944 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1945 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1946 };
1947 
1948 static  uint8_t ms_aes_cbc_iv2[] = {
1949 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1950 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1951 };
1952 
1953 static const uint8_t ms_aes_cbc_cipher2[] = {
1954 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1955 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1956 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1957 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1958 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1959 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1960 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1961 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1962 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1963 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1964 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1965 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1966 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1967 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1968 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1969 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1970 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1971 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1972 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1973 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1974 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1975 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1976 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1977 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1978 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1979 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1980 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1981 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1982 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1983 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1984 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1985 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1986 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1987 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1988 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1989 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1990 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1991 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1992 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1993 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1994 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1995 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1996 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1997 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1998 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1999 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2000 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2001 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2002 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2003 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2004 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2005 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2006 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2007 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2008 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2009 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2010 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2011 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2012 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2013 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2014 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2015 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2016 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2017 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2018 };
2019 
2020 static  uint8_t ms_hmac_key2[] = {
2021 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2022 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2023 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2024 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2025 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2026 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2027 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2028 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2029 };
2030 
2031 static const uint8_t ms_hmac_digest2[] = {
2032 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2033 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2034 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2035 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2036 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2037 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2038 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2039 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2040 };
2041 
2042 /* End Session 2 */
2043 
2044 
2045 static int
2046 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2047 {
2048 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2049 	struct crypto_unittest_params *ut_params = &unittest_params;
2050 
2051 	/* Verify the capabilities */
2052 	struct rte_cryptodev_sym_capability_idx cap_idx;
2053 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2054 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2055 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2056 			&cap_idx) == NULL)
2057 		return TEST_SKIPPED;
2058 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2059 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2060 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2061 			&cap_idx) == NULL)
2062 		return TEST_SKIPPED;
2063 
2064 	/* Generate test mbuf data and space for digest */
2065 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2066 			catch_22_quote,	QUOTE_512_BYTES, 0);
2067 
2068 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2069 			DIGEST_BYTE_LENGTH_SHA1);
2070 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2071 
2072 	/* Setup Cipher Parameters */
2073 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2074 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2075 
2076 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2077 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2078 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2079 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2080 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2081 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2082 
2083 	/* Setup HMAC Parameters */
2084 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2085 
2086 	ut_params->auth_xform.next = NULL;
2087 
2088 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2089 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2090 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2091 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2092 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2093 
2094 	ut_params->sess = rte_cryptodev_sym_session_create(
2095 			ts_params->session_mpool);
2096 
2097 	/* Create crypto session*/
2098 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2099 			ut_params->sess, &ut_params->cipher_xform,
2100 			ts_params->session_priv_mpool);
2101 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2102 
2103 	/* Generate crypto op data structure */
2104 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2105 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2106 	TEST_ASSERT_NOT_NULL(ut_params->op,
2107 			"Failed to allocate symmetric crypto operation struct");
2108 
2109 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2110 
2111 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2112 
2113 	/* set crypto operation source mbuf */
2114 	sym_op->m_src = ut_params->ibuf;
2115 
2116 	/* Set crypto operation authentication parameters */
2117 	sym_op->auth.digest.data = ut_params->digest;
2118 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2119 			ut_params->ibuf, QUOTE_512_BYTES);
2120 
2121 	sym_op->auth.data.offset = 0;
2122 	sym_op->auth.data.length = QUOTE_512_BYTES;
2123 
2124 	/* Copy IV at the end of the crypto operation */
2125 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2126 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2127 
2128 	/* Set crypto operation cipher parameters */
2129 	sym_op->cipher.data.offset = 0;
2130 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2131 
2132 	/* Process crypto operation */
2133 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2134 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2135 			ut_params->op);
2136 	else
2137 		TEST_ASSERT_NOT_NULL(
2138 			process_crypto_request(ts_params->valid_devs[0],
2139 				ut_params->op),
2140 				"failed to process sym crypto op");
2141 
2142 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2143 			"crypto op processing failed");
2144 
2145 	/* Validate obuf */
2146 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2147 			uint8_t *);
2148 
2149 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2150 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2151 			QUOTE_512_BYTES,
2152 			"ciphertext data not as expected");
2153 
2154 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2155 
2156 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2157 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2158 			gbl_driver_id == rte_cryptodev_driver_id_get(
2159 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2160 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2161 					DIGEST_BYTE_LENGTH_SHA1,
2162 			"Generated digest data not as expected");
2163 
2164 	return TEST_SUCCESS;
2165 }
2166 
2167 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2168 
2169 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2170 
2171 static uint8_t hmac_sha512_key[] = {
2172 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2173 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2174 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2175 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2176 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2177 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2178 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2179 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2180 
2181 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2182 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2183 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2184 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2185 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2186 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2187 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2188 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2189 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2190 
2191 
2192 
2193 static int
2194 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2195 		struct crypto_unittest_params *ut_params,
2196 		uint8_t *cipher_key,
2197 		uint8_t *hmac_key);
2198 
2199 static int
2200 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2201 		struct crypto_unittest_params *ut_params,
2202 		struct crypto_testsuite_params *ts_params,
2203 		const uint8_t *cipher,
2204 		const uint8_t *digest,
2205 		const uint8_t *iv);
2206 
2207 
2208 static int
2209 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2210 		struct crypto_unittest_params *ut_params,
2211 		uint8_t *cipher_key,
2212 		uint8_t *hmac_key)
2213 {
2214 
2215 	/* Setup Cipher Parameters */
2216 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2217 	ut_params->cipher_xform.next = NULL;
2218 
2219 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2220 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2221 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2222 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2223 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2224 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2225 
2226 	/* Setup HMAC Parameters */
2227 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2228 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2229 
2230 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2231 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2232 	ut_params->auth_xform.auth.key.data = hmac_key;
2233 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2234 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2235 
2236 	return TEST_SUCCESS;
2237 }
2238 
2239 
2240 static int
2241 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2242 		struct crypto_unittest_params *ut_params,
2243 		struct crypto_testsuite_params *ts_params,
2244 		const uint8_t *cipher,
2245 		const uint8_t *digest,
2246 		const uint8_t *iv)
2247 {
2248 	/* Generate test mbuf data and digest */
2249 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2250 			(const char *)
2251 			cipher,
2252 			QUOTE_512_BYTES, 0);
2253 
2254 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2255 			DIGEST_BYTE_LENGTH_SHA512);
2256 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2257 
2258 	rte_memcpy(ut_params->digest,
2259 			digest,
2260 			DIGEST_BYTE_LENGTH_SHA512);
2261 
2262 	/* Generate Crypto op data structure */
2263 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2264 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2265 	TEST_ASSERT_NOT_NULL(ut_params->op,
2266 			"Failed to allocate symmetric crypto operation struct");
2267 
2268 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2269 
2270 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2271 
2272 	/* set crypto operation source mbuf */
2273 	sym_op->m_src = ut_params->ibuf;
2274 
2275 	sym_op->auth.digest.data = ut_params->digest;
2276 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2277 			ut_params->ibuf, QUOTE_512_BYTES);
2278 
2279 	sym_op->auth.data.offset = 0;
2280 	sym_op->auth.data.length = QUOTE_512_BYTES;
2281 
2282 	/* Copy IV at the end of the crypto operation */
2283 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2284 			iv, CIPHER_IV_LENGTH_AES_CBC);
2285 
2286 	sym_op->cipher.data.offset = 0;
2287 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2288 
2289 	/* Process crypto operation */
2290 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2291 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2292 			ut_params->op);
2293 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2294 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2295 				ut_params->op, 1, 1, 0, 0);
2296 	else
2297 		TEST_ASSERT_NOT_NULL(
2298 				process_crypto_request(ts_params->valid_devs[0],
2299 					ut_params->op),
2300 					"failed to process sym crypto op");
2301 
2302 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2303 			"crypto op processing failed");
2304 
2305 	ut_params->obuf = ut_params->op->sym->m_src;
2306 
2307 	/* Validate obuf */
2308 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2309 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2310 			catch_22_quote,
2311 			QUOTE_512_BYTES,
2312 			"Plaintext data not as expected");
2313 
2314 	/* Validate obuf */
2315 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2316 			"Digest verification failed");
2317 
2318 	return TEST_SUCCESS;
2319 }
2320 
2321 /* ***** SNOW 3G Tests ***** */
2322 static int
2323 create_wireless_algo_hash_session(uint8_t dev_id,
2324 	const uint8_t *key, const uint8_t key_len,
2325 	const uint8_t iv_len, const uint8_t auth_len,
2326 	enum rte_crypto_auth_operation op,
2327 	enum rte_crypto_auth_algorithm algo)
2328 {
2329 	uint8_t hash_key[key_len];
2330 	int status;
2331 
2332 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2333 	struct crypto_unittest_params *ut_params = &unittest_params;
2334 
2335 	memcpy(hash_key, key, key_len);
2336 
2337 	debug_hexdump(stdout, "key:", key, key_len);
2338 
2339 	/* Setup Authentication Parameters */
2340 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2341 	ut_params->auth_xform.next = NULL;
2342 
2343 	ut_params->auth_xform.auth.op = op;
2344 	ut_params->auth_xform.auth.algo = algo;
2345 	ut_params->auth_xform.auth.key.length = key_len;
2346 	ut_params->auth_xform.auth.key.data = hash_key;
2347 	ut_params->auth_xform.auth.digest_length = auth_len;
2348 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2349 	ut_params->auth_xform.auth.iv.length = iv_len;
2350 	ut_params->sess = rte_cryptodev_sym_session_create(
2351 			ts_params->session_mpool);
2352 
2353 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2354 			&ut_params->auth_xform,
2355 			ts_params->session_priv_mpool);
2356 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2357 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2358 	return 0;
2359 }
2360 
2361 static int
2362 create_wireless_algo_cipher_session(uint8_t dev_id,
2363 			enum rte_crypto_cipher_operation op,
2364 			enum rte_crypto_cipher_algorithm algo,
2365 			const uint8_t *key, const uint8_t key_len,
2366 			uint8_t iv_len)
2367 {
2368 	uint8_t cipher_key[key_len];
2369 	int status;
2370 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2371 	struct crypto_unittest_params *ut_params = &unittest_params;
2372 
2373 	memcpy(cipher_key, key, key_len);
2374 
2375 	/* Setup Cipher Parameters */
2376 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2377 	ut_params->cipher_xform.next = NULL;
2378 
2379 	ut_params->cipher_xform.cipher.algo = algo;
2380 	ut_params->cipher_xform.cipher.op = op;
2381 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2382 	ut_params->cipher_xform.cipher.key.length = key_len;
2383 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2384 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2385 
2386 	debug_hexdump(stdout, "key:", key, key_len);
2387 
2388 	/* Create Crypto session */
2389 	ut_params->sess = rte_cryptodev_sym_session_create(
2390 			ts_params->session_mpool);
2391 
2392 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2393 			&ut_params->cipher_xform,
2394 			ts_params->session_priv_mpool);
2395 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2396 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2397 	return 0;
2398 }
2399 
2400 static int
2401 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2402 			unsigned int cipher_len,
2403 			unsigned int cipher_offset)
2404 {
2405 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2406 	struct crypto_unittest_params *ut_params = &unittest_params;
2407 
2408 	/* Generate Crypto op data structure */
2409 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2410 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2411 	TEST_ASSERT_NOT_NULL(ut_params->op,
2412 				"Failed to allocate pktmbuf offload");
2413 
2414 	/* Set crypto operation data parameters */
2415 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2416 
2417 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2418 
2419 	/* set crypto operation source mbuf */
2420 	sym_op->m_src = ut_params->ibuf;
2421 
2422 	/* iv */
2423 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2424 			iv, iv_len);
2425 	sym_op->cipher.data.length = cipher_len;
2426 	sym_op->cipher.data.offset = cipher_offset;
2427 	return 0;
2428 }
2429 
2430 static int
2431 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2432 			unsigned int cipher_len,
2433 			unsigned int cipher_offset)
2434 {
2435 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2436 	struct crypto_unittest_params *ut_params = &unittest_params;
2437 
2438 	/* Generate Crypto op data structure */
2439 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2440 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2441 	TEST_ASSERT_NOT_NULL(ut_params->op,
2442 				"Failed to allocate pktmbuf offload");
2443 
2444 	/* Set crypto operation data parameters */
2445 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2446 
2447 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2448 
2449 	/* set crypto operation source mbuf */
2450 	sym_op->m_src = ut_params->ibuf;
2451 	sym_op->m_dst = ut_params->obuf;
2452 
2453 	/* iv */
2454 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2455 			iv, iv_len);
2456 	sym_op->cipher.data.length = cipher_len;
2457 	sym_op->cipher.data.offset = cipher_offset;
2458 	return 0;
2459 }
2460 
2461 static int
2462 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2463 		enum rte_crypto_cipher_operation cipher_op,
2464 		enum rte_crypto_auth_operation auth_op,
2465 		enum rte_crypto_auth_algorithm auth_algo,
2466 		enum rte_crypto_cipher_algorithm cipher_algo,
2467 		const uint8_t *key, uint8_t key_len,
2468 		uint8_t auth_iv_len, uint8_t auth_len,
2469 		uint8_t cipher_iv_len)
2470 
2471 {
2472 	uint8_t cipher_auth_key[key_len];
2473 	int status;
2474 
2475 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2476 	struct crypto_unittest_params *ut_params = &unittest_params;
2477 
2478 	memcpy(cipher_auth_key, key, key_len);
2479 
2480 	/* Setup Authentication Parameters */
2481 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2482 	ut_params->auth_xform.next = NULL;
2483 
2484 	ut_params->auth_xform.auth.op = auth_op;
2485 	ut_params->auth_xform.auth.algo = auth_algo;
2486 	ut_params->auth_xform.auth.key.length = key_len;
2487 	/* Hash key = cipher key */
2488 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2489 	ut_params->auth_xform.auth.digest_length = auth_len;
2490 	/* Auth IV will be after cipher IV */
2491 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2492 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2493 
2494 	/* Setup Cipher Parameters */
2495 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2496 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2497 
2498 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2499 	ut_params->cipher_xform.cipher.op = cipher_op;
2500 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2501 	ut_params->cipher_xform.cipher.key.length = key_len;
2502 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2503 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2504 
2505 	debug_hexdump(stdout, "key:", key, key_len);
2506 
2507 	/* Create Crypto session*/
2508 	ut_params->sess = rte_cryptodev_sym_session_create(
2509 			ts_params->session_mpool);
2510 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2511 
2512 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2513 			&ut_params->cipher_xform,
2514 			ts_params->session_priv_mpool);
2515 	if (status == -ENOTSUP)
2516 		return TEST_SKIPPED;
2517 
2518 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2519 	return 0;
2520 }
2521 
2522 static int
2523 create_wireless_cipher_auth_session(uint8_t dev_id,
2524 		enum rte_crypto_cipher_operation cipher_op,
2525 		enum rte_crypto_auth_operation auth_op,
2526 		enum rte_crypto_auth_algorithm auth_algo,
2527 		enum rte_crypto_cipher_algorithm cipher_algo,
2528 		const struct wireless_test_data *tdata)
2529 {
2530 	const uint8_t key_len = tdata->key.len;
2531 	uint8_t cipher_auth_key[key_len];
2532 	int status;
2533 
2534 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2535 	struct crypto_unittest_params *ut_params = &unittest_params;
2536 	const uint8_t *key = tdata->key.data;
2537 	const uint8_t auth_len = tdata->digest.len;
2538 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2539 	uint8_t auth_iv_len = tdata->auth_iv.len;
2540 
2541 	memcpy(cipher_auth_key, key, key_len);
2542 
2543 	/* Setup Authentication Parameters */
2544 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2545 	ut_params->auth_xform.next = NULL;
2546 
2547 	ut_params->auth_xform.auth.op = auth_op;
2548 	ut_params->auth_xform.auth.algo = auth_algo;
2549 	ut_params->auth_xform.auth.key.length = key_len;
2550 	/* Hash key = cipher key */
2551 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2552 	ut_params->auth_xform.auth.digest_length = auth_len;
2553 	/* Auth IV will be after cipher IV */
2554 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2555 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2556 
2557 	/* Setup Cipher Parameters */
2558 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2559 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2560 
2561 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2562 	ut_params->cipher_xform.cipher.op = cipher_op;
2563 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2564 	ut_params->cipher_xform.cipher.key.length = key_len;
2565 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2566 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2567 
2568 
2569 	debug_hexdump(stdout, "key:", key, key_len);
2570 
2571 	/* Create Crypto session*/
2572 	ut_params->sess = rte_cryptodev_sym_session_create(
2573 			ts_params->session_mpool);
2574 
2575 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2576 			&ut_params->cipher_xform,
2577 			ts_params->session_priv_mpool);
2578 	if (status == -ENOTSUP)
2579 		return TEST_SKIPPED;
2580 
2581 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2582 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2583 	return 0;
2584 }
2585 
2586 static int
2587 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2588 		const struct wireless_test_data *tdata)
2589 {
2590 	return create_wireless_cipher_auth_session(dev_id,
2591 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2592 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2593 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2594 }
2595 
2596 static int
2597 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2598 		enum rte_crypto_cipher_operation cipher_op,
2599 		enum rte_crypto_auth_operation auth_op,
2600 		enum rte_crypto_auth_algorithm auth_algo,
2601 		enum rte_crypto_cipher_algorithm cipher_algo,
2602 		const uint8_t *key, const uint8_t key_len,
2603 		uint8_t auth_iv_len, uint8_t auth_len,
2604 		uint8_t cipher_iv_len)
2605 {
2606 	uint8_t auth_cipher_key[key_len];
2607 	int status;
2608 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2609 	struct crypto_unittest_params *ut_params = &unittest_params;
2610 
2611 	memcpy(auth_cipher_key, key, key_len);
2612 
2613 	/* Setup Authentication Parameters */
2614 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2615 	ut_params->auth_xform.auth.op = auth_op;
2616 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2617 	ut_params->auth_xform.auth.algo = auth_algo;
2618 	ut_params->auth_xform.auth.key.length = key_len;
2619 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2620 	ut_params->auth_xform.auth.digest_length = auth_len;
2621 	/* Auth IV will be after cipher IV */
2622 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2623 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2624 
2625 	/* Setup Cipher Parameters */
2626 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2627 	ut_params->cipher_xform.next = NULL;
2628 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2629 	ut_params->cipher_xform.cipher.op = cipher_op;
2630 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2631 	ut_params->cipher_xform.cipher.key.length = key_len;
2632 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2633 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2634 
2635 	debug_hexdump(stdout, "key:", key, key_len);
2636 
2637 	/* Create Crypto session*/
2638 	ut_params->sess = rte_cryptodev_sym_session_create(
2639 			ts_params->session_mpool);
2640 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2641 
2642 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2643 		ut_params->auth_xform.next = NULL;
2644 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2645 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2646 				&ut_params->cipher_xform,
2647 				ts_params->session_priv_mpool);
2648 
2649 	} else
2650 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2651 				&ut_params->auth_xform,
2652 				ts_params->session_priv_mpool);
2653 
2654 	if (status == -ENOTSUP)
2655 		return TEST_SKIPPED;
2656 
2657 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2658 
2659 	return 0;
2660 }
2661 
2662 static int
2663 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2664 		unsigned int auth_tag_len,
2665 		const uint8_t *iv, unsigned int iv_len,
2666 		unsigned int data_pad_len,
2667 		enum rte_crypto_auth_operation op,
2668 		unsigned int auth_len, unsigned int auth_offset)
2669 {
2670 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2671 
2672 	struct crypto_unittest_params *ut_params = &unittest_params;
2673 
2674 	/* Generate Crypto op data structure */
2675 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2676 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2677 	TEST_ASSERT_NOT_NULL(ut_params->op,
2678 		"Failed to allocate pktmbuf offload");
2679 
2680 	/* Set crypto operation data parameters */
2681 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2682 
2683 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2684 
2685 	/* set crypto operation source mbuf */
2686 	sym_op->m_src = ut_params->ibuf;
2687 
2688 	/* iv */
2689 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2690 			iv, iv_len);
2691 	/* digest */
2692 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2693 					ut_params->ibuf, auth_tag_len);
2694 
2695 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2696 				"no room to append auth tag");
2697 	ut_params->digest = sym_op->auth.digest.data;
2698 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2699 			ut_params->ibuf, data_pad_len);
2700 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2701 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2702 	else
2703 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2704 
2705 	debug_hexdump(stdout, "digest:",
2706 		sym_op->auth.digest.data,
2707 		auth_tag_len);
2708 
2709 	sym_op->auth.data.length = auth_len;
2710 	sym_op->auth.data.offset = auth_offset;
2711 
2712 	return 0;
2713 }
2714 
2715 static int
2716 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2717 	enum rte_crypto_auth_operation op)
2718 {
2719 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2720 	struct crypto_unittest_params *ut_params = &unittest_params;
2721 
2722 	const uint8_t *auth_tag = tdata->digest.data;
2723 	const unsigned int auth_tag_len = tdata->digest.len;
2724 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2725 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2726 
2727 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2728 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2729 	const uint8_t *auth_iv = tdata->auth_iv.data;
2730 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2731 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2732 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2733 
2734 	/* Generate Crypto op data structure */
2735 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2736 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2737 	TEST_ASSERT_NOT_NULL(ut_params->op,
2738 			"Failed to allocate pktmbuf offload");
2739 	/* Set crypto operation data parameters */
2740 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2741 
2742 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2743 
2744 	/* set crypto operation source mbuf */
2745 	sym_op->m_src = ut_params->ibuf;
2746 
2747 	/* digest */
2748 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2749 			ut_params->ibuf, auth_tag_len);
2750 
2751 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2752 			"no room to append auth tag");
2753 	ut_params->digest = sym_op->auth.digest.data;
2754 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2755 			ut_params->ibuf, data_pad_len);
2756 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2757 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2758 	else
2759 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2760 
2761 	debug_hexdump(stdout, "digest:",
2762 		sym_op->auth.digest.data,
2763 		auth_tag_len);
2764 
2765 	/* Copy cipher and auth IVs at the end of the crypto operation */
2766 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2767 						IV_OFFSET);
2768 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2769 	iv_ptr += cipher_iv_len;
2770 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2771 
2772 	sym_op->cipher.data.length = cipher_len;
2773 	sym_op->cipher.data.offset = 0;
2774 	sym_op->auth.data.length = auth_len;
2775 	sym_op->auth.data.offset = 0;
2776 
2777 	return 0;
2778 }
2779 
2780 static int
2781 create_zuc_cipher_hash_generate_operation(
2782 		const struct wireless_test_data *tdata)
2783 {
2784 	return create_wireless_cipher_hash_operation(tdata,
2785 		RTE_CRYPTO_AUTH_OP_GENERATE);
2786 }
2787 
2788 static int
2789 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2790 		const unsigned auth_tag_len,
2791 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2792 		unsigned data_pad_len,
2793 		enum rte_crypto_auth_operation op,
2794 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2795 		const unsigned cipher_len, const unsigned cipher_offset,
2796 		const unsigned auth_len, const unsigned auth_offset)
2797 {
2798 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2799 	struct crypto_unittest_params *ut_params = &unittest_params;
2800 
2801 	enum rte_crypto_cipher_algorithm cipher_algo =
2802 			ut_params->cipher_xform.cipher.algo;
2803 	enum rte_crypto_auth_algorithm auth_algo =
2804 			ut_params->auth_xform.auth.algo;
2805 
2806 	/* Generate Crypto op data structure */
2807 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2808 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2809 	TEST_ASSERT_NOT_NULL(ut_params->op,
2810 			"Failed to allocate pktmbuf offload");
2811 	/* Set crypto operation data parameters */
2812 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2813 
2814 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2815 
2816 	/* set crypto operation source mbuf */
2817 	sym_op->m_src = ut_params->ibuf;
2818 
2819 	/* digest */
2820 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2821 			ut_params->ibuf, auth_tag_len);
2822 
2823 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2824 			"no room to append auth tag");
2825 	ut_params->digest = sym_op->auth.digest.data;
2826 
2827 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2828 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2829 				ut_params->ibuf, data_pad_len);
2830 	} else {
2831 		struct rte_mbuf *m = ut_params->ibuf;
2832 		unsigned int offset = data_pad_len;
2833 
2834 		while (offset > m->data_len && m->next != NULL) {
2835 			offset -= m->data_len;
2836 			m = m->next;
2837 		}
2838 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2839 			m, offset);
2840 	}
2841 
2842 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2843 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2844 	else
2845 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2846 
2847 	debug_hexdump(stdout, "digest:",
2848 		sym_op->auth.digest.data,
2849 		auth_tag_len);
2850 
2851 	/* Copy cipher and auth IVs at the end of the crypto operation */
2852 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2853 						IV_OFFSET);
2854 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2855 	iv_ptr += cipher_iv_len;
2856 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2857 
2858 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2859 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2860 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2861 		sym_op->cipher.data.length = cipher_len;
2862 		sym_op->cipher.data.offset = cipher_offset;
2863 	} else {
2864 		sym_op->cipher.data.length = cipher_len >> 3;
2865 		sym_op->cipher.data.offset = cipher_offset >> 3;
2866 	}
2867 
2868 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2869 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2870 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2871 		sym_op->auth.data.length = auth_len;
2872 		sym_op->auth.data.offset = auth_offset;
2873 	} else {
2874 		sym_op->auth.data.length = auth_len >> 3;
2875 		sym_op->auth.data.offset = auth_offset >> 3;
2876 	}
2877 
2878 	return 0;
2879 }
2880 
2881 static int
2882 create_wireless_algo_auth_cipher_operation(
2883 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2884 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2885 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2886 		unsigned int data_pad_len,
2887 		unsigned int cipher_len, unsigned int cipher_offset,
2888 		unsigned int auth_len, unsigned int auth_offset,
2889 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2890 {
2891 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2892 	struct crypto_unittest_params *ut_params = &unittest_params;
2893 
2894 	enum rte_crypto_cipher_algorithm cipher_algo =
2895 			ut_params->cipher_xform.cipher.algo;
2896 	enum rte_crypto_auth_algorithm auth_algo =
2897 			ut_params->auth_xform.auth.algo;
2898 
2899 	/* Generate Crypto op data structure */
2900 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2901 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2902 	TEST_ASSERT_NOT_NULL(ut_params->op,
2903 			"Failed to allocate pktmbuf offload");
2904 
2905 	/* Set crypto operation data parameters */
2906 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2907 
2908 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2909 
2910 	/* set crypto operation mbufs */
2911 	sym_op->m_src = ut_params->ibuf;
2912 	if (op_mode == OUT_OF_PLACE)
2913 		sym_op->m_dst = ut_params->obuf;
2914 
2915 	/* digest */
2916 	if (!do_sgl) {
2917 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2918 			(op_mode == IN_PLACE ?
2919 				ut_params->ibuf : ut_params->obuf),
2920 			uint8_t *, data_pad_len);
2921 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2922 			(op_mode == IN_PLACE ?
2923 				ut_params->ibuf : ut_params->obuf),
2924 			data_pad_len);
2925 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2926 	} else {
2927 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2928 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2929 				sym_op->m_src : sym_op->m_dst);
2930 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2931 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2932 			sgl_buf = sgl_buf->next;
2933 		}
2934 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2935 				uint8_t *, remaining_off);
2936 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2937 				remaining_off);
2938 		memset(sym_op->auth.digest.data, 0, remaining_off);
2939 		while (sgl_buf->next != NULL) {
2940 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2941 				0, rte_pktmbuf_data_len(sgl_buf));
2942 			sgl_buf = sgl_buf->next;
2943 		}
2944 	}
2945 
2946 	/* Copy digest for the verification */
2947 	if (verify)
2948 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2949 
2950 	/* Copy cipher and auth IVs at the end of the crypto operation */
2951 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2952 			ut_params->op, uint8_t *, IV_OFFSET);
2953 
2954 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2955 	iv_ptr += cipher_iv_len;
2956 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2957 
2958 	/* Only copy over the offset data needed from src to dst in OOP,
2959 	 * if the auth and cipher offsets are not aligned
2960 	 */
2961 	if (op_mode == OUT_OF_PLACE) {
2962 		if (cipher_offset > auth_offset)
2963 			rte_memcpy(
2964 				rte_pktmbuf_mtod_offset(
2965 					sym_op->m_dst,
2966 					uint8_t *, auth_offset >> 3),
2967 				rte_pktmbuf_mtod_offset(
2968 					sym_op->m_src,
2969 					uint8_t *, auth_offset >> 3),
2970 				((cipher_offset >> 3) - (auth_offset >> 3)));
2971 	}
2972 
2973 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2974 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2975 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2976 		sym_op->cipher.data.length = cipher_len;
2977 		sym_op->cipher.data.offset = cipher_offset;
2978 	} else {
2979 		sym_op->cipher.data.length = cipher_len >> 3;
2980 		sym_op->cipher.data.offset = cipher_offset >> 3;
2981 	}
2982 
2983 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2984 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2985 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2986 		sym_op->auth.data.length = auth_len;
2987 		sym_op->auth.data.offset = auth_offset;
2988 	} else {
2989 		sym_op->auth.data.length = auth_len >> 3;
2990 		sym_op->auth.data.offset = auth_offset >> 3;
2991 	}
2992 
2993 	return 0;
2994 }
2995 
2996 static int
2997 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2998 {
2999 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3000 	struct crypto_unittest_params *ut_params = &unittest_params;
3001 
3002 	int retval;
3003 	unsigned plaintext_pad_len;
3004 	unsigned plaintext_len;
3005 	uint8_t *plaintext;
3006 	struct rte_cryptodev_info dev_info;
3007 
3008 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3009 	uint64_t feat_flags = dev_info.feature_flags;
3010 
3011 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3012 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3013 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3014 		return TEST_SKIPPED;
3015 	}
3016 
3017 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3018 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3019 		printf("Device doesn't support RAW data-path APIs.\n");
3020 		return TEST_SKIPPED;
3021 	}
3022 
3023 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3024 		return TEST_SKIPPED;
3025 
3026 	/* Verify the capabilities */
3027 	struct rte_cryptodev_sym_capability_idx cap_idx;
3028 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3029 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3030 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3031 			&cap_idx) == NULL)
3032 		return TEST_SKIPPED;
3033 
3034 	/* Create SNOW 3G session */
3035 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3036 			tdata->key.data, tdata->key.len,
3037 			tdata->auth_iv.len, tdata->digest.len,
3038 			RTE_CRYPTO_AUTH_OP_GENERATE,
3039 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3040 	if (retval < 0)
3041 		return retval;
3042 
3043 	/* alloc mbuf and set payload */
3044 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3045 
3046 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3047 	rte_pktmbuf_tailroom(ut_params->ibuf));
3048 
3049 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3050 	/* Append data which is padded to a multiple of */
3051 	/* the algorithms block size */
3052 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3053 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3054 				plaintext_pad_len);
3055 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3056 
3057 	/* Create SNOW 3G operation */
3058 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3059 			tdata->auth_iv.data, tdata->auth_iv.len,
3060 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3061 			tdata->validAuthLenInBits.len,
3062 			0);
3063 	if (retval < 0)
3064 		return retval;
3065 
3066 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3067 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3068 				ut_params->op, 0, 1, 1, 0);
3069 	else
3070 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3071 				ut_params->op);
3072 	ut_params->obuf = ut_params->op->sym->m_src;
3073 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3074 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3075 			+ plaintext_pad_len;
3076 
3077 	/* Validate obuf */
3078 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3079 	ut_params->digest,
3080 	tdata->digest.data,
3081 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3082 	"SNOW 3G Generated auth tag not as expected");
3083 
3084 	return 0;
3085 }
3086 
3087 static int
3088 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3089 {
3090 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3091 	struct crypto_unittest_params *ut_params = &unittest_params;
3092 
3093 	int retval;
3094 	unsigned plaintext_pad_len;
3095 	unsigned plaintext_len;
3096 	uint8_t *plaintext;
3097 	struct rte_cryptodev_info dev_info;
3098 
3099 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3100 	uint64_t feat_flags = dev_info.feature_flags;
3101 
3102 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3103 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3104 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3105 		return TEST_SKIPPED;
3106 	}
3107 
3108 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3109 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3110 		printf("Device doesn't support RAW data-path APIs.\n");
3111 		return TEST_SKIPPED;
3112 	}
3113 
3114 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3115 		return TEST_SKIPPED;
3116 
3117 	/* Verify the capabilities */
3118 	struct rte_cryptodev_sym_capability_idx cap_idx;
3119 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3120 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3121 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3122 			&cap_idx) == NULL)
3123 		return TEST_SKIPPED;
3124 
3125 	/* Create SNOW 3G session */
3126 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3127 				tdata->key.data, tdata->key.len,
3128 				tdata->auth_iv.len, tdata->digest.len,
3129 				RTE_CRYPTO_AUTH_OP_VERIFY,
3130 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3131 	if (retval < 0)
3132 		return retval;
3133 	/* alloc mbuf and set payload */
3134 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3135 
3136 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3137 	rte_pktmbuf_tailroom(ut_params->ibuf));
3138 
3139 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3140 	/* Append data which is padded to a multiple of */
3141 	/* the algorithms block size */
3142 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3143 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3144 				plaintext_pad_len);
3145 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3146 
3147 	/* Create SNOW 3G operation */
3148 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3149 			tdata->digest.len,
3150 			tdata->auth_iv.data, tdata->auth_iv.len,
3151 			plaintext_pad_len,
3152 			RTE_CRYPTO_AUTH_OP_VERIFY,
3153 			tdata->validAuthLenInBits.len,
3154 			0);
3155 	if (retval < 0)
3156 		return retval;
3157 
3158 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3159 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3160 				ut_params->op, 0, 1, 1, 0);
3161 	else
3162 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3163 				ut_params->op);
3164 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3165 	ut_params->obuf = ut_params->op->sym->m_src;
3166 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3167 				+ plaintext_pad_len;
3168 
3169 	/* Validate obuf */
3170 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3171 		return 0;
3172 	else
3173 		return -1;
3174 
3175 	return 0;
3176 }
3177 
3178 static int
3179 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3180 {
3181 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3182 	struct crypto_unittest_params *ut_params = &unittest_params;
3183 
3184 	int retval;
3185 	unsigned plaintext_pad_len;
3186 	unsigned plaintext_len;
3187 	uint8_t *plaintext;
3188 	struct rte_cryptodev_info dev_info;
3189 
3190 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3191 	uint64_t feat_flags = dev_info.feature_flags;
3192 
3193 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3194 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3195 		printf("Device doesn't support RAW data-path APIs.\n");
3196 		return TEST_SKIPPED;
3197 	}
3198 
3199 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3200 		return TEST_SKIPPED;
3201 
3202 	/* Verify the capabilities */
3203 	struct rte_cryptodev_sym_capability_idx cap_idx;
3204 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3205 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3206 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3207 			&cap_idx) == NULL)
3208 		return TEST_SKIPPED;
3209 
3210 	/* Create KASUMI session */
3211 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3212 			tdata->key.data, tdata->key.len,
3213 			0, tdata->digest.len,
3214 			RTE_CRYPTO_AUTH_OP_GENERATE,
3215 			RTE_CRYPTO_AUTH_KASUMI_F9);
3216 	if (retval < 0)
3217 		return retval;
3218 
3219 	/* alloc mbuf and set payload */
3220 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3221 
3222 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3223 	rte_pktmbuf_tailroom(ut_params->ibuf));
3224 
3225 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3226 	/* Append data which is padded to a multiple of */
3227 	/* the algorithms block size */
3228 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3229 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3230 				plaintext_pad_len);
3231 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3232 
3233 	/* Create KASUMI operation */
3234 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3235 			NULL, 0,
3236 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3237 			tdata->plaintext.len,
3238 			0);
3239 	if (retval < 0)
3240 		return retval;
3241 
3242 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3243 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3244 			ut_params->op);
3245 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3246 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3247 				ut_params->op, 0, 1, 1, 0);
3248 	else
3249 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3250 			ut_params->op);
3251 
3252 	ut_params->obuf = ut_params->op->sym->m_src;
3253 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3254 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3255 			+ plaintext_pad_len;
3256 
3257 	/* Validate obuf */
3258 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3259 	ut_params->digest,
3260 	tdata->digest.data,
3261 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3262 	"KASUMI Generated auth tag not as expected");
3263 
3264 	return 0;
3265 }
3266 
3267 static int
3268 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3269 {
3270 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3271 	struct crypto_unittest_params *ut_params = &unittest_params;
3272 
3273 	int retval;
3274 	unsigned plaintext_pad_len;
3275 	unsigned plaintext_len;
3276 	uint8_t *plaintext;
3277 	struct rte_cryptodev_info dev_info;
3278 
3279 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3280 	uint64_t feat_flags = dev_info.feature_flags;
3281 
3282 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3283 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3284 		printf("Device doesn't support RAW data-path APIs.\n");
3285 		return TEST_SKIPPED;
3286 	}
3287 
3288 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3289 		return TEST_SKIPPED;
3290 
3291 	/* Verify the capabilities */
3292 	struct rte_cryptodev_sym_capability_idx cap_idx;
3293 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3294 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3295 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3296 			&cap_idx) == NULL)
3297 		return TEST_SKIPPED;
3298 
3299 	/* Create KASUMI session */
3300 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3301 				tdata->key.data, tdata->key.len,
3302 				0, tdata->digest.len,
3303 				RTE_CRYPTO_AUTH_OP_VERIFY,
3304 				RTE_CRYPTO_AUTH_KASUMI_F9);
3305 	if (retval < 0)
3306 		return retval;
3307 	/* alloc mbuf and set payload */
3308 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3309 
3310 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3311 	rte_pktmbuf_tailroom(ut_params->ibuf));
3312 
3313 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3314 	/* Append data which is padded to a multiple */
3315 	/* of the algorithms block size */
3316 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3317 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3318 				plaintext_pad_len);
3319 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3320 
3321 	/* Create KASUMI operation */
3322 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3323 			tdata->digest.len,
3324 			NULL, 0,
3325 			plaintext_pad_len,
3326 			RTE_CRYPTO_AUTH_OP_VERIFY,
3327 			tdata->plaintext.len,
3328 			0);
3329 	if (retval < 0)
3330 		return retval;
3331 
3332 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3333 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3334 				ut_params->op, 0, 1, 1, 0);
3335 	else
3336 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3337 				ut_params->op);
3338 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3339 	ut_params->obuf = ut_params->op->sym->m_src;
3340 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3341 				+ plaintext_pad_len;
3342 
3343 	/* Validate obuf */
3344 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3345 		return 0;
3346 	else
3347 		return -1;
3348 
3349 	return 0;
3350 }
3351 
3352 static int
3353 test_snow3g_hash_generate_test_case_1(void)
3354 {
3355 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3356 }
3357 
3358 static int
3359 test_snow3g_hash_generate_test_case_2(void)
3360 {
3361 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3362 }
3363 
3364 static int
3365 test_snow3g_hash_generate_test_case_3(void)
3366 {
3367 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3368 }
3369 
3370 static int
3371 test_snow3g_hash_generate_test_case_4(void)
3372 {
3373 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3374 }
3375 
3376 static int
3377 test_snow3g_hash_generate_test_case_5(void)
3378 {
3379 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3380 }
3381 
3382 static int
3383 test_snow3g_hash_generate_test_case_6(void)
3384 {
3385 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3386 }
3387 
3388 static int
3389 test_snow3g_hash_verify_test_case_1(void)
3390 {
3391 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3392 
3393 }
3394 
3395 static int
3396 test_snow3g_hash_verify_test_case_2(void)
3397 {
3398 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3399 }
3400 
3401 static int
3402 test_snow3g_hash_verify_test_case_3(void)
3403 {
3404 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3405 }
3406 
3407 static int
3408 test_snow3g_hash_verify_test_case_4(void)
3409 {
3410 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3411 }
3412 
3413 static int
3414 test_snow3g_hash_verify_test_case_5(void)
3415 {
3416 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3417 }
3418 
3419 static int
3420 test_snow3g_hash_verify_test_case_6(void)
3421 {
3422 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3423 }
3424 
3425 static int
3426 test_kasumi_hash_generate_test_case_1(void)
3427 {
3428 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3429 }
3430 
3431 static int
3432 test_kasumi_hash_generate_test_case_2(void)
3433 {
3434 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3435 }
3436 
3437 static int
3438 test_kasumi_hash_generate_test_case_3(void)
3439 {
3440 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3441 }
3442 
3443 static int
3444 test_kasumi_hash_generate_test_case_4(void)
3445 {
3446 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3447 }
3448 
3449 static int
3450 test_kasumi_hash_generate_test_case_5(void)
3451 {
3452 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3453 }
3454 
3455 static int
3456 test_kasumi_hash_generate_test_case_6(void)
3457 {
3458 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3459 }
3460 
3461 static int
3462 test_kasumi_hash_verify_test_case_1(void)
3463 {
3464 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3465 }
3466 
3467 static int
3468 test_kasumi_hash_verify_test_case_2(void)
3469 {
3470 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3471 }
3472 
3473 static int
3474 test_kasumi_hash_verify_test_case_3(void)
3475 {
3476 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3477 }
3478 
3479 static int
3480 test_kasumi_hash_verify_test_case_4(void)
3481 {
3482 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3483 }
3484 
3485 static int
3486 test_kasumi_hash_verify_test_case_5(void)
3487 {
3488 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3489 }
3490 
3491 static int
3492 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3493 {
3494 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3495 	struct crypto_unittest_params *ut_params = &unittest_params;
3496 
3497 	int retval;
3498 	uint8_t *plaintext, *ciphertext;
3499 	unsigned plaintext_pad_len;
3500 	unsigned plaintext_len;
3501 	struct rte_cryptodev_info dev_info;
3502 
3503 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3504 	uint64_t feat_flags = dev_info.feature_flags;
3505 
3506 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3507 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3508 		printf("Device doesn't support RAW data-path APIs.\n");
3509 		return TEST_SKIPPED;
3510 	}
3511 
3512 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3513 		return TEST_SKIPPED;
3514 
3515 	/* Verify the capabilities */
3516 	struct rte_cryptodev_sym_capability_idx cap_idx;
3517 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3518 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3519 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3520 			&cap_idx) == NULL)
3521 		return TEST_SKIPPED;
3522 
3523 	/* Create KASUMI session */
3524 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3525 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3526 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3527 					tdata->key.data, tdata->key.len,
3528 					tdata->cipher_iv.len);
3529 	if (retval < 0)
3530 		return retval;
3531 
3532 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3533 
3534 	/* Clear mbuf payload */
3535 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3536 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3537 
3538 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3539 	/* Append data which is padded to a multiple */
3540 	/* of the algorithms block size */
3541 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3542 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3543 				plaintext_pad_len);
3544 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3545 
3546 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3547 
3548 	/* Create KASUMI operation */
3549 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3550 				tdata->cipher_iv.len,
3551 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3552 				tdata->validCipherOffsetInBits.len);
3553 	if (retval < 0)
3554 		return retval;
3555 
3556 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3557 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3558 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3559 	else
3560 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3561 				ut_params->op);
3562 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3563 
3564 	ut_params->obuf = ut_params->op->sym->m_dst;
3565 	if (ut_params->obuf)
3566 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3567 	else
3568 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3569 
3570 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3571 
3572 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3573 				(tdata->validCipherOffsetInBits.len >> 3);
3574 	/* Validate obuf */
3575 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3576 		ciphertext,
3577 		reference_ciphertext,
3578 		tdata->validCipherLenInBits.len,
3579 		"KASUMI Ciphertext data not as expected");
3580 	return 0;
3581 }
3582 
3583 static int
3584 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3585 {
3586 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3587 	struct crypto_unittest_params *ut_params = &unittest_params;
3588 
3589 	int retval;
3590 
3591 	unsigned int plaintext_pad_len;
3592 	unsigned int plaintext_len;
3593 
3594 	uint8_t buffer[10000];
3595 	const uint8_t *ciphertext;
3596 
3597 	struct rte_cryptodev_info dev_info;
3598 
3599 	/* Verify the capabilities */
3600 	struct rte_cryptodev_sym_capability_idx cap_idx;
3601 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3602 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3603 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3604 			&cap_idx) == NULL)
3605 		return TEST_SKIPPED;
3606 
3607 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3608 
3609 	uint64_t feat_flags = dev_info.feature_flags;
3610 
3611 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3612 		printf("Device doesn't support in-place scatter-gather. "
3613 				"Test Skipped.\n");
3614 		return TEST_SKIPPED;
3615 	}
3616 
3617 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3618 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3619 		printf("Device doesn't support RAW data-path APIs.\n");
3620 		return TEST_SKIPPED;
3621 	}
3622 
3623 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3624 		return TEST_SKIPPED;
3625 
3626 	/* Create KASUMI session */
3627 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3628 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3629 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3630 					tdata->key.data, tdata->key.len,
3631 					tdata->cipher_iv.len);
3632 	if (retval < 0)
3633 		return retval;
3634 
3635 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3636 
3637 
3638 	/* Append data which is padded to a multiple */
3639 	/* of the algorithms block size */
3640 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3641 
3642 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3643 			plaintext_pad_len, 10, 0);
3644 
3645 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3646 
3647 	/* Create KASUMI operation */
3648 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3649 				tdata->cipher_iv.len,
3650 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3651 				tdata->validCipherOffsetInBits.len);
3652 	if (retval < 0)
3653 		return retval;
3654 
3655 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3656 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3657 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3658 	else
3659 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3660 						ut_params->op);
3661 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3662 
3663 	ut_params->obuf = ut_params->op->sym->m_dst;
3664 
3665 	if (ut_params->obuf)
3666 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3667 				plaintext_len, buffer);
3668 	else
3669 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3670 				tdata->validCipherOffsetInBits.len >> 3,
3671 				plaintext_len, buffer);
3672 
3673 	/* Validate obuf */
3674 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3675 
3676 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3677 				(tdata->validCipherOffsetInBits.len >> 3);
3678 	/* Validate obuf */
3679 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3680 		ciphertext,
3681 		reference_ciphertext,
3682 		tdata->validCipherLenInBits.len,
3683 		"KASUMI Ciphertext data not as expected");
3684 	return 0;
3685 }
3686 
3687 static int
3688 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3689 {
3690 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3691 	struct crypto_unittest_params *ut_params = &unittest_params;
3692 
3693 	int retval;
3694 	uint8_t *plaintext, *ciphertext;
3695 	unsigned plaintext_pad_len;
3696 	unsigned plaintext_len;
3697 
3698 	/* Verify the capabilities */
3699 	struct rte_cryptodev_sym_capability_idx cap_idx;
3700 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3701 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3702 	/* Data-path service does not support OOP */
3703 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3704 			&cap_idx) == NULL)
3705 		return TEST_SKIPPED;
3706 
3707 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3708 		return TEST_SKIPPED;
3709 
3710 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3711 		return TEST_SKIPPED;
3712 
3713 	/* Create KASUMI session */
3714 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3715 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3716 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3717 					tdata->key.data, tdata->key.len,
3718 					tdata->cipher_iv.len);
3719 	if (retval < 0)
3720 		return retval;
3721 
3722 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3723 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3724 
3725 	/* Clear mbuf payload */
3726 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3727 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3728 
3729 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3730 	/* Append data which is padded to a multiple */
3731 	/* of the algorithms block size */
3732 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3733 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3734 				plaintext_pad_len);
3735 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3736 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3737 
3738 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3739 
3740 	/* Create KASUMI operation */
3741 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3742 				tdata->cipher_iv.len,
3743 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3744 				tdata->validCipherOffsetInBits.len);
3745 	if (retval < 0)
3746 		return retval;
3747 
3748 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3749 						ut_params->op);
3750 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3751 
3752 	ut_params->obuf = ut_params->op->sym->m_dst;
3753 	if (ut_params->obuf)
3754 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3755 	else
3756 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3757 
3758 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3759 
3760 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3761 				(tdata->validCipherOffsetInBits.len >> 3);
3762 	/* Validate obuf */
3763 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3764 		ciphertext,
3765 		reference_ciphertext,
3766 		tdata->validCipherLenInBits.len,
3767 		"KASUMI Ciphertext data not as expected");
3768 	return 0;
3769 }
3770 
3771 static int
3772 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3773 {
3774 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3775 	struct crypto_unittest_params *ut_params = &unittest_params;
3776 
3777 	int retval;
3778 	unsigned int plaintext_pad_len;
3779 	unsigned int plaintext_len;
3780 
3781 	const uint8_t *ciphertext;
3782 	uint8_t buffer[2048];
3783 
3784 	struct rte_cryptodev_info dev_info;
3785 
3786 	/* Verify the capabilities */
3787 	struct rte_cryptodev_sym_capability_idx cap_idx;
3788 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3789 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3790 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3791 			&cap_idx) == NULL)
3792 		return TEST_SKIPPED;
3793 
3794 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3795 		return TEST_SKIPPED;
3796 
3797 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3798 		return TEST_SKIPPED;
3799 
3800 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3801 
3802 	uint64_t feat_flags = dev_info.feature_flags;
3803 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3804 		printf("Device doesn't support out-of-place scatter-gather "
3805 				"in both input and output mbufs. "
3806 				"Test Skipped.\n");
3807 		return TEST_SKIPPED;
3808 	}
3809 
3810 	/* Create KASUMI session */
3811 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3812 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3813 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3814 					tdata->key.data, tdata->key.len,
3815 					tdata->cipher_iv.len);
3816 	if (retval < 0)
3817 		return retval;
3818 
3819 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3820 	/* Append data which is padded to a multiple */
3821 	/* of the algorithms block size */
3822 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3823 
3824 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3825 			plaintext_pad_len, 10, 0);
3826 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3827 			plaintext_pad_len, 3, 0);
3828 
3829 	/* Append data which is padded to a multiple */
3830 	/* of the algorithms block size */
3831 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3832 
3833 	/* Create KASUMI operation */
3834 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3835 				tdata->cipher_iv.len,
3836 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3837 				tdata->validCipherOffsetInBits.len);
3838 	if (retval < 0)
3839 		return retval;
3840 
3841 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3842 						ut_params->op);
3843 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3844 
3845 	ut_params->obuf = ut_params->op->sym->m_dst;
3846 	if (ut_params->obuf)
3847 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3848 				plaintext_pad_len, buffer);
3849 	else
3850 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3851 				tdata->validCipherOffsetInBits.len >> 3,
3852 				plaintext_pad_len, buffer);
3853 
3854 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3855 				(tdata->validCipherOffsetInBits.len >> 3);
3856 	/* Validate obuf */
3857 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3858 		ciphertext,
3859 		reference_ciphertext,
3860 		tdata->validCipherLenInBits.len,
3861 		"KASUMI Ciphertext data not as expected");
3862 	return 0;
3863 }
3864 
3865 
3866 static int
3867 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3868 {
3869 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3870 	struct crypto_unittest_params *ut_params = &unittest_params;
3871 
3872 	int retval;
3873 	uint8_t *ciphertext, *plaintext;
3874 	unsigned ciphertext_pad_len;
3875 	unsigned ciphertext_len;
3876 
3877 	/* Verify the capabilities */
3878 	struct rte_cryptodev_sym_capability_idx cap_idx;
3879 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3880 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3881 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3882 			&cap_idx) == NULL)
3883 		return TEST_SKIPPED;
3884 
3885 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3886 		return TEST_SKIPPED;
3887 
3888 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3889 		return TEST_SKIPPED;
3890 
3891 	/* Create KASUMI session */
3892 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3893 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3894 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3895 					tdata->key.data, tdata->key.len,
3896 					tdata->cipher_iv.len);
3897 	if (retval < 0)
3898 		return retval;
3899 
3900 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3901 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3902 
3903 	/* Clear mbuf payload */
3904 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3905 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3906 
3907 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3908 	/* Append data which is padded to a multiple */
3909 	/* of the algorithms block size */
3910 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3911 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3912 				ciphertext_pad_len);
3913 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3914 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3915 
3916 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3917 
3918 	/* Create KASUMI operation */
3919 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3920 				tdata->cipher_iv.len,
3921 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3922 				tdata->validCipherOffsetInBits.len);
3923 	if (retval < 0)
3924 		return retval;
3925 
3926 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3927 						ut_params->op);
3928 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3929 
3930 	ut_params->obuf = ut_params->op->sym->m_dst;
3931 	if (ut_params->obuf)
3932 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3933 	else
3934 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3935 
3936 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3937 
3938 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3939 				(tdata->validCipherOffsetInBits.len >> 3);
3940 	/* Validate obuf */
3941 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3942 		plaintext,
3943 		reference_plaintext,
3944 		tdata->validCipherLenInBits.len,
3945 		"KASUMI Plaintext data not as expected");
3946 	return 0;
3947 }
3948 
3949 static int
3950 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3951 {
3952 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3953 	struct crypto_unittest_params *ut_params = &unittest_params;
3954 
3955 	int retval;
3956 	uint8_t *ciphertext, *plaintext;
3957 	unsigned ciphertext_pad_len;
3958 	unsigned ciphertext_len;
3959 	struct rte_cryptodev_info dev_info;
3960 
3961 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3962 	uint64_t feat_flags = dev_info.feature_flags;
3963 
3964 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3965 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3966 		printf("Device doesn't support RAW data-path APIs.\n");
3967 		return TEST_SKIPPED;
3968 	}
3969 
3970 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3971 		return TEST_SKIPPED;
3972 
3973 	/* Verify the capabilities */
3974 	struct rte_cryptodev_sym_capability_idx cap_idx;
3975 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3976 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3977 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3978 			&cap_idx) == NULL)
3979 		return TEST_SKIPPED;
3980 
3981 	/* Create KASUMI session */
3982 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3983 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3984 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3985 					tdata->key.data, tdata->key.len,
3986 					tdata->cipher_iv.len);
3987 	if (retval < 0)
3988 		return retval;
3989 
3990 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3991 
3992 	/* Clear mbuf payload */
3993 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3994 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3995 
3996 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3997 	/* Append data which is padded to a multiple */
3998 	/* of the algorithms block size */
3999 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4000 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4001 				ciphertext_pad_len);
4002 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4003 
4004 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4005 
4006 	/* Create KASUMI operation */
4007 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4008 					tdata->cipher_iv.len,
4009 					tdata->ciphertext.len,
4010 					tdata->validCipherOffsetInBits.len);
4011 	if (retval < 0)
4012 		return retval;
4013 
4014 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4015 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4016 				ut_params->op, 1, 0, 1, 0);
4017 	else
4018 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4019 						ut_params->op);
4020 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4021 
4022 	ut_params->obuf = ut_params->op->sym->m_dst;
4023 	if (ut_params->obuf)
4024 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4025 	else
4026 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4027 
4028 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4029 
4030 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4031 				(tdata->validCipherOffsetInBits.len >> 3);
4032 	/* Validate obuf */
4033 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4034 		plaintext,
4035 		reference_plaintext,
4036 		tdata->validCipherLenInBits.len,
4037 		"KASUMI Plaintext data not as expected");
4038 	return 0;
4039 }
4040 
4041 static int
4042 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4043 {
4044 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4045 	struct crypto_unittest_params *ut_params = &unittest_params;
4046 
4047 	int retval;
4048 	uint8_t *plaintext, *ciphertext;
4049 	unsigned plaintext_pad_len;
4050 	unsigned plaintext_len;
4051 	struct rte_cryptodev_info dev_info;
4052 
4053 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4054 	uint64_t feat_flags = dev_info.feature_flags;
4055 
4056 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4057 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4058 		printf("Device doesn't support RAW data-path APIs.\n");
4059 		return TEST_SKIPPED;
4060 	}
4061 
4062 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4063 		return TEST_SKIPPED;
4064 
4065 	/* Verify the capabilities */
4066 	struct rte_cryptodev_sym_capability_idx cap_idx;
4067 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4068 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4069 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4070 			&cap_idx) == NULL)
4071 		return TEST_SKIPPED;
4072 
4073 	/* Create SNOW 3G session */
4074 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4075 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4076 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4077 					tdata->key.data, tdata->key.len,
4078 					tdata->cipher_iv.len);
4079 	if (retval < 0)
4080 		return retval;
4081 
4082 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4083 
4084 	/* Clear mbuf payload */
4085 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4086 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4087 
4088 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4089 	/* Append data which is padded to a multiple of */
4090 	/* the algorithms block size */
4091 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4092 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4093 				plaintext_pad_len);
4094 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4095 
4096 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4097 
4098 	/* Create SNOW 3G operation */
4099 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4100 					tdata->cipher_iv.len,
4101 					tdata->validCipherLenInBits.len,
4102 					0);
4103 	if (retval < 0)
4104 		return retval;
4105 
4106 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4107 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4108 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4109 	else
4110 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4111 						ut_params->op);
4112 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4113 
4114 	ut_params->obuf = ut_params->op->sym->m_dst;
4115 	if (ut_params->obuf)
4116 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4117 	else
4118 		ciphertext = plaintext;
4119 
4120 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4121 
4122 	/* Validate obuf */
4123 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4124 		ciphertext,
4125 		tdata->ciphertext.data,
4126 		tdata->validDataLenInBits.len,
4127 		"SNOW 3G Ciphertext data not as expected");
4128 	return 0;
4129 }
4130 
4131 
4132 static int
4133 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4134 {
4135 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4136 	struct crypto_unittest_params *ut_params = &unittest_params;
4137 	uint8_t *plaintext, *ciphertext;
4138 
4139 	int retval;
4140 	unsigned plaintext_pad_len;
4141 	unsigned plaintext_len;
4142 
4143 	/* Verify the capabilities */
4144 	struct rte_cryptodev_sym_capability_idx cap_idx;
4145 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4146 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4147 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4148 			&cap_idx) == NULL)
4149 		return TEST_SKIPPED;
4150 
4151 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4152 		return TEST_SKIPPED;
4153 
4154 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4155 		return TEST_SKIPPED;
4156 
4157 	/* Create SNOW 3G session */
4158 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4159 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4160 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4161 					tdata->key.data, tdata->key.len,
4162 					tdata->cipher_iv.len);
4163 	if (retval < 0)
4164 		return retval;
4165 
4166 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4167 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4168 
4169 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4170 			"Failed to allocate input buffer in mempool");
4171 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4172 			"Failed to allocate output buffer in mempool");
4173 
4174 	/* Clear mbuf payload */
4175 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4176 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4177 
4178 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4179 	/* Append data which is padded to a multiple of */
4180 	/* the algorithms block size */
4181 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4182 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4183 				plaintext_pad_len);
4184 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4185 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4186 
4187 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4188 
4189 	/* Create SNOW 3G operation */
4190 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4191 					tdata->cipher_iv.len,
4192 					tdata->validCipherLenInBits.len,
4193 					0);
4194 	if (retval < 0)
4195 		return retval;
4196 
4197 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4198 						ut_params->op);
4199 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4200 
4201 	ut_params->obuf = ut_params->op->sym->m_dst;
4202 	if (ut_params->obuf)
4203 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4204 	else
4205 		ciphertext = plaintext;
4206 
4207 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4208 
4209 	/* Validate obuf */
4210 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4211 		ciphertext,
4212 		tdata->ciphertext.data,
4213 		tdata->validDataLenInBits.len,
4214 		"SNOW 3G Ciphertext data not as expected");
4215 	return 0;
4216 }
4217 
4218 static int
4219 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4220 {
4221 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4222 	struct crypto_unittest_params *ut_params = &unittest_params;
4223 
4224 	int retval;
4225 	unsigned int plaintext_pad_len;
4226 	unsigned int plaintext_len;
4227 	uint8_t buffer[10000];
4228 	const uint8_t *ciphertext;
4229 
4230 	struct rte_cryptodev_info dev_info;
4231 
4232 	/* Verify the capabilities */
4233 	struct rte_cryptodev_sym_capability_idx cap_idx;
4234 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4235 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4236 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4237 			&cap_idx) == NULL)
4238 		return TEST_SKIPPED;
4239 
4240 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4241 		return TEST_SKIPPED;
4242 
4243 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4244 		return TEST_SKIPPED;
4245 
4246 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4247 
4248 	uint64_t feat_flags = dev_info.feature_flags;
4249 
4250 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4251 		printf("Device doesn't support out-of-place scatter-gather "
4252 				"in both input and output mbufs. "
4253 				"Test Skipped.\n");
4254 		return TEST_SKIPPED;
4255 	}
4256 
4257 	/* Create SNOW 3G session */
4258 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4259 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4260 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4261 					tdata->key.data, tdata->key.len,
4262 					tdata->cipher_iv.len);
4263 	if (retval < 0)
4264 		return retval;
4265 
4266 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4267 	/* Append data which is padded to a multiple of */
4268 	/* the algorithms block size */
4269 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4270 
4271 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4272 			plaintext_pad_len, 10, 0);
4273 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4274 			plaintext_pad_len, 3, 0);
4275 
4276 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4277 			"Failed to allocate input buffer in mempool");
4278 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4279 			"Failed to allocate output buffer in mempool");
4280 
4281 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4282 
4283 	/* Create SNOW 3G operation */
4284 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4285 					tdata->cipher_iv.len,
4286 					tdata->validCipherLenInBits.len,
4287 					0);
4288 	if (retval < 0)
4289 		return retval;
4290 
4291 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4292 						ut_params->op);
4293 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4294 
4295 	ut_params->obuf = ut_params->op->sym->m_dst;
4296 	if (ut_params->obuf)
4297 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4298 				plaintext_len, buffer);
4299 	else
4300 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4301 				plaintext_len, buffer);
4302 
4303 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4304 
4305 	/* Validate obuf */
4306 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4307 		ciphertext,
4308 		tdata->ciphertext.data,
4309 		tdata->validDataLenInBits.len,
4310 		"SNOW 3G Ciphertext data not as expected");
4311 
4312 	return 0;
4313 }
4314 
4315 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4316 static void
4317 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4318 {
4319 	uint8_t curr_byte, prev_byte;
4320 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4321 	uint8_t lower_byte_mask = (1 << offset) - 1;
4322 	unsigned i;
4323 
4324 	prev_byte = buffer[0];
4325 	buffer[0] >>= offset;
4326 
4327 	for (i = 1; i < length_in_bytes; i++) {
4328 		curr_byte = buffer[i];
4329 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4330 				(curr_byte >> offset);
4331 		prev_byte = curr_byte;
4332 	}
4333 }
4334 
4335 static int
4336 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4337 {
4338 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4339 	struct crypto_unittest_params *ut_params = &unittest_params;
4340 	uint8_t *plaintext, *ciphertext;
4341 	int retval;
4342 	uint32_t plaintext_len;
4343 	uint32_t plaintext_pad_len;
4344 	uint8_t extra_offset = 4;
4345 	uint8_t *expected_ciphertext_shifted;
4346 	struct rte_cryptodev_info dev_info;
4347 
4348 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4349 	uint64_t feat_flags = dev_info.feature_flags;
4350 
4351 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4352 			((tdata->validDataLenInBits.len % 8) != 0)) {
4353 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4354 		return TEST_SKIPPED;
4355 	}
4356 
4357 	/* Verify the capabilities */
4358 	struct rte_cryptodev_sym_capability_idx cap_idx;
4359 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4360 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4361 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4362 			&cap_idx) == NULL)
4363 		return TEST_SKIPPED;
4364 
4365 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4366 		return TEST_SKIPPED;
4367 
4368 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4369 		return TEST_SKIPPED;
4370 
4371 	/* Create SNOW 3G session */
4372 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4373 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4374 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4375 					tdata->key.data, tdata->key.len,
4376 					tdata->cipher_iv.len);
4377 	if (retval < 0)
4378 		return retval;
4379 
4380 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4381 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4382 
4383 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4384 			"Failed to allocate input buffer in mempool");
4385 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4386 			"Failed to allocate output buffer in mempool");
4387 
4388 	/* Clear mbuf payload */
4389 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4390 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4391 
4392 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4393 	/*
4394 	 * Append data which is padded to a
4395 	 * multiple of the algorithms block size
4396 	 */
4397 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4398 
4399 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4400 						plaintext_pad_len);
4401 
4402 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4403 
4404 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4405 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4406 
4407 #ifdef RTE_APP_TEST_DEBUG
4408 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4409 #endif
4410 	/* Create SNOW 3G operation */
4411 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4412 					tdata->cipher_iv.len,
4413 					tdata->validCipherLenInBits.len,
4414 					extra_offset);
4415 	if (retval < 0)
4416 		return retval;
4417 
4418 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4419 						ut_params->op);
4420 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4421 
4422 	ut_params->obuf = ut_params->op->sym->m_dst;
4423 	if (ut_params->obuf)
4424 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4425 	else
4426 		ciphertext = plaintext;
4427 
4428 #ifdef RTE_APP_TEST_DEBUG
4429 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4430 #endif
4431 
4432 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4433 
4434 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4435 			"failed to reserve memory for ciphertext shifted\n");
4436 
4437 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4438 			ceil_byte_length(tdata->ciphertext.len));
4439 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4440 			extra_offset);
4441 	/* Validate obuf */
4442 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4443 		ciphertext,
4444 		expected_ciphertext_shifted,
4445 		tdata->validDataLenInBits.len,
4446 		extra_offset,
4447 		"SNOW 3G Ciphertext data not as expected");
4448 	return 0;
4449 }
4450 
4451 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4452 {
4453 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4454 	struct crypto_unittest_params *ut_params = &unittest_params;
4455 
4456 	int retval;
4457 
4458 	uint8_t *plaintext, *ciphertext;
4459 	unsigned ciphertext_pad_len;
4460 	unsigned ciphertext_len;
4461 	struct rte_cryptodev_info dev_info;
4462 
4463 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4464 	uint64_t feat_flags = dev_info.feature_flags;
4465 
4466 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4467 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4468 		printf("Device doesn't support RAW data-path APIs.\n");
4469 		return TEST_SKIPPED;
4470 	}
4471 
4472 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4473 		return TEST_SKIPPED;
4474 
4475 	/* Verify the capabilities */
4476 	struct rte_cryptodev_sym_capability_idx cap_idx;
4477 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4478 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4479 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4480 			&cap_idx) == NULL)
4481 		return TEST_SKIPPED;
4482 
4483 	/* Create SNOW 3G session */
4484 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4485 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4486 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4487 					tdata->key.data, tdata->key.len,
4488 					tdata->cipher_iv.len);
4489 	if (retval < 0)
4490 		return retval;
4491 
4492 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4493 
4494 	/* Clear mbuf payload */
4495 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4496 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4497 
4498 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4499 	/* Append data which is padded to a multiple of */
4500 	/* the algorithms block size */
4501 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4502 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4503 				ciphertext_pad_len);
4504 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4505 
4506 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4507 
4508 	/* Create SNOW 3G operation */
4509 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4510 					tdata->cipher_iv.len,
4511 					tdata->validCipherLenInBits.len,
4512 					tdata->cipher.offset_bits);
4513 	if (retval < 0)
4514 		return retval;
4515 
4516 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4517 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4518 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4519 	else
4520 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4521 						ut_params->op);
4522 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4523 	ut_params->obuf = ut_params->op->sym->m_dst;
4524 	if (ut_params->obuf)
4525 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4526 	else
4527 		plaintext = ciphertext;
4528 
4529 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4530 
4531 	/* Validate obuf */
4532 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4533 				tdata->plaintext.data,
4534 				tdata->validDataLenInBits.len,
4535 				"SNOW 3G Plaintext data not as expected");
4536 	return 0;
4537 }
4538 
4539 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4540 {
4541 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4542 	struct crypto_unittest_params *ut_params = &unittest_params;
4543 
4544 	int retval;
4545 
4546 	uint8_t *plaintext, *ciphertext;
4547 	unsigned ciphertext_pad_len;
4548 	unsigned ciphertext_len;
4549 
4550 	/* Verify the capabilities */
4551 	struct rte_cryptodev_sym_capability_idx cap_idx;
4552 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4553 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4554 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4555 			&cap_idx) == NULL)
4556 		return TEST_SKIPPED;
4557 
4558 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4559 		return TEST_SKIPPED;
4560 
4561 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4562 		return TEST_SKIPPED;
4563 
4564 	/* Create SNOW 3G session */
4565 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4566 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4567 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4568 					tdata->key.data, tdata->key.len,
4569 					tdata->cipher_iv.len);
4570 	if (retval < 0)
4571 		return retval;
4572 
4573 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4574 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4575 
4576 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4577 			"Failed to allocate input buffer");
4578 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4579 			"Failed to allocate output buffer");
4580 
4581 	/* Clear mbuf payload */
4582 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4583 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4584 
4585 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4586 		       rte_pktmbuf_tailroom(ut_params->obuf));
4587 
4588 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4589 	/* Append data which is padded to a multiple of */
4590 	/* the algorithms block size */
4591 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4592 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4593 				ciphertext_pad_len);
4594 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4595 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4596 
4597 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4598 
4599 	/* Create SNOW 3G operation */
4600 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4601 					tdata->cipher_iv.len,
4602 					tdata->validCipherLenInBits.len,
4603 					0);
4604 	if (retval < 0)
4605 		return retval;
4606 
4607 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4608 						ut_params->op);
4609 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4610 	ut_params->obuf = ut_params->op->sym->m_dst;
4611 	if (ut_params->obuf)
4612 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4613 	else
4614 		plaintext = ciphertext;
4615 
4616 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4617 
4618 	/* Validate obuf */
4619 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4620 				tdata->plaintext.data,
4621 				tdata->validDataLenInBits.len,
4622 				"SNOW 3G Plaintext data not as expected");
4623 	return 0;
4624 }
4625 
4626 static int
4627 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4628 {
4629 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4630 	struct crypto_unittest_params *ut_params = &unittest_params;
4631 
4632 	int retval;
4633 
4634 	uint8_t *plaintext, *ciphertext;
4635 	unsigned int plaintext_pad_len;
4636 	unsigned int plaintext_len;
4637 
4638 	struct rte_cryptodev_info dev_info;
4639 	struct rte_cryptodev_sym_capability_idx cap_idx;
4640 
4641 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4642 	uint64_t feat_flags = dev_info.feature_flags;
4643 
4644 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4645 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4646 			(tdata->validDataLenInBits.len % 8 != 0))) {
4647 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4648 		return TEST_SKIPPED;
4649 	}
4650 
4651 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4652 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4653 		printf("Device doesn't support RAW data-path APIs.\n");
4654 		return TEST_SKIPPED;
4655 	}
4656 
4657 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4658 		return TEST_SKIPPED;
4659 
4660 	/* Check if device supports ZUC EEA3 */
4661 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4662 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4663 
4664 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4665 			&cap_idx) == NULL)
4666 		return TEST_SKIPPED;
4667 
4668 	/* Check if device supports ZUC EIA3 */
4669 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4670 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4671 
4672 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4673 			&cap_idx) == NULL)
4674 		return TEST_SKIPPED;
4675 
4676 	/* Create ZUC session */
4677 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4678 			ts_params->valid_devs[0],
4679 			tdata);
4680 	if (retval != 0)
4681 		return retval;
4682 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4683 
4684 	/* clear mbuf payload */
4685 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4686 			rte_pktmbuf_tailroom(ut_params->ibuf));
4687 
4688 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4689 	/* Append data which is padded to a multiple of */
4690 	/* the algorithms block size */
4691 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4692 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4693 				plaintext_pad_len);
4694 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4695 
4696 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4697 
4698 	/* Create ZUC operation */
4699 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4700 	if (retval < 0)
4701 		return retval;
4702 
4703 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4704 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4705 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4706 	else
4707 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4708 			ut_params->op);
4709 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4710 	ut_params->obuf = ut_params->op->sym->m_src;
4711 	if (ut_params->obuf)
4712 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4713 	else
4714 		ciphertext = plaintext;
4715 
4716 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4717 	/* Validate obuf */
4718 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4719 			ciphertext,
4720 			tdata->ciphertext.data,
4721 			tdata->validDataLenInBits.len,
4722 			"ZUC Ciphertext data not as expected");
4723 
4724 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4725 	    + plaintext_pad_len;
4726 
4727 	/* Validate obuf */
4728 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4729 			ut_params->digest,
4730 			tdata->digest.data,
4731 			4,
4732 			"ZUC Generated auth tag not as expected");
4733 	return 0;
4734 }
4735 
4736 static int
4737 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4738 {
4739 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4740 	struct crypto_unittest_params *ut_params = &unittest_params;
4741 
4742 	int retval;
4743 
4744 	uint8_t *plaintext, *ciphertext;
4745 	unsigned plaintext_pad_len;
4746 	unsigned plaintext_len;
4747 	struct rte_cryptodev_info dev_info;
4748 
4749 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4750 	uint64_t feat_flags = dev_info.feature_flags;
4751 
4752 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4753 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4754 		printf("Device doesn't support RAW data-path APIs.\n");
4755 		return TEST_SKIPPED;
4756 	}
4757 
4758 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4759 		return TEST_SKIPPED;
4760 
4761 	/* Verify the capabilities */
4762 	struct rte_cryptodev_sym_capability_idx cap_idx;
4763 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4764 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4765 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4766 			&cap_idx) == NULL)
4767 		return TEST_SKIPPED;
4768 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4769 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4770 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4771 			&cap_idx) == NULL)
4772 		return TEST_SKIPPED;
4773 
4774 	/* Create SNOW 3G session */
4775 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4776 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4777 			RTE_CRYPTO_AUTH_OP_GENERATE,
4778 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4779 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4780 			tdata->key.data, tdata->key.len,
4781 			tdata->auth_iv.len, tdata->digest.len,
4782 			tdata->cipher_iv.len);
4783 	if (retval != 0)
4784 		return retval;
4785 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4786 
4787 	/* clear mbuf payload */
4788 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4789 			rte_pktmbuf_tailroom(ut_params->ibuf));
4790 
4791 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4792 	/* Append data which is padded to a multiple of */
4793 	/* the algorithms block size */
4794 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4795 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4796 				plaintext_pad_len);
4797 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4798 
4799 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4800 
4801 	/* Create SNOW 3G operation */
4802 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4803 			tdata->digest.len, tdata->auth_iv.data,
4804 			tdata->auth_iv.len,
4805 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4806 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4807 			tdata->validCipherLenInBits.len,
4808 			0,
4809 			tdata->validAuthLenInBits.len,
4810 			0
4811 			);
4812 	if (retval < 0)
4813 		return retval;
4814 
4815 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4816 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4817 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4818 	else
4819 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4820 			ut_params->op);
4821 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4822 	ut_params->obuf = ut_params->op->sym->m_src;
4823 	if (ut_params->obuf)
4824 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4825 	else
4826 		ciphertext = plaintext;
4827 
4828 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4829 	/* Validate obuf */
4830 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4831 			ciphertext,
4832 			tdata->ciphertext.data,
4833 			tdata->validDataLenInBits.len,
4834 			"SNOW 3G Ciphertext data not as expected");
4835 
4836 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4837 	    + plaintext_pad_len;
4838 
4839 	/* Validate obuf */
4840 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4841 			ut_params->digest,
4842 			tdata->digest.data,
4843 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4844 			"SNOW 3G Generated auth tag not as expected");
4845 	return 0;
4846 }
4847 
4848 static int
4849 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4850 	uint8_t op_mode, uint8_t verify)
4851 {
4852 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4853 	struct crypto_unittest_params *ut_params = &unittest_params;
4854 
4855 	int retval;
4856 
4857 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4858 	unsigned int plaintext_pad_len;
4859 	unsigned int plaintext_len;
4860 	unsigned int ciphertext_pad_len;
4861 	unsigned int ciphertext_len;
4862 
4863 	struct rte_cryptodev_info dev_info;
4864 
4865 	/* Verify the capabilities */
4866 	struct rte_cryptodev_sym_capability_idx cap_idx;
4867 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4868 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4869 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4870 			&cap_idx) == NULL)
4871 		return TEST_SKIPPED;
4872 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4873 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4874 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4875 			&cap_idx) == NULL)
4876 		return TEST_SKIPPED;
4877 
4878 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4879 		return TEST_SKIPPED;
4880 
4881 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4882 
4883 	uint64_t feat_flags = dev_info.feature_flags;
4884 
4885 	if (op_mode == OUT_OF_PLACE) {
4886 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4887 			printf("Device doesn't support digest encrypted.\n");
4888 			return TEST_SKIPPED;
4889 		}
4890 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4891 			return TEST_SKIPPED;
4892 	}
4893 
4894 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4895 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4896 		printf("Device doesn't support RAW data-path APIs.\n");
4897 		return TEST_SKIPPED;
4898 	}
4899 
4900 	/* Create SNOW 3G session */
4901 	retval = create_wireless_algo_auth_cipher_session(
4902 			ts_params->valid_devs[0],
4903 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4904 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4905 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4906 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4907 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4908 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4909 			tdata->key.data, tdata->key.len,
4910 			tdata->auth_iv.len, tdata->digest.len,
4911 			tdata->cipher_iv.len);
4912 	if (retval != 0)
4913 		return retval;
4914 
4915 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4916 	if (op_mode == OUT_OF_PLACE)
4917 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4918 
4919 	/* clear mbuf payload */
4920 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4921 		rte_pktmbuf_tailroom(ut_params->ibuf));
4922 	if (op_mode == OUT_OF_PLACE)
4923 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4924 			rte_pktmbuf_tailroom(ut_params->obuf));
4925 
4926 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4927 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4928 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4929 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4930 
4931 	if (verify) {
4932 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4933 					ciphertext_pad_len);
4934 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4935 		if (op_mode == OUT_OF_PLACE)
4936 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4937 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4938 			ciphertext_len);
4939 	} else {
4940 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4941 					plaintext_pad_len);
4942 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4943 		if (op_mode == OUT_OF_PLACE)
4944 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4945 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4946 	}
4947 
4948 	/* Create SNOW 3G operation */
4949 	retval = create_wireless_algo_auth_cipher_operation(
4950 		tdata->digest.data, tdata->digest.len,
4951 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4952 		tdata->auth_iv.data, tdata->auth_iv.len,
4953 		(tdata->digest.offset_bytes == 0 ?
4954 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4955 			: tdata->digest.offset_bytes),
4956 		tdata->validCipherLenInBits.len,
4957 		tdata->cipher.offset_bits,
4958 		tdata->validAuthLenInBits.len,
4959 		tdata->auth.offset_bits,
4960 		op_mode, 0, verify);
4961 
4962 	if (retval < 0)
4963 		return retval;
4964 
4965 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4966 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4967 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4968 	else
4969 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4970 			ut_params->op);
4971 
4972 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4973 
4974 	ut_params->obuf = (op_mode == IN_PLACE ?
4975 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4976 
4977 	if (verify) {
4978 		if (ut_params->obuf)
4979 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4980 							uint8_t *);
4981 		else
4982 			plaintext = ciphertext +
4983 				(tdata->cipher.offset_bits >> 3);
4984 
4985 		debug_hexdump(stdout, "plaintext:", plaintext,
4986 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4987 		debug_hexdump(stdout, "plaintext expected:",
4988 			tdata->plaintext.data,
4989 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4990 	} else {
4991 		if (ut_params->obuf)
4992 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4993 							uint8_t *);
4994 		else
4995 			ciphertext = plaintext;
4996 
4997 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4998 			ciphertext_len);
4999 		debug_hexdump(stdout, "ciphertext expected:",
5000 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5001 
5002 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5003 			+ (tdata->digest.offset_bytes == 0 ?
5004 		plaintext_pad_len : tdata->digest.offset_bytes);
5005 
5006 		debug_hexdump(stdout, "digest:", ut_params->digest,
5007 			tdata->digest.len);
5008 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5009 				tdata->digest.len);
5010 	}
5011 
5012 	/* Validate obuf */
5013 	if (verify) {
5014 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5015 			plaintext,
5016 			tdata->plaintext.data,
5017 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5018 			 (tdata->digest.len << 3)),
5019 			tdata->cipher.offset_bits,
5020 			"SNOW 3G Plaintext data not as expected");
5021 	} else {
5022 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5023 			ciphertext,
5024 			tdata->ciphertext.data,
5025 			(tdata->validDataLenInBits.len -
5026 			 tdata->cipher.offset_bits),
5027 			tdata->cipher.offset_bits,
5028 			"SNOW 3G Ciphertext data not as expected");
5029 
5030 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5031 			ut_params->digest,
5032 			tdata->digest.data,
5033 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5034 			"SNOW 3G Generated auth tag not as expected");
5035 	}
5036 	return 0;
5037 }
5038 
5039 static int
5040 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5041 	uint8_t op_mode, uint8_t verify)
5042 {
5043 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5044 	struct crypto_unittest_params *ut_params = &unittest_params;
5045 
5046 	int retval;
5047 
5048 	const uint8_t *plaintext = NULL;
5049 	const uint8_t *ciphertext = NULL;
5050 	const uint8_t *digest = NULL;
5051 	unsigned int plaintext_pad_len;
5052 	unsigned int plaintext_len;
5053 	unsigned int ciphertext_pad_len;
5054 	unsigned int ciphertext_len;
5055 	uint8_t buffer[10000];
5056 	uint8_t digest_buffer[10000];
5057 
5058 	struct rte_cryptodev_info dev_info;
5059 
5060 	/* Verify the capabilities */
5061 	struct rte_cryptodev_sym_capability_idx cap_idx;
5062 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5063 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5064 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5065 			&cap_idx) == NULL)
5066 		return TEST_SKIPPED;
5067 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5068 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5069 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5070 			&cap_idx) == NULL)
5071 		return TEST_SKIPPED;
5072 
5073 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5074 		return TEST_SKIPPED;
5075 
5076 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5077 
5078 	uint64_t feat_flags = dev_info.feature_flags;
5079 
5080 	if (op_mode == IN_PLACE) {
5081 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5082 			printf("Device doesn't support in-place scatter-gather "
5083 					"in both input and output mbufs.\n");
5084 			return TEST_SKIPPED;
5085 		}
5086 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5087 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5088 			printf("Device doesn't support RAW data-path APIs.\n");
5089 			return TEST_SKIPPED;
5090 		}
5091 	} else {
5092 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5093 			return TEST_SKIPPED;
5094 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5095 			printf("Device doesn't support out-of-place scatter-gather "
5096 					"in both input and output mbufs.\n");
5097 			return TEST_SKIPPED;
5098 		}
5099 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5100 			printf("Device doesn't support digest encrypted.\n");
5101 			return TEST_SKIPPED;
5102 		}
5103 	}
5104 
5105 	/* Create SNOW 3G session */
5106 	retval = create_wireless_algo_auth_cipher_session(
5107 			ts_params->valid_devs[0],
5108 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5109 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5110 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5111 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5112 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5113 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5114 			tdata->key.data, tdata->key.len,
5115 			tdata->auth_iv.len, tdata->digest.len,
5116 			tdata->cipher_iv.len);
5117 
5118 	if (retval != 0)
5119 		return retval;
5120 
5121 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5122 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5123 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5124 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5125 
5126 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5127 			plaintext_pad_len, 15, 0);
5128 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5129 			"Failed to allocate input buffer in mempool");
5130 
5131 	if (op_mode == OUT_OF_PLACE) {
5132 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5133 				plaintext_pad_len, 15, 0);
5134 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5135 				"Failed to allocate output buffer in mempool");
5136 	}
5137 
5138 	if (verify) {
5139 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5140 			tdata->ciphertext.data);
5141 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5142 					ciphertext_len, buffer);
5143 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5144 			ciphertext_len);
5145 	} else {
5146 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5147 			tdata->plaintext.data);
5148 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5149 					plaintext_len, buffer);
5150 		debug_hexdump(stdout, "plaintext:", plaintext,
5151 			plaintext_len);
5152 	}
5153 	memset(buffer, 0, sizeof(buffer));
5154 
5155 	/* Create SNOW 3G operation */
5156 	retval = create_wireless_algo_auth_cipher_operation(
5157 		tdata->digest.data, tdata->digest.len,
5158 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5159 		tdata->auth_iv.data, tdata->auth_iv.len,
5160 		(tdata->digest.offset_bytes == 0 ?
5161 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5162 			: tdata->digest.offset_bytes),
5163 		tdata->validCipherLenInBits.len,
5164 		tdata->cipher.offset_bits,
5165 		tdata->validAuthLenInBits.len,
5166 		tdata->auth.offset_bits,
5167 		op_mode, 1, verify);
5168 
5169 	if (retval < 0)
5170 		return retval;
5171 
5172 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5173 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5174 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5175 	else
5176 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5177 			ut_params->op);
5178 
5179 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5180 
5181 	ut_params->obuf = (op_mode == IN_PLACE ?
5182 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5183 
5184 	if (verify) {
5185 		if (ut_params->obuf)
5186 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5187 					plaintext_len, buffer);
5188 		else
5189 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5190 					plaintext_len, buffer);
5191 
5192 		debug_hexdump(stdout, "plaintext:", plaintext,
5193 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5194 		debug_hexdump(stdout, "plaintext expected:",
5195 			tdata->plaintext.data,
5196 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5197 	} else {
5198 		if (ut_params->obuf)
5199 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5200 					ciphertext_len, buffer);
5201 		else
5202 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5203 					ciphertext_len, buffer);
5204 
5205 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5206 			ciphertext_len);
5207 		debug_hexdump(stdout, "ciphertext expected:",
5208 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5209 
5210 		if (ut_params->obuf)
5211 			digest = rte_pktmbuf_read(ut_params->obuf,
5212 				(tdata->digest.offset_bytes == 0 ?
5213 				plaintext_pad_len : tdata->digest.offset_bytes),
5214 				tdata->digest.len, digest_buffer);
5215 		else
5216 			digest = rte_pktmbuf_read(ut_params->ibuf,
5217 				(tdata->digest.offset_bytes == 0 ?
5218 				plaintext_pad_len : tdata->digest.offset_bytes),
5219 				tdata->digest.len, digest_buffer);
5220 
5221 		debug_hexdump(stdout, "digest:", digest,
5222 			tdata->digest.len);
5223 		debug_hexdump(stdout, "digest expected:",
5224 			tdata->digest.data, tdata->digest.len);
5225 	}
5226 
5227 	/* Validate obuf */
5228 	if (verify) {
5229 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5230 			plaintext,
5231 			tdata->plaintext.data,
5232 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5233 			 (tdata->digest.len << 3)),
5234 			tdata->cipher.offset_bits,
5235 			"SNOW 3G Plaintext data not as expected");
5236 	} else {
5237 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5238 			ciphertext,
5239 			tdata->ciphertext.data,
5240 			(tdata->validDataLenInBits.len -
5241 			 tdata->cipher.offset_bits),
5242 			tdata->cipher.offset_bits,
5243 			"SNOW 3G Ciphertext data not as expected");
5244 
5245 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5246 			digest,
5247 			tdata->digest.data,
5248 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5249 			"SNOW 3G Generated auth tag not as expected");
5250 	}
5251 	return 0;
5252 }
5253 
5254 static int
5255 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5256 	uint8_t op_mode, uint8_t verify)
5257 {
5258 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5259 	struct crypto_unittest_params *ut_params = &unittest_params;
5260 
5261 	int retval;
5262 
5263 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5264 	unsigned int plaintext_pad_len;
5265 	unsigned int plaintext_len;
5266 	unsigned int ciphertext_pad_len;
5267 	unsigned int ciphertext_len;
5268 
5269 	struct rte_cryptodev_info dev_info;
5270 
5271 	/* Verify the capabilities */
5272 	struct rte_cryptodev_sym_capability_idx cap_idx;
5273 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5274 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5275 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5276 			&cap_idx) == NULL)
5277 		return TEST_SKIPPED;
5278 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5279 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5280 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5281 			&cap_idx) == NULL)
5282 		return TEST_SKIPPED;
5283 
5284 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5285 
5286 	uint64_t feat_flags = dev_info.feature_flags;
5287 
5288 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5289 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5290 		printf("Device doesn't support RAW data-path APIs.\n");
5291 		return TEST_SKIPPED;
5292 	}
5293 
5294 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5295 		return TEST_SKIPPED;
5296 
5297 	if (op_mode == OUT_OF_PLACE) {
5298 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5299 			return TEST_SKIPPED;
5300 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5301 			printf("Device doesn't support digest encrypted.\n");
5302 			return TEST_SKIPPED;
5303 		}
5304 	}
5305 
5306 	/* Create KASUMI session */
5307 	retval = create_wireless_algo_auth_cipher_session(
5308 			ts_params->valid_devs[0],
5309 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5310 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5311 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5312 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5313 			RTE_CRYPTO_AUTH_KASUMI_F9,
5314 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5315 			tdata->key.data, tdata->key.len,
5316 			0, tdata->digest.len,
5317 			tdata->cipher_iv.len);
5318 
5319 	if (retval != 0)
5320 		return retval;
5321 
5322 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5323 	if (op_mode == OUT_OF_PLACE)
5324 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5325 
5326 	/* clear mbuf payload */
5327 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5328 		rte_pktmbuf_tailroom(ut_params->ibuf));
5329 	if (op_mode == OUT_OF_PLACE)
5330 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5331 			rte_pktmbuf_tailroom(ut_params->obuf));
5332 
5333 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5334 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5335 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5336 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5337 
5338 	if (verify) {
5339 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5340 					ciphertext_pad_len);
5341 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5342 		if (op_mode == OUT_OF_PLACE)
5343 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5344 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5345 			ciphertext_len);
5346 	} else {
5347 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5348 					plaintext_pad_len);
5349 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5350 		if (op_mode == OUT_OF_PLACE)
5351 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5352 		debug_hexdump(stdout, "plaintext:", plaintext,
5353 			plaintext_len);
5354 	}
5355 
5356 	/* Create KASUMI operation */
5357 	retval = create_wireless_algo_auth_cipher_operation(
5358 		tdata->digest.data, tdata->digest.len,
5359 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5360 		NULL, 0,
5361 		(tdata->digest.offset_bytes == 0 ?
5362 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5363 			: tdata->digest.offset_bytes),
5364 		tdata->validCipherLenInBits.len,
5365 		tdata->validCipherOffsetInBits.len,
5366 		tdata->validAuthLenInBits.len,
5367 		0,
5368 		op_mode, 0, verify);
5369 
5370 	if (retval < 0)
5371 		return retval;
5372 
5373 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5374 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5375 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5376 	else
5377 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5378 			ut_params->op);
5379 
5380 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5381 
5382 	ut_params->obuf = (op_mode == IN_PLACE ?
5383 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5384 
5385 
5386 	if (verify) {
5387 		if (ut_params->obuf)
5388 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5389 							uint8_t *);
5390 		else
5391 			plaintext = ciphertext;
5392 
5393 		debug_hexdump(stdout, "plaintext:", plaintext,
5394 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5395 		debug_hexdump(stdout, "plaintext expected:",
5396 			tdata->plaintext.data,
5397 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5398 	} else {
5399 		if (ut_params->obuf)
5400 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5401 							uint8_t *);
5402 		else
5403 			ciphertext = plaintext;
5404 
5405 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5406 			ciphertext_len);
5407 		debug_hexdump(stdout, "ciphertext expected:",
5408 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5409 
5410 		ut_params->digest = rte_pktmbuf_mtod(
5411 			ut_params->obuf, uint8_t *) +
5412 			(tdata->digest.offset_bytes == 0 ?
5413 			plaintext_pad_len : tdata->digest.offset_bytes);
5414 
5415 		debug_hexdump(stdout, "digest:", ut_params->digest,
5416 			tdata->digest.len);
5417 		debug_hexdump(stdout, "digest expected:",
5418 			tdata->digest.data, tdata->digest.len);
5419 	}
5420 
5421 	/* Validate obuf */
5422 	if (verify) {
5423 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5424 			plaintext,
5425 			tdata->plaintext.data,
5426 			tdata->plaintext.len >> 3,
5427 			"KASUMI Plaintext data not as expected");
5428 	} else {
5429 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5430 			ciphertext,
5431 			tdata->ciphertext.data,
5432 			tdata->ciphertext.len >> 3,
5433 			"KASUMI Ciphertext data not as expected");
5434 
5435 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5436 			ut_params->digest,
5437 			tdata->digest.data,
5438 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5439 			"KASUMI Generated auth tag not as expected");
5440 	}
5441 	return 0;
5442 }
5443 
5444 static int
5445 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5446 	uint8_t op_mode, uint8_t verify)
5447 {
5448 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5449 	struct crypto_unittest_params *ut_params = &unittest_params;
5450 
5451 	int retval;
5452 
5453 	const uint8_t *plaintext = NULL;
5454 	const uint8_t *ciphertext = NULL;
5455 	const uint8_t *digest = NULL;
5456 	unsigned int plaintext_pad_len;
5457 	unsigned int plaintext_len;
5458 	unsigned int ciphertext_pad_len;
5459 	unsigned int ciphertext_len;
5460 	uint8_t buffer[10000];
5461 	uint8_t digest_buffer[10000];
5462 
5463 	struct rte_cryptodev_info dev_info;
5464 
5465 	/* Verify the capabilities */
5466 	struct rte_cryptodev_sym_capability_idx cap_idx;
5467 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5468 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5469 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5470 			&cap_idx) == NULL)
5471 		return TEST_SKIPPED;
5472 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5473 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5474 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5475 			&cap_idx) == NULL)
5476 		return TEST_SKIPPED;
5477 
5478 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5479 		return TEST_SKIPPED;
5480 
5481 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5482 
5483 	uint64_t feat_flags = dev_info.feature_flags;
5484 
5485 	if (op_mode == IN_PLACE) {
5486 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5487 			printf("Device doesn't support in-place scatter-gather "
5488 					"in both input and output mbufs.\n");
5489 			return TEST_SKIPPED;
5490 		}
5491 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5492 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5493 			printf("Device doesn't support RAW data-path APIs.\n");
5494 			return TEST_SKIPPED;
5495 		}
5496 	} else {
5497 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5498 			return TEST_SKIPPED;
5499 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5500 			printf("Device doesn't support out-of-place scatter-gather "
5501 					"in both input and output mbufs.\n");
5502 			return TEST_SKIPPED;
5503 		}
5504 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5505 			printf("Device doesn't support digest encrypted.\n");
5506 			return TEST_SKIPPED;
5507 		}
5508 	}
5509 
5510 	/* Create KASUMI session */
5511 	retval = create_wireless_algo_auth_cipher_session(
5512 			ts_params->valid_devs[0],
5513 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5514 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5515 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5516 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5517 			RTE_CRYPTO_AUTH_KASUMI_F9,
5518 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5519 			tdata->key.data, tdata->key.len,
5520 			0, tdata->digest.len,
5521 			tdata->cipher_iv.len);
5522 
5523 	if (retval != 0)
5524 		return retval;
5525 
5526 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5527 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5528 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5529 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5530 
5531 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5532 			plaintext_pad_len, 15, 0);
5533 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5534 			"Failed to allocate input buffer in mempool");
5535 
5536 	if (op_mode == OUT_OF_PLACE) {
5537 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5538 				plaintext_pad_len, 15, 0);
5539 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5540 				"Failed to allocate output buffer in mempool");
5541 	}
5542 
5543 	if (verify) {
5544 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5545 			tdata->ciphertext.data);
5546 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5547 					ciphertext_len, buffer);
5548 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5549 			ciphertext_len);
5550 	} else {
5551 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5552 			tdata->plaintext.data);
5553 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5554 					plaintext_len, buffer);
5555 		debug_hexdump(stdout, "plaintext:", plaintext,
5556 			plaintext_len);
5557 	}
5558 	memset(buffer, 0, sizeof(buffer));
5559 
5560 	/* Create KASUMI operation */
5561 	retval = create_wireless_algo_auth_cipher_operation(
5562 		tdata->digest.data, tdata->digest.len,
5563 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5564 		NULL, 0,
5565 		(tdata->digest.offset_bytes == 0 ?
5566 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5567 			: tdata->digest.offset_bytes),
5568 		tdata->validCipherLenInBits.len,
5569 		tdata->validCipherOffsetInBits.len,
5570 		tdata->validAuthLenInBits.len,
5571 		0,
5572 		op_mode, 1, verify);
5573 
5574 	if (retval < 0)
5575 		return retval;
5576 
5577 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5578 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5579 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5580 	else
5581 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5582 			ut_params->op);
5583 
5584 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5585 
5586 	ut_params->obuf = (op_mode == IN_PLACE ?
5587 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5588 
5589 	if (verify) {
5590 		if (ut_params->obuf)
5591 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5592 					plaintext_len, buffer);
5593 		else
5594 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5595 					plaintext_len, buffer);
5596 
5597 		debug_hexdump(stdout, "plaintext:", plaintext,
5598 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5599 		debug_hexdump(stdout, "plaintext expected:",
5600 			tdata->plaintext.data,
5601 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5602 	} else {
5603 		if (ut_params->obuf)
5604 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5605 					ciphertext_len, buffer);
5606 		else
5607 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5608 					ciphertext_len, buffer);
5609 
5610 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5611 			ciphertext_len);
5612 		debug_hexdump(stdout, "ciphertext expected:",
5613 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5614 
5615 		if (ut_params->obuf)
5616 			digest = rte_pktmbuf_read(ut_params->obuf,
5617 				(tdata->digest.offset_bytes == 0 ?
5618 				plaintext_pad_len : tdata->digest.offset_bytes),
5619 				tdata->digest.len, digest_buffer);
5620 		else
5621 			digest = rte_pktmbuf_read(ut_params->ibuf,
5622 				(tdata->digest.offset_bytes == 0 ?
5623 				plaintext_pad_len : tdata->digest.offset_bytes),
5624 				tdata->digest.len, digest_buffer);
5625 
5626 		debug_hexdump(stdout, "digest:", digest,
5627 			tdata->digest.len);
5628 		debug_hexdump(stdout, "digest expected:",
5629 			tdata->digest.data, tdata->digest.len);
5630 	}
5631 
5632 	/* Validate obuf */
5633 	if (verify) {
5634 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5635 			plaintext,
5636 			tdata->plaintext.data,
5637 			tdata->plaintext.len >> 3,
5638 			"KASUMI Plaintext data not as expected");
5639 	} else {
5640 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5641 			ciphertext,
5642 			tdata->ciphertext.data,
5643 			tdata->validDataLenInBits.len,
5644 			"KASUMI Ciphertext data not as expected");
5645 
5646 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5647 			digest,
5648 			tdata->digest.data,
5649 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5650 			"KASUMI Generated auth tag not as expected");
5651 	}
5652 	return 0;
5653 }
5654 
5655 static int
5656 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5657 {
5658 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5659 	struct crypto_unittest_params *ut_params = &unittest_params;
5660 
5661 	int retval;
5662 
5663 	uint8_t *plaintext, *ciphertext;
5664 	unsigned plaintext_pad_len;
5665 	unsigned plaintext_len;
5666 	struct rte_cryptodev_info dev_info;
5667 
5668 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5669 	uint64_t feat_flags = dev_info.feature_flags;
5670 
5671 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5672 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5673 		printf("Device doesn't support RAW data-path APIs.\n");
5674 		return TEST_SKIPPED;
5675 	}
5676 
5677 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5678 		return TEST_SKIPPED;
5679 
5680 	/* Verify the capabilities */
5681 	struct rte_cryptodev_sym_capability_idx cap_idx;
5682 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5683 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5684 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5685 			&cap_idx) == NULL)
5686 		return TEST_SKIPPED;
5687 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5688 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5689 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5690 			&cap_idx) == NULL)
5691 		return TEST_SKIPPED;
5692 
5693 	/* Create KASUMI session */
5694 	retval = create_wireless_algo_cipher_auth_session(
5695 			ts_params->valid_devs[0],
5696 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5697 			RTE_CRYPTO_AUTH_OP_GENERATE,
5698 			RTE_CRYPTO_AUTH_KASUMI_F9,
5699 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5700 			tdata->key.data, tdata->key.len,
5701 			0, tdata->digest.len,
5702 			tdata->cipher_iv.len);
5703 	if (retval != 0)
5704 		return retval;
5705 
5706 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5707 
5708 	/* clear mbuf payload */
5709 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5710 			rte_pktmbuf_tailroom(ut_params->ibuf));
5711 
5712 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5713 	/* Append data which is padded to a multiple of */
5714 	/* the algorithms block size */
5715 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5716 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5717 				plaintext_pad_len);
5718 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5719 
5720 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5721 
5722 	/* Create KASUMI operation */
5723 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5724 				tdata->digest.len, NULL, 0,
5725 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5726 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5727 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5728 				tdata->validCipherOffsetInBits.len,
5729 				tdata->validAuthLenInBits.len,
5730 				0
5731 				);
5732 	if (retval < 0)
5733 		return retval;
5734 
5735 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5736 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5737 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5738 	else
5739 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5740 			ut_params->op);
5741 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5742 
5743 	if (ut_params->op->sym->m_dst)
5744 		ut_params->obuf = ut_params->op->sym->m_dst;
5745 	else
5746 		ut_params->obuf = ut_params->op->sym->m_src;
5747 
5748 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5749 				tdata->validCipherOffsetInBits.len >> 3);
5750 
5751 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5752 			+ plaintext_pad_len;
5753 
5754 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5755 				(tdata->validCipherOffsetInBits.len >> 3);
5756 	/* Validate obuf */
5757 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5758 		ciphertext,
5759 		reference_ciphertext,
5760 		tdata->validCipherLenInBits.len,
5761 		"KASUMI Ciphertext data not as expected");
5762 
5763 	/* Validate obuf */
5764 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5765 		ut_params->digest,
5766 		tdata->digest.data,
5767 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5768 		"KASUMI Generated auth tag not as expected");
5769 	return 0;
5770 }
5771 
5772 static int
5773 test_zuc_encryption(const struct wireless_test_data *tdata)
5774 {
5775 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5776 	struct crypto_unittest_params *ut_params = &unittest_params;
5777 
5778 	int retval;
5779 	uint8_t *plaintext, *ciphertext;
5780 	unsigned plaintext_pad_len;
5781 	unsigned plaintext_len;
5782 	struct rte_cryptodev_info dev_info;
5783 
5784 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5785 	uint64_t feat_flags = dev_info.feature_flags;
5786 
5787 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5788 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5789 		printf("Device doesn't support RAW data-path APIs.\n");
5790 		return TEST_SKIPPED;
5791 	}
5792 
5793 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5794 		return TEST_SKIPPED;
5795 
5796 	struct rte_cryptodev_sym_capability_idx cap_idx;
5797 
5798 	/* Check if device supports ZUC EEA3 */
5799 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5800 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5801 
5802 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5803 			&cap_idx) == NULL)
5804 		return TEST_SKIPPED;
5805 
5806 	/* Create ZUC session */
5807 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5808 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5809 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5810 					tdata->key.data, tdata->key.len,
5811 					tdata->cipher_iv.len);
5812 	if (retval < 0)
5813 		return retval;
5814 
5815 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5816 
5817 	/* Clear mbuf payload */
5818 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5819 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5820 
5821 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5822 	/* Append data which is padded to a multiple */
5823 	/* of the algorithms block size */
5824 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5825 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5826 				plaintext_pad_len);
5827 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5828 
5829 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5830 
5831 	/* Create ZUC operation */
5832 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5833 					tdata->cipher_iv.len,
5834 					tdata->plaintext.len,
5835 					0);
5836 	if (retval < 0)
5837 		return retval;
5838 
5839 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5840 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5841 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5842 	else
5843 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5844 						ut_params->op);
5845 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5846 
5847 	ut_params->obuf = ut_params->op->sym->m_dst;
5848 	if (ut_params->obuf)
5849 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5850 	else
5851 		ciphertext = plaintext;
5852 
5853 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5854 
5855 	/* Validate obuf */
5856 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5857 		ciphertext,
5858 		tdata->ciphertext.data,
5859 		tdata->validCipherLenInBits.len,
5860 		"ZUC Ciphertext data not as expected");
5861 	return 0;
5862 }
5863 
5864 static int
5865 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5866 {
5867 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5868 	struct crypto_unittest_params *ut_params = &unittest_params;
5869 
5870 	int retval;
5871 
5872 	unsigned int plaintext_pad_len;
5873 	unsigned int plaintext_len;
5874 	const uint8_t *ciphertext;
5875 	uint8_t ciphertext_buffer[2048];
5876 	struct rte_cryptodev_info dev_info;
5877 
5878 	struct rte_cryptodev_sym_capability_idx cap_idx;
5879 
5880 	/* Check if device supports ZUC EEA3 */
5881 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5882 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5883 
5884 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5885 			&cap_idx) == NULL)
5886 		return TEST_SKIPPED;
5887 
5888 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5889 		return TEST_SKIPPED;
5890 
5891 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5892 
5893 	uint64_t feat_flags = dev_info.feature_flags;
5894 
5895 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5896 		printf("Device doesn't support in-place scatter-gather. "
5897 				"Test Skipped.\n");
5898 		return TEST_SKIPPED;
5899 	}
5900 
5901 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5902 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5903 		printf("Device doesn't support RAW data-path APIs.\n");
5904 		return TEST_SKIPPED;
5905 	}
5906 
5907 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5908 
5909 	/* Append data which is padded to a multiple */
5910 	/* of the algorithms block size */
5911 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5912 
5913 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5914 			plaintext_pad_len, 10, 0);
5915 
5916 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5917 			tdata->plaintext.data);
5918 
5919 	/* Create ZUC session */
5920 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5921 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5922 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5923 			tdata->key.data, tdata->key.len,
5924 			tdata->cipher_iv.len);
5925 	if (retval < 0)
5926 		return retval;
5927 
5928 	/* Clear mbuf payload */
5929 
5930 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5931 
5932 	/* Create ZUC operation */
5933 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5934 			tdata->cipher_iv.len, tdata->plaintext.len,
5935 			0);
5936 	if (retval < 0)
5937 		return retval;
5938 
5939 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5940 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5941 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5942 	else
5943 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5944 						ut_params->op);
5945 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5946 
5947 	ut_params->obuf = ut_params->op->sym->m_dst;
5948 	if (ut_params->obuf)
5949 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
5950 			0, plaintext_len, ciphertext_buffer);
5951 	else
5952 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5953 			0, plaintext_len, ciphertext_buffer);
5954 
5955 	/* Validate obuf */
5956 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5957 
5958 	/* Validate obuf */
5959 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5960 		ciphertext,
5961 		tdata->ciphertext.data,
5962 		tdata->validCipherLenInBits.len,
5963 		"ZUC Ciphertext data not as expected");
5964 
5965 	return 0;
5966 }
5967 
5968 static int
5969 test_zuc_authentication(const struct wireless_test_data *tdata)
5970 {
5971 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5972 	struct crypto_unittest_params *ut_params = &unittest_params;
5973 
5974 	int retval;
5975 	unsigned plaintext_pad_len;
5976 	unsigned plaintext_len;
5977 	uint8_t *plaintext;
5978 
5979 	struct rte_cryptodev_sym_capability_idx cap_idx;
5980 	struct rte_cryptodev_info dev_info;
5981 
5982 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5983 	uint64_t feat_flags = dev_info.feature_flags;
5984 
5985 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5986 			(tdata->validAuthLenInBits.len % 8 != 0)) {
5987 		printf("Device doesn't support NON-Byte Aligned Data.\n");
5988 		return TEST_SKIPPED;
5989 	}
5990 
5991 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5992 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5993 		printf("Device doesn't support RAW data-path APIs.\n");
5994 		return TEST_SKIPPED;
5995 	}
5996 
5997 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5998 		return TEST_SKIPPED;
5999 
6000 	/* Check if device supports ZUC EIA3 */
6001 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6002 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6003 
6004 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6005 			&cap_idx) == NULL)
6006 		return TEST_SKIPPED;
6007 
6008 	/* Create ZUC session */
6009 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6010 			tdata->key.data, tdata->key.len,
6011 			tdata->auth_iv.len, tdata->digest.len,
6012 			RTE_CRYPTO_AUTH_OP_GENERATE,
6013 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6014 	if (retval < 0)
6015 		return retval;
6016 
6017 	/* alloc mbuf and set payload */
6018 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6019 
6020 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6021 	rte_pktmbuf_tailroom(ut_params->ibuf));
6022 
6023 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6024 	/* Append data which is padded to a multiple of */
6025 	/* the algorithms block size */
6026 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6027 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6028 				plaintext_pad_len);
6029 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6030 
6031 	/* Create ZUC operation */
6032 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6033 			tdata->auth_iv.data, tdata->auth_iv.len,
6034 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6035 			tdata->validAuthLenInBits.len,
6036 			0);
6037 	if (retval < 0)
6038 		return retval;
6039 
6040 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6041 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6042 				ut_params->op, 0, 1, 1, 0);
6043 	else
6044 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6045 				ut_params->op);
6046 	ut_params->obuf = ut_params->op->sym->m_src;
6047 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6048 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6049 			+ plaintext_pad_len;
6050 
6051 	/* Validate obuf */
6052 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6053 	ut_params->digest,
6054 	tdata->digest.data,
6055 	tdata->digest.len,
6056 	"ZUC Generated auth tag not as expected");
6057 
6058 	return 0;
6059 }
6060 
6061 static int
6062 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6063 	uint8_t op_mode, uint8_t verify)
6064 {
6065 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6066 	struct crypto_unittest_params *ut_params = &unittest_params;
6067 
6068 	int retval;
6069 
6070 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6071 	unsigned int plaintext_pad_len;
6072 	unsigned int plaintext_len;
6073 	unsigned int ciphertext_pad_len;
6074 	unsigned int ciphertext_len;
6075 
6076 	struct rte_cryptodev_info dev_info;
6077 	struct rte_cryptodev_sym_capability_idx cap_idx;
6078 
6079 	/* Check if device supports ZUC EIA3 */
6080 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6081 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6082 
6083 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6084 			&cap_idx) == NULL)
6085 		return TEST_SKIPPED;
6086 
6087 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6088 
6089 	uint64_t feat_flags = dev_info.feature_flags;
6090 
6091 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6092 		printf("Device doesn't support digest encrypted.\n");
6093 		return TEST_SKIPPED;
6094 	}
6095 	if (op_mode == IN_PLACE) {
6096 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6097 			printf("Device doesn't support in-place scatter-gather "
6098 					"in both input and output mbufs.\n");
6099 			return TEST_SKIPPED;
6100 		}
6101 
6102 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6103 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6104 			printf("Device doesn't support RAW data-path APIs.\n");
6105 			return TEST_SKIPPED;
6106 		}
6107 	} else {
6108 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6109 			return TEST_SKIPPED;
6110 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6111 			printf("Device doesn't support out-of-place scatter-gather "
6112 					"in both input and output mbufs.\n");
6113 			return TEST_SKIPPED;
6114 		}
6115 	}
6116 
6117 	/* Create ZUC session */
6118 	retval = create_wireless_algo_auth_cipher_session(
6119 			ts_params->valid_devs[0],
6120 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6121 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6122 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6123 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6124 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6125 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6126 			tdata->key.data, tdata->key.len,
6127 			tdata->auth_iv.len, tdata->digest.len,
6128 			tdata->cipher_iv.len);
6129 
6130 	if (retval != 0)
6131 		return retval;
6132 
6133 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6134 	if (op_mode == OUT_OF_PLACE)
6135 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6136 
6137 	/* clear mbuf payload */
6138 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6139 		rte_pktmbuf_tailroom(ut_params->ibuf));
6140 	if (op_mode == OUT_OF_PLACE)
6141 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6142 			rte_pktmbuf_tailroom(ut_params->obuf));
6143 
6144 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6145 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6146 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6147 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6148 
6149 	if (verify) {
6150 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6151 					ciphertext_pad_len);
6152 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6153 		if (op_mode == OUT_OF_PLACE)
6154 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6155 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6156 			ciphertext_len);
6157 	} else {
6158 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6159 					plaintext_pad_len);
6160 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6161 		if (op_mode == OUT_OF_PLACE)
6162 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6163 		debug_hexdump(stdout, "plaintext:", plaintext,
6164 			plaintext_len);
6165 	}
6166 
6167 	/* Create ZUC operation */
6168 	retval = create_wireless_algo_auth_cipher_operation(
6169 		tdata->digest.data, tdata->digest.len,
6170 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6171 		tdata->auth_iv.data, tdata->auth_iv.len,
6172 		(tdata->digest.offset_bytes == 0 ?
6173 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6174 			: tdata->digest.offset_bytes),
6175 		tdata->validCipherLenInBits.len,
6176 		tdata->validCipherOffsetInBits.len,
6177 		tdata->validAuthLenInBits.len,
6178 		0,
6179 		op_mode, 0, verify);
6180 
6181 	if (retval < 0)
6182 		return retval;
6183 
6184 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6185 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6186 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6187 	else
6188 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6189 			ut_params->op);
6190 
6191 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6192 
6193 	ut_params->obuf = (op_mode == IN_PLACE ?
6194 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6195 
6196 
6197 	if (verify) {
6198 		if (ut_params->obuf)
6199 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6200 							uint8_t *);
6201 		else
6202 			plaintext = ciphertext;
6203 
6204 		debug_hexdump(stdout, "plaintext:", plaintext,
6205 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6206 		debug_hexdump(stdout, "plaintext expected:",
6207 			tdata->plaintext.data,
6208 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6209 	} else {
6210 		if (ut_params->obuf)
6211 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6212 							uint8_t *);
6213 		else
6214 			ciphertext = plaintext;
6215 
6216 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6217 			ciphertext_len);
6218 		debug_hexdump(stdout, "ciphertext expected:",
6219 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6220 
6221 		ut_params->digest = rte_pktmbuf_mtod(
6222 			ut_params->obuf, uint8_t *) +
6223 			(tdata->digest.offset_bytes == 0 ?
6224 			plaintext_pad_len : tdata->digest.offset_bytes);
6225 
6226 		debug_hexdump(stdout, "digest:", ut_params->digest,
6227 			tdata->digest.len);
6228 		debug_hexdump(stdout, "digest expected:",
6229 			tdata->digest.data, tdata->digest.len);
6230 	}
6231 
6232 	/* Validate obuf */
6233 	if (verify) {
6234 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6235 			plaintext,
6236 			tdata->plaintext.data,
6237 			tdata->plaintext.len >> 3,
6238 			"ZUC Plaintext data not as expected");
6239 	} else {
6240 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6241 			ciphertext,
6242 			tdata->ciphertext.data,
6243 			tdata->ciphertext.len >> 3,
6244 			"ZUC Ciphertext data not as expected");
6245 
6246 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6247 			ut_params->digest,
6248 			tdata->digest.data,
6249 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6250 			"ZUC Generated auth tag not as expected");
6251 	}
6252 	return 0;
6253 }
6254 
6255 static int
6256 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6257 	uint8_t op_mode, uint8_t verify)
6258 {
6259 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6260 	struct crypto_unittest_params *ut_params = &unittest_params;
6261 
6262 	int retval;
6263 
6264 	const uint8_t *plaintext = NULL;
6265 	const uint8_t *ciphertext = NULL;
6266 	const uint8_t *digest = NULL;
6267 	unsigned int plaintext_pad_len;
6268 	unsigned int plaintext_len;
6269 	unsigned int ciphertext_pad_len;
6270 	unsigned int ciphertext_len;
6271 	uint8_t buffer[10000];
6272 	uint8_t digest_buffer[10000];
6273 
6274 	struct rte_cryptodev_info dev_info;
6275 	struct rte_cryptodev_sym_capability_idx cap_idx;
6276 
6277 	/* Check if device supports ZUC EIA3 */
6278 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6279 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
6280 
6281 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
6282 			&cap_idx) == NULL)
6283 		return TEST_SKIPPED;
6284 
6285 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6286 
6287 	uint64_t feat_flags = dev_info.feature_flags;
6288 
6289 	if (op_mode == IN_PLACE) {
6290 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6291 			printf("Device doesn't support in-place scatter-gather "
6292 					"in both input and output mbufs.\n");
6293 			return TEST_SKIPPED;
6294 		}
6295 
6296 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6297 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6298 			printf("Device doesn't support RAW data-path APIs.\n");
6299 			return TEST_SKIPPED;
6300 		}
6301 	} else {
6302 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6303 			return TEST_SKIPPED;
6304 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6305 			printf("Device doesn't support out-of-place scatter-gather "
6306 					"in both input and output mbufs.\n");
6307 			return TEST_SKIPPED;
6308 		}
6309 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6310 			printf("Device doesn't support digest encrypted.\n");
6311 			return TEST_SKIPPED;
6312 		}
6313 	}
6314 
6315 	/* Create ZUC session */
6316 	retval = create_wireless_algo_auth_cipher_session(
6317 			ts_params->valid_devs[0],
6318 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6319 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6320 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6321 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6322 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6323 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6324 			tdata->key.data, tdata->key.len,
6325 			tdata->auth_iv.len, tdata->digest.len,
6326 			tdata->cipher_iv.len);
6327 
6328 	if (retval != 0)
6329 		return retval;
6330 
6331 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6332 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6333 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6334 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6335 
6336 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6337 			plaintext_pad_len, 15, 0);
6338 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6339 			"Failed to allocate input buffer in mempool");
6340 
6341 	if (op_mode == OUT_OF_PLACE) {
6342 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6343 				plaintext_pad_len, 15, 0);
6344 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6345 				"Failed to allocate output buffer in mempool");
6346 	}
6347 
6348 	if (verify) {
6349 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6350 			tdata->ciphertext.data);
6351 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6352 					ciphertext_len, buffer);
6353 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6354 			ciphertext_len);
6355 	} else {
6356 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6357 			tdata->plaintext.data);
6358 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6359 					plaintext_len, buffer);
6360 		debug_hexdump(stdout, "plaintext:", plaintext,
6361 			plaintext_len);
6362 	}
6363 	memset(buffer, 0, sizeof(buffer));
6364 
6365 	/* Create ZUC operation */
6366 	retval = create_wireless_algo_auth_cipher_operation(
6367 		tdata->digest.data, tdata->digest.len,
6368 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6369 		NULL, 0,
6370 		(tdata->digest.offset_bytes == 0 ?
6371 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6372 			: tdata->digest.offset_bytes),
6373 		tdata->validCipherLenInBits.len,
6374 		tdata->validCipherOffsetInBits.len,
6375 		tdata->validAuthLenInBits.len,
6376 		0,
6377 		op_mode, 1, verify);
6378 
6379 	if (retval < 0)
6380 		return retval;
6381 
6382 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6383 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6384 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6385 	else
6386 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6387 			ut_params->op);
6388 
6389 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6390 
6391 	ut_params->obuf = (op_mode == IN_PLACE ?
6392 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6393 
6394 	if (verify) {
6395 		if (ut_params->obuf)
6396 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6397 					plaintext_len, buffer);
6398 		else
6399 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6400 					plaintext_len, buffer);
6401 
6402 		debug_hexdump(stdout, "plaintext:", plaintext,
6403 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6404 		debug_hexdump(stdout, "plaintext expected:",
6405 			tdata->plaintext.data,
6406 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6407 	} else {
6408 		if (ut_params->obuf)
6409 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6410 					ciphertext_len, buffer);
6411 		else
6412 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6413 					ciphertext_len, buffer);
6414 
6415 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6416 			ciphertext_len);
6417 		debug_hexdump(stdout, "ciphertext expected:",
6418 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6419 
6420 		if (ut_params->obuf)
6421 			digest = rte_pktmbuf_read(ut_params->obuf,
6422 				(tdata->digest.offset_bytes == 0 ?
6423 				plaintext_pad_len : tdata->digest.offset_bytes),
6424 				tdata->digest.len, digest_buffer);
6425 		else
6426 			digest = rte_pktmbuf_read(ut_params->ibuf,
6427 				(tdata->digest.offset_bytes == 0 ?
6428 				plaintext_pad_len : tdata->digest.offset_bytes),
6429 				tdata->digest.len, digest_buffer);
6430 
6431 		debug_hexdump(stdout, "digest:", digest,
6432 			tdata->digest.len);
6433 		debug_hexdump(stdout, "digest expected:",
6434 			tdata->digest.data, tdata->digest.len);
6435 	}
6436 
6437 	/* Validate obuf */
6438 	if (verify) {
6439 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6440 			plaintext,
6441 			tdata->plaintext.data,
6442 			tdata->plaintext.len >> 3,
6443 			"ZUC Plaintext data not as expected");
6444 	} else {
6445 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6446 			ciphertext,
6447 			tdata->ciphertext.data,
6448 			tdata->validDataLenInBits.len,
6449 			"ZUC Ciphertext data not as expected");
6450 
6451 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6452 			digest,
6453 			tdata->digest.data,
6454 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6455 			"ZUC Generated auth tag not as expected");
6456 	}
6457 	return 0;
6458 }
6459 
6460 static int
6461 test_kasumi_encryption_test_case_1(void)
6462 {
6463 	return test_kasumi_encryption(&kasumi_test_case_1);
6464 }
6465 
6466 static int
6467 test_kasumi_encryption_test_case_1_sgl(void)
6468 {
6469 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6470 }
6471 
6472 static int
6473 test_kasumi_encryption_test_case_1_oop(void)
6474 {
6475 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6476 }
6477 
6478 static int
6479 test_kasumi_encryption_test_case_1_oop_sgl(void)
6480 {
6481 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6482 }
6483 
6484 static int
6485 test_kasumi_encryption_test_case_2(void)
6486 {
6487 	return test_kasumi_encryption(&kasumi_test_case_2);
6488 }
6489 
6490 static int
6491 test_kasumi_encryption_test_case_3(void)
6492 {
6493 	return test_kasumi_encryption(&kasumi_test_case_3);
6494 }
6495 
6496 static int
6497 test_kasumi_encryption_test_case_4(void)
6498 {
6499 	return test_kasumi_encryption(&kasumi_test_case_4);
6500 }
6501 
6502 static int
6503 test_kasumi_encryption_test_case_5(void)
6504 {
6505 	return test_kasumi_encryption(&kasumi_test_case_5);
6506 }
6507 
6508 static int
6509 test_kasumi_decryption_test_case_1(void)
6510 {
6511 	return test_kasumi_decryption(&kasumi_test_case_1);
6512 }
6513 
6514 static int
6515 test_kasumi_decryption_test_case_1_oop(void)
6516 {
6517 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6518 }
6519 
6520 static int
6521 test_kasumi_decryption_test_case_2(void)
6522 {
6523 	return test_kasumi_decryption(&kasumi_test_case_2);
6524 }
6525 
6526 static int
6527 test_kasumi_decryption_test_case_3(void)
6528 {
6529 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6530 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6531 		return TEST_SKIPPED;
6532 	return test_kasumi_decryption(&kasumi_test_case_3);
6533 }
6534 
6535 static int
6536 test_kasumi_decryption_test_case_4(void)
6537 {
6538 	return test_kasumi_decryption(&kasumi_test_case_4);
6539 }
6540 
6541 static int
6542 test_kasumi_decryption_test_case_5(void)
6543 {
6544 	return test_kasumi_decryption(&kasumi_test_case_5);
6545 }
6546 static int
6547 test_snow3g_encryption_test_case_1(void)
6548 {
6549 	return test_snow3g_encryption(&snow3g_test_case_1);
6550 }
6551 
6552 static int
6553 test_snow3g_encryption_test_case_1_oop(void)
6554 {
6555 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6556 }
6557 
6558 static int
6559 test_snow3g_encryption_test_case_1_oop_sgl(void)
6560 {
6561 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6562 }
6563 
6564 
6565 static int
6566 test_snow3g_encryption_test_case_1_offset_oop(void)
6567 {
6568 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6569 }
6570 
6571 static int
6572 test_snow3g_encryption_test_case_2(void)
6573 {
6574 	return test_snow3g_encryption(&snow3g_test_case_2);
6575 }
6576 
6577 static int
6578 test_snow3g_encryption_test_case_3(void)
6579 {
6580 	return test_snow3g_encryption(&snow3g_test_case_3);
6581 }
6582 
6583 static int
6584 test_snow3g_encryption_test_case_4(void)
6585 {
6586 	return test_snow3g_encryption(&snow3g_test_case_4);
6587 }
6588 
6589 static int
6590 test_snow3g_encryption_test_case_5(void)
6591 {
6592 	return test_snow3g_encryption(&snow3g_test_case_5);
6593 }
6594 
6595 static int
6596 test_snow3g_decryption_test_case_1(void)
6597 {
6598 	return test_snow3g_decryption(&snow3g_test_case_1);
6599 }
6600 
6601 static int
6602 test_snow3g_decryption_test_case_1_oop(void)
6603 {
6604 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6605 }
6606 
6607 static int
6608 test_snow3g_decryption_test_case_2(void)
6609 {
6610 	return test_snow3g_decryption(&snow3g_test_case_2);
6611 }
6612 
6613 static int
6614 test_snow3g_decryption_test_case_3(void)
6615 {
6616 	return test_snow3g_decryption(&snow3g_test_case_3);
6617 }
6618 
6619 static int
6620 test_snow3g_decryption_test_case_4(void)
6621 {
6622 	return test_snow3g_decryption(&snow3g_test_case_4);
6623 }
6624 
6625 static int
6626 test_snow3g_decryption_test_case_5(void)
6627 {
6628 	return test_snow3g_decryption(&snow3g_test_case_5);
6629 }
6630 
6631 /*
6632  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6633  * Pattern digest from snow3g_test_data must be allocated as
6634  * 4 last bytes in plaintext.
6635  */
6636 static void
6637 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6638 		struct snow3g_hash_test_data *output)
6639 {
6640 	if ((pattern != NULL) && (output != NULL)) {
6641 		output->key.len = pattern->key.len;
6642 
6643 		memcpy(output->key.data,
6644 		pattern->key.data, pattern->key.len);
6645 
6646 		output->auth_iv.len = pattern->auth_iv.len;
6647 
6648 		memcpy(output->auth_iv.data,
6649 		pattern->auth_iv.data, pattern->auth_iv.len);
6650 
6651 		output->plaintext.len = pattern->plaintext.len;
6652 
6653 		memcpy(output->plaintext.data,
6654 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6655 
6656 		output->digest.len = pattern->digest.len;
6657 
6658 		memcpy(output->digest.data,
6659 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6660 		pattern->digest.len);
6661 
6662 		output->validAuthLenInBits.len =
6663 		pattern->validAuthLenInBits.len;
6664 	}
6665 }
6666 
6667 /*
6668  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6669  */
6670 static int
6671 test_snow3g_decryption_with_digest_test_case_1(void)
6672 {
6673 	struct snow3g_hash_test_data snow3g_hash_data;
6674 	struct rte_cryptodev_info dev_info;
6675 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6676 
6677 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6678 	uint64_t feat_flags = dev_info.feature_flags;
6679 
6680 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6681 		printf("Device doesn't support encrypted digest operations.\n");
6682 		return TEST_SKIPPED;
6683 	}
6684 
6685 	/*
6686 	 * Function prepare data for hash veryfication test case.
6687 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6688 	 */
6689 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6690 
6691 	return test_snow3g_decryption(&snow3g_test_case_7) &
6692 			test_snow3g_authentication_verify(&snow3g_hash_data);
6693 }
6694 
6695 static int
6696 test_snow3g_cipher_auth_test_case_1(void)
6697 {
6698 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6699 }
6700 
6701 static int
6702 test_snow3g_auth_cipher_test_case_1(void)
6703 {
6704 	return test_snow3g_auth_cipher(
6705 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6706 }
6707 
6708 static int
6709 test_snow3g_auth_cipher_test_case_2(void)
6710 {
6711 	return test_snow3g_auth_cipher(
6712 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6713 }
6714 
6715 static int
6716 test_snow3g_auth_cipher_test_case_2_oop(void)
6717 {
6718 	return test_snow3g_auth_cipher(
6719 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6720 }
6721 
6722 static int
6723 test_snow3g_auth_cipher_part_digest_enc(void)
6724 {
6725 	return test_snow3g_auth_cipher(
6726 		&snow3g_auth_cipher_partial_digest_encryption,
6727 			IN_PLACE, 0);
6728 }
6729 
6730 static int
6731 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6732 {
6733 	return test_snow3g_auth_cipher(
6734 		&snow3g_auth_cipher_partial_digest_encryption,
6735 			OUT_OF_PLACE, 0);
6736 }
6737 
6738 static int
6739 test_snow3g_auth_cipher_test_case_3_sgl(void)
6740 {
6741 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6742 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6743 		return TEST_SKIPPED;
6744 	return test_snow3g_auth_cipher_sgl(
6745 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6746 }
6747 
6748 static int
6749 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6750 {
6751 	return test_snow3g_auth_cipher_sgl(
6752 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6753 }
6754 
6755 static int
6756 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6757 {
6758 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6759 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6760 		return TEST_SKIPPED;
6761 	return test_snow3g_auth_cipher_sgl(
6762 		&snow3g_auth_cipher_partial_digest_encryption,
6763 			IN_PLACE, 0);
6764 }
6765 
6766 static int
6767 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6768 {
6769 	return test_snow3g_auth_cipher_sgl(
6770 		&snow3g_auth_cipher_partial_digest_encryption,
6771 			OUT_OF_PLACE, 0);
6772 }
6773 
6774 static int
6775 test_snow3g_auth_cipher_verify_test_case_1(void)
6776 {
6777 	return test_snow3g_auth_cipher(
6778 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6779 }
6780 
6781 static int
6782 test_snow3g_auth_cipher_verify_test_case_2(void)
6783 {
6784 	return test_snow3g_auth_cipher(
6785 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6786 }
6787 
6788 static int
6789 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6790 {
6791 	return test_snow3g_auth_cipher(
6792 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6793 }
6794 
6795 static int
6796 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6797 {
6798 	return test_snow3g_auth_cipher(
6799 		&snow3g_auth_cipher_partial_digest_encryption,
6800 			IN_PLACE, 1);
6801 }
6802 
6803 static int
6804 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6805 {
6806 	return test_snow3g_auth_cipher(
6807 		&snow3g_auth_cipher_partial_digest_encryption,
6808 			OUT_OF_PLACE, 1);
6809 }
6810 
6811 static int
6812 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6813 {
6814 	return test_snow3g_auth_cipher_sgl(
6815 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6816 }
6817 
6818 static int
6819 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6820 {
6821 	return test_snow3g_auth_cipher_sgl(
6822 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6823 }
6824 
6825 static int
6826 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6827 {
6828 	return test_snow3g_auth_cipher_sgl(
6829 		&snow3g_auth_cipher_partial_digest_encryption,
6830 			IN_PLACE, 1);
6831 }
6832 
6833 static int
6834 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6835 {
6836 	return test_snow3g_auth_cipher_sgl(
6837 		&snow3g_auth_cipher_partial_digest_encryption,
6838 			OUT_OF_PLACE, 1);
6839 }
6840 
6841 static int
6842 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6843 {
6844 	return test_snow3g_auth_cipher(
6845 		&snow3g_test_case_7, IN_PLACE, 0);
6846 }
6847 
6848 static int
6849 test_kasumi_auth_cipher_test_case_1(void)
6850 {
6851 	return test_kasumi_auth_cipher(
6852 		&kasumi_test_case_3, IN_PLACE, 0);
6853 }
6854 
6855 static int
6856 test_kasumi_auth_cipher_test_case_2(void)
6857 {
6858 	return test_kasumi_auth_cipher(
6859 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6860 }
6861 
6862 static int
6863 test_kasumi_auth_cipher_test_case_2_oop(void)
6864 {
6865 	return test_kasumi_auth_cipher(
6866 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6867 }
6868 
6869 static int
6870 test_kasumi_auth_cipher_test_case_2_sgl(void)
6871 {
6872 	return test_kasumi_auth_cipher_sgl(
6873 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6874 }
6875 
6876 static int
6877 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6878 {
6879 	return test_kasumi_auth_cipher_sgl(
6880 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6881 }
6882 
6883 static int
6884 test_kasumi_auth_cipher_verify_test_case_1(void)
6885 {
6886 	return test_kasumi_auth_cipher(
6887 		&kasumi_test_case_3, IN_PLACE, 1);
6888 }
6889 
6890 static int
6891 test_kasumi_auth_cipher_verify_test_case_2(void)
6892 {
6893 	return test_kasumi_auth_cipher(
6894 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6895 }
6896 
6897 static int
6898 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6899 {
6900 	return test_kasumi_auth_cipher(
6901 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6902 }
6903 
6904 static int
6905 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6906 {
6907 	return test_kasumi_auth_cipher_sgl(
6908 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6909 }
6910 
6911 static int
6912 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6913 {
6914 	return test_kasumi_auth_cipher_sgl(
6915 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6916 }
6917 
6918 static int
6919 test_kasumi_cipher_auth_test_case_1(void)
6920 {
6921 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6922 }
6923 
6924 static int
6925 test_zuc_encryption_test_case_1(void)
6926 {
6927 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6928 }
6929 
6930 static int
6931 test_zuc_encryption_test_case_2(void)
6932 {
6933 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6934 }
6935 
6936 static int
6937 test_zuc_encryption_test_case_3(void)
6938 {
6939 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6940 }
6941 
6942 static int
6943 test_zuc_encryption_test_case_4(void)
6944 {
6945 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6946 }
6947 
6948 static int
6949 test_zuc_encryption_test_case_5(void)
6950 {
6951 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6952 }
6953 
6954 static int
6955 test_zuc_encryption_test_case_6_sgl(void)
6956 {
6957 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6958 }
6959 
6960 static int
6961 test_zuc_hash_generate_test_case_1(void)
6962 {
6963 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6964 }
6965 
6966 static int
6967 test_zuc_hash_generate_test_case_2(void)
6968 {
6969 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6970 }
6971 
6972 static int
6973 test_zuc_hash_generate_test_case_3(void)
6974 {
6975 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6976 }
6977 
6978 static int
6979 test_zuc_hash_generate_test_case_4(void)
6980 {
6981 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6982 }
6983 
6984 static int
6985 test_zuc_hash_generate_test_case_5(void)
6986 {
6987 	return test_zuc_authentication(&zuc_test_auth_5670b);
6988 }
6989 
6990 static int
6991 test_zuc_hash_generate_test_case_6(void)
6992 {
6993 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6994 }
6995 
6996 static int
6997 test_zuc_hash_generate_test_case_7(void)
6998 {
6999 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7000 }
7001 
7002 static int
7003 test_zuc_hash_generate_test_case_8(void)
7004 {
7005 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7006 }
7007 
7008 static int
7009 test_zuc_cipher_auth_test_case_1(void)
7010 {
7011 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7012 }
7013 
7014 static int
7015 test_zuc_cipher_auth_test_case_2(void)
7016 {
7017 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7018 }
7019 
7020 static int
7021 test_zuc_auth_cipher_test_case_1(void)
7022 {
7023 	return test_zuc_auth_cipher(
7024 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7025 }
7026 
7027 static int
7028 test_zuc_auth_cipher_test_case_1_oop(void)
7029 {
7030 	return test_zuc_auth_cipher(
7031 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7032 }
7033 
7034 static int
7035 test_zuc_auth_cipher_test_case_1_sgl(void)
7036 {
7037 	return test_zuc_auth_cipher_sgl(
7038 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7039 }
7040 
7041 static int
7042 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7043 {
7044 	return test_zuc_auth_cipher_sgl(
7045 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7046 }
7047 
7048 static int
7049 test_zuc_auth_cipher_verify_test_case_1(void)
7050 {
7051 	return test_zuc_auth_cipher(
7052 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7053 }
7054 
7055 static int
7056 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7057 {
7058 	return test_zuc_auth_cipher(
7059 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7060 }
7061 
7062 static int
7063 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7064 {
7065 	return test_zuc_auth_cipher_sgl(
7066 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7067 }
7068 
7069 static int
7070 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7071 {
7072 	return test_zuc_auth_cipher_sgl(
7073 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7074 }
7075 
7076 static int
7077 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7078 {
7079 	uint8_t dev_id = testsuite_params.valid_devs[0];
7080 
7081 	struct rte_cryptodev_sym_capability_idx cap_idx;
7082 
7083 	/* Check if device supports particular cipher algorithm */
7084 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7085 	cap_idx.algo.cipher = tdata->cipher_algo;
7086 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7087 		return TEST_SKIPPED;
7088 
7089 	/* Check if device supports particular hash algorithm */
7090 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7091 	cap_idx.algo.auth = tdata->auth_algo;
7092 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7093 		return TEST_SKIPPED;
7094 
7095 	return 0;
7096 }
7097 
7098 static int
7099 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7100 	uint8_t op_mode, uint8_t verify)
7101 {
7102 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7103 	struct crypto_unittest_params *ut_params = &unittest_params;
7104 
7105 	int retval;
7106 
7107 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7108 	unsigned int plaintext_pad_len;
7109 	unsigned int plaintext_len;
7110 	unsigned int ciphertext_pad_len;
7111 	unsigned int ciphertext_len;
7112 
7113 	struct rte_cryptodev_info dev_info;
7114 	struct rte_crypto_op *op;
7115 
7116 	/* Check if device supports particular algorithms separately */
7117 	if (test_mixed_check_if_unsupported(tdata))
7118 		return TEST_SKIPPED;
7119 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7120 		return TEST_SKIPPED;
7121 
7122 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7123 
7124 	uint64_t feat_flags = dev_info.feature_flags;
7125 
7126 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7127 		printf("Device doesn't support digest encrypted.\n");
7128 		return TEST_SKIPPED;
7129 	}
7130 
7131 	/* Create the session */
7132 	if (verify)
7133 		retval = create_wireless_algo_cipher_auth_session(
7134 				ts_params->valid_devs[0],
7135 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7136 				RTE_CRYPTO_AUTH_OP_VERIFY,
7137 				tdata->auth_algo,
7138 				tdata->cipher_algo,
7139 				tdata->auth_key.data, tdata->auth_key.len,
7140 				tdata->auth_iv.len, tdata->digest_enc.len,
7141 				tdata->cipher_iv.len);
7142 	else
7143 		retval = create_wireless_algo_auth_cipher_session(
7144 				ts_params->valid_devs[0],
7145 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7146 				RTE_CRYPTO_AUTH_OP_GENERATE,
7147 				tdata->auth_algo,
7148 				tdata->cipher_algo,
7149 				tdata->auth_key.data, tdata->auth_key.len,
7150 				tdata->auth_iv.len, tdata->digest_enc.len,
7151 				tdata->cipher_iv.len);
7152 	if (retval != 0)
7153 		return retval;
7154 
7155 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7156 	if (op_mode == OUT_OF_PLACE)
7157 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7158 
7159 	/* clear mbuf payload */
7160 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7161 		rte_pktmbuf_tailroom(ut_params->ibuf));
7162 	if (op_mode == OUT_OF_PLACE) {
7163 
7164 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7165 				rte_pktmbuf_tailroom(ut_params->obuf));
7166 	}
7167 
7168 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7169 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7170 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7171 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7172 
7173 	if (verify) {
7174 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7175 				ciphertext_pad_len);
7176 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7177 		if (op_mode == OUT_OF_PLACE)
7178 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7179 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7180 				ciphertext_len);
7181 	} else {
7182 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7183 				plaintext_pad_len);
7184 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7185 		if (op_mode == OUT_OF_PLACE)
7186 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
7187 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7188 	}
7189 
7190 	/* Create the operation */
7191 	retval = create_wireless_algo_auth_cipher_operation(
7192 			tdata->digest_enc.data, tdata->digest_enc.len,
7193 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7194 			tdata->auth_iv.data, tdata->auth_iv.len,
7195 			(tdata->digest_enc.offset == 0 ?
7196 				plaintext_pad_len
7197 				: tdata->digest_enc.offset),
7198 			tdata->validCipherLen.len_bits,
7199 			tdata->cipher.offset_bits,
7200 			tdata->validAuthLen.len_bits,
7201 			tdata->auth.offset_bits,
7202 			op_mode, 0, verify);
7203 
7204 	if (retval < 0)
7205 		return retval;
7206 
7207 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7208 
7209 	/* Check if the op failed because the device doesn't */
7210 	/* support this particular combination of algorithms */
7211 	if (op == NULL && ut_params->op->status ==
7212 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7213 		printf("Device doesn't support this mixed combination. "
7214 				"Test Skipped.\n");
7215 		return TEST_SKIPPED;
7216 	}
7217 	ut_params->op = op;
7218 
7219 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7220 
7221 	ut_params->obuf = (op_mode == IN_PLACE ?
7222 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7223 
7224 	if (verify) {
7225 		if (ut_params->obuf)
7226 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7227 							uint8_t *);
7228 		else
7229 			plaintext = ciphertext +
7230 					(tdata->cipher.offset_bits >> 3);
7231 
7232 		debug_hexdump(stdout, "plaintext:", plaintext,
7233 				tdata->plaintext.len_bits >> 3);
7234 		debug_hexdump(stdout, "plaintext expected:",
7235 				tdata->plaintext.data,
7236 				tdata->plaintext.len_bits >> 3);
7237 	} else {
7238 		if (ut_params->obuf)
7239 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7240 					uint8_t *);
7241 		else
7242 			ciphertext = plaintext;
7243 
7244 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7245 				ciphertext_len);
7246 		debug_hexdump(stdout, "ciphertext expected:",
7247 				tdata->ciphertext.data,
7248 				tdata->ciphertext.len_bits >> 3);
7249 
7250 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7251 				+ (tdata->digest_enc.offset == 0 ?
7252 		plaintext_pad_len : tdata->digest_enc.offset);
7253 
7254 		debug_hexdump(stdout, "digest:", ut_params->digest,
7255 				tdata->digest_enc.len);
7256 		debug_hexdump(stdout, "digest expected:",
7257 				tdata->digest_enc.data,
7258 				tdata->digest_enc.len);
7259 	}
7260 
7261 	/* Validate obuf */
7262 	if (verify) {
7263 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7264 				plaintext,
7265 				tdata->plaintext.data,
7266 				tdata->plaintext.len_bits >> 3,
7267 				"Plaintext data not as expected");
7268 	} else {
7269 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7270 				ciphertext,
7271 				tdata->ciphertext.data,
7272 				tdata->validDataLen.len_bits,
7273 				"Ciphertext data not as expected");
7274 
7275 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7276 				ut_params->digest,
7277 				tdata->digest_enc.data,
7278 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
7279 				"Generated auth tag not as expected");
7280 	}
7281 
7282 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7283 			"crypto op processing failed");
7284 
7285 	return 0;
7286 }
7287 
7288 static int
7289 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7290 	uint8_t op_mode, uint8_t verify)
7291 {
7292 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7293 	struct crypto_unittest_params *ut_params = &unittest_params;
7294 
7295 	int retval;
7296 
7297 	const uint8_t *plaintext = NULL;
7298 	const uint8_t *ciphertext = NULL;
7299 	const uint8_t *digest = NULL;
7300 	unsigned int plaintext_pad_len;
7301 	unsigned int plaintext_len;
7302 	unsigned int ciphertext_pad_len;
7303 	unsigned int ciphertext_len;
7304 	uint8_t buffer[10000];
7305 	uint8_t digest_buffer[10000];
7306 
7307 	struct rte_cryptodev_info dev_info;
7308 	struct rte_crypto_op *op;
7309 
7310 	/* Check if device supports particular algorithms */
7311 	if (test_mixed_check_if_unsupported(tdata))
7312 		return TEST_SKIPPED;
7313 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7314 		return TEST_SKIPPED;
7315 
7316 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7317 
7318 	uint64_t feat_flags = dev_info.feature_flags;
7319 
7320 	if (op_mode == IN_PLACE) {
7321 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7322 			printf("Device doesn't support in-place scatter-gather "
7323 					"in both input and output mbufs.\n");
7324 			return TEST_SKIPPED;
7325 		}
7326 	} else {
7327 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7328 			printf("Device doesn't support out-of-place scatter-gather "
7329 					"in both input and output mbufs.\n");
7330 			return TEST_SKIPPED;
7331 		}
7332 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7333 			printf("Device doesn't support digest encrypted.\n");
7334 			return TEST_SKIPPED;
7335 		}
7336 	}
7337 
7338 	/* Create the session */
7339 	if (verify)
7340 		retval = create_wireless_algo_cipher_auth_session(
7341 				ts_params->valid_devs[0],
7342 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7343 				RTE_CRYPTO_AUTH_OP_VERIFY,
7344 				tdata->auth_algo,
7345 				tdata->cipher_algo,
7346 				tdata->auth_key.data, tdata->auth_key.len,
7347 				tdata->auth_iv.len, tdata->digest_enc.len,
7348 				tdata->cipher_iv.len);
7349 	else
7350 		retval = create_wireless_algo_auth_cipher_session(
7351 				ts_params->valid_devs[0],
7352 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7353 				RTE_CRYPTO_AUTH_OP_GENERATE,
7354 				tdata->auth_algo,
7355 				tdata->cipher_algo,
7356 				tdata->auth_key.data, tdata->auth_key.len,
7357 				tdata->auth_iv.len, tdata->digest_enc.len,
7358 				tdata->cipher_iv.len);
7359 	if (retval != 0)
7360 		return retval;
7361 
7362 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7363 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7364 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7365 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7366 
7367 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7368 			ciphertext_pad_len, 15, 0);
7369 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7370 			"Failed to allocate input buffer in mempool");
7371 
7372 	if (op_mode == OUT_OF_PLACE) {
7373 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7374 				plaintext_pad_len, 15, 0);
7375 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7376 				"Failed to allocate output buffer in mempool");
7377 	}
7378 
7379 	if (verify) {
7380 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7381 			tdata->ciphertext.data);
7382 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7383 					ciphertext_len, buffer);
7384 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7385 			ciphertext_len);
7386 	} else {
7387 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7388 			tdata->plaintext.data);
7389 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7390 					plaintext_len, buffer);
7391 		debug_hexdump(stdout, "plaintext:", plaintext,
7392 			plaintext_len);
7393 	}
7394 	memset(buffer, 0, sizeof(buffer));
7395 
7396 	/* Create the operation */
7397 	retval = create_wireless_algo_auth_cipher_operation(
7398 			tdata->digest_enc.data, tdata->digest_enc.len,
7399 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7400 			tdata->auth_iv.data, tdata->auth_iv.len,
7401 			(tdata->digest_enc.offset == 0 ?
7402 				plaintext_pad_len
7403 				: tdata->digest_enc.offset),
7404 			tdata->validCipherLen.len_bits,
7405 			tdata->cipher.offset_bits,
7406 			tdata->validAuthLen.len_bits,
7407 			tdata->auth.offset_bits,
7408 			op_mode, 1, verify);
7409 
7410 	if (retval < 0)
7411 		return retval;
7412 
7413 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7414 
7415 	/* Check if the op failed because the device doesn't */
7416 	/* support this particular combination of algorithms */
7417 	if (op == NULL && ut_params->op->status ==
7418 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7419 		printf("Device doesn't support this mixed combination. "
7420 				"Test Skipped.\n");
7421 		return TEST_SKIPPED;
7422 	}
7423 	ut_params->op = op;
7424 
7425 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7426 
7427 	ut_params->obuf = (op_mode == IN_PLACE ?
7428 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7429 
7430 	if (verify) {
7431 		if (ut_params->obuf)
7432 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7433 					plaintext_len, buffer);
7434 		else
7435 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7436 					plaintext_len, buffer);
7437 
7438 		debug_hexdump(stdout, "plaintext:", plaintext,
7439 				(tdata->plaintext.len_bits >> 3) -
7440 				tdata->digest_enc.len);
7441 		debug_hexdump(stdout, "plaintext expected:",
7442 				tdata->plaintext.data,
7443 				(tdata->plaintext.len_bits >> 3) -
7444 				tdata->digest_enc.len);
7445 	} else {
7446 		if (ut_params->obuf)
7447 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7448 					ciphertext_len, buffer);
7449 		else
7450 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7451 					ciphertext_len, buffer);
7452 
7453 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7454 			ciphertext_len);
7455 		debug_hexdump(stdout, "ciphertext expected:",
7456 			tdata->ciphertext.data,
7457 			tdata->ciphertext.len_bits >> 3);
7458 
7459 		if (ut_params->obuf)
7460 			digest = rte_pktmbuf_read(ut_params->obuf,
7461 					(tdata->digest_enc.offset == 0 ?
7462 						plaintext_pad_len :
7463 						tdata->digest_enc.offset),
7464 					tdata->digest_enc.len, digest_buffer);
7465 		else
7466 			digest = rte_pktmbuf_read(ut_params->ibuf,
7467 					(tdata->digest_enc.offset == 0 ?
7468 						plaintext_pad_len :
7469 						tdata->digest_enc.offset),
7470 					tdata->digest_enc.len, digest_buffer);
7471 
7472 		debug_hexdump(stdout, "digest:", digest,
7473 				tdata->digest_enc.len);
7474 		debug_hexdump(stdout, "digest expected:",
7475 				tdata->digest_enc.data, tdata->digest_enc.len);
7476 	}
7477 
7478 	/* Validate obuf */
7479 	if (verify) {
7480 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7481 				plaintext,
7482 				tdata->plaintext.data,
7483 				tdata->plaintext.len_bits >> 3,
7484 				"Plaintext data not as expected");
7485 	} else {
7486 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7487 				ciphertext,
7488 				tdata->ciphertext.data,
7489 				tdata->validDataLen.len_bits,
7490 				"Ciphertext data not as expected");
7491 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7492 				digest,
7493 				tdata->digest_enc.data,
7494 				tdata->digest_enc.len,
7495 				"Generated auth tag not as expected");
7496 	}
7497 
7498 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7499 			"crypto op processing failed");
7500 
7501 	return 0;
7502 }
7503 
7504 /** AUTH AES CMAC + CIPHER AES CTR */
7505 
7506 static int
7507 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7508 {
7509 	return test_mixed_auth_cipher(
7510 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7511 }
7512 
7513 static int
7514 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7515 {
7516 	return test_mixed_auth_cipher(
7517 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7518 }
7519 
7520 static int
7521 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7522 {
7523 	return test_mixed_auth_cipher_sgl(
7524 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7525 }
7526 
7527 static int
7528 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7529 {
7530 	return test_mixed_auth_cipher_sgl(
7531 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7532 }
7533 
7534 static int
7535 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7536 {
7537 	return test_mixed_auth_cipher(
7538 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7539 }
7540 
7541 static int
7542 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7543 {
7544 	return test_mixed_auth_cipher(
7545 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7546 }
7547 
7548 static int
7549 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7550 {
7551 	return test_mixed_auth_cipher_sgl(
7552 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7553 }
7554 
7555 static int
7556 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7557 {
7558 	return test_mixed_auth_cipher_sgl(
7559 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7560 }
7561 
7562 /** MIXED AUTH + CIPHER */
7563 
7564 static int
7565 test_auth_zuc_cipher_snow_test_case_1(void)
7566 {
7567 	return test_mixed_auth_cipher(
7568 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7569 }
7570 
7571 static int
7572 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7573 {
7574 	return test_mixed_auth_cipher(
7575 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7576 }
7577 
7578 static int
7579 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7580 {
7581 	return test_mixed_auth_cipher(
7582 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7583 }
7584 
7585 static int
7586 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7587 {
7588 	return test_mixed_auth_cipher(
7589 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7590 }
7591 
7592 static int
7593 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7594 {
7595 	return test_mixed_auth_cipher(
7596 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7597 }
7598 
7599 static int
7600 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7601 {
7602 	return test_mixed_auth_cipher(
7603 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7604 }
7605 
7606 static int
7607 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7608 {
7609 	return test_mixed_auth_cipher(
7610 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7611 }
7612 
7613 static int
7614 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7615 {
7616 	return test_mixed_auth_cipher(
7617 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7618 }
7619 
7620 static int
7621 test_auth_snow_cipher_zuc_test_case_1(void)
7622 {
7623 	return test_mixed_auth_cipher(
7624 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7625 }
7626 
7627 static int
7628 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7629 {
7630 	return test_mixed_auth_cipher(
7631 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7632 }
7633 
7634 static int
7635 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7636 {
7637 	return test_mixed_auth_cipher(
7638 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7639 }
7640 
7641 static int
7642 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7643 {
7644 	return test_mixed_auth_cipher(
7645 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7646 }
7647 
7648 static int
7649 test_auth_null_cipher_snow_test_case_1(void)
7650 {
7651 	return test_mixed_auth_cipher(
7652 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7653 }
7654 
7655 static int
7656 test_verify_auth_null_cipher_snow_test_case_1(void)
7657 {
7658 	return test_mixed_auth_cipher(
7659 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7660 }
7661 
7662 static int
7663 test_auth_null_cipher_zuc_test_case_1(void)
7664 {
7665 	return test_mixed_auth_cipher(
7666 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7667 }
7668 
7669 static int
7670 test_verify_auth_null_cipher_zuc_test_case_1(void)
7671 {
7672 	return test_mixed_auth_cipher(
7673 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7674 }
7675 
7676 static int
7677 test_auth_snow_cipher_null_test_case_1(void)
7678 {
7679 	return test_mixed_auth_cipher(
7680 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7681 }
7682 
7683 static int
7684 test_verify_auth_snow_cipher_null_test_case_1(void)
7685 {
7686 	return test_mixed_auth_cipher(
7687 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7688 }
7689 
7690 static int
7691 test_auth_zuc_cipher_null_test_case_1(void)
7692 {
7693 	return test_mixed_auth_cipher(
7694 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7695 }
7696 
7697 static int
7698 test_verify_auth_zuc_cipher_null_test_case_1(void)
7699 {
7700 	return test_mixed_auth_cipher(
7701 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7702 }
7703 
7704 static int
7705 test_auth_null_cipher_aes_ctr_test_case_1(void)
7706 {
7707 	return test_mixed_auth_cipher(
7708 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7709 }
7710 
7711 static int
7712 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7713 {
7714 	return test_mixed_auth_cipher(
7715 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7716 }
7717 
7718 static int
7719 test_auth_aes_cmac_cipher_null_test_case_1(void)
7720 {
7721 	return test_mixed_auth_cipher(
7722 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7723 }
7724 
7725 static int
7726 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7727 {
7728 	return test_mixed_auth_cipher(
7729 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7730 }
7731 
7732 /* ***** AEAD algorithm Tests ***** */
7733 
7734 static int
7735 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7736 		enum rte_crypto_aead_operation op,
7737 		const uint8_t *key, const uint8_t key_len,
7738 		const uint16_t aad_len, const uint8_t auth_len,
7739 		uint8_t iv_len)
7740 {
7741 	uint8_t aead_key[key_len];
7742 
7743 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7744 	struct crypto_unittest_params *ut_params = &unittest_params;
7745 
7746 	memcpy(aead_key, key, key_len);
7747 
7748 	/* Setup AEAD Parameters */
7749 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7750 	ut_params->aead_xform.next = NULL;
7751 	ut_params->aead_xform.aead.algo = algo;
7752 	ut_params->aead_xform.aead.op = op;
7753 	ut_params->aead_xform.aead.key.data = aead_key;
7754 	ut_params->aead_xform.aead.key.length = key_len;
7755 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7756 	ut_params->aead_xform.aead.iv.length = iv_len;
7757 	ut_params->aead_xform.aead.digest_length = auth_len;
7758 	ut_params->aead_xform.aead.aad_length = aad_len;
7759 
7760 	debug_hexdump(stdout, "key:", key, key_len);
7761 
7762 	/* Create Crypto session*/
7763 	ut_params->sess = rte_cryptodev_sym_session_create(
7764 			ts_params->session_mpool);
7765 
7766 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7767 			&ut_params->aead_xform,
7768 			ts_params->session_priv_mpool);
7769 
7770 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7771 
7772 	return 0;
7773 }
7774 
7775 static int
7776 create_aead_xform(struct rte_crypto_op *op,
7777 		enum rte_crypto_aead_algorithm algo,
7778 		enum rte_crypto_aead_operation aead_op,
7779 		uint8_t *key, const uint8_t key_len,
7780 		const uint8_t aad_len, const uint8_t auth_len,
7781 		uint8_t iv_len)
7782 {
7783 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7784 			"failed to allocate space for crypto transform");
7785 
7786 	struct rte_crypto_sym_op *sym_op = op->sym;
7787 
7788 	/* Setup AEAD Parameters */
7789 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7790 	sym_op->xform->next = NULL;
7791 	sym_op->xform->aead.algo = algo;
7792 	sym_op->xform->aead.op = aead_op;
7793 	sym_op->xform->aead.key.data = key;
7794 	sym_op->xform->aead.key.length = key_len;
7795 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7796 	sym_op->xform->aead.iv.length = iv_len;
7797 	sym_op->xform->aead.digest_length = auth_len;
7798 	sym_op->xform->aead.aad_length = aad_len;
7799 
7800 	debug_hexdump(stdout, "key:", key, key_len);
7801 
7802 	return 0;
7803 }
7804 
7805 static int
7806 create_aead_operation(enum rte_crypto_aead_operation op,
7807 		const struct aead_test_data *tdata)
7808 {
7809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7810 	struct crypto_unittest_params *ut_params = &unittest_params;
7811 
7812 	uint8_t *plaintext, *ciphertext;
7813 	unsigned int aad_pad_len, plaintext_pad_len;
7814 
7815 	/* Generate Crypto op data structure */
7816 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7817 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7818 	TEST_ASSERT_NOT_NULL(ut_params->op,
7819 			"Failed to allocate symmetric crypto operation struct");
7820 
7821 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7822 
7823 	/* Append aad data */
7824 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7825 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7826 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7827 				aad_pad_len);
7828 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7829 				"no room to append aad");
7830 
7831 		sym_op->aead.aad.phys_addr =
7832 				rte_pktmbuf_iova(ut_params->ibuf);
7833 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7834 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7835 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7836 			tdata->aad.len);
7837 
7838 		/* Append IV at the end of the crypto operation*/
7839 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7840 				uint8_t *, IV_OFFSET);
7841 
7842 		/* Copy IV 1 byte after the IV pointer, according to the API */
7843 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7844 		debug_hexdump(stdout, "iv:", iv_ptr,
7845 			tdata->iv.len);
7846 	} else {
7847 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7848 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7849 				aad_pad_len);
7850 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7851 				"no room to append aad");
7852 
7853 		sym_op->aead.aad.phys_addr =
7854 				rte_pktmbuf_iova(ut_params->ibuf);
7855 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7856 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7857 			tdata->aad.len);
7858 
7859 		/* Append IV at the end of the crypto operation*/
7860 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7861 				uint8_t *, IV_OFFSET);
7862 
7863 		if (tdata->iv.len == 0) {
7864 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7865 			debug_hexdump(stdout, "iv:", iv_ptr,
7866 				AES_GCM_J0_LENGTH);
7867 		} else {
7868 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7869 			debug_hexdump(stdout, "iv:", iv_ptr,
7870 				tdata->iv.len);
7871 		}
7872 	}
7873 
7874 	/* Append plaintext/ciphertext */
7875 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7876 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7877 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7878 				plaintext_pad_len);
7879 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7880 
7881 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7882 		debug_hexdump(stdout, "plaintext:", plaintext,
7883 				tdata->plaintext.len);
7884 
7885 		if (ut_params->obuf) {
7886 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7887 					ut_params->obuf,
7888 					plaintext_pad_len + aad_pad_len);
7889 			TEST_ASSERT_NOT_NULL(ciphertext,
7890 					"no room to append ciphertext");
7891 
7892 			memset(ciphertext + aad_pad_len, 0,
7893 					tdata->ciphertext.len);
7894 		}
7895 	} else {
7896 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7897 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7898 				plaintext_pad_len);
7899 		TEST_ASSERT_NOT_NULL(ciphertext,
7900 				"no room to append ciphertext");
7901 
7902 		memcpy(ciphertext, tdata->ciphertext.data,
7903 				tdata->ciphertext.len);
7904 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7905 				tdata->ciphertext.len);
7906 
7907 		if (ut_params->obuf) {
7908 			plaintext = (uint8_t *)rte_pktmbuf_append(
7909 					ut_params->obuf,
7910 					plaintext_pad_len + aad_pad_len);
7911 			TEST_ASSERT_NOT_NULL(plaintext,
7912 					"no room to append plaintext");
7913 
7914 			memset(plaintext + aad_pad_len, 0,
7915 					tdata->plaintext.len);
7916 		}
7917 	}
7918 
7919 	/* Append digest data */
7920 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7921 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7922 				ut_params->obuf ? ut_params->obuf :
7923 						ut_params->ibuf,
7924 						tdata->auth_tag.len);
7925 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7926 				"no room to append digest");
7927 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7928 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7929 				ut_params->obuf ? ut_params->obuf :
7930 						ut_params->ibuf,
7931 						plaintext_pad_len +
7932 						aad_pad_len);
7933 	} else {
7934 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7935 				ut_params->ibuf, tdata->auth_tag.len);
7936 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7937 				"no room to append digest");
7938 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7939 				ut_params->ibuf,
7940 				plaintext_pad_len + aad_pad_len);
7941 
7942 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7943 			tdata->auth_tag.len);
7944 		debug_hexdump(stdout, "digest:",
7945 			sym_op->aead.digest.data,
7946 			tdata->auth_tag.len);
7947 	}
7948 
7949 	sym_op->aead.data.length = tdata->plaintext.len;
7950 	sym_op->aead.data.offset = aad_pad_len;
7951 
7952 	return 0;
7953 }
7954 
7955 static int
7956 test_authenticated_encryption(const struct aead_test_data *tdata)
7957 {
7958 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7959 	struct crypto_unittest_params *ut_params = &unittest_params;
7960 
7961 	int retval;
7962 	uint8_t *ciphertext, *auth_tag;
7963 	uint16_t plaintext_pad_len;
7964 	uint32_t i;
7965 	struct rte_cryptodev_info dev_info;
7966 
7967 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7968 	uint64_t feat_flags = dev_info.feature_flags;
7969 
7970 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7971 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7972 		printf("Device doesn't support RAW data-path APIs.\n");
7973 		return TEST_SKIPPED;
7974 	}
7975 
7976 	/* Verify the capabilities */
7977 	struct rte_cryptodev_sym_capability_idx cap_idx;
7978 	const struct rte_cryptodev_symmetric_capability *capability;
7979 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7980 	cap_idx.algo.aead = tdata->algo;
7981 	capability = rte_cryptodev_sym_capability_get(
7982 			ts_params->valid_devs[0], &cap_idx);
7983 	if (capability == NULL)
7984 		return TEST_SKIPPED;
7985 	if (rte_cryptodev_sym_capability_check_aead(
7986 			capability, tdata->key.len, tdata->auth_tag.len,
7987 			tdata->aad.len, tdata->iv.len))
7988 		return TEST_SKIPPED;
7989 
7990 	/* Create AEAD session */
7991 	retval = create_aead_session(ts_params->valid_devs[0],
7992 			tdata->algo,
7993 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7994 			tdata->key.data, tdata->key.len,
7995 			tdata->aad.len, tdata->auth_tag.len,
7996 			tdata->iv.len);
7997 	if (retval < 0)
7998 		return retval;
7999 
8000 	if (tdata->aad.len > MBUF_SIZE) {
8001 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8002 		/* Populate full size of add data */
8003 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8004 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8005 	} else
8006 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8007 
8008 	/* clear mbuf payload */
8009 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8010 			rte_pktmbuf_tailroom(ut_params->ibuf));
8011 
8012 	/* Create AEAD operation */
8013 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8014 	if (retval < 0)
8015 		return retval;
8016 
8017 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8018 
8019 	ut_params->op->sym->m_src = ut_params->ibuf;
8020 
8021 	/* Process crypto operation */
8022 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8023 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8024 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8025 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8026 				ut_params->op, 0, 0, 0, 0);
8027 	else
8028 		TEST_ASSERT_NOT_NULL(
8029 			process_crypto_request(ts_params->valid_devs[0],
8030 			ut_params->op), "failed to process sym crypto op");
8031 
8032 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8033 			"crypto op processing failed");
8034 
8035 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8036 
8037 	if (ut_params->op->sym->m_dst) {
8038 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8039 				uint8_t *);
8040 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8041 				uint8_t *, plaintext_pad_len);
8042 	} else {
8043 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8044 				uint8_t *,
8045 				ut_params->op->sym->cipher.data.offset);
8046 		auth_tag = ciphertext + plaintext_pad_len;
8047 	}
8048 
8049 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8050 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8051 
8052 	/* Validate obuf */
8053 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8054 			ciphertext,
8055 			tdata->ciphertext.data,
8056 			tdata->ciphertext.len,
8057 			"Ciphertext data not as expected");
8058 
8059 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8060 			auth_tag,
8061 			tdata->auth_tag.data,
8062 			tdata->auth_tag.len,
8063 			"Generated auth tag not as expected");
8064 
8065 	return 0;
8066 
8067 }
8068 
8069 #ifdef RTE_LIB_SECURITY
8070 static int
8071 security_proto_supported(enum rte_security_session_action_type action,
8072 	enum rte_security_session_protocol proto)
8073 {
8074 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8075 
8076 	const struct rte_security_capability *capabilities;
8077 	const struct rte_security_capability *capability;
8078 	uint16_t i = 0;
8079 
8080 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8081 				rte_cryptodev_get_sec_ctx(
8082 				ts_params->valid_devs[0]);
8083 
8084 
8085 	capabilities = rte_security_capabilities_get(ctx);
8086 
8087 	if (capabilities == NULL)
8088 		return -ENOTSUP;
8089 
8090 	while ((capability = &capabilities[i++])->action !=
8091 			RTE_SECURITY_ACTION_TYPE_NONE) {
8092 		if (capability->action == action &&
8093 				capability->protocol == proto)
8094 			return 0;
8095 	}
8096 
8097 	return -ENOTSUP;
8098 }
8099 
8100 /* Basic algorithm run function for async inplace mode.
8101  * Creates a session from input parameters and runs one operation
8102  * on input_vec. Checks the output of the crypto operation against
8103  * output_vec.
8104  */
8105 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8106 			   enum rte_crypto_auth_operation opa,
8107 			   const uint8_t *input_vec, unsigned int input_vec_len,
8108 			   const uint8_t *output_vec,
8109 			   unsigned int output_vec_len,
8110 			   enum rte_crypto_cipher_algorithm cipher_alg,
8111 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8112 			   enum rte_crypto_auth_algorithm auth_alg,
8113 			   const uint8_t *auth_key, uint32_t auth_key_len,
8114 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8115 			   uint8_t packet_direction, uint8_t sn_size,
8116 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8117 {
8118 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8119 	struct crypto_unittest_params *ut_params = &unittest_params;
8120 	uint8_t *plaintext;
8121 	int ret = TEST_SUCCESS;
8122 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8123 				rte_cryptodev_get_sec_ctx(
8124 				ts_params->valid_devs[0]);
8125 
8126 	/* Verify the capabilities */
8127 	struct rte_security_capability_idx sec_cap_idx;
8128 
8129 	sec_cap_idx.action = ut_params->type;
8130 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8131 	sec_cap_idx.pdcp.domain = domain;
8132 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8133 		return TEST_SKIPPED;
8134 
8135 	/* Generate test mbuf data */
8136 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8137 
8138 	/* clear mbuf payload */
8139 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8140 			rte_pktmbuf_tailroom(ut_params->ibuf));
8141 
8142 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8143 						  input_vec_len);
8144 	memcpy(plaintext, input_vec, input_vec_len);
8145 
8146 	/* Out of place support */
8147 	if (oop) {
8148 		/*
8149 		 * For out-op-place we need to alloc another mbuf
8150 		 */
8151 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8152 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8153 	}
8154 
8155 	/* Setup Cipher Parameters */
8156 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8157 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8158 	ut_params->cipher_xform.cipher.op = opc;
8159 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8160 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8161 	ut_params->cipher_xform.cipher.iv.length =
8162 				packet_direction ? 4 : 0;
8163 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8164 
8165 	/* Setup HMAC Parameters if ICV header is required */
8166 	if (auth_alg != 0) {
8167 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8168 		ut_params->auth_xform.next = NULL;
8169 		ut_params->auth_xform.auth.algo = auth_alg;
8170 		ut_params->auth_xform.auth.op = opa;
8171 		ut_params->auth_xform.auth.key.data = auth_key;
8172 		ut_params->auth_xform.auth.key.length = auth_key_len;
8173 
8174 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8175 	} else {
8176 		ut_params->cipher_xform.next = NULL;
8177 	}
8178 
8179 	struct rte_security_session_conf sess_conf = {
8180 		.action_type = ut_params->type,
8181 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8182 		{.pdcp = {
8183 			.bearer = bearer,
8184 			.domain = domain,
8185 			.pkt_dir = packet_direction,
8186 			.sn_size = sn_size,
8187 			.hfn = packet_direction ? 0 : hfn,
8188 			/**
8189 			 * hfn can be set as pdcp_test_hfn[i]
8190 			 * if hfn_ovrd is not set. Here, PDCP
8191 			 * packet direction is just used to
8192 			 * run half of the cases with session
8193 			 * HFN and other half with per packet
8194 			 * HFN.
8195 			 */
8196 			.hfn_threshold = hfn_threshold,
8197 			.hfn_ovrd = packet_direction ? 1 : 0,
8198 			.sdap_enabled = sdap,
8199 		} },
8200 		.crypto_xform = &ut_params->cipher_xform
8201 	};
8202 
8203 	/* Create security session */
8204 	ut_params->sec_session = rte_security_session_create(ctx,
8205 				&sess_conf, ts_params->session_mpool,
8206 				ts_params->session_priv_mpool);
8207 
8208 	if (!ut_params->sec_session) {
8209 		printf("TestCase %s()-%d line %d failed %s: ",
8210 			__func__, i, __LINE__, "Failed to allocate session");
8211 		ret = TEST_FAILED;
8212 		goto on_err;
8213 	}
8214 
8215 	/* Generate crypto op data structure */
8216 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8217 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8218 	if (!ut_params->op) {
8219 		printf("TestCase %s()-%d line %d failed %s: ",
8220 			__func__, i, __LINE__,
8221 			"Failed to allocate symmetric crypto operation struct");
8222 		ret = TEST_FAILED;
8223 		goto on_err;
8224 	}
8225 
8226 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8227 					uint32_t *, IV_OFFSET);
8228 	*per_pkt_hfn = packet_direction ? hfn : 0;
8229 
8230 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8231 
8232 	/* set crypto operation source mbuf */
8233 	ut_params->op->sym->m_src = ut_params->ibuf;
8234 	if (oop)
8235 		ut_params->op->sym->m_dst = ut_params->obuf;
8236 
8237 	/* Process crypto operation */
8238 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8239 		== NULL) {
8240 		printf("TestCase %s()-%d line %d failed %s: ",
8241 			__func__, i, __LINE__,
8242 			"failed to process sym crypto op");
8243 		ret = TEST_FAILED;
8244 		goto on_err;
8245 	}
8246 
8247 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8248 		printf("TestCase %s()-%d line %d failed %s: ",
8249 			__func__, i, __LINE__, "crypto op processing failed");
8250 		ret = TEST_FAILED;
8251 		goto on_err;
8252 	}
8253 
8254 	/* Validate obuf */
8255 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8256 			uint8_t *);
8257 	if (oop) {
8258 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8259 				uint8_t *);
8260 	}
8261 
8262 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8263 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8264 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8265 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8266 		ret = TEST_FAILED;
8267 		goto on_err;
8268 	}
8269 
8270 on_err:
8271 	rte_crypto_op_free(ut_params->op);
8272 	ut_params->op = NULL;
8273 
8274 	if (ut_params->sec_session)
8275 		rte_security_session_destroy(ctx, ut_params->sec_session);
8276 	ut_params->sec_session = NULL;
8277 
8278 	rte_pktmbuf_free(ut_params->ibuf);
8279 	ut_params->ibuf = NULL;
8280 	if (oop) {
8281 		rte_pktmbuf_free(ut_params->obuf);
8282 		ut_params->obuf = NULL;
8283 	}
8284 
8285 	return ret;
8286 }
8287 
8288 static int
8289 test_pdcp_proto_SGL(int i, int oop,
8290 	enum rte_crypto_cipher_operation opc,
8291 	enum rte_crypto_auth_operation opa,
8292 	uint8_t *input_vec,
8293 	unsigned int input_vec_len,
8294 	uint8_t *output_vec,
8295 	unsigned int output_vec_len,
8296 	uint32_t fragsz,
8297 	uint32_t fragsz_oop)
8298 {
8299 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8300 	struct crypto_unittest_params *ut_params = &unittest_params;
8301 	uint8_t *plaintext;
8302 	struct rte_mbuf *buf, *buf_oop = NULL;
8303 	int ret = TEST_SUCCESS;
8304 	int to_trn = 0;
8305 	int to_trn_tbl[16];
8306 	int segs = 1;
8307 	unsigned int trn_data = 0;
8308 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8309 				rte_cryptodev_get_sec_ctx(
8310 				ts_params->valid_devs[0]);
8311 
8312 	/* Verify the capabilities */
8313 	struct rte_security_capability_idx sec_cap_idx;
8314 
8315 	sec_cap_idx.action = ut_params->type;
8316 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8317 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8318 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8319 		return TEST_SKIPPED;
8320 
8321 	if (fragsz > input_vec_len)
8322 		fragsz = input_vec_len;
8323 
8324 	uint16_t plaintext_len = fragsz;
8325 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8326 
8327 	if (fragsz_oop > output_vec_len)
8328 		frag_size_oop = output_vec_len;
8329 
8330 	int ecx = 0;
8331 	if (input_vec_len % fragsz != 0) {
8332 		if (input_vec_len / fragsz + 1 > 16)
8333 			return 1;
8334 	} else if (input_vec_len / fragsz > 16)
8335 		return 1;
8336 
8337 	/* Out of place support */
8338 	if (oop) {
8339 		/*
8340 		 * For out-op-place we need to alloc another mbuf
8341 		 */
8342 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8343 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8344 		buf_oop = ut_params->obuf;
8345 	}
8346 
8347 	/* Generate test mbuf data */
8348 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8349 
8350 	/* clear mbuf payload */
8351 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8352 			rte_pktmbuf_tailroom(ut_params->ibuf));
8353 
8354 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8355 						  plaintext_len);
8356 	memcpy(plaintext, input_vec, plaintext_len);
8357 	trn_data += plaintext_len;
8358 
8359 	buf = ut_params->ibuf;
8360 
8361 	/*
8362 	 * Loop until no more fragments
8363 	 */
8364 
8365 	while (trn_data < input_vec_len) {
8366 		++segs;
8367 		to_trn = (input_vec_len - trn_data < fragsz) ?
8368 				(input_vec_len - trn_data) : fragsz;
8369 
8370 		to_trn_tbl[ecx++] = to_trn;
8371 
8372 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8373 		buf = buf->next;
8374 
8375 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8376 				rte_pktmbuf_tailroom(buf));
8377 
8378 		/* OOP */
8379 		if (oop && !fragsz_oop) {
8380 			buf_oop->next =
8381 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8382 			buf_oop = buf_oop->next;
8383 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8384 					0, rte_pktmbuf_tailroom(buf_oop));
8385 			rte_pktmbuf_append(buf_oop, to_trn);
8386 		}
8387 
8388 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8389 				to_trn);
8390 
8391 		memcpy(plaintext, input_vec + trn_data, to_trn);
8392 		trn_data += to_trn;
8393 	}
8394 
8395 	ut_params->ibuf->nb_segs = segs;
8396 
8397 	segs = 1;
8398 	if (fragsz_oop && oop) {
8399 		to_trn = 0;
8400 		ecx = 0;
8401 
8402 		trn_data = frag_size_oop;
8403 		while (trn_data < output_vec_len) {
8404 			++segs;
8405 			to_trn =
8406 				(output_vec_len - trn_data <
8407 						frag_size_oop) ?
8408 				(output_vec_len - trn_data) :
8409 						frag_size_oop;
8410 
8411 			to_trn_tbl[ecx++] = to_trn;
8412 
8413 			buf_oop->next =
8414 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8415 			buf_oop = buf_oop->next;
8416 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8417 					0, rte_pktmbuf_tailroom(buf_oop));
8418 			rte_pktmbuf_append(buf_oop, to_trn);
8419 
8420 			trn_data += to_trn;
8421 		}
8422 		ut_params->obuf->nb_segs = segs;
8423 	}
8424 
8425 	/* Setup Cipher Parameters */
8426 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8427 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8428 	ut_params->cipher_xform.cipher.op = opc;
8429 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8430 	ut_params->cipher_xform.cipher.key.length =
8431 					pdcp_test_params[i].cipher_key_len;
8432 	ut_params->cipher_xform.cipher.iv.length = 0;
8433 
8434 	/* Setup HMAC Parameters if ICV header is required */
8435 	if (pdcp_test_params[i].auth_alg != 0) {
8436 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8437 		ut_params->auth_xform.next = NULL;
8438 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8439 		ut_params->auth_xform.auth.op = opa;
8440 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8441 		ut_params->auth_xform.auth.key.length =
8442 					pdcp_test_params[i].auth_key_len;
8443 
8444 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8445 	} else {
8446 		ut_params->cipher_xform.next = NULL;
8447 	}
8448 
8449 	struct rte_security_session_conf sess_conf = {
8450 		.action_type = ut_params->type,
8451 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8452 		{.pdcp = {
8453 			.bearer = pdcp_test_bearer[i],
8454 			.domain = pdcp_test_params[i].domain,
8455 			.pkt_dir = pdcp_test_packet_direction[i],
8456 			.sn_size = pdcp_test_data_sn_size[i],
8457 			.hfn = pdcp_test_hfn[i],
8458 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8459 			.hfn_ovrd = 0,
8460 		} },
8461 		.crypto_xform = &ut_params->cipher_xform
8462 	};
8463 
8464 	/* Create security session */
8465 	ut_params->sec_session = rte_security_session_create(ctx,
8466 				&sess_conf, ts_params->session_mpool,
8467 				ts_params->session_priv_mpool);
8468 
8469 	if (!ut_params->sec_session) {
8470 		printf("TestCase %s()-%d line %d failed %s: ",
8471 			__func__, i, __LINE__, "Failed to allocate session");
8472 		ret = TEST_FAILED;
8473 		goto on_err;
8474 	}
8475 
8476 	/* Generate crypto op data structure */
8477 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8478 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8479 	if (!ut_params->op) {
8480 		printf("TestCase %s()-%d line %d failed %s: ",
8481 			__func__, i, __LINE__,
8482 			"Failed to allocate symmetric crypto operation struct");
8483 		ret = TEST_FAILED;
8484 		goto on_err;
8485 	}
8486 
8487 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8488 
8489 	/* set crypto operation source mbuf */
8490 	ut_params->op->sym->m_src = ut_params->ibuf;
8491 	if (oop)
8492 		ut_params->op->sym->m_dst = ut_params->obuf;
8493 
8494 	/* Process crypto operation */
8495 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8496 		== NULL) {
8497 		printf("TestCase %s()-%d line %d failed %s: ",
8498 			__func__, i, __LINE__,
8499 			"failed to process sym crypto op");
8500 		ret = TEST_FAILED;
8501 		goto on_err;
8502 	}
8503 
8504 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8505 		printf("TestCase %s()-%d line %d failed %s: ",
8506 			__func__, i, __LINE__, "crypto op processing failed");
8507 		ret = TEST_FAILED;
8508 		goto on_err;
8509 	}
8510 
8511 	/* Validate obuf */
8512 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8513 			uint8_t *);
8514 	if (oop) {
8515 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8516 				uint8_t *);
8517 	}
8518 	if (fragsz_oop)
8519 		fragsz = frag_size_oop;
8520 	if (memcmp(ciphertext, output_vec, fragsz)) {
8521 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8522 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8523 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8524 		ret = TEST_FAILED;
8525 		goto on_err;
8526 	}
8527 
8528 	buf = ut_params->op->sym->m_src->next;
8529 	if (oop)
8530 		buf = ut_params->op->sym->m_dst->next;
8531 
8532 	unsigned int off = fragsz;
8533 
8534 	ecx = 0;
8535 	while (buf) {
8536 		ciphertext = rte_pktmbuf_mtod(buf,
8537 				uint8_t *);
8538 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8539 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8540 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8541 			rte_hexdump(stdout, "reference", output_vec + off,
8542 					to_trn_tbl[ecx]);
8543 			ret = TEST_FAILED;
8544 			goto on_err;
8545 		}
8546 		off += to_trn_tbl[ecx++];
8547 		buf = buf->next;
8548 	}
8549 on_err:
8550 	rte_crypto_op_free(ut_params->op);
8551 	ut_params->op = NULL;
8552 
8553 	if (ut_params->sec_session)
8554 		rte_security_session_destroy(ctx, ut_params->sec_session);
8555 	ut_params->sec_session = NULL;
8556 
8557 	rte_pktmbuf_free(ut_params->ibuf);
8558 	ut_params->ibuf = NULL;
8559 	if (oop) {
8560 		rte_pktmbuf_free(ut_params->obuf);
8561 		ut_params->obuf = NULL;
8562 	}
8563 
8564 	return ret;
8565 }
8566 
8567 int
8568 test_pdcp_proto_cplane_encap(int i)
8569 {
8570 	return test_pdcp_proto(
8571 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8572 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8573 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8574 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8575 		pdcp_test_params[i].cipher_key_len,
8576 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8577 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8578 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8579 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8580 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8581 }
8582 
8583 int
8584 test_pdcp_proto_uplane_encap(int i)
8585 {
8586 	return test_pdcp_proto(
8587 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8588 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8589 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8590 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8591 		pdcp_test_params[i].cipher_key_len,
8592 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8593 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8594 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8595 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8596 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8597 }
8598 
8599 int
8600 test_pdcp_proto_uplane_encap_with_int(int i)
8601 {
8602 	return test_pdcp_proto(
8603 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8604 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8605 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8606 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8607 		pdcp_test_params[i].cipher_key_len,
8608 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8609 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8610 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8611 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8612 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8613 }
8614 
8615 int
8616 test_pdcp_proto_cplane_decap(int i)
8617 {
8618 	return test_pdcp_proto(
8619 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8620 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8621 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8622 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8623 		pdcp_test_params[i].cipher_key_len,
8624 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8625 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8626 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8627 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8628 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8629 }
8630 
8631 int
8632 test_pdcp_proto_uplane_decap(int i)
8633 {
8634 	return test_pdcp_proto(
8635 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8636 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8637 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8638 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8639 		pdcp_test_params[i].cipher_key_len,
8640 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8641 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8642 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8643 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8644 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8645 }
8646 
8647 int
8648 test_pdcp_proto_uplane_decap_with_int(int i)
8649 {
8650 	return test_pdcp_proto(
8651 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8652 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8653 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8654 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8655 		pdcp_test_params[i].cipher_key_len,
8656 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8657 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8658 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8659 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8660 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8661 }
8662 
8663 static int
8664 test_PDCP_PROTO_SGL_in_place_32B(void)
8665 {
8666 	/* i can be used for running any PDCP case
8667 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8668 	 */
8669 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8670 	return test_pdcp_proto_SGL(i, IN_PLACE,
8671 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8672 			RTE_CRYPTO_AUTH_OP_GENERATE,
8673 			pdcp_test_data_in[i],
8674 			pdcp_test_data_in_len[i],
8675 			pdcp_test_data_out[i],
8676 			pdcp_test_data_in_len[i]+4,
8677 			32, 0);
8678 }
8679 static int
8680 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8681 {
8682 	/* i can be used for running any PDCP case
8683 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8684 	 */
8685 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8686 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8687 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8688 			RTE_CRYPTO_AUTH_OP_GENERATE,
8689 			pdcp_test_data_in[i],
8690 			pdcp_test_data_in_len[i],
8691 			pdcp_test_data_out[i],
8692 			pdcp_test_data_in_len[i]+4,
8693 			32, 128);
8694 }
8695 static int
8696 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8697 {
8698 	/* i can be used for running any PDCP case
8699 	 * In this case it is uplane 18-bit AES DL encap
8700 	 */
8701 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8702 			+ DOWNLINK;
8703 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8704 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8705 			RTE_CRYPTO_AUTH_OP_GENERATE,
8706 			pdcp_test_data_in[i],
8707 			pdcp_test_data_in_len[i],
8708 			pdcp_test_data_out[i],
8709 			pdcp_test_data_in_len[i],
8710 			32, 40);
8711 }
8712 static int
8713 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8714 {
8715 	/* i can be used for running any PDCP case
8716 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8717 	 */
8718 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8719 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8720 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8721 			RTE_CRYPTO_AUTH_OP_GENERATE,
8722 			pdcp_test_data_in[i],
8723 			pdcp_test_data_in_len[i],
8724 			pdcp_test_data_out[i],
8725 			pdcp_test_data_in_len[i]+4,
8726 			128, 32);
8727 }
8728 
8729 static int
8730 test_PDCP_SDAP_PROTO_encap_all(void)
8731 {
8732 	int i = 0, size = 0;
8733 	int err, all_err = TEST_SUCCESS;
8734 	const struct pdcp_sdap_test *cur_test;
8735 
8736 	size = RTE_DIM(list_pdcp_sdap_tests);
8737 
8738 	for (i = 0; i < size; i++) {
8739 		cur_test = &list_pdcp_sdap_tests[i];
8740 		err = test_pdcp_proto(
8741 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8742 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8743 			cur_test->in_len, cur_test->data_out,
8744 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8745 			cur_test->param.cipher_alg, cur_test->cipher_key,
8746 			cur_test->param.cipher_key_len,
8747 			cur_test->param.auth_alg,
8748 			cur_test->auth_key, cur_test->param.auth_key_len,
8749 			cur_test->bearer, cur_test->param.domain,
8750 			cur_test->packet_direction, cur_test->sn_size,
8751 			cur_test->hfn,
8752 			cur_test->hfn_threshold, SDAP_ENABLED);
8753 		if (err) {
8754 			printf("\t%d) %s: Encapsulation failed\n",
8755 					cur_test->test_idx,
8756 					cur_test->param.name);
8757 			err = TEST_FAILED;
8758 		} else {
8759 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8760 					cur_test->param.name);
8761 			err = TEST_SUCCESS;
8762 		}
8763 		all_err += err;
8764 	}
8765 
8766 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8767 
8768 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8769 }
8770 
8771 static int
8772 test_PDCP_SDAP_PROTO_decap_all(void)
8773 {
8774 	int i = 0, size = 0;
8775 	int err, all_err = TEST_SUCCESS;
8776 	const struct pdcp_sdap_test *cur_test;
8777 
8778 	size = RTE_DIM(list_pdcp_sdap_tests);
8779 
8780 	for (i = 0; i < size; i++) {
8781 		cur_test = &list_pdcp_sdap_tests[i];
8782 		err = test_pdcp_proto(
8783 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8784 			RTE_CRYPTO_AUTH_OP_VERIFY,
8785 			cur_test->data_out,
8786 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8787 			cur_test->data_in, cur_test->in_len,
8788 			cur_test->param.cipher_alg,
8789 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8790 			cur_test->param.auth_alg, cur_test->auth_key,
8791 			cur_test->param.auth_key_len, cur_test->bearer,
8792 			cur_test->param.domain, cur_test->packet_direction,
8793 			cur_test->sn_size, cur_test->hfn,
8794 			cur_test->hfn_threshold, SDAP_ENABLED);
8795 		if (err) {
8796 			printf("\t%d) %s: Decapsulation failed\n",
8797 					cur_test->test_idx,
8798 					cur_test->param.name);
8799 			err = TEST_FAILED;
8800 		} else {
8801 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8802 					cur_test->param.name);
8803 			err = TEST_SUCCESS;
8804 		}
8805 		all_err += err;
8806 	}
8807 
8808 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8809 
8810 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8811 }
8812 
8813 static int
8814 test_PDCP_PROTO_all(void)
8815 {
8816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8817 	struct crypto_unittest_params *ut_params = &unittest_params;
8818 	struct rte_cryptodev_info dev_info;
8819 	int status;
8820 
8821 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8822 	uint64_t feat_flags = dev_info.feature_flags;
8823 
8824 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8825 		return TEST_SKIPPED;
8826 
8827 	/* Set action type */
8828 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8829 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8830 		gbl_action_type;
8831 
8832 	if (security_proto_supported(ut_params->type,
8833 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
8834 		return TEST_SKIPPED;
8835 
8836 	status = test_PDCP_PROTO_cplane_encap_all();
8837 	status += test_PDCP_PROTO_cplane_decap_all();
8838 	status += test_PDCP_PROTO_uplane_encap_all();
8839 	status += test_PDCP_PROTO_uplane_decap_all();
8840 	status += test_PDCP_PROTO_SGL_in_place_32B();
8841 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
8842 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
8843 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
8844 	status += test_PDCP_SDAP_PROTO_encap_all();
8845 	status += test_PDCP_SDAP_PROTO_decap_all();
8846 
8847 	if (status)
8848 		return TEST_FAILED;
8849 	else
8850 		return TEST_SUCCESS;
8851 }
8852 
8853 static int
8854 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8855 {
8856 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8857 	struct crypto_unittest_params *ut_params = &unittest_params;
8858 	uint8_t *plaintext, *ciphertext;
8859 	uint8_t *iv_ptr;
8860 	int32_t cipher_len, crc_len;
8861 	uint32_t crc_data_len;
8862 	int ret = TEST_SUCCESS;
8863 
8864 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8865 					rte_cryptodev_get_sec_ctx(
8866 						ts_params->valid_devs[0]);
8867 
8868 	/* Verify the capabilities */
8869 	struct rte_security_capability_idx sec_cap_idx;
8870 	const struct rte_security_capability *sec_cap;
8871 	const struct rte_cryptodev_capabilities *crypto_cap;
8872 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8873 	int j = 0;
8874 
8875 	sec_cap_idx.action = ut_params->type;
8876 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8877 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8878 
8879 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8880 	if (sec_cap == NULL)
8881 		return TEST_SKIPPED;
8882 
8883 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8884 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8885 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8886 				crypto_cap->sym.xform_type ==
8887 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8888 				crypto_cap->sym.cipher.algo ==
8889 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8890 			sym_cap = &crypto_cap->sym;
8891 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8892 						d_td->key.len,
8893 						d_td->iv.len) == 0)
8894 				break;
8895 		}
8896 	}
8897 
8898 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8899 		return TEST_SKIPPED;
8900 
8901 	/* Setup source mbuf payload */
8902 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8903 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8904 			rte_pktmbuf_tailroom(ut_params->ibuf));
8905 
8906 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8907 			d_td->ciphertext.len);
8908 
8909 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8910 
8911 	/* Setup cipher session parameters */
8912 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8913 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8914 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8915 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8916 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8917 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8918 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8919 	ut_params->cipher_xform.next = NULL;
8920 
8921 	/* Setup DOCSIS session parameters */
8922 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8923 
8924 	struct rte_security_session_conf sess_conf = {
8925 		.action_type = ut_params->type,
8926 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8927 		.docsis = ut_params->docsis_xform,
8928 		.crypto_xform = &ut_params->cipher_xform,
8929 	};
8930 
8931 	/* Create security session */
8932 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8933 					ts_params->session_mpool,
8934 					ts_params->session_priv_mpool);
8935 
8936 	if (!ut_params->sec_session) {
8937 		printf("TestCase %s(%d) line %d: %s\n",
8938 			__func__, i, __LINE__, "failed to allocate session");
8939 		ret = TEST_FAILED;
8940 		goto on_err;
8941 	}
8942 
8943 	/* Generate crypto op data structure */
8944 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8945 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8946 	if (!ut_params->op) {
8947 		printf("TestCase %s(%d) line %d: %s\n",
8948 			__func__, i, __LINE__,
8949 			"failed to allocate symmetric crypto operation");
8950 		ret = TEST_FAILED;
8951 		goto on_err;
8952 	}
8953 
8954 	/* Setup CRC operation parameters */
8955 	crc_len = d_td->ciphertext.no_crc == false ?
8956 			(d_td->ciphertext.len -
8957 				d_td->ciphertext.crc_offset -
8958 				RTE_ETHER_CRC_LEN) :
8959 			0;
8960 	crc_len = crc_len > 0 ? crc_len : 0;
8961 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8962 	ut_params->op->sym->auth.data.length = crc_len;
8963 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8964 
8965 	/* Setup cipher operation parameters */
8966 	cipher_len = d_td->ciphertext.no_cipher == false ?
8967 			(d_td->ciphertext.len -
8968 				d_td->ciphertext.cipher_offset) :
8969 			0;
8970 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8971 	ut_params->op->sym->cipher.data.length = cipher_len;
8972 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8973 
8974 	/* Setup cipher IV */
8975 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8976 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8977 
8978 	/* Attach session to operation */
8979 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8980 
8981 	/* Set crypto operation mbufs */
8982 	ut_params->op->sym->m_src = ut_params->ibuf;
8983 	ut_params->op->sym->m_dst = NULL;
8984 
8985 	/* Process crypto operation */
8986 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8987 			NULL) {
8988 		printf("TestCase %s(%d) line %d: %s\n",
8989 			__func__, i, __LINE__,
8990 			"failed to process security crypto op");
8991 		ret = TEST_FAILED;
8992 		goto on_err;
8993 	}
8994 
8995 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8996 		printf("TestCase %s(%d) line %d: %s\n",
8997 			__func__, i, __LINE__, "crypto op processing failed");
8998 		ret = TEST_FAILED;
8999 		goto on_err;
9000 	}
9001 
9002 	/* Validate plaintext */
9003 	plaintext = ciphertext;
9004 
9005 	if (memcmp(plaintext, d_td->plaintext.data,
9006 			d_td->plaintext.len - crc_data_len)) {
9007 		printf("TestCase %s(%d) line %d: %s\n",
9008 			__func__, i, __LINE__, "plaintext not as expected\n");
9009 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
9010 				d_td->plaintext.len);
9011 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
9012 		ret = TEST_FAILED;
9013 		goto on_err;
9014 	}
9015 
9016 on_err:
9017 	rte_crypto_op_free(ut_params->op);
9018 	ut_params->op = NULL;
9019 
9020 	if (ut_params->sec_session)
9021 		rte_security_session_destroy(ctx, ut_params->sec_session);
9022 	ut_params->sec_session = NULL;
9023 
9024 	rte_pktmbuf_free(ut_params->ibuf);
9025 	ut_params->ibuf = NULL;
9026 
9027 	return ret;
9028 }
9029 
9030 static int
9031 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
9032 {
9033 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9034 	struct crypto_unittest_params *ut_params = &unittest_params;
9035 	uint8_t *plaintext, *ciphertext;
9036 	uint8_t *iv_ptr;
9037 	int32_t cipher_len, crc_len;
9038 	int ret = TEST_SUCCESS;
9039 
9040 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
9041 					rte_cryptodev_get_sec_ctx(
9042 						ts_params->valid_devs[0]);
9043 
9044 	/* Verify the capabilities */
9045 	struct rte_security_capability_idx sec_cap_idx;
9046 	const struct rte_security_capability *sec_cap;
9047 	const struct rte_cryptodev_capabilities *crypto_cap;
9048 	const struct rte_cryptodev_symmetric_capability *sym_cap;
9049 	int j = 0;
9050 
9051 	sec_cap_idx.action = ut_params->type;
9052 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
9053 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9054 
9055 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9056 	if (sec_cap == NULL)
9057 		return TEST_SKIPPED;
9058 
9059 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
9060 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
9061 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
9062 				crypto_cap->sym.xform_type ==
9063 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
9064 				crypto_cap->sym.cipher.algo ==
9065 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
9066 			sym_cap = &crypto_cap->sym;
9067 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
9068 						d_td->key.len,
9069 						d_td->iv.len) == 0)
9070 				break;
9071 		}
9072 	}
9073 
9074 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
9075 		return TEST_SKIPPED;
9076 
9077 	/* Setup source mbuf payload */
9078 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9079 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9080 			rte_pktmbuf_tailroom(ut_params->ibuf));
9081 
9082 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9083 			d_td->plaintext.len);
9084 
9085 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
9086 
9087 	/* Setup cipher session parameters */
9088 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
9089 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
9090 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
9091 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
9092 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
9093 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
9094 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9095 	ut_params->cipher_xform.next = NULL;
9096 
9097 	/* Setup DOCSIS session parameters */
9098 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
9099 
9100 	struct rte_security_session_conf sess_conf = {
9101 		.action_type = ut_params->type,
9102 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
9103 		.docsis = ut_params->docsis_xform,
9104 		.crypto_xform = &ut_params->cipher_xform,
9105 	};
9106 
9107 	/* Create security session */
9108 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9109 					ts_params->session_mpool,
9110 					ts_params->session_priv_mpool);
9111 
9112 	if (!ut_params->sec_session) {
9113 		printf("TestCase %s(%d) line %d: %s\n",
9114 			__func__, i, __LINE__, "failed to allocate session");
9115 		ret = TEST_FAILED;
9116 		goto on_err;
9117 	}
9118 
9119 	/* Generate crypto op data structure */
9120 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9121 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9122 	if (!ut_params->op) {
9123 		printf("TestCase %s(%d) line %d: %s\n",
9124 			__func__, i, __LINE__,
9125 			"failed to allocate security crypto operation");
9126 		ret = TEST_FAILED;
9127 		goto on_err;
9128 	}
9129 
9130 	/* Setup CRC operation parameters */
9131 	crc_len = d_td->plaintext.no_crc == false ?
9132 			(d_td->plaintext.len -
9133 				d_td->plaintext.crc_offset -
9134 				RTE_ETHER_CRC_LEN) :
9135 			0;
9136 	crc_len = crc_len > 0 ? crc_len : 0;
9137 	ut_params->op->sym->auth.data.length = crc_len;
9138 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
9139 
9140 	/* Setup cipher operation parameters */
9141 	cipher_len = d_td->plaintext.no_cipher == false ?
9142 			(d_td->plaintext.len -
9143 				d_td->plaintext.cipher_offset) :
9144 			0;
9145 	cipher_len = cipher_len > 0 ? cipher_len : 0;
9146 	ut_params->op->sym->cipher.data.length = cipher_len;
9147 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
9148 
9149 	/* Setup cipher IV */
9150 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
9151 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
9152 
9153 	/* Attach session to operation */
9154 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
9155 
9156 	/* Set crypto operation mbufs */
9157 	ut_params->op->sym->m_src = ut_params->ibuf;
9158 	ut_params->op->sym->m_dst = NULL;
9159 
9160 	/* Process crypto operation */
9161 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
9162 			NULL) {
9163 		printf("TestCase %s(%d) line %d: %s\n",
9164 			__func__, i, __LINE__,
9165 			"failed to process security crypto op");
9166 		ret = TEST_FAILED;
9167 		goto on_err;
9168 	}
9169 
9170 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
9171 		printf("TestCase %s(%d) line %d: %s\n",
9172 			__func__, i, __LINE__, "crypto op processing failed");
9173 		ret = TEST_FAILED;
9174 		goto on_err;
9175 	}
9176 
9177 	/* Validate ciphertext */
9178 	ciphertext = plaintext;
9179 
9180 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
9181 		printf("TestCase %s(%d) line %d: %s\n",
9182 			__func__, i, __LINE__, "ciphertext not as expected\n");
9183 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
9184 				d_td->ciphertext.len);
9185 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
9186 		ret = TEST_FAILED;
9187 		goto on_err;
9188 	}
9189 
9190 on_err:
9191 	rte_crypto_op_free(ut_params->op);
9192 	ut_params->op = NULL;
9193 
9194 	if (ut_params->sec_session)
9195 		rte_security_session_destroy(ctx, ut_params->sec_session);
9196 	ut_params->sec_session = NULL;
9197 
9198 	rte_pktmbuf_free(ut_params->ibuf);
9199 	ut_params->ibuf = NULL;
9200 
9201 	return ret;
9202 }
9203 
9204 #define TEST_DOCSIS_COUNT(func) do {			\
9205 	int ret = func;					\
9206 	if (ret == TEST_SUCCESS)  {			\
9207 		printf("\t%2d)", n++);			\
9208 		printf("+++++ PASSED:" #func"\n");	\
9209 		p++;					\
9210 	} else if (ret == TEST_SKIPPED) {		\
9211 		printf("\t%2d)", n++);			\
9212 		printf("~~~~~ SKIPPED:" #func"\n");	\
9213 		s++;					\
9214 	} else {					\
9215 		printf("\t%2d)", n++);			\
9216 		printf("----- FAILED:" #func"\n");	\
9217 		f++;					\
9218 	}						\
9219 } while (0)
9220 
9221 static int
9222 test_DOCSIS_PROTO_uplink_all(void)
9223 {
9224 	int p = 0, s = 0, f = 0, n = 0;
9225 
9226 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
9227 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
9228 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
9229 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
9230 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
9231 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
9232 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
9233 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
9234 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
9235 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
9236 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
9237 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
9238 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
9239 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
9240 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
9241 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
9242 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
9243 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
9244 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
9245 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
9246 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
9247 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
9248 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
9249 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
9250 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
9251 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
9252 
9253 	if (f)
9254 		printf("## %s: %d passed out of %d (%d skipped)\n",
9255 			__func__, p, n, s);
9256 
9257 	return f;
9258 };
9259 
9260 static int
9261 test_DOCSIS_PROTO_downlink_all(void)
9262 {
9263 	int p = 0, s = 0, f = 0, n = 0;
9264 
9265 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
9266 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
9267 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
9268 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
9269 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
9270 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
9271 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
9272 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
9273 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
9274 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
9275 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
9276 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
9277 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
9278 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
9279 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
9280 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
9281 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
9282 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
9283 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
9284 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
9285 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
9286 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
9287 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
9288 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
9289 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
9290 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
9291 
9292 	if (f)
9293 		printf("## %s: %d passed out of %d (%d skipped)\n",
9294 			__func__, p, n, s);
9295 
9296 	return f;
9297 };
9298 
9299 static int
9300 test_DOCSIS_PROTO_all(void)
9301 {
9302 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9303 	struct crypto_unittest_params *ut_params = &unittest_params;
9304 	struct rte_cryptodev_info dev_info;
9305 	int status;
9306 
9307 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9308 	uint64_t feat_flags = dev_info.feature_flags;
9309 
9310 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
9311 		return TEST_SKIPPED;
9312 
9313 	/* Set action type */
9314 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
9315 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
9316 		gbl_action_type;
9317 
9318 	if (security_proto_supported(ut_params->type,
9319 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
9320 		return TEST_SKIPPED;
9321 
9322 	status = test_DOCSIS_PROTO_uplink_all();
9323 	status += test_DOCSIS_PROTO_downlink_all();
9324 
9325 	if (status)
9326 		return TEST_FAILED;
9327 	else
9328 		return TEST_SUCCESS;
9329 }
9330 #endif
9331 
9332 static int
9333 test_AES_GCM_authenticated_encryption_test_case_1(void)
9334 {
9335 	return test_authenticated_encryption(&gcm_test_case_1);
9336 }
9337 
9338 static int
9339 test_AES_GCM_authenticated_encryption_test_case_2(void)
9340 {
9341 	return test_authenticated_encryption(&gcm_test_case_2);
9342 }
9343 
9344 static int
9345 test_AES_GCM_authenticated_encryption_test_case_3(void)
9346 {
9347 	return test_authenticated_encryption(&gcm_test_case_3);
9348 }
9349 
9350 static int
9351 test_AES_GCM_authenticated_encryption_test_case_4(void)
9352 {
9353 	return test_authenticated_encryption(&gcm_test_case_4);
9354 }
9355 
9356 static int
9357 test_AES_GCM_authenticated_encryption_test_case_5(void)
9358 {
9359 	return test_authenticated_encryption(&gcm_test_case_5);
9360 }
9361 
9362 static int
9363 test_AES_GCM_authenticated_encryption_test_case_6(void)
9364 {
9365 	return test_authenticated_encryption(&gcm_test_case_6);
9366 }
9367 
9368 static int
9369 test_AES_GCM_authenticated_encryption_test_case_7(void)
9370 {
9371 	return test_authenticated_encryption(&gcm_test_case_7);
9372 }
9373 
9374 static int
9375 test_AES_GCM_authenticated_encryption_test_case_8(void)
9376 {
9377 	return test_authenticated_encryption(&gcm_test_case_8);
9378 }
9379 
9380 static int
9381 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9382 {
9383 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9384 }
9385 
9386 static int
9387 test_AES_GCM_auth_encryption_test_case_192_1(void)
9388 {
9389 	return test_authenticated_encryption(&gcm_test_case_192_1);
9390 }
9391 
9392 static int
9393 test_AES_GCM_auth_encryption_test_case_192_2(void)
9394 {
9395 	return test_authenticated_encryption(&gcm_test_case_192_2);
9396 }
9397 
9398 static int
9399 test_AES_GCM_auth_encryption_test_case_192_3(void)
9400 {
9401 	return test_authenticated_encryption(&gcm_test_case_192_3);
9402 }
9403 
9404 static int
9405 test_AES_GCM_auth_encryption_test_case_192_4(void)
9406 {
9407 	return test_authenticated_encryption(&gcm_test_case_192_4);
9408 }
9409 
9410 static int
9411 test_AES_GCM_auth_encryption_test_case_192_5(void)
9412 {
9413 	return test_authenticated_encryption(&gcm_test_case_192_5);
9414 }
9415 
9416 static int
9417 test_AES_GCM_auth_encryption_test_case_192_6(void)
9418 {
9419 	return test_authenticated_encryption(&gcm_test_case_192_6);
9420 }
9421 
9422 static int
9423 test_AES_GCM_auth_encryption_test_case_192_7(void)
9424 {
9425 	return test_authenticated_encryption(&gcm_test_case_192_7);
9426 }
9427 
9428 static int
9429 test_AES_GCM_auth_encryption_test_case_256_1(void)
9430 {
9431 	return test_authenticated_encryption(&gcm_test_case_256_1);
9432 }
9433 
9434 static int
9435 test_AES_GCM_auth_encryption_test_case_256_2(void)
9436 {
9437 	return test_authenticated_encryption(&gcm_test_case_256_2);
9438 }
9439 
9440 static int
9441 test_AES_GCM_auth_encryption_test_case_256_3(void)
9442 {
9443 	return test_authenticated_encryption(&gcm_test_case_256_3);
9444 }
9445 
9446 static int
9447 test_AES_GCM_auth_encryption_test_case_256_4(void)
9448 {
9449 	return test_authenticated_encryption(&gcm_test_case_256_4);
9450 }
9451 
9452 static int
9453 test_AES_GCM_auth_encryption_test_case_256_5(void)
9454 {
9455 	return test_authenticated_encryption(&gcm_test_case_256_5);
9456 }
9457 
9458 static int
9459 test_AES_GCM_auth_encryption_test_case_256_6(void)
9460 {
9461 	return test_authenticated_encryption(&gcm_test_case_256_6);
9462 }
9463 
9464 static int
9465 test_AES_GCM_auth_encryption_test_case_256_7(void)
9466 {
9467 	return test_authenticated_encryption(&gcm_test_case_256_7);
9468 }
9469 
9470 static int
9471 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9472 {
9473 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9474 }
9475 
9476 static int
9477 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9478 {
9479 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9480 }
9481 
9482 static int
9483 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9484 {
9485 	struct aead_test_data tdata;
9486 	int res;
9487 
9488 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9489 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9490 	tdata.iv.data[0] += 1;
9491 	res = test_authenticated_encryption(&tdata);
9492 	if (res == TEST_SKIPPED)
9493 		return res;
9494 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9495 	return TEST_SUCCESS;
9496 }
9497 
9498 static int
9499 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9500 {
9501 	struct aead_test_data tdata;
9502 	int res;
9503 
9504 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9505 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9506 	tdata.plaintext.data[0] += 1;
9507 	res = test_authenticated_encryption(&tdata);
9508 	if (res == TEST_SKIPPED)
9509 		return res;
9510 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9511 	return TEST_SUCCESS;
9512 }
9513 
9514 static int
9515 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9516 {
9517 	struct aead_test_data tdata;
9518 	int res;
9519 
9520 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9521 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9522 	tdata.ciphertext.data[0] += 1;
9523 	res = test_authenticated_encryption(&tdata);
9524 	if (res == TEST_SKIPPED)
9525 		return res;
9526 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9527 	return TEST_SUCCESS;
9528 }
9529 
9530 static int
9531 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9532 {
9533 	struct aead_test_data tdata;
9534 	int res;
9535 
9536 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9537 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9538 	tdata.aad.len += 1;
9539 	res = test_authenticated_encryption(&tdata);
9540 	if (res == TEST_SKIPPED)
9541 		return res;
9542 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9543 	return TEST_SUCCESS;
9544 }
9545 
9546 static int
9547 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9548 {
9549 	struct aead_test_data tdata;
9550 	uint8_t aad[gcm_test_case_7.aad.len];
9551 	int res;
9552 
9553 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9554 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9555 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9556 	aad[0] += 1;
9557 	tdata.aad.data = aad;
9558 	res = test_authenticated_encryption(&tdata);
9559 	if (res == TEST_SKIPPED)
9560 		return res;
9561 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9562 	return TEST_SUCCESS;
9563 }
9564 
9565 static int
9566 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9567 {
9568 	struct aead_test_data tdata;
9569 	int res;
9570 
9571 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9572 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9573 	tdata.auth_tag.data[0] += 1;
9574 	res = test_authenticated_encryption(&tdata);
9575 	if (res == TEST_SKIPPED)
9576 		return res;
9577 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9578 	return TEST_SUCCESS;
9579 }
9580 
9581 static int
9582 test_authenticated_decryption(const struct aead_test_data *tdata)
9583 {
9584 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9585 	struct crypto_unittest_params *ut_params = &unittest_params;
9586 
9587 	int retval;
9588 	uint8_t *plaintext;
9589 	uint32_t i;
9590 	struct rte_cryptodev_info dev_info;
9591 
9592 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9593 	uint64_t feat_flags = dev_info.feature_flags;
9594 
9595 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9596 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9597 		printf("Device doesn't support RAW data-path APIs.\n");
9598 		return TEST_SKIPPED;
9599 	}
9600 
9601 	/* Verify the capabilities */
9602 	struct rte_cryptodev_sym_capability_idx cap_idx;
9603 	const struct rte_cryptodev_symmetric_capability *capability;
9604 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9605 	cap_idx.algo.aead = tdata->algo;
9606 	capability = rte_cryptodev_sym_capability_get(
9607 			ts_params->valid_devs[0], &cap_idx);
9608 	if (capability == NULL)
9609 		return TEST_SKIPPED;
9610 	if (rte_cryptodev_sym_capability_check_aead(
9611 			capability, tdata->key.len, tdata->auth_tag.len,
9612 			tdata->aad.len, tdata->iv.len))
9613 		return TEST_SKIPPED;
9614 
9615 	/* Create AEAD session */
9616 	retval = create_aead_session(ts_params->valid_devs[0],
9617 			tdata->algo,
9618 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9619 			tdata->key.data, tdata->key.len,
9620 			tdata->aad.len, tdata->auth_tag.len,
9621 			tdata->iv.len);
9622 	if (retval < 0)
9623 		return retval;
9624 
9625 	/* alloc mbuf and set payload */
9626 	if (tdata->aad.len > MBUF_SIZE) {
9627 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9628 		/* Populate full size of add data */
9629 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9630 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9631 	} else
9632 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9633 
9634 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9635 			rte_pktmbuf_tailroom(ut_params->ibuf));
9636 
9637 	/* Create AEAD operation */
9638 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9639 	if (retval < 0)
9640 		return retval;
9641 
9642 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9643 
9644 	ut_params->op->sym->m_src = ut_params->ibuf;
9645 
9646 	/* Process crypto operation */
9647 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9648 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9649 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9650 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9651 				ut_params->op, 0, 0, 0, 0);
9652 	else
9653 		TEST_ASSERT_NOT_NULL(
9654 			process_crypto_request(ts_params->valid_devs[0],
9655 			ut_params->op), "failed to process sym crypto op");
9656 
9657 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9658 			"crypto op processing failed");
9659 
9660 	if (ut_params->op->sym->m_dst)
9661 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9662 				uint8_t *);
9663 	else
9664 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9665 				uint8_t *,
9666 				ut_params->op->sym->cipher.data.offset);
9667 
9668 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9669 
9670 	/* Validate obuf */
9671 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9672 			plaintext,
9673 			tdata->plaintext.data,
9674 			tdata->plaintext.len,
9675 			"Plaintext data not as expected");
9676 
9677 	TEST_ASSERT_EQUAL(ut_params->op->status,
9678 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9679 			"Authentication failed");
9680 
9681 	return 0;
9682 }
9683 
9684 static int
9685 test_AES_GCM_authenticated_decryption_test_case_1(void)
9686 {
9687 	return test_authenticated_decryption(&gcm_test_case_1);
9688 }
9689 
9690 static int
9691 test_AES_GCM_authenticated_decryption_test_case_2(void)
9692 {
9693 	return test_authenticated_decryption(&gcm_test_case_2);
9694 }
9695 
9696 static int
9697 test_AES_GCM_authenticated_decryption_test_case_3(void)
9698 {
9699 	return test_authenticated_decryption(&gcm_test_case_3);
9700 }
9701 
9702 static int
9703 test_AES_GCM_authenticated_decryption_test_case_4(void)
9704 {
9705 	return test_authenticated_decryption(&gcm_test_case_4);
9706 }
9707 
9708 static int
9709 test_AES_GCM_authenticated_decryption_test_case_5(void)
9710 {
9711 	return test_authenticated_decryption(&gcm_test_case_5);
9712 }
9713 
9714 static int
9715 test_AES_GCM_authenticated_decryption_test_case_6(void)
9716 {
9717 	return test_authenticated_decryption(&gcm_test_case_6);
9718 }
9719 
9720 static int
9721 test_AES_GCM_authenticated_decryption_test_case_7(void)
9722 {
9723 	return test_authenticated_decryption(&gcm_test_case_7);
9724 }
9725 
9726 static int
9727 test_AES_GCM_authenticated_decryption_test_case_8(void)
9728 {
9729 	return test_authenticated_decryption(&gcm_test_case_8);
9730 }
9731 
9732 static int
9733 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9734 {
9735 	return test_authenticated_decryption(&gcm_J0_test_case_1);
9736 }
9737 
9738 static int
9739 test_AES_GCM_auth_decryption_test_case_192_1(void)
9740 {
9741 	return test_authenticated_decryption(&gcm_test_case_192_1);
9742 }
9743 
9744 static int
9745 test_AES_GCM_auth_decryption_test_case_192_2(void)
9746 {
9747 	return test_authenticated_decryption(&gcm_test_case_192_2);
9748 }
9749 
9750 static int
9751 test_AES_GCM_auth_decryption_test_case_192_3(void)
9752 {
9753 	return test_authenticated_decryption(&gcm_test_case_192_3);
9754 }
9755 
9756 static int
9757 test_AES_GCM_auth_decryption_test_case_192_4(void)
9758 {
9759 	return test_authenticated_decryption(&gcm_test_case_192_4);
9760 }
9761 
9762 static int
9763 test_AES_GCM_auth_decryption_test_case_192_5(void)
9764 {
9765 	return test_authenticated_decryption(&gcm_test_case_192_5);
9766 }
9767 
9768 static int
9769 test_AES_GCM_auth_decryption_test_case_192_6(void)
9770 {
9771 	return test_authenticated_decryption(&gcm_test_case_192_6);
9772 }
9773 
9774 static int
9775 test_AES_GCM_auth_decryption_test_case_192_7(void)
9776 {
9777 	return test_authenticated_decryption(&gcm_test_case_192_7);
9778 }
9779 
9780 static int
9781 test_AES_GCM_auth_decryption_test_case_256_1(void)
9782 {
9783 	return test_authenticated_decryption(&gcm_test_case_256_1);
9784 }
9785 
9786 static int
9787 test_AES_GCM_auth_decryption_test_case_256_2(void)
9788 {
9789 	return test_authenticated_decryption(&gcm_test_case_256_2);
9790 }
9791 
9792 static int
9793 test_AES_GCM_auth_decryption_test_case_256_3(void)
9794 {
9795 	return test_authenticated_decryption(&gcm_test_case_256_3);
9796 }
9797 
9798 static int
9799 test_AES_GCM_auth_decryption_test_case_256_4(void)
9800 {
9801 	return test_authenticated_decryption(&gcm_test_case_256_4);
9802 }
9803 
9804 static int
9805 test_AES_GCM_auth_decryption_test_case_256_5(void)
9806 {
9807 	return test_authenticated_decryption(&gcm_test_case_256_5);
9808 }
9809 
9810 static int
9811 test_AES_GCM_auth_decryption_test_case_256_6(void)
9812 {
9813 	return test_authenticated_decryption(&gcm_test_case_256_6);
9814 }
9815 
9816 static int
9817 test_AES_GCM_auth_decryption_test_case_256_7(void)
9818 {
9819 	return test_authenticated_decryption(&gcm_test_case_256_7);
9820 }
9821 
9822 static int
9823 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9824 {
9825 	return test_authenticated_decryption(&gcm_test_case_aad_1);
9826 }
9827 
9828 static int
9829 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9830 {
9831 	return test_authenticated_decryption(&gcm_test_case_aad_2);
9832 }
9833 
9834 static int
9835 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9836 {
9837 	struct aead_test_data tdata;
9838 	int res;
9839 
9840 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9841 	tdata.iv.data[0] += 1;
9842 	res = test_authenticated_decryption(&tdata);
9843 	if (res == TEST_SKIPPED)
9844 		return res;
9845 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9846 	return TEST_SUCCESS;
9847 }
9848 
9849 static int
9850 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9851 {
9852 	struct aead_test_data tdata;
9853 	int res;
9854 
9855 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9856 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9857 	tdata.plaintext.data[0] += 1;
9858 	res = test_authenticated_decryption(&tdata);
9859 	if (res == TEST_SKIPPED)
9860 		return res;
9861 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9862 	return TEST_SUCCESS;
9863 }
9864 
9865 static int
9866 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9867 {
9868 	struct aead_test_data tdata;
9869 	int res;
9870 
9871 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9872 	tdata.ciphertext.data[0] += 1;
9873 	res = test_authenticated_decryption(&tdata);
9874 	if (res == TEST_SKIPPED)
9875 		return res;
9876 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9877 	return TEST_SUCCESS;
9878 }
9879 
9880 static int
9881 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9882 {
9883 	struct aead_test_data tdata;
9884 	int res;
9885 
9886 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9887 	tdata.aad.len += 1;
9888 	res = test_authenticated_decryption(&tdata);
9889 	if (res == TEST_SKIPPED)
9890 		return res;
9891 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9892 	return TEST_SUCCESS;
9893 }
9894 
9895 static int
9896 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9897 {
9898 	struct aead_test_data tdata;
9899 	uint8_t aad[gcm_test_case_7.aad.len];
9900 	int res;
9901 
9902 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9903 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9904 	aad[0] += 1;
9905 	tdata.aad.data = aad;
9906 	res = test_authenticated_decryption(&tdata);
9907 	if (res == TEST_SKIPPED)
9908 		return res;
9909 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9910 	return TEST_SUCCESS;
9911 }
9912 
9913 static int
9914 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9915 {
9916 	struct aead_test_data tdata;
9917 	int res;
9918 
9919 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9920 	tdata.auth_tag.data[0] += 1;
9921 	res = test_authenticated_decryption(&tdata);
9922 	if (res == TEST_SKIPPED)
9923 		return res;
9924 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9925 	return TEST_SUCCESS;
9926 }
9927 
9928 static int
9929 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9930 {
9931 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9932 	struct crypto_unittest_params *ut_params = &unittest_params;
9933 
9934 	int retval;
9935 	uint8_t *ciphertext, *auth_tag;
9936 	uint16_t plaintext_pad_len;
9937 
9938 	/* Verify the capabilities */
9939 	struct rte_cryptodev_sym_capability_idx cap_idx;
9940 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9941 	cap_idx.algo.aead = tdata->algo;
9942 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9943 			&cap_idx) == NULL)
9944 		return TEST_SKIPPED;
9945 
9946 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9947 		return TEST_SKIPPED;
9948 
9949 	/* not supported with CPU crypto */
9950 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9951 		return TEST_SKIPPED;
9952 
9953 	/* Create AEAD session */
9954 	retval = create_aead_session(ts_params->valid_devs[0],
9955 			tdata->algo,
9956 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9957 			tdata->key.data, tdata->key.len,
9958 			tdata->aad.len, tdata->auth_tag.len,
9959 			tdata->iv.len);
9960 	if (retval < 0)
9961 		return retval;
9962 
9963 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9964 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9965 
9966 	/* clear mbuf payload */
9967 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9968 			rte_pktmbuf_tailroom(ut_params->ibuf));
9969 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9970 			rte_pktmbuf_tailroom(ut_params->obuf));
9971 
9972 	/* Create AEAD operation */
9973 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9974 	if (retval < 0)
9975 		return retval;
9976 
9977 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9978 
9979 	ut_params->op->sym->m_src = ut_params->ibuf;
9980 	ut_params->op->sym->m_dst = ut_params->obuf;
9981 
9982 	/* Process crypto operation */
9983 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9984 			ut_params->op), "failed to process sym crypto op");
9985 
9986 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9987 			"crypto op processing failed");
9988 
9989 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9990 
9991 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9992 			ut_params->op->sym->cipher.data.offset);
9993 	auth_tag = ciphertext + plaintext_pad_len;
9994 
9995 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9996 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9997 
9998 	/* Validate obuf */
9999 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10000 			ciphertext,
10001 			tdata->ciphertext.data,
10002 			tdata->ciphertext.len,
10003 			"Ciphertext data not as expected");
10004 
10005 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10006 			auth_tag,
10007 			tdata->auth_tag.data,
10008 			tdata->auth_tag.len,
10009 			"Generated auth tag not as expected");
10010 
10011 	return 0;
10012 
10013 }
10014 
10015 static int
10016 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
10017 {
10018 	return test_authenticated_encryption_oop(&gcm_test_case_5);
10019 }
10020 
10021 static int
10022 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
10023 {
10024 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10025 	struct crypto_unittest_params *ut_params = &unittest_params;
10026 
10027 	int retval;
10028 	uint8_t *plaintext;
10029 
10030 	/* Verify the capabilities */
10031 	struct rte_cryptodev_sym_capability_idx cap_idx;
10032 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10033 	cap_idx.algo.aead = tdata->algo;
10034 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10035 			&cap_idx) == NULL)
10036 		return TEST_SKIPPED;
10037 
10038 	/* not supported with CPU crypto and raw data-path APIs*/
10039 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
10040 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
10041 		return TEST_SKIPPED;
10042 
10043 	/* Create AEAD session */
10044 	retval = create_aead_session(ts_params->valid_devs[0],
10045 			tdata->algo,
10046 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10047 			tdata->key.data, tdata->key.len,
10048 			tdata->aad.len, tdata->auth_tag.len,
10049 			tdata->iv.len);
10050 	if (retval < 0)
10051 		return retval;
10052 
10053 	/* alloc mbuf and set payload */
10054 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10055 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10056 
10057 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10058 			rte_pktmbuf_tailroom(ut_params->ibuf));
10059 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
10060 			rte_pktmbuf_tailroom(ut_params->obuf));
10061 
10062 	/* Create AEAD operation */
10063 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10064 	if (retval < 0)
10065 		return retval;
10066 
10067 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10068 
10069 	ut_params->op->sym->m_src = ut_params->ibuf;
10070 	ut_params->op->sym->m_dst = ut_params->obuf;
10071 
10072 	/* Process crypto operation */
10073 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10074 			ut_params->op), "failed to process sym crypto op");
10075 
10076 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10077 			"crypto op processing failed");
10078 
10079 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
10080 			ut_params->op->sym->cipher.data.offset);
10081 
10082 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10083 
10084 	/* Validate obuf */
10085 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10086 			plaintext,
10087 			tdata->plaintext.data,
10088 			tdata->plaintext.len,
10089 			"Plaintext data not as expected");
10090 
10091 	TEST_ASSERT_EQUAL(ut_params->op->status,
10092 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10093 			"Authentication failed");
10094 	return 0;
10095 }
10096 
10097 static int
10098 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
10099 {
10100 	return test_authenticated_decryption_oop(&gcm_test_case_5);
10101 }
10102 
10103 static int
10104 test_authenticated_encryption_sessionless(
10105 		const struct aead_test_data *tdata)
10106 {
10107 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10108 	struct crypto_unittest_params *ut_params = &unittest_params;
10109 
10110 	int retval;
10111 	uint8_t *ciphertext, *auth_tag;
10112 	uint16_t plaintext_pad_len;
10113 	uint8_t key[tdata->key.len + 1];
10114 	struct rte_cryptodev_info dev_info;
10115 
10116 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10117 	uint64_t feat_flags = dev_info.feature_flags;
10118 
10119 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10120 		printf("Device doesn't support Sessionless ops.\n");
10121 		return TEST_SKIPPED;
10122 	}
10123 
10124 	/* not supported with CPU crypto */
10125 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10126 		return TEST_SKIPPED;
10127 
10128 	/* Verify the capabilities */
10129 	struct rte_cryptodev_sym_capability_idx cap_idx;
10130 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10131 	cap_idx.algo.aead = tdata->algo;
10132 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10133 			&cap_idx) == NULL)
10134 		return TEST_SKIPPED;
10135 
10136 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10137 
10138 	/* clear mbuf payload */
10139 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10140 			rte_pktmbuf_tailroom(ut_params->ibuf));
10141 
10142 	/* Create AEAD operation */
10143 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
10144 	if (retval < 0)
10145 		return retval;
10146 
10147 	/* Create GCM xform */
10148 	memcpy(key, tdata->key.data, tdata->key.len);
10149 	retval = create_aead_xform(ut_params->op,
10150 			tdata->algo,
10151 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
10152 			key, tdata->key.len,
10153 			tdata->aad.len, tdata->auth_tag.len,
10154 			tdata->iv.len);
10155 	if (retval < 0)
10156 		return retval;
10157 
10158 	ut_params->op->sym->m_src = ut_params->ibuf;
10159 
10160 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10161 			RTE_CRYPTO_OP_SESSIONLESS,
10162 			"crypto op session type not sessionless");
10163 
10164 	/* Process crypto operation */
10165 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
10166 			ut_params->op), "failed to process sym crypto op");
10167 
10168 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10169 
10170 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10171 			"crypto op status not success");
10172 
10173 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10174 
10175 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10176 			ut_params->op->sym->cipher.data.offset);
10177 	auth_tag = ciphertext + plaintext_pad_len;
10178 
10179 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
10180 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
10181 
10182 	/* Validate obuf */
10183 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10184 			ciphertext,
10185 			tdata->ciphertext.data,
10186 			tdata->ciphertext.len,
10187 			"Ciphertext data not as expected");
10188 
10189 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10190 			auth_tag,
10191 			tdata->auth_tag.data,
10192 			tdata->auth_tag.len,
10193 			"Generated auth tag not as expected");
10194 
10195 	return 0;
10196 
10197 }
10198 
10199 static int
10200 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
10201 {
10202 	return test_authenticated_encryption_sessionless(
10203 			&gcm_test_case_5);
10204 }
10205 
10206 static int
10207 test_authenticated_decryption_sessionless(
10208 		const struct aead_test_data *tdata)
10209 {
10210 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10211 	struct crypto_unittest_params *ut_params = &unittest_params;
10212 
10213 	int retval;
10214 	uint8_t *plaintext;
10215 	uint8_t key[tdata->key.len + 1];
10216 	struct rte_cryptodev_info dev_info;
10217 
10218 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10219 	uint64_t feat_flags = dev_info.feature_flags;
10220 
10221 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
10222 		printf("Device doesn't support Sessionless ops.\n");
10223 		return TEST_SKIPPED;
10224 	}
10225 
10226 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10227 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10228 		printf("Device doesn't support RAW data-path APIs.\n");
10229 		return TEST_SKIPPED;
10230 	}
10231 
10232 	/* not supported with CPU crypto */
10233 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10234 		return TEST_SKIPPED;
10235 
10236 	/* Verify the capabilities */
10237 	struct rte_cryptodev_sym_capability_idx cap_idx;
10238 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10239 	cap_idx.algo.aead = tdata->algo;
10240 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10241 			&cap_idx) == NULL)
10242 		return TEST_SKIPPED;
10243 
10244 	/* alloc mbuf and set payload */
10245 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10246 
10247 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10248 			rte_pktmbuf_tailroom(ut_params->ibuf));
10249 
10250 	/* Create AEAD operation */
10251 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10252 	if (retval < 0)
10253 		return retval;
10254 
10255 	/* Create AEAD xform */
10256 	memcpy(key, tdata->key.data, tdata->key.len);
10257 	retval = create_aead_xform(ut_params->op,
10258 			tdata->algo,
10259 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10260 			key, tdata->key.len,
10261 			tdata->aad.len, tdata->auth_tag.len,
10262 			tdata->iv.len);
10263 	if (retval < 0)
10264 		return retval;
10265 
10266 	ut_params->op->sym->m_src = ut_params->ibuf;
10267 
10268 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
10269 			RTE_CRYPTO_OP_SESSIONLESS,
10270 			"crypto op session type not sessionless");
10271 
10272 	/* Process crypto operation */
10273 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10274 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10275 				ut_params->op, 0, 0, 0, 0);
10276 	else
10277 		TEST_ASSERT_NOT_NULL(process_crypto_request(
10278 			ts_params->valid_devs[0], ut_params->op),
10279 				"failed to process sym crypto op");
10280 
10281 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
10282 
10283 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10284 			"crypto op status not success");
10285 
10286 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
10287 			ut_params->op->sym->cipher.data.offset);
10288 
10289 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10290 
10291 	/* Validate obuf */
10292 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10293 			plaintext,
10294 			tdata->plaintext.data,
10295 			tdata->plaintext.len,
10296 			"Plaintext data not as expected");
10297 
10298 	TEST_ASSERT_EQUAL(ut_params->op->status,
10299 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10300 			"Authentication failed");
10301 	return 0;
10302 }
10303 
10304 static int
10305 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
10306 {
10307 	return test_authenticated_decryption_sessionless(
10308 			&gcm_test_case_5);
10309 }
10310 
10311 static int
10312 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
10313 {
10314 	return test_authenticated_encryption(&ccm_test_case_128_1);
10315 }
10316 
10317 static int
10318 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
10319 {
10320 	return test_authenticated_encryption(&ccm_test_case_128_2);
10321 }
10322 
10323 static int
10324 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10325 {
10326 	return test_authenticated_encryption(&ccm_test_case_128_3);
10327 }
10328 
10329 static int
10330 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10331 {
10332 	return test_authenticated_decryption(&ccm_test_case_128_1);
10333 }
10334 
10335 static int
10336 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10337 {
10338 	return test_authenticated_decryption(&ccm_test_case_128_2);
10339 }
10340 
10341 static int
10342 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10343 {
10344 	return test_authenticated_decryption(&ccm_test_case_128_3);
10345 }
10346 
10347 static int
10348 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10349 {
10350 	return test_authenticated_encryption(&ccm_test_case_192_1);
10351 }
10352 
10353 static int
10354 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10355 {
10356 	return test_authenticated_encryption(&ccm_test_case_192_2);
10357 }
10358 
10359 static int
10360 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10361 {
10362 	return test_authenticated_encryption(&ccm_test_case_192_3);
10363 }
10364 
10365 static int
10366 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10367 {
10368 	return test_authenticated_decryption(&ccm_test_case_192_1);
10369 }
10370 
10371 static int
10372 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10373 {
10374 	return test_authenticated_decryption(&ccm_test_case_192_2);
10375 }
10376 
10377 static int
10378 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10379 {
10380 	return test_authenticated_decryption(&ccm_test_case_192_3);
10381 }
10382 
10383 static int
10384 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10385 {
10386 	return test_authenticated_encryption(&ccm_test_case_256_1);
10387 }
10388 
10389 static int
10390 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10391 {
10392 	return test_authenticated_encryption(&ccm_test_case_256_2);
10393 }
10394 
10395 static int
10396 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10397 {
10398 	return test_authenticated_encryption(&ccm_test_case_256_3);
10399 }
10400 
10401 static int
10402 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10403 {
10404 	return test_authenticated_decryption(&ccm_test_case_256_1);
10405 }
10406 
10407 static int
10408 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10409 {
10410 	return test_authenticated_decryption(&ccm_test_case_256_2);
10411 }
10412 
10413 static int
10414 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10415 {
10416 	return test_authenticated_decryption(&ccm_test_case_256_3);
10417 }
10418 
10419 static int
10420 test_stats(void)
10421 {
10422 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10423 	struct rte_cryptodev_stats stats;
10424 
10425 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10426 		return TEST_SKIPPED;
10427 
10428 	/* Verify the capabilities */
10429 	struct rte_cryptodev_sym_capability_idx cap_idx;
10430 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10431 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10432 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10433 			&cap_idx) == NULL)
10434 		return TEST_SKIPPED;
10435 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10436 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10437 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10438 			&cap_idx) == NULL)
10439 		return TEST_SKIPPED;
10440 
10441 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10442 			== -ENOTSUP)
10443 		return TEST_SKIPPED;
10444 
10445 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10446 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10447 			&stats) == -ENODEV),
10448 		"rte_cryptodev_stats_get invalid dev failed");
10449 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10450 		"rte_cryptodev_stats_get invalid Param failed");
10451 
10452 	/* Test expected values */
10453 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10454 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10455 			&stats),
10456 		"rte_cryptodev_stats_get failed");
10457 	TEST_ASSERT((stats.enqueued_count == 1),
10458 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10459 	TEST_ASSERT((stats.dequeued_count == 1),
10460 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10461 	TEST_ASSERT((stats.enqueue_err_count == 0),
10462 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10463 	TEST_ASSERT((stats.dequeue_err_count == 0),
10464 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10465 
10466 	/* invalid device but should ignore and not reset device stats*/
10467 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10468 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10469 			&stats),
10470 		"rte_cryptodev_stats_get failed");
10471 	TEST_ASSERT((stats.enqueued_count == 1),
10472 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10473 
10474 	/* check that a valid reset clears stats */
10475 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10476 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10477 			&stats),
10478 					  "rte_cryptodev_stats_get failed");
10479 	TEST_ASSERT((stats.enqueued_count == 0),
10480 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10481 	TEST_ASSERT((stats.dequeued_count == 0),
10482 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10483 
10484 	return TEST_SUCCESS;
10485 }
10486 
10487 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10488 				   struct crypto_unittest_params *ut_params,
10489 				   enum rte_crypto_auth_operation op,
10490 				   const struct HMAC_MD5_vector *test_case)
10491 {
10492 	uint8_t key[64];
10493 
10494 	memcpy(key, test_case->key.data, test_case->key.len);
10495 
10496 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10497 	ut_params->auth_xform.next = NULL;
10498 	ut_params->auth_xform.auth.op = op;
10499 
10500 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10501 
10502 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10503 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10504 	ut_params->auth_xform.auth.key.data = key;
10505 
10506 	ut_params->sess = rte_cryptodev_sym_session_create(
10507 			ts_params->session_mpool);
10508 
10509 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10510 			ut_params->sess, &ut_params->auth_xform,
10511 			ts_params->session_priv_mpool);
10512 
10513 	if (ut_params->sess == NULL)
10514 		return TEST_FAILED;
10515 
10516 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10517 
10518 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10519 			rte_pktmbuf_tailroom(ut_params->ibuf));
10520 
10521 	return 0;
10522 }
10523 
10524 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10525 			      const struct HMAC_MD5_vector *test_case,
10526 			      uint8_t **plaintext)
10527 {
10528 	uint16_t plaintext_pad_len;
10529 
10530 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10531 
10532 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10533 				16);
10534 
10535 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10536 			plaintext_pad_len);
10537 	memcpy(*plaintext, test_case->plaintext.data,
10538 			test_case->plaintext.len);
10539 
10540 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10541 			ut_params->ibuf, MD5_DIGEST_LEN);
10542 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10543 			"no room to append digest");
10544 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10545 			ut_params->ibuf, plaintext_pad_len);
10546 
10547 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10548 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10549 			   test_case->auth_tag.len);
10550 	}
10551 
10552 	sym_op->auth.data.offset = 0;
10553 	sym_op->auth.data.length = test_case->plaintext.len;
10554 
10555 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10556 	ut_params->op->sym->m_src = ut_params->ibuf;
10557 
10558 	return 0;
10559 }
10560 
10561 static int
10562 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10563 {
10564 	uint16_t plaintext_pad_len;
10565 	uint8_t *plaintext, *auth_tag;
10566 
10567 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10568 	struct crypto_unittest_params *ut_params = &unittest_params;
10569 	struct rte_cryptodev_info dev_info;
10570 
10571 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10572 	uint64_t feat_flags = dev_info.feature_flags;
10573 
10574 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10575 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10576 		printf("Device doesn't support RAW data-path APIs.\n");
10577 		return TEST_SKIPPED;
10578 	}
10579 
10580 	/* Verify the capabilities */
10581 	struct rte_cryptodev_sym_capability_idx cap_idx;
10582 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10583 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10584 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10585 			&cap_idx) == NULL)
10586 		return TEST_SKIPPED;
10587 
10588 	if (MD5_HMAC_create_session(ts_params, ut_params,
10589 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10590 		return TEST_FAILED;
10591 
10592 	/* Generate Crypto op data structure */
10593 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10594 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10595 	TEST_ASSERT_NOT_NULL(ut_params->op,
10596 			"Failed to allocate symmetric crypto operation struct");
10597 
10598 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10599 				16);
10600 
10601 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10602 		return TEST_FAILED;
10603 
10604 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10605 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10606 			ut_params->op);
10607 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10608 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10609 				ut_params->op, 0, 1, 0, 0);
10610 	else
10611 		TEST_ASSERT_NOT_NULL(
10612 			process_crypto_request(ts_params->valid_devs[0],
10613 				ut_params->op),
10614 				"failed to process sym crypto op");
10615 
10616 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10617 			"crypto op processing failed");
10618 
10619 	if (ut_params->op->sym->m_dst) {
10620 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10621 				uint8_t *, plaintext_pad_len);
10622 	} else {
10623 		auth_tag = plaintext + plaintext_pad_len;
10624 	}
10625 
10626 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10627 			auth_tag,
10628 			test_case->auth_tag.data,
10629 			test_case->auth_tag.len,
10630 			"HMAC_MD5 generated tag not as expected");
10631 
10632 	return TEST_SUCCESS;
10633 }
10634 
10635 static int
10636 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10637 {
10638 	uint8_t *plaintext;
10639 
10640 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10641 	struct crypto_unittest_params *ut_params = &unittest_params;
10642 	struct rte_cryptodev_info dev_info;
10643 
10644 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10645 	uint64_t feat_flags = dev_info.feature_flags;
10646 
10647 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10648 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10649 		printf("Device doesn't support RAW data-path APIs.\n");
10650 		return TEST_SKIPPED;
10651 	}
10652 
10653 	/* Verify the capabilities */
10654 	struct rte_cryptodev_sym_capability_idx cap_idx;
10655 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10656 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10657 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10658 			&cap_idx) == NULL)
10659 		return TEST_SKIPPED;
10660 
10661 	if (MD5_HMAC_create_session(ts_params, ut_params,
10662 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10663 		return TEST_FAILED;
10664 	}
10665 
10666 	/* Generate Crypto op data structure */
10667 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10668 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10669 	TEST_ASSERT_NOT_NULL(ut_params->op,
10670 			"Failed to allocate symmetric crypto operation struct");
10671 
10672 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10673 		return TEST_FAILED;
10674 
10675 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10676 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10677 			ut_params->op);
10678 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10679 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10680 				ut_params->op, 0, 1, 0, 0);
10681 	else
10682 		TEST_ASSERT_NOT_NULL(
10683 			process_crypto_request(ts_params->valid_devs[0],
10684 				ut_params->op),
10685 				"failed to process sym crypto op");
10686 
10687 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10688 			"HMAC_MD5 crypto op processing failed");
10689 
10690 	return TEST_SUCCESS;
10691 }
10692 
10693 static int
10694 test_MD5_HMAC_generate_case_1(void)
10695 {
10696 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10697 }
10698 
10699 static int
10700 test_MD5_HMAC_verify_case_1(void)
10701 {
10702 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10703 }
10704 
10705 static int
10706 test_MD5_HMAC_generate_case_2(void)
10707 {
10708 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10709 }
10710 
10711 static int
10712 test_MD5_HMAC_verify_case_2(void)
10713 {
10714 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10715 }
10716 
10717 static int
10718 test_multi_session(void)
10719 {
10720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10721 	struct crypto_unittest_params *ut_params = &unittest_params;
10722 
10723 	struct rte_cryptodev_info dev_info;
10724 	struct rte_cryptodev_sym_session **sessions;
10725 
10726 	uint16_t i;
10727 
10728 	/* Verify the capabilities */
10729 	struct rte_cryptodev_sym_capability_idx cap_idx;
10730 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10731 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10732 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10733 			&cap_idx) == NULL)
10734 		return TEST_SKIPPED;
10735 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10736 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10737 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10738 			&cap_idx) == NULL)
10739 		return TEST_SKIPPED;
10740 
10741 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10742 			aes_cbc_key, hmac_sha512_key);
10743 
10744 
10745 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10746 
10747 	sessions = rte_malloc(NULL,
10748 			sizeof(struct rte_cryptodev_sym_session *) *
10749 			(MAX_NB_SESSIONS + 1), 0);
10750 
10751 	/* Create multiple crypto sessions*/
10752 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10753 
10754 		sessions[i] = rte_cryptodev_sym_session_create(
10755 				ts_params->session_mpool);
10756 
10757 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10758 				sessions[i], &ut_params->auth_xform,
10759 				ts_params->session_priv_mpool);
10760 		TEST_ASSERT_NOT_NULL(sessions[i],
10761 				"Session creation failed at session number %u",
10762 				i);
10763 
10764 		/* Attempt to send a request on each session */
10765 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10766 			sessions[i],
10767 			ut_params,
10768 			ts_params,
10769 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10770 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10771 			aes_cbc_iv),
10772 			"Failed to perform decrypt on request number %u.", i);
10773 		/* free crypto operation structure */
10774 		if (ut_params->op)
10775 			rte_crypto_op_free(ut_params->op);
10776 
10777 		/*
10778 		 * free mbuf - both obuf and ibuf are usually the same,
10779 		 * so check if they point at the same address is necessary,
10780 		 * to avoid freeing the mbuf twice.
10781 		 */
10782 		if (ut_params->obuf) {
10783 			rte_pktmbuf_free(ut_params->obuf);
10784 			if (ut_params->ibuf == ut_params->obuf)
10785 				ut_params->ibuf = 0;
10786 			ut_params->obuf = 0;
10787 		}
10788 		if (ut_params->ibuf) {
10789 			rte_pktmbuf_free(ut_params->ibuf);
10790 			ut_params->ibuf = 0;
10791 		}
10792 	}
10793 
10794 	sessions[i] = NULL;
10795 	/* Next session create should fail */
10796 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10797 			sessions[i], &ut_params->auth_xform,
10798 			ts_params->session_priv_mpool);
10799 	TEST_ASSERT_NULL(sessions[i],
10800 			"Session creation succeeded unexpectedly!");
10801 
10802 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10803 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10804 				sessions[i]);
10805 		rte_cryptodev_sym_session_free(sessions[i]);
10806 	}
10807 
10808 	rte_free(sessions);
10809 
10810 	return TEST_SUCCESS;
10811 }
10812 
10813 struct multi_session_params {
10814 	struct crypto_unittest_params ut_params;
10815 	uint8_t *cipher_key;
10816 	uint8_t *hmac_key;
10817 	const uint8_t *cipher;
10818 	const uint8_t *digest;
10819 	uint8_t *iv;
10820 };
10821 
10822 #define MB_SESSION_NUMBER 3
10823 
10824 static int
10825 test_multi_session_random_usage(void)
10826 {
10827 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10828 	struct rte_cryptodev_info dev_info;
10829 	struct rte_cryptodev_sym_session **sessions;
10830 	uint32_t i, j;
10831 	struct multi_session_params ut_paramz[] = {
10832 
10833 		{
10834 			.cipher_key = ms_aes_cbc_key0,
10835 			.hmac_key = ms_hmac_key0,
10836 			.cipher = ms_aes_cbc_cipher0,
10837 			.digest = ms_hmac_digest0,
10838 			.iv = ms_aes_cbc_iv0
10839 		},
10840 		{
10841 			.cipher_key = ms_aes_cbc_key1,
10842 			.hmac_key = ms_hmac_key1,
10843 			.cipher = ms_aes_cbc_cipher1,
10844 			.digest = ms_hmac_digest1,
10845 			.iv = ms_aes_cbc_iv1
10846 		},
10847 		{
10848 			.cipher_key = ms_aes_cbc_key2,
10849 			.hmac_key = ms_hmac_key2,
10850 			.cipher = ms_aes_cbc_cipher2,
10851 			.digest = ms_hmac_digest2,
10852 			.iv = ms_aes_cbc_iv2
10853 		},
10854 
10855 	};
10856 
10857 	/* Verify the capabilities */
10858 	struct rte_cryptodev_sym_capability_idx cap_idx;
10859 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10860 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10861 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10862 			&cap_idx) == NULL)
10863 		return TEST_SKIPPED;
10864 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10865 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10866 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10867 			&cap_idx) == NULL)
10868 		return TEST_SKIPPED;
10869 
10870 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10871 
10872 	sessions = rte_malloc(NULL,
10873 			(sizeof(struct rte_cryptodev_sym_session *)
10874 					* MAX_NB_SESSIONS) + 1, 0);
10875 
10876 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10877 		sessions[i] = rte_cryptodev_sym_session_create(
10878 				ts_params->session_mpool);
10879 
10880 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10881 				sizeof(struct crypto_unittest_params));
10882 
10883 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10884 				&ut_paramz[i].ut_params,
10885 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10886 
10887 		/* Create multiple crypto sessions*/
10888 		rte_cryptodev_sym_session_init(
10889 				ts_params->valid_devs[0],
10890 				sessions[i],
10891 				&ut_paramz[i].ut_params.auth_xform,
10892 				ts_params->session_priv_mpool);
10893 
10894 		TEST_ASSERT_NOT_NULL(sessions[i],
10895 				"Session creation failed at session number %u",
10896 				i);
10897 
10898 	}
10899 
10900 	srand(time(NULL));
10901 	for (i = 0; i < 40000; i++) {
10902 
10903 		j = rand() % MB_SESSION_NUMBER;
10904 
10905 		TEST_ASSERT_SUCCESS(
10906 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
10907 					sessions[j],
10908 					&ut_paramz[j].ut_params,
10909 					ts_params, ut_paramz[j].cipher,
10910 					ut_paramz[j].digest,
10911 					ut_paramz[j].iv),
10912 			"Failed to perform decrypt on request number %u.", i);
10913 
10914 		if (ut_paramz[j].ut_params.op)
10915 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
10916 
10917 		/*
10918 		 * free mbuf - both obuf and ibuf are usually the same,
10919 		 * so check if they point at the same address is necessary,
10920 		 * to avoid freeing the mbuf twice.
10921 		 */
10922 		if (ut_paramz[j].ut_params.obuf) {
10923 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10924 			if (ut_paramz[j].ut_params.ibuf
10925 					== ut_paramz[j].ut_params.obuf)
10926 				ut_paramz[j].ut_params.ibuf = 0;
10927 			ut_paramz[j].ut_params.obuf = 0;
10928 		}
10929 		if (ut_paramz[j].ut_params.ibuf) {
10930 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10931 			ut_paramz[j].ut_params.ibuf = 0;
10932 		}
10933 	}
10934 
10935 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10936 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10937 				sessions[i]);
10938 		rte_cryptodev_sym_session_free(sessions[i]);
10939 	}
10940 
10941 	rte_free(sessions);
10942 
10943 	return TEST_SUCCESS;
10944 }
10945 
10946 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10947 			0xab, 0xab, 0xab, 0xab,
10948 			0xab, 0xab, 0xab, 0xab,
10949 			0xab, 0xab, 0xab, 0xab};
10950 
10951 static int
10952 test_null_invalid_operation(void)
10953 {
10954 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10955 	struct crypto_unittest_params *ut_params = &unittest_params;
10956 	int ret;
10957 
10958 	/* This test is for NULL PMD only */
10959 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10960 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10961 		return TEST_SKIPPED;
10962 
10963 	/* Setup Cipher Parameters */
10964 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10965 	ut_params->cipher_xform.next = NULL;
10966 
10967 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10968 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10969 
10970 	ut_params->sess = rte_cryptodev_sym_session_create(
10971 			ts_params->session_mpool);
10972 
10973 	/* Create Crypto session*/
10974 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10975 			ut_params->sess, &ut_params->cipher_xform,
10976 			ts_params->session_priv_mpool);
10977 	TEST_ASSERT(ret < 0,
10978 			"Session creation succeeded unexpectedly");
10979 
10980 
10981 	/* Setup HMAC Parameters */
10982 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10983 	ut_params->auth_xform.next = NULL;
10984 
10985 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10986 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10987 
10988 	ut_params->sess = rte_cryptodev_sym_session_create(
10989 			ts_params->session_mpool);
10990 
10991 	/* Create Crypto session*/
10992 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10993 			ut_params->sess, &ut_params->auth_xform,
10994 			ts_params->session_priv_mpool);
10995 	TEST_ASSERT(ret < 0,
10996 			"Session creation succeeded unexpectedly");
10997 
10998 	return TEST_SUCCESS;
10999 }
11000 
11001 
11002 #define NULL_BURST_LENGTH (32)
11003 
11004 static int
11005 test_null_burst_operation(void)
11006 {
11007 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11008 	struct crypto_unittest_params *ut_params = &unittest_params;
11009 
11010 	unsigned i, burst_len = NULL_BURST_LENGTH;
11011 
11012 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
11013 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
11014 
11015 	/* This test is for NULL PMD only */
11016 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
11017 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
11018 		return TEST_SKIPPED;
11019 
11020 	/* Setup Cipher Parameters */
11021 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11022 	ut_params->cipher_xform.next = &ut_params->auth_xform;
11023 
11024 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
11025 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
11026 
11027 	/* Setup HMAC Parameters */
11028 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11029 	ut_params->auth_xform.next = NULL;
11030 
11031 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
11032 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
11033 
11034 	ut_params->sess = rte_cryptodev_sym_session_create(
11035 			ts_params->session_mpool);
11036 
11037 	/* Create Crypto session*/
11038 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11039 			ut_params->sess, &ut_params->cipher_xform,
11040 			ts_params->session_priv_mpool);
11041 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11042 
11043 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
11044 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
11045 			burst_len, "failed to generate burst of crypto ops");
11046 
11047 	/* Generate an operation for each mbuf in burst */
11048 	for (i = 0; i < burst_len; i++) {
11049 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11050 
11051 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
11052 
11053 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
11054 				sizeof(unsigned));
11055 		*data = i;
11056 
11057 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
11058 
11059 		burst[i]->sym->m_src = m;
11060 	}
11061 
11062 	/* Process crypto operation */
11063 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
11064 			0, burst, burst_len),
11065 			burst_len,
11066 			"Error enqueuing burst");
11067 
11068 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
11069 			0, burst_dequeued, burst_len),
11070 			burst_len,
11071 			"Error dequeuing burst");
11072 
11073 
11074 	for (i = 0; i < burst_len; i++) {
11075 		TEST_ASSERT_EQUAL(
11076 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
11077 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
11078 					uint32_t *),
11079 			"data not as expected");
11080 
11081 		rte_pktmbuf_free(burst[i]->sym->m_src);
11082 		rte_crypto_op_free(burst[i]);
11083 	}
11084 
11085 	return TEST_SUCCESS;
11086 }
11087 
11088 static uint16_t
11089 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11090 		  uint16_t nb_ops, void *user_param)
11091 {
11092 	RTE_SET_USED(dev_id);
11093 	RTE_SET_USED(qp_id);
11094 	RTE_SET_USED(ops);
11095 	RTE_SET_USED(user_param);
11096 
11097 	printf("crypto enqueue callback called\n");
11098 	return nb_ops;
11099 }
11100 
11101 static uint16_t
11102 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
11103 		  uint16_t nb_ops, void *user_param)
11104 {
11105 	RTE_SET_USED(dev_id);
11106 	RTE_SET_USED(qp_id);
11107 	RTE_SET_USED(ops);
11108 	RTE_SET_USED(user_param);
11109 
11110 	printf("crypto dequeue callback called\n");
11111 	return nb_ops;
11112 }
11113 
11114 /*
11115  * Thread using enqueue/dequeue callback with RCU.
11116  */
11117 static int
11118 test_enqdeq_callback_thread(void *arg)
11119 {
11120 	RTE_SET_USED(arg);
11121 	/* DP thread calls rte_cryptodev_enqueue_burst()/
11122 	 * rte_cryptodev_dequeue_burst() and invokes callback.
11123 	 */
11124 	test_null_burst_operation();
11125 	return 0;
11126 }
11127 
11128 static int
11129 test_enq_callback_setup(void)
11130 {
11131 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11132 	struct rte_cryptodev_info dev_info;
11133 	struct rte_cryptodev_qp_conf qp_conf = {
11134 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11135 	};
11136 
11137 	struct rte_cryptodev_cb *cb;
11138 	uint16_t qp_id = 0;
11139 
11140 	/* Stop the device in case it's started so it can be configured */
11141 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11142 
11143 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11144 
11145 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11146 			&ts_params->conf),
11147 			"Failed to configure cryptodev %u",
11148 			ts_params->valid_devs[0]);
11149 
11150 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11151 	qp_conf.mp_session = ts_params->session_mpool;
11152 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11153 
11154 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11155 			ts_params->valid_devs[0], qp_id, &qp_conf,
11156 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11157 			"Failed test for "
11158 			"rte_cryptodev_queue_pair_setup: num_inflights "
11159 			"%u on qp %u on cryptodev %u",
11160 			qp_conf.nb_descriptors, qp_id,
11161 			ts_params->valid_devs[0]);
11162 
11163 	/* Test with invalid crypto device */
11164 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
11165 			qp_id, test_enq_callback, NULL);
11166 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11167 			"cryptodev %u did not fail",
11168 			qp_id, RTE_CRYPTO_MAX_DEVS);
11169 
11170 	/* Test with invalid queue pair */
11171 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11172 			dev_info.max_nb_queue_pairs + 1,
11173 			test_enq_callback, NULL);
11174 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11175 			"cryptodev %u did not fail",
11176 			dev_info.max_nb_queue_pairs + 1,
11177 			ts_params->valid_devs[0]);
11178 
11179 	/* Test with NULL callback */
11180 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11181 			qp_id, NULL, NULL);
11182 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11183 			"cryptodev %u did not fail",
11184 			qp_id, ts_params->valid_devs[0]);
11185 
11186 	/* Test with valid configuration */
11187 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
11188 			qp_id, test_enq_callback, NULL);
11189 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11190 			"qp %u on cryptodev %u",
11191 			qp_id, ts_params->valid_devs[0]);
11192 
11193 	rte_cryptodev_start(ts_params->valid_devs[0]);
11194 
11195 	/* Launch a thread */
11196 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11197 				rte_get_next_lcore(-1, 1, 0));
11198 
11199 	/* Wait until reader exited. */
11200 	rte_eal_mp_wait_lcore();
11201 
11202 	/* Test with invalid crypto device */
11203 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11204 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11205 			"Expected call to fail as crypto device is invalid");
11206 
11207 	/* Test with invalid queue pair */
11208 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11209 			ts_params->valid_devs[0],
11210 			dev_info.max_nb_queue_pairs + 1, cb),
11211 			"Expected call to fail as queue pair is invalid");
11212 
11213 	/* Test with NULL callback */
11214 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
11215 			ts_params->valid_devs[0], qp_id, NULL),
11216 			"Expected call to fail as callback is NULL");
11217 
11218 	/* Test with valid configuration */
11219 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
11220 			ts_params->valid_devs[0], qp_id, cb),
11221 			"Failed test to remove callback on "
11222 			"qp %u on cryptodev %u",
11223 			qp_id, ts_params->valid_devs[0]);
11224 
11225 	return TEST_SUCCESS;
11226 }
11227 
11228 static int
11229 test_deq_callback_setup(void)
11230 {
11231 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11232 	struct rte_cryptodev_info dev_info;
11233 	struct rte_cryptodev_qp_conf qp_conf = {
11234 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
11235 	};
11236 
11237 	struct rte_cryptodev_cb *cb;
11238 	uint16_t qp_id = 0;
11239 
11240 	/* Stop the device in case it's started so it can be configured */
11241 	rte_cryptodev_stop(ts_params->valid_devs[0]);
11242 
11243 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11244 
11245 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
11246 			&ts_params->conf),
11247 			"Failed to configure cryptodev %u",
11248 			ts_params->valid_devs[0]);
11249 
11250 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
11251 	qp_conf.mp_session = ts_params->session_mpool;
11252 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
11253 
11254 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
11255 			ts_params->valid_devs[0], qp_id, &qp_conf,
11256 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
11257 			"Failed test for "
11258 			"rte_cryptodev_queue_pair_setup: num_inflights "
11259 			"%u on qp %u on cryptodev %u",
11260 			qp_conf.nb_descriptors, qp_id,
11261 			ts_params->valid_devs[0]);
11262 
11263 	/* Test with invalid crypto device */
11264 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
11265 			qp_id, test_deq_callback, NULL);
11266 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11267 			"cryptodev %u did not fail",
11268 			qp_id, RTE_CRYPTO_MAX_DEVS);
11269 
11270 	/* Test with invalid queue pair */
11271 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11272 			dev_info.max_nb_queue_pairs + 1,
11273 			test_deq_callback, NULL);
11274 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11275 			"cryptodev %u did not fail",
11276 			dev_info.max_nb_queue_pairs + 1,
11277 			ts_params->valid_devs[0]);
11278 
11279 	/* Test with NULL callback */
11280 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11281 			qp_id, NULL, NULL);
11282 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
11283 			"cryptodev %u did not fail",
11284 			qp_id, ts_params->valid_devs[0]);
11285 
11286 	/* Test with valid configuration */
11287 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
11288 			qp_id, test_deq_callback, NULL);
11289 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
11290 			"qp %u on cryptodev %u",
11291 			qp_id, ts_params->valid_devs[0]);
11292 
11293 	rte_cryptodev_start(ts_params->valid_devs[0]);
11294 
11295 	/* Launch a thread */
11296 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
11297 				rte_get_next_lcore(-1, 1, 0));
11298 
11299 	/* Wait until reader exited. */
11300 	rte_eal_mp_wait_lcore();
11301 
11302 	/* Test with invalid crypto device */
11303 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11304 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
11305 			"Expected call to fail as crypto device is invalid");
11306 
11307 	/* Test with invalid queue pair */
11308 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11309 			ts_params->valid_devs[0],
11310 			dev_info.max_nb_queue_pairs + 1, cb),
11311 			"Expected call to fail as queue pair is invalid");
11312 
11313 	/* Test with NULL callback */
11314 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
11315 			ts_params->valid_devs[0], qp_id, NULL),
11316 			"Expected call to fail as callback is NULL");
11317 
11318 	/* Test with valid configuration */
11319 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
11320 			ts_params->valid_devs[0], qp_id, cb),
11321 			"Failed test to remove callback on "
11322 			"qp %u on cryptodev %u",
11323 			qp_id, ts_params->valid_devs[0]);
11324 
11325 	return TEST_SUCCESS;
11326 }
11327 
11328 static void
11329 generate_gmac_large_plaintext(uint8_t *data)
11330 {
11331 	uint16_t i;
11332 
11333 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11334 		memcpy(&data[i], &data[0], 32);
11335 }
11336 
11337 static int
11338 create_gmac_operation(enum rte_crypto_auth_operation op,
11339 		const struct gmac_test_data *tdata)
11340 {
11341 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11342 	struct crypto_unittest_params *ut_params = &unittest_params;
11343 	struct rte_crypto_sym_op *sym_op;
11344 
11345 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11346 
11347 	/* Generate Crypto op data structure */
11348 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11349 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11350 	TEST_ASSERT_NOT_NULL(ut_params->op,
11351 			"Failed to allocate symmetric crypto operation struct");
11352 
11353 	sym_op = ut_params->op->sym;
11354 
11355 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11356 			ut_params->ibuf, tdata->gmac_tag.len);
11357 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11358 			"no room to append digest");
11359 
11360 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11361 			ut_params->ibuf, plaintext_pad_len);
11362 
11363 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11364 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11365 				tdata->gmac_tag.len);
11366 		debug_hexdump(stdout, "digest:",
11367 				sym_op->auth.digest.data,
11368 				tdata->gmac_tag.len);
11369 	}
11370 
11371 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11372 			uint8_t *, IV_OFFSET);
11373 
11374 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11375 
11376 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11377 
11378 	sym_op->cipher.data.length = 0;
11379 	sym_op->cipher.data.offset = 0;
11380 
11381 	sym_op->auth.data.offset = 0;
11382 	sym_op->auth.data.length = tdata->plaintext.len;
11383 
11384 	return 0;
11385 }
11386 
11387 static int
11388 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11389 		const struct gmac_test_data *tdata,
11390 		void *digest_mem, uint64_t digest_phys)
11391 {
11392 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11393 	struct crypto_unittest_params *ut_params = &unittest_params;
11394 	struct rte_crypto_sym_op *sym_op;
11395 
11396 	/* Generate Crypto op data structure */
11397 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11398 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11399 	TEST_ASSERT_NOT_NULL(ut_params->op,
11400 			"Failed to allocate symmetric crypto operation struct");
11401 
11402 	sym_op = ut_params->op->sym;
11403 
11404 	sym_op->auth.digest.data = digest_mem;
11405 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11406 			"no room to append digest");
11407 
11408 	sym_op->auth.digest.phys_addr = digest_phys;
11409 
11410 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11411 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11412 				tdata->gmac_tag.len);
11413 		debug_hexdump(stdout, "digest:",
11414 				sym_op->auth.digest.data,
11415 				tdata->gmac_tag.len);
11416 	}
11417 
11418 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11419 			uint8_t *, IV_OFFSET);
11420 
11421 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11422 
11423 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11424 
11425 	sym_op->cipher.data.length = 0;
11426 	sym_op->cipher.data.offset = 0;
11427 
11428 	sym_op->auth.data.offset = 0;
11429 	sym_op->auth.data.length = tdata->plaintext.len;
11430 
11431 	return 0;
11432 }
11433 
11434 static int create_gmac_session(uint8_t dev_id,
11435 		const struct gmac_test_data *tdata,
11436 		enum rte_crypto_auth_operation auth_op)
11437 {
11438 	uint8_t auth_key[tdata->key.len];
11439 
11440 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11441 	struct crypto_unittest_params *ut_params = &unittest_params;
11442 
11443 	memcpy(auth_key, tdata->key.data, tdata->key.len);
11444 
11445 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11446 	ut_params->auth_xform.next = NULL;
11447 
11448 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11449 	ut_params->auth_xform.auth.op = auth_op;
11450 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11451 	ut_params->auth_xform.auth.key.length = tdata->key.len;
11452 	ut_params->auth_xform.auth.key.data = auth_key;
11453 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11454 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11455 
11456 
11457 	ut_params->sess = rte_cryptodev_sym_session_create(
11458 			ts_params->session_mpool);
11459 
11460 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11461 			&ut_params->auth_xform,
11462 			ts_params->session_priv_mpool);
11463 
11464 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11465 
11466 	return 0;
11467 }
11468 
11469 static int
11470 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11471 {
11472 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11473 	struct crypto_unittest_params *ut_params = &unittest_params;
11474 	struct rte_cryptodev_info dev_info;
11475 
11476 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11477 	uint64_t feat_flags = dev_info.feature_flags;
11478 
11479 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11480 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11481 		printf("Device doesn't support RAW data-path APIs.\n");
11482 		return TEST_SKIPPED;
11483 	}
11484 
11485 	int retval;
11486 
11487 	uint8_t *auth_tag, *plaintext;
11488 	uint16_t plaintext_pad_len;
11489 
11490 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11491 			      "No GMAC length in the source data");
11492 
11493 	/* Verify the capabilities */
11494 	struct rte_cryptodev_sym_capability_idx cap_idx;
11495 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11496 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11497 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11498 			&cap_idx) == NULL)
11499 		return TEST_SKIPPED;
11500 
11501 	retval = create_gmac_session(ts_params->valid_devs[0],
11502 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11503 
11504 	if (retval < 0)
11505 		return retval;
11506 
11507 	if (tdata->plaintext.len > MBUF_SIZE)
11508 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11509 	else
11510 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11511 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11512 			"Failed to allocate input buffer in mempool");
11513 
11514 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11515 			rte_pktmbuf_tailroom(ut_params->ibuf));
11516 
11517 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11518 	/*
11519 	 * Runtime generate the large plain text instead of use hard code
11520 	 * plain text vector. It is done to avoid create huge source file
11521 	 * with the test vector.
11522 	 */
11523 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11524 		generate_gmac_large_plaintext(tdata->plaintext.data);
11525 
11526 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11527 				plaintext_pad_len);
11528 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11529 
11530 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11531 	debug_hexdump(stdout, "plaintext:", plaintext,
11532 			tdata->plaintext.len);
11533 
11534 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11535 			tdata);
11536 
11537 	if (retval < 0)
11538 		return retval;
11539 
11540 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11541 
11542 	ut_params->op->sym->m_src = ut_params->ibuf;
11543 
11544 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11545 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11546 			ut_params->op);
11547 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11548 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11549 				ut_params->op, 0, 1, 0, 0);
11550 	else
11551 		TEST_ASSERT_NOT_NULL(
11552 			process_crypto_request(ts_params->valid_devs[0],
11553 			ut_params->op), "failed to process sym crypto op");
11554 
11555 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11556 			"crypto op processing failed");
11557 
11558 	if (ut_params->op->sym->m_dst) {
11559 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11560 				uint8_t *, plaintext_pad_len);
11561 	} else {
11562 		auth_tag = plaintext + plaintext_pad_len;
11563 	}
11564 
11565 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11566 
11567 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11568 			auth_tag,
11569 			tdata->gmac_tag.data,
11570 			tdata->gmac_tag.len,
11571 			"GMAC Generated auth tag not as expected");
11572 
11573 	return 0;
11574 }
11575 
11576 static int
11577 test_AES_GMAC_authentication_test_case_1(void)
11578 {
11579 	return test_AES_GMAC_authentication(&gmac_test_case_1);
11580 }
11581 
11582 static int
11583 test_AES_GMAC_authentication_test_case_2(void)
11584 {
11585 	return test_AES_GMAC_authentication(&gmac_test_case_2);
11586 }
11587 
11588 static int
11589 test_AES_GMAC_authentication_test_case_3(void)
11590 {
11591 	return test_AES_GMAC_authentication(&gmac_test_case_3);
11592 }
11593 
11594 static int
11595 test_AES_GMAC_authentication_test_case_4(void)
11596 {
11597 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11598 }
11599 
11600 static int
11601 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11602 {
11603 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11604 	struct crypto_unittest_params *ut_params = &unittest_params;
11605 	int retval;
11606 	uint32_t plaintext_pad_len;
11607 	uint8_t *plaintext;
11608 	struct rte_cryptodev_info dev_info;
11609 
11610 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11611 	uint64_t feat_flags = dev_info.feature_flags;
11612 
11613 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11614 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11615 		printf("Device doesn't support RAW data-path APIs.\n");
11616 		return TEST_SKIPPED;
11617 	}
11618 
11619 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11620 			      "No GMAC length in the source data");
11621 
11622 	/* Verify the capabilities */
11623 	struct rte_cryptodev_sym_capability_idx cap_idx;
11624 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11625 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11626 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11627 			&cap_idx) == NULL)
11628 		return TEST_SKIPPED;
11629 
11630 	retval = create_gmac_session(ts_params->valid_devs[0],
11631 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11632 
11633 	if (retval < 0)
11634 		return retval;
11635 
11636 	if (tdata->plaintext.len > MBUF_SIZE)
11637 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11638 	else
11639 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11640 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11641 			"Failed to allocate input buffer in mempool");
11642 
11643 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11644 			rte_pktmbuf_tailroom(ut_params->ibuf));
11645 
11646 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11647 
11648 	/*
11649 	 * Runtime generate the large plain text instead of use hard code
11650 	 * plain text vector. It is done to avoid create huge source file
11651 	 * with the test vector.
11652 	 */
11653 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11654 		generate_gmac_large_plaintext(tdata->plaintext.data);
11655 
11656 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11657 				plaintext_pad_len);
11658 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11659 
11660 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11661 	debug_hexdump(stdout, "plaintext:", plaintext,
11662 			tdata->plaintext.len);
11663 
11664 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11665 			tdata);
11666 
11667 	if (retval < 0)
11668 		return retval;
11669 
11670 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11671 
11672 	ut_params->op->sym->m_src = ut_params->ibuf;
11673 
11674 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11675 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11676 			ut_params->op);
11677 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11678 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11679 				ut_params->op, 0, 1, 0, 0);
11680 	else
11681 		TEST_ASSERT_NOT_NULL(
11682 			process_crypto_request(ts_params->valid_devs[0],
11683 			ut_params->op), "failed to process sym crypto op");
11684 
11685 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11686 			"crypto op processing failed");
11687 
11688 	return 0;
11689 
11690 }
11691 
11692 static int
11693 test_AES_GMAC_authentication_verify_test_case_1(void)
11694 {
11695 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11696 }
11697 
11698 static int
11699 test_AES_GMAC_authentication_verify_test_case_2(void)
11700 {
11701 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11702 }
11703 
11704 static int
11705 test_AES_GMAC_authentication_verify_test_case_3(void)
11706 {
11707 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11708 }
11709 
11710 static int
11711 test_AES_GMAC_authentication_verify_test_case_4(void)
11712 {
11713 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11714 }
11715 
11716 static int
11717 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11718 				uint32_t fragsz)
11719 {
11720 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11721 	struct crypto_unittest_params *ut_params = &unittest_params;
11722 	struct rte_cryptodev_info dev_info;
11723 	uint64_t feature_flags;
11724 	unsigned int trn_data = 0;
11725 	void *digest_mem = NULL;
11726 	uint32_t segs = 1;
11727 	unsigned int to_trn = 0;
11728 	struct rte_mbuf *buf = NULL;
11729 	uint8_t *auth_tag, *plaintext;
11730 	int retval;
11731 
11732 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11733 			      "No GMAC length in the source data");
11734 
11735 	/* Verify the capabilities */
11736 	struct rte_cryptodev_sym_capability_idx cap_idx;
11737 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11738 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11739 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11740 			&cap_idx) == NULL)
11741 		return TEST_SKIPPED;
11742 
11743 	/* Check for any input SGL support */
11744 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11745 	feature_flags = dev_info.feature_flags;
11746 
11747 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11748 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11749 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11750 		return TEST_SKIPPED;
11751 
11752 	if (fragsz > tdata->plaintext.len)
11753 		fragsz = tdata->plaintext.len;
11754 
11755 	uint16_t plaintext_len = fragsz;
11756 
11757 	retval = create_gmac_session(ts_params->valid_devs[0],
11758 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11759 
11760 	if (retval < 0)
11761 		return retval;
11762 
11763 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11764 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11765 			"Failed to allocate input buffer in mempool");
11766 
11767 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11768 			rte_pktmbuf_tailroom(ut_params->ibuf));
11769 
11770 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11771 				plaintext_len);
11772 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11773 
11774 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11775 
11776 	trn_data += plaintext_len;
11777 
11778 	buf = ut_params->ibuf;
11779 
11780 	/*
11781 	 * Loop until no more fragments
11782 	 */
11783 
11784 	while (trn_data < tdata->plaintext.len) {
11785 		++segs;
11786 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11787 				(tdata->plaintext.len - trn_data) : fragsz;
11788 
11789 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11790 		buf = buf->next;
11791 
11792 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11793 				rte_pktmbuf_tailroom(buf));
11794 
11795 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11796 				to_trn);
11797 
11798 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11799 				to_trn);
11800 		trn_data += to_trn;
11801 		if (trn_data  == tdata->plaintext.len)
11802 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11803 					tdata->gmac_tag.len);
11804 	}
11805 	ut_params->ibuf->nb_segs = segs;
11806 
11807 	/*
11808 	 * Place digest at the end of the last buffer
11809 	 */
11810 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11811 
11812 	if (!digest_mem) {
11813 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11814 				+ tdata->gmac_tag.len);
11815 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11816 				tdata->plaintext.len);
11817 	}
11818 
11819 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11820 			tdata, digest_mem, digest_phys);
11821 
11822 	if (retval < 0)
11823 		return retval;
11824 
11825 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11826 
11827 	ut_params->op->sym->m_src = ut_params->ibuf;
11828 
11829 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11830 		return TEST_SKIPPED;
11831 
11832 	TEST_ASSERT_NOT_NULL(
11833 		process_crypto_request(ts_params->valid_devs[0],
11834 		ut_params->op), "failed to process sym crypto op");
11835 
11836 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11837 			"crypto op processing failed");
11838 
11839 	auth_tag = digest_mem;
11840 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11841 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11842 			auth_tag,
11843 			tdata->gmac_tag.data,
11844 			tdata->gmac_tag.len,
11845 			"GMAC Generated auth tag not as expected");
11846 
11847 	return 0;
11848 }
11849 
11850 /* Segment size not multiple of block size (16B) */
11851 static int
11852 test_AES_GMAC_authentication_SGL_40B(void)
11853 {
11854 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11855 }
11856 
11857 static int
11858 test_AES_GMAC_authentication_SGL_80B(void)
11859 {
11860 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11861 }
11862 
11863 static int
11864 test_AES_GMAC_authentication_SGL_2048B(void)
11865 {
11866 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11867 }
11868 
11869 /* Segment size not multiple of block size (16B) */
11870 static int
11871 test_AES_GMAC_authentication_SGL_2047B(void)
11872 {
11873 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11874 }
11875 
11876 struct test_crypto_vector {
11877 	enum rte_crypto_cipher_algorithm crypto_algo;
11878 	unsigned int cipher_offset;
11879 	unsigned int cipher_len;
11880 
11881 	struct {
11882 		uint8_t data[64];
11883 		unsigned int len;
11884 	} cipher_key;
11885 
11886 	struct {
11887 		uint8_t data[64];
11888 		unsigned int len;
11889 	} iv;
11890 
11891 	struct {
11892 		const uint8_t *data;
11893 		unsigned int len;
11894 	} plaintext;
11895 
11896 	struct {
11897 		const uint8_t *data;
11898 		unsigned int len;
11899 	} ciphertext;
11900 
11901 	enum rte_crypto_auth_algorithm auth_algo;
11902 	unsigned int auth_offset;
11903 
11904 	struct {
11905 		uint8_t data[128];
11906 		unsigned int len;
11907 	} auth_key;
11908 
11909 	struct {
11910 		const uint8_t *data;
11911 		unsigned int len;
11912 	} aad;
11913 
11914 	struct {
11915 		uint8_t data[128];
11916 		unsigned int len;
11917 	} digest;
11918 };
11919 
11920 static const struct test_crypto_vector
11921 hmac_sha1_test_crypto_vector = {
11922 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11923 	.plaintext = {
11924 		.data = plaintext_hash,
11925 		.len = 512
11926 	},
11927 	.auth_key = {
11928 		.data = {
11929 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11930 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11931 			0xDE, 0xF4, 0xDE, 0xAD
11932 		},
11933 		.len = 20
11934 	},
11935 	.digest = {
11936 		.data = {
11937 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11938 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11939 			0x3F, 0x91, 0x64, 0x59
11940 		},
11941 		.len = 20
11942 	}
11943 };
11944 
11945 static const struct test_crypto_vector
11946 aes128_gmac_test_vector = {
11947 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11948 	.plaintext = {
11949 		.data = plaintext_hash,
11950 		.len = 512
11951 	},
11952 	.iv = {
11953 		.data = {
11954 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11955 			0x08, 0x09, 0x0A, 0x0B
11956 		},
11957 		.len = 12
11958 	},
11959 	.auth_key = {
11960 		.data = {
11961 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11962 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11963 		},
11964 		.len = 16
11965 	},
11966 	.digest = {
11967 		.data = {
11968 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11969 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11970 		},
11971 		.len = 16
11972 	}
11973 };
11974 
11975 static const struct test_crypto_vector
11976 aes128cbc_hmac_sha1_test_vector = {
11977 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11978 	.cipher_offset = 0,
11979 	.cipher_len = 512,
11980 	.cipher_key = {
11981 		.data = {
11982 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11983 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11984 		},
11985 		.len = 16
11986 	},
11987 	.iv = {
11988 		.data = {
11989 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11990 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11991 		},
11992 		.len = 16
11993 	},
11994 	.plaintext = {
11995 		.data = plaintext_hash,
11996 		.len = 512
11997 	},
11998 	.ciphertext = {
11999 		.data = ciphertext512_aes128cbc,
12000 		.len = 512
12001 	},
12002 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12003 	.auth_offset = 0,
12004 	.auth_key = {
12005 		.data = {
12006 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12007 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12008 			0xDE, 0xF4, 0xDE, 0xAD
12009 		},
12010 		.len = 20
12011 	},
12012 	.digest = {
12013 		.data = {
12014 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
12015 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
12016 			0x18, 0x8C, 0x1D, 0x32
12017 		},
12018 		.len = 20
12019 	}
12020 };
12021 
12022 static const struct test_crypto_vector
12023 aes128cbc_hmac_sha1_aad_test_vector = {
12024 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
12025 	.cipher_offset = 8,
12026 	.cipher_len = 496,
12027 	.cipher_key = {
12028 		.data = {
12029 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
12030 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
12031 		},
12032 		.len = 16
12033 	},
12034 	.iv = {
12035 		.data = {
12036 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
12037 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
12038 		},
12039 		.len = 16
12040 	},
12041 	.plaintext = {
12042 		.data = plaintext_hash,
12043 		.len = 512
12044 	},
12045 	.ciphertext = {
12046 		.data = ciphertext512_aes128cbc_aad,
12047 		.len = 512
12048 	},
12049 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
12050 	.auth_offset = 0,
12051 	.auth_key = {
12052 		.data = {
12053 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
12054 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
12055 			0xDE, 0xF4, 0xDE, 0xAD
12056 		},
12057 		.len = 20
12058 	},
12059 	.digest = {
12060 		.data = {
12061 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
12062 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
12063 			0x62, 0x0F, 0xFB, 0x10
12064 		},
12065 		.len = 20
12066 	}
12067 };
12068 
12069 static void
12070 data_corruption(uint8_t *data)
12071 {
12072 	data[0] += 1;
12073 }
12074 
12075 static void
12076 tag_corruption(uint8_t *data, unsigned int tag_offset)
12077 {
12078 	data[tag_offset] += 1;
12079 }
12080 
12081 static int
12082 create_auth_session(struct crypto_unittest_params *ut_params,
12083 		uint8_t dev_id,
12084 		const struct test_crypto_vector *reference,
12085 		enum rte_crypto_auth_operation auth_op)
12086 {
12087 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12088 	uint8_t auth_key[reference->auth_key.len + 1];
12089 
12090 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12091 
12092 	/* Setup Authentication Parameters */
12093 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12094 	ut_params->auth_xform.auth.op = auth_op;
12095 	ut_params->auth_xform.next = NULL;
12096 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12097 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12098 	ut_params->auth_xform.auth.key.data = auth_key;
12099 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12100 
12101 	/* Create Crypto session*/
12102 	ut_params->sess = rte_cryptodev_sym_session_create(
12103 			ts_params->session_mpool);
12104 
12105 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12106 				&ut_params->auth_xform,
12107 				ts_params->session_priv_mpool);
12108 
12109 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12110 
12111 	return 0;
12112 }
12113 
12114 static int
12115 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
12116 		uint8_t dev_id,
12117 		const struct test_crypto_vector *reference,
12118 		enum rte_crypto_auth_operation auth_op,
12119 		enum rte_crypto_cipher_operation cipher_op)
12120 {
12121 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12122 	uint8_t cipher_key[reference->cipher_key.len + 1];
12123 	uint8_t auth_key[reference->auth_key.len + 1];
12124 
12125 	memcpy(cipher_key, reference->cipher_key.data,
12126 			reference->cipher_key.len);
12127 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12128 
12129 	/* Setup Authentication Parameters */
12130 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12131 	ut_params->auth_xform.auth.op = auth_op;
12132 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12133 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12134 	ut_params->auth_xform.auth.key.data = auth_key;
12135 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12136 
12137 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
12138 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12139 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
12140 	} else {
12141 		ut_params->auth_xform.next = &ut_params->cipher_xform;
12142 
12143 		/* Setup Cipher Parameters */
12144 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12145 		ut_params->cipher_xform.next = NULL;
12146 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12147 		ut_params->cipher_xform.cipher.op = cipher_op;
12148 		ut_params->cipher_xform.cipher.key.data = cipher_key;
12149 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12150 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12151 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12152 	}
12153 
12154 	/* Create Crypto session*/
12155 	ut_params->sess = rte_cryptodev_sym_session_create(
12156 			ts_params->session_mpool);
12157 
12158 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12159 				&ut_params->auth_xform,
12160 				ts_params->session_priv_mpool);
12161 
12162 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12163 
12164 	return 0;
12165 }
12166 
12167 static int
12168 create_auth_operation(struct crypto_testsuite_params *ts_params,
12169 		struct crypto_unittest_params *ut_params,
12170 		const struct test_crypto_vector *reference,
12171 		unsigned int auth_generate)
12172 {
12173 	/* Generate Crypto op data structure */
12174 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12175 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12176 	TEST_ASSERT_NOT_NULL(ut_params->op,
12177 			"Failed to allocate pktmbuf offload");
12178 
12179 	/* Set crypto operation data parameters */
12180 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12181 
12182 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12183 
12184 	/* set crypto operation source mbuf */
12185 	sym_op->m_src = ut_params->ibuf;
12186 
12187 	/* digest */
12188 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12189 			ut_params->ibuf, reference->digest.len);
12190 
12191 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12192 			"no room to append auth tag");
12193 
12194 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12195 			ut_params->ibuf, reference->plaintext.len);
12196 
12197 	if (auth_generate)
12198 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12199 	else
12200 		memcpy(sym_op->auth.digest.data,
12201 				reference->digest.data,
12202 				reference->digest.len);
12203 
12204 	debug_hexdump(stdout, "digest:",
12205 			sym_op->auth.digest.data,
12206 			reference->digest.len);
12207 
12208 	sym_op->auth.data.length = reference->plaintext.len;
12209 	sym_op->auth.data.offset = 0;
12210 
12211 	return 0;
12212 }
12213 
12214 static int
12215 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
12216 		struct crypto_unittest_params *ut_params,
12217 		const struct test_crypto_vector *reference,
12218 		unsigned int auth_generate)
12219 {
12220 	/* Generate Crypto op data structure */
12221 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12222 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12223 	TEST_ASSERT_NOT_NULL(ut_params->op,
12224 			"Failed to allocate pktmbuf offload");
12225 
12226 	/* Set crypto operation data parameters */
12227 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12228 
12229 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12230 
12231 	/* set crypto operation source mbuf */
12232 	sym_op->m_src = ut_params->ibuf;
12233 
12234 	/* digest */
12235 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12236 			ut_params->ibuf, reference->digest.len);
12237 
12238 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12239 			"no room to append auth tag");
12240 
12241 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12242 			ut_params->ibuf, reference->ciphertext.len);
12243 
12244 	if (auth_generate)
12245 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12246 	else
12247 		memcpy(sym_op->auth.digest.data,
12248 				reference->digest.data,
12249 				reference->digest.len);
12250 
12251 	debug_hexdump(stdout, "digest:",
12252 			sym_op->auth.digest.data,
12253 			reference->digest.len);
12254 
12255 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12256 			reference->iv.data, reference->iv.len);
12257 
12258 	sym_op->cipher.data.length = 0;
12259 	sym_op->cipher.data.offset = 0;
12260 
12261 	sym_op->auth.data.length = reference->plaintext.len;
12262 	sym_op->auth.data.offset = 0;
12263 
12264 	return 0;
12265 }
12266 
12267 static int
12268 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
12269 		struct crypto_unittest_params *ut_params,
12270 		const struct test_crypto_vector *reference,
12271 		unsigned int auth_generate)
12272 {
12273 	/* Generate Crypto op data structure */
12274 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12275 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12276 	TEST_ASSERT_NOT_NULL(ut_params->op,
12277 			"Failed to allocate pktmbuf offload");
12278 
12279 	/* Set crypto operation data parameters */
12280 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12281 
12282 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12283 
12284 	/* set crypto operation source mbuf */
12285 	sym_op->m_src = ut_params->ibuf;
12286 
12287 	/* digest */
12288 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12289 			ut_params->ibuf, reference->digest.len);
12290 
12291 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12292 			"no room to append auth tag");
12293 
12294 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12295 			ut_params->ibuf, reference->ciphertext.len);
12296 
12297 	if (auth_generate)
12298 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
12299 	else
12300 		memcpy(sym_op->auth.digest.data,
12301 				reference->digest.data,
12302 				reference->digest.len);
12303 
12304 	debug_hexdump(stdout, "digest:",
12305 			sym_op->auth.digest.data,
12306 			reference->digest.len);
12307 
12308 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
12309 			reference->iv.data, reference->iv.len);
12310 
12311 	sym_op->cipher.data.length = reference->cipher_len;
12312 	sym_op->cipher.data.offset = reference->cipher_offset;
12313 
12314 	sym_op->auth.data.length = reference->plaintext.len;
12315 	sym_op->auth.data.offset = reference->auth_offset;
12316 
12317 	return 0;
12318 }
12319 
12320 static int
12321 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12322 		struct crypto_unittest_params *ut_params,
12323 		const struct test_crypto_vector *reference)
12324 {
12325 	return create_auth_operation(ts_params, ut_params, reference, 0);
12326 }
12327 
12328 static int
12329 create_auth_verify_GMAC_operation(
12330 		struct crypto_testsuite_params *ts_params,
12331 		struct crypto_unittest_params *ut_params,
12332 		const struct test_crypto_vector *reference)
12333 {
12334 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12335 }
12336 
12337 static int
12338 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12339 		struct crypto_unittest_params *ut_params,
12340 		const struct test_crypto_vector *reference)
12341 {
12342 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12343 }
12344 
12345 static int
12346 test_authentication_verify_fail_when_data_corruption(
12347 		struct crypto_testsuite_params *ts_params,
12348 		struct crypto_unittest_params *ut_params,
12349 		const struct test_crypto_vector *reference,
12350 		unsigned int data_corrupted)
12351 {
12352 	int retval;
12353 
12354 	uint8_t *plaintext;
12355 	struct rte_cryptodev_info dev_info;
12356 
12357 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12358 	uint64_t feat_flags = dev_info.feature_flags;
12359 
12360 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12361 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12362 		printf("Device doesn't support RAW data-path APIs.\n");
12363 		return TEST_SKIPPED;
12364 	}
12365 
12366 	/* Verify the capabilities */
12367 	struct rte_cryptodev_sym_capability_idx cap_idx;
12368 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12369 	cap_idx.algo.auth = reference->auth_algo;
12370 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12371 			&cap_idx) == NULL)
12372 		return TEST_SKIPPED;
12373 
12374 
12375 	/* Create session */
12376 	retval = create_auth_session(ut_params,
12377 			ts_params->valid_devs[0],
12378 			reference,
12379 			RTE_CRYPTO_AUTH_OP_VERIFY);
12380 	if (retval < 0)
12381 		return retval;
12382 
12383 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12384 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12385 			"Failed to allocate input buffer in mempool");
12386 
12387 	/* clear mbuf payload */
12388 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12389 			rte_pktmbuf_tailroom(ut_params->ibuf));
12390 
12391 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12392 			reference->plaintext.len);
12393 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12394 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12395 
12396 	debug_hexdump(stdout, "plaintext:", plaintext,
12397 		reference->plaintext.len);
12398 
12399 	/* Create operation */
12400 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
12401 
12402 	if (retval < 0)
12403 		return retval;
12404 
12405 	if (data_corrupted)
12406 		data_corruption(plaintext);
12407 	else
12408 		tag_corruption(plaintext, reference->plaintext.len);
12409 
12410 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12411 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12412 			ut_params->op);
12413 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12414 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12415 			"authentication not failed");
12416 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12417 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12418 				ut_params->op, 0, 1, 0, 0);
12419 	else {
12420 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12421 			ut_params->op);
12422 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12423 	}
12424 
12425 	return 0;
12426 }
12427 
12428 static int
12429 test_authentication_verify_GMAC_fail_when_corruption(
12430 		struct crypto_testsuite_params *ts_params,
12431 		struct crypto_unittest_params *ut_params,
12432 		const struct test_crypto_vector *reference,
12433 		unsigned int data_corrupted)
12434 {
12435 	int retval;
12436 	uint8_t *plaintext;
12437 	struct rte_cryptodev_info dev_info;
12438 
12439 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12440 	uint64_t feat_flags = dev_info.feature_flags;
12441 
12442 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12443 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12444 		printf("Device doesn't support RAW data-path APIs.\n");
12445 		return TEST_SKIPPED;
12446 	}
12447 
12448 	/* Verify the capabilities */
12449 	struct rte_cryptodev_sym_capability_idx cap_idx;
12450 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12451 	cap_idx.algo.auth = reference->auth_algo;
12452 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12453 			&cap_idx) == NULL)
12454 		return TEST_SKIPPED;
12455 
12456 	/* Create session */
12457 	retval = create_auth_cipher_session(ut_params,
12458 			ts_params->valid_devs[0],
12459 			reference,
12460 			RTE_CRYPTO_AUTH_OP_VERIFY,
12461 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12462 	if (retval < 0)
12463 		return retval;
12464 
12465 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12466 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12467 			"Failed to allocate input buffer in mempool");
12468 
12469 	/* clear mbuf payload */
12470 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12471 			rte_pktmbuf_tailroom(ut_params->ibuf));
12472 
12473 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12474 			reference->plaintext.len);
12475 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12476 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12477 
12478 	debug_hexdump(stdout, "plaintext:", plaintext,
12479 		reference->plaintext.len);
12480 
12481 	/* Create operation */
12482 	retval = create_auth_verify_GMAC_operation(ts_params,
12483 			ut_params,
12484 			reference);
12485 
12486 	if (retval < 0)
12487 		return retval;
12488 
12489 	if (data_corrupted)
12490 		data_corruption(plaintext);
12491 	else
12492 		tag_corruption(plaintext, reference->aad.len);
12493 
12494 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12495 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12496 			ut_params->op);
12497 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12498 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12499 			"authentication not failed");
12500 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12501 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12502 				ut_params->op, 0, 1, 0, 0);
12503 	else {
12504 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12505 			ut_params->op);
12506 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12507 	}
12508 
12509 	return 0;
12510 }
12511 
12512 static int
12513 test_authenticated_decryption_fail_when_corruption(
12514 		struct crypto_testsuite_params *ts_params,
12515 		struct crypto_unittest_params *ut_params,
12516 		const struct test_crypto_vector *reference,
12517 		unsigned int data_corrupted)
12518 {
12519 	int retval;
12520 
12521 	uint8_t *ciphertext;
12522 	struct rte_cryptodev_info dev_info;
12523 
12524 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12525 	uint64_t feat_flags = dev_info.feature_flags;
12526 
12527 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12528 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12529 		printf("Device doesn't support RAW data-path APIs.\n");
12530 		return TEST_SKIPPED;
12531 	}
12532 
12533 	/* Verify the capabilities */
12534 	struct rte_cryptodev_sym_capability_idx cap_idx;
12535 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12536 	cap_idx.algo.auth = reference->auth_algo;
12537 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12538 			&cap_idx) == NULL)
12539 		return TEST_SKIPPED;
12540 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12541 	cap_idx.algo.cipher = reference->crypto_algo;
12542 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12543 			&cap_idx) == NULL)
12544 		return TEST_SKIPPED;
12545 
12546 	/* Create session */
12547 	retval = create_auth_cipher_session(ut_params,
12548 			ts_params->valid_devs[0],
12549 			reference,
12550 			RTE_CRYPTO_AUTH_OP_VERIFY,
12551 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12552 	if (retval < 0)
12553 		return retval;
12554 
12555 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12556 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12557 			"Failed to allocate input buffer in mempool");
12558 
12559 	/* clear mbuf payload */
12560 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12561 			rte_pktmbuf_tailroom(ut_params->ibuf));
12562 
12563 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12564 			reference->ciphertext.len);
12565 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12566 	memcpy(ciphertext, reference->ciphertext.data,
12567 			reference->ciphertext.len);
12568 
12569 	/* Create operation */
12570 	retval = create_cipher_auth_verify_operation(ts_params,
12571 			ut_params,
12572 			reference);
12573 
12574 	if (retval < 0)
12575 		return retval;
12576 
12577 	if (data_corrupted)
12578 		data_corruption(ciphertext);
12579 	else
12580 		tag_corruption(ciphertext, reference->ciphertext.len);
12581 
12582 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12583 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12584 			ut_params->op);
12585 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12586 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12587 			"authentication not failed");
12588 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12589 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12590 				ut_params->op, 1, 1, 0, 0);
12591 	else {
12592 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12593 			ut_params->op);
12594 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12595 	}
12596 
12597 	return 0;
12598 }
12599 
12600 static int
12601 test_authenticated_encrypt_with_esn(
12602 		struct crypto_testsuite_params *ts_params,
12603 		struct crypto_unittest_params *ut_params,
12604 		const struct test_crypto_vector *reference)
12605 {
12606 	int retval;
12607 
12608 	uint8_t *authciphertext, *plaintext, *auth_tag;
12609 	uint16_t plaintext_pad_len;
12610 	uint8_t cipher_key[reference->cipher_key.len + 1];
12611 	uint8_t auth_key[reference->auth_key.len + 1];
12612 	struct rte_cryptodev_info dev_info;
12613 
12614 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12615 	uint64_t feat_flags = dev_info.feature_flags;
12616 
12617 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12618 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12619 		printf("Device doesn't support RAW data-path APIs.\n");
12620 		return TEST_SKIPPED;
12621 	}
12622 
12623 	/* Verify the capabilities */
12624 	struct rte_cryptodev_sym_capability_idx cap_idx;
12625 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12626 	cap_idx.algo.auth = reference->auth_algo;
12627 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12628 			&cap_idx) == NULL)
12629 		return TEST_SKIPPED;
12630 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12631 	cap_idx.algo.cipher = reference->crypto_algo;
12632 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12633 			&cap_idx) == NULL)
12634 		return TEST_SKIPPED;
12635 
12636 	/* Create session */
12637 	memcpy(cipher_key, reference->cipher_key.data,
12638 			reference->cipher_key.len);
12639 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12640 
12641 	/* Setup Cipher Parameters */
12642 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12643 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12644 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12645 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12646 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12647 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12648 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12649 
12650 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12651 
12652 	/* Setup Authentication Parameters */
12653 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12654 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12655 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12656 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12657 	ut_params->auth_xform.auth.key.data = auth_key;
12658 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12659 	ut_params->auth_xform.next = NULL;
12660 
12661 	/* Create Crypto session*/
12662 	ut_params->sess = rte_cryptodev_sym_session_create(
12663 			ts_params->session_mpool);
12664 
12665 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12666 				ut_params->sess,
12667 				&ut_params->cipher_xform,
12668 				ts_params->session_priv_mpool);
12669 
12670 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12671 
12672 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12673 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12674 			"Failed to allocate input buffer in mempool");
12675 
12676 	/* clear mbuf payload */
12677 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12678 			rte_pktmbuf_tailroom(ut_params->ibuf));
12679 
12680 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12681 			reference->plaintext.len);
12682 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12683 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12684 
12685 	/* Create operation */
12686 	retval = create_cipher_auth_operation(ts_params,
12687 			ut_params,
12688 			reference, 0);
12689 
12690 	if (retval < 0)
12691 		return retval;
12692 
12693 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12694 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12695 			ut_params->op);
12696 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12697 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12698 				ut_params->op, 1, 1, 0, 0);
12699 	else
12700 		ut_params->op = process_crypto_request(
12701 			ts_params->valid_devs[0], ut_params->op);
12702 
12703 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12704 
12705 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12706 			"crypto op processing failed");
12707 
12708 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12709 
12710 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12711 			ut_params->op->sym->auth.data.offset);
12712 	auth_tag = authciphertext + plaintext_pad_len;
12713 	debug_hexdump(stdout, "ciphertext:", authciphertext,
12714 			reference->ciphertext.len);
12715 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12716 
12717 	/* Validate obuf */
12718 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12719 			authciphertext,
12720 			reference->ciphertext.data,
12721 			reference->ciphertext.len,
12722 			"Ciphertext data not as expected");
12723 
12724 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12725 			auth_tag,
12726 			reference->digest.data,
12727 			reference->digest.len,
12728 			"Generated digest not as expected");
12729 
12730 	return TEST_SUCCESS;
12731 
12732 }
12733 
12734 static int
12735 test_authenticated_decrypt_with_esn(
12736 		struct crypto_testsuite_params *ts_params,
12737 		struct crypto_unittest_params *ut_params,
12738 		const struct test_crypto_vector *reference)
12739 {
12740 	int retval;
12741 
12742 	uint8_t *ciphertext;
12743 	uint8_t cipher_key[reference->cipher_key.len + 1];
12744 	uint8_t auth_key[reference->auth_key.len + 1];
12745 	struct rte_cryptodev_info dev_info;
12746 
12747 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12748 	uint64_t feat_flags = dev_info.feature_flags;
12749 
12750 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12751 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12752 		printf("Device doesn't support RAW data-path APIs.\n");
12753 		return TEST_SKIPPED;
12754 	}
12755 
12756 	/* Verify the capabilities */
12757 	struct rte_cryptodev_sym_capability_idx cap_idx;
12758 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12759 	cap_idx.algo.auth = reference->auth_algo;
12760 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12761 			&cap_idx) == NULL)
12762 		return TEST_SKIPPED;
12763 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12764 	cap_idx.algo.cipher = reference->crypto_algo;
12765 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12766 			&cap_idx) == NULL)
12767 		return TEST_SKIPPED;
12768 
12769 	/* Create session */
12770 	memcpy(cipher_key, reference->cipher_key.data,
12771 			reference->cipher_key.len);
12772 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12773 
12774 	/* Setup Authentication Parameters */
12775 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12776 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12777 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12778 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12779 	ut_params->auth_xform.auth.key.data = auth_key;
12780 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12781 	ut_params->auth_xform.next = &ut_params->cipher_xform;
12782 
12783 	/* Setup Cipher Parameters */
12784 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12785 	ut_params->cipher_xform.next = NULL;
12786 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12787 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12788 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12789 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12790 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12791 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12792 
12793 	/* Create Crypto session*/
12794 	ut_params->sess = rte_cryptodev_sym_session_create(
12795 			ts_params->session_mpool);
12796 
12797 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12798 				ut_params->sess,
12799 				&ut_params->auth_xform,
12800 				ts_params->session_priv_mpool);
12801 
12802 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12803 
12804 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12805 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12806 			"Failed to allocate input buffer in mempool");
12807 
12808 	/* clear mbuf payload */
12809 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12810 			rte_pktmbuf_tailroom(ut_params->ibuf));
12811 
12812 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12813 			reference->ciphertext.len);
12814 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12815 	memcpy(ciphertext, reference->ciphertext.data,
12816 			reference->ciphertext.len);
12817 
12818 	/* Create operation */
12819 	retval = create_cipher_auth_verify_operation(ts_params,
12820 			ut_params,
12821 			reference);
12822 
12823 	if (retval < 0)
12824 		return retval;
12825 
12826 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12827 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12828 			ut_params->op);
12829 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12830 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12831 				ut_params->op, 1, 1, 0, 0);
12832 	else
12833 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12834 			ut_params->op);
12835 
12836 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12837 	TEST_ASSERT_EQUAL(ut_params->op->status,
12838 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12839 			"crypto op processing passed");
12840 
12841 	ut_params->obuf = ut_params->op->sym->m_src;
12842 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12843 
12844 	return 0;
12845 }
12846 
12847 static int
12848 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12849 		const struct aead_test_data *tdata,
12850 		void *digest_mem, uint64_t digest_phys)
12851 {
12852 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12853 	struct crypto_unittest_params *ut_params = &unittest_params;
12854 
12855 	const unsigned int auth_tag_len = tdata->auth_tag.len;
12856 	const unsigned int iv_len = tdata->iv.len;
12857 	unsigned int aad_len = tdata->aad.len;
12858 	unsigned int aad_len_pad = 0;
12859 
12860 	/* Generate Crypto op data structure */
12861 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12862 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12863 	TEST_ASSERT_NOT_NULL(ut_params->op,
12864 		"Failed to allocate symmetric crypto operation struct");
12865 
12866 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12867 
12868 	sym_op->aead.digest.data = digest_mem;
12869 
12870 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12871 			"no room to append digest");
12872 
12873 	sym_op->aead.digest.phys_addr = digest_phys;
12874 
12875 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12876 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12877 				auth_tag_len);
12878 		debug_hexdump(stdout, "digest:",
12879 				sym_op->aead.digest.data,
12880 				auth_tag_len);
12881 	}
12882 
12883 	/* Append aad data */
12884 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12885 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12886 				uint8_t *, IV_OFFSET);
12887 
12888 		/* Copy IV 1 byte after the IV pointer, according to the API */
12889 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12890 
12891 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12892 
12893 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12894 				ut_params->ibuf, aad_len);
12895 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12896 				"no room to prepend aad");
12897 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12898 				ut_params->ibuf);
12899 
12900 		memset(sym_op->aead.aad.data, 0, aad_len);
12901 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
12902 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12903 
12904 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12905 		debug_hexdump(stdout, "aad:",
12906 				sym_op->aead.aad.data, aad_len);
12907 	} else {
12908 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12909 				uint8_t *, IV_OFFSET);
12910 
12911 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12912 
12913 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12914 
12915 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12916 				ut_params->ibuf, aad_len_pad);
12917 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12918 				"no room to prepend aad");
12919 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12920 				ut_params->ibuf);
12921 
12922 		memset(sym_op->aead.aad.data, 0, aad_len);
12923 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12924 
12925 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12926 		debug_hexdump(stdout, "aad:",
12927 				sym_op->aead.aad.data, aad_len);
12928 	}
12929 
12930 	sym_op->aead.data.length = tdata->plaintext.len;
12931 	sym_op->aead.data.offset = aad_len_pad;
12932 
12933 	return 0;
12934 }
12935 
12936 #define SGL_MAX_NO	16
12937 
12938 static int
12939 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12940 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12941 {
12942 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12943 	struct crypto_unittest_params *ut_params = &unittest_params;
12944 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12945 	int retval;
12946 	int to_trn = 0;
12947 	int to_trn_tbl[SGL_MAX_NO];
12948 	int segs = 1;
12949 	unsigned int trn_data = 0;
12950 	uint8_t *plaintext, *ciphertext, *auth_tag;
12951 	struct rte_cryptodev_info dev_info;
12952 
12953 	/* Verify the capabilities */
12954 	struct rte_cryptodev_sym_capability_idx cap_idx;
12955 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12956 	cap_idx.algo.aead = tdata->algo;
12957 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12958 			&cap_idx) == NULL)
12959 		return TEST_SKIPPED;
12960 
12961 	/* OOP not supported with CPU crypto */
12962 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12963 		return TEST_SKIPPED;
12964 
12965 	/* Detailed check for the particular SGL support flag */
12966 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12967 	if (!oop) {
12968 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12969 		if (sgl_in && (!(dev_info.feature_flags &
12970 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12971 			return TEST_SKIPPED;
12972 
12973 		uint64_t feat_flags = dev_info.feature_flags;
12974 
12975 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12976 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12977 			printf("Device doesn't support RAW data-path APIs.\n");
12978 			return TEST_SKIPPED;
12979 		}
12980 	} else {
12981 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12982 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12983 				tdata->plaintext.len;
12984 		/* Raw data path API does not support OOP */
12985 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12986 			return TEST_SKIPPED;
12987 		if (sgl_in && !sgl_out) {
12988 			if (!(dev_info.feature_flags &
12989 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12990 				return TEST_SKIPPED;
12991 		} else if (!sgl_in && sgl_out) {
12992 			if (!(dev_info.feature_flags &
12993 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12994 				return TEST_SKIPPED;
12995 		} else if (sgl_in && sgl_out) {
12996 			if (!(dev_info.feature_flags &
12997 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12998 				return TEST_SKIPPED;
12999 		}
13000 	}
13001 
13002 	if (fragsz > tdata->plaintext.len)
13003 		fragsz = tdata->plaintext.len;
13004 
13005 	uint16_t plaintext_len = fragsz;
13006 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
13007 
13008 	if (fragsz_oop > tdata->plaintext.len)
13009 		frag_size_oop = tdata->plaintext.len;
13010 
13011 	int ecx = 0;
13012 	void *digest_mem = NULL;
13013 
13014 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
13015 
13016 	if (tdata->plaintext.len % fragsz != 0) {
13017 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
13018 			return 1;
13019 	}	else {
13020 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
13021 			return 1;
13022 	}
13023 
13024 	/*
13025 	 * For out-op-place we need to alloc another mbuf
13026 	 */
13027 	if (oop) {
13028 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13029 		rte_pktmbuf_append(ut_params->obuf,
13030 				frag_size_oop + prepend_len);
13031 		buf_oop = ut_params->obuf;
13032 	}
13033 
13034 	/* Create AEAD session */
13035 	retval = create_aead_session(ts_params->valid_devs[0],
13036 			tdata->algo,
13037 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
13038 			tdata->key.data, tdata->key.len,
13039 			tdata->aad.len, tdata->auth_tag.len,
13040 			tdata->iv.len);
13041 	if (retval < 0)
13042 		return retval;
13043 
13044 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13045 
13046 	/* clear mbuf payload */
13047 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13048 			rte_pktmbuf_tailroom(ut_params->ibuf));
13049 
13050 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13051 			plaintext_len);
13052 
13053 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13054 
13055 	trn_data += plaintext_len;
13056 
13057 	buf = ut_params->ibuf;
13058 
13059 	/*
13060 	 * Loop until no more fragments
13061 	 */
13062 
13063 	while (trn_data < tdata->plaintext.len) {
13064 		++segs;
13065 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13066 				(tdata->plaintext.len - trn_data) : fragsz;
13067 
13068 		to_trn_tbl[ecx++] = to_trn;
13069 
13070 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13071 		buf = buf->next;
13072 
13073 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13074 				rte_pktmbuf_tailroom(buf));
13075 
13076 		/* OOP */
13077 		if (oop && !fragsz_oop) {
13078 			buf_last_oop = buf_oop->next =
13079 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13080 			buf_oop = buf_oop->next;
13081 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13082 					0, rte_pktmbuf_tailroom(buf_oop));
13083 			rte_pktmbuf_append(buf_oop, to_trn);
13084 		}
13085 
13086 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13087 				to_trn);
13088 
13089 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13090 				to_trn);
13091 		trn_data += to_trn;
13092 		if (trn_data  == tdata->plaintext.len) {
13093 			if (oop) {
13094 				if (!fragsz_oop)
13095 					digest_mem = rte_pktmbuf_append(buf_oop,
13096 						tdata->auth_tag.len);
13097 			} else
13098 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13099 					tdata->auth_tag.len);
13100 		}
13101 	}
13102 
13103 	uint64_t digest_phys = 0;
13104 
13105 	ut_params->ibuf->nb_segs = segs;
13106 
13107 	segs = 1;
13108 	if (fragsz_oop && oop) {
13109 		to_trn = 0;
13110 		ecx = 0;
13111 
13112 		if (frag_size_oop == tdata->plaintext.len) {
13113 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
13114 				tdata->auth_tag.len);
13115 
13116 			digest_phys = rte_pktmbuf_iova_offset(
13117 					ut_params->obuf,
13118 					tdata->plaintext.len + prepend_len);
13119 		}
13120 
13121 		trn_data = frag_size_oop;
13122 		while (trn_data < tdata->plaintext.len) {
13123 			++segs;
13124 			to_trn =
13125 				(tdata->plaintext.len - trn_data <
13126 						frag_size_oop) ?
13127 				(tdata->plaintext.len - trn_data) :
13128 						frag_size_oop;
13129 
13130 			to_trn_tbl[ecx++] = to_trn;
13131 
13132 			buf_last_oop = buf_oop->next =
13133 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
13134 			buf_oop = buf_oop->next;
13135 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
13136 					0, rte_pktmbuf_tailroom(buf_oop));
13137 			rte_pktmbuf_append(buf_oop, to_trn);
13138 
13139 			trn_data += to_trn;
13140 
13141 			if (trn_data  == tdata->plaintext.len) {
13142 				digest_mem = rte_pktmbuf_append(buf_oop,
13143 					tdata->auth_tag.len);
13144 			}
13145 		}
13146 
13147 		ut_params->obuf->nb_segs = segs;
13148 	}
13149 
13150 	/*
13151 	 * Place digest at the end of the last buffer
13152 	 */
13153 	if (!digest_phys)
13154 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13155 	if (oop && buf_last_oop)
13156 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
13157 
13158 	if (!digest_mem && !oop) {
13159 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13160 				+ tdata->auth_tag.len);
13161 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13162 				tdata->plaintext.len);
13163 	}
13164 
13165 	/* Create AEAD operation */
13166 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
13167 			tdata, digest_mem, digest_phys);
13168 
13169 	if (retval < 0)
13170 		return retval;
13171 
13172 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13173 
13174 	ut_params->op->sym->m_src = ut_params->ibuf;
13175 	if (oop)
13176 		ut_params->op->sym->m_dst = ut_params->obuf;
13177 
13178 	/* Process crypto operation */
13179 	if (oop == IN_PLACE &&
13180 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13181 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
13182 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13183 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13184 				ut_params->op, 0, 0, 0, 0);
13185 	else
13186 		TEST_ASSERT_NOT_NULL(
13187 			process_crypto_request(ts_params->valid_devs[0],
13188 			ut_params->op), "failed to process sym crypto op");
13189 
13190 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13191 			"crypto op processing failed");
13192 
13193 
13194 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
13195 			uint8_t *, prepend_len);
13196 	if (oop) {
13197 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
13198 				uint8_t *, prepend_len);
13199 	}
13200 
13201 	if (fragsz_oop)
13202 		fragsz = fragsz_oop;
13203 
13204 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13205 			ciphertext,
13206 			tdata->ciphertext.data,
13207 			fragsz,
13208 			"Ciphertext data not as expected");
13209 
13210 	buf = ut_params->op->sym->m_src->next;
13211 	if (oop)
13212 		buf = ut_params->op->sym->m_dst->next;
13213 
13214 	unsigned int off = fragsz;
13215 
13216 	ecx = 0;
13217 	while (buf) {
13218 		ciphertext = rte_pktmbuf_mtod(buf,
13219 				uint8_t *);
13220 
13221 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
13222 				ciphertext,
13223 				tdata->ciphertext.data + off,
13224 				to_trn_tbl[ecx],
13225 				"Ciphertext data not as expected");
13226 
13227 		off += to_trn_tbl[ecx++];
13228 		buf = buf->next;
13229 	}
13230 
13231 	auth_tag = digest_mem;
13232 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13233 			auth_tag,
13234 			tdata->auth_tag.data,
13235 			tdata->auth_tag.len,
13236 			"Generated auth tag not as expected");
13237 
13238 	return 0;
13239 }
13240 
13241 static int
13242 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
13243 {
13244 	return test_authenticated_encryption_SGL(
13245 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
13246 }
13247 
13248 static int
13249 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
13250 {
13251 	return test_authenticated_encryption_SGL(
13252 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
13253 }
13254 
13255 static int
13256 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
13257 {
13258 	return test_authenticated_encryption_SGL(
13259 			&gcm_test_case_8, OUT_OF_PLACE, 400,
13260 			gcm_test_case_8.plaintext.len);
13261 }
13262 
13263 static int
13264 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
13265 {
13266 	/* This test is not for OPENSSL PMD */
13267 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13268 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
13269 		return TEST_SKIPPED;
13270 
13271 	return test_authenticated_encryption_SGL(
13272 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
13273 }
13274 
13275 static int
13276 test_authentication_verify_fail_when_data_corrupted(
13277 		struct crypto_testsuite_params *ts_params,
13278 		struct crypto_unittest_params *ut_params,
13279 		const struct test_crypto_vector *reference)
13280 {
13281 	return test_authentication_verify_fail_when_data_corruption(
13282 			ts_params, ut_params, reference, 1);
13283 }
13284 
13285 static int
13286 test_authentication_verify_fail_when_tag_corrupted(
13287 		struct crypto_testsuite_params *ts_params,
13288 		struct crypto_unittest_params *ut_params,
13289 		const struct test_crypto_vector *reference)
13290 {
13291 	return test_authentication_verify_fail_when_data_corruption(
13292 			ts_params, ut_params, reference, 0);
13293 }
13294 
13295 static int
13296 test_authentication_verify_GMAC_fail_when_data_corrupted(
13297 		struct crypto_testsuite_params *ts_params,
13298 		struct crypto_unittest_params *ut_params,
13299 		const struct test_crypto_vector *reference)
13300 {
13301 	return test_authentication_verify_GMAC_fail_when_corruption(
13302 			ts_params, ut_params, reference, 1);
13303 }
13304 
13305 static int
13306 test_authentication_verify_GMAC_fail_when_tag_corrupted(
13307 		struct crypto_testsuite_params *ts_params,
13308 		struct crypto_unittest_params *ut_params,
13309 		const struct test_crypto_vector *reference)
13310 {
13311 	return test_authentication_verify_GMAC_fail_when_corruption(
13312 			ts_params, ut_params, reference, 0);
13313 }
13314 
13315 static int
13316 test_authenticated_decryption_fail_when_data_corrupted(
13317 		struct crypto_testsuite_params *ts_params,
13318 		struct crypto_unittest_params *ut_params,
13319 		const struct test_crypto_vector *reference)
13320 {
13321 	return test_authenticated_decryption_fail_when_corruption(
13322 			ts_params, ut_params, reference, 1);
13323 }
13324 
13325 static int
13326 test_authenticated_decryption_fail_when_tag_corrupted(
13327 		struct crypto_testsuite_params *ts_params,
13328 		struct crypto_unittest_params *ut_params,
13329 		const struct test_crypto_vector *reference)
13330 {
13331 	return test_authenticated_decryption_fail_when_corruption(
13332 			ts_params, ut_params, reference, 0);
13333 }
13334 
13335 static int
13336 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13337 {
13338 	return test_authentication_verify_fail_when_data_corrupted(
13339 			&testsuite_params, &unittest_params,
13340 			&hmac_sha1_test_crypto_vector);
13341 }
13342 
13343 static int
13344 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13345 {
13346 	return test_authentication_verify_fail_when_tag_corrupted(
13347 			&testsuite_params, &unittest_params,
13348 			&hmac_sha1_test_crypto_vector);
13349 }
13350 
13351 static int
13352 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13353 {
13354 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13355 			&testsuite_params, &unittest_params,
13356 			&aes128_gmac_test_vector);
13357 }
13358 
13359 static int
13360 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13361 {
13362 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13363 			&testsuite_params, &unittest_params,
13364 			&aes128_gmac_test_vector);
13365 }
13366 
13367 static int
13368 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13369 {
13370 	return test_authenticated_decryption_fail_when_data_corrupted(
13371 			&testsuite_params,
13372 			&unittest_params,
13373 			&aes128cbc_hmac_sha1_test_vector);
13374 }
13375 
13376 static int
13377 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13378 {
13379 	return test_authenticated_decryption_fail_when_tag_corrupted(
13380 			&testsuite_params,
13381 			&unittest_params,
13382 			&aes128cbc_hmac_sha1_test_vector);
13383 }
13384 
13385 static int
13386 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13387 {
13388 	return test_authenticated_encrypt_with_esn(
13389 			&testsuite_params,
13390 			&unittest_params,
13391 			&aes128cbc_hmac_sha1_aad_test_vector);
13392 }
13393 
13394 static int
13395 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13396 {
13397 	return test_authenticated_decrypt_with_esn(
13398 			&testsuite_params,
13399 			&unittest_params,
13400 			&aes128cbc_hmac_sha1_aad_test_vector);
13401 }
13402 
13403 static int
13404 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13405 {
13406 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13407 }
13408 
13409 static int
13410 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13411 {
13412 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13413 }
13414 
13415 #ifdef RTE_CRYPTO_SCHEDULER
13416 
13417 /* global AESNI worker IDs for the scheduler test */
13418 uint8_t aesni_ids[2];
13419 
13420 static int
13421 scheduler_testsuite_setup(void)
13422 {
13423 	uint32_t i = 0;
13424 	int32_t nb_devs, ret;
13425 	char vdev_args[VDEV_ARGS_SIZE] = {""};
13426 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
13427 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
13428 	uint16_t worker_core_count = 0;
13429 	uint16_t socket_id = 0;
13430 
13431 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
13432 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
13433 
13434 		/* Identify the Worker Cores
13435 		 * Use 2 worker cores for the device args
13436 		 */
13437 		RTE_LCORE_FOREACH_WORKER(i) {
13438 			if (worker_core_count > 1)
13439 				break;
13440 			snprintf(vdev_args, sizeof(vdev_args),
13441 					"%s%d", temp_str, i);
13442 			strcpy(temp_str, vdev_args);
13443 			strlcat(temp_str, ";", sizeof(temp_str));
13444 			worker_core_count++;
13445 			socket_id = rte_lcore_to_socket_id(i);
13446 		}
13447 		if (worker_core_count != 2) {
13448 			RTE_LOG(ERR, USER1,
13449 				"Cryptodev scheduler test require at least "
13450 				"two worker cores to run. "
13451 				"Please use the correct coremask.\n");
13452 			return TEST_FAILED;
13453 		}
13454 		strcpy(temp_str, vdev_args);
13455 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
13456 				temp_str, socket_id);
13457 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
13458 		nb_devs = rte_cryptodev_device_count_by_driver(
13459 				rte_cryptodev_driver_id_get(
13460 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
13461 		if (nb_devs < 1) {
13462 			ret = rte_vdev_init(
13463 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
13464 					vdev_args);
13465 			TEST_ASSERT(ret == 0,
13466 				"Failed to create instance %u of pmd : %s",
13467 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13468 		}
13469 	}
13470 	return testsuite_setup();
13471 }
13472 
13473 static int
13474 test_scheduler_attach_worker_op(void)
13475 {
13476 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13477 	uint8_t sched_id = ts_params->valid_devs[0];
13478 	uint32_t i, nb_devs_attached = 0;
13479 	int ret;
13480 	char vdev_name[32];
13481 	unsigned int count = rte_cryptodev_count();
13482 
13483 	/* create 2 AESNI_MB vdevs on top of existing devices */
13484 	for (i = count; i < count + 2; i++) {
13485 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13486 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13487 				i);
13488 		ret = rte_vdev_init(vdev_name, NULL);
13489 
13490 		TEST_ASSERT(ret == 0,
13491 			"Failed to create instance %u of"
13492 			" pmd : %s",
13493 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13494 
13495 		if (ret < 0) {
13496 			RTE_LOG(ERR, USER1,
13497 				"Failed to create 2 AESNI MB PMDs.\n");
13498 			return TEST_SKIPPED;
13499 		}
13500 	}
13501 
13502 	/* attach 2 AESNI_MB cdevs */
13503 	for (i = count; i < count + 2; i++) {
13504 		struct rte_cryptodev_info info;
13505 		unsigned int session_size;
13506 
13507 		rte_cryptodev_info_get(i, &info);
13508 		if (info.driver_id != rte_cryptodev_driver_id_get(
13509 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13510 			continue;
13511 
13512 		session_size = rte_cryptodev_sym_get_private_session_size(i);
13513 		/*
13514 		 * Create the session mempool again, since now there are new devices
13515 		 * to use the mempool.
13516 		 */
13517 		if (ts_params->session_mpool) {
13518 			rte_mempool_free(ts_params->session_mpool);
13519 			ts_params->session_mpool = NULL;
13520 		}
13521 		if (ts_params->session_priv_mpool) {
13522 			rte_mempool_free(ts_params->session_priv_mpool);
13523 			ts_params->session_priv_mpool = NULL;
13524 		}
13525 
13526 		if (info.sym.max_nb_sessions != 0 &&
13527 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13528 			RTE_LOG(ERR, USER1,
13529 					"Device does not support "
13530 					"at least %u sessions\n",
13531 					MAX_NB_SESSIONS);
13532 			return TEST_FAILED;
13533 		}
13534 		/*
13535 		 * Create mempool with maximum number of sessions,
13536 		 * to include the session headers
13537 		 */
13538 		if (ts_params->session_mpool == NULL) {
13539 			ts_params->session_mpool =
13540 				rte_cryptodev_sym_session_pool_create(
13541 						"test_sess_mp",
13542 						MAX_NB_SESSIONS, 0, 0, 0,
13543 						SOCKET_ID_ANY);
13544 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13545 					"session mempool allocation failed");
13546 		}
13547 
13548 		/*
13549 		 * Create mempool with maximum number of sessions,
13550 		 * to include device specific session private data
13551 		 */
13552 		if (ts_params->session_priv_mpool == NULL) {
13553 			ts_params->session_priv_mpool = rte_mempool_create(
13554 					"test_sess_mp_priv",
13555 					MAX_NB_SESSIONS,
13556 					session_size,
13557 					0, 0, NULL, NULL, NULL,
13558 					NULL, SOCKET_ID_ANY,
13559 					0);
13560 
13561 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13562 					"session mempool allocation failed");
13563 		}
13564 
13565 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
13566 		ts_params->qp_conf.mp_session_private =
13567 				ts_params->session_priv_mpool;
13568 
13569 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13570 				(uint8_t)i);
13571 
13572 		TEST_ASSERT(ret == 0,
13573 			"Failed to attach device %u of pmd : %s", i,
13574 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13575 
13576 		aesni_ids[nb_devs_attached] = (uint8_t)i;
13577 
13578 		nb_devs_attached++;
13579 	}
13580 
13581 	return 0;
13582 }
13583 
13584 static int
13585 test_scheduler_detach_worker_op(void)
13586 {
13587 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13588 	uint8_t sched_id = ts_params->valid_devs[0];
13589 	uint32_t i;
13590 	int ret;
13591 
13592 	for (i = 0; i < 2; i++) {
13593 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13594 				aesni_ids[i]);
13595 		TEST_ASSERT(ret == 0,
13596 			"Failed to detach device %u", aesni_ids[i]);
13597 	}
13598 
13599 	return 0;
13600 }
13601 
13602 static int
13603 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13604 {
13605 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13606 	uint8_t sched_id = ts_params->valid_devs[0];
13607 	/* set mode */
13608 	return rte_cryptodev_scheduler_mode_set(sched_id,
13609 		scheduler_mode);
13610 }
13611 
13612 static int
13613 test_scheduler_mode_roundrobin_op(void)
13614 {
13615 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13616 			0, "Failed to set roundrobin mode");
13617 	return 0;
13618 
13619 }
13620 
13621 static int
13622 test_scheduler_mode_multicore_op(void)
13623 {
13624 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13625 			0, "Failed to set multicore mode");
13626 
13627 	return 0;
13628 }
13629 
13630 static int
13631 test_scheduler_mode_failover_op(void)
13632 {
13633 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13634 			0, "Failed to set failover mode");
13635 
13636 	return 0;
13637 }
13638 
13639 static int
13640 test_scheduler_mode_pkt_size_distr_op(void)
13641 {
13642 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13643 			0, "Failed to set pktsize mode");
13644 
13645 	return 0;
13646 }
13647 
13648 static int
13649 scheduler_multicore_testsuite_setup(void)
13650 {
13651 	if (test_scheduler_attach_worker_op() < 0)
13652 		return TEST_SKIPPED;
13653 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
13654 		return TEST_SKIPPED;
13655 	return 0;
13656 }
13657 
13658 static int
13659 scheduler_roundrobin_testsuite_setup(void)
13660 {
13661 	if (test_scheduler_attach_worker_op() < 0)
13662 		return TEST_SKIPPED;
13663 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
13664 		return TEST_SKIPPED;
13665 	return 0;
13666 }
13667 
13668 static int
13669 scheduler_failover_testsuite_setup(void)
13670 {
13671 	if (test_scheduler_attach_worker_op() < 0)
13672 		return TEST_SKIPPED;
13673 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
13674 		return TEST_SKIPPED;
13675 	return 0;
13676 }
13677 
13678 static int
13679 scheduler_pkt_size_distr_testsuite_setup(void)
13680 {
13681 	if (test_scheduler_attach_worker_op() < 0)
13682 		return TEST_SKIPPED;
13683 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
13684 		return TEST_SKIPPED;
13685 	return 0;
13686 }
13687 
13688 static void
13689 scheduler_mode_testsuite_teardown(void)
13690 {
13691 	test_scheduler_detach_worker_op();
13692 }
13693 
13694 #endif /* RTE_CRYPTO_SCHEDULER */
13695 
13696 static struct unit_test_suite end_testsuite = {
13697 	.suite_name = NULL,
13698 	.setup = NULL,
13699 	.teardown = NULL,
13700 	.unit_test_suites = NULL
13701 };
13702 
13703 #ifdef RTE_LIB_SECURITY
13704 static struct unit_test_suite pdcp_proto_testsuite  = {
13705 	.suite_name = "PDCP Proto Unit Test Suite",
13706 	.setup = pdcp_proto_testsuite_setup,
13707 	.unit_test_cases = {
13708 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13709 			test_PDCP_PROTO_all),
13710 		TEST_CASES_END() /**< NULL terminate unit test array */
13711 	}
13712 };
13713 
13714 static struct unit_test_suite docsis_proto_testsuite  = {
13715 	.suite_name = "Docsis Proto Unit Test Suite",
13716 	.setup = docsis_proto_testsuite_setup,
13717 	.unit_test_cases = {
13718 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13719 			test_DOCSIS_PROTO_all),
13720 		TEST_CASES_END() /**< NULL terminate unit test array */
13721 	}
13722 };
13723 #endif
13724 
13725 static struct unit_test_suite cryptodev_gen_testsuite  = {
13726 	.suite_name = "Crypto General Unit Test Suite",
13727 	.setup = crypto_gen_testsuite_setup,
13728 	.unit_test_cases = {
13729 		TEST_CASE_ST(ut_setup, ut_teardown,
13730 				test_device_configure_invalid_dev_id),
13731 		TEST_CASE_ST(ut_setup, ut_teardown,
13732 				test_queue_pair_descriptor_setup),
13733 		TEST_CASE_ST(ut_setup, ut_teardown,
13734 				test_device_configure_invalid_queue_pair_ids),
13735 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13736 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13737 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13738 		TEST_CASES_END() /**< NULL terminate unit test array */
13739 	}
13740 };
13741 
13742 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
13743 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
13744 	.setup = negative_hmac_sha1_testsuite_setup,
13745 	.unit_test_cases = {
13746 		/** Negative tests */
13747 		TEST_CASE_ST(ut_setup, ut_teardown,
13748 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13749 		TEST_CASE_ST(ut_setup, ut_teardown,
13750 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13751 		TEST_CASE_ST(ut_setup, ut_teardown,
13752 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13753 		TEST_CASE_ST(ut_setup, ut_teardown,
13754 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13755 
13756 		TEST_CASES_END() /**< NULL terminate unit test array */
13757 	}
13758 };
13759 
13760 static struct unit_test_suite cryptodev_multi_session_testsuite = {
13761 	.suite_name = "Multi Session Unit Test Suite",
13762 	.setup = multi_session_testsuite_setup,
13763 	.unit_test_cases = {
13764 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13765 		TEST_CASE_ST(ut_setup, ut_teardown,
13766 				test_multi_session_random_usage),
13767 
13768 		TEST_CASES_END() /**< NULL terminate unit test array */
13769 	}
13770 };
13771 
13772 static struct unit_test_suite cryptodev_null_testsuite  = {
13773 	.suite_name = "NULL Test Suite",
13774 	.setup = null_testsuite_setup,
13775 	.unit_test_cases = {
13776 		TEST_CASE_ST(ut_setup, ut_teardown,
13777 			test_null_invalid_operation),
13778 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13779 		TEST_CASES_END()
13780 	}
13781 };
13782 
13783 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
13784 	.suite_name = "AES CCM Authenticated Test Suite",
13785 	.setup = aes_ccm_auth_testsuite_setup,
13786 	.unit_test_cases = {
13787 		/** AES CCM Authenticated Encryption 128 bits key*/
13788 		TEST_CASE_ST(ut_setup, ut_teardown,
13789 			test_AES_CCM_authenticated_encryption_test_case_128_1),
13790 		TEST_CASE_ST(ut_setup, ut_teardown,
13791 			test_AES_CCM_authenticated_encryption_test_case_128_2),
13792 		TEST_CASE_ST(ut_setup, ut_teardown,
13793 			test_AES_CCM_authenticated_encryption_test_case_128_3),
13794 
13795 		/** AES CCM Authenticated Decryption 128 bits key*/
13796 		TEST_CASE_ST(ut_setup, ut_teardown,
13797 			test_AES_CCM_authenticated_decryption_test_case_128_1),
13798 		TEST_CASE_ST(ut_setup, ut_teardown,
13799 			test_AES_CCM_authenticated_decryption_test_case_128_2),
13800 		TEST_CASE_ST(ut_setup, ut_teardown,
13801 			test_AES_CCM_authenticated_decryption_test_case_128_3),
13802 
13803 		/** AES CCM Authenticated Encryption 192 bits key */
13804 		TEST_CASE_ST(ut_setup, ut_teardown,
13805 			test_AES_CCM_authenticated_encryption_test_case_192_1),
13806 		TEST_CASE_ST(ut_setup, ut_teardown,
13807 			test_AES_CCM_authenticated_encryption_test_case_192_2),
13808 		TEST_CASE_ST(ut_setup, ut_teardown,
13809 			test_AES_CCM_authenticated_encryption_test_case_192_3),
13810 
13811 		/** AES CCM Authenticated Decryption 192 bits key*/
13812 		TEST_CASE_ST(ut_setup, ut_teardown,
13813 			test_AES_CCM_authenticated_decryption_test_case_192_1),
13814 		TEST_CASE_ST(ut_setup, ut_teardown,
13815 			test_AES_CCM_authenticated_decryption_test_case_192_2),
13816 		TEST_CASE_ST(ut_setup, ut_teardown,
13817 			test_AES_CCM_authenticated_decryption_test_case_192_3),
13818 
13819 		/** AES CCM Authenticated Encryption 256 bits key */
13820 		TEST_CASE_ST(ut_setup, ut_teardown,
13821 			test_AES_CCM_authenticated_encryption_test_case_256_1),
13822 		TEST_CASE_ST(ut_setup, ut_teardown,
13823 			test_AES_CCM_authenticated_encryption_test_case_256_2),
13824 		TEST_CASE_ST(ut_setup, ut_teardown,
13825 			test_AES_CCM_authenticated_encryption_test_case_256_3),
13826 
13827 		/** AES CCM Authenticated Decryption 256 bits key*/
13828 		TEST_CASE_ST(ut_setup, ut_teardown,
13829 			test_AES_CCM_authenticated_decryption_test_case_256_1),
13830 		TEST_CASE_ST(ut_setup, ut_teardown,
13831 			test_AES_CCM_authenticated_decryption_test_case_256_2),
13832 		TEST_CASE_ST(ut_setup, ut_teardown,
13833 			test_AES_CCM_authenticated_decryption_test_case_256_3),
13834 		TEST_CASES_END()
13835 	}
13836 };
13837 
13838 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
13839 	.suite_name = "AES GCM Authenticated Test Suite",
13840 	.setup = aes_gcm_auth_testsuite_setup,
13841 	.unit_test_cases = {
13842 		/** AES GCM Authenticated Encryption */
13843 		TEST_CASE_ST(ut_setup, ut_teardown,
13844 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13845 		TEST_CASE_ST(ut_setup, ut_teardown,
13846 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13847 		TEST_CASE_ST(ut_setup, ut_teardown,
13848 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13849 		TEST_CASE_ST(ut_setup, ut_teardown,
13850 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13851 		TEST_CASE_ST(ut_setup, ut_teardown,
13852 			test_AES_GCM_authenticated_encryption_test_case_1),
13853 		TEST_CASE_ST(ut_setup, ut_teardown,
13854 			test_AES_GCM_authenticated_encryption_test_case_2),
13855 		TEST_CASE_ST(ut_setup, ut_teardown,
13856 			test_AES_GCM_authenticated_encryption_test_case_3),
13857 		TEST_CASE_ST(ut_setup, ut_teardown,
13858 			test_AES_GCM_authenticated_encryption_test_case_4),
13859 		TEST_CASE_ST(ut_setup, ut_teardown,
13860 			test_AES_GCM_authenticated_encryption_test_case_5),
13861 		TEST_CASE_ST(ut_setup, ut_teardown,
13862 			test_AES_GCM_authenticated_encryption_test_case_6),
13863 		TEST_CASE_ST(ut_setup, ut_teardown,
13864 			test_AES_GCM_authenticated_encryption_test_case_7),
13865 		TEST_CASE_ST(ut_setup, ut_teardown,
13866 			test_AES_GCM_authenticated_encryption_test_case_8),
13867 		TEST_CASE_ST(ut_setup, ut_teardown,
13868 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
13869 
13870 		/** AES GCM Authenticated Decryption */
13871 		TEST_CASE_ST(ut_setup, ut_teardown,
13872 			test_AES_GCM_authenticated_decryption_test_case_1),
13873 		TEST_CASE_ST(ut_setup, ut_teardown,
13874 			test_AES_GCM_authenticated_decryption_test_case_2),
13875 		TEST_CASE_ST(ut_setup, ut_teardown,
13876 			test_AES_GCM_authenticated_decryption_test_case_3),
13877 		TEST_CASE_ST(ut_setup, ut_teardown,
13878 			test_AES_GCM_authenticated_decryption_test_case_4),
13879 		TEST_CASE_ST(ut_setup, ut_teardown,
13880 			test_AES_GCM_authenticated_decryption_test_case_5),
13881 		TEST_CASE_ST(ut_setup, ut_teardown,
13882 			test_AES_GCM_authenticated_decryption_test_case_6),
13883 		TEST_CASE_ST(ut_setup, ut_teardown,
13884 			test_AES_GCM_authenticated_decryption_test_case_7),
13885 		TEST_CASE_ST(ut_setup, ut_teardown,
13886 			test_AES_GCM_authenticated_decryption_test_case_8),
13887 		TEST_CASE_ST(ut_setup, ut_teardown,
13888 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
13889 
13890 		/** AES GCM Authenticated Encryption 192 bits key */
13891 		TEST_CASE_ST(ut_setup, ut_teardown,
13892 			test_AES_GCM_auth_encryption_test_case_192_1),
13893 		TEST_CASE_ST(ut_setup, ut_teardown,
13894 			test_AES_GCM_auth_encryption_test_case_192_2),
13895 		TEST_CASE_ST(ut_setup, ut_teardown,
13896 			test_AES_GCM_auth_encryption_test_case_192_3),
13897 		TEST_CASE_ST(ut_setup, ut_teardown,
13898 			test_AES_GCM_auth_encryption_test_case_192_4),
13899 		TEST_CASE_ST(ut_setup, ut_teardown,
13900 			test_AES_GCM_auth_encryption_test_case_192_5),
13901 		TEST_CASE_ST(ut_setup, ut_teardown,
13902 			test_AES_GCM_auth_encryption_test_case_192_6),
13903 		TEST_CASE_ST(ut_setup, ut_teardown,
13904 			test_AES_GCM_auth_encryption_test_case_192_7),
13905 
13906 		/** AES GCM Authenticated Decryption 192 bits key */
13907 		TEST_CASE_ST(ut_setup, ut_teardown,
13908 			test_AES_GCM_auth_decryption_test_case_192_1),
13909 		TEST_CASE_ST(ut_setup, ut_teardown,
13910 			test_AES_GCM_auth_decryption_test_case_192_2),
13911 		TEST_CASE_ST(ut_setup, ut_teardown,
13912 			test_AES_GCM_auth_decryption_test_case_192_3),
13913 		TEST_CASE_ST(ut_setup, ut_teardown,
13914 			test_AES_GCM_auth_decryption_test_case_192_4),
13915 		TEST_CASE_ST(ut_setup, ut_teardown,
13916 			test_AES_GCM_auth_decryption_test_case_192_5),
13917 		TEST_CASE_ST(ut_setup, ut_teardown,
13918 			test_AES_GCM_auth_decryption_test_case_192_6),
13919 		TEST_CASE_ST(ut_setup, ut_teardown,
13920 			test_AES_GCM_auth_decryption_test_case_192_7),
13921 
13922 		/** AES GCM Authenticated Encryption 256 bits key */
13923 		TEST_CASE_ST(ut_setup, ut_teardown,
13924 			test_AES_GCM_auth_encryption_test_case_256_1),
13925 		TEST_CASE_ST(ut_setup, ut_teardown,
13926 			test_AES_GCM_auth_encryption_test_case_256_2),
13927 		TEST_CASE_ST(ut_setup, ut_teardown,
13928 			test_AES_GCM_auth_encryption_test_case_256_3),
13929 		TEST_CASE_ST(ut_setup, ut_teardown,
13930 			test_AES_GCM_auth_encryption_test_case_256_4),
13931 		TEST_CASE_ST(ut_setup, ut_teardown,
13932 			test_AES_GCM_auth_encryption_test_case_256_5),
13933 		TEST_CASE_ST(ut_setup, ut_teardown,
13934 			test_AES_GCM_auth_encryption_test_case_256_6),
13935 		TEST_CASE_ST(ut_setup, ut_teardown,
13936 			test_AES_GCM_auth_encryption_test_case_256_7),
13937 
13938 		/** AES GCM Authenticated Decryption 256 bits key */
13939 		TEST_CASE_ST(ut_setup, ut_teardown,
13940 			test_AES_GCM_auth_decryption_test_case_256_1),
13941 		TEST_CASE_ST(ut_setup, ut_teardown,
13942 			test_AES_GCM_auth_decryption_test_case_256_2),
13943 		TEST_CASE_ST(ut_setup, ut_teardown,
13944 			test_AES_GCM_auth_decryption_test_case_256_3),
13945 		TEST_CASE_ST(ut_setup, ut_teardown,
13946 			test_AES_GCM_auth_decryption_test_case_256_4),
13947 		TEST_CASE_ST(ut_setup, ut_teardown,
13948 			test_AES_GCM_auth_decryption_test_case_256_5),
13949 		TEST_CASE_ST(ut_setup, ut_teardown,
13950 			test_AES_GCM_auth_decryption_test_case_256_6),
13951 		TEST_CASE_ST(ut_setup, ut_teardown,
13952 			test_AES_GCM_auth_decryption_test_case_256_7),
13953 
13954 		/** AES GCM Authenticated Encryption big aad size */
13955 		TEST_CASE_ST(ut_setup, ut_teardown,
13956 			test_AES_GCM_auth_encryption_test_case_aad_1),
13957 		TEST_CASE_ST(ut_setup, ut_teardown,
13958 			test_AES_GCM_auth_encryption_test_case_aad_2),
13959 
13960 		/** AES GCM Authenticated Decryption big aad size */
13961 		TEST_CASE_ST(ut_setup, ut_teardown,
13962 			test_AES_GCM_auth_decryption_test_case_aad_1),
13963 		TEST_CASE_ST(ut_setup, ut_teardown,
13964 			test_AES_GCM_auth_decryption_test_case_aad_2),
13965 
13966 		/** Out of place tests */
13967 		TEST_CASE_ST(ut_setup, ut_teardown,
13968 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13969 		TEST_CASE_ST(ut_setup, ut_teardown,
13970 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13971 
13972 		/** Session-less tests */
13973 		TEST_CASE_ST(ut_setup, ut_teardown,
13974 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13975 		TEST_CASE_ST(ut_setup, ut_teardown,
13976 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13977 
13978 		TEST_CASES_END()
13979 	}
13980 };
13981 
13982 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
13983 	.suite_name = "AES GMAC Authentication Test Suite",
13984 	.setup = aes_gmac_auth_testsuite_setup,
13985 	.unit_test_cases = {
13986 		TEST_CASE_ST(ut_setup, ut_teardown,
13987 			test_AES_GMAC_authentication_test_case_1),
13988 		TEST_CASE_ST(ut_setup, ut_teardown,
13989 			test_AES_GMAC_authentication_verify_test_case_1),
13990 		TEST_CASE_ST(ut_setup, ut_teardown,
13991 			test_AES_GMAC_authentication_test_case_2),
13992 		TEST_CASE_ST(ut_setup, ut_teardown,
13993 			test_AES_GMAC_authentication_verify_test_case_2),
13994 		TEST_CASE_ST(ut_setup, ut_teardown,
13995 			test_AES_GMAC_authentication_test_case_3),
13996 		TEST_CASE_ST(ut_setup, ut_teardown,
13997 			test_AES_GMAC_authentication_verify_test_case_3),
13998 		TEST_CASE_ST(ut_setup, ut_teardown,
13999 			test_AES_GMAC_authentication_test_case_4),
14000 		TEST_CASE_ST(ut_setup, ut_teardown,
14001 			test_AES_GMAC_authentication_verify_test_case_4),
14002 		TEST_CASE_ST(ut_setup, ut_teardown,
14003 			test_AES_GMAC_authentication_SGL_40B),
14004 		TEST_CASE_ST(ut_setup, ut_teardown,
14005 			test_AES_GMAC_authentication_SGL_80B),
14006 		TEST_CASE_ST(ut_setup, ut_teardown,
14007 			test_AES_GMAC_authentication_SGL_2048B),
14008 		TEST_CASE_ST(ut_setup, ut_teardown,
14009 			test_AES_GMAC_authentication_SGL_2047B),
14010 
14011 		TEST_CASES_END()
14012 	}
14013 };
14014 
14015 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
14016 	.suite_name = "Chacha20-Poly1305 Test Suite",
14017 	.setup = chacha20_poly1305_testsuite_setup,
14018 	.unit_test_cases = {
14019 		TEST_CASE_ST(ut_setup, ut_teardown,
14020 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
14021 		TEST_CASE_ST(ut_setup, ut_teardown,
14022 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
14023 		TEST_CASES_END()
14024 	}
14025 };
14026 
14027 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
14028 	.suite_name = "SNOW 3G Test Suite",
14029 	.setup = snow3g_testsuite_setup,
14030 	.unit_test_cases = {
14031 		/** SNOW 3G encrypt only (UEA2) */
14032 		TEST_CASE_ST(ut_setup, ut_teardown,
14033 			test_snow3g_encryption_test_case_1),
14034 		TEST_CASE_ST(ut_setup, ut_teardown,
14035 			test_snow3g_encryption_test_case_2),
14036 		TEST_CASE_ST(ut_setup, ut_teardown,
14037 			test_snow3g_encryption_test_case_3),
14038 		TEST_CASE_ST(ut_setup, ut_teardown,
14039 			test_snow3g_encryption_test_case_4),
14040 		TEST_CASE_ST(ut_setup, ut_teardown,
14041 			test_snow3g_encryption_test_case_5),
14042 
14043 		TEST_CASE_ST(ut_setup, ut_teardown,
14044 			test_snow3g_encryption_test_case_1_oop),
14045 		TEST_CASE_ST(ut_setup, ut_teardown,
14046 			test_snow3g_encryption_test_case_1_oop_sgl),
14047 		TEST_CASE_ST(ut_setup, ut_teardown,
14048 			test_snow3g_encryption_test_case_1_offset_oop),
14049 		TEST_CASE_ST(ut_setup, ut_teardown,
14050 			test_snow3g_decryption_test_case_1_oop),
14051 
14052 		/** SNOW 3G generate auth, then encrypt (UEA2) */
14053 		TEST_CASE_ST(ut_setup, ut_teardown,
14054 			test_snow3g_auth_cipher_test_case_1),
14055 		TEST_CASE_ST(ut_setup, ut_teardown,
14056 			test_snow3g_auth_cipher_test_case_2),
14057 		TEST_CASE_ST(ut_setup, ut_teardown,
14058 			test_snow3g_auth_cipher_test_case_2_oop),
14059 		TEST_CASE_ST(ut_setup, ut_teardown,
14060 			test_snow3g_auth_cipher_part_digest_enc),
14061 		TEST_CASE_ST(ut_setup, ut_teardown,
14062 			test_snow3g_auth_cipher_part_digest_enc_oop),
14063 		TEST_CASE_ST(ut_setup, ut_teardown,
14064 			test_snow3g_auth_cipher_test_case_3_sgl),
14065 		TEST_CASE_ST(ut_setup, ut_teardown,
14066 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
14067 		TEST_CASE_ST(ut_setup, ut_teardown,
14068 			test_snow3g_auth_cipher_part_digest_enc_sgl),
14069 		TEST_CASE_ST(ut_setup, ut_teardown,
14070 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
14071 
14072 		/** SNOW 3G decrypt (UEA2), then verify auth */
14073 		TEST_CASE_ST(ut_setup, ut_teardown,
14074 			test_snow3g_auth_cipher_verify_test_case_1),
14075 		TEST_CASE_ST(ut_setup, ut_teardown,
14076 			test_snow3g_auth_cipher_verify_test_case_2),
14077 		TEST_CASE_ST(ut_setup, ut_teardown,
14078 			test_snow3g_auth_cipher_verify_test_case_2_oop),
14079 		TEST_CASE_ST(ut_setup, ut_teardown,
14080 			test_snow3g_auth_cipher_verify_part_digest_enc),
14081 		TEST_CASE_ST(ut_setup, ut_teardown,
14082 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
14083 		TEST_CASE_ST(ut_setup, ut_teardown,
14084 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
14085 		TEST_CASE_ST(ut_setup, ut_teardown,
14086 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
14087 		TEST_CASE_ST(ut_setup, ut_teardown,
14088 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
14089 		TEST_CASE_ST(ut_setup, ut_teardown,
14090 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
14091 
14092 		/** SNOW 3G decrypt only (UEA2) */
14093 		TEST_CASE_ST(ut_setup, ut_teardown,
14094 			test_snow3g_decryption_test_case_1),
14095 		TEST_CASE_ST(ut_setup, ut_teardown,
14096 			test_snow3g_decryption_test_case_2),
14097 		TEST_CASE_ST(ut_setup, ut_teardown,
14098 			test_snow3g_decryption_test_case_3),
14099 		TEST_CASE_ST(ut_setup, ut_teardown,
14100 			test_snow3g_decryption_test_case_4),
14101 		TEST_CASE_ST(ut_setup, ut_teardown,
14102 			test_snow3g_decryption_test_case_5),
14103 		TEST_CASE_ST(ut_setup, ut_teardown,
14104 			test_snow3g_decryption_with_digest_test_case_1),
14105 		TEST_CASE_ST(ut_setup, ut_teardown,
14106 			test_snow3g_hash_generate_test_case_1),
14107 		TEST_CASE_ST(ut_setup, ut_teardown,
14108 			test_snow3g_hash_generate_test_case_2),
14109 		TEST_CASE_ST(ut_setup, ut_teardown,
14110 			test_snow3g_hash_generate_test_case_3),
14111 
14112 		/* Tests with buffers which length is not byte-aligned */
14113 		TEST_CASE_ST(ut_setup, ut_teardown,
14114 			test_snow3g_hash_generate_test_case_4),
14115 		TEST_CASE_ST(ut_setup, ut_teardown,
14116 			test_snow3g_hash_generate_test_case_5),
14117 		TEST_CASE_ST(ut_setup, ut_teardown,
14118 			test_snow3g_hash_generate_test_case_6),
14119 		TEST_CASE_ST(ut_setup, ut_teardown,
14120 			test_snow3g_hash_verify_test_case_1),
14121 		TEST_CASE_ST(ut_setup, ut_teardown,
14122 			test_snow3g_hash_verify_test_case_2),
14123 		TEST_CASE_ST(ut_setup, ut_teardown,
14124 			test_snow3g_hash_verify_test_case_3),
14125 
14126 		/* Tests with buffers which length is not byte-aligned */
14127 		TEST_CASE_ST(ut_setup, ut_teardown,
14128 			test_snow3g_hash_verify_test_case_4),
14129 		TEST_CASE_ST(ut_setup, ut_teardown,
14130 			test_snow3g_hash_verify_test_case_5),
14131 		TEST_CASE_ST(ut_setup, ut_teardown,
14132 			test_snow3g_hash_verify_test_case_6),
14133 		TEST_CASE_ST(ut_setup, ut_teardown,
14134 			test_snow3g_cipher_auth_test_case_1),
14135 		TEST_CASE_ST(ut_setup, ut_teardown,
14136 			test_snow3g_auth_cipher_with_digest_test_case_1),
14137 		TEST_CASES_END()
14138 	}
14139 };
14140 
14141 static struct unit_test_suite cryptodev_zuc_testsuite  = {
14142 	.suite_name = "ZUC Test Suite",
14143 	.setup = zuc_testsuite_setup,
14144 	.unit_test_cases = {
14145 		/** ZUC encrypt only (EEA3) */
14146 		TEST_CASE_ST(ut_setup, ut_teardown,
14147 			test_zuc_encryption_test_case_1),
14148 		TEST_CASE_ST(ut_setup, ut_teardown,
14149 			test_zuc_encryption_test_case_2),
14150 		TEST_CASE_ST(ut_setup, ut_teardown,
14151 			test_zuc_encryption_test_case_3),
14152 		TEST_CASE_ST(ut_setup, ut_teardown,
14153 			test_zuc_encryption_test_case_4),
14154 		TEST_CASE_ST(ut_setup, ut_teardown,
14155 			test_zuc_encryption_test_case_5),
14156 		TEST_CASE_ST(ut_setup, ut_teardown,
14157 			test_zuc_encryption_test_case_6_sgl),
14158 
14159 		/** ZUC authenticate (EIA3) */
14160 		TEST_CASE_ST(ut_setup, ut_teardown,
14161 			test_zuc_hash_generate_test_case_1),
14162 		TEST_CASE_ST(ut_setup, ut_teardown,
14163 			test_zuc_hash_generate_test_case_2),
14164 		TEST_CASE_ST(ut_setup, ut_teardown,
14165 			test_zuc_hash_generate_test_case_3),
14166 		TEST_CASE_ST(ut_setup, ut_teardown,
14167 			test_zuc_hash_generate_test_case_4),
14168 		TEST_CASE_ST(ut_setup, ut_teardown,
14169 			test_zuc_hash_generate_test_case_5),
14170 		TEST_CASE_ST(ut_setup, ut_teardown,
14171 			test_zuc_hash_generate_test_case_6),
14172 		TEST_CASE_ST(ut_setup, ut_teardown,
14173 			test_zuc_hash_generate_test_case_7),
14174 		TEST_CASE_ST(ut_setup, ut_teardown,
14175 			test_zuc_hash_generate_test_case_8),
14176 
14177 		/** ZUC alg-chain (EEA3/EIA3) */
14178 		TEST_CASE_ST(ut_setup, ut_teardown,
14179 			test_zuc_cipher_auth_test_case_1),
14180 		TEST_CASE_ST(ut_setup, ut_teardown,
14181 			test_zuc_cipher_auth_test_case_2),
14182 
14183 		/** ZUC generate auth, then encrypt (EEA3) */
14184 		TEST_CASE_ST(ut_setup, ut_teardown,
14185 			test_zuc_auth_cipher_test_case_1),
14186 		TEST_CASE_ST(ut_setup, ut_teardown,
14187 			test_zuc_auth_cipher_test_case_1_oop),
14188 		TEST_CASE_ST(ut_setup, ut_teardown,
14189 			test_zuc_auth_cipher_test_case_1_sgl),
14190 		TEST_CASE_ST(ut_setup, ut_teardown,
14191 			test_zuc_auth_cipher_test_case_1_oop_sgl),
14192 
14193 		/** ZUC decrypt (EEA3), then verify auth */
14194 		TEST_CASE_ST(ut_setup, ut_teardown,
14195 			test_zuc_auth_cipher_verify_test_case_1),
14196 		TEST_CASE_ST(ut_setup, ut_teardown,
14197 			test_zuc_auth_cipher_verify_test_case_1_oop),
14198 		TEST_CASE_ST(ut_setup, ut_teardown,
14199 			test_zuc_auth_cipher_verify_test_case_1_sgl),
14200 		TEST_CASE_ST(ut_setup, ut_teardown,
14201 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
14202 		TEST_CASES_END()
14203 	}
14204 };
14205 
14206 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
14207 	.suite_name = "HMAC_MD5 Authentication Test Suite",
14208 	.setup = hmac_md5_auth_testsuite_setup,
14209 	.unit_test_cases = {
14210 		TEST_CASE_ST(ut_setup, ut_teardown,
14211 			test_MD5_HMAC_generate_case_1),
14212 		TEST_CASE_ST(ut_setup, ut_teardown,
14213 			test_MD5_HMAC_verify_case_1),
14214 		TEST_CASE_ST(ut_setup, ut_teardown,
14215 			test_MD5_HMAC_generate_case_2),
14216 		TEST_CASE_ST(ut_setup, ut_teardown,
14217 			test_MD5_HMAC_verify_case_2),
14218 		TEST_CASES_END()
14219 	}
14220 };
14221 
14222 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
14223 	.suite_name = "Kasumi Test Suite",
14224 	.setup = kasumi_testsuite_setup,
14225 	.unit_test_cases = {
14226 		/** KASUMI hash only (UIA1) */
14227 		TEST_CASE_ST(ut_setup, ut_teardown,
14228 			test_kasumi_hash_generate_test_case_1),
14229 		TEST_CASE_ST(ut_setup, ut_teardown,
14230 			test_kasumi_hash_generate_test_case_2),
14231 		TEST_CASE_ST(ut_setup, ut_teardown,
14232 			test_kasumi_hash_generate_test_case_3),
14233 		TEST_CASE_ST(ut_setup, ut_teardown,
14234 			test_kasumi_hash_generate_test_case_4),
14235 		TEST_CASE_ST(ut_setup, ut_teardown,
14236 			test_kasumi_hash_generate_test_case_5),
14237 		TEST_CASE_ST(ut_setup, ut_teardown,
14238 			test_kasumi_hash_generate_test_case_6),
14239 
14240 		TEST_CASE_ST(ut_setup, ut_teardown,
14241 			test_kasumi_hash_verify_test_case_1),
14242 		TEST_CASE_ST(ut_setup, ut_teardown,
14243 			test_kasumi_hash_verify_test_case_2),
14244 		TEST_CASE_ST(ut_setup, ut_teardown,
14245 			test_kasumi_hash_verify_test_case_3),
14246 		TEST_CASE_ST(ut_setup, ut_teardown,
14247 			test_kasumi_hash_verify_test_case_4),
14248 		TEST_CASE_ST(ut_setup, ut_teardown,
14249 			test_kasumi_hash_verify_test_case_5),
14250 
14251 		/** KASUMI encrypt only (UEA1) */
14252 		TEST_CASE_ST(ut_setup, ut_teardown,
14253 			test_kasumi_encryption_test_case_1),
14254 		TEST_CASE_ST(ut_setup, ut_teardown,
14255 			test_kasumi_encryption_test_case_1_sgl),
14256 		TEST_CASE_ST(ut_setup, ut_teardown,
14257 			test_kasumi_encryption_test_case_1_oop),
14258 		TEST_CASE_ST(ut_setup, ut_teardown,
14259 			test_kasumi_encryption_test_case_1_oop_sgl),
14260 		TEST_CASE_ST(ut_setup, ut_teardown,
14261 			test_kasumi_encryption_test_case_2),
14262 		TEST_CASE_ST(ut_setup, ut_teardown,
14263 			test_kasumi_encryption_test_case_3),
14264 		TEST_CASE_ST(ut_setup, ut_teardown,
14265 			test_kasumi_encryption_test_case_4),
14266 		TEST_CASE_ST(ut_setup, ut_teardown,
14267 			test_kasumi_encryption_test_case_5),
14268 
14269 		/** KASUMI decrypt only (UEA1) */
14270 		TEST_CASE_ST(ut_setup, ut_teardown,
14271 			test_kasumi_decryption_test_case_1),
14272 		TEST_CASE_ST(ut_setup, ut_teardown,
14273 			test_kasumi_decryption_test_case_2),
14274 		TEST_CASE_ST(ut_setup, ut_teardown,
14275 			test_kasumi_decryption_test_case_3),
14276 		TEST_CASE_ST(ut_setup, ut_teardown,
14277 			test_kasumi_decryption_test_case_4),
14278 		TEST_CASE_ST(ut_setup, ut_teardown,
14279 			test_kasumi_decryption_test_case_5),
14280 		TEST_CASE_ST(ut_setup, ut_teardown,
14281 			test_kasumi_decryption_test_case_1_oop),
14282 
14283 		TEST_CASE_ST(ut_setup, ut_teardown,
14284 			test_kasumi_cipher_auth_test_case_1),
14285 
14286 		/** KASUMI generate auth, then encrypt (F8) */
14287 		TEST_CASE_ST(ut_setup, ut_teardown,
14288 			test_kasumi_auth_cipher_test_case_1),
14289 		TEST_CASE_ST(ut_setup, ut_teardown,
14290 			test_kasumi_auth_cipher_test_case_2),
14291 		TEST_CASE_ST(ut_setup, ut_teardown,
14292 			test_kasumi_auth_cipher_test_case_2_oop),
14293 		TEST_CASE_ST(ut_setup, ut_teardown,
14294 			test_kasumi_auth_cipher_test_case_2_sgl),
14295 		TEST_CASE_ST(ut_setup, ut_teardown,
14296 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
14297 
14298 		/** KASUMI decrypt (F8), then verify auth */
14299 		TEST_CASE_ST(ut_setup, ut_teardown,
14300 			test_kasumi_auth_cipher_verify_test_case_1),
14301 		TEST_CASE_ST(ut_setup, ut_teardown,
14302 			test_kasumi_auth_cipher_verify_test_case_2),
14303 		TEST_CASE_ST(ut_setup, ut_teardown,
14304 			test_kasumi_auth_cipher_verify_test_case_2_oop),
14305 		TEST_CASE_ST(ut_setup, ut_teardown,
14306 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
14307 		TEST_CASE_ST(ut_setup, ut_teardown,
14308 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
14309 
14310 		TEST_CASES_END()
14311 	}
14312 };
14313 
14314 static struct unit_test_suite cryptodev_esn_testsuite  = {
14315 	.suite_name = "ESN Test Suite",
14316 	.setup = esn_testsuite_setup,
14317 	.unit_test_cases = {
14318 		TEST_CASE_ST(ut_setup, ut_teardown,
14319 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
14320 		TEST_CASE_ST(ut_setup, ut_teardown,
14321 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
14322 		TEST_CASES_END()
14323 	}
14324 };
14325 
14326 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
14327 	.suite_name = "Negative AES GCM Test Suite",
14328 	.setup = negative_aes_gcm_testsuite_setup,
14329 	.unit_test_cases = {
14330 		TEST_CASE_ST(ut_setup, ut_teardown,
14331 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
14332 		TEST_CASE_ST(ut_setup, ut_teardown,
14333 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
14334 		TEST_CASE_ST(ut_setup, ut_teardown,
14335 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
14336 		TEST_CASE_ST(ut_setup, ut_teardown,
14337 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
14338 		TEST_CASE_ST(ut_setup, ut_teardown,
14339 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
14340 		TEST_CASE_ST(ut_setup, ut_teardown,
14341 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
14342 		TEST_CASE_ST(ut_setup, ut_teardown,
14343 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
14344 		TEST_CASE_ST(ut_setup, ut_teardown,
14345 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
14346 		TEST_CASE_ST(ut_setup, ut_teardown,
14347 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
14348 		TEST_CASE_ST(ut_setup, ut_teardown,
14349 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
14350 		TEST_CASE_ST(ut_setup, ut_teardown,
14351 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
14352 		TEST_CASE_ST(ut_setup, ut_teardown,
14353 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
14354 
14355 		TEST_CASES_END()
14356 	}
14357 };
14358 
14359 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
14360 	.suite_name = "Negative AES GMAC Test Suite",
14361 	.setup = negative_aes_gmac_testsuite_setup,
14362 	.unit_test_cases = {
14363 		TEST_CASE_ST(ut_setup, ut_teardown,
14364 			authentication_verify_AES128_GMAC_fail_data_corrupt),
14365 		TEST_CASE_ST(ut_setup, ut_teardown,
14366 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
14367 
14368 		TEST_CASES_END()
14369 	}
14370 };
14371 
14372 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
14373 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
14374 	.setup = mixed_cipher_hash_testsuite_setup,
14375 	.unit_test_cases = {
14376 		/** AUTH AES CMAC + CIPHER AES CTR */
14377 		TEST_CASE_ST(ut_setup, ut_teardown,
14378 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
14379 		TEST_CASE_ST(ut_setup, ut_teardown,
14380 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14381 		TEST_CASE_ST(ut_setup, ut_teardown,
14382 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14383 		TEST_CASE_ST(ut_setup, ut_teardown,
14384 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14385 		TEST_CASE_ST(ut_setup, ut_teardown,
14386 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
14387 		TEST_CASE_ST(ut_setup, ut_teardown,
14388 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
14389 		TEST_CASE_ST(ut_setup, ut_teardown,
14390 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
14391 		TEST_CASE_ST(ut_setup, ut_teardown,
14392 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
14393 
14394 		/** AUTH ZUC + CIPHER SNOW3G */
14395 		TEST_CASE_ST(ut_setup, ut_teardown,
14396 			test_auth_zuc_cipher_snow_test_case_1),
14397 		TEST_CASE_ST(ut_setup, ut_teardown,
14398 			test_verify_auth_zuc_cipher_snow_test_case_1),
14399 		/** AUTH AES CMAC + CIPHER SNOW3G */
14400 		TEST_CASE_ST(ut_setup, ut_teardown,
14401 			test_auth_aes_cmac_cipher_snow_test_case_1),
14402 		TEST_CASE_ST(ut_setup, ut_teardown,
14403 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
14404 		/** AUTH ZUC + CIPHER AES CTR */
14405 		TEST_CASE_ST(ut_setup, ut_teardown,
14406 			test_auth_zuc_cipher_aes_ctr_test_case_1),
14407 		TEST_CASE_ST(ut_setup, ut_teardown,
14408 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
14409 		/** AUTH SNOW3G + CIPHER AES CTR */
14410 		TEST_CASE_ST(ut_setup, ut_teardown,
14411 			test_auth_snow_cipher_aes_ctr_test_case_1),
14412 		TEST_CASE_ST(ut_setup, ut_teardown,
14413 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
14414 		/** AUTH SNOW3G + CIPHER ZUC */
14415 		TEST_CASE_ST(ut_setup, ut_teardown,
14416 			test_auth_snow_cipher_zuc_test_case_1),
14417 		TEST_CASE_ST(ut_setup, ut_teardown,
14418 			test_verify_auth_snow_cipher_zuc_test_case_1),
14419 		/** AUTH AES CMAC + CIPHER ZUC */
14420 		TEST_CASE_ST(ut_setup, ut_teardown,
14421 			test_auth_aes_cmac_cipher_zuc_test_case_1),
14422 		TEST_CASE_ST(ut_setup, ut_teardown,
14423 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
14424 
14425 		/** AUTH NULL + CIPHER SNOW3G */
14426 		TEST_CASE_ST(ut_setup, ut_teardown,
14427 			test_auth_null_cipher_snow_test_case_1),
14428 		TEST_CASE_ST(ut_setup, ut_teardown,
14429 			test_verify_auth_null_cipher_snow_test_case_1),
14430 		/** AUTH NULL + CIPHER ZUC */
14431 		TEST_CASE_ST(ut_setup, ut_teardown,
14432 			test_auth_null_cipher_zuc_test_case_1),
14433 		TEST_CASE_ST(ut_setup, ut_teardown,
14434 			test_verify_auth_null_cipher_zuc_test_case_1),
14435 		/** AUTH SNOW3G + CIPHER NULL */
14436 		TEST_CASE_ST(ut_setup, ut_teardown,
14437 			test_auth_snow_cipher_null_test_case_1),
14438 		TEST_CASE_ST(ut_setup, ut_teardown,
14439 			test_verify_auth_snow_cipher_null_test_case_1),
14440 		/** AUTH ZUC + CIPHER NULL */
14441 		TEST_CASE_ST(ut_setup, ut_teardown,
14442 			test_auth_zuc_cipher_null_test_case_1),
14443 		TEST_CASE_ST(ut_setup, ut_teardown,
14444 			test_verify_auth_zuc_cipher_null_test_case_1),
14445 		/** AUTH NULL + CIPHER AES CTR */
14446 		TEST_CASE_ST(ut_setup, ut_teardown,
14447 			test_auth_null_cipher_aes_ctr_test_case_1),
14448 		TEST_CASE_ST(ut_setup, ut_teardown,
14449 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
14450 		/** AUTH AES CMAC + CIPHER NULL */
14451 		TEST_CASE_ST(ut_setup, ut_teardown,
14452 			test_auth_aes_cmac_cipher_null_test_case_1),
14453 		TEST_CASE_ST(ut_setup, ut_teardown,
14454 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
14455 		TEST_CASES_END()
14456 	}
14457 };
14458 
14459 static int
14460 run_cryptodev_testsuite(const char *pmd_name)
14461 {
14462 	uint8_t ret, j, i = 0, blk_start_idx = 0;
14463 	const enum blockcipher_test_type blk_suites[] = {
14464 		BLKCIPHER_AES_CHAIN_TYPE,
14465 		BLKCIPHER_AES_CIPHERONLY_TYPE,
14466 		BLKCIPHER_AES_DOCSIS_TYPE,
14467 		BLKCIPHER_3DES_CHAIN_TYPE,
14468 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
14469 		BLKCIPHER_DES_CIPHERONLY_TYPE,
14470 		BLKCIPHER_DES_DOCSIS_TYPE,
14471 		BLKCIPHER_AUTHONLY_TYPE};
14472 	struct unit_test_suite *static_suites[] = {
14473 		&cryptodev_multi_session_testsuite,
14474 		&cryptodev_null_testsuite,
14475 		&cryptodev_aes_ccm_auth_testsuite,
14476 		&cryptodev_aes_gcm_auth_testsuite,
14477 		&cryptodev_aes_gmac_auth_testsuite,
14478 		&cryptodev_snow3g_testsuite,
14479 		&cryptodev_chacha20_poly1305_testsuite,
14480 		&cryptodev_zuc_testsuite,
14481 		&cryptodev_hmac_md5_auth_testsuite,
14482 		&cryptodev_kasumi_testsuite,
14483 		&cryptodev_esn_testsuite,
14484 		&cryptodev_negative_aes_gcm_testsuite,
14485 		&cryptodev_negative_aes_gmac_testsuite,
14486 		&cryptodev_mixed_cipher_hash_testsuite,
14487 		&cryptodev_negative_hmac_sha1_testsuite,
14488 		&cryptodev_gen_testsuite,
14489 #ifdef RTE_LIB_SECURITY
14490 		&pdcp_proto_testsuite,
14491 		&docsis_proto_testsuite,
14492 #endif
14493 		&end_testsuite
14494 	};
14495 	static struct unit_test_suite ts = {
14496 		.suite_name = "Cryptodev Unit Test Suite",
14497 		.setup = testsuite_setup,
14498 		.teardown = testsuite_teardown,
14499 		.unit_test_cases = {TEST_CASES_END()}
14500 	};
14501 
14502 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
14503 
14504 	if (gbl_driver_id == -1) {
14505 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
14506 		return TEST_SKIPPED;
14507 	}
14508 
14509 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
14510 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
14511 
14512 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
14513 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
14514 	ret = unit_test_suite_runner(&ts);
14515 
14516 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
14517 	free(ts.unit_test_suites);
14518 	return ret;
14519 }
14520 
14521 static int
14522 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
14523 {
14524 	struct rte_cryptodev_info dev_info;
14525 	uint8_t i, nb_devs;
14526 	int driver_id;
14527 
14528 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
14529 	if (driver_id == -1) {
14530 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
14531 		return TEST_SKIPPED;
14532 	}
14533 
14534 	nb_devs = rte_cryptodev_count();
14535 	if (nb_devs < 1) {
14536 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
14537 		return TEST_SKIPPED;
14538 	}
14539 
14540 	for (i = 0; i < nb_devs; i++) {
14541 		rte_cryptodev_info_get(i, &dev_info);
14542 		if (dev_info.driver_id == driver_id) {
14543 			if (!(dev_info.feature_flags & flag)) {
14544 				RTE_LOG(INFO, USER1, "%s not supported\n",
14545 						flag_name);
14546 				return TEST_SKIPPED;
14547 			}
14548 			return 0; /* found */
14549 		}
14550 	}
14551 
14552 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
14553 	return TEST_SKIPPED;
14554 }
14555 
14556 static int
14557 test_cryptodev_qat(void)
14558 {
14559 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14560 }
14561 
14562 static int
14563 test_cryptodev_virtio(void)
14564 {
14565 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14566 }
14567 
14568 static int
14569 test_cryptodev_aesni_mb(void)
14570 {
14571 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14572 }
14573 
14574 static int
14575 test_cryptodev_cpu_aesni_mb(void)
14576 {
14577 	int32_t rc;
14578 	enum rte_security_session_action_type at = gbl_action_type;
14579 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14580 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14581 	gbl_action_type = at;
14582 	return rc;
14583 }
14584 
14585 static int
14586 test_cryptodev_openssl(void)
14587 {
14588 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14589 }
14590 
14591 static int
14592 test_cryptodev_aesni_gcm(void)
14593 {
14594 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14595 }
14596 
14597 static int
14598 test_cryptodev_cpu_aesni_gcm(void)
14599 {
14600 	int32_t rc;
14601 	enum rte_security_session_action_type at = gbl_action_type;
14602 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14603 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14604 	gbl_action_type = at;
14605 	return rc;
14606 }
14607 
14608 static int
14609 test_cryptodev_mlx5(void)
14610 {
14611 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
14612 }
14613 
14614 static int
14615 test_cryptodev_null(void)
14616 {
14617 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14618 }
14619 
14620 static int
14621 test_cryptodev_sw_snow3g(void)
14622 {
14623 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14624 }
14625 
14626 static int
14627 test_cryptodev_sw_kasumi(void)
14628 {
14629 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14630 }
14631 
14632 static int
14633 test_cryptodev_sw_zuc(void)
14634 {
14635 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14636 }
14637 
14638 static int
14639 test_cryptodev_armv8(void)
14640 {
14641 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14642 }
14643 
14644 static int
14645 test_cryptodev_mrvl(void)
14646 {
14647 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14648 }
14649 
14650 #ifdef RTE_CRYPTO_SCHEDULER
14651 
14652 static int
14653 test_cryptodev_scheduler(void)
14654 {
14655 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
14656 	const enum blockcipher_test_type blk_suites[] = {
14657 		BLKCIPHER_AES_CHAIN_TYPE,
14658 		BLKCIPHER_AES_CIPHERONLY_TYPE,
14659 		BLKCIPHER_AUTHONLY_TYPE
14660 	};
14661 	static struct unit_test_suite scheduler_multicore = {
14662 		.suite_name = "Scheduler Multicore Unit Test Suite",
14663 		.setup = scheduler_multicore_testsuite_setup,
14664 		.teardown = scheduler_mode_testsuite_teardown,
14665 		.unit_test_cases = {TEST_CASES_END()}
14666 	};
14667 	static struct unit_test_suite scheduler_round_robin = {
14668 		.suite_name = "Scheduler Round Robin Unit Test Suite",
14669 		.setup = scheduler_roundrobin_testsuite_setup,
14670 		.teardown = scheduler_mode_testsuite_teardown,
14671 		.unit_test_cases = {TEST_CASES_END()}
14672 	};
14673 	static struct unit_test_suite scheduler_failover = {
14674 		.suite_name = "Scheduler Failover Unit Test Suite",
14675 		.setup = scheduler_failover_testsuite_setup,
14676 		.teardown = scheduler_mode_testsuite_teardown,
14677 		.unit_test_cases = {TEST_CASES_END()}
14678 	};
14679 	static struct unit_test_suite scheduler_pkt_size_distr = {
14680 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
14681 		.setup = scheduler_pkt_size_distr_testsuite_setup,
14682 		.teardown = scheduler_mode_testsuite_teardown,
14683 		.unit_test_cases = {TEST_CASES_END()}
14684 	};
14685 	struct unit_test_suite *sched_mode_suites[] = {
14686 		&scheduler_multicore,
14687 		&scheduler_round_robin,
14688 		&scheduler_failover,
14689 		&scheduler_pkt_size_distr
14690 	};
14691 	static struct unit_test_suite scheduler_config = {
14692 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
14693 		.unit_test_cases = {
14694 			TEST_CASE(test_scheduler_attach_worker_op),
14695 			TEST_CASE(test_scheduler_mode_multicore_op),
14696 			TEST_CASE(test_scheduler_mode_roundrobin_op),
14697 			TEST_CASE(test_scheduler_mode_failover_op),
14698 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
14699 			TEST_CASE(test_scheduler_detach_worker_op),
14700 
14701 			TEST_CASES_END() /**< NULL terminate array */
14702 		}
14703 	};
14704 	struct unit_test_suite *static_suites[] = {
14705 		&scheduler_config,
14706 		&end_testsuite
14707 	};
14708 	static struct unit_test_suite ts = {
14709 		.suite_name = "Scheduler Unit Test Suite",
14710 		.setup = scheduler_testsuite_setup,
14711 		.teardown = testsuite_teardown,
14712 		.unit_test_cases = {TEST_CASES_END()}
14713 	};
14714 
14715 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14716 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14717 
14718 	if (gbl_driver_id == -1) {
14719 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14720 		return TEST_SKIPPED;
14721 	}
14722 
14723 	if (rte_cryptodev_driver_id_get(
14724 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14725 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14726 		return TEST_SKIPPED;
14727 	}
14728 
14729 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
14730 		uint8_t blk_i = 0;
14731 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
14732 				(struct unit_test_suite *) *
14733 				(RTE_DIM(blk_suites) + 1));
14734 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
14735 				blk_suites, RTE_DIM(blk_suites));
14736 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
14737 	}
14738 
14739 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
14740 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
14741 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
14742 			RTE_DIM(sched_mode_suites));
14743 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
14744 	ret = unit_test_suite_runner(&ts);
14745 
14746 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
14747 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
14748 				(*sched_mode_suites[sched_i]),
14749 				RTE_DIM(blk_suites));
14750 		free(sched_mode_suites[sched_i]->unit_test_suites);
14751 	}
14752 	free(ts.unit_test_suites);
14753 	return ret;
14754 }
14755 
14756 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14757 
14758 #endif
14759 
14760 static int
14761 test_cryptodev_dpaa2_sec(void)
14762 {
14763 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14764 }
14765 
14766 static int
14767 test_cryptodev_dpaa_sec(void)
14768 {
14769 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14770 }
14771 
14772 static int
14773 test_cryptodev_ccp(void)
14774 {
14775 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14776 }
14777 
14778 static int
14779 test_cryptodev_octeontx(void)
14780 {
14781 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14782 }
14783 
14784 static int
14785 test_cryptodev_octeontx2(void)
14786 {
14787 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14788 }
14789 
14790 static int
14791 test_cryptodev_caam_jr(void)
14792 {
14793 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14794 }
14795 
14796 static int
14797 test_cryptodev_nitrox(void)
14798 {
14799 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14800 }
14801 
14802 static int
14803 test_cryptodev_bcmfs(void)
14804 {
14805 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14806 }
14807 
14808 static int
14809 test_cryptodev_qat_raw_api(void)
14810 {
14811 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
14812 	int ret;
14813 
14814 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
14815 			"RAW API");
14816 	if (ret)
14817 		return ret;
14818 
14819 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
14820 	ret = run_cryptodev_testsuite(pmd_name);
14821 	global_api_test_type = CRYPTODEV_API_TEST;
14822 
14823 	return ret;
14824 }
14825 
14826 static int
14827 test_cryptodev_cn9k(void)
14828 {
14829 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
14830 }
14831 
14832 static int
14833 test_cryptodev_cn10k(void)
14834 {
14835 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
14836 }
14837 
14838 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14839 		test_cryptodev_qat_raw_api);
14840 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14841 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14842 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14843 	test_cryptodev_cpu_aesni_mb);
14844 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14845 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14846 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14847 	test_cryptodev_cpu_aesni_gcm);
14848 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
14849 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14850 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14851 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14852 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14853 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14854 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14855 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14856 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14857 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14858 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14859 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14860 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14861 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14862 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14863 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
14864 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
14865 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
14866