xref: /dpdk/app/test/test_cryptodev.c (revision 3bb3ebb51b789d4ecb417cbdb1dce5c7211f6f18)
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 #ifndef ARRAY_SIZE
65 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
66 #endif
67 
68 static int gbl_driver_id;
69 
70 static enum rte_security_session_action_type gbl_action_type =
71 	RTE_SECURITY_ACTION_TYPE_NONE;
72 
73 enum cryptodev_api_test_type global_api_test_type = CRYPTODEV_API_TEST;
74 
75 struct crypto_testsuite_params {
76 	struct rte_mempool *mbuf_pool;
77 	struct rte_mempool *large_mbuf_pool;
78 	struct rte_mempool *op_mpool;
79 	struct rte_mempool *session_mpool;
80 	struct rte_mempool *session_priv_mpool;
81 	struct rte_cryptodev_config conf;
82 	struct rte_cryptodev_qp_conf qp_conf;
83 
84 	uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS];
85 	uint8_t valid_dev_count;
86 };
87 
88 struct crypto_unittest_params {
89 	struct rte_crypto_sym_xform cipher_xform;
90 	struct rte_crypto_sym_xform auth_xform;
91 	struct rte_crypto_sym_xform aead_xform;
92 #ifdef RTE_LIB_SECURITY
93 	struct rte_security_docsis_xform docsis_xform;
94 #endif
95 
96 	union {
97 		struct rte_cryptodev_sym_session *sess;
98 #ifdef RTE_LIB_SECURITY
99 		struct rte_security_session *sec_session;
100 #endif
101 	};
102 #ifdef RTE_LIB_SECURITY
103 	enum rte_security_session_action_type type;
104 #endif
105 	struct rte_crypto_op *op;
106 
107 	struct rte_mbuf *obuf, *ibuf;
108 
109 	uint8_t *digest;
110 };
111 
112 #define ALIGN_POW2_ROUNDUP(num, align) \
113 	(((num) + (align) - 1) & ~((align) - 1))
114 
115 /*
116  * Forward declarations.
117  */
118 static int
119 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
120 		struct crypto_unittest_params *ut_params, uint8_t *cipher_key,
121 		uint8_t *hmac_key);
122 
123 static int
124 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
125 		struct crypto_unittest_params *ut_params,
126 		struct crypto_testsuite_params *ts_param,
127 		const uint8_t *cipher,
128 		const uint8_t *digest,
129 		const uint8_t *iv);
130 
131 static struct rte_mbuf *
132 setup_test_string(struct rte_mempool *mpool,
133 		const char *string, size_t len, uint8_t blocksize)
134 {
135 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
136 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
137 
138 	memset(m->buf_addr, 0, m->buf_len);
139 	if (m) {
140 		char *dst = rte_pktmbuf_append(m, t_len);
141 
142 		if (!dst) {
143 			rte_pktmbuf_free(m);
144 			return NULL;
145 		}
146 		if (string != NULL)
147 			rte_memcpy(dst, string, t_len);
148 		else
149 			memset(dst, 0, t_len);
150 	}
151 
152 	return m;
153 }
154 
155 /* Get number of bytes in X bits (rounding up) */
156 static uint32_t
157 ceil_byte_length(uint32_t num_bits)
158 {
159 	if (num_bits % 8)
160 		return ((num_bits >> 3) + 1);
161 	else
162 		return (num_bits >> 3);
163 }
164 
165 static uint32_t
166 get_raw_dp_dequeue_count(void *user_data __rte_unused)
167 {
168 	return 1;
169 }
170 
171 static void
172 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
173 		uint8_t is_op_success)
174 {
175 	struct rte_crypto_op *op = user_data;
176 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
177 			RTE_CRYPTO_OP_STATUS_ERROR;
178 }
179 
180 void
181 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
182 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
183 		uint8_t len_in_bits, uint8_t cipher_iv_len)
184 {
185 	struct rte_crypto_sym_op *sop = op->sym;
186 	struct rte_crypto_op *ret_op = NULL;
187 	struct rte_crypto_vec data_vec[UINT8_MAX];
188 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
189 	union rte_crypto_sym_ofs ofs;
190 	struct rte_crypto_sym_vec vec;
191 	struct rte_crypto_sgl sgl;
192 	uint32_t max_len;
193 	union rte_cryptodev_session_ctx sess;
194 	uint32_t count = 0;
195 	struct rte_crypto_raw_dp_ctx *ctx;
196 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
197 			auth_len = 0;
198 	int32_t n;
199 	uint32_t n_success;
200 	int ctx_service_size;
201 	int32_t status = 0;
202 	int enqueue_status, dequeue_status;
203 
204 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
205 	if (ctx_service_size < 0) {
206 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207 		return;
208 	}
209 
210 	ctx = malloc(ctx_service_size);
211 	if (!ctx) {
212 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
213 		return;
214 	}
215 
216 	/* Both are enums, setting crypto_sess will suit any session type */
217 	sess.crypto_sess = op->sym->session;
218 
219 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
220 			op->sess_type, sess, 0) < 0) {
221 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
222 		goto exit;
223 	}
224 
225 	cipher_iv.iova = 0;
226 	cipher_iv.va = NULL;
227 	aad_auth_iv.iova = 0;
228 	aad_auth_iv.va = NULL;
229 	digest.iova = 0;
230 	digest.va = NULL;
231 	sgl.vec = data_vec;
232 	vec.num = 1;
233 	vec.sgl = &sgl;
234 	vec.iv = &cipher_iv;
235 	vec.digest = &digest;
236 	vec.aad = &aad_auth_iv;
237 	vec.status = &status;
238 
239 	ofs.raw = 0;
240 
241 	if (is_cipher && is_auth) {
242 		cipher_offset = sop->cipher.data.offset;
243 		cipher_len = sop->cipher.data.length;
244 		auth_offset = sop->auth.data.offset;
245 		auth_len = sop->auth.data.length;
246 		max_len = RTE_MAX(cipher_offset + cipher_len,
247 				auth_offset + auth_len);
248 		if (len_in_bits) {
249 			max_len = max_len >> 3;
250 			cipher_offset = cipher_offset >> 3;
251 			auth_offset = auth_offset >> 3;
252 			cipher_len = cipher_len >> 3;
253 			auth_len = auth_len >> 3;
254 		}
255 		ofs.ofs.cipher.head = cipher_offset;
256 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
257 		ofs.ofs.auth.head = auth_offset;
258 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
259 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
260 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
261 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
262 				op, void *, IV_OFFSET + cipher_iv_len);
263 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
264 				cipher_iv_len);
265 		digest.va = (void *)sop->auth.digest.data;
266 		digest.iova = sop->auth.digest.phys_addr;
267 
268 	} else if (is_cipher) {
269 		cipher_offset = sop->cipher.data.offset;
270 		cipher_len = sop->cipher.data.length;
271 		max_len = cipher_len + cipher_offset;
272 		if (len_in_bits) {
273 			max_len = max_len >> 3;
274 			cipher_offset = cipher_offset >> 3;
275 			cipher_len = cipher_len >> 3;
276 		}
277 		ofs.ofs.cipher.head = cipher_offset;
278 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
279 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
280 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
281 
282 	} else if (is_auth) {
283 		auth_offset = sop->auth.data.offset;
284 		auth_len = sop->auth.data.length;
285 		max_len = auth_len + auth_offset;
286 		if (len_in_bits) {
287 			max_len = max_len >> 3;
288 			auth_offset = auth_offset >> 3;
289 			auth_len = auth_len >> 3;
290 		}
291 		ofs.ofs.auth.head = auth_offset;
292 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
293 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
294 				op, void *, IV_OFFSET + cipher_iv_len);
295 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
296 				cipher_iv_len);
297 		digest.va = (void *)sop->auth.digest.data;
298 		digest.iova = sop->auth.digest.phys_addr;
299 
300 	} else { /* aead */
301 		cipher_offset = sop->aead.data.offset;
302 		cipher_len = sop->aead.data.length;
303 		max_len = cipher_len + cipher_offset;
304 		if (len_in_bits) {
305 			max_len = max_len >> 3;
306 			cipher_offset = cipher_offset >> 3;
307 			cipher_len = cipher_len >> 3;
308 		}
309 		ofs.ofs.cipher.head = cipher_offset;
310 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
311 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
312 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
313 		aad_auth_iv.va = (void *)sop->aead.aad.data;
314 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
315 		digest.va = (void *)sop->aead.digest.data;
316 		digest.iova = sop->aead.digest.phys_addr;
317 	}
318 
319 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
320 			data_vec, RTE_DIM(data_vec));
321 	if (n < 0 || n > sop->m_src->nb_segs) {
322 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
323 		goto exit;
324 	}
325 
326 	sgl.num = n;
327 
328 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
329 			&enqueue_status) < 1) {
330 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
331 		goto exit;
332 	}
333 
334 	if (enqueue_status == 0) {
335 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
336 		if (status < 0) {
337 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
338 			goto exit;
339 		}
340 	} else if (enqueue_status < 0) {
341 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
342 		goto exit;
343 	}
344 
345 	n = n_success = 0;
346 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
347 		n = rte_cryptodev_raw_dequeue_burst(ctx,
348 			get_raw_dp_dequeue_count, post_process_raw_dp_op,
349 				(void **)&ret_op, 0, &n_success,
350 				&dequeue_status);
351 		if (dequeue_status < 0) {
352 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
353 			goto exit;
354 		}
355 		if (n == 0)
356 			rte_pause();
357 	}
358 
359 	if (n == 1 && dequeue_status == 0) {
360 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
361 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
362 			goto exit;
363 		}
364 	}
365 
366 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
367 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
368 					RTE_CRYPTO_OP_STATUS_SUCCESS;
369 
370 exit:
371 	free(ctx);
372 }
373 
374 static void
375 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
376 {
377 	int32_t n, st;
378 	struct rte_crypto_sym_op *sop;
379 	union rte_crypto_sym_ofs ofs;
380 	struct rte_crypto_sgl sgl;
381 	struct rte_crypto_sym_vec symvec;
382 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
383 	struct rte_crypto_vec vec[UINT8_MAX];
384 
385 	sop = op->sym;
386 
387 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
388 		sop->aead.data.length, vec, RTE_DIM(vec));
389 
390 	if (n < 0 || n != sop->m_src->nb_segs) {
391 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
392 		return;
393 	}
394 
395 	sgl.vec = vec;
396 	sgl.num = n;
397 	symvec.sgl = &sgl;
398 	symvec.iv = &iv_ptr;
399 	symvec.digest = &digest_ptr;
400 	symvec.aad = &aad_ptr;
401 	symvec.status = &st;
402 	symvec.num = 1;
403 
404 	/* for CPU crypto the IOVA address is not required */
405 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
406 	digest_ptr.va = (void *)sop->aead.digest.data;
407 	aad_ptr.va = (void *)sop->aead.aad.data;
408 
409 	ofs.raw = 0;
410 
411 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
412 		&symvec);
413 
414 	if (n != 1)
415 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
416 	else
417 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
418 }
419 
420 static void
421 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
422 {
423 	int32_t n, st;
424 	struct rte_crypto_sym_op *sop;
425 	union rte_crypto_sym_ofs ofs;
426 	struct rte_crypto_sgl sgl;
427 	struct rte_crypto_sym_vec symvec;
428 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
429 	struct rte_crypto_vec vec[UINT8_MAX];
430 
431 	sop = op->sym;
432 
433 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
434 		sop->auth.data.length, vec, RTE_DIM(vec));
435 
436 	if (n < 0 || n != sop->m_src->nb_segs) {
437 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
438 		return;
439 	}
440 
441 	sgl.vec = vec;
442 	sgl.num = n;
443 	symvec.sgl = &sgl;
444 	symvec.iv = &iv_ptr;
445 	symvec.digest = &digest_ptr;
446 	symvec.status = &st;
447 	symvec.num = 1;
448 
449 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
450 	digest_ptr.va = (void *)sop->auth.digest.data;
451 
452 	ofs.raw = 0;
453 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
454 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
455 		(sop->cipher.data.offset + sop->cipher.data.length);
456 
457 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
458 		&symvec);
459 
460 	if (n != 1)
461 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
462 	else
463 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
464 }
465 
466 static struct rte_crypto_op *
467 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
468 {
469 
470 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
471 
472 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
473 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
474 		return NULL;
475 	}
476 
477 	op = NULL;
478 
479 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
480 		rte_pause();
481 
482 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
483 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
484 		return NULL;
485 	}
486 
487 	return op;
488 }
489 
490 static struct crypto_testsuite_params testsuite_params = { NULL };
491 static struct crypto_unittest_params unittest_params;
492 
493 static int
494 testsuite_setup(void)
495 {
496 	struct crypto_testsuite_params *ts_params = &testsuite_params;
497 	struct rte_cryptodev_info info;
498 	uint32_t i = 0, nb_devs, dev_id;
499 	int ret;
500 	uint16_t qp_id;
501 
502 	memset(ts_params, 0, sizeof(*ts_params));
503 
504 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
505 	if (ts_params->mbuf_pool == NULL) {
506 		/* Not already created so create */
507 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
508 				"CRYPTO_MBUFPOOL",
509 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
510 				rte_socket_id());
511 		if (ts_params->mbuf_pool == NULL) {
512 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
513 			return TEST_FAILED;
514 		}
515 	}
516 
517 	ts_params->large_mbuf_pool = rte_mempool_lookup(
518 			"CRYPTO_LARGE_MBUFPOOL");
519 	if (ts_params->large_mbuf_pool == NULL) {
520 		/* Not already created so create */
521 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
522 				"CRYPTO_LARGE_MBUFPOOL",
523 				1, 0, 0, UINT16_MAX,
524 				rte_socket_id());
525 		if (ts_params->large_mbuf_pool == NULL) {
526 			RTE_LOG(ERR, USER1,
527 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
528 			return TEST_FAILED;
529 		}
530 	}
531 
532 	ts_params->op_mpool = rte_crypto_op_pool_create(
533 			"MBUF_CRYPTO_SYM_OP_POOL",
534 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
535 			NUM_MBUFS, MBUF_CACHE_SIZE,
536 			DEFAULT_NUM_XFORMS *
537 			sizeof(struct rte_crypto_sym_xform) +
538 			MAXIMUM_IV_LENGTH,
539 			rte_socket_id());
540 	if (ts_params->op_mpool == NULL) {
541 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
542 		return TEST_FAILED;
543 	}
544 
545 	/* Create an AESNI MB device if required */
546 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
547 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
548 		nb_devs = rte_cryptodev_device_count_by_driver(
549 				rte_cryptodev_driver_id_get(
550 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
551 		if (nb_devs < 1) {
552 			ret = rte_vdev_init(
553 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
554 
555 			TEST_ASSERT(ret == 0,
556 				"Failed to create instance of"
557 				" pmd : %s",
558 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
559 		}
560 	}
561 
562 	/* Create an AESNI GCM device if required */
563 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
564 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
565 		nb_devs = rte_cryptodev_device_count_by_driver(
566 				rte_cryptodev_driver_id_get(
567 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
568 		if (nb_devs < 1) {
569 			TEST_ASSERT_SUCCESS(rte_vdev_init(
570 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
571 				"Failed to create instance of"
572 				" pmd : %s",
573 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
574 		}
575 	}
576 
577 	/* Create a SNOW 3G device if required */
578 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
579 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
580 		nb_devs = rte_cryptodev_device_count_by_driver(
581 				rte_cryptodev_driver_id_get(
582 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
583 		if (nb_devs < 1) {
584 			TEST_ASSERT_SUCCESS(rte_vdev_init(
585 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
586 				"Failed to create instance of"
587 				" pmd : %s",
588 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
589 		}
590 	}
591 
592 	/* Create a KASUMI device if required */
593 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
594 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
595 		nb_devs = rte_cryptodev_device_count_by_driver(
596 				rte_cryptodev_driver_id_get(
597 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
598 		if (nb_devs < 1) {
599 			TEST_ASSERT_SUCCESS(rte_vdev_init(
600 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
601 				"Failed to create instance of"
602 				" pmd : %s",
603 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
604 		}
605 	}
606 
607 	/* Create a ZUC device if required */
608 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
609 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
610 		nb_devs = rte_cryptodev_device_count_by_driver(
611 				rte_cryptodev_driver_id_get(
612 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
613 		if (nb_devs < 1) {
614 			TEST_ASSERT_SUCCESS(rte_vdev_init(
615 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
616 				"Failed to create instance of"
617 				" pmd : %s",
618 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
619 		}
620 	}
621 
622 	/* Create a NULL device if required */
623 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
624 			RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
625 		nb_devs = rte_cryptodev_device_count_by_driver(
626 				rte_cryptodev_driver_id_get(
627 				RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
628 		if (nb_devs < 1) {
629 			ret = rte_vdev_init(
630 				RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
631 
632 			TEST_ASSERT(ret == 0,
633 				"Failed to create instance of"
634 				" pmd : %s",
635 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
636 		}
637 	}
638 
639 	/* Create an OPENSSL device if required */
640 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
641 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
642 		nb_devs = rte_cryptodev_device_count_by_driver(
643 				rte_cryptodev_driver_id_get(
644 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
645 		if (nb_devs < 1) {
646 			ret = rte_vdev_init(
647 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
648 				NULL);
649 
650 			TEST_ASSERT(ret == 0, "Failed to create "
651 				"instance of pmd : %s",
652 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
653 		}
654 	}
655 
656 	/* Create a ARMv8 device if required */
657 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
658 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
659 		nb_devs = rte_cryptodev_device_count_by_driver(
660 				rte_cryptodev_driver_id_get(
661 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
662 		if (nb_devs < 1) {
663 			ret = rte_vdev_init(
664 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
665 				NULL);
666 
667 			TEST_ASSERT(ret == 0, "Failed to create "
668 				"instance of pmd : %s",
669 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
670 		}
671 	}
672 
673 	/* Create a MVSAM device if required */
674 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
675 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
676 		nb_devs = rte_cryptodev_device_count_by_driver(
677 				rte_cryptodev_driver_id_get(
678 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
679 		if (nb_devs < 1) {
680 			ret = rte_vdev_init(
681 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
682 				NULL);
683 
684 			TEST_ASSERT(ret == 0, "Failed to create "
685 				"instance of pmd : %s",
686 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
687 		}
688 	}
689 
690 	/* Create an CCP device if required */
691 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
692 			RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
693 		nb_devs = rte_cryptodev_device_count_by_driver(
694 				rte_cryptodev_driver_id_get(
695 				RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
696 		if (nb_devs < 1) {
697 			ret = rte_vdev_init(
698 				RTE_STR(CRYPTODEV_NAME_CCP_PMD),
699 				NULL);
700 
701 			TEST_ASSERT(ret == 0, "Failed to create "
702 				"instance of pmd : %s",
703 				RTE_STR(CRYPTODEV_NAME_CCP_PMD));
704 		}
705 	}
706 
707 #ifdef RTE_CRYPTO_SCHEDULER
708 	char vdev_args[VDEV_ARGS_SIZE] = {""};
709 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
710 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
711 	uint16_t worker_core_count = 0;
712 	uint16_t socket_id = 0;
713 
714 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
715 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
716 
717 		/* Identify the Worker Cores
718 		 * Use 2 worker cores for the device args
719 		 */
720 		RTE_LCORE_FOREACH_WORKER(i) {
721 			if (worker_core_count > 1)
722 				break;
723 			snprintf(vdev_args, sizeof(vdev_args),
724 					"%s%d", temp_str, i);
725 			strcpy(temp_str, vdev_args);
726 			strlcat(temp_str, ";", sizeof(temp_str));
727 			worker_core_count++;
728 			socket_id = rte_lcore_to_socket_id(i);
729 		}
730 		if (worker_core_count != 2) {
731 			RTE_LOG(ERR, USER1,
732 				"Cryptodev scheduler test require at least "
733 				"two worker cores to run. "
734 				"Please use the correct coremask.\n");
735 			return TEST_FAILED;
736 		}
737 		strcpy(temp_str, vdev_args);
738 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
739 				temp_str, socket_id);
740 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
741 		nb_devs = rte_cryptodev_device_count_by_driver(
742 				rte_cryptodev_driver_id_get(
743 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
744 		if (nb_devs < 1) {
745 			ret = rte_vdev_init(
746 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
747 					vdev_args);
748 			TEST_ASSERT(ret == 0,
749 				"Failed to create instance %u of"
750 				" pmd : %s",
751 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
752 		}
753 	}
754 #endif /* RTE_CRYPTO_SCHEDULER */
755 
756 	nb_devs = rte_cryptodev_count();
757 	if (nb_devs < 1) {
758 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
759 		return TEST_SKIPPED;
760 	}
761 
762 	/* Create list of valid crypto devs */
763 	for (i = 0; i < nb_devs; i++) {
764 		rte_cryptodev_info_get(i, &info);
765 		if (info.driver_id == gbl_driver_id)
766 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
767 	}
768 
769 	if (ts_params->valid_dev_count < 1)
770 		return TEST_FAILED;
771 
772 	/* Set up all the qps on the first of the valid devices found */
773 
774 	dev_id = ts_params->valid_devs[0];
775 
776 	rte_cryptodev_info_get(dev_id, &info);
777 
778 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
779 	ts_params->conf.socket_id = SOCKET_ID_ANY;
780 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
781 
782 	unsigned int session_size =
783 		rte_cryptodev_sym_get_private_session_size(dev_id);
784 
785 #ifdef RTE_LIB_SECURITY
786 	unsigned int security_session_size = rte_security_session_get_size(
787 			rte_cryptodev_get_sec_ctx(dev_id));
788 
789 	if (session_size < security_session_size)
790 		session_size = security_session_size;
791 #endif
792 	/*
793 	 * Create mempool with maximum number of sessions.
794 	 */
795 	if (info.sym.max_nb_sessions != 0 &&
796 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
797 		RTE_LOG(ERR, USER1, "Device does not support "
798 				"at least %u sessions\n",
799 				MAX_NB_SESSIONS);
800 		return TEST_FAILED;
801 	}
802 
803 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
804 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
805 			SOCKET_ID_ANY);
806 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
807 			"session mempool allocation failed");
808 
809 	ts_params->session_priv_mpool = rte_mempool_create(
810 			"test_sess_mp_priv",
811 			MAX_NB_SESSIONS,
812 			session_size,
813 			0, 0, NULL, NULL, NULL,
814 			NULL, SOCKET_ID_ANY,
815 			0);
816 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
817 			"session mempool allocation failed");
818 
819 
820 
821 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
822 			&ts_params->conf),
823 			"Failed to configure cryptodev %u with %u qps",
824 			dev_id, ts_params->conf.nb_queue_pairs);
825 
826 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
827 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
828 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
829 
830 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
831 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
832 			dev_id, qp_id, &ts_params->qp_conf,
833 			rte_cryptodev_socket_id(dev_id)),
834 			"Failed to setup queue pair %u on cryptodev %u",
835 			qp_id, dev_id);
836 	}
837 
838 	return TEST_SUCCESS;
839 }
840 
841 static void
842 testsuite_teardown(void)
843 {
844 	struct crypto_testsuite_params *ts_params = &testsuite_params;
845 
846 	if (ts_params->mbuf_pool != NULL) {
847 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
848 		rte_mempool_avail_count(ts_params->mbuf_pool));
849 	}
850 
851 	if (ts_params->op_mpool != NULL) {
852 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
853 		rte_mempool_avail_count(ts_params->op_mpool));
854 	}
855 
856 	/* Free session mempools */
857 	if (ts_params->session_priv_mpool != NULL) {
858 		rte_mempool_free(ts_params->session_priv_mpool);
859 		ts_params->session_priv_mpool = NULL;
860 	}
861 
862 	if (ts_params->session_mpool != NULL) {
863 		rte_mempool_free(ts_params->session_mpool);
864 		ts_params->session_mpool = NULL;
865 	}
866 }
867 
868 static int
869 dev_configure_and_start(uint64_t ff_disable)
870 {
871 	struct crypto_testsuite_params *ts_params = &testsuite_params;
872 	struct crypto_unittest_params *ut_params = &unittest_params;
873 
874 	uint16_t qp_id;
875 
876 	/* Clear unit test parameters before running test */
877 	memset(ut_params, 0, sizeof(*ut_params));
878 
879 	/* Reconfigure device to default parameters */
880 	ts_params->conf.socket_id = SOCKET_ID_ANY;
881 	ts_params->conf.ff_disable = ff_disable;
882 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
883 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
884 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
885 
886 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
887 			&ts_params->conf),
888 			"Failed to configure cryptodev %u",
889 			ts_params->valid_devs[0]);
890 
891 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
892 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
893 			ts_params->valid_devs[0], qp_id,
894 			&ts_params->qp_conf,
895 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
896 			"Failed to setup queue pair %u on cryptodev %u",
897 			qp_id, ts_params->valid_devs[0]);
898 	}
899 
900 
901 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
902 
903 	/* Start the device */
904 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
905 			"Failed to start cryptodev %u",
906 			ts_params->valid_devs[0]);
907 
908 	return TEST_SUCCESS;
909 }
910 
911 static int
912 ut_setup(void)
913 {
914 	/* Configure and start the device with security feature disabled */
915 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
916 }
917 
918 static int
919 ut_setup_security(void)
920 {
921 	/* Configure and start the device with no features disabled */
922 	return dev_configure_and_start(0);
923 }
924 
925 static void
926 ut_teardown(void)
927 {
928 	struct crypto_testsuite_params *ts_params = &testsuite_params;
929 	struct crypto_unittest_params *ut_params = &unittest_params;
930 	struct rte_cryptodev_stats stats;
931 
932 	/* free crypto session structure */
933 #ifdef RTE_LIB_SECURITY
934 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
935 		if (ut_params->sec_session) {
936 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
937 						(ts_params->valid_devs[0]),
938 						ut_params->sec_session);
939 			ut_params->sec_session = NULL;
940 		}
941 	} else
942 #endif
943 	{
944 		if (ut_params->sess) {
945 			rte_cryptodev_sym_session_clear(
946 					ts_params->valid_devs[0],
947 					ut_params->sess);
948 			rte_cryptodev_sym_session_free(ut_params->sess);
949 			ut_params->sess = NULL;
950 		}
951 	}
952 
953 	/* free crypto operation structure */
954 	if (ut_params->op)
955 		rte_crypto_op_free(ut_params->op);
956 
957 	/*
958 	 * free mbuf - both obuf and ibuf are usually the same,
959 	 * so check if they point at the same address is necessary,
960 	 * to avoid freeing the mbuf twice.
961 	 */
962 	if (ut_params->obuf) {
963 		rte_pktmbuf_free(ut_params->obuf);
964 		if (ut_params->ibuf == ut_params->obuf)
965 			ut_params->ibuf = 0;
966 		ut_params->obuf = 0;
967 	}
968 	if (ut_params->ibuf) {
969 		rte_pktmbuf_free(ut_params->ibuf);
970 		ut_params->ibuf = 0;
971 	}
972 
973 	if (ts_params->mbuf_pool != NULL)
974 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
975 			rte_mempool_avail_count(ts_params->mbuf_pool));
976 
977 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
978 
979 	/* Stop the device */
980 	rte_cryptodev_stop(ts_params->valid_devs[0]);
981 }
982 
983 static int
984 test_device_configure_invalid_dev_id(void)
985 {
986 	struct crypto_testsuite_params *ts_params = &testsuite_params;
987 	uint16_t dev_id, num_devs = 0;
988 
989 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
990 			"Need at least %d devices for test", 1);
991 
992 	/* valid dev_id values */
993 	dev_id = ts_params->valid_devs[0];
994 
995 	/* Stop the device in case it's started so it can be configured */
996 	rte_cryptodev_stop(dev_id);
997 
998 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
999 			"Failed test for rte_cryptodev_configure: "
1000 			"invalid dev_num %u", dev_id);
1001 
1002 	/* invalid dev_id values */
1003 	dev_id = num_devs;
1004 
1005 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1006 			"Failed test for rte_cryptodev_configure: "
1007 			"invalid dev_num %u", dev_id);
1008 
1009 	dev_id = 0xff;
1010 
1011 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1012 			"Failed test for rte_cryptodev_configure:"
1013 			"invalid dev_num %u", dev_id);
1014 
1015 	return TEST_SUCCESS;
1016 }
1017 
1018 static int
1019 test_device_configure_invalid_queue_pair_ids(void)
1020 {
1021 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1022 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1023 
1024 	/* Stop the device in case it's started so it can be configured */
1025 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1026 
1027 	/* valid - max value queue pairs */
1028 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1029 
1030 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1031 			&ts_params->conf),
1032 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1033 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1034 
1035 	/* valid - one queue pairs */
1036 	ts_params->conf.nb_queue_pairs = 1;
1037 
1038 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1039 			&ts_params->conf),
1040 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1041 			ts_params->valid_devs[0],
1042 			ts_params->conf.nb_queue_pairs);
1043 
1044 
1045 	/* invalid - zero queue pairs */
1046 	ts_params->conf.nb_queue_pairs = 0;
1047 
1048 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1049 			&ts_params->conf),
1050 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1051 			" invalid qps: %u",
1052 			ts_params->valid_devs[0],
1053 			ts_params->conf.nb_queue_pairs);
1054 
1055 
1056 	/* invalid - max value supported by field queue pairs */
1057 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1058 
1059 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1060 			&ts_params->conf),
1061 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1062 			" invalid qps: %u",
1063 			ts_params->valid_devs[0],
1064 			ts_params->conf.nb_queue_pairs);
1065 
1066 
1067 	/* invalid - max value + 1 queue pairs */
1068 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1069 
1070 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1071 			&ts_params->conf),
1072 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1073 			" invalid qps: %u",
1074 			ts_params->valid_devs[0],
1075 			ts_params->conf.nb_queue_pairs);
1076 
1077 	/* revert to original testsuite value */
1078 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1079 
1080 	return TEST_SUCCESS;
1081 }
1082 
1083 static int
1084 test_queue_pair_descriptor_setup(void)
1085 {
1086 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1087 	struct rte_cryptodev_qp_conf qp_conf = {
1088 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1089 	};
1090 	uint16_t qp_id;
1091 
1092 	/* Stop the device in case it's started so it can be configured */
1093 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1094 
1095 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1096 			&ts_params->conf),
1097 			"Failed to configure cryptodev %u",
1098 			ts_params->valid_devs[0]);
1099 
1100 	/*
1101 	 * Test various ring sizes on this device. memzones can't be
1102 	 * freed so are re-used if ring is released and re-created.
1103 	 */
1104 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1105 	qp_conf.mp_session = ts_params->session_mpool;
1106 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1107 
1108 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1109 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1110 				ts_params->valid_devs[0], qp_id, &qp_conf,
1111 				rte_cryptodev_socket_id(
1112 						ts_params->valid_devs[0])),
1113 				"Failed test for "
1114 				"rte_cryptodev_queue_pair_setup: num_inflights "
1115 				"%u on qp %u on cryptodev %u",
1116 				qp_conf.nb_descriptors, qp_id,
1117 				ts_params->valid_devs[0]);
1118 	}
1119 
1120 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1121 
1122 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1123 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1124 				ts_params->valid_devs[0], qp_id, &qp_conf,
1125 				rte_cryptodev_socket_id(
1126 						ts_params->valid_devs[0])),
1127 				"Failed test for"
1128 				" rte_cryptodev_queue_pair_setup: num_inflights"
1129 				" %u on qp %u on cryptodev %u",
1130 				qp_conf.nb_descriptors, qp_id,
1131 				ts_params->valid_devs[0]);
1132 	}
1133 
1134 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1135 
1136 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1137 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1138 				ts_params->valid_devs[0], qp_id, &qp_conf,
1139 				rte_cryptodev_socket_id(
1140 						ts_params->valid_devs[0])),
1141 				"Failed test for "
1142 				"rte_cryptodev_queue_pair_setup: num_inflights"
1143 				" %u on qp %u on cryptodev %u",
1144 				qp_conf.nb_descriptors, qp_id,
1145 				ts_params->valid_devs[0]);
1146 	}
1147 
1148 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1149 
1150 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1151 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1152 				ts_params->valid_devs[0], qp_id, &qp_conf,
1153 				rte_cryptodev_socket_id(
1154 						ts_params->valid_devs[0])),
1155 				"Failed test for"
1156 				" rte_cryptodev_queue_pair_setup:"
1157 				"num_inflights %u on qp %u on cryptodev %u",
1158 				qp_conf.nb_descriptors, qp_id,
1159 				ts_params->valid_devs[0]);
1160 	}
1161 
1162 	/* test invalid queue pair id */
1163 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1164 
1165 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1166 
1167 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1168 			ts_params->valid_devs[0],
1169 			qp_id, &qp_conf,
1170 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1171 			"Failed test for rte_cryptodev_queue_pair_setup:"
1172 			"invalid qp %u on cryptodev %u",
1173 			qp_id, ts_params->valid_devs[0]);
1174 
1175 	qp_id = 0xffff; /*invalid*/
1176 
1177 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1178 			ts_params->valid_devs[0],
1179 			qp_id, &qp_conf,
1180 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1181 			"Failed test for rte_cryptodev_queue_pair_setup:"
1182 			"invalid qp %u on cryptodev %u",
1183 			qp_id, ts_params->valid_devs[0]);
1184 
1185 	return TEST_SUCCESS;
1186 }
1187 
1188 /* ***** Plaintext data for tests ***** */
1189 
1190 const char catch_22_quote_1[] =
1191 		"There was only one catch and that was Catch-22, which "
1192 		"specified that a concern for one's safety in the face of "
1193 		"dangers that were real and immediate was the process of a "
1194 		"rational mind. Orr was crazy and could be grounded. All he "
1195 		"had to do was ask; and as soon as he did, he would no longer "
1196 		"be crazy and would have to fly more missions. Orr would be "
1197 		"crazy to fly more missions and sane if he didn't, but if he "
1198 		"was sane he had to fly them. If he flew them he was crazy "
1199 		"and didn't have to; but if he didn't want to he was sane and "
1200 		"had to. Yossarian was moved very deeply by the absolute "
1201 		"simplicity of this clause of Catch-22 and let out a "
1202 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1203 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1204 
1205 const char catch_22_quote[] =
1206 		"What a lousy earth! He wondered how many people were "
1207 		"destitute that same night even in his own prosperous country, "
1208 		"how many homes were shanties, how many husbands were drunk "
1209 		"and wives socked, and how many children were bullied, abused, "
1210 		"or abandoned. How many families hungered for food they could "
1211 		"not afford to buy? How many hearts were broken? How many "
1212 		"suicides would take place that same night, how many people "
1213 		"would go insane? How many cockroaches and landlords would "
1214 		"triumph? How many winners were losers, successes failures, "
1215 		"and rich men poor men? How many wise guys were stupid? How "
1216 		"many happy endings were unhappy endings? How many honest men "
1217 		"were liars, brave men cowards, loyal men traitors, how many "
1218 		"sainted men were corrupt, how many people in positions of "
1219 		"trust had sold their souls to bodyguards, how many had never "
1220 		"had souls? How many straight-and-narrow paths were crooked "
1221 		"paths? How many best families were worst families and how "
1222 		"many good people were bad people? When you added them all up "
1223 		"and then subtracted, you might be left with only the children, "
1224 		"and perhaps with Albert Einstein and an old violinist or "
1225 		"sculptor somewhere.";
1226 
1227 #define QUOTE_480_BYTES		(480)
1228 #define QUOTE_512_BYTES		(512)
1229 #define QUOTE_768_BYTES		(768)
1230 #define QUOTE_1024_BYTES	(1024)
1231 
1232 
1233 
1234 /* ***** SHA1 Hash Tests ***** */
1235 
1236 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1237 
1238 static uint8_t hmac_sha1_key[] = {
1239 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1240 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1241 	0xDE, 0xF4, 0xDE, 0xAD };
1242 
1243 /* ***** SHA224 Hash Tests ***** */
1244 
1245 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1246 
1247 
1248 /* ***** AES-CBC Cipher Tests ***** */
1249 
1250 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1251 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1252 
1253 static uint8_t aes_cbc_key[] = {
1254 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1255 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1256 
1257 static uint8_t aes_cbc_iv[] = {
1258 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1259 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1260 
1261 
1262 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1263 
1264 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1265 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1266 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1267 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1268 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1269 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1270 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1271 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1272 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1273 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1274 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1275 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1276 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1277 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1278 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1279 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1280 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1281 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1282 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1283 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1284 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1285 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1286 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1287 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1288 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1289 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1290 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1291 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1292 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1293 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1294 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1295 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1296 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1297 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1298 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1299 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1300 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1301 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1302 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1303 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1304 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1305 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1306 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1307 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1308 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1309 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1310 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1311 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1312 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1313 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1314 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1315 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1316 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1317 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1318 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1319 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1320 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1321 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1322 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1323 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1324 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1325 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1326 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1327 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1328 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1329 };
1330 
1331 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1332 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1333 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1334 	0x18, 0x8c, 0x1d, 0x32
1335 };
1336 
1337 
1338 /* Multisession Vector context Test */
1339 /*Begin Session 0 */
1340 static uint8_t ms_aes_cbc_key0[] = {
1341 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1342 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1343 };
1344 
1345 static uint8_t ms_aes_cbc_iv0[] = {
1346 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1347 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1348 };
1349 
1350 static const uint8_t ms_aes_cbc_cipher0[] = {
1351 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1352 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1353 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1354 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1355 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1356 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1357 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1358 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1359 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1360 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1361 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1362 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1363 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1364 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1365 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1366 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1367 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1368 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1369 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1370 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1371 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1372 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1373 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1374 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1375 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1376 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1377 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1378 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1379 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1380 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1381 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1382 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1383 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1384 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1385 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1386 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1387 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1388 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1389 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1390 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1391 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1392 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1393 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1394 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1395 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1396 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1397 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1398 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1399 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1400 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1401 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1402 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1403 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1404 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1405 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1406 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1407 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1408 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1409 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1410 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1411 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1412 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1413 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1414 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1415 };
1416 
1417 
1418 static  uint8_t ms_hmac_key0[] = {
1419 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1420 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1421 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1422 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1423 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1424 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1425 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1426 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1427 };
1428 
1429 static const uint8_t ms_hmac_digest0[] = {
1430 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1431 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1432 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1433 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1434 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1435 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1436 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1437 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1438 		};
1439 
1440 /* End Session 0 */
1441 /* Begin session 1 */
1442 
1443 static  uint8_t ms_aes_cbc_key1[] = {
1444 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1445 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1446 };
1447 
1448 static  uint8_t ms_aes_cbc_iv1[] = {
1449 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1450 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1451 };
1452 
1453 static const uint8_t ms_aes_cbc_cipher1[] = {
1454 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1455 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1456 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1457 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1458 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1459 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1460 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1461 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1462 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1463 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1464 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1465 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1466 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1467 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1468 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1469 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1470 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1471 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1472 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1473 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1474 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1475 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1476 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1477 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1478 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1479 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1480 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1481 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1482 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1483 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1484 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1485 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1486 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1487 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1488 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1489 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1490 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1491 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1492 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1493 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1494 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1495 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1496 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1497 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1498 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1499 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1500 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1501 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1502 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1503 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1504 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1505 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1506 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1507 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1508 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1509 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1510 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1511 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1512 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1513 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1514 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1515 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1516 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1517 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1518 
1519 };
1520 
1521 static uint8_t ms_hmac_key1[] = {
1522 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1523 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1524 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1525 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1526 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1527 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1528 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1529 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1530 };
1531 
1532 static const uint8_t ms_hmac_digest1[] = {
1533 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1534 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1535 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1536 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1537 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1538 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1539 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1540 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1541 };
1542 /* End Session 1  */
1543 /* Begin Session 2 */
1544 static  uint8_t ms_aes_cbc_key2[] = {
1545 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1546 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1547 };
1548 
1549 static  uint8_t ms_aes_cbc_iv2[] = {
1550 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1551 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1552 };
1553 
1554 static const uint8_t ms_aes_cbc_cipher2[] = {
1555 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1556 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1557 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1558 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1559 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1560 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1561 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1562 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1563 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1564 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1565 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1566 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1567 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1568 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1569 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1570 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1571 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1572 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1573 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1574 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1575 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1576 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1577 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1578 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1579 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1580 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1581 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1582 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1583 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1584 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1585 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1586 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1587 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1588 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1589 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1590 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1591 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1592 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1593 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1594 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1595 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1596 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1597 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1598 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1599 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1600 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1601 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1602 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1603 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1604 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1605 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1606 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1607 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1608 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1609 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1610 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1611 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1612 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1613 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1614 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1615 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1616 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1617 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1618 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1619 };
1620 
1621 static  uint8_t ms_hmac_key2[] = {
1622 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1623 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1624 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1625 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1626 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1627 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1628 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1629 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1630 };
1631 
1632 static const uint8_t ms_hmac_digest2[] = {
1633 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1634 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1635 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1636 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1637 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1638 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1639 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1640 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1641 };
1642 
1643 /* End Session 2 */
1644 
1645 
1646 static int
1647 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1648 {
1649 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1650 	struct crypto_unittest_params *ut_params = &unittest_params;
1651 
1652 	/* Verify the capabilities */
1653 	struct rte_cryptodev_sym_capability_idx cap_idx;
1654 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1655 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1656 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1657 			&cap_idx) == NULL)
1658 		return -ENOTSUP;
1659 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1660 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1661 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1662 			&cap_idx) == NULL)
1663 		return -ENOTSUP;
1664 
1665 	/* Generate test mbuf data and space for digest */
1666 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1667 			catch_22_quote,	QUOTE_512_BYTES, 0);
1668 
1669 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1670 			DIGEST_BYTE_LENGTH_SHA1);
1671 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1672 
1673 	/* Setup Cipher Parameters */
1674 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1675 	ut_params->cipher_xform.next = &ut_params->auth_xform;
1676 
1677 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1678 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1679 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1680 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1681 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1682 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1683 
1684 	/* Setup HMAC Parameters */
1685 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1686 
1687 	ut_params->auth_xform.next = NULL;
1688 
1689 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1690 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1691 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1692 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1693 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1694 
1695 	ut_params->sess = rte_cryptodev_sym_session_create(
1696 			ts_params->session_mpool);
1697 
1698 	/* Create crypto session*/
1699 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1700 			ut_params->sess, &ut_params->cipher_xform,
1701 			ts_params->session_priv_mpool);
1702 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1703 
1704 	/* Generate crypto op data structure */
1705 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1706 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1707 	TEST_ASSERT_NOT_NULL(ut_params->op,
1708 			"Failed to allocate symmetric crypto operation struct");
1709 
1710 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1711 
1712 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1713 
1714 	/* set crypto operation source mbuf */
1715 	sym_op->m_src = ut_params->ibuf;
1716 
1717 	/* Set crypto operation authentication parameters */
1718 	sym_op->auth.digest.data = ut_params->digest;
1719 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1720 			ut_params->ibuf, QUOTE_512_BYTES);
1721 
1722 	sym_op->auth.data.offset = 0;
1723 	sym_op->auth.data.length = QUOTE_512_BYTES;
1724 
1725 	/* Copy IV at the end of the crypto operation */
1726 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1727 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1728 
1729 	/* Set crypto operation cipher parameters */
1730 	sym_op->cipher.data.offset = 0;
1731 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1732 
1733 	/* Process crypto operation */
1734 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1735 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1736 			ut_params->op);
1737 	else
1738 		TEST_ASSERT_NOT_NULL(
1739 			process_crypto_request(ts_params->valid_devs[0],
1740 				ut_params->op),
1741 				"failed to process sym crypto op");
1742 
1743 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1744 			"crypto op processing failed");
1745 
1746 	/* Validate obuf */
1747 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1748 			uint8_t *);
1749 
1750 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1751 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1752 			QUOTE_512_BYTES,
1753 			"ciphertext data not as expected");
1754 
1755 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1756 
1757 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1758 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1759 			gbl_driver_id == rte_cryptodev_driver_id_get(
1760 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1761 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1762 					DIGEST_BYTE_LENGTH_SHA1,
1763 			"Generated digest data not as expected");
1764 
1765 	return TEST_SUCCESS;
1766 }
1767 
1768 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1769 
1770 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1771 
1772 static uint8_t hmac_sha512_key[] = {
1773 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1774 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1775 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1776 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1777 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1778 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1779 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1780 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1781 
1782 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1783 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1784 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1785 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1786 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1787 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1788 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1789 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1790 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1791 
1792 
1793 
1794 static int
1795 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1796 		struct crypto_unittest_params *ut_params,
1797 		uint8_t *cipher_key,
1798 		uint8_t *hmac_key);
1799 
1800 static int
1801 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1802 		struct crypto_unittest_params *ut_params,
1803 		struct crypto_testsuite_params *ts_params,
1804 		const uint8_t *cipher,
1805 		const uint8_t *digest,
1806 		const uint8_t *iv);
1807 
1808 
1809 static int
1810 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1811 		struct crypto_unittest_params *ut_params,
1812 		uint8_t *cipher_key,
1813 		uint8_t *hmac_key)
1814 {
1815 
1816 	/* Setup Cipher Parameters */
1817 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1818 	ut_params->cipher_xform.next = NULL;
1819 
1820 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1821 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1822 	ut_params->cipher_xform.cipher.key.data = cipher_key;
1823 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1824 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1825 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1826 
1827 	/* Setup HMAC Parameters */
1828 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1829 	ut_params->auth_xform.next = &ut_params->cipher_xform;
1830 
1831 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1832 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1833 	ut_params->auth_xform.auth.key.data = hmac_key;
1834 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1835 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1836 
1837 	return TEST_SUCCESS;
1838 }
1839 
1840 
1841 static int
1842 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1843 		struct crypto_unittest_params *ut_params,
1844 		struct crypto_testsuite_params *ts_params,
1845 		const uint8_t *cipher,
1846 		const uint8_t *digest,
1847 		const uint8_t *iv)
1848 {
1849 	/* Generate test mbuf data and digest */
1850 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1851 			(const char *)
1852 			cipher,
1853 			QUOTE_512_BYTES, 0);
1854 
1855 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1856 			DIGEST_BYTE_LENGTH_SHA512);
1857 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1858 
1859 	rte_memcpy(ut_params->digest,
1860 			digest,
1861 			DIGEST_BYTE_LENGTH_SHA512);
1862 
1863 	/* Generate Crypto op data structure */
1864 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1865 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1866 	TEST_ASSERT_NOT_NULL(ut_params->op,
1867 			"Failed to allocate symmetric crypto operation struct");
1868 
1869 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
1870 
1871 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1872 
1873 	/* set crypto operation source mbuf */
1874 	sym_op->m_src = ut_params->ibuf;
1875 
1876 	sym_op->auth.digest.data = ut_params->digest;
1877 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1878 			ut_params->ibuf, QUOTE_512_BYTES);
1879 
1880 	sym_op->auth.data.offset = 0;
1881 	sym_op->auth.data.length = QUOTE_512_BYTES;
1882 
1883 	/* Copy IV at the end of the crypto operation */
1884 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1885 			iv, CIPHER_IV_LENGTH_AES_CBC);
1886 
1887 	sym_op->cipher.data.offset = 0;
1888 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1889 
1890 	/* Process crypto operation */
1891 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1892 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1893 			ut_params->op);
1894 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1895 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
1896 				ut_params->op, 1, 1, 0, 0);
1897 	else
1898 		TEST_ASSERT_NOT_NULL(
1899 				process_crypto_request(ts_params->valid_devs[0],
1900 					ut_params->op),
1901 					"failed to process sym crypto op");
1902 
1903 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1904 			"crypto op processing failed");
1905 
1906 	ut_params->obuf = ut_params->op->sym->m_src;
1907 
1908 	/* Validate obuf */
1909 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
1910 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1911 			catch_22_quote,
1912 			QUOTE_512_BYTES,
1913 			"Plaintext data not as expected");
1914 
1915 	/* Validate obuf */
1916 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1917 			"Digest verification failed");
1918 
1919 	return TEST_SUCCESS;
1920 }
1921 
1922 static int
1923 test_blockcipher(enum blockcipher_test_type test_type)
1924 {
1925 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1926 	int status;
1927 
1928 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1929 		ts_params->op_mpool,
1930 		ts_params->session_mpool, ts_params->session_priv_mpool,
1931 		ts_params->valid_devs[0],
1932 		test_type);
1933 
1934 	if (status == -ENOTSUP)
1935 		return status;
1936 
1937 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1938 
1939 	return TEST_SUCCESS;
1940 }
1941 
1942 static int
1943 test_AES_cipheronly_all(void)
1944 {
1945 	return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1946 }
1947 
1948 static int
1949 test_AES_docsis_all(void)
1950 {
1951 	/* Data-path service does not support DOCSIS yet */
1952 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1953 		return -ENOTSUP;
1954 	return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1955 }
1956 
1957 static int
1958 test_DES_docsis_all(void)
1959 {
1960 	/* Data-path service does not support DOCSIS yet */
1961 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1962 		return -ENOTSUP;
1963 	return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1964 }
1965 
1966 static int
1967 test_DES_cipheronly_all(void)
1968 {
1969 	return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1970 }
1971 
1972 static int
1973 test_authonly_all(void)
1974 {
1975 	return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1976 }
1977 
1978 static int
1979 test_AES_chain_all(void)
1980 {
1981 	return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1982 }
1983 
1984 static int
1985 test_3DES_chain_all(void)
1986 {
1987 	return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1988 }
1989 
1990 static int
1991 test_3DES_cipheronly_all(void)
1992 {
1993 	return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1994 }
1995 
1996 /* ***** SNOW 3G Tests ***** */
1997 static int
1998 create_wireless_algo_hash_session(uint8_t dev_id,
1999 	const uint8_t *key, const uint8_t key_len,
2000 	const uint8_t iv_len, const uint8_t auth_len,
2001 	enum rte_crypto_auth_operation op,
2002 	enum rte_crypto_auth_algorithm algo)
2003 {
2004 	uint8_t hash_key[key_len];
2005 	int status;
2006 
2007 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2008 	struct crypto_unittest_params *ut_params = &unittest_params;
2009 
2010 	memcpy(hash_key, key, key_len);
2011 
2012 	debug_hexdump(stdout, "key:", key, key_len);
2013 
2014 	/* Setup Authentication Parameters */
2015 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2016 	ut_params->auth_xform.next = NULL;
2017 
2018 	ut_params->auth_xform.auth.op = op;
2019 	ut_params->auth_xform.auth.algo = algo;
2020 	ut_params->auth_xform.auth.key.length = key_len;
2021 	ut_params->auth_xform.auth.key.data = hash_key;
2022 	ut_params->auth_xform.auth.digest_length = auth_len;
2023 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2024 	ut_params->auth_xform.auth.iv.length = iv_len;
2025 	ut_params->sess = rte_cryptodev_sym_session_create(
2026 			ts_params->session_mpool);
2027 
2028 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2029 			&ut_params->auth_xform,
2030 			ts_params->session_priv_mpool);
2031 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2032 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2033 	return 0;
2034 }
2035 
2036 static int
2037 create_wireless_algo_cipher_session(uint8_t dev_id,
2038 			enum rte_crypto_cipher_operation op,
2039 			enum rte_crypto_cipher_algorithm algo,
2040 			const uint8_t *key, const uint8_t key_len,
2041 			uint8_t iv_len)
2042 {
2043 	uint8_t cipher_key[key_len];
2044 	int status;
2045 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2046 	struct crypto_unittest_params *ut_params = &unittest_params;
2047 
2048 	memcpy(cipher_key, key, key_len);
2049 
2050 	/* Setup Cipher Parameters */
2051 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2052 	ut_params->cipher_xform.next = NULL;
2053 
2054 	ut_params->cipher_xform.cipher.algo = algo;
2055 	ut_params->cipher_xform.cipher.op = op;
2056 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2057 	ut_params->cipher_xform.cipher.key.length = key_len;
2058 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2059 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2060 
2061 	debug_hexdump(stdout, "key:", key, key_len);
2062 
2063 	/* Create Crypto session */
2064 	ut_params->sess = rte_cryptodev_sym_session_create(
2065 			ts_params->session_mpool);
2066 
2067 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2068 			&ut_params->cipher_xform,
2069 			ts_params->session_priv_mpool);
2070 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2071 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2072 	return 0;
2073 }
2074 
2075 static int
2076 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2077 			unsigned int cipher_len,
2078 			unsigned int cipher_offset)
2079 {
2080 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2081 	struct crypto_unittest_params *ut_params = &unittest_params;
2082 
2083 	/* Generate Crypto op data structure */
2084 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2085 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2086 	TEST_ASSERT_NOT_NULL(ut_params->op,
2087 				"Failed to allocate pktmbuf offload");
2088 
2089 	/* Set crypto operation data parameters */
2090 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2091 
2092 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2093 
2094 	/* set crypto operation source mbuf */
2095 	sym_op->m_src = ut_params->ibuf;
2096 
2097 	/* iv */
2098 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2099 			iv, iv_len);
2100 	sym_op->cipher.data.length = cipher_len;
2101 	sym_op->cipher.data.offset = cipher_offset;
2102 	return 0;
2103 }
2104 
2105 static int
2106 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2107 			unsigned int cipher_len,
2108 			unsigned int cipher_offset)
2109 {
2110 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2111 	struct crypto_unittest_params *ut_params = &unittest_params;
2112 
2113 	/* Generate Crypto op data structure */
2114 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2115 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2116 	TEST_ASSERT_NOT_NULL(ut_params->op,
2117 				"Failed to allocate pktmbuf offload");
2118 
2119 	/* Set crypto operation data parameters */
2120 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2121 
2122 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2123 
2124 	/* set crypto operation source mbuf */
2125 	sym_op->m_src = ut_params->ibuf;
2126 	sym_op->m_dst = ut_params->obuf;
2127 
2128 	/* iv */
2129 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2130 			iv, iv_len);
2131 	sym_op->cipher.data.length = cipher_len;
2132 	sym_op->cipher.data.offset = cipher_offset;
2133 	return 0;
2134 }
2135 
2136 static int
2137 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2138 		enum rte_crypto_cipher_operation cipher_op,
2139 		enum rte_crypto_auth_operation auth_op,
2140 		enum rte_crypto_auth_algorithm auth_algo,
2141 		enum rte_crypto_cipher_algorithm cipher_algo,
2142 		const uint8_t *key, uint8_t key_len,
2143 		uint8_t auth_iv_len, uint8_t auth_len,
2144 		uint8_t cipher_iv_len)
2145 
2146 {
2147 	uint8_t cipher_auth_key[key_len];
2148 	int status;
2149 
2150 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2151 	struct crypto_unittest_params *ut_params = &unittest_params;
2152 
2153 	memcpy(cipher_auth_key, key, key_len);
2154 
2155 	/* Setup Authentication Parameters */
2156 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2157 	ut_params->auth_xform.next = NULL;
2158 
2159 	ut_params->auth_xform.auth.op = auth_op;
2160 	ut_params->auth_xform.auth.algo = auth_algo;
2161 	ut_params->auth_xform.auth.key.length = key_len;
2162 	/* Hash key = cipher key */
2163 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2164 	ut_params->auth_xform.auth.digest_length = auth_len;
2165 	/* Auth IV will be after cipher IV */
2166 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2167 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2168 
2169 	/* Setup Cipher Parameters */
2170 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2171 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2172 
2173 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2174 	ut_params->cipher_xform.cipher.op = cipher_op;
2175 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2176 	ut_params->cipher_xform.cipher.key.length = key_len;
2177 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2178 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2179 
2180 	debug_hexdump(stdout, "key:", key, key_len);
2181 
2182 	/* Create Crypto session*/
2183 	ut_params->sess = rte_cryptodev_sym_session_create(
2184 			ts_params->session_mpool);
2185 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2186 
2187 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2188 			&ut_params->cipher_xform,
2189 			ts_params->session_priv_mpool);
2190 	if (status == -ENOTSUP)
2191 		return status;
2192 
2193 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2194 	return 0;
2195 }
2196 
2197 static int
2198 create_wireless_cipher_auth_session(uint8_t dev_id,
2199 		enum rte_crypto_cipher_operation cipher_op,
2200 		enum rte_crypto_auth_operation auth_op,
2201 		enum rte_crypto_auth_algorithm auth_algo,
2202 		enum rte_crypto_cipher_algorithm cipher_algo,
2203 		const struct wireless_test_data *tdata)
2204 {
2205 	const uint8_t key_len = tdata->key.len;
2206 	uint8_t cipher_auth_key[key_len];
2207 	int status;
2208 
2209 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2210 	struct crypto_unittest_params *ut_params = &unittest_params;
2211 	const uint8_t *key = tdata->key.data;
2212 	const uint8_t auth_len = tdata->digest.len;
2213 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2214 	uint8_t auth_iv_len = tdata->auth_iv.len;
2215 
2216 	memcpy(cipher_auth_key, key, key_len);
2217 
2218 	/* Setup Authentication Parameters */
2219 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2220 	ut_params->auth_xform.next = NULL;
2221 
2222 	ut_params->auth_xform.auth.op = auth_op;
2223 	ut_params->auth_xform.auth.algo = auth_algo;
2224 	ut_params->auth_xform.auth.key.length = key_len;
2225 	/* Hash key = cipher key */
2226 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2227 	ut_params->auth_xform.auth.digest_length = auth_len;
2228 	/* Auth IV will be after cipher IV */
2229 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2230 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2231 
2232 	/* Setup Cipher Parameters */
2233 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2234 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2235 
2236 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2237 	ut_params->cipher_xform.cipher.op = cipher_op;
2238 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2239 	ut_params->cipher_xform.cipher.key.length = key_len;
2240 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2241 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2242 
2243 
2244 	debug_hexdump(stdout, "key:", key, key_len);
2245 
2246 	/* Create Crypto session*/
2247 	ut_params->sess = rte_cryptodev_sym_session_create(
2248 			ts_params->session_mpool);
2249 
2250 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2251 			&ut_params->cipher_xform,
2252 			ts_params->session_priv_mpool);
2253 	if (status == -ENOTSUP)
2254 		return status;
2255 
2256 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2257 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2258 	return 0;
2259 }
2260 
2261 static int
2262 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2263 		const struct wireless_test_data *tdata)
2264 {
2265 	return create_wireless_cipher_auth_session(dev_id,
2266 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2267 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2268 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2269 }
2270 
2271 static int
2272 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2273 		enum rte_crypto_cipher_operation cipher_op,
2274 		enum rte_crypto_auth_operation auth_op,
2275 		enum rte_crypto_auth_algorithm auth_algo,
2276 		enum rte_crypto_cipher_algorithm cipher_algo,
2277 		const uint8_t *key, const uint8_t key_len,
2278 		uint8_t auth_iv_len, uint8_t auth_len,
2279 		uint8_t cipher_iv_len)
2280 {
2281 	uint8_t auth_cipher_key[key_len];
2282 	int status;
2283 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2284 	struct crypto_unittest_params *ut_params = &unittest_params;
2285 
2286 	memcpy(auth_cipher_key, key, key_len);
2287 
2288 	/* Setup Authentication Parameters */
2289 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2290 	ut_params->auth_xform.auth.op = auth_op;
2291 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2292 	ut_params->auth_xform.auth.algo = auth_algo;
2293 	ut_params->auth_xform.auth.key.length = key_len;
2294 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2295 	ut_params->auth_xform.auth.digest_length = auth_len;
2296 	/* Auth IV will be after cipher IV */
2297 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2298 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2299 
2300 	/* Setup Cipher Parameters */
2301 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2302 	ut_params->cipher_xform.next = NULL;
2303 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2304 	ut_params->cipher_xform.cipher.op = cipher_op;
2305 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2306 	ut_params->cipher_xform.cipher.key.length = key_len;
2307 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2308 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2309 
2310 	debug_hexdump(stdout, "key:", key, key_len);
2311 
2312 	/* Create Crypto session*/
2313 	ut_params->sess = rte_cryptodev_sym_session_create(
2314 			ts_params->session_mpool);
2315 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2316 
2317 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2318 		ut_params->auth_xform.next = NULL;
2319 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2320 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2321 				&ut_params->cipher_xform,
2322 				ts_params->session_priv_mpool);
2323 
2324 	} else
2325 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2326 				&ut_params->auth_xform,
2327 				ts_params->session_priv_mpool);
2328 
2329 	if (status == -ENOTSUP)
2330 		return status;
2331 
2332 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2333 
2334 	return 0;
2335 }
2336 
2337 static int
2338 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2339 		unsigned int auth_tag_len,
2340 		const uint8_t *iv, unsigned int iv_len,
2341 		unsigned int data_pad_len,
2342 		enum rte_crypto_auth_operation op,
2343 		unsigned int auth_len, unsigned int auth_offset)
2344 {
2345 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2346 
2347 	struct crypto_unittest_params *ut_params = &unittest_params;
2348 
2349 	/* Generate Crypto op data structure */
2350 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2351 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2352 	TEST_ASSERT_NOT_NULL(ut_params->op,
2353 		"Failed to allocate pktmbuf offload");
2354 
2355 	/* Set crypto operation data parameters */
2356 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2357 
2358 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2359 
2360 	/* set crypto operation source mbuf */
2361 	sym_op->m_src = ut_params->ibuf;
2362 
2363 	/* iv */
2364 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2365 			iv, iv_len);
2366 	/* digest */
2367 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2368 					ut_params->ibuf, auth_tag_len);
2369 
2370 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2371 				"no room to append auth tag");
2372 	ut_params->digest = sym_op->auth.digest.data;
2373 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2374 			ut_params->ibuf, data_pad_len);
2375 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2376 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2377 	else
2378 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2379 
2380 	debug_hexdump(stdout, "digest:",
2381 		sym_op->auth.digest.data,
2382 		auth_tag_len);
2383 
2384 	sym_op->auth.data.length = auth_len;
2385 	sym_op->auth.data.offset = auth_offset;
2386 
2387 	return 0;
2388 }
2389 
2390 static int
2391 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2392 	enum rte_crypto_auth_operation op)
2393 {
2394 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2395 	struct crypto_unittest_params *ut_params = &unittest_params;
2396 
2397 	const uint8_t *auth_tag = tdata->digest.data;
2398 	const unsigned int auth_tag_len = tdata->digest.len;
2399 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2400 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2401 
2402 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2403 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2404 	const uint8_t *auth_iv = tdata->auth_iv.data;
2405 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2406 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2407 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2408 
2409 	/* Generate Crypto op data structure */
2410 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2411 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2412 	TEST_ASSERT_NOT_NULL(ut_params->op,
2413 			"Failed to allocate pktmbuf offload");
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 	/* digest */
2423 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2424 			ut_params->ibuf, auth_tag_len);
2425 
2426 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2427 			"no room to append auth tag");
2428 	ut_params->digest = sym_op->auth.digest.data;
2429 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2430 			ut_params->ibuf, data_pad_len);
2431 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2432 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2433 	else
2434 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2435 
2436 	debug_hexdump(stdout, "digest:",
2437 		sym_op->auth.digest.data,
2438 		auth_tag_len);
2439 
2440 	/* Copy cipher and auth IVs at the end of the crypto operation */
2441 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2442 						IV_OFFSET);
2443 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2444 	iv_ptr += cipher_iv_len;
2445 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2446 
2447 	sym_op->cipher.data.length = cipher_len;
2448 	sym_op->cipher.data.offset = 0;
2449 	sym_op->auth.data.length = auth_len;
2450 	sym_op->auth.data.offset = 0;
2451 
2452 	return 0;
2453 }
2454 
2455 static int
2456 create_zuc_cipher_hash_generate_operation(
2457 		const struct wireless_test_data *tdata)
2458 {
2459 	return create_wireless_cipher_hash_operation(tdata,
2460 		RTE_CRYPTO_AUTH_OP_GENERATE);
2461 }
2462 
2463 static int
2464 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2465 		const unsigned auth_tag_len,
2466 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2467 		unsigned data_pad_len,
2468 		enum rte_crypto_auth_operation op,
2469 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2470 		const unsigned cipher_len, const unsigned cipher_offset,
2471 		const unsigned auth_len, const unsigned auth_offset)
2472 {
2473 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2474 	struct crypto_unittest_params *ut_params = &unittest_params;
2475 
2476 	enum rte_crypto_cipher_algorithm cipher_algo =
2477 			ut_params->cipher_xform.cipher.algo;
2478 	enum rte_crypto_auth_algorithm auth_algo =
2479 			ut_params->auth_xform.auth.algo;
2480 
2481 	/* Generate Crypto op data structure */
2482 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2483 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2484 	TEST_ASSERT_NOT_NULL(ut_params->op,
2485 			"Failed to allocate pktmbuf offload");
2486 	/* Set crypto operation data parameters */
2487 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2488 
2489 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2490 
2491 	/* set crypto operation source mbuf */
2492 	sym_op->m_src = ut_params->ibuf;
2493 
2494 	/* digest */
2495 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2496 			ut_params->ibuf, auth_tag_len);
2497 
2498 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2499 			"no room to append auth tag");
2500 	ut_params->digest = sym_op->auth.digest.data;
2501 
2502 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2503 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2504 				ut_params->ibuf, data_pad_len);
2505 	} else {
2506 		struct rte_mbuf *m = ut_params->ibuf;
2507 		unsigned int offset = data_pad_len;
2508 
2509 		while (offset > m->data_len && m->next != NULL) {
2510 			offset -= m->data_len;
2511 			m = m->next;
2512 		}
2513 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2514 			m, offset);
2515 	}
2516 
2517 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2518 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2519 	else
2520 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2521 
2522 	debug_hexdump(stdout, "digest:",
2523 		sym_op->auth.digest.data,
2524 		auth_tag_len);
2525 
2526 	/* Copy cipher and auth IVs at the end of the crypto operation */
2527 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2528 						IV_OFFSET);
2529 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2530 	iv_ptr += cipher_iv_len;
2531 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2532 
2533 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2534 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2535 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2536 		sym_op->cipher.data.length = cipher_len;
2537 		sym_op->cipher.data.offset = cipher_offset;
2538 	} else {
2539 		sym_op->cipher.data.length = cipher_len >> 3;
2540 		sym_op->cipher.data.offset = cipher_offset >> 3;
2541 	}
2542 
2543 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2544 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2545 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2546 		sym_op->auth.data.length = auth_len;
2547 		sym_op->auth.data.offset = auth_offset;
2548 	} else {
2549 		sym_op->auth.data.length = auth_len >> 3;
2550 		sym_op->auth.data.offset = auth_offset >> 3;
2551 	}
2552 
2553 	return 0;
2554 }
2555 
2556 static int
2557 create_wireless_algo_auth_cipher_operation(
2558 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2559 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2560 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2561 		unsigned int data_pad_len,
2562 		unsigned int cipher_len, unsigned int cipher_offset,
2563 		unsigned int auth_len, unsigned int auth_offset,
2564 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2565 {
2566 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2567 	struct crypto_unittest_params *ut_params = &unittest_params;
2568 
2569 	enum rte_crypto_cipher_algorithm cipher_algo =
2570 			ut_params->cipher_xform.cipher.algo;
2571 	enum rte_crypto_auth_algorithm auth_algo =
2572 			ut_params->auth_xform.auth.algo;
2573 
2574 	/* Generate Crypto op data structure */
2575 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2576 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2577 	TEST_ASSERT_NOT_NULL(ut_params->op,
2578 			"Failed to allocate pktmbuf offload");
2579 
2580 	/* Set crypto operation data parameters */
2581 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2582 
2583 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2584 
2585 	/* set crypto operation mbufs */
2586 	sym_op->m_src = ut_params->ibuf;
2587 	if (op_mode == OUT_OF_PLACE)
2588 		sym_op->m_dst = ut_params->obuf;
2589 
2590 	/* digest */
2591 	if (!do_sgl) {
2592 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2593 			(op_mode == IN_PLACE ?
2594 				ut_params->ibuf : ut_params->obuf),
2595 			uint8_t *, data_pad_len);
2596 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2597 			(op_mode == IN_PLACE ?
2598 				ut_params->ibuf : ut_params->obuf),
2599 			data_pad_len);
2600 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2601 	} else {
2602 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2603 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2604 				sym_op->m_src : sym_op->m_dst);
2605 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2606 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2607 			sgl_buf = sgl_buf->next;
2608 		}
2609 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2610 				uint8_t *, remaining_off);
2611 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2612 				remaining_off);
2613 		memset(sym_op->auth.digest.data, 0, remaining_off);
2614 		while (sgl_buf->next != NULL) {
2615 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2616 				0, rte_pktmbuf_data_len(sgl_buf));
2617 			sgl_buf = sgl_buf->next;
2618 		}
2619 	}
2620 
2621 	/* Copy digest for the verification */
2622 	if (verify)
2623 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2624 
2625 	/* Copy cipher and auth IVs at the end of the crypto operation */
2626 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2627 			ut_params->op, uint8_t *, IV_OFFSET);
2628 
2629 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2630 	iv_ptr += cipher_iv_len;
2631 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2632 
2633 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2634 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2635 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2636 		sym_op->cipher.data.length = cipher_len;
2637 		sym_op->cipher.data.offset = cipher_offset;
2638 	} else {
2639 		sym_op->cipher.data.length = cipher_len >> 3;
2640 		sym_op->cipher.data.offset = cipher_offset >> 3;
2641 	}
2642 
2643 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2644 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2645 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2646 		sym_op->auth.data.length = auth_len;
2647 		sym_op->auth.data.offset = auth_offset;
2648 	} else {
2649 		sym_op->auth.data.length = auth_len >> 3;
2650 		sym_op->auth.data.offset = auth_offset >> 3;
2651 	}
2652 
2653 	return 0;
2654 }
2655 
2656 static int
2657 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2658 {
2659 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2660 	struct crypto_unittest_params *ut_params = &unittest_params;
2661 
2662 	int retval;
2663 	unsigned plaintext_pad_len;
2664 	unsigned plaintext_len;
2665 	uint8_t *plaintext;
2666 	struct rte_cryptodev_info dev_info;
2667 
2668 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2669 	uint64_t feat_flags = dev_info.feature_flags;
2670 
2671 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2672 			((tdata->validAuthLenInBits.len % 8) != 0)) {
2673 		printf("Device doesn't support NON-Byte Aligned Data.\n");
2674 		return -ENOTSUP;
2675 	}
2676 
2677 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2678 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2679 		printf("Device doesn't support RAW data-path APIs.\n");
2680 		return -ENOTSUP;
2681 	}
2682 
2683 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2684 		return -ENOTSUP;
2685 
2686 	/* Verify the capabilities */
2687 	struct rte_cryptodev_sym_capability_idx cap_idx;
2688 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2689 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2690 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2691 			&cap_idx) == NULL)
2692 		return -ENOTSUP;
2693 
2694 	/* Create SNOW 3G session */
2695 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2696 			tdata->key.data, tdata->key.len,
2697 			tdata->auth_iv.len, tdata->digest.len,
2698 			RTE_CRYPTO_AUTH_OP_GENERATE,
2699 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2700 	if (retval < 0)
2701 		return retval;
2702 
2703 	/* alloc mbuf and set payload */
2704 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2705 
2706 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2707 	rte_pktmbuf_tailroom(ut_params->ibuf));
2708 
2709 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2710 	/* Append data which is padded to a multiple of */
2711 	/* the algorithms block size */
2712 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2713 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2714 				plaintext_pad_len);
2715 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2716 
2717 	/* Create SNOW 3G operation */
2718 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2719 			tdata->auth_iv.data, tdata->auth_iv.len,
2720 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2721 			tdata->validAuthLenInBits.len,
2722 			0);
2723 	if (retval < 0)
2724 		return retval;
2725 
2726 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2727 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2728 				ut_params->op, 0, 1, 1, 0);
2729 	else
2730 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2731 				ut_params->op);
2732 	ut_params->obuf = ut_params->op->sym->m_src;
2733 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2734 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2735 			+ plaintext_pad_len;
2736 
2737 	/* Validate obuf */
2738 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2739 	ut_params->digest,
2740 	tdata->digest.data,
2741 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2742 	"SNOW 3G Generated auth tag not as expected");
2743 
2744 	return 0;
2745 }
2746 
2747 static int
2748 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2749 {
2750 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2751 	struct crypto_unittest_params *ut_params = &unittest_params;
2752 
2753 	int retval;
2754 	unsigned plaintext_pad_len;
2755 	unsigned plaintext_len;
2756 	uint8_t *plaintext;
2757 	struct rte_cryptodev_info dev_info;
2758 
2759 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2760 	uint64_t feat_flags = dev_info.feature_flags;
2761 
2762 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2763 			((tdata->validAuthLenInBits.len % 8) != 0)) {
2764 		printf("Device doesn't support NON-Byte Aligned Data.\n");
2765 		return -ENOTSUP;
2766 	}
2767 
2768 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2769 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2770 		printf("Device doesn't support RAW data-path APIs.\n");
2771 		return -ENOTSUP;
2772 	}
2773 
2774 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2775 		return -ENOTSUP;
2776 
2777 	/* Verify the capabilities */
2778 	struct rte_cryptodev_sym_capability_idx cap_idx;
2779 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2780 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2781 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2782 			&cap_idx) == NULL)
2783 		return -ENOTSUP;
2784 
2785 	/* Create SNOW 3G session */
2786 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2787 				tdata->key.data, tdata->key.len,
2788 				tdata->auth_iv.len, tdata->digest.len,
2789 				RTE_CRYPTO_AUTH_OP_VERIFY,
2790 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2791 	if (retval < 0)
2792 		return retval;
2793 	/* alloc mbuf and set payload */
2794 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2795 
2796 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2797 	rte_pktmbuf_tailroom(ut_params->ibuf));
2798 
2799 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2800 	/* Append data which is padded to a multiple of */
2801 	/* the algorithms block size */
2802 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2803 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2804 				plaintext_pad_len);
2805 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2806 
2807 	/* Create SNOW 3G operation */
2808 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2809 			tdata->digest.len,
2810 			tdata->auth_iv.data, tdata->auth_iv.len,
2811 			plaintext_pad_len,
2812 			RTE_CRYPTO_AUTH_OP_VERIFY,
2813 			tdata->validAuthLenInBits.len,
2814 			0);
2815 	if (retval < 0)
2816 		return retval;
2817 
2818 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2819 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2820 				ut_params->op, 0, 1, 1, 0);
2821 	else
2822 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2823 				ut_params->op);
2824 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2825 	ut_params->obuf = ut_params->op->sym->m_src;
2826 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2827 				+ plaintext_pad_len;
2828 
2829 	/* Validate obuf */
2830 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2831 		return 0;
2832 	else
2833 		return -1;
2834 
2835 	return 0;
2836 }
2837 
2838 static int
2839 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2840 {
2841 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2842 	struct crypto_unittest_params *ut_params = &unittest_params;
2843 
2844 	int retval;
2845 	unsigned plaintext_pad_len;
2846 	unsigned plaintext_len;
2847 	uint8_t *plaintext;
2848 	struct rte_cryptodev_info dev_info;
2849 
2850 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2851 	uint64_t feat_flags = dev_info.feature_flags;
2852 
2853 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2854 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2855 		printf("Device doesn't support RAW data-path APIs.\n");
2856 		return -ENOTSUP;
2857 	}
2858 
2859 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2860 		return -ENOTSUP;
2861 
2862 	/* Verify the capabilities */
2863 	struct rte_cryptodev_sym_capability_idx cap_idx;
2864 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2865 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2866 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2867 			&cap_idx) == NULL)
2868 		return -ENOTSUP;
2869 
2870 	/* Create KASUMI session */
2871 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2872 			tdata->key.data, tdata->key.len,
2873 			0, tdata->digest.len,
2874 			RTE_CRYPTO_AUTH_OP_GENERATE,
2875 			RTE_CRYPTO_AUTH_KASUMI_F9);
2876 	if (retval < 0)
2877 		return retval;
2878 
2879 	/* alloc mbuf and set payload */
2880 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2881 
2882 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2883 	rte_pktmbuf_tailroom(ut_params->ibuf));
2884 
2885 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2886 	/* Append data which is padded to a multiple of */
2887 	/* the algorithms block size */
2888 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2889 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2890 				plaintext_pad_len);
2891 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2892 
2893 	/* Create KASUMI operation */
2894 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2895 			NULL, 0,
2896 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2897 			tdata->plaintext.len,
2898 			0);
2899 	if (retval < 0)
2900 		return retval;
2901 
2902 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2903 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2904 			ut_params->op);
2905 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2906 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2907 				ut_params->op, 0, 1, 1, 0);
2908 	else
2909 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2910 			ut_params->op);
2911 
2912 	ut_params->obuf = ut_params->op->sym->m_src;
2913 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2914 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2915 			+ plaintext_pad_len;
2916 
2917 	/* Validate obuf */
2918 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2919 	ut_params->digest,
2920 	tdata->digest.data,
2921 	DIGEST_BYTE_LENGTH_KASUMI_F9,
2922 	"KASUMI Generated auth tag not as expected");
2923 
2924 	return 0;
2925 }
2926 
2927 static int
2928 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2929 {
2930 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2931 	struct crypto_unittest_params *ut_params = &unittest_params;
2932 
2933 	int retval;
2934 	unsigned plaintext_pad_len;
2935 	unsigned plaintext_len;
2936 	uint8_t *plaintext;
2937 	struct rte_cryptodev_info dev_info;
2938 
2939 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2940 	uint64_t feat_flags = dev_info.feature_flags;
2941 
2942 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2943 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2944 		printf("Device doesn't support RAW data-path APIs.\n");
2945 		return -ENOTSUP;
2946 	}
2947 
2948 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2949 		return -ENOTSUP;
2950 
2951 	/* Verify the capabilities */
2952 	struct rte_cryptodev_sym_capability_idx cap_idx;
2953 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2954 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2955 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2956 			&cap_idx) == NULL)
2957 		return -ENOTSUP;
2958 
2959 	/* Create KASUMI session */
2960 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2961 				tdata->key.data, tdata->key.len,
2962 				0, tdata->digest.len,
2963 				RTE_CRYPTO_AUTH_OP_VERIFY,
2964 				RTE_CRYPTO_AUTH_KASUMI_F9);
2965 	if (retval < 0)
2966 		return retval;
2967 	/* alloc mbuf and set payload */
2968 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2969 
2970 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2971 	rte_pktmbuf_tailroom(ut_params->ibuf));
2972 
2973 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2974 	/* Append data which is padded to a multiple */
2975 	/* of the algorithms block size */
2976 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2977 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2978 				plaintext_pad_len);
2979 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2980 
2981 	/* Create KASUMI operation */
2982 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2983 			tdata->digest.len,
2984 			NULL, 0,
2985 			plaintext_pad_len,
2986 			RTE_CRYPTO_AUTH_OP_VERIFY,
2987 			tdata->plaintext.len,
2988 			0);
2989 	if (retval < 0)
2990 		return retval;
2991 
2992 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2993 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2994 				ut_params->op, 0, 1, 1, 0);
2995 	else
2996 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2997 				ut_params->op);
2998 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2999 	ut_params->obuf = ut_params->op->sym->m_src;
3000 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3001 				+ plaintext_pad_len;
3002 
3003 	/* Validate obuf */
3004 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3005 		return 0;
3006 	else
3007 		return -1;
3008 
3009 	return 0;
3010 }
3011 
3012 static int
3013 test_snow3g_hash_generate_test_case_1(void)
3014 {
3015 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3016 }
3017 
3018 static int
3019 test_snow3g_hash_generate_test_case_2(void)
3020 {
3021 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3022 }
3023 
3024 static int
3025 test_snow3g_hash_generate_test_case_3(void)
3026 {
3027 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3028 }
3029 
3030 static int
3031 test_snow3g_hash_generate_test_case_4(void)
3032 {
3033 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3034 }
3035 
3036 static int
3037 test_snow3g_hash_generate_test_case_5(void)
3038 {
3039 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3040 }
3041 
3042 static int
3043 test_snow3g_hash_generate_test_case_6(void)
3044 {
3045 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3046 }
3047 
3048 static int
3049 test_snow3g_hash_verify_test_case_1(void)
3050 {
3051 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3052 
3053 }
3054 
3055 static int
3056 test_snow3g_hash_verify_test_case_2(void)
3057 {
3058 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3059 }
3060 
3061 static int
3062 test_snow3g_hash_verify_test_case_3(void)
3063 {
3064 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3065 }
3066 
3067 static int
3068 test_snow3g_hash_verify_test_case_4(void)
3069 {
3070 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3071 }
3072 
3073 static int
3074 test_snow3g_hash_verify_test_case_5(void)
3075 {
3076 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3077 }
3078 
3079 static int
3080 test_snow3g_hash_verify_test_case_6(void)
3081 {
3082 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3083 }
3084 
3085 static int
3086 test_kasumi_hash_generate_test_case_1(void)
3087 {
3088 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3089 }
3090 
3091 static int
3092 test_kasumi_hash_generate_test_case_2(void)
3093 {
3094 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3095 }
3096 
3097 static int
3098 test_kasumi_hash_generate_test_case_3(void)
3099 {
3100 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3101 }
3102 
3103 static int
3104 test_kasumi_hash_generate_test_case_4(void)
3105 {
3106 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3107 }
3108 
3109 static int
3110 test_kasumi_hash_generate_test_case_5(void)
3111 {
3112 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3113 }
3114 
3115 static int
3116 test_kasumi_hash_generate_test_case_6(void)
3117 {
3118 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3119 }
3120 
3121 static int
3122 test_kasumi_hash_verify_test_case_1(void)
3123 {
3124 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3125 }
3126 
3127 static int
3128 test_kasumi_hash_verify_test_case_2(void)
3129 {
3130 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3131 }
3132 
3133 static int
3134 test_kasumi_hash_verify_test_case_3(void)
3135 {
3136 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3137 }
3138 
3139 static int
3140 test_kasumi_hash_verify_test_case_4(void)
3141 {
3142 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3143 }
3144 
3145 static int
3146 test_kasumi_hash_verify_test_case_5(void)
3147 {
3148 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3149 }
3150 
3151 static int
3152 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3153 {
3154 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3155 	struct crypto_unittest_params *ut_params = &unittest_params;
3156 
3157 	int retval;
3158 	uint8_t *plaintext, *ciphertext;
3159 	unsigned plaintext_pad_len;
3160 	unsigned plaintext_len;
3161 	struct rte_cryptodev_info dev_info;
3162 
3163 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3164 	uint64_t feat_flags = dev_info.feature_flags;
3165 
3166 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3167 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3168 		printf("Device doesn't support RAW data-path APIs.\n");
3169 		return -ENOTSUP;
3170 	}
3171 
3172 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3173 		return -ENOTSUP;
3174 
3175 	/* Verify the capabilities */
3176 	struct rte_cryptodev_sym_capability_idx cap_idx;
3177 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3178 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3179 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3180 			&cap_idx) == NULL)
3181 		return -ENOTSUP;
3182 
3183 	/* Create KASUMI session */
3184 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3185 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3186 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3187 					tdata->key.data, tdata->key.len,
3188 					tdata->cipher_iv.len);
3189 	if (retval < 0)
3190 		return retval;
3191 
3192 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3193 
3194 	/* Clear mbuf payload */
3195 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3196 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3197 
3198 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3199 	/* Append data which is padded to a multiple */
3200 	/* of the algorithms block size */
3201 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3202 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3203 				plaintext_pad_len);
3204 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3205 
3206 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3207 
3208 	/* Create KASUMI operation */
3209 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3210 				tdata->cipher_iv.len,
3211 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3212 				tdata->validCipherOffsetInBits.len);
3213 	if (retval < 0)
3214 		return retval;
3215 
3216 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3217 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3218 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3219 	else
3220 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3221 				ut_params->op);
3222 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3223 
3224 	ut_params->obuf = ut_params->op->sym->m_dst;
3225 	if (ut_params->obuf)
3226 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3227 	else
3228 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3229 
3230 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3231 
3232 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3233 				(tdata->validCipherOffsetInBits.len >> 3);
3234 	/* Validate obuf */
3235 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3236 		ciphertext,
3237 		reference_ciphertext,
3238 		tdata->validCipherLenInBits.len,
3239 		"KASUMI Ciphertext data not as expected");
3240 	return 0;
3241 }
3242 
3243 static int
3244 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3245 {
3246 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3247 	struct crypto_unittest_params *ut_params = &unittest_params;
3248 
3249 	int retval;
3250 
3251 	unsigned int plaintext_pad_len;
3252 	unsigned int plaintext_len;
3253 
3254 	uint8_t buffer[10000];
3255 	const uint8_t *ciphertext;
3256 
3257 	struct rte_cryptodev_info dev_info;
3258 
3259 	/* Verify the capabilities */
3260 	struct rte_cryptodev_sym_capability_idx cap_idx;
3261 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3262 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3263 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3264 			&cap_idx) == NULL)
3265 		return -ENOTSUP;
3266 
3267 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3268 
3269 	uint64_t feat_flags = dev_info.feature_flags;
3270 
3271 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3272 		printf("Device doesn't support in-place scatter-gather. "
3273 				"Test Skipped.\n");
3274 		return -ENOTSUP;
3275 	}
3276 
3277 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3278 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3279 		printf("Device doesn't support RAW data-path APIs.\n");
3280 		return -ENOTSUP;
3281 	}
3282 
3283 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3284 		return -ENOTSUP;
3285 
3286 	/* Create KASUMI session */
3287 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3288 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3289 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3290 					tdata->key.data, tdata->key.len,
3291 					tdata->cipher_iv.len);
3292 	if (retval < 0)
3293 		return retval;
3294 
3295 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3296 
3297 
3298 	/* Append data which is padded to a multiple */
3299 	/* of the algorithms block size */
3300 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3301 
3302 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3303 			plaintext_pad_len, 10, 0);
3304 
3305 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3306 
3307 	/* Create KASUMI operation */
3308 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3309 				tdata->cipher_iv.len,
3310 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3311 				tdata->validCipherOffsetInBits.len);
3312 	if (retval < 0)
3313 		return retval;
3314 
3315 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3316 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3317 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3318 	else
3319 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3320 						ut_params->op);
3321 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3322 
3323 	ut_params->obuf = ut_params->op->sym->m_dst;
3324 
3325 	if (ut_params->obuf)
3326 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3327 				plaintext_len, buffer);
3328 	else
3329 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3330 				tdata->validCipherOffsetInBits.len >> 3,
3331 				plaintext_len, buffer);
3332 
3333 	/* Validate obuf */
3334 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3335 
3336 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3337 				(tdata->validCipherOffsetInBits.len >> 3);
3338 	/* Validate obuf */
3339 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3340 		ciphertext,
3341 		reference_ciphertext,
3342 		tdata->validCipherLenInBits.len,
3343 		"KASUMI Ciphertext data not as expected");
3344 	return 0;
3345 }
3346 
3347 static int
3348 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3349 {
3350 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3351 	struct crypto_unittest_params *ut_params = &unittest_params;
3352 
3353 	int retval;
3354 	uint8_t *plaintext, *ciphertext;
3355 	unsigned plaintext_pad_len;
3356 	unsigned plaintext_len;
3357 
3358 	/* Verify the capabilities */
3359 	struct rte_cryptodev_sym_capability_idx cap_idx;
3360 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3361 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3362 	/* Data-path service does not support OOP */
3363 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3364 			&cap_idx) == NULL)
3365 		return -ENOTSUP;
3366 
3367 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3368 		return -ENOTSUP;
3369 
3370 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3371 		return -ENOTSUP;
3372 
3373 	/* Create KASUMI session */
3374 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3375 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3376 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3377 					tdata->key.data, tdata->key.len,
3378 					tdata->cipher_iv.len);
3379 	if (retval < 0)
3380 		return retval;
3381 
3382 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3383 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3384 
3385 	/* Clear mbuf payload */
3386 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3387 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3388 
3389 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3390 	/* Append data which is padded to a multiple */
3391 	/* of the algorithms block size */
3392 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3393 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3394 				plaintext_pad_len);
3395 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3396 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3397 
3398 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3399 
3400 	/* Create KASUMI operation */
3401 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3402 				tdata->cipher_iv.len,
3403 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3404 				tdata->validCipherOffsetInBits.len);
3405 	if (retval < 0)
3406 		return retval;
3407 
3408 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3409 						ut_params->op);
3410 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3411 
3412 	ut_params->obuf = ut_params->op->sym->m_dst;
3413 	if (ut_params->obuf)
3414 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3415 	else
3416 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3417 
3418 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3419 
3420 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3421 				(tdata->validCipherOffsetInBits.len >> 3);
3422 	/* Validate obuf */
3423 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3424 		ciphertext,
3425 		reference_ciphertext,
3426 		tdata->validCipherLenInBits.len,
3427 		"KASUMI Ciphertext data not as expected");
3428 	return 0;
3429 }
3430 
3431 static int
3432 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3433 {
3434 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3435 	struct crypto_unittest_params *ut_params = &unittest_params;
3436 
3437 	int retval;
3438 	unsigned int plaintext_pad_len;
3439 	unsigned int plaintext_len;
3440 
3441 	const uint8_t *ciphertext;
3442 	uint8_t buffer[2048];
3443 
3444 	struct rte_cryptodev_info dev_info;
3445 
3446 	/* Verify the capabilities */
3447 	struct rte_cryptodev_sym_capability_idx cap_idx;
3448 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3449 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3450 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3451 			&cap_idx) == NULL)
3452 		return -ENOTSUP;
3453 
3454 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3455 		return -ENOTSUP;
3456 
3457 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3458 		return -ENOTSUP;
3459 
3460 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3461 
3462 	uint64_t feat_flags = dev_info.feature_flags;
3463 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3464 		printf("Device doesn't support out-of-place scatter-gather "
3465 				"in both input and output mbufs. "
3466 				"Test Skipped.\n");
3467 		return -ENOTSUP;
3468 	}
3469 
3470 	/* Create KASUMI session */
3471 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3472 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3473 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3474 					tdata->key.data, tdata->key.len,
3475 					tdata->cipher_iv.len);
3476 	if (retval < 0)
3477 		return retval;
3478 
3479 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3480 	/* Append data which is padded to a multiple */
3481 	/* of the algorithms block size */
3482 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3483 
3484 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3485 			plaintext_pad_len, 10, 0);
3486 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3487 			plaintext_pad_len, 3, 0);
3488 
3489 	/* Append data which is padded to a multiple */
3490 	/* of the algorithms block size */
3491 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3492 
3493 	/* Create KASUMI operation */
3494 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3495 				tdata->cipher_iv.len,
3496 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3497 				tdata->validCipherOffsetInBits.len);
3498 	if (retval < 0)
3499 		return retval;
3500 
3501 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3502 						ut_params->op);
3503 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3504 
3505 	ut_params->obuf = ut_params->op->sym->m_dst;
3506 	if (ut_params->obuf)
3507 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3508 				plaintext_pad_len, buffer);
3509 	else
3510 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3511 				tdata->validCipherOffsetInBits.len >> 3,
3512 				plaintext_pad_len, buffer);
3513 
3514 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3515 				(tdata->validCipherOffsetInBits.len >> 3);
3516 	/* Validate obuf */
3517 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3518 		ciphertext,
3519 		reference_ciphertext,
3520 		tdata->validCipherLenInBits.len,
3521 		"KASUMI Ciphertext data not as expected");
3522 	return 0;
3523 }
3524 
3525 
3526 static int
3527 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3528 {
3529 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3530 	struct crypto_unittest_params *ut_params = &unittest_params;
3531 
3532 	int retval;
3533 	uint8_t *ciphertext, *plaintext;
3534 	unsigned ciphertext_pad_len;
3535 	unsigned ciphertext_len;
3536 
3537 	/* Verify the capabilities */
3538 	struct rte_cryptodev_sym_capability_idx cap_idx;
3539 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3540 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3541 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3542 			&cap_idx) == NULL)
3543 		return -ENOTSUP;
3544 
3545 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3546 		return -ENOTSUP;
3547 
3548 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3549 		return -ENOTSUP;
3550 
3551 	/* Create KASUMI session */
3552 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3553 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3554 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3555 					tdata->key.data, tdata->key.len,
3556 					tdata->cipher_iv.len);
3557 	if (retval < 0)
3558 		return retval;
3559 
3560 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3561 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3562 
3563 	/* Clear mbuf payload */
3564 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3565 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3566 
3567 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3568 	/* Append data which is padded to a multiple */
3569 	/* of the algorithms block size */
3570 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3571 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3572 				ciphertext_pad_len);
3573 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3574 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3575 
3576 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3577 
3578 	/* Create KASUMI operation */
3579 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3580 				tdata->cipher_iv.len,
3581 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3582 				tdata->validCipherOffsetInBits.len);
3583 	if (retval < 0)
3584 		return retval;
3585 
3586 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3587 						ut_params->op);
3588 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3589 
3590 	ut_params->obuf = ut_params->op->sym->m_dst;
3591 	if (ut_params->obuf)
3592 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3593 	else
3594 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3595 
3596 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3597 
3598 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3599 				(tdata->validCipherOffsetInBits.len >> 3);
3600 	/* Validate obuf */
3601 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3602 		plaintext,
3603 		reference_plaintext,
3604 		tdata->validCipherLenInBits.len,
3605 		"KASUMI Plaintext data not as expected");
3606 	return 0;
3607 }
3608 
3609 static int
3610 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3611 {
3612 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3613 	struct crypto_unittest_params *ut_params = &unittest_params;
3614 
3615 	int retval;
3616 	uint8_t *ciphertext, *plaintext;
3617 	unsigned ciphertext_pad_len;
3618 	unsigned ciphertext_len;
3619 	struct rte_cryptodev_info dev_info;
3620 
3621 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3622 	uint64_t feat_flags = dev_info.feature_flags;
3623 
3624 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3625 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3626 		printf("Device doesn't support RAW data-path APIs.\n");
3627 		return -ENOTSUP;
3628 	}
3629 
3630 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3631 		return -ENOTSUP;
3632 
3633 	/* Verify the capabilities */
3634 	struct rte_cryptodev_sym_capability_idx cap_idx;
3635 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3636 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3637 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3638 			&cap_idx) == NULL)
3639 		return -ENOTSUP;
3640 
3641 	/* Create KASUMI session */
3642 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3643 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3644 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3645 					tdata->key.data, tdata->key.len,
3646 					tdata->cipher_iv.len);
3647 	if (retval < 0)
3648 		return retval;
3649 
3650 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3651 
3652 	/* Clear mbuf payload */
3653 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3654 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3655 
3656 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3657 	/* Append data which is padded to a multiple */
3658 	/* of the algorithms block size */
3659 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3660 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3661 				ciphertext_pad_len);
3662 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3663 
3664 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3665 
3666 	/* Create KASUMI operation */
3667 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3668 					tdata->cipher_iv.len,
3669 					tdata->ciphertext.len,
3670 					tdata->validCipherOffsetInBits.len);
3671 	if (retval < 0)
3672 		return retval;
3673 
3674 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3675 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3676 				ut_params->op, 1, 0, 1, 0);
3677 	else
3678 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3679 						ut_params->op);
3680 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3681 
3682 	ut_params->obuf = ut_params->op->sym->m_dst;
3683 	if (ut_params->obuf)
3684 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3685 	else
3686 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3687 
3688 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3689 
3690 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3691 				(tdata->validCipherOffsetInBits.len >> 3);
3692 	/* Validate obuf */
3693 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3694 		plaintext,
3695 		reference_plaintext,
3696 		tdata->validCipherLenInBits.len,
3697 		"KASUMI Plaintext data not as expected");
3698 	return 0;
3699 }
3700 
3701 static int
3702 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3703 {
3704 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3705 	struct crypto_unittest_params *ut_params = &unittest_params;
3706 
3707 	int retval;
3708 	uint8_t *plaintext, *ciphertext;
3709 	unsigned plaintext_pad_len;
3710 	unsigned plaintext_len;
3711 	struct rte_cryptodev_info dev_info;
3712 
3713 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3714 	uint64_t feat_flags = dev_info.feature_flags;
3715 
3716 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3717 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3718 		printf("Device doesn't support RAW data-path APIs.\n");
3719 		return -ENOTSUP;
3720 	}
3721 
3722 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3723 		return -ENOTSUP;
3724 
3725 	/* Verify the capabilities */
3726 	struct rte_cryptodev_sym_capability_idx cap_idx;
3727 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3728 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3729 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3730 			&cap_idx) == NULL)
3731 		return -ENOTSUP;
3732 
3733 	/* Create SNOW 3G session */
3734 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3735 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3736 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3737 					tdata->key.data, tdata->key.len,
3738 					tdata->cipher_iv.len);
3739 	if (retval < 0)
3740 		return retval;
3741 
3742 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3743 
3744 	/* Clear mbuf payload */
3745 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3746 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3747 
3748 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3749 	/* Append data which is padded to a multiple of */
3750 	/* the algorithms block size */
3751 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3752 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3753 				plaintext_pad_len);
3754 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3755 
3756 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3757 
3758 	/* Create SNOW 3G operation */
3759 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3760 					tdata->cipher_iv.len,
3761 					tdata->validCipherLenInBits.len,
3762 					0);
3763 	if (retval < 0)
3764 		return retval;
3765 
3766 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3767 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3768 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3769 	else
3770 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3771 						ut_params->op);
3772 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3773 
3774 	ut_params->obuf = ut_params->op->sym->m_dst;
3775 	if (ut_params->obuf)
3776 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3777 	else
3778 		ciphertext = plaintext;
3779 
3780 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3781 
3782 	/* Validate obuf */
3783 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3784 		ciphertext,
3785 		tdata->ciphertext.data,
3786 		tdata->validDataLenInBits.len,
3787 		"SNOW 3G Ciphertext data not as expected");
3788 	return 0;
3789 }
3790 
3791 
3792 static int
3793 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3794 {
3795 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3796 	struct crypto_unittest_params *ut_params = &unittest_params;
3797 	uint8_t *plaintext, *ciphertext;
3798 
3799 	int retval;
3800 	unsigned plaintext_pad_len;
3801 	unsigned plaintext_len;
3802 
3803 	/* Verify the capabilities */
3804 	struct rte_cryptodev_sym_capability_idx cap_idx;
3805 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3806 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3807 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3808 			&cap_idx) == NULL)
3809 		return -ENOTSUP;
3810 
3811 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3812 		return -ENOTSUP;
3813 
3814 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3815 		return -ENOTSUP;
3816 
3817 	/* Create SNOW 3G session */
3818 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3819 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3820 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3821 					tdata->key.data, tdata->key.len,
3822 					tdata->cipher_iv.len);
3823 	if (retval < 0)
3824 		return retval;
3825 
3826 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3827 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3828 
3829 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3830 			"Failed to allocate input buffer in mempool");
3831 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3832 			"Failed to allocate output buffer in mempool");
3833 
3834 	/* Clear mbuf payload */
3835 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3836 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3837 
3838 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3839 	/* Append data which is padded to a multiple of */
3840 	/* the algorithms block size */
3841 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3842 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3843 				plaintext_pad_len);
3844 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3845 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3846 
3847 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3848 
3849 	/* Create SNOW 3G operation */
3850 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3851 					tdata->cipher_iv.len,
3852 					tdata->validCipherLenInBits.len,
3853 					0);
3854 	if (retval < 0)
3855 		return retval;
3856 
3857 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3858 						ut_params->op);
3859 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3860 
3861 	ut_params->obuf = ut_params->op->sym->m_dst;
3862 	if (ut_params->obuf)
3863 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3864 	else
3865 		ciphertext = plaintext;
3866 
3867 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3868 
3869 	/* Validate obuf */
3870 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3871 		ciphertext,
3872 		tdata->ciphertext.data,
3873 		tdata->validDataLenInBits.len,
3874 		"SNOW 3G Ciphertext data not as expected");
3875 	return 0;
3876 }
3877 
3878 static int
3879 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3880 {
3881 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3882 	struct crypto_unittest_params *ut_params = &unittest_params;
3883 
3884 	int retval;
3885 	unsigned int plaintext_pad_len;
3886 	unsigned int plaintext_len;
3887 	uint8_t buffer[10000];
3888 	const uint8_t *ciphertext;
3889 
3890 	struct rte_cryptodev_info dev_info;
3891 
3892 	/* Verify the capabilities */
3893 	struct rte_cryptodev_sym_capability_idx cap_idx;
3894 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3895 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3896 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3897 			&cap_idx) == NULL)
3898 		return -ENOTSUP;
3899 
3900 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3901 		return -ENOTSUP;
3902 
3903 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3904 		return -ENOTSUP;
3905 
3906 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3907 
3908 	uint64_t feat_flags = dev_info.feature_flags;
3909 
3910 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3911 		printf("Device doesn't support out-of-place scatter-gather "
3912 				"in both input and output mbufs. "
3913 				"Test Skipped.\n");
3914 		return -ENOTSUP;
3915 	}
3916 
3917 	/* Create SNOW 3G session */
3918 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3919 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3920 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3921 					tdata->key.data, tdata->key.len,
3922 					tdata->cipher_iv.len);
3923 	if (retval < 0)
3924 		return retval;
3925 
3926 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3927 	/* Append data which is padded to a multiple of */
3928 	/* the algorithms block size */
3929 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3930 
3931 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3932 			plaintext_pad_len, 10, 0);
3933 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3934 			plaintext_pad_len, 3, 0);
3935 
3936 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3937 			"Failed to allocate input buffer in mempool");
3938 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3939 			"Failed to allocate output buffer in mempool");
3940 
3941 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3942 
3943 	/* Create SNOW 3G operation */
3944 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3945 					tdata->cipher_iv.len,
3946 					tdata->validCipherLenInBits.len,
3947 					0);
3948 	if (retval < 0)
3949 		return retval;
3950 
3951 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3952 						ut_params->op);
3953 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3954 
3955 	ut_params->obuf = ut_params->op->sym->m_dst;
3956 	if (ut_params->obuf)
3957 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3958 				plaintext_len, buffer);
3959 	else
3960 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3961 				plaintext_len, buffer);
3962 
3963 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3964 
3965 	/* Validate obuf */
3966 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3967 		ciphertext,
3968 		tdata->ciphertext.data,
3969 		tdata->validDataLenInBits.len,
3970 		"SNOW 3G Ciphertext data not as expected");
3971 
3972 	return 0;
3973 }
3974 
3975 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3976 static void
3977 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3978 {
3979 	uint8_t curr_byte, prev_byte;
3980 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
3981 	uint8_t lower_byte_mask = (1 << offset) - 1;
3982 	unsigned i;
3983 
3984 	prev_byte = buffer[0];
3985 	buffer[0] >>= offset;
3986 
3987 	for (i = 1; i < length_in_bytes; i++) {
3988 		curr_byte = buffer[i];
3989 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
3990 				(curr_byte >> offset);
3991 		prev_byte = curr_byte;
3992 	}
3993 }
3994 
3995 static int
3996 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
3997 {
3998 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3999 	struct crypto_unittest_params *ut_params = &unittest_params;
4000 	uint8_t *plaintext, *ciphertext;
4001 	int retval;
4002 	uint32_t plaintext_len;
4003 	uint32_t plaintext_pad_len;
4004 	uint8_t extra_offset = 4;
4005 	uint8_t *expected_ciphertext_shifted;
4006 	struct rte_cryptodev_info dev_info;
4007 
4008 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4009 	uint64_t feat_flags = dev_info.feature_flags;
4010 
4011 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4012 			((tdata->validDataLenInBits.len % 8) != 0)) {
4013 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4014 		return -ENOTSUP;
4015 	}
4016 
4017 	/* Verify the capabilities */
4018 	struct rte_cryptodev_sym_capability_idx cap_idx;
4019 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4020 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4021 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4022 			&cap_idx) == NULL)
4023 		return -ENOTSUP;
4024 
4025 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4026 		return -ENOTSUP;
4027 
4028 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4029 		return -ENOTSUP;
4030 
4031 	/* Create SNOW 3G session */
4032 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4033 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4034 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4035 					tdata->key.data, tdata->key.len,
4036 					tdata->cipher_iv.len);
4037 	if (retval < 0)
4038 		return retval;
4039 
4040 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4041 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4042 
4043 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4044 			"Failed to allocate input buffer in mempool");
4045 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4046 			"Failed to allocate output buffer in mempool");
4047 
4048 	/* Clear mbuf payload */
4049 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4050 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4051 
4052 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4053 	/*
4054 	 * Append data which is padded to a
4055 	 * multiple of the algorithms block size
4056 	 */
4057 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4058 
4059 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4060 						plaintext_pad_len);
4061 
4062 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4063 
4064 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4065 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4066 
4067 #ifdef RTE_APP_TEST_DEBUG
4068 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4069 #endif
4070 	/* Create SNOW 3G operation */
4071 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4072 					tdata->cipher_iv.len,
4073 					tdata->validCipherLenInBits.len,
4074 					extra_offset);
4075 	if (retval < 0)
4076 		return retval;
4077 
4078 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4079 						ut_params->op);
4080 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4081 
4082 	ut_params->obuf = ut_params->op->sym->m_dst;
4083 	if (ut_params->obuf)
4084 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4085 	else
4086 		ciphertext = plaintext;
4087 
4088 #ifdef RTE_APP_TEST_DEBUG
4089 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4090 #endif
4091 
4092 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4093 
4094 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4095 			"failed to reserve memory for ciphertext shifted\n");
4096 
4097 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4098 			ceil_byte_length(tdata->ciphertext.len));
4099 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4100 			extra_offset);
4101 	/* Validate obuf */
4102 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4103 		ciphertext,
4104 		expected_ciphertext_shifted,
4105 		tdata->validDataLenInBits.len,
4106 		extra_offset,
4107 		"SNOW 3G Ciphertext data not as expected");
4108 	return 0;
4109 }
4110 
4111 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4112 {
4113 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4114 	struct crypto_unittest_params *ut_params = &unittest_params;
4115 
4116 	int retval;
4117 
4118 	uint8_t *plaintext, *ciphertext;
4119 	unsigned ciphertext_pad_len;
4120 	unsigned ciphertext_len;
4121 	struct rte_cryptodev_info dev_info;
4122 
4123 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4124 	uint64_t feat_flags = dev_info.feature_flags;
4125 
4126 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4127 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4128 		printf("Device doesn't support RAW data-path APIs.\n");
4129 		return -ENOTSUP;
4130 	}
4131 
4132 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4133 		return -ENOTSUP;
4134 
4135 	/* Verify the capabilities */
4136 	struct rte_cryptodev_sym_capability_idx cap_idx;
4137 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4138 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4139 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4140 			&cap_idx) == NULL)
4141 		return -ENOTSUP;
4142 
4143 	/* Create SNOW 3G session */
4144 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4145 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4146 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4147 					tdata->key.data, tdata->key.len,
4148 					tdata->cipher_iv.len);
4149 	if (retval < 0)
4150 		return retval;
4151 
4152 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4153 
4154 	/* Clear mbuf payload */
4155 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4156 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4157 
4158 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4159 	/* Append data which is padded to a multiple of */
4160 	/* the algorithms block size */
4161 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4162 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4163 				ciphertext_pad_len);
4164 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4165 
4166 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4167 
4168 	/* Create SNOW 3G operation */
4169 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4170 					tdata->cipher_iv.len,
4171 					tdata->validCipherLenInBits.len,
4172 					tdata->cipher.offset_bits);
4173 	if (retval < 0)
4174 		return retval;
4175 
4176 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4177 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4178 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4179 	else
4180 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4181 						ut_params->op);
4182 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4183 	ut_params->obuf = ut_params->op->sym->m_dst;
4184 	if (ut_params->obuf)
4185 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4186 	else
4187 		plaintext = ciphertext;
4188 
4189 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4190 
4191 	/* Validate obuf */
4192 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4193 				tdata->plaintext.data,
4194 				tdata->validDataLenInBits.len,
4195 				"SNOW 3G Plaintext data not as expected");
4196 	return 0;
4197 }
4198 
4199 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4200 {
4201 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4202 	struct crypto_unittest_params *ut_params = &unittest_params;
4203 
4204 	int retval;
4205 
4206 	uint8_t *plaintext, *ciphertext;
4207 	unsigned ciphertext_pad_len;
4208 	unsigned ciphertext_len;
4209 
4210 	/* Verify the capabilities */
4211 	struct rte_cryptodev_sym_capability_idx cap_idx;
4212 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4213 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4214 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4215 			&cap_idx) == NULL)
4216 		return -ENOTSUP;
4217 
4218 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4219 		return -ENOTSUP;
4220 
4221 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4222 		return -ENOTSUP;
4223 
4224 	/* Create SNOW 3G session */
4225 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4226 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4227 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4228 					tdata->key.data, tdata->key.len,
4229 					tdata->cipher_iv.len);
4230 	if (retval < 0)
4231 		return retval;
4232 
4233 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4234 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4235 
4236 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4237 			"Failed to allocate input buffer");
4238 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4239 			"Failed to allocate output buffer");
4240 
4241 	/* Clear mbuf payload */
4242 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4243 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4244 
4245 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4246 		       rte_pktmbuf_tailroom(ut_params->obuf));
4247 
4248 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4249 	/* Append data which is padded to a multiple of */
4250 	/* the algorithms block size */
4251 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4252 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4253 				ciphertext_pad_len);
4254 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4255 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4256 
4257 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4258 
4259 	/* Create SNOW 3G operation */
4260 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4261 					tdata->cipher_iv.len,
4262 					tdata->validCipherLenInBits.len,
4263 					0);
4264 	if (retval < 0)
4265 		return retval;
4266 
4267 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4268 						ut_params->op);
4269 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4270 	ut_params->obuf = ut_params->op->sym->m_dst;
4271 	if (ut_params->obuf)
4272 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4273 	else
4274 		plaintext = ciphertext;
4275 
4276 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4277 
4278 	/* Validate obuf */
4279 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4280 				tdata->plaintext.data,
4281 				tdata->validDataLenInBits.len,
4282 				"SNOW 3G Plaintext data not as expected");
4283 	return 0;
4284 }
4285 
4286 static int
4287 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4288 {
4289 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4290 	struct crypto_unittest_params *ut_params = &unittest_params;
4291 
4292 	int retval;
4293 
4294 	uint8_t *plaintext, *ciphertext;
4295 	unsigned int plaintext_pad_len;
4296 	unsigned int plaintext_len;
4297 
4298 	struct rte_cryptodev_info dev_info;
4299 	struct rte_cryptodev_sym_capability_idx cap_idx;
4300 
4301 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4302 	uint64_t feat_flags = dev_info.feature_flags;
4303 
4304 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4305 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4306 			(tdata->validDataLenInBits.len % 8 != 0))) {
4307 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4308 		return -ENOTSUP;
4309 	}
4310 
4311 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4312 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4313 		printf("Device doesn't support RAW data-path APIs.\n");
4314 		return -ENOTSUP;
4315 	}
4316 
4317 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4318 		return -ENOTSUP;
4319 
4320 	/* Check if device supports ZUC EEA3 */
4321 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4322 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4323 
4324 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4325 			&cap_idx) == NULL)
4326 		return -ENOTSUP;
4327 
4328 	/* Check if device supports ZUC EIA3 */
4329 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4330 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4331 
4332 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4333 			&cap_idx) == NULL)
4334 		return -ENOTSUP;
4335 
4336 	/* Create ZUC session */
4337 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4338 			ts_params->valid_devs[0],
4339 			tdata);
4340 	if (retval < 0)
4341 		return retval;
4342 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4343 
4344 	/* clear mbuf payload */
4345 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4346 			rte_pktmbuf_tailroom(ut_params->ibuf));
4347 
4348 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4349 	/* Append data which is padded to a multiple of */
4350 	/* the algorithms block size */
4351 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4352 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4353 				plaintext_pad_len);
4354 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4355 
4356 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4357 
4358 	/* Create ZUC operation */
4359 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4360 	if (retval < 0)
4361 		return retval;
4362 
4363 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4364 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4365 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4366 	else
4367 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4368 			ut_params->op);
4369 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4370 	ut_params->obuf = ut_params->op->sym->m_src;
4371 	if (ut_params->obuf)
4372 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4373 	else
4374 		ciphertext = plaintext;
4375 
4376 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4377 	/* Validate obuf */
4378 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4379 			ciphertext,
4380 			tdata->ciphertext.data,
4381 			tdata->validDataLenInBits.len,
4382 			"ZUC Ciphertext data not as expected");
4383 
4384 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4385 	    + plaintext_pad_len;
4386 
4387 	/* Validate obuf */
4388 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4389 			ut_params->digest,
4390 			tdata->digest.data,
4391 			4,
4392 			"ZUC Generated auth tag not as expected");
4393 	return 0;
4394 }
4395 
4396 static int
4397 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4398 {
4399 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4400 	struct crypto_unittest_params *ut_params = &unittest_params;
4401 
4402 	int retval;
4403 
4404 	uint8_t *plaintext, *ciphertext;
4405 	unsigned plaintext_pad_len;
4406 	unsigned plaintext_len;
4407 	struct rte_cryptodev_info dev_info;
4408 
4409 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4410 	uint64_t feat_flags = dev_info.feature_flags;
4411 
4412 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4413 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4414 		printf("Device doesn't support RAW data-path APIs.\n");
4415 		return -ENOTSUP;
4416 	}
4417 
4418 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4419 		return -ENOTSUP;
4420 
4421 	/* Verify the capabilities */
4422 	struct rte_cryptodev_sym_capability_idx cap_idx;
4423 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4424 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4425 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4426 			&cap_idx) == NULL)
4427 		return -ENOTSUP;
4428 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4429 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4430 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4431 			&cap_idx) == NULL)
4432 		return -ENOTSUP;
4433 
4434 	/* Create SNOW 3G session */
4435 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4436 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4437 			RTE_CRYPTO_AUTH_OP_GENERATE,
4438 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4439 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4440 			tdata->key.data, tdata->key.len,
4441 			tdata->auth_iv.len, tdata->digest.len,
4442 			tdata->cipher_iv.len);
4443 	if (retval < 0)
4444 		return retval;
4445 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4446 
4447 	/* clear mbuf payload */
4448 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4449 			rte_pktmbuf_tailroom(ut_params->ibuf));
4450 
4451 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4452 	/* Append data which is padded to a multiple of */
4453 	/* the algorithms block size */
4454 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4455 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4456 				plaintext_pad_len);
4457 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4458 
4459 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4460 
4461 	/* Create SNOW 3G operation */
4462 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4463 			tdata->digest.len, tdata->auth_iv.data,
4464 			tdata->auth_iv.len,
4465 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4466 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4467 			tdata->validCipherLenInBits.len,
4468 			0,
4469 			tdata->validAuthLenInBits.len,
4470 			0
4471 			);
4472 	if (retval < 0)
4473 		return retval;
4474 
4475 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4476 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4477 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4478 	else
4479 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4480 			ut_params->op);
4481 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4482 	ut_params->obuf = ut_params->op->sym->m_src;
4483 	if (ut_params->obuf)
4484 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4485 	else
4486 		ciphertext = plaintext;
4487 
4488 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4489 	/* Validate obuf */
4490 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4491 			ciphertext,
4492 			tdata->ciphertext.data,
4493 			tdata->validDataLenInBits.len,
4494 			"SNOW 3G Ciphertext data not as expected");
4495 
4496 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4497 	    + plaintext_pad_len;
4498 
4499 	/* Validate obuf */
4500 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4501 			ut_params->digest,
4502 			tdata->digest.data,
4503 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4504 			"SNOW 3G Generated auth tag not as expected");
4505 	return 0;
4506 }
4507 
4508 static int
4509 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4510 	uint8_t op_mode, uint8_t verify)
4511 {
4512 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4513 	struct crypto_unittest_params *ut_params = &unittest_params;
4514 
4515 	int retval;
4516 
4517 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4518 	unsigned int plaintext_pad_len;
4519 	unsigned int plaintext_len;
4520 	unsigned int ciphertext_pad_len;
4521 	unsigned int ciphertext_len;
4522 
4523 	struct rte_cryptodev_info dev_info;
4524 
4525 	/* Verify the capabilities */
4526 	struct rte_cryptodev_sym_capability_idx cap_idx;
4527 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4528 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4529 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4530 			&cap_idx) == NULL)
4531 		return -ENOTSUP;
4532 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4533 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4534 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4535 			&cap_idx) == NULL)
4536 		return -ENOTSUP;
4537 
4538 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4539 		return -ENOTSUP;
4540 
4541 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4542 
4543 	uint64_t feat_flags = dev_info.feature_flags;
4544 
4545 	if (op_mode == OUT_OF_PLACE) {
4546 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4547 			printf("Device doesn't support digest encrypted.\n");
4548 			return -ENOTSUP;
4549 		}
4550 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4551 			return -ENOTSUP;
4552 	}
4553 
4554 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4555 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4556 		printf("Device doesn't support RAW data-path APIs.\n");
4557 		return -ENOTSUP;
4558 	}
4559 
4560 	/* Create SNOW 3G session */
4561 	retval = create_wireless_algo_auth_cipher_session(
4562 			ts_params->valid_devs[0],
4563 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4564 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4565 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4566 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4567 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4568 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4569 			tdata->key.data, tdata->key.len,
4570 			tdata->auth_iv.len, tdata->digest.len,
4571 			tdata->cipher_iv.len);
4572 
4573 	if (retval < 0)
4574 		return retval;
4575 
4576 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4577 	if (op_mode == OUT_OF_PLACE)
4578 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4579 
4580 	/* clear mbuf payload */
4581 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4582 		rte_pktmbuf_tailroom(ut_params->ibuf));
4583 	if (op_mode == OUT_OF_PLACE)
4584 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4585 			rte_pktmbuf_tailroom(ut_params->obuf));
4586 
4587 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4588 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4589 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4590 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4591 
4592 	if (verify) {
4593 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4594 					ciphertext_pad_len);
4595 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4596 		if (op_mode == OUT_OF_PLACE)
4597 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4598 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4599 			ciphertext_len);
4600 	} else {
4601 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4602 					plaintext_pad_len);
4603 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4604 		if (op_mode == OUT_OF_PLACE)
4605 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4606 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4607 	}
4608 
4609 	/* Create SNOW 3G operation */
4610 	retval = create_wireless_algo_auth_cipher_operation(
4611 		tdata->digest.data, tdata->digest.len,
4612 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4613 		tdata->auth_iv.data, tdata->auth_iv.len,
4614 		(tdata->digest.offset_bytes == 0 ?
4615 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4616 			: tdata->digest.offset_bytes),
4617 		tdata->validCipherLenInBits.len,
4618 		tdata->cipher.offset_bits,
4619 		tdata->validAuthLenInBits.len,
4620 		tdata->auth.offset_bits,
4621 		op_mode, 0, verify);
4622 
4623 	if (retval < 0)
4624 		return retval;
4625 
4626 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4627 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4628 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4629 	else
4630 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4631 			ut_params->op);
4632 
4633 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4634 
4635 	ut_params->obuf = (op_mode == IN_PLACE ?
4636 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4637 
4638 	if (verify) {
4639 		if (ut_params->obuf)
4640 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4641 							uint8_t *);
4642 		else
4643 			plaintext = ciphertext +
4644 				(tdata->cipher.offset_bits >> 3);
4645 
4646 		debug_hexdump(stdout, "plaintext:", plaintext,
4647 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4648 		debug_hexdump(stdout, "plaintext expected:",
4649 			tdata->plaintext.data,
4650 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4651 	} else {
4652 		if (ut_params->obuf)
4653 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4654 							uint8_t *);
4655 		else
4656 			ciphertext = plaintext;
4657 
4658 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4659 			ciphertext_len);
4660 		debug_hexdump(stdout, "ciphertext expected:",
4661 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4662 
4663 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4664 			+ (tdata->digest.offset_bytes == 0 ?
4665 		plaintext_pad_len : tdata->digest.offset_bytes);
4666 
4667 		debug_hexdump(stdout, "digest:", ut_params->digest,
4668 			tdata->digest.len);
4669 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4670 				tdata->digest.len);
4671 	}
4672 
4673 	/* Validate obuf */
4674 	if (verify) {
4675 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4676 			plaintext,
4677 			tdata->plaintext.data,
4678 			tdata->plaintext.len >> 3,
4679 			"SNOW 3G Plaintext data not as expected");
4680 	} else {
4681 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4682 			ciphertext,
4683 			tdata->ciphertext.data,
4684 			tdata->validDataLenInBits.len,
4685 			"SNOW 3G Ciphertext data not as expected");
4686 
4687 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4688 			ut_params->digest,
4689 			tdata->digest.data,
4690 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4691 			"SNOW 3G Generated auth tag not as expected");
4692 	}
4693 	return 0;
4694 }
4695 
4696 static int
4697 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4698 	uint8_t op_mode, uint8_t verify)
4699 {
4700 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4701 	struct crypto_unittest_params *ut_params = &unittest_params;
4702 
4703 	int retval;
4704 
4705 	const uint8_t *plaintext = NULL;
4706 	const uint8_t *ciphertext = NULL;
4707 	const uint8_t *digest = NULL;
4708 	unsigned int plaintext_pad_len;
4709 	unsigned int plaintext_len;
4710 	unsigned int ciphertext_pad_len;
4711 	unsigned int ciphertext_len;
4712 	uint8_t buffer[10000];
4713 	uint8_t digest_buffer[10000];
4714 
4715 	struct rte_cryptodev_info dev_info;
4716 
4717 	/* Verify the capabilities */
4718 	struct rte_cryptodev_sym_capability_idx cap_idx;
4719 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4720 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4721 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4722 			&cap_idx) == NULL)
4723 		return -ENOTSUP;
4724 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4725 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4726 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4727 			&cap_idx) == NULL)
4728 		return -ENOTSUP;
4729 
4730 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4731 		return -ENOTSUP;
4732 
4733 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4734 
4735 	uint64_t feat_flags = dev_info.feature_flags;
4736 
4737 	if (op_mode == IN_PLACE) {
4738 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4739 			printf("Device doesn't support in-place scatter-gather "
4740 					"in both input and output mbufs.\n");
4741 			return -ENOTSUP;
4742 		}
4743 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4744 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4745 			printf("Device doesn't support RAW data-path APIs.\n");
4746 			return -ENOTSUP;
4747 		}
4748 	} else {
4749 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4750 			return -ENOTSUP;
4751 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4752 			printf("Device doesn't support out-of-place scatter-gather "
4753 					"in both input and output mbufs.\n");
4754 			return -ENOTSUP;
4755 		}
4756 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4757 			printf("Device doesn't support digest encrypted.\n");
4758 			return -ENOTSUP;
4759 		}
4760 	}
4761 
4762 	/* Create SNOW 3G session */
4763 	retval = create_wireless_algo_auth_cipher_session(
4764 			ts_params->valid_devs[0],
4765 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4766 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4767 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4768 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4769 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4770 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4771 			tdata->key.data, tdata->key.len,
4772 			tdata->auth_iv.len, tdata->digest.len,
4773 			tdata->cipher_iv.len);
4774 
4775 	if (retval < 0)
4776 		return retval;
4777 
4778 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4779 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4780 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4781 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4782 
4783 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4784 			plaintext_pad_len, 15, 0);
4785 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4786 			"Failed to allocate input buffer in mempool");
4787 
4788 	if (op_mode == OUT_OF_PLACE) {
4789 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4790 				plaintext_pad_len, 15, 0);
4791 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
4792 				"Failed to allocate output buffer in mempool");
4793 	}
4794 
4795 	if (verify) {
4796 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4797 			tdata->ciphertext.data);
4798 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4799 					ciphertext_len, buffer);
4800 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4801 			ciphertext_len);
4802 	} else {
4803 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4804 			tdata->plaintext.data);
4805 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4806 					plaintext_len, buffer);
4807 		debug_hexdump(stdout, "plaintext:", plaintext,
4808 			plaintext_len);
4809 	}
4810 	memset(buffer, 0, sizeof(buffer));
4811 
4812 	/* Create SNOW 3G operation */
4813 	retval = create_wireless_algo_auth_cipher_operation(
4814 		tdata->digest.data, tdata->digest.len,
4815 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4816 		tdata->auth_iv.data, tdata->auth_iv.len,
4817 		(tdata->digest.offset_bytes == 0 ?
4818 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4819 			: tdata->digest.offset_bytes),
4820 		tdata->validCipherLenInBits.len,
4821 		tdata->cipher.offset_bits,
4822 		tdata->validAuthLenInBits.len,
4823 		tdata->auth.offset_bits,
4824 		op_mode, 1, verify);
4825 
4826 	if (retval < 0)
4827 		return retval;
4828 
4829 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4830 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4831 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4832 	else
4833 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4834 			ut_params->op);
4835 
4836 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4837 
4838 	ut_params->obuf = (op_mode == IN_PLACE ?
4839 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4840 
4841 	if (verify) {
4842 		if (ut_params->obuf)
4843 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4844 					plaintext_len, buffer);
4845 		else
4846 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4847 					plaintext_len, buffer);
4848 
4849 		debug_hexdump(stdout, "plaintext:", plaintext,
4850 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4851 		debug_hexdump(stdout, "plaintext expected:",
4852 			tdata->plaintext.data,
4853 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4854 	} else {
4855 		if (ut_params->obuf)
4856 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4857 					ciphertext_len, buffer);
4858 		else
4859 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4860 					ciphertext_len, buffer);
4861 
4862 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4863 			ciphertext_len);
4864 		debug_hexdump(stdout, "ciphertext expected:",
4865 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4866 
4867 		if (ut_params->obuf)
4868 			digest = rte_pktmbuf_read(ut_params->obuf,
4869 				(tdata->digest.offset_bytes == 0 ?
4870 				plaintext_pad_len : tdata->digest.offset_bytes),
4871 				tdata->digest.len, digest_buffer);
4872 		else
4873 			digest = rte_pktmbuf_read(ut_params->ibuf,
4874 				(tdata->digest.offset_bytes == 0 ?
4875 				plaintext_pad_len : tdata->digest.offset_bytes),
4876 				tdata->digest.len, digest_buffer);
4877 
4878 		debug_hexdump(stdout, "digest:", digest,
4879 			tdata->digest.len);
4880 		debug_hexdump(stdout, "digest expected:",
4881 			tdata->digest.data, tdata->digest.len);
4882 	}
4883 
4884 	/* Validate obuf */
4885 	if (verify) {
4886 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4887 			plaintext,
4888 			tdata->plaintext.data,
4889 			tdata->plaintext.len >> 3,
4890 			"SNOW 3G Plaintext data not as expected");
4891 	} else {
4892 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4893 			ciphertext,
4894 			tdata->ciphertext.data,
4895 			tdata->validDataLenInBits.len,
4896 			"SNOW 3G Ciphertext data not as expected");
4897 
4898 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4899 			digest,
4900 			tdata->digest.data,
4901 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4902 			"SNOW 3G Generated auth tag not as expected");
4903 	}
4904 	return 0;
4905 }
4906 
4907 static int
4908 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4909 	uint8_t op_mode, uint8_t verify)
4910 {
4911 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4912 	struct crypto_unittest_params *ut_params = &unittest_params;
4913 
4914 	int retval;
4915 
4916 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4917 	unsigned int plaintext_pad_len;
4918 	unsigned int plaintext_len;
4919 	unsigned int ciphertext_pad_len;
4920 	unsigned int ciphertext_len;
4921 
4922 	struct rte_cryptodev_info dev_info;
4923 
4924 	/* Verify the capabilities */
4925 	struct rte_cryptodev_sym_capability_idx cap_idx;
4926 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4927 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4928 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4929 			&cap_idx) == NULL)
4930 		return -ENOTSUP;
4931 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4932 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4933 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4934 			&cap_idx) == NULL)
4935 		return -ENOTSUP;
4936 
4937 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4938 
4939 	uint64_t feat_flags = dev_info.feature_flags;
4940 
4941 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4942 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4943 		printf("Device doesn't support RAW data-path APIs.\n");
4944 		return -ENOTSUP;
4945 	}
4946 
4947 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4948 		return -ENOTSUP;
4949 
4950 	if (op_mode == OUT_OF_PLACE) {
4951 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4952 			return -ENOTSUP;
4953 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4954 			printf("Device doesn't support digest encrypted.\n");
4955 			return -ENOTSUP;
4956 		}
4957 	}
4958 
4959 	/* Create KASUMI session */
4960 	retval = create_wireless_algo_auth_cipher_session(
4961 			ts_params->valid_devs[0],
4962 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4963 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4964 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4965 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4966 			RTE_CRYPTO_AUTH_KASUMI_F9,
4967 			RTE_CRYPTO_CIPHER_KASUMI_F8,
4968 			tdata->key.data, tdata->key.len,
4969 			0, tdata->digest.len,
4970 			tdata->cipher_iv.len);
4971 
4972 	if (retval < 0)
4973 		return retval;
4974 
4975 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4976 	if (op_mode == OUT_OF_PLACE)
4977 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4978 
4979 	/* clear mbuf payload */
4980 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4981 		rte_pktmbuf_tailroom(ut_params->ibuf));
4982 	if (op_mode == OUT_OF_PLACE)
4983 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4984 			rte_pktmbuf_tailroom(ut_params->obuf));
4985 
4986 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4987 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4988 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4989 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4990 
4991 	if (verify) {
4992 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4993 					ciphertext_pad_len);
4994 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4995 		if (op_mode == OUT_OF_PLACE)
4996 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4997 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4998 			ciphertext_len);
4999 	} else {
5000 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5001 					plaintext_pad_len);
5002 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5003 		if (op_mode == OUT_OF_PLACE)
5004 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5005 		debug_hexdump(stdout, "plaintext:", plaintext,
5006 			plaintext_len);
5007 	}
5008 
5009 	/* Create KASUMI operation */
5010 	retval = create_wireless_algo_auth_cipher_operation(
5011 		tdata->digest.data, tdata->digest.len,
5012 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5013 		NULL, 0,
5014 		(tdata->digest.offset_bytes == 0 ?
5015 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5016 			: tdata->digest.offset_bytes),
5017 		tdata->validCipherLenInBits.len,
5018 		tdata->validCipherOffsetInBits.len,
5019 		tdata->validAuthLenInBits.len,
5020 		0,
5021 		op_mode, 0, verify);
5022 
5023 	if (retval < 0)
5024 		return retval;
5025 
5026 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5027 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5028 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5029 	else
5030 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5031 			ut_params->op);
5032 
5033 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5034 
5035 	ut_params->obuf = (op_mode == IN_PLACE ?
5036 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5037 
5038 
5039 	if (verify) {
5040 		if (ut_params->obuf)
5041 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5042 							uint8_t *);
5043 		else
5044 			plaintext = ciphertext;
5045 
5046 		debug_hexdump(stdout, "plaintext:", plaintext,
5047 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5048 		debug_hexdump(stdout, "plaintext expected:",
5049 			tdata->plaintext.data,
5050 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5051 	} else {
5052 		if (ut_params->obuf)
5053 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5054 							uint8_t *);
5055 		else
5056 			ciphertext = plaintext;
5057 
5058 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5059 			ciphertext_len);
5060 		debug_hexdump(stdout, "ciphertext expected:",
5061 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5062 
5063 		ut_params->digest = rte_pktmbuf_mtod(
5064 			ut_params->obuf, uint8_t *) +
5065 			(tdata->digest.offset_bytes == 0 ?
5066 			plaintext_pad_len : tdata->digest.offset_bytes);
5067 
5068 		debug_hexdump(stdout, "digest:", ut_params->digest,
5069 			tdata->digest.len);
5070 		debug_hexdump(stdout, "digest expected:",
5071 			tdata->digest.data, tdata->digest.len);
5072 	}
5073 
5074 	/* Validate obuf */
5075 	if (verify) {
5076 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5077 			plaintext,
5078 			tdata->plaintext.data,
5079 			tdata->plaintext.len >> 3,
5080 			"KASUMI Plaintext data not as expected");
5081 	} else {
5082 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5083 			ciphertext,
5084 			tdata->ciphertext.data,
5085 			tdata->ciphertext.len >> 3,
5086 			"KASUMI Ciphertext data not as expected");
5087 
5088 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5089 			ut_params->digest,
5090 			tdata->digest.data,
5091 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5092 			"KASUMI Generated auth tag not as expected");
5093 	}
5094 	return 0;
5095 }
5096 
5097 static int
5098 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5099 	uint8_t op_mode, uint8_t verify)
5100 {
5101 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5102 	struct crypto_unittest_params *ut_params = &unittest_params;
5103 
5104 	int retval;
5105 
5106 	const uint8_t *plaintext = NULL;
5107 	const uint8_t *ciphertext = NULL;
5108 	const uint8_t *digest = NULL;
5109 	unsigned int plaintext_pad_len;
5110 	unsigned int plaintext_len;
5111 	unsigned int ciphertext_pad_len;
5112 	unsigned int ciphertext_len;
5113 	uint8_t buffer[10000];
5114 	uint8_t digest_buffer[10000];
5115 
5116 	struct rte_cryptodev_info dev_info;
5117 
5118 	/* Verify the capabilities */
5119 	struct rte_cryptodev_sym_capability_idx cap_idx;
5120 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5121 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5122 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5123 			&cap_idx) == NULL)
5124 		return -ENOTSUP;
5125 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5126 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5127 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5128 			&cap_idx) == NULL)
5129 		return -ENOTSUP;
5130 
5131 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5132 		return -ENOTSUP;
5133 
5134 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5135 
5136 	uint64_t feat_flags = dev_info.feature_flags;
5137 
5138 	if (op_mode == IN_PLACE) {
5139 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5140 			printf("Device doesn't support in-place scatter-gather "
5141 					"in both input and output mbufs.\n");
5142 			return -ENOTSUP;
5143 		}
5144 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5145 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5146 			printf("Device doesn't support RAW data-path APIs.\n");
5147 			return -ENOTSUP;
5148 		}
5149 	} else {
5150 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5151 			return -ENOTSUP;
5152 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5153 			printf("Device doesn't support out-of-place scatter-gather "
5154 					"in both input and output mbufs.\n");
5155 			return -ENOTSUP;
5156 		}
5157 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5158 			printf("Device doesn't support digest encrypted.\n");
5159 			return -ENOTSUP;
5160 		}
5161 	}
5162 
5163 	/* Create KASUMI session */
5164 	retval = create_wireless_algo_auth_cipher_session(
5165 			ts_params->valid_devs[0],
5166 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5167 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5168 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5169 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5170 			RTE_CRYPTO_AUTH_KASUMI_F9,
5171 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5172 			tdata->key.data, tdata->key.len,
5173 			0, tdata->digest.len,
5174 			tdata->cipher_iv.len);
5175 
5176 	if (retval < 0)
5177 		return retval;
5178 
5179 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5180 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5181 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5182 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5183 
5184 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5185 			plaintext_pad_len, 15, 0);
5186 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5187 			"Failed to allocate input buffer in mempool");
5188 
5189 	if (op_mode == OUT_OF_PLACE) {
5190 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5191 				plaintext_pad_len, 15, 0);
5192 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5193 				"Failed to allocate output buffer in mempool");
5194 	}
5195 
5196 	if (verify) {
5197 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5198 			tdata->ciphertext.data);
5199 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5200 					ciphertext_len, buffer);
5201 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5202 			ciphertext_len);
5203 	} else {
5204 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5205 			tdata->plaintext.data);
5206 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5207 					plaintext_len, buffer);
5208 		debug_hexdump(stdout, "plaintext:", plaintext,
5209 			plaintext_len);
5210 	}
5211 	memset(buffer, 0, sizeof(buffer));
5212 
5213 	/* Create KASUMI operation */
5214 	retval = create_wireless_algo_auth_cipher_operation(
5215 		tdata->digest.data, tdata->digest.len,
5216 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5217 		NULL, 0,
5218 		(tdata->digest.offset_bytes == 0 ?
5219 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5220 			: tdata->digest.offset_bytes),
5221 		tdata->validCipherLenInBits.len,
5222 		tdata->validCipherOffsetInBits.len,
5223 		tdata->validAuthLenInBits.len,
5224 		0,
5225 		op_mode, 1, verify);
5226 
5227 	if (retval < 0)
5228 		return retval;
5229 
5230 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5231 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5232 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5233 	else
5234 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5235 			ut_params->op);
5236 
5237 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5238 
5239 	ut_params->obuf = (op_mode == IN_PLACE ?
5240 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5241 
5242 	if (verify) {
5243 		if (ut_params->obuf)
5244 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5245 					plaintext_len, buffer);
5246 		else
5247 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5248 					plaintext_len, buffer);
5249 
5250 		debug_hexdump(stdout, "plaintext:", plaintext,
5251 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5252 		debug_hexdump(stdout, "plaintext expected:",
5253 			tdata->plaintext.data,
5254 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5255 	} else {
5256 		if (ut_params->obuf)
5257 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5258 					ciphertext_len, buffer);
5259 		else
5260 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5261 					ciphertext_len, buffer);
5262 
5263 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5264 			ciphertext_len);
5265 		debug_hexdump(stdout, "ciphertext expected:",
5266 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5267 
5268 		if (ut_params->obuf)
5269 			digest = rte_pktmbuf_read(ut_params->obuf,
5270 				(tdata->digest.offset_bytes == 0 ?
5271 				plaintext_pad_len : tdata->digest.offset_bytes),
5272 				tdata->digest.len, digest_buffer);
5273 		else
5274 			digest = rte_pktmbuf_read(ut_params->ibuf,
5275 				(tdata->digest.offset_bytes == 0 ?
5276 				plaintext_pad_len : tdata->digest.offset_bytes),
5277 				tdata->digest.len, digest_buffer);
5278 
5279 		debug_hexdump(stdout, "digest:", digest,
5280 			tdata->digest.len);
5281 		debug_hexdump(stdout, "digest expected:",
5282 			tdata->digest.data, tdata->digest.len);
5283 	}
5284 
5285 	/* Validate obuf */
5286 	if (verify) {
5287 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5288 			plaintext,
5289 			tdata->plaintext.data,
5290 			tdata->plaintext.len >> 3,
5291 			"KASUMI Plaintext data not as expected");
5292 	} else {
5293 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5294 			ciphertext,
5295 			tdata->ciphertext.data,
5296 			tdata->validDataLenInBits.len,
5297 			"KASUMI Ciphertext data not as expected");
5298 
5299 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5300 			digest,
5301 			tdata->digest.data,
5302 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5303 			"KASUMI Generated auth tag not as expected");
5304 	}
5305 	return 0;
5306 }
5307 
5308 static int
5309 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5310 {
5311 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5312 	struct crypto_unittest_params *ut_params = &unittest_params;
5313 
5314 	int retval;
5315 
5316 	uint8_t *plaintext, *ciphertext;
5317 	unsigned plaintext_pad_len;
5318 	unsigned plaintext_len;
5319 	struct rte_cryptodev_info dev_info;
5320 
5321 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5322 	uint64_t feat_flags = dev_info.feature_flags;
5323 
5324 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5325 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5326 		printf("Device doesn't support RAW data-path APIs.\n");
5327 		return -ENOTSUP;
5328 	}
5329 
5330 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5331 		return -ENOTSUP;
5332 
5333 	/* Verify the capabilities */
5334 	struct rte_cryptodev_sym_capability_idx cap_idx;
5335 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5336 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5337 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5338 			&cap_idx) == NULL)
5339 		return -ENOTSUP;
5340 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5341 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5342 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5343 			&cap_idx) == NULL)
5344 		return -ENOTSUP;
5345 
5346 	/* Create KASUMI session */
5347 	retval = create_wireless_algo_cipher_auth_session(
5348 			ts_params->valid_devs[0],
5349 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5350 			RTE_CRYPTO_AUTH_OP_GENERATE,
5351 			RTE_CRYPTO_AUTH_KASUMI_F9,
5352 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5353 			tdata->key.data, tdata->key.len,
5354 			0, tdata->digest.len,
5355 			tdata->cipher_iv.len);
5356 	if (retval < 0)
5357 		return retval;
5358 
5359 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5360 
5361 	/* clear mbuf payload */
5362 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5363 			rte_pktmbuf_tailroom(ut_params->ibuf));
5364 
5365 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5366 	/* Append data which is padded to a multiple of */
5367 	/* the algorithms block size */
5368 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5369 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5370 				plaintext_pad_len);
5371 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5372 
5373 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5374 
5375 	/* Create KASUMI operation */
5376 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5377 				tdata->digest.len, NULL, 0,
5378 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5379 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5380 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5381 				tdata->validCipherOffsetInBits.len,
5382 				tdata->validAuthLenInBits.len,
5383 				0
5384 				);
5385 	if (retval < 0)
5386 		return retval;
5387 
5388 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5389 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5390 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5391 	else
5392 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5393 			ut_params->op);
5394 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5395 
5396 	if (ut_params->op->sym->m_dst)
5397 		ut_params->obuf = ut_params->op->sym->m_dst;
5398 	else
5399 		ut_params->obuf = ut_params->op->sym->m_src;
5400 
5401 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5402 				tdata->validCipherOffsetInBits.len >> 3);
5403 
5404 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5405 			+ plaintext_pad_len;
5406 
5407 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5408 				(tdata->validCipherOffsetInBits.len >> 3);
5409 	/* Validate obuf */
5410 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5411 		ciphertext,
5412 		reference_ciphertext,
5413 		tdata->validCipherLenInBits.len,
5414 		"KASUMI Ciphertext data not as expected");
5415 
5416 	/* Validate obuf */
5417 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5418 		ut_params->digest,
5419 		tdata->digest.data,
5420 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5421 		"KASUMI Generated auth tag not as expected");
5422 	return 0;
5423 }
5424 
5425 static int
5426 test_zuc_encryption(const struct wireless_test_data *tdata)
5427 {
5428 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5429 	struct crypto_unittest_params *ut_params = &unittest_params;
5430 
5431 	int retval;
5432 	uint8_t *plaintext, *ciphertext;
5433 	unsigned plaintext_pad_len;
5434 	unsigned plaintext_len;
5435 	struct rte_cryptodev_info dev_info;
5436 
5437 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5438 	uint64_t feat_flags = dev_info.feature_flags;
5439 
5440 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5441 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5442 		printf("Device doesn't support RAW data-path APIs.\n");
5443 		return -ENOTSUP;
5444 	}
5445 
5446 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5447 		return -ENOTSUP;
5448 
5449 	struct rte_cryptodev_sym_capability_idx cap_idx;
5450 
5451 	/* Check if device supports ZUC EEA3 */
5452 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5453 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5454 
5455 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5456 			&cap_idx) == NULL)
5457 		return -ENOTSUP;
5458 
5459 	/* Create ZUC session */
5460 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5461 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5462 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5463 					tdata->key.data, tdata->key.len,
5464 					tdata->cipher_iv.len);
5465 	if (retval < 0)
5466 		return retval;
5467 
5468 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5469 
5470 	/* Clear mbuf payload */
5471 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5472 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5473 
5474 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5475 	/* Append data which is padded to a multiple */
5476 	/* of the algorithms block size */
5477 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5478 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5479 				plaintext_pad_len);
5480 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5481 
5482 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5483 
5484 	/* Create ZUC operation */
5485 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5486 					tdata->cipher_iv.len,
5487 					tdata->plaintext.len,
5488 					0);
5489 	if (retval < 0)
5490 		return retval;
5491 
5492 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5493 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5494 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5495 	else
5496 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5497 						ut_params->op);
5498 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5499 
5500 	ut_params->obuf = ut_params->op->sym->m_dst;
5501 	if (ut_params->obuf)
5502 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5503 	else
5504 		ciphertext = plaintext;
5505 
5506 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5507 
5508 	/* Validate obuf */
5509 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5510 		ciphertext,
5511 		tdata->ciphertext.data,
5512 		tdata->validCipherLenInBits.len,
5513 		"ZUC Ciphertext data not as expected");
5514 	return 0;
5515 }
5516 
5517 static int
5518 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5519 {
5520 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5521 	struct crypto_unittest_params *ut_params = &unittest_params;
5522 
5523 	int retval;
5524 
5525 	unsigned int plaintext_pad_len;
5526 	unsigned int plaintext_len;
5527 	const uint8_t *ciphertext;
5528 	uint8_t ciphertext_buffer[2048];
5529 	struct rte_cryptodev_info dev_info;
5530 
5531 	struct rte_cryptodev_sym_capability_idx cap_idx;
5532 
5533 	/* Check if device supports ZUC EEA3 */
5534 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5535 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5536 
5537 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5538 			&cap_idx) == NULL)
5539 		return -ENOTSUP;
5540 
5541 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5542 		return -ENOTSUP;
5543 
5544 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5545 
5546 	uint64_t feat_flags = dev_info.feature_flags;
5547 
5548 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5549 		printf("Device doesn't support in-place scatter-gather. "
5550 				"Test Skipped.\n");
5551 		return -ENOTSUP;
5552 	}
5553 
5554 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5555 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5556 		printf("Device doesn't support RAW data-path APIs.\n");
5557 		return -ENOTSUP;
5558 	}
5559 
5560 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5561 
5562 	/* Append data which is padded to a multiple */
5563 	/* of the algorithms block size */
5564 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5565 
5566 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5567 			plaintext_pad_len, 10, 0);
5568 
5569 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5570 			tdata->plaintext.data);
5571 
5572 	/* Create ZUC session */
5573 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5574 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5575 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5576 			tdata->key.data, tdata->key.len,
5577 			tdata->cipher_iv.len);
5578 	if (retval < 0)
5579 		return retval;
5580 
5581 	/* Clear mbuf payload */
5582 
5583 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5584 
5585 	/* Create ZUC operation */
5586 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5587 			tdata->cipher_iv.len, tdata->plaintext.len,
5588 			0);
5589 	if (retval < 0)
5590 		return retval;
5591 
5592 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5593 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5594 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5595 	else
5596 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5597 						ut_params->op);
5598 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5599 
5600 	ut_params->obuf = ut_params->op->sym->m_dst;
5601 	if (ut_params->obuf)
5602 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
5603 			0, plaintext_len, ciphertext_buffer);
5604 	else
5605 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5606 			0, plaintext_len, ciphertext_buffer);
5607 
5608 	/* Validate obuf */
5609 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5610 
5611 	/* Validate obuf */
5612 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5613 		ciphertext,
5614 		tdata->ciphertext.data,
5615 		tdata->validCipherLenInBits.len,
5616 		"ZUC Ciphertext data not as expected");
5617 
5618 	return 0;
5619 }
5620 
5621 static int
5622 test_zuc_authentication(const struct wireless_test_data *tdata)
5623 {
5624 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5625 	struct crypto_unittest_params *ut_params = &unittest_params;
5626 
5627 	int retval;
5628 	unsigned plaintext_pad_len;
5629 	unsigned plaintext_len;
5630 	uint8_t *plaintext;
5631 
5632 	struct rte_cryptodev_sym_capability_idx cap_idx;
5633 	struct rte_cryptodev_info dev_info;
5634 
5635 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5636 	uint64_t feat_flags = dev_info.feature_flags;
5637 
5638 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5639 			(tdata->validAuthLenInBits.len % 8 != 0)) {
5640 		printf("Device doesn't support NON-Byte Aligned Data.\n");
5641 		return -ENOTSUP;
5642 	}
5643 
5644 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5645 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5646 		printf("Device doesn't support RAW data-path APIs.\n");
5647 		return -ENOTSUP;
5648 	}
5649 
5650 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5651 		return -ENOTSUP;
5652 
5653 	/* Check if device supports ZUC EIA3 */
5654 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5655 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5656 
5657 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5658 			&cap_idx) == NULL)
5659 		return -ENOTSUP;
5660 
5661 	/* Create ZUC session */
5662 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5663 			tdata->key.data, tdata->key.len,
5664 			tdata->auth_iv.len, tdata->digest.len,
5665 			RTE_CRYPTO_AUTH_OP_GENERATE,
5666 			RTE_CRYPTO_AUTH_ZUC_EIA3);
5667 	if (retval < 0)
5668 		return retval;
5669 
5670 	/* alloc mbuf and set payload */
5671 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5672 
5673 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5674 	rte_pktmbuf_tailroom(ut_params->ibuf));
5675 
5676 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5677 	/* Append data which is padded to a multiple of */
5678 	/* the algorithms block size */
5679 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5680 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5681 				plaintext_pad_len);
5682 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5683 
5684 	/* Create ZUC operation */
5685 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5686 			tdata->auth_iv.data, tdata->auth_iv.len,
5687 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5688 			tdata->validAuthLenInBits.len,
5689 			0);
5690 	if (retval < 0)
5691 		return retval;
5692 
5693 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5694 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5695 				ut_params->op, 0, 1, 1, 0);
5696 	else
5697 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5698 				ut_params->op);
5699 	ut_params->obuf = ut_params->op->sym->m_src;
5700 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5701 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5702 			+ plaintext_pad_len;
5703 
5704 	/* Validate obuf */
5705 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5706 	ut_params->digest,
5707 	tdata->digest.data,
5708 	tdata->digest.len,
5709 	"ZUC Generated auth tag not as expected");
5710 
5711 	return 0;
5712 }
5713 
5714 static int
5715 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5716 	uint8_t op_mode, uint8_t verify)
5717 {
5718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5719 	struct crypto_unittest_params *ut_params = &unittest_params;
5720 
5721 	int retval;
5722 
5723 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5724 	unsigned int plaintext_pad_len;
5725 	unsigned int plaintext_len;
5726 	unsigned int ciphertext_pad_len;
5727 	unsigned int ciphertext_len;
5728 
5729 	struct rte_cryptodev_info dev_info;
5730 	struct rte_cryptodev_sym_capability_idx cap_idx;
5731 
5732 	/* Check if device supports ZUC EIA3 */
5733 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5734 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5735 
5736 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5737 			&cap_idx) == NULL)
5738 		return -ENOTSUP;
5739 
5740 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5741 
5742 	uint64_t feat_flags = dev_info.feature_flags;
5743 
5744 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5745 		printf("Device doesn't support digest encrypted.\n");
5746 		return -ENOTSUP;
5747 	}
5748 	if (op_mode == IN_PLACE) {
5749 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5750 			printf("Device doesn't support in-place scatter-gather "
5751 					"in both input and output mbufs.\n");
5752 			return -ENOTSUP;
5753 		}
5754 
5755 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5756 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5757 			printf("Device doesn't support RAW data-path APIs.\n");
5758 			return -ENOTSUP;
5759 		}
5760 	} else {
5761 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5762 			return -ENOTSUP;
5763 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5764 			printf("Device doesn't support out-of-place scatter-gather "
5765 					"in both input and output mbufs.\n");
5766 			return -ENOTSUP;
5767 		}
5768 	}
5769 
5770 	/* Create ZUC session */
5771 	retval = create_wireless_algo_auth_cipher_session(
5772 			ts_params->valid_devs[0],
5773 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5774 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5775 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5776 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5777 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5778 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5779 			tdata->key.data, tdata->key.len,
5780 			tdata->auth_iv.len, tdata->digest.len,
5781 			tdata->cipher_iv.len);
5782 
5783 	if (retval < 0)
5784 		return retval;
5785 
5786 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5787 	if (op_mode == OUT_OF_PLACE)
5788 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5789 
5790 	/* clear mbuf payload */
5791 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5792 		rte_pktmbuf_tailroom(ut_params->ibuf));
5793 	if (op_mode == OUT_OF_PLACE)
5794 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5795 			rte_pktmbuf_tailroom(ut_params->obuf));
5796 
5797 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5798 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5799 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5800 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5801 
5802 	if (verify) {
5803 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5804 					ciphertext_pad_len);
5805 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5806 		if (op_mode == OUT_OF_PLACE)
5807 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5808 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5809 			ciphertext_len);
5810 	} else {
5811 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5812 					plaintext_pad_len);
5813 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5814 		if (op_mode == OUT_OF_PLACE)
5815 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5816 		debug_hexdump(stdout, "plaintext:", plaintext,
5817 			plaintext_len);
5818 	}
5819 
5820 	/* Create ZUC operation */
5821 	retval = create_wireless_algo_auth_cipher_operation(
5822 		tdata->digest.data, tdata->digest.len,
5823 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5824 		tdata->auth_iv.data, tdata->auth_iv.len,
5825 		(tdata->digest.offset_bytes == 0 ?
5826 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5827 			: tdata->digest.offset_bytes),
5828 		tdata->validCipherLenInBits.len,
5829 		tdata->validCipherOffsetInBits.len,
5830 		tdata->validAuthLenInBits.len,
5831 		0,
5832 		op_mode, 0, verify);
5833 
5834 	if (retval < 0)
5835 		return retval;
5836 
5837 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5838 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5839 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5840 	else
5841 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5842 			ut_params->op);
5843 
5844 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5845 
5846 	ut_params->obuf = (op_mode == IN_PLACE ?
5847 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5848 
5849 
5850 	if (verify) {
5851 		if (ut_params->obuf)
5852 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5853 							uint8_t *);
5854 		else
5855 			plaintext = ciphertext;
5856 
5857 		debug_hexdump(stdout, "plaintext:", plaintext,
5858 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5859 		debug_hexdump(stdout, "plaintext expected:",
5860 			tdata->plaintext.data,
5861 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5862 	} else {
5863 		if (ut_params->obuf)
5864 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5865 							uint8_t *);
5866 		else
5867 			ciphertext = plaintext;
5868 
5869 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5870 			ciphertext_len);
5871 		debug_hexdump(stdout, "ciphertext expected:",
5872 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5873 
5874 		ut_params->digest = rte_pktmbuf_mtod(
5875 			ut_params->obuf, uint8_t *) +
5876 			(tdata->digest.offset_bytes == 0 ?
5877 			plaintext_pad_len : tdata->digest.offset_bytes);
5878 
5879 		debug_hexdump(stdout, "digest:", ut_params->digest,
5880 			tdata->digest.len);
5881 		debug_hexdump(stdout, "digest expected:",
5882 			tdata->digest.data, tdata->digest.len);
5883 	}
5884 
5885 	/* Validate obuf */
5886 	if (verify) {
5887 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5888 			plaintext,
5889 			tdata->plaintext.data,
5890 			tdata->plaintext.len >> 3,
5891 			"ZUC Plaintext data not as expected");
5892 	} else {
5893 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5894 			ciphertext,
5895 			tdata->ciphertext.data,
5896 			tdata->ciphertext.len >> 3,
5897 			"ZUC Ciphertext data not as expected");
5898 
5899 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5900 			ut_params->digest,
5901 			tdata->digest.data,
5902 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5903 			"ZUC Generated auth tag not as expected");
5904 	}
5905 	return 0;
5906 }
5907 
5908 static int
5909 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5910 	uint8_t op_mode, uint8_t verify)
5911 {
5912 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5913 	struct crypto_unittest_params *ut_params = &unittest_params;
5914 
5915 	int retval;
5916 
5917 	const uint8_t *plaintext = NULL;
5918 	const uint8_t *ciphertext = NULL;
5919 	const uint8_t *digest = NULL;
5920 	unsigned int plaintext_pad_len;
5921 	unsigned int plaintext_len;
5922 	unsigned int ciphertext_pad_len;
5923 	unsigned int ciphertext_len;
5924 	uint8_t buffer[10000];
5925 	uint8_t digest_buffer[10000];
5926 
5927 	struct rte_cryptodev_info dev_info;
5928 	struct rte_cryptodev_sym_capability_idx cap_idx;
5929 
5930 	/* Check if device supports ZUC EIA3 */
5931 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5932 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5933 
5934 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5935 			&cap_idx) == NULL)
5936 		return -ENOTSUP;
5937 
5938 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5939 
5940 	uint64_t feat_flags = dev_info.feature_flags;
5941 
5942 	if (op_mode == IN_PLACE) {
5943 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5944 			printf("Device doesn't support in-place scatter-gather "
5945 					"in both input and output mbufs.\n");
5946 			return -ENOTSUP;
5947 		}
5948 
5949 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5950 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5951 			printf("Device doesn't support RAW data-path APIs.\n");
5952 			return -ENOTSUP;
5953 		}
5954 	} else {
5955 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5956 			return -ENOTSUP;
5957 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5958 			printf("Device doesn't support out-of-place scatter-gather "
5959 					"in both input and output mbufs.\n");
5960 			return -ENOTSUP;
5961 		}
5962 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5963 			printf("Device doesn't support digest encrypted.\n");
5964 			return -ENOTSUP;
5965 		}
5966 	}
5967 
5968 	/* Create ZUC session */
5969 	retval = create_wireless_algo_auth_cipher_session(
5970 			ts_params->valid_devs[0],
5971 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5972 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5973 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5974 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5975 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5976 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5977 			tdata->key.data, tdata->key.len,
5978 			tdata->auth_iv.len, tdata->digest.len,
5979 			tdata->cipher_iv.len);
5980 
5981 	if (retval < 0)
5982 		return retval;
5983 
5984 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5985 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5986 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5987 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5988 
5989 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5990 			plaintext_pad_len, 15, 0);
5991 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5992 			"Failed to allocate input buffer in mempool");
5993 
5994 	if (op_mode == OUT_OF_PLACE) {
5995 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5996 				plaintext_pad_len, 15, 0);
5997 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5998 				"Failed to allocate output buffer in mempool");
5999 	}
6000 
6001 	if (verify) {
6002 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6003 			tdata->ciphertext.data);
6004 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6005 					ciphertext_len, buffer);
6006 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6007 			ciphertext_len);
6008 	} else {
6009 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6010 			tdata->plaintext.data);
6011 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6012 					plaintext_len, buffer);
6013 		debug_hexdump(stdout, "plaintext:", plaintext,
6014 			plaintext_len);
6015 	}
6016 	memset(buffer, 0, sizeof(buffer));
6017 
6018 	/* Create ZUC operation */
6019 	retval = create_wireless_algo_auth_cipher_operation(
6020 		tdata->digest.data, tdata->digest.len,
6021 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6022 		NULL, 0,
6023 		(tdata->digest.offset_bytes == 0 ?
6024 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6025 			: tdata->digest.offset_bytes),
6026 		tdata->validCipherLenInBits.len,
6027 		tdata->validCipherOffsetInBits.len,
6028 		tdata->validAuthLenInBits.len,
6029 		0,
6030 		op_mode, 1, verify);
6031 
6032 	if (retval < 0)
6033 		return retval;
6034 
6035 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6036 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6037 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6038 	else
6039 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6040 			ut_params->op);
6041 
6042 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6043 
6044 	ut_params->obuf = (op_mode == IN_PLACE ?
6045 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6046 
6047 	if (verify) {
6048 		if (ut_params->obuf)
6049 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6050 					plaintext_len, buffer);
6051 		else
6052 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6053 					plaintext_len, buffer);
6054 
6055 		debug_hexdump(stdout, "plaintext:", plaintext,
6056 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6057 		debug_hexdump(stdout, "plaintext expected:",
6058 			tdata->plaintext.data,
6059 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6060 	} else {
6061 		if (ut_params->obuf)
6062 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6063 					ciphertext_len, buffer);
6064 		else
6065 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6066 					ciphertext_len, buffer);
6067 
6068 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6069 			ciphertext_len);
6070 		debug_hexdump(stdout, "ciphertext expected:",
6071 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6072 
6073 		if (ut_params->obuf)
6074 			digest = rte_pktmbuf_read(ut_params->obuf,
6075 				(tdata->digest.offset_bytes == 0 ?
6076 				plaintext_pad_len : tdata->digest.offset_bytes),
6077 				tdata->digest.len, digest_buffer);
6078 		else
6079 			digest = rte_pktmbuf_read(ut_params->ibuf,
6080 				(tdata->digest.offset_bytes == 0 ?
6081 				plaintext_pad_len : tdata->digest.offset_bytes),
6082 				tdata->digest.len, digest_buffer);
6083 
6084 		debug_hexdump(stdout, "digest:", digest,
6085 			tdata->digest.len);
6086 		debug_hexdump(stdout, "digest expected:",
6087 			tdata->digest.data, tdata->digest.len);
6088 	}
6089 
6090 	/* Validate obuf */
6091 	if (verify) {
6092 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6093 			plaintext,
6094 			tdata->plaintext.data,
6095 			tdata->plaintext.len >> 3,
6096 			"ZUC Plaintext data not as expected");
6097 	} else {
6098 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6099 			ciphertext,
6100 			tdata->ciphertext.data,
6101 			tdata->validDataLenInBits.len,
6102 			"ZUC Ciphertext data not as expected");
6103 
6104 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6105 			digest,
6106 			tdata->digest.data,
6107 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6108 			"ZUC Generated auth tag not as expected");
6109 	}
6110 	return 0;
6111 }
6112 
6113 static int
6114 test_kasumi_encryption_test_case_1(void)
6115 {
6116 	return test_kasumi_encryption(&kasumi_test_case_1);
6117 }
6118 
6119 static int
6120 test_kasumi_encryption_test_case_1_sgl(void)
6121 {
6122 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6123 }
6124 
6125 static int
6126 test_kasumi_encryption_test_case_1_oop(void)
6127 {
6128 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6129 }
6130 
6131 static int
6132 test_kasumi_encryption_test_case_1_oop_sgl(void)
6133 {
6134 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6135 }
6136 
6137 static int
6138 test_kasumi_encryption_test_case_2(void)
6139 {
6140 	return test_kasumi_encryption(&kasumi_test_case_2);
6141 }
6142 
6143 static int
6144 test_kasumi_encryption_test_case_3(void)
6145 {
6146 	return test_kasumi_encryption(&kasumi_test_case_3);
6147 }
6148 
6149 static int
6150 test_kasumi_encryption_test_case_4(void)
6151 {
6152 	return test_kasumi_encryption(&kasumi_test_case_4);
6153 }
6154 
6155 static int
6156 test_kasumi_encryption_test_case_5(void)
6157 {
6158 	return test_kasumi_encryption(&kasumi_test_case_5);
6159 }
6160 
6161 static int
6162 test_kasumi_decryption_test_case_1(void)
6163 {
6164 	return test_kasumi_decryption(&kasumi_test_case_1);
6165 }
6166 
6167 static int
6168 test_kasumi_decryption_test_case_1_oop(void)
6169 {
6170 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6171 }
6172 
6173 static int
6174 test_kasumi_decryption_test_case_2(void)
6175 {
6176 	return test_kasumi_decryption(&kasumi_test_case_2);
6177 }
6178 
6179 static int
6180 test_kasumi_decryption_test_case_3(void)
6181 {
6182 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6183 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6184 		return -ENOTSUP;
6185 	return test_kasumi_decryption(&kasumi_test_case_3);
6186 }
6187 
6188 static int
6189 test_kasumi_decryption_test_case_4(void)
6190 {
6191 	return test_kasumi_decryption(&kasumi_test_case_4);
6192 }
6193 
6194 static int
6195 test_kasumi_decryption_test_case_5(void)
6196 {
6197 	return test_kasumi_decryption(&kasumi_test_case_5);
6198 }
6199 static int
6200 test_snow3g_encryption_test_case_1(void)
6201 {
6202 	return test_snow3g_encryption(&snow3g_test_case_1);
6203 }
6204 
6205 static int
6206 test_snow3g_encryption_test_case_1_oop(void)
6207 {
6208 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6209 }
6210 
6211 static int
6212 test_snow3g_encryption_test_case_1_oop_sgl(void)
6213 {
6214 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6215 }
6216 
6217 
6218 static int
6219 test_snow3g_encryption_test_case_1_offset_oop(void)
6220 {
6221 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6222 }
6223 
6224 static int
6225 test_snow3g_encryption_test_case_2(void)
6226 {
6227 	return test_snow3g_encryption(&snow3g_test_case_2);
6228 }
6229 
6230 static int
6231 test_snow3g_encryption_test_case_3(void)
6232 {
6233 	return test_snow3g_encryption(&snow3g_test_case_3);
6234 }
6235 
6236 static int
6237 test_snow3g_encryption_test_case_4(void)
6238 {
6239 	return test_snow3g_encryption(&snow3g_test_case_4);
6240 }
6241 
6242 static int
6243 test_snow3g_encryption_test_case_5(void)
6244 {
6245 	return test_snow3g_encryption(&snow3g_test_case_5);
6246 }
6247 
6248 static int
6249 test_snow3g_decryption_test_case_1(void)
6250 {
6251 	return test_snow3g_decryption(&snow3g_test_case_1);
6252 }
6253 
6254 static int
6255 test_snow3g_decryption_test_case_1_oop(void)
6256 {
6257 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6258 }
6259 
6260 static int
6261 test_snow3g_decryption_test_case_2(void)
6262 {
6263 	return test_snow3g_decryption(&snow3g_test_case_2);
6264 }
6265 
6266 static int
6267 test_snow3g_decryption_test_case_3(void)
6268 {
6269 	return test_snow3g_decryption(&snow3g_test_case_3);
6270 }
6271 
6272 static int
6273 test_snow3g_decryption_test_case_4(void)
6274 {
6275 	return test_snow3g_decryption(&snow3g_test_case_4);
6276 }
6277 
6278 static int
6279 test_snow3g_decryption_test_case_5(void)
6280 {
6281 	return test_snow3g_decryption(&snow3g_test_case_5);
6282 }
6283 
6284 /*
6285  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6286  * Pattern digest from snow3g_test_data must be allocated as
6287  * 4 last bytes in plaintext.
6288  */
6289 static void
6290 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6291 		struct snow3g_hash_test_data *output)
6292 {
6293 	if ((pattern != NULL) && (output != NULL)) {
6294 		output->key.len = pattern->key.len;
6295 
6296 		memcpy(output->key.data,
6297 		pattern->key.data, pattern->key.len);
6298 
6299 		output->auth_iv.len = pattern->auth_iv.len;
6300 
6301 		memcpy(output->auth_iv.data,
6302 		pattern->auth_iv.data, pattern->auth_iv.len);
6303 
6304 		output->plaintext.len = pattern->plaintext.len;
6305 
6306 		memcpy(output->plaintext.data,
6307 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6308 
6309 		output->digest.len = pattern->digest.len;
6310 
6311 		memcpy(output->digest.data,
6312 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6313 		pattern->digest.len);
6314 
6315 		output->validAuthLenInBits.len =
6316 		pattern->validAuthLenInBits.len;
6317 	}
6318 }
6319 
6320 /*
6321  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6322  */
6323 static int
6324 test_snow3g_decryption_with_digest_test_case_1(void)
6325 {
6326 	struct snow3g_hash_test_data snow3g_hash_data;
6327 	struct rte_cryptodev_info dev_info;
6328 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6329 
6330 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6331 	uint64_t feat_flags = dev_info.feature_flags;
6332 
6333 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6334 		printf("Device doesn't support encrypted digest operations.\n");
6335 		return -ENOTSUP;
6336 	}
6337 
6338 	/*
6339 	 * Function prepare data for hash veryfication test case.
6340 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6341 	 */
6342 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6343 
6344 	return test_snow3g_decryption(&snow3g_test_case_7) &
6345 			test_snow3g_authentication_verify(&snow3g_hash_data);
6346 }
6347 
6348 static int
6349 test_snow3g_cipher_auth_test_case_1(void)
6350 {
6351 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6352 }
6353 
6354 static int
6355 test_snow3g_auth_cipher_test_case_1(void)
6356 {
6357 	return test_snow3g_auth_cipher(
6358 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6359 }
6360 
6361 static int
6362 test_snow3g_auth_cipher_test_case_2(void)
6363 {
6364 	return test_snow3g_auth_cipher(
6365 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6366 }
6367 
6368 static int
6369 test_snow3g_auth_cipher_test_case_2_oop(void)
6370 {
6371 	return test_snow3g_auth_cipher(
6372 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6373 }
6374 
6375 static int
6376 test_snow3g_auth_cipher_part_digest_enc(void)
6377 {
6378 	return test_snow3g_auth_cipher(
6379 		&snow3g_auth_cipher_partial_digest_encryption,
6380 			IN_PLACE, 0);
6381 }
6382 
6383 static int
6384 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6385 {
6386 	return test_snow3g_auth_cipher(
6387 		&snow3g_auth_cipher_partial_digest_encryption,
6388 			OUT_OF_PLACE, 0);
6389 }
6390 
6391 static int
6392 test_snow3g_auth_cipher_test_case_3_sgl(void)
6393 {
6394 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6395 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6396 		return -ENOTSUP;
6397 	return test_snow3g_auth_cipher_sgl(
6398 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6399 }
6400 
6401 static int
6402 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6403 {
6404 	return test_snow3g_auth_cipher_sgl(
6405 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6406 }
6407 
6408 static int
6409 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6410 {
6411 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6412 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6413 		return -ENOTSUP;
6414 	return test_snow3g_auth_cipher_sgl(
6415 		&snow3g_auth_cipher_partial_digest_encryption,
6416 			IN_PLACE, 0);
6417 }
6418 
6419 static int
6420 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6421 {
6422 	return test_snow3g_auth_cipher_sgl(
6423 		&snow3g_auth_cipher_partial_digest_encryption,
6424 			OUT_OF_PLACE, 0);
6425 }
6426 
6427 static int
6428 test_snow3g_auth_cipher_verify_test_case_1(void)
6429 {
6430 	return test_snow3g_auth_cipher(
6431 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6432 }
6433 
6434 static int
6435 test_snow3g_auth_cipher_verify_test_case_2(void)
6436 {
6437 	return test_snow3g_auth_cipher(
6438 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6439 }
6440 
6441 static int
6442 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6443 {
6444 	return test_snow3g_auth_cipher(
6445 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6446 }
6447 
6448 static int
6449 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6450 {
6451 	return test_snow3g_auth_cipher(
6452 		&snow3g_auth_cipher_partial_digest_encryption,
6453 			IN_PLACE, 1);
6454 }
6455 
6456 static int
6457 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6458 {
6459 	return test_snow3g_auth_cipher(
6460 		&snow3g_auth_cipher_partial_digest_encryption,
6461 			OUT_OF_PLACE, 1);
6462 }
6463 
6464 static int
6465 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6466 {
6467 	return test_snow3g_auth_cipher_sgl(
6468 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6469 }
6470 
6471 static int
6472 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6473 {
6474 	return test_snow3g_auth_cipher_sgl(
6475 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6476 }
6477 
6478 static int
6479 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6480 {
6481 	return test_snow3g_auth_cipher_sgl(
6482 		&snow3g_auth_cipher_partial_digest_encryption,
6483 			IN_PLACE, 1);
6484 }
6485 
6486 static int
6487 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6488 {
6489 	return test_snow3g_auth_cipher_sgl(
6490 		&snow3g_auth_cipher_partial_digest_encryption,
6491 			OUT_OF_PLACE, 1);
6492 }
6493 
6494 static int
6495 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6496 {
6497 	return test_snow3g_auth_cipher(
6498 		&snow3g_test_case_7, IN_PLACE, 0);
6499 }
6500 
6501 static int
6502 test_kasumi_auth_cipher_test_case_1(void)
6503 {
6504 	return test_kasumi_auth_cipher(
6505 		&kasumi_test_case_3, IN_PLACE, 0);
6506 }
6507 
6508 static int
6509 test_kasumi_auth_cipher_test_case_2(void)
6510 {
6511 	return test_kasumi_auth_cipher(
6512 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6513 }
6514 
6515 static int
6516 test_kasumi_auth_cipher_test_case_2_oop(void)
6517 {
6518 	return test_kasumi_auth_cipher(
6519 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6520 }
6521 
6522 static int
6523 test_kasumi_auth_cipher_test_case_2_sgl(void)
6524 {
6525 	return test_kasumi_auth_cipher_sgl(
6526 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6527 }
6528 
6529 static int
6530 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6531 {
6532 	return test_kasumi_auth_cipher_sgl(
6533 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6534 }
6535 
6536 static int
6537 test_kasumi_auth_cipher_verify_test_case_1(void)
6538 {
6539 	return test_kasumi_auth_cipher(
6540 		&kasumi_test_case_3, IN_PLACE, 1);
6541 }
6542 
6543 static int
6544 test_kasumi_auth_cipher_verify_test_case_2(void)
6545 {
6546 	return test_kasumi_auth_cipher(
6547 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6548 }
6549 
6550 static int
6551 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6552 {
6553 	return test_kasumi_auth_cipher(
6554 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6555 }
6556 
6557 static int
6558 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6559 {
6560 	return test_kasumi_auth_cipher_sgl(
6561 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6562 }
6563 
6564 static int
6565 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6566 {
6567 	return test_kasumi_auth_cipher_sgl(
6568 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6569 }
6570 
6571 static int
6572 test_kasumi_cipher_auth_test_case_1(void)
6573 {
6574 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6575 }
6576 
6577 static int
6578 test_zuc_encryption_test_case_1(void)
6579 {
6580 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6581 }
6582 
6583 static int
6584 test_zuc_encryption_test_case_2(void)
6585 {
6586 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6587 }
6588 
6589 static int
6590 test_zuc_encryption_test_case_3(void)
6591 {
6592 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6593 }
6594 
6595 static int
6596 test_zuc_encryption_test_case_4(void)
6597 {
6598 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6599 }
6600 
6601 static int
6602 test_zuc_encryption_test_case_5(void)
6603 {
6604 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6605 }
6606 
6607 static int
6608 test_zuc_encryption_test_case_6_sgl(void)
6609 {
6610 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6611 }
6612 
6613 static int
6614 test_zuc_hash_generate_test_case_1(void)
6615 {
6616 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6617 }
6618 
6619 static int
6620 test_zuc_hash_generate_test_case_2(void)
6621 {
6622 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6623 }
6624 
6625 static int
6626 test_zuc_hash_generate_test_case_3(void)
6627 {
6628 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6629 }
6630 
6631 static int
6632 test_zuc_hash_generate_test_case_4(void)
6633 {
6634 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6635 }
6636 
6637 static int
6638 test_zuc_hash_generate_test_case_5(void)
6639 {
6640 	return test_zuc_authentication(&zuc_test_auth_5670b);
6641 }
6642 
6643 static int
6644 test_zuc_hash_generate_test_case_6(void)
6645 {
6646 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6647 }
6648 
6649 static int
6650 test_zuc_hash_generate_test_case_7(void)
6651 {
6652 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
6653 }
6654 
6655 static int
6656 test_zuc_hash_generate_test_case_8(void)
6657 {
6658 	return test_zuc_authentication(&zuc_test_case_auth_584b);
6659 }
6660 
6661 static int
6662 test_zuc_cipher_auth_test_case_1(void)
6663 {
6664 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6665 }
6666 
6667 static int
6668 test_zuc_cipher_auth_test_case_2(void)
6669 {
6670 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6671 }
6672 
6673 static int
6674 test_zuc_auth_cipher_test_case_1(void)
6675 {
6676 	return test_zuc_auth_cipher(
6677 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6678 }
6679 
6680 static int
6681 test_zuc_auth_cipher_test_case_1_oop(void)
6682 {
6683 	return test_zuc_auth_cipher(
6684 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6685 }
6686 
6687 static int
6688 test_zuc_auth_cipher_test_case_1_sgl(void)
6689 {
6690 	return test_zuc_auth_cipher_sgl(
6691 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6692 }
6693 
6694 static int
6695 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6696 {
6697 	return test_zuc_auth_cipher_sgl(
6698 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6699 }
6700 
6701 static int
6702 test_zuc_auth_cipher_verify_test_case_1(void)
6703 {
6704 	return test_zuc_auth_cipher(
6705 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6706 }
6707 
6708 static int
6709 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6710 {
6711 	return test_zuc_auth_cipher(
6712 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6713 }
6714 
6715 static int
6716 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6717 {
6718 	return test_zuc_auth_cipher_sgl(
6719 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6720 }
6721 
6722 static int
6723 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6724 {
6725 	return test_zuc_auth_cipher_sgl(
6726 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6727 }
6728 
6729 static int
6730 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6731 {
6732 	uint8_t dev_id = testsuite_params.valid_devs[0];
6733 
6734 	struct rte_cryptodev_sym_capability_idx cap_idx;
6735 
6736 	/* Check if device supports particular cipher algorithm */
6737 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6738 	cap_idx.algo.cipher = tdata->cipher_algo;
6739 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6740 		return -ENOTSUP;
6741 
6742 	/* Check if device supports particular hash algorithm */
6743 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6744 	cap_idx.algo.auth = tdata->auth_algo;
6745 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6746 		return -ENOTSUP;
6747 
6748 	return 0;
6749 }
6750 
6751 static int
6752 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6753 	uint8_t op_mode, uint8_t verify)
6754 {
6755 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6756 	struct crypto_unittest_params *ut_params = &unittest_params;
6757 
6758 	int retval;
6759 
6760 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6761 	unsigned int plaintext_pad_len;
6762 	unsigned int plaintext_len;
6763 	unsigned int ciphertext_pad_len;
6764 	unsigned int ciphertext_len;
6765 
6766 	struct rte_cryptodev_info dev_info;
6767 	struct rte_crypto_op *op;
6768 
6769 	/* Check if device supports particular algorithms separately */
6770 	if (test_mixed_check_if_unsupported(tdata))
6771 		return -ENOTSUP;
6772 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6773 		return -ENOTSUP;
6774 
6775 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6776 
6777 	uint64_t feat_flags = dev_info.feature_flags;
6778 
6779 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6780 		printf("Device doesn't support digest encrypted.\n");
6781 		return -ENOTSUP;
6782 	}
6783 
6784 	/* Create the session */
6785 	if (verify)
6786 		retval = create_wireless_algo_cipher_auth_session(
6787 				ts_params->valid_devs[0],
6788 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
6789 				RTE_CRYPTO_AUTH_OP_VERIFY,
6790 				tdata->auth_algo,
6791 				tdata->cipher_algo,
6792 				tdata->auth_key.data, tdata->auth_key.len,
6793 				tdata->auth_iv.len, tdata->digest_enc.len,
6794 				tdata->cipher_iv.len);
6795 	else
6796 		retval = create_wireless_algo_auth_cipher_session(
6797 				ts_params->valid_devs[0],
6798 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6799 				RTE_CRYPTO_AUTH_OP_GENERATE,
6800 				tdata->auth_algo,
6801 				tdata->cipher_algo,
6802 				tdata->auth_key.data, tdata->auth_key.len,
6803 				tdata->auth_iv.len, tdata->digest_enc.len,
6804 				tdata->cipher_iv.len);
6805 	if (retval < 0)
6806 		return retval;
6807 
6808 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6809 	if (op_mode == OUT_OF_PLACE)
6810 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6811 
6812 	/* clear mbuf payload */
6813 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6814 		rte_pktmbuf_tailroom(ut_params->ibuf));
6815 	if (op_mode == OUT_OF_PLACE) {
6816 
6817 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6818 				rte_pktmbuf_tailroom(ut_params->obuf));
6819 	}
6820 
6821 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6822 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6823 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6824 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6825 
6826 	if (verify) {
6827 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6828 				ciphertext_pad_len);
6829 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6830 		if (op_mode == OUT_OF_PLACE)
6831 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6832 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6833 				ciphertext_len);
6834 	} else {
6835 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6836 				plaintext_pad_len);
6837 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6838 		if (op_mode == OUT_OF_PLACE)
6839 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6840 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6841 	}
6842 
6843 	/* Create the operation */
6844 	retval = create_wireless_algo_auth_cipher_operation(
6845 			tdata->digest_enc.data, tdata->digest_enc.len,
6846 			tdata->cipher_iv.data, tdata->cipher_iv.len,
6847 			tdata->auth_iv.data, tdata->auth_iv.len,
6848 			(tdata->digest_enc.offset == 0 ?
6849 				plaintext_pad_len
6850 				: tdata->digest_enc.offset),
6851 			tdata->validCipherLen.len_bits,
6852 			tdata->cipher.offset_bits,
6853 			tdata->validAuthLen.len_bits,
6854 			tdata->auth.offset_bits,
6855 			op_mode, 0, verify);
6856 
6857 	if (retval < 0)
6858 		return retval;
6859 
6860 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
6861 
6862 	/* Check if the op failed because the device doesn't */
6863 	/* support this particular combination of algorithms */
6864 	if (op == NULL && ut_params->op->status ==
6865 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6866 		printf("Device doesn't support this mixed combination. "
6867 				"Test Skipped.\n");
6868 		return -ENOTSUP;
6869 	}
6870 	ut_params->op = op;
6871 
6872 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6873 
6874 	ut_params->obuf = (op_mode == IN_PLACE ?
6875 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6876 
6877 	if (verify) {
6878 		if (ut_params->obuf)
6879 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6880 							uint8_t *);
6881 		else
6882 			plaintext = ciphertext +
6883 					(tdata->cipher.offset_bits >> 3);
6884 
6885 		debug_hexdump(stdout, "plaintext:", plaintext,
6886 				tdata->plaintext.len_bits >> 3);
6887 		debug_hexdump(stdout, "plaintext expected:",
6888 				tdata->plaintext.data,
6889 				tdata->plaintext.len_bits >> 3);
6890 	} else {
6891 		if (ut_params->obuf)
6892 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6893 					uint8_t *);
6894 		else
6895 			ciphertext = plaintext;
6896 
6897 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6898 				ciphertext_len);
6899 		debug_hexdump(stdout, "ciphertext expected:",
6900 				tdata->ciphertext.data,
6901 				tdata->ciphertext.len_bits >> 3);
6902 
6903 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6904 				+ (tdata->digest_enc.offset == 0 ?
6905 		plaintext_pad_len : tdata->digest_enc.offset);
6906 
6907 		debug_hexdump(stdout, "digest:", ut_params->digest,
6908 				tdata->digest_enc.len);
6909 		debug_hexdump(stdout, "digest expected:",
6910 				tdata->digest_enc.data,
6911 				tdata->digest_enc.len);
6912 	}
6913 
6914 	/* Validate obuf */
6915 	if (verify) {
6916 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6917 				plaintext,
6918 				tdata->plaintext.data,
6919 				tdata->plaintext.len_bits >> 3,
6920 				"Plaintext data not as expected");
6921 	} else {
6922 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6923 				ciphertext,
6924 				tdata->ciphertext.data,
6925 				tdata->validDataLen.len_bits,
6926 				"Ciphertext data not as expected");
6927 
6928 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6929 				ut_params->digest,
6930 				tdata->digest_enc.data,
6931 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6932 				"Generated auth tag not as expected");
6933 	}
6934 
6935 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6936 			"crypto op processing failed");
6937 
6938 	return 0;
6939 }
6940 
6941 static int
6942 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6943 	uint8_t op_mode, uint8_t verify)
6944 {
6945 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6946 	struct crypto_unittest_params *ut_params = &unittest_params;
6947 
6948 	int retval;
6949 
6950 	const uint8_t *plaintext = NULL;
6951 	const uint8_t *ciphertext = NULL;
6952 	const uint8_t *digest = NULL;
6953 	unsigned int plaintext_pad_len;
6954 	unsigned int plaintext_len;
6955 	unsigned int ciphertext_pad_len;
6956 	unsigned int ciphertext_len;
6957 	uint8_t buffer[10000];
6958 	uint8_t digest_buffer[10000];
6959 
6960 	struct rte_cryptodev_info dev_info;
6961 	struct rte_crypto_op *op;
6962 
6963 	/* Check if device supports particular algorithms */
6964 	if (test_mixed_check_if_unsupported(tdata))
6965 		return -ENOTSUP;
6966 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6967 		return -ENOTSUP;
6968 
6969 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6970 
6971 	uint64_t feat_flags = dev_info.feature_flags;
6972 
6973 	if (op_mode == IN_PLACE) {
6974 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6975 			printf("Device doesn't support in-place scatter-gather "
6976 					"in both input and output mbufs.\n");
6977 			return -ENOTSUP;
6978 		}
6979 	} else {
6980 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6981 			printf("Device doesn't support out-of-place scatter-gather "
6982 					"in both input and output mbufs.\n");
6983 			return -ENOTSUP;
6984 		}
6985 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6986 			printf("Device doesn't support digest encrypted.\n");
6987 			return -ENOTSUP;
6988 		}
6989 	}
6990 
6991 	/* Create the session */
6992 	if (verify)
6993 		retval = create_wireless_algo_cipher_auth_session(
6994 				ts_params->valid_devs[0],
6995 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
6996 				RTE_CRYPTO_AUTH_OP_VERIFY,
6997 				tdata->auth_algo,
6998 				tdata->cipher_algo,
6999 				tdata->auth_key.data, tdata->auth_key.len,
7000 				tdata->auth_iv.len, tdata->digest_enc.len,
7001 				tdata->cipher_iv.len);
7002 	else
7003 		retval = create_wireless_algo_auth_cipher_session(
7004 				ts_params->valid_devs[0],
7005 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7006 				RTE_CRYPTO_AUTH_OP_GENERATE,
7007 				tdata->auth_algo,
7008 				tdata->cipher_algo,
7009 				tdata->auth_key.data, tdata->auth_key.len,
7010 				tdata->auth_iv.len, tdata->digest_enc.len,
7011 				tdata->cipher_iv.len);
7012 	if (retval < 0)
7013 		return retval;
7014 
7015 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7016 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7017 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7018 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7019 
7020 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7021 			ciphertext_pad_len, 15, 0);
7022 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7023 			"Failed to allocate input buffer in mempool");
7024 
7025 	if (op_mode == OUT_OF_PLACE) {
7026 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7027 				plaintext_pad_len, 15, 0);
7028 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7029 				"Failed to allocate output buffer in mempool");
7030 	}
7031 
7032 	if (verify) {
7033 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7034 			tdata->ciphertext.data);
7035 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7036 					ciphertext_len, buffer);
7037 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7038 			ciphertext_len);
7039 	} else {
7040 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7041 			tdata->plaintext.data);
7042 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7043 					plaintext_len, buffer);
7044 		debug_hexdump(stdout, "plaintext:", plaintext,
7045 			plaintext_len);
7046 	}
7047 	memset(buffer, 0, sizeof(buffer));
7048 
7049 	/* Create the operation */
7050 	retval = create_wireless_algo_auth_cipher_operation(
7051 			tdata->digest_enc.data, tdata->digest_enc.len,
7052 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7053 			tdata->auth_iv.data, tdata->auth_iv.len,
7054 			(tdata->digest_enc.offset == 0 ?
7055 				plaintext_pad_len
7056 				: tdata->digest_enc.offset),
7057 			tdata->validCipherLen.len_bits,
7058 			tdata->cipher.offset_bits,
7059 			tdata->validAuthLen.len_bits,
7060 			tdata->auth.offset_bits,
7061 			op_mode, 1, verify);
7062 
7063 	if (retval < 0)
7064 		return retval;
7065 
7066 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7067 
7068 	/* Check if the op failed because the device doesn't */
7069 	/* support this particular combination of algorithms */
7070 	if (op == NULL && ut_params->op->status ==
7071 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7072 		printf("Device doesn't support this mixed combination. "
7073 				"Test Skipped.\n");
7074 		return -ENOTSUP;
7075 	}
7076 	ut_params->op = op;
7077 
7078 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7079 
7080 	ut_params->obuf = (op_mode == IN_PLACE ?
7081 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7082 
7083 	if (verify) {
7084 		if (ut_params->obuf)
7085 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7086 					plaintext_len, buffer);
7087 		else
7088 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7089 					plaintext_len, buffer);
7090 
7091 		debug_hexdump(stdout, "plaintext:", plaintext,
7092 				(tdata->plaintext.len_bits >> 3) -
7093 				tdata->digest_enc.len);
7094 		debug_hexdump(stdout, "plaintext expected:",
7095 				tdata->plaintext.data,
7096 				(tdata->plaintext.len_bits >> 3) -
7097 				tdata->digest_enc.len);
7098 	} else {
7099 		if (ut_params->obuf)
7100 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7101 					ciphertext_len, buffer);
7102 		else
7103 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7104 					ciphertext_len, buffer);
7105 
7106 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7107 			ciphertext_len);
7108 		debug_hexdump(stdout, "ciphertext expected:",
7109 			tdata->ciphertext.data,
7110 			tdata->ciphertext.len_bits >> 3);
7111 
7112 		if (ut_params->obuf)
7113 			digest = rte_pktmbuf_read(ut_params->obuf,
7114 					(tdata->digest_enc.offset == 0 ?
7115 						plaintext_pad_len :
7116 						tdata->digest_enc.offset),
7117 					tdata->digest_enc.len, digest_buffer);
7118 		else
7119 			digest = rte_pktmbuf_read(ut_params->ibuf,
7120 					(tdata->digest_enc.offset == 0 ?
7121 						plaintext_pad_len :
7122 						tdata->digest_enc.offset),
7123 					tdata->digest_enc.len, digest_buffer);
7124 
7125 		debug_hexdump(stdout, "digest:", digest,
7126 				tdata->digest_enc.len);
7127 		debug_hexdump(stdout, "digest expected:",
7128 				tdata->digest_enc.data, tdata->digest_enc.len);
7129 	}
7130 
7131 	/* Validate obuf */
7132 	if (verify) {
7133 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7134 				plaintext,
7135 				tdata->plaintext.data,
7136 				tdata->plaintext.len_bits >> 3,
7137 				"Plaintext data not as expected");
7138 	} else {
7139 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7140 				ciphertext,
7141 				tdata->ciphertext.data,
7142 				tdata->validDataLen.len_bits,
7143 				"Ciphertext data not as expected");
7144 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7145 				digest,
7146 				tdata->digest_enc.data,
7147 				tdata->digest_enc.len,
7148 				"Generated auth tag not as expected");
7149 	}
7150 
7151 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7152 			"crypto op processing failed");
7153 
7154 	return 0;
7155 }
7156 
7157 /** AUTH AES CMAC + CIPHER AES CTR */
7158 
7159 static int
7160 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7161 {
7162 	return test_mixed_auth_cipher(
7163 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7164 }
7165 
7166 static int
7167 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7168 {
7169 	return test_mixed_auth_cipher(
7170 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7171 }
7172 
7173 static int
7174 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7175 {
7176 	return test_mixed_auth_cipher_sgl(
7177 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7178 }
7179 
7180 static int
7181 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7182 {
7183 	return test_mixed_auth_cipher_sgl(
7184 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7185 }
7186 
7187 static int
7188 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7189 {
7190 	return test_mixed_auth_cipher(
7191 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7192 }
7193 
7194 static int
7195 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7196 {
7197 	return test_mixed_auth_cipher(
7198 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7199 }
7200 
7201 static int
7202 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7203 {
7204 	return test_mixed_auth_cipher_sgl(
7205 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7206 }
7207 
7208 static int
7209 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7210 {
7211 	return test_mixed_auth_cipher_sgl(
7212 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7213 }
7214 
7215 /** MIXED AUTH + CIPHER */
7216 
7217 static int
7218 test_auth_zuc_cipher_snow_test_case_1(void)
7219 {
7220 	return test_mixed_auth_cipher(
7221 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7222 }
7223 
7224 static int
7225 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7226 {
7227 	return test_mixed_auth_cipher(
7228 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7229 }
7230 
7231 static int
7232 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7233 {
7234 	return test_mixed_auth_cipher(
7235 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7236 }
7237 
7238 static int
7239 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7240 {
7241 	return test_mixed_auth_cipher(
7242 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7243 }
7244 
7245 static int
7246 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7247 {
7248 	return test_mixed_auth_cipher(
7249 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7250 }
7251 
7252 static int
7253 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7254 {
7255 	return test_mixed_auth_cipher(
7256 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7257 }
7258 
7259 static int
7260 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7261 {
7262 	return test_mixed_auth_cipher(
7263 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7264 }
7265 
7266 static int
7267 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7268 {
7269 	return test_mixed_auth_cipher(
7270 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7271 }
7272 
7273 static int
7274 test_auth_snow_cipher_zuc_test_case_1(void)
7275 {
7276 	return test_mixed_auth_cipher(
7277 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7278 }
7279 
7280 static int
7281 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7282 {
7283 	return test_mixed_auth_cipher(
7284 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7285 }
7286 
7287 static int
7288 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7289 {
7290 	return test_mixed_auth_cipher(
7291 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7292 }
7293 
7294 static int
7295 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7296 {
7297 	return test_mixed_auth_cipher(
7298 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7299 }
7300 
7301 static int
7302 test_auth_null_cipher_snow_test_case_1(void)
7303 {
7304 	return test_mixed_auth_cipher(
7305 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7306 }
7307 
7308 static int
7309 test_verify_auth_null_cipher_snow_test_case_1(void)
7310 {
7311 	return test_mixed_auth_cipher(
7312 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7313 }
7314 
7315 static int
7316 test_auth_null_cipher_zuc_test_case_1(void)
7317 {
7318 	return test_mixed_auth_cipher(
7319 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7320 }
7321 
7322 static int
7323 test_verify_auth_null_cipher_zuc_test_case_1(void)
7324 {
7325 	return test_mixed_auth_cipher(
7326 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7327 }
7328 
7329 static int
7330 test_auth_snow_cipher_null_test_case_1(void)
7331 {
7332 	return test_mixed_auth_cipher(
7333 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7334 }
7335 
7336 static int
7337 test_verify_auth_snow_cipher_null_test_case_1(void)
7338 {
7339 	return test_mixed_auth_cipher(
7340 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7341 }
7342 
7343 static int
7344 test_auth_zuc_cipher_null_test_case_1(void)
7345 {
7346 	return test_mixed_auth_cipher(
7347 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7348 }
7349 
7350 static int
7351 test_verify_auth_zuc_cipher_null_test_case_1(void)
7352 {
7353 	return test_mixed_auth_cipher(
7354 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7355 }
7356 
7357 static int
7358 test_auth_null_cipher_aes_ctr_test_case_1(void)
7359 {
7360 	return test_mixed_auth_cipher(
7361 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7362 }
7363 
7364 static int
7365 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7366 {
7367 	return test_mixed_auth_cipher(
7368 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7369 }
7370 
7371 static int
7372 test_auth_aes_cmac_cipher_null_test_case_1(void)
7373 {
7374 	return test_mixed_auth_cipher(
7375 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7376 }
7377 
7378 static int
7379 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7380 {
7381 	return test_mixed_auth_cipher(
7382 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7383 }
7384 
7385 /* ***** AEAD algorithm Tests ***** */
7386 
7387 static int
7388 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7389 		enum rte_crypto_aead_operation op,
7390 		const uint8_t *key, const uint8_t key_len,
7391 		const uint16_t aad_len, const uint8_t auth_len,
7392 		uint8_t iv_len)
7393 {
7394 	uint8_t aead_key[key_len];
7395 
7396 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7397 	struct crypto_unittest_params *ut_params = &unittest_params;
7398 
7399 	memcpy(aead_key, key, key_len);
7400 
7401 	/* Setup AEAD Parameters */
7402 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7403 	ut_params->aead_xform.next = NULL;
7404 	ut_params->aead_xform.aead.algo = algo;
7405 	ut_params->aead_xform.aead.op = op;
7406 	ut_params->aead_xform.aead.key.data = aead_key;
7407 	ut_params->aead_xform.aead.key.length = key_len;
7408 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7409 	ut_params->aead_xform.aead.iv.length = iv_len;
7410 	ut_params->aead_xform.aead.digest_length = auth_len;
7411 	ut_params->aead_xform.aead.aad_length = aad_len;
7412 
7413 	debug_hexdump(stdout, "key:", key, key_len);
7414 
7415 	/* Create Crypto session*/
7416 	ut_params->sess = rte_cryptodev_sym_session_create(
7417 			ts_params->session_mpool);
7418 
7419 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7420 			&ut_params->aead_xform,
7421 			ts_params->session_priv_mpool);
7422 
7423 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7424 
7425 	return 0;
7426 }
7427 
7428 static int
7429 create_aead_xform(struct rte_crypto_op *op,
7430 		enum rte_crypto_aead_algorithm algo,
7431 		enum rte_crypto_aead_operation aead_op,
7432 		uint8_t *key, const uint8_t key_len,
7433 		const uint8_t aad_len, const uint8_t auth_len,
7434 		uint8_t iv_len)
7435 {
7436 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7437 			"failed to allocate space for crypto transform");
7438 
7439 	struct rte_crypto_sym_op *sym_op = op->sym;
7440 
7441 	/* Setup AEAD Parameters */
7442 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7443 	sym_op->xform->next = NULL;
7444 	sym_op->xform->aead.algo = algo;
7445 	sym_op->xform->aead.op = aead_op;
7446 	sym_op->xform->aead.key.data = key;
7447 	sym_op->xform->aead.key.length = key_len;
7448 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7449 	sym_op->xform->aead.iv.length = iv_len;
7450 	sym_op->xform->aead.digest_length = auth_len;
7451 	sym_op->xform->aead.aad_length = aad_len;
7452 
7453 	debug_hexdump(stdout, "key:", key, key_len);
7454 
7455 	return 0;
7456 }
7457 
7458 static int
7459 create_aead_operation(enum rte_crypto_aead_operation op,
7460 		const struct aead_test_data *tdata)
7461 {
7462 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7463 	struct crypto_unittest_params *ut_params = &unittest_params;
7464 
7465 	uint8_t *plaintext, *ciphertext;
7466 	unsigned int aad_pad_len, plaintext_pad_len;
7467 
7468 	/* Generate Crypto op data structure */
7469 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7470 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7471 	TEST_ASSERT_NOT_NULL(ut_params->op,
7472 			"Failed to allocate symmetric crypto operation struct");
7473 
7474 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7475 
7476 	/* Append aad data */
7477 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7478 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7479 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7480 				aad_pad_len);
7481 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7482 				"no room to append aad");
7483 
7484 		sym_op->aead.aad.phys_addr =
7485 				rte_pktmbuf_iova(ut_params->ibuf);
7486 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7487 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7488 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7489 			tdata->aad.len);
7490 
7491 		/* Append IV at the end of the crypto operation*/
7492 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7493 				uint8_t *, IV_OFFSET);
7494 
7495 		/* Copy IV 1 byte after the IV pointer, according to the API */
7496 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7497 		debug_hexdump(stdout, "iv:", iv_ptr,
7498 			tdata->iv.len);
7499 	} else {
7500 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7501 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7502 				aad_pad_len);
7503 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7504 				"no room to append aad");
7505 
7506 		sym_op->aead.aad.phys_addr =
7507 				rte_pktmbuf_iova(ut_params->ibuf);
7508 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7509 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7510 			tdata->aad.len);
7511 
7512 		/* Append IV at the end of the crypto operation*/
7513 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7514 				uint8_t *, IV_OFFSET);
7515 
7516 		if (tdata->iv.len == 0) {
7517 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7518 			debug_hexdump(stdout, "iv:", iv_ptr,
7519 				AES_GCM_J0_LENGTH);
7520 		} else {
7521 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7522 			debug_hexdump(stdout, "iv:", iv_ptr,
7523 				tdata->iv.len);
7524 		}
7525 	}
7526 
7527 	/* Append plaintext/ciphertext */
7528 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7529 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7530 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7531 				plaintext_pad_len);
7532 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7533 
7534 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7535 		debug_hexdump(stdout, "plaintext:", plaintext,
7536 				tdata->plaintext.len);
7537 
7538 		if (ut_params->obuf) {
7539 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7540 					ut_params->obuf,
7541 					plaintext_pad_len + aad_pad_len);
7542 			TEST_ASSERT_NOT_NULL(ciphertext,
7543 					"no room to append ciphertext");
7544 
7545 			memset(ciphertext + aad_pad_len, 0,
7546 					tdata->ciphertext.len);
7547 		}
7548 	} else {
7549 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7550 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7551 				plaintext_pad_len);
7552 		TEST_ASSERT_NOT_NULL(ciphertext,
7553 				"no room to append ciphertext");
7554 
7555 		memcpy(ciphertext, tdata->ciphertext.data,
7556 				tdata->ciphertext.len);
7557 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7558 				tdata->ciphertext.len);
7559 
7560 		if (ut_params->obuf) {
7561 			plaintext = (uint8_t *)rte_pktmbuf_append(
7562 					ut_params->obuf,
7563 					plaintext_pad_len + aad_pad_len);
7564 			TEST_ASSERT_NOT_NULL(plaintext,
7565 					"no room to append plaintext");
7566 
7567 			memset(plaintext + aad_pad_len, 0,
7568 					tdata->plaintext.len);
7569 		}
7570 	}
7571 
7572 	/* Append digest data */
7573 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7574 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7575 				ut_params->obuf ? ut_params->obuf :
7576 						ut_params->ibuf,
7577 						tdata->auth_tag.len);
7578 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7579 				"no room to append digest");
7580 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7581 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7582 				ut_params->obuf ? ut_params->obuf :
7583 						ut_params->ibuf,
7584 						plaintext_pad_len +
7585 						aad_pad_len);
7586 	} else {
7587 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7588 				ut_params->ibuf, tdata->auth_tag.len);
7589 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7590 				"no room to append digest");
7591 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7592 				ut_params->ibuf,
7593 				plaintext_pad_len + aad_pad_len);
7594 
7595 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7596 			tdata->auth_tag.len);
7597 		debug_hexdump(stdout, "digest:",
7598 			sym_op->aead.digest.data,
7599 			tdata->auth_tag.len);
7600 	}
7601 
7602 	sym_op->aead.data.length = tdata->plaintext.len;
7603 	sym_op->aead.data.offset = aad_pad_len;
7604 
7605 	return 0;
7606 }
7607 
7608 static int
7609 test_authenticated_encryption(const struct aead_test_data *tdata)
7610 {
7611 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7612 	struct crypto_unittest_params *ut_params = &unittest_params;
7613 
7614 	int retval;
7615 	uint8_t *ciphertext, *auth_tag;
7616 	uint16_t plaintext_pad_len;
7617 	uint32_t i;
7618 	struct rte_cryptodev_info dev_info;
7619 
7620 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7621 	uint64_t feat_flags = dev_info.feature_flags;
7622 
7623 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7624 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7625 		printf("Device doesn't support RAW data-path APIs.\n");
7626 		return -ENOTSUP;
7627 	}
7628 
7629 	/* Verify the capabilities */
7630 	struct rte_cryptodev_sym_capability_idx cap_idx;
7631 	const struct rte_cryptodev_symmetric_capability *capability;
7632 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7633 	cap_idx.algo.aead = tdata->algo;
7634 	capability = rte_cryptodev_sym_capability_get(
7635 			ts_params->valid_devs[0], &cap_idx);
7636 	if (capability == NULL)
7637 		return -ENOTSUP;
7638 	if (rte_cryptodev_sym_capability_check_aead(
7639 			capability, tdata->key.len, tdata->auth_tag.len,
7640 			tdata->aad.len, tdata->iv.len))
7641 		return -ENOTSUP;
7642 
7643 	/* Create AEAD session */
7644 	retval = create_aead_session(ts_params->valid_devs[0],
7645 			tdata->algo,
7646 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7647 			tdata->key.data, tdata->key.len,
7648 			tdata->aad.len, tdata->auth_tag.len,
7649 			tdata->iv.len);
7650 	if (retval < 0)
7651 		return retval;
7652 
7653 	if (tdata->aad.len > MBUF_SIZE) {
7654 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7655 		/* Populate full size of add data */
7656 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7657 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7658 	} else
7659 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7660 
7661 	/* clear mbuf payload */
7662 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7663 			rte_pktmbuf_tailroom(ut_params->ibuf));
7664 
7665 	/* Create AEAD operation */
7666 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7667 	if (retval < 0)
7668 		return retval;
7669 
7670 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7671 
7672 	ut_params->op->sym->m_src = ut_params->ibuf;
7673 
7674 	/* Process crypto operation */
7675 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7676 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7677 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7678 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7679 				ut_params->op, 0, 0, 0, 0);
7680 	else
7681 		TEST_ASSERT_NOT_NULL(
7682 			process_crypto_request(ts_params->valid_devs[0],
7683 			ut_params->op), "failed to process sym crypto op");
7684 
7685 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7686 			"crypto op processing failed");
7687 
7688 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7689 
7690 	if (ut_params->op->sym->m_dst) {
7691 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7692 				uint8_t *);
7693 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7694 				uint8_t *, plaintext_pad_len);
7695 	} else {
7696 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7697 				uint8_t *,
7698 				ut_params->op->sym->cipher.data.offset);
7699 		auth_tag = ciphertext + plaintext_pad_len;
7700 	}
7701 
7702 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7703 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7704 
7705 	/* Validate obuf */
7706 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7707 			ciphertext,
7708 			tdata->ciphertext.data,
7709 			tdata->ciphertext.len,
7710 			"Ciphertext data not as expected");
7711 
7712 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7713 			auth_tag,
7714 			tdata->auth_tag.data,
7715 			tdata->auth_tag.len,
7716 			"Generated auth tag not as expected");
7717 
7718 	return 0;
7719 
7720 }
7721 
7722 #ifdef RTE_LIB_SECURITY
7723 static int
7724 security_proto_supported(enum rte_security_session_action_type action,
7725 	enum rte_security_session_protocol proto)
7726 {
7727 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7728 
7729 	const struct rte_security_capability *capabilities;
7730 	const struct rte_security_capability *capability;
7731 	uint16_t i = 0;
7732 
7733 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7734 				rte_cryptodev_get_sec_ctx(
7735 				ts_params->valid_devs[0]);
7736 
7737 
7738 	capabilities = rte_security_capabilities_get(ctx);
7739 
7740 	if (capabilities == NULL)
7741 		return -ENOTSUP;
7742 
7743 	while ((capability = &capabilities[i++])->action !=
7744 			RTE_SECURITY_ACTION_TYPE_NONE) {
7745 		if (capability->action == action &&
7746 				capability->protocol == proto)
7747 			return 0;
7748 	}
7749 
7750 	return -ENOTSUP;
7751 }
7752 
7753 /* Basic algorithm run function for async inplace mode.
7754  * Creates a session from input parameters and runs one operation
7755  * on input_vec. Checks the output of the crypto operation against
7756  * output_vec.
7757  */
7758 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7759 			   enum rte_crypto_auth_operation opa,
7760 			   const uint8_t *input_vec, unsigned int input_vec_len,
7761 			   const uint8_t *output_vec,
7762 			   unsigned int output_vec_len,
7763 			   enum rte_crypto_cipher_algorithm cipher_alg,
7764 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
7765 			   enum rte_crypto_auth_algorithm auth_alg,
7766 			   const uint8_t *auth_key, uint32_t auth_key_len,
7767 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
7768 			   uint8_t packet_direction, uint8_t sn_size,
7769 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7770 {
7771 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7772 	struct crypto_unittest_params *ut_params = &unittest_params;
7773 	uint8_t *plaintext;
7774 	int ret = TEST_SUCCESS;
7775 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7776 				rte_cryptodev_get_sec_ctx(
7777 				ts_params->valid_devs[0]);
7778 
7779 	/* Verify the capabilities */
7780 	struct rte_security_capability_idx sec_cap_idx;
7781 
7782 	sec_cap_idx.action = ut_params->type;
7783 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7784 	sec_cap_idx.pdcp.domain = domain;
7785 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7786 		return -ENOTSUP;
7787 
7788 	/* Generate test mbuf data */
7789 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7790 
7791 	/* clear mbuf payload */
7792 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7793 			rte_pktmbuf_tailroom(ut_params->ibuf));
7794 
7795 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7796 						  input_vec_len);
7797 	memcpy(plaintext, input_vec, input_vec_len);
7798 
7799 	/* Out of place support */
7800 	if (oop) {
7801 		/*
7802 		 * For out-op-place we need to alloc another mbuf
7803 		 */
7804 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7805 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7806 	}
7807 
7808 	/* Setup Cipher Parameters */
7809 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7810 	ut_params->cipher_xform.cipher.algo = cipher_alg;
7811 	ut_params->cipher_xform.cipher.op = opc;
7812 	ut_params->cipher_xform.cipher.key.data = cipher_key;
7813 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7814 	ut_params->cipher_xform.cipher.iv.length =
7815 				packet_direction ? 4 : 0;
7816 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7817 
7818 	/* Setup HMAC Parameters if ICV header is required */
7819 	if (auth_alg != 0) {
7820 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7821 		ut_params->auth_xform.next = NULL;
7822 		ut_params->auth_xform.auth.algo = auth_alg;
7823 		ut_params->auth_xform.auth.op = opa;
7824 		ut_params->auth_xform.auth.key.data = auth_key;
7825 		ut_params->auth_xform.auth.key.length = auth_key_len;
7826 
7827 		ut_params->cipher_xform.next = &ut_params->auth_xform;
7828 	} else {
7829 		ut_params->cipher_xform.next = NULL;
7830 	}
7831 
7832 	struct rte_security_session_conf sess_conf = {
7833 		.action_type = ut_params->type,
7834 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
7835 		{.pdcp = {
7836 			.bearer = bearer,
7837 			.domain = domain,
7838 			.pkt_dir = packet_direction,
7839 			.sn_size = sn_size,
7840 			.hfn = packet_direction ? 0 : hfn,
7841 			/**
7842 			 * hfn can be set as pdcp_test_hfn[i]
7843 			 * if hfn_ovrd is not set. Here, PDCP
7844 			 * packet direction is just used to
7845 			 * run half of the cases with session
7846 			 * HFN and other half with per packet
7847 			 * HFN.
7848 			 */
7849 			.hfn_threshold = hfn_threshold,
7850 			.hfn_ovrd = packet_direction ? 1 : 0,
7851 			.sdap_enabled = sdap,
7852 		} },
7853 		.crypto_xform = &ut_params->cipher_xform
7854 	};
7855 
7856 	/* Create security session */
7857 	ut_params->sec_session = rte_security_session_create(ctx,
7858 				&sess_conf, ts_params->session_mpool,
7859 				ts_params->session_priv_mpool);
7860 
7861 	if (!ut_params->sec_session) {
7862 		printf("TestCase %s()-%d line %d failed %s: ",
7863 			__func__, i, __LINE__, "Failed to allocate session");
7864 		ret = TEST_FAILED;
7865 		goto on_err;
7866 	}
7867 
7868 	/* Generate crypto op data structure */
7869 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7870 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7871 	if (!ut_params->op) {
7872 		printf("TestCase %s()-%d line %d failed %s: ",
7873 			__func__, i, __LINE__,
7874 			"Failed to allocate symmetric crypto operation struct");
7875 		ret = TEST_FAILED;
7876 		goto on_err;
7877 	}
7878 
7879 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7880 					uint32_t *, IV_OFFSET);
7881 	*per_pkt_hfn = packet_direction ? hfn : 0;
7882 
7883 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
7884 
7885 	/* set crypto operation source mbuf */
7886 	ut_params->op->sym->m_src = ut_params->ibuf;
7887 	if (oop)
7888 		ut_params->op->sym->m_dst = ut_params->obuf;
7889 
7890 	/* Process crypto operation */
7891 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7892 		== NULL) {
7893 		printf("TestCase %s()-%d line %d failed %s: ",
7894 			__func__, i, __LINE__,
7895 			"failed to process sym crypto op");
7896 		ret = TEST_FAILED;
7897 		goto on_err;
7898 	}
7899 
7900 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7901 		printf("TestCase %s()-%d line %d failed %s: ",
7902 			__func__, i, __LINE__, "crypto op processing failed");
7903 		ret = TEST_FAILED;
7904 		goto on_err;
7905 	}
7906 
7907 	/* Validate obuf */
7908 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7909 			uint8_t *);
7910 	if (oop) {
7911 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7912 				uint8_t *);
7913 	}
7914 
7915 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
7916 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7917 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7918 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7919 		ret = TEST_FAILED;
7920 		goto on_err;
7921 	}
7922 
7923 on_err:
7924 	rte_crypto_op_free(ut_params->op);
7925 	ut_params->op = NULL;
7926 
7927 	if (ut_params->sec_session)
7928 		rte_security_session_destroy(ctx, ut_params->sec_session);
7929 	ut_params->sec_session = NULL;
7930 
7931 	rte_pktmbuf_free(ut_params->ibuf);
7932 	ut_params->ibuf = NULL;
7933 	if (oop) {
7934 		rte_pktmbuf_free(ut_params->obuf);
7935 		ut_params->obuf = NULL;
7936 	}
7937 
7938 	return ret;
7939 }
7940 
7941 static int
7942 test_pdcp_proto_SGL(int i, int oop,
7943 	enum rte_crypto_cipher_operation opc,
7944 	enum rte_crypto_auth_operation opa,
7945 	uint8_t *input_vec,
7946 	unsigned int input_vec_len,
7947 	uint8_t *output_vec,
7948 	unsigned int output_vec_len,
7949 	uint32_t fragsz,
7950 	uint32_t fragsz_oop)
7951 {
7952 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7953 	struct crypto_unittest_params *ut_params = &unittest_params;
7954 	uint8_t *plaintext;
7955 	struct rte_mbuf *buf, *buf_oop = NULL;
7956 	int ret = TEST_SUCCESS;
7957 	int to_trn = 0;
7958 	int to_trn_tbl[16];
7959 	int segs = 1;
7960 	unsigned int trn_data = 0;
7961 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7962 				rte_cryptodev_get_sec_ctx(
7963 				ts_params->valid_devs[0]);
7964 
7965 	/* Verify the capabilities */
7966 	struct rte_security_capability_idx sec_cap_idx;
7967 
7968 	sec_cap_idx.action = ut_params->type;
7969 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7970 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7971 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7972 		return -ENOTSUP;
7973 
7974 	if (fragsz > input_vec_len)
7975 		fragsz = input_vec_len;
7976 
7977 	uint16_t plaintext_len = fragsz;
7978 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7979 
7980 	if (fragsz_oop > output_vec_len)
7981 		frag_size_oop = output_vec_len;
7982 
7983 	int ecx = 0;
7984 	if (input_vec_len % fragsz != 0) {
7985 		if (input_vec_len / fragsz + 1 > 16)
7986 			return 1;
7987 	} else if (input_vec_len / fragsz > 16)
7988 		return 1;
7989 
7990 	/* Out of place support */
7991 	if (oop) {
7992 		/*
7993 		 * For out-op-place we need to alloc another mbuf
7994 		 */
7995 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7996 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7997 		buf_oop = ut_params->obuf;
7998 	}
7999 
8000 	/* Generate test mbuf data */
8001 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8002 
8003 	/* clear mbuf payload */
8004 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8005 			rte_pktmbuf_tailroom(ut_params->ibuf));
8006 
8007 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8008 						  plaintext_len);
8009 	memcpy(plaintext, input_vec, plaintext_len);
8010 	trn_data += plaintext_len;
8011 
8012 	buf = ut_params->ibuf;
8013 
8014 	/*
8015 	 * Loop until no more fragments
8016 	 */
8017 
8018 	while (trn_data < input_vec_len) {
8019 		++segs;
8020 		to_trn = (input_vec_len - trn_data < fragsz) ?
8021 				(input_vec_len - trn_data) : fragsz;
8022 
8023 		to_trn_tbl[ecx++] = to_trn;
8024 
8025 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8026 		buf = buf->next;
8027 
8028 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8029 				rte_pktmbuf_tailroom(buf));
8030 
8031 		/* OOP */
8032 		if (oop && !fragsz_oop) {
8033 			buf_oop->next =
8034 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8035 			buf_oop = buf_oop->next;
8036 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8037 					0, rte_pktmbuf_tailroom(buf_oop));
8038 			rte_pktmbuf_append(buf_oop, to_trn);
8039 		}
8040 
8041 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8042 				to_trn);
8043 
8044 		memcpy(plaintext, input_vec + trn_data, to_trn);
8045 		trn_data += to_trn;
8046 	}
8047 
8048 	ut_params->ibuf->nb_segs = segs;
8049 
8050 	segs = 1;
8051 	if (fragsz_oop && oop) {
8052 		to_trn = 0;
8053 		ecx = 0;
8054 
8055 		trn_data = frag_size_oop;
8056 		while (trn_data < output_vec_len) {
8057 			++segs;
8058 			to_trn =
8059 				(output_vec_len - trn_data <
8060 						frag_size_oop) ?
8061 				(output_vec_len - trn_data) :
8062 						frag_size_oop;
8063 
8064 			to_trn_tbl[ecx++] = to_trn;
8065 
8066 			buf_oop->next =
8067 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8068 			buf_oop = buf_oop->next;
8069 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8070 					0, rte_pktmbuf_tailroom(buf_oop));
8071 			rte_pktmbuf_append(buf_oop, to_trn);
8072 
8073 			trn_data += to_trn;
8074 		}
8075 		ut_params->obuf->nb_segs = segs;
8076 	}
8077 
8078 	/* Setup Cipher Parameters */
8079 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8080 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8081 	ut_params->cipher_xform.cipher.op = opc;
8082 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8083 	ut_params->cipher_xform.cipher.key.length =
8084 					pdcp_test_params[i].cipher_key_len;
8085 	ut_params->cipher_xform.cipher.iv.length = 0;
8086 
8087 	/* Setup HMAC Parameters if ICV header is required */
8088 	if (pdcp_test_params[i].auth_alg != 0) {
8089 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8090 		ut_params->auth_xform.next = NULL;
8091 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8092 		ut_params->auth_xform.auth.op = opa;
8093 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8094 		ut_params->auth_xform.auth.key.length =
8095 					pdcp_test_params[i].auth_key_len;
8096 
8097 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8098 	} else {
8099 		ut_params->cipher_xform.next = NULL;
8100 	}
8101 
8102 	struct rte_security_session_conf sess_conf = {
8103 		.action_type = ut_params->type,
8104 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8105 		{.pdcp = {
8106 			.bearer = pdcp_test_bearer[i],
8107 			.domain = pdcp_test_params[i].domain,
8108 			.pkt_dir = pdcp_test_packet_direction[i],
8109 			.sn_size = pdcp_test_data_sn_size[i],
8110 			.hfn = pdcp_test_hfn[i],
8111 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8112 			.hfn_ovrd = 0,
8113 		} },
8114 		.crypto_xform = &ut_params->cipher_xform
8115 	};
8116 
8117 	/* Create security session */
8118 	ut_params->sec_session = rte_security_session_create(ctx,
8119 				&sess_conf, ts_params->session_mpool,
8120 				ts_params->session_priv_mpool);
8121 
8122 	if (!ut_params->sec_session) {
8123 		printf("TestCase %s()-%d line %d failed %s: ",
8124 			__func__, i, __LINE__, "Failed to allocate session");
8125 		ret = TEST_FAILED;
8126 		goto on_err;
8127 	}
8128 
8129 	/* Generate crypto op data structure */
8130 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8131 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8132 	if (!ut_params->op) {
8133 		printf("TestCase %s()-%d line %d failed %s: ",
8134 			__func__, i, __LINE__,
8135 			"Failed to allocate symmetric crypto operation struct");
8136 		ret = TEST_FAILED;
8137 		goto on_err;
8138 	}
8139 
8140 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8141 
8142 	/* set crypto operation source mbuf */
8143 	ut_params->op->sym->m_src = ut_params->ibuf;
8144 	if (oop)
8145 		ut_params->op->sym->m_dst = ut_params->obuf;
8146 
8147 	/* Process crypto operation */
8148 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8149 		== NULL) {
8150 		printf("TestCase %s()-%d line %d failed %s: ",
8151 			__func__, i, __LINE__,
8152 			"failed to process sym crypto op");
8153 		ret = TEST_FAILED;
8154 		goto on_err;
8155 	}
8156 
8157 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8158 		printf("TestCase %s()-%d line %d failed %s: ",
8159 			__func__, i, __LINE__, "crypto op processing failed");
8160 		ret = TEST_FAILED;
8161 		goto on_err;
8162 	}
8163 
8164 	/* Validate obuf */
8165 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8166 			uint8_t *);
8167 	if (oop) {
8168 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8169 				uint8_t *);
8170 	}
8171 	if (fragsz_oop)
8172 		fragsz = frag_size_oop;
8173 	if (memcmp(ciphertext, output_vec, fragsz)) {
8174 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8175 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8176 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8177 		ret = TEST_FAILED;
8178 		goto on_err;
8179 	}
8180 
8181 	buf = ut_params->op->sym->m_src->next;
8182 	if (oop)
8183 		buf = ut_params->op->sym->m_dst->next;
8184 
8185 	unsigned int off = fragsz;
8186 
8187 	ecx = 0;
8188 	while (buf) {
8189 		ciphertext = rte_pktmbuf_mtod(buf,
8190 				uint8_t *);
8191 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8192 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8193 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8194 			rte_hexdump(stdout, "reference", output_vec + off,
8195 					to_trn_tbl[ecx]);
8196 			ret = TEST_FAILED;
8197 			goto on_err;
8198 		}
8199 		off += to_trn_tbl[ecx++];
8200 		buf = buf->next;
8201 	}
8202 on_err:
8203 	rte_crypto_op_free(ut_params->op);
8204 	ut_params->op = NULL;
8205 
8206 	if (ut_params->sec_session)
8207 		rte_security_session_destroy(ctx, ut_params->sec_session);
8208 	ut_params->sec_session = NULL;
8209 
8210 	rte_pktmbuf_free(ut_params->ibuf);
8211 	ut_params->ibuf = NULL;
8212 	if (oop) {
8213 		rte_pktmbuf_free(ut_params->obuf);
8214 		ut_params->obuf = NULL;
8215 	}
8216 
8217 	return ret;
8218 }
8219 
8220 int
8221 test_pdcp_proto_cplane_encap(int i)
8222 {
8223 	return test_pdcp_proto(
8224 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8225 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8226 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8227 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8228 		pdcp_test_params[i].cipher_key_len,
8229 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8230 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8231 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8232 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8233 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8234 }
8235 
8236 int
8237 test_pdcp_proto_uplane_encap(int i)
8238 {
8239 	return test_pdcp_proto(
8240 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8241 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8242 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8243 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8244 		pdcp_test_params[i].cipher_key_len,
8245 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8246 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8247 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8248 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8249 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8250 }
8251 
8252 int
8253 test_pdcp_proto_uplane_encap_with_int(int i)
8254 {
8255 	return test_pdcp_proto(
8256 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8257 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8258 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8259 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8260 		pdcp_test_params[i].cipher_key_len,
8261 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8262 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8263 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8264 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8265 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8266 }
8267 
8268 int
8269 test_pdcp_proto_cplane_decap(int i)
8270 {
8271 	return test_pdcp_proto(
8272 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8273 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8274 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8275 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8276 		pdcp_test_params[i].cipher_key_len,
8277 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8278 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8279 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8280 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8281 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8282 }
8283 
8284 int
8285 test_pdcp_proto_uplane_decap(int i)
8286 {
8287 	return test_pdcp_proto(
8288 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8289 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8290 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8291 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8292 		pdcp_test_params[i].cipher_key_len,
8293 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8294 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8295 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8296 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8297 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8298 }
8299 
8300 int
8301 test_pdcp_proto_uplane_decap_with_int(int i)
8302 {
8303 	return test_pdcp_proto(
8304 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8305 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8306 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8307 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8308 		pdcp_test_params[i].cipher_key_len,
8309 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8310 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8311 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8312 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8313 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8314 }
8315 
8316 static int
8317 test_PDCP_PROTO_SGL_in_place_32B(void)
8318 {
8319 	/* i can be used for running any PDCP case
8320 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8321 	 */
8322 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8323 	return test_pdcp_proto_SGL(i, IN_PLACE,
8324 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8325 			RTE_CRYPTO_AUTH_OP_GENERATE,
8326 			pdcp_test_data_in[i],
8327 			pdcp_test_data_in_len[i],
8328 			pdcp_test_data_out[i],
8329 			pdcp_test_data_in_len[i]+4,
8330 			32, 0);
8331 }
8332 static int
8333 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8334 {
8335 	/* i can be used for running any PDCP case
8336 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8337 	 */
8338 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8339 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8340 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8341 			RTE_CRYPTO_AUTH_OP_GENERATE,
8342 			pdcp_test_data_in[i],
8343 			pdcp_test_data_in_len[i],
8344 			pdcp_test_data_out[i],
8345 			pdcp_test_data_in_len[i]+4,
8346 			32, 128);
8347 }
8348 static int
8349 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8350 {
8351 	/* i can be used for running any PDCP case
8352 	 * In this case it is uplane 18-bit AES DL encap
8353 	 */
8354 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8355 			+ DOWNLINK;
8356 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8357 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8358 			RTE_CRYPTO_AUTH_OP_GENERATE,
8359 			pdcp_test_data_in[i],
8360 			pdcp_test_data_in_len[i],
8361 			pdcp_test_data_out[i],
8362 			pdcp_test_data_in_len[i],
8363 			32, 40);
8364 }
8365 static int
8366 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8367 {
8368 	/* i can be used for running any PDCP case
8369 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8370 	 */
8371 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8372 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8373 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8374 			RTE_CRYPTO_AUTH_OP_GENERATE,
8375 			pdcp_test_data_in[i],
8376 			pdcp_test_data_in_len[i],
8377 			pdcp_test_data_out[i],
8378 			pdcp_test_data_in_len[i]+4,
8379 			128, 32);
8380 }
8381 
8382 static int
8383 test_PDCP_SDAP_PROTO_encap_all(void)
8384 {
8385 	int i = 0, size = 0;
8386 	int err, all_err = TEST_SUCCESS;
8387 	const struct pdcp_sdap_test *cur_test;
8388 
8389 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8390 
8391 	for (i = 0; i < size; i++) {
8392 		cur_test = &list_pdcp_sdap_tests[i];
8393 		err = test_pdcp_proto(
8394 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8395 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8396 			cur_test->in_len, cur_test->data_out,
8397 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8398 			cur_test->param.cipher_alg, cur_test->cipher_key,
8399 			cur_test->param.cipher_key_len,
8400 			cur_test->param.auth_alg,
8401 			cur_test->auth_key, cur_test->param.auth_key_len,
8402 			cur_test->bearer, cur_test->param.domain,
8403 			cur_test->packet_direction, cur_test->sn_size,
8404 			cur_test->hfn,
8405 			cur_test->hfn_threshold, SDAP_ENABLED);
8406 		if (err) {
8407 			printf("\t%d) %s: Encapsulation failed\n",
8408 					cur_test->test_idx,
8409 					cur_test->param.name);
8410 			err = TEST_FAILED;
8411 		} else {
8412 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8413 					cur_test->param.name);
8414 			err = TEST_SUCCESS;
8415 		}
8416 		all_err += err;
8417 	}
8418 
8419 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8420 
8421 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8422 }
8423 
8424 static int
8425 test_PDCP_SDAP_PROTO_decap_all(void)
8426 {
8427 	int i = 0, size = 0;
8428 	int err, all_err = TEST_SUCCESS;
8429 	const struct pdcp_sdap_test *cur_test;
8430 
8431 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8432 
8433 	for (i = 0; i < size; i++) {
8434 		cur_test = &list_pdcp_sdap_tests[i];
8435 		err = test_pdcp_proto(
8436 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8437 			RTE_CRYPTO_AUTH_OP_VERIFY,
8438 			cur_test->data_out,
8439 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8440 			cur_test->data_in, cur_test->in_len,
8441 			cur_test->param.cipher_alg,
8442 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8443 			cur_test->param.auth_alg, cur_test->auth_key,
8444 			cur_test->param.auth_key_len, cur_test->bearer,
8445 			cur_test->param.domain, cur_test->packet_direction,
8446 			cur_test->sn_size, cur_test->hfn,
8447 			cur_test->hfn_threshold, SDAP_ENABLED);
8448 		if (err) {
8449 			printf("\t%d) %s: Decapsulation failed\n",
8450 					cur_test->test_idx,
8451 					cur_test->param.name);
8452 			err = TEST_FAILED;
8453 		} else {
8454 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8455 					cur_test->param.name);
8456 			err = TEST_SUCCESS;
8457 		}
8458 		all_err += err;
8459 	}
8460 
8461 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8462 
8463 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8464 }
8465 
8466 static int
8467 test_PDCP_PROTO_all(void)
8468 {
8469 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8470 	struct crypto_unittest_params *ut_params = &unittest_params;
8471 	struct rte_cryptodev_info dev_info;
8472 	int status;
8473 
8474 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8475 	uint64_t feat_flags = dev_info.feature_flags;
8476 
8477 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8478 		return -ENOTSUP;
8479 
8480 	/* Set action type */
8481 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8482 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8483 		gbl_action_type;
8484 
8485 	if (security_proto_supported(ut_params->type,
8486 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
8487 		return -ENOTSUP;
8488 
8489 	status = test_PDCP_PROTO_cplane_encap_all();
8490 	status += test_PDCP_PROTO_cplane_decap_all();
8491 	status += test_PDCP_PROTO_uplane_encap_all();
8492 	status += test_PDCP_PROTO_uplane_decap_all();
8493 	status += test_PDCP_PROTO_SGL_in_place_32B();
8494 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
8495 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
8496 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
8497 	status += test_PDCP_SDAP_PROTO_encap_all();
8498 	status += test_PDCP_SDAP_PROTO_decap_all();
8499 
8500 	if (status)
8501 		return TEST_FAILED;
8502 	else
8503 		return TEST_SUCCESS;
8504 }
8505 
8506 static int
8507 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8508 {
8509 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8510 	struct crypto_unittest_params *ut_params = &unittest_params;
8511 	uint8_t *plaintext, *ciphertext;
8512 	uint8_t *iv_ptr;
8513 	int32_t cipher_len, crc_len;
8514 	uint32_t crc_data_len;
8515 	int ret = TEST_SUCCESS;
8516 
8517 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8518 					rte_cryptodev_get_sec_ctx(
8519 						ts_params->valid_devs[0]);
8520 
8521 	/* Verify the capabilities */
8522 	struct rte_security_capability_idx sec_cap_idx;
8523 	const struct rte_security_capability *sec_cap;
8524 	const struct rte_cryptodev_capabilities *crypto_cap;
8525 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8526 	int j = 0;
8527 
8528 	sec_cap_idx.action = ut_params->type;
8529 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8530 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8531 
8532 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8533 	if (sec_cap == NULL)
8534 		return -ENOTSUP;
8535 
8536 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8537 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8538 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8539 				crypto_cap->sym.xform_type ==
8540 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8541 				crypto_cap->sym.cipher.algo ==
8542 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8543 			sym_cap = &crypto_cap->sym;
8544 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8545 						d_td->key.len,
8546 						d_td->iv.len) == 0)
8547 				break;
8548 		}
8549 	}
8550 
8551 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8552 		return -ENOTSUP;
8553 
8554 	/* Setup source mbuf payload */
8555 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8556 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8557 			rte_pktmbuf_tailroom(ut_params->ibuf));
8558 
8559 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8560 			d_td->ciphertext.len);
8561 
8562 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8563 
8564 	/* Setup cipher session parameters */
8565 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8566 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8567 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8568 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8569 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8570 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8571 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8572 	ut_params->cipher_xform.next = NULL;
8573 
8574 	/* Setup DOCSIS session parameters */
8575 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8576 
8577 	struct rte_security_session_conf sess_conf = {
8578 		.action_type = ut_params->type,
8579 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8580 		.docsis = ut_params->docsis_xform,
8581 		.crypto_xform = &ut_params->cipher_xform,
8582 	};
8583 
8584 	/* Create security session */
8585 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8586 					ts_params->session_mpool,
8587 					ts_params->session_priv_mpool);
8588 
8589 	if (!ut_params->sec_session) {
8590 		printf("TestCase %s(%d) line %d: %s\n",
8591 			__func__, i, __LINE__, "failed to allocate session");
8592 		ret = TEST_FAILED;
8593 		goto on_err;
8594 	}
8595 
8596 	/* Generate crypto op data structure */
8597 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8598 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8599 	if (!ut_params->op) {
8600 		printf("TestCase %s(%d) line %d: %s\n",
8601 			__func__, i, __LINE__,
8602 			"failed to allocate symmetric crypto operation");
8603 		ret = TEST_FAILED;
8604 		goto on_err;
8605 	}
8606 
8607 	/* Setup CRC operation parameters */
8608 	crc_len = d_td->ciphertext.no_crc == false ?
8609 			(d_td->ciphertext.len -
8610 				d_td->ciphertext.crc_offset -
8611 				RTE_ETHER_CRC_LEN) :
8612 			0;
8613 	crc_len = crc_len > 0 ? crc_len : 0;
8614 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8615 	ut_params->op->sym->auth.data.length = crc_len;
8616 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8617 
8618 	/* Setup cipher operation parameters */
8619 	cipher_len = d_td->ciphertext.no_cipher == false ?
8620 			(d_td->ciphertext.len -
8621 				d_td->ciphertext.cipher_offset) :
8622 			0;
8623 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8624 	ut_params->op->sym->cipher.data.length = cipher_len;
8625 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8626 
8627 	/* Setup cipher IV */
8628 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8629 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8630 
8631 	/* Attach session to operation */
8632 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8633 
8634 	/* Set crypto operation mbufs */
8635 	ut_params->op->sym->m_src = ut_params->ibuf;
8636 	ut_params->op->sym->m_dst = NULL;
8637 
8638 	/* Process crypto operation */
8639 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8640 			NULL) {
8641 		printf("TestCase %s(%d) line %d: %s\n",
8642 			__func__, i, __LINE__,
8643 			"failed to process security crypto op");
8644 		ret = TEST_FAILED;
8645 		goto on_err;
8646 	}
8647 
8648 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8649 		printf("TestCase %s(%d) line %d: %s\n",
8650 			__func__, i, __LINE__, "crypto op processing failed");
8651 		ret = TEST_FAILED;
8652 		goto on_err;
8653 	}
8654 
8655 	/* Validate plaintext */
8656 	plaintext = ciphertext;
8657 
8658 	if (memcmp(plaintext, d_td->plaintext.data,
8659 			d_td->plaintext.len - crc_data_len)) {
8660 		printf("TestCase %s(%d) line %d: %s\n",
8661 			__func__, i, __LINE__, "plaintext not as expected\n");
8662 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
8663 				d_td->plaintext.len);
8664 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8665 		ret = TEST_FAILED;
8666 		goto on_err;
8667 	}
8668 
8669 on_err:
8670 	rte_crypto_op_free(ut_params->op);
8671 	ut_params->op = NULL;
8672 
8673 	if (ut_params->sec_session)
8674 		rte_security_session_destroy(ctx, ut_params->sec_session);
8675 	ut_params->sec_session = NULL;
8676 
8677 	rte_pktmbuf_free(ut_params->ibuf);
8678 	ut_params->ibuf = NULL;
8679 
8680 	return ret;
8681 }
8682 
8683 static int
8684 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8685 {
8686 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8687 	struct crypto_unittest_params *ut_params = &unittest_params;
8688 	uint8_t *plaintext, *ciphertext;
8689 	uint8_t *iv_ptr;
8690 	int32_t cipher_len, crc_len;
8691 	int ret = TEST_SUCCESS;
8692 
8693 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8694 					rte_cryptodev_get_sec_ctx(
8695 						ts_params->valid_devs[0]);
8696 
8697 	/* Verify the capabilities */
8698 	struct rte_security_capability_idx sec_cap_idx;
8699 	const struct rte_security_capability *sec_cap;
8700 	const struct rte_cryptodev_capabilities *crypto_cap;
8701 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8702 	int j = 0;
8703 
8704 	sec_cap_idx.action = ut_params->type;
8705 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8706 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8707 
8708 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8709 	if (sec_cap == NULL)
8710 		return -ENOTSUP;
8711 
8712 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8713 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8714 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8715 				crypto_cap->sym.xform_type ==
8716 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8717 				crypto_cap->sym.cipher.algo ==
8718 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8719 			sym_cap = &crypto_cap->sym;
8720 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8721 						d_td->key.len,
8722 						d_td->iv.len) == 0)
8723 				break;
8724 		}
8725 	}
8726 
8727 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8728 		return -ENOTSUP;
8729 
8730 	/* Setup source mbuf payload */
8731 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8732 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8733 			rte_pktmbuf_tailroom(ut_params->ibuf));
8734 
8735 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8736 			d_td->plaintext.len);
8737 
8738 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8739 
8740 	/* Setup cipher session parameters */
8741 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8742 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8743 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8744 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8745 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8746 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8747 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8748 	ut_params->cipher_xform.next = NULL;
8749 
8750 	/* Setup DOCSIS session parameters */
8751 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8752 
8753 	struct rte_security_session_conf sess_conf = {
8754 		.action_type = ut_params->type,
8755 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8756 		.docsis = ut_params->docsis_xform,
8757 		.crypto_xform = &ut_params->cipher_xform,
8758 	};
8759 
8760 	/* Create security session */
8761 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8762 					ts_params->session_mpool,
8763 					ts_params->session_priv_mpool);
8764 
8765 	if (!ut_params->sec_session) {
8766 		printf("TestCase %s(%d) line %d: %s\n",
8767 			__func__, i, __LINE__, "failed to allocate session");
8768 		ret = TEST_FAILED;
8769 		goto on_err;
8770 	}
8771 
8772 	/* Generate crypto op data structure */
8773 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8774 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8775 	if (!ut_params->op) {
8776 		printf("TestCase %s(%d) line %d: %s\n",
8777 			__func__, i, __LINE__,
8778 			"failed to allocate security crypto operation");
8779 		ret = TEST_FAILED;
8780 		goto on_err;
8781 	}
8782 
8783 	/* Setup CRC operation parameters */
8784 	crc_len = d_td->plaintext.no_crc == false ?
8785 			(d_td->plaintext.len -
8786 				d_td->plaintext.crc_offset -
8787 				RTE_ETHER_CRC_LEN) :
8788 			0;
8789 	crc_len = crc_len > 0 ? crc_len : 0;
8790 	ut_params->op->sym->auth.data.length = crc_len;
8791 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8792 
8793 	/* Setup cipher operation parameters */
8794 	cipher_len = d_td->plaintext.no_cipher == false ?
8795 			(d_td->plaintext.len -
8796 				d_td->plaintext.cipher_offset) :
8797 			0;
8798 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8799 	ut_params->op->sym->cipher.data.length = cipher_len;
8800 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8801 
8802 	/* Setup cipher IV */
8803 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8804 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8805 
8806 	/* Attach session to operation */
8807 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8808 
8809 	/* Set crypto operation mbufs */
8810 	ut_params->op->sym->m_src = ut_params->ibuf;
8811 	ut_params->op->sym->m_dst = NULL;
8812 
8813 	/* Process crypto operation */
8814 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8815 			NULL) {
8816 		printf("TestCase %s(%d) line %d: %s\n",
8817 			__func__, i, __LINE__,
8818 			"failed to process security crypto op");
8819 		ret = TEST_FAILED;
8820 		goto on_err;
8821 	}
8822 
8823 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8824 		printf("TestCase %s(%d) line %d: %s\n",
8825 			__func__, i, __LINE__, "crypto op processing failed");
8826 		ret = TEST_FAILED;
8827 		goto on_err;
8828 	}
8829 
8830 	/* Validate ciphertext */
8831 	ciphertext = plaintext;
8832 
8833 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8834 		printf("TestCase %s(%d) line %d: %s\n",
8835 			__func__, i, __LINE__, "ciphertext not as expected\n");
8836 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8837 				d_td->ciphertext.len);
8838 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8839 		ret = TEST_FAILED;
8840 		goto on_err;
8841 	}
8842 
8843 on_err:
8844 	rte_crypto_op_free(ut_params->op);
8845 	ut_params->op = NULL;
8846 
8847 	if (ut_params->sec_session)
8848 		rte_security_session_destroy(ctx, ut_params->sec_session);
8849 	ut_params->sec_session = NULL;
8850 
8851 	rte_pktmbuf_free(ut_params->ibuf);
8852 	ut_params->ibuf = NULL;
8853 
8854 	return ret;
8855 }
8856 
8857 #define TEST_DOCSIS_COUNT(func) do {			\
8858 	int ret = func;					\
8859 	if (ret == TEST_SUCCESS)  {			\
8860 		printf("\t%2d)", n++);			\
8861 		printf("+++++ PASSED:" #func"\n");	\
8862 		p++;					\
8863 	} else if (ret == -ENOTSUP) {			\
8864 		printf("\t%2d)", n++);			\
8865 		printf("~~~~~ UNSUPP:" #func"\n");	\
8866 		u++;					\
8867 	} else {					\
8868 		printf("\t%2d)", n++);			\
8869 		printf("----- FAILED:" #func"\n");	\
8870 		f++;					\
8871 	}						\
8872 } while (0)
8873 
8874 static int
8875 test_DOCSIS_PROTO_uplink_all(void)
8876 {
8877 	int p = 0, u = 0, f = 0, n = 0;
8878 
8879 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8880 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8881 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8882 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8883 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8884 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8885 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8886 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8887 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8888 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8889 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8890 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8891 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8892 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8893 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8894 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8895 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8896 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8897 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8898 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8899 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8900 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8901 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8902 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8903 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8904 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8905 
8906 	if (f)
8907 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8908 			__func__, p, n, u);
8909 
8910 	return f;
8911 };
8912 
8913 static int
8914 test_DOCSIS_PROTO_downlink_all(void)
8915 {
8916 	int p = 0, u = 0, f = 0, n = 0;
8917 
8918 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8919 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8920 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8921 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8922 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8923 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8924 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8925 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8926 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8927 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8928 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8929 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8930 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8931 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8932 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8933 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8934 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8935 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8936 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8937 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8938 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8939 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8940 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8941 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8942 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8943 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8944 
8945 	if (f)
8946 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8947 			__func__, p, n, u);
8948 
8949 	return f;
8950 };
8951 
8952 static int
8953 test_DOCSIS_PROTO_all(void)
8954 {
8955 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8956 	struct crypto_unittest_params *ut_params = &unittest_params;
8957 	struct rte_cryptodev_info dev_info;
8958 	int status;
8959 
8960 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8961 	uint64_t feat_flags = dev_info.feature_flags;
8962 
8963 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8964 		return -ENOTSUP;
8965 
8966 	/* Set action type */
8967 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8968 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8969 		gbl_action_type;
8970 
8971 	if (security_proto_supported(ut_params->type,
8972 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8973 		return -ENOTSUP;
8974 
8975 	status = test_DOCSIS_PROTO_uplink_all();
8976 	status += test_DOCSIS_PROTO_downlink_all();
8977 
8978 	if (status)
8979 		return TEST_FAILED;
8980 	else
8981 		return TEST_SUCCESS;
8982 }
8983 #endif
8984 
8985 static int
8986 test_AES_GCM_authenticated_encryption_test_case_1(void)
8987 {
8988 	return test_authenticated_encryption(&gcm_test_case_1);
8989 }
8990 
8991 static int
8992 test_AES_GCM_authenticated_encryption_test_case_2(void)
8993 {
8994 	return test_authenticated_encryption(&gcm_test_case_2);
8995 }
8996 
8997 static int
8998 test_AES_GCM_authenticated_encryption_test_case_3(void)
8999 {
9000 	return test_authenticated_encryption(&gcm_test_case_3);
9001 }
9002 
9003 static int
9004 test_AES_GCM_authenticated_encryption_test_case_4(void)
9005 {
9006 	return test_authenticated_encryption(&gcm_test_case_4);
9007 }
9008 
9009 static int
9010 test_AES_GCM_authenticated_encryption_test_case_5(void)
9011 {
9012 	return test_authenticated_encryption(&gcm_test_case_5);
9013 }
9014 
9015 static int
9016 test_AES_GCM_authenticated_encryption_test_case_6(void)
9017 {
9018 	return test_authenticated_encryption(&gcm_test_case_6);
9019 }
9020 
9021 static int
9022 test_AES_GCM_authenticated_encryption_test_case_7(void)
9023 {
9024 	return test_authenticated_encryption(&gcm_test_case_7);
9025 }
9026 
9027 static int
9028 test_AES_GCM_authenticated_encryption_test_case_8(void)
9029 {
9030 	return test_authenticated_encryption(&gcm_test_case_8);
9031 }
9032 
9033 static int
9034 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9035 {
9036 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9037 }
9038 
9039 static int
9040 test_AES_GCM_auth_encryption_test_case_192_1(void)
9041 {
9042 	return test_authenticated_encryption(&gcm_test_case_192_1);
9043 }
9044 
9045 static int
9046 test_AES_GCM_auth_encryption_test_case_192_2(void)
9047 {
9048 	return test_authenticated_encryption(&gcm_test_case_192_2);
9049 }
9050 
9051 static int
9052 test_AES_GCM_auth_encryption_test_case_192_3(void)
9053 {
9054 	return test_authenticated_encryption(&gcm_test_case_192_3);
9055 }
9056 
9057 static int
9058 test_AES_GCM_auth_encryption_test_case_192_4(void)
9059 {
9060 	return test_authenticated_encryption(&gcm_test_case_192_4);
9061 }
9062 
9063 static int
9064 test_AES_GCM_auth_encryption_test_case_192_5(void)
9065 {
9066 	return test_authenticated_encryption(&gcm_test_case_192_5);
9067 }
9068 
9069 static int
9070 test_AES_GCM_auth_encryption_test_case_192_6(void)
9071 {
9072 	return test_authenticated_encryption(&gcm_test_case_192_6);
9073 }
9074 
9075 static int
9076 test_AES_GCM_auth_encryption_test_case_192_7(void)
9077 {
9078 	return test_authenticated_encryption(&gcm_test_case_192_7);
9079 }
9080 
9081 static int
9082 test_AES_GCM_auth_encryption_test_case_256_1(void)
9083 {
9084 	return test_authenticated_encryption(&gcm_test_case_256_1);
9085 }
9086 
9087 static int
9088 test_AES_GCM_auth_encryption_test_case_256_2(void)
9089 {
9090 	return test_authenticated_encryption(&gcm_test_case_256_2);
9091 }
9092 
9093 static int
9094 test_AES_GCM_auth_encryption_test_case_256_3(void)
9095 {
9096 	return test_authenticated_encryption(&gcm_test_case_256_3);
9097 }
9098 
9099 static int
9100 test_AES_GCM_auth_encryption_test_case_256_4(void)
9101 {
9102 	return test_authenticated_encryption(&gcm_test_case_256_4);
9103 }
9104 
9105 static int
9106 test_AES_GCM_auth_encryption_test_case_256_5(void)
9107 {
9108 	return test_authenticated_encryption(&gcm_test_case_256_5);
9109 }
9110 
9111 static int
9112 test_AES_GCM_auth_encryption_test_case_256_6(void)
9113 {
9114 	return test_authenticated_encryption(&gcm_test_case_256_6);
9115 }
9116 
9117 static int
9118 test_AES_GCM_auth_encryption_test_case_256_7(void)
9119 {
9120 	return test_authenticated_encryption(&gcm_test_case_256_7);
9121 }
9122 
9123 static int
9124 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9125 {
9126 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9127 }
9128 
9129 static int
9130 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9131 {
9132 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9133 }
9134 
9135 static int
9136 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9137 {
9138 	struct aead_test_data tdata;
9139 	int res;
9140 
9141 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9142 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9143 	tdata.iv.data[0] += 1;
9144 	res = test_authenticated_encryption(&tdata);
9145 	if (res == -ENOTSUP)
9146 		return res;
9147 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9148 	return TEST_SUCCESS;
9149 }
9150 
9151 static int
9152 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9153 {
9154 	struct aead_test_data tdata;
9155 	int res;
9156 
9157 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9158 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9159 	tdata.plaintext.data[0] += 1;
9160 	res = test_authenticated_encryption(&tdata);
9161 	if (res == -ENOTSUP)
9162 		return res;
9163 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9164 	return TEST_SUCCESS;
9165 }
9166 
9167 static int
9168 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9169 {
9170 	struct aead_test_data tdata;
9171 	int res;
9172 
9173 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9174 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9175 	tdata.ciphertext.data[0] += 1;
9176 	res = test_authenticated_encryption(&tdata);
9177 	if (res == -ENOTSUP)
9178 		return res;
9179 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9180 	return TEST_SUCCESS;
9181 }
9182 
9183 static int
9184 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9185 {
9186 	struct aead_test_data tdata;
9187 	int res;
9188 
9189 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9190 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9191 	tdata.aad.len += 1;
9192 	res = test_authenticated_encryption(&tdata);
9193 	if (res == -ENOTSUP)
9194 		return res;
9195 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9196 	return TEST_SUCCESS;
9197 }
9198 
9199 static int
9200 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9201 {
9202 	struct aead_test_data tdata;
9203 	uint8_t aad[gcm_test_case_7.aad.len];
9204 	int res;
9205 
9206 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9207 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9208 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9209 	aad[0] += 1;
9210 	tdata.aad.data = aad;
9211 	res = test_authenticated_encryption(&tdata);
9212 	if (res == -ENOTSUP)
9213 		return res;
9214 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9215 	return TEST_SUCCESS;
9216 }
9217 
9218 static int
9219 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9220 {
9221 	struct aead_test_data tdata;
9222 	int res;
9223 
9224 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9225 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9226 	tdata.auth_tag.data[0] += 1;
9227 	res = test_authenticated_encryption(&tdata);
9228 	if (res == -ENOTSUP)
9229 		return res;
9230 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9231 	return TEST_SUCCESS;
9232 }
9233 
9234 static int
9235 test_authenticated_decryption(const struct aead_test_data *tdata)
9236 {
9237 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9238 	struct crypto_unittest_params *ut_params = &unittest_params;
9239 
9240 	int retval;
9241 	uint8_t *plaintext;
9242 	uint32_t i;
9243 	struct rte_cryptodev_info dev_info;
9244 
9245 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9246 	uint64_t feat_flags = dev_info.feature_flags;
9247 
9248 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9249 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9250 		printf("Device doesn't support RAW data-path APIs.\n");
9251 		return -ENOTSUP;
9252 	}
9253 
9254 	/* Verify the capabilities */
9255 	struct rte_cryptodev_sym_capability_idx cap_idx;
9256 	const struct rte_cryptodev_symmetric_capability *capability;
9257 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9258 	cap_idx.algo.aead = tdata->algo;
9259 	capability = rte_cryptodev_sym_capability_get(
9260 			ts_params->valid_devs[0], &cap_idx);
9261 	if (capability == NULL)
9262 		return -ENOTSUP;
9263 	if (rte_cryptodev_sym_capability_check_aead(
9264 			capability, tdata->key.len, tdata->auth_tag.len,
9265 			tdata->aad.len, tdata->iv.len))
9266 		return -ENOTSUP;
9267 
9268 	/* Create AEAD session */
9269 	retval = create_aead_session(ts_params->valid_devs[0],
9270 			tdata->algo,
9271 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9272 			tdata->key.data, tdata->key.len,
9273 			tdata->aad.len, tdata->auth_tag.len,
9274 			tdata->iv.len);
9275 	if (retval < 0)
9276 		return retval;
9277 
9278 	/* alloc mbuf and set payload */
9279 	if (tdata->aad.len > MBUF_SIZE) {
9280 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9281 		/* Populate full size of add data */
9282 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9283 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9284 	} else
9285 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9286 
9287 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9288 			rte_pktmbuf_tailroom(ut_params->ibuf));
9289 
9290 	/* Create AEAD operation */
9291 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9292 	if (retval < 0)
9293 		return retval;
9294 
9295 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9296 
9297 	ut_params->op->sym->m_src = ut_params->ibuf;
9298 
9299 	/* Process crypto operation */
9300 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9301 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9302 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9303 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9304 				ut_params->op, 0, 0, 0, 0);
9305 	else
9306 		TEST_ASSERT_NOT_NULL(
9307 			process_crypto_request(ts_params->valid_devs[0],
9308 			ut_params->op), "failed to process sym crypto op");
9309 
9310 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9311 			"crypto op processing failed");
9312 
9313 	if (ut_params->op->sym->m_dst)
9314 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9315 				uint8_t *);
9316 	else
9317 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9318 				uint8_t *,
9319 				ut_params->op->sym->cipher.data.offset);
9320 
9321 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9322 
9323 	/* Validate obuf */
9324 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9325 			plaintext,
9326 			tdata->plaintext.data,
9327 			tdata->plaintext.len,
9328 			"Plaintext data not as expected");
9329 
9330 	TEST_ASSERT_EQUAL(ut_params->op->status,
9331 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9332 			"Authentication failed");
9333 
9334 	return 0;
9335 }
9336 
9337 static int
9338 test_AES_GCM_authenticated_decryption_test_case_1(void)
9339 {
9340 	return test_authenticated_decryption(&gcm_test_case_1);
9341 }
9342 
9343 static int
9344 test_AES_GCM_authenticated_decryption_test_case_2(void)
9345 {
9346 	return test_authenticated_decryption(&gcm_test_case_2);
9347 }
9348 
9349 static int
9350 test_AES_GCM_authenticated_decryption_test_case_3(void)
9351 {
9352 	return test_authenticated_decryption(&gcm_test_case_3);
9353 }
9354 
9355 static int
9356 test_AES_GCM_authenticated_decryption_test_case_4(void)
9357 {
9358 	return test_authenticated_decryption(&gcm_test_case_4);
9359 }
9360 
9361 static int
9362 test_AES_GCM_authenticated_decryption_test_case_5(void)
9363 {
9364 	return test_authenticated_decryption(&gcm_test_case_5);
9365 }
9366 
9367 static int
9368 test_AES_GCM_authenticated_decryption_test_case_6(void)
9369 {
9370 	return test_authenticated_decryption(&gcm_test_case_6);
9371 }
9372 
9373 static int
9374 test_AES_GCM_authenticated_decryption_test_case_7(void)
9375 {
9376 	return test_authenticated_decryption(&gcm_test_case_7);
9377 }
9378 
9379 static int
9380 test_AES_GCM_authenticated_decryption_test_case_8(void)
9381 {
9382 	return test_authenticated_decryption(&gcm_test_case_8);
9383 }
9384 
9385 static int
9386 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9387 {
9388 	return test_authenticated_decryption(&gcm_J0_test_case_1);
9389 }
9390 
9391 static int
9392 test_AES_GCM_auth_decryption_test_case_192_1(void)
9393 {
9394 	return test_authenticated_decryption(&gcm_test_case_192_1);
9395 }
9396 
9397 static int
9398 test_AES_GCM_auth_decryption_test_case_192_2(void)
9399 {
9400 	return test_authenticated_decryption(&gcm_test_case_192_2);
9401 }
9402 
9403 static int
9404 test_AES_GCM_auth_decryption_test_case_192_3(void)
9405 {
9406 	return test_authenticated_decryption(&gcm_test_case_192_3);
9407 }
9408 
9409 static int
9410 test_AES_GCM_auth_decryption_test_case_192_4(void)
9411 {
9412 	return test_authenticated_decryption(&gcm_test_case_192_4);
9413 }
9414 
9415 static int
9416 test_AES_GCM_auth_decryption_test_case_192_5(void)
9417 {
9418 	return test_authenticated_decryption(&gcm_test_case_192_5);
9419 }
9420 
9421 static int
9422 test_AES_GCM_auth_decryption_test_case_192_6(void)
9423 {
9424 	return test_authenticated_decryption(&gcm_test_case_192_6);
9425 }
9426 
9427 static int
9428 test_AES_GCM_auth_decryption_test_case_192_7(void)
9429 {
9430 	return test_authenticated_decryption(&gcm_test_case_192_7);
9431 }
9432 
9433 static int
9434 test_AES_GCM_auth_decryption_test_case_256_1(void)
9435 {
9436 	return test_authenticated_decryption(&gcm_test_case_256_1);
9437 }
9438 
9439 static int
9440 test_AES_GCM_auth_decryption_test_case_256_2(void)
9441 {
9442 	return test_authenticated_decryption(&gcm_test_case_256_2);
9443 }
9444 
9445 static int
9446 test_AES_GCM_auth_decryption_test_case_256_3(void)
9447 {
9448 	return test_authenticated_decryption(&gcm_test_case_256_3);
9449 }
9450 
9451 static int
9452 test_AES_GCM_auth_decryption_test_case_256_4(void)
9453 {
9454 	return test_authenticated_decryption(&gcm_test_case_256_4);
9455 }
9456 
9457 static int
9458 test_AES_GCM_auth_decryption_test_case_256_5(void)
9459 {
9460 	return test_authenticated_decryption(&gcm_test_case_256_5);
9461 }
9462 
9463 static int
9464 test_AES_GCM_auth_decryption_test_case_256_6(void)
9465 {
9466 	return test_authenticated_decryption(&gcm_test_case_256_6);
9467 }
9468 
9469 static int
9470 test_AES_GCM_auth_decryption_test_case_256_7(void)
9471 {
9472 	return test_authenticated_decryption(&gcm_test_case_256_7);
9473 }
9474 
9475 static int
9476 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9477 {
9478 	return test_authenticated_decryption(&gcm_test_case_aad_1);
9479 }
9480 
9481 static int
9482 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9483 {
9484 	return test_authenticated_decryption(&gcm_test_case_aad_2);
9485 }
9486 
9487 static int
9488 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9489 {
9490 	struct aead_test_data tdata;
9491 	int res;
9492 
9493 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9494 	tdata.iv.data[0] += 1;
9495 	res = test_authenticated_decryption(&tdata);
9496 	if (res == -ENOTSUP)
9497 		return res;
9498 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9499 	return TEST_SUCCESS;
9500 }
9501 
9502 static int
9503 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9504 {
9505 	struct aead_test_data tdata;
9506 	int res;
9507 
9508 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9509 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9510 	tdata.plaintext.data[0] += 1;
9511 	res = test_authenticated_decryption(&tdata);
9512 	if (res == -ENOTSUP)
9513 		return res;
9514 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9515 	return TEST_SUCCESS;
9516 }
9517 
9518 static int
9519 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9520 {
9521 	struct aead_test_data tdata;
9522 	int res;
9523 
9524 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9525 	tdata.ciphertext.data[0] += 1;
9526 	res = test_authenticated_decryption(&tdata);
9527 	if (res == -ENOTSUP)
9528 		return res;
9529 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9530 	return TEST_SUCCESS;
9531 }
9532 
9533 static int
9534 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9535 {
9536 	struct aead_test_data tdata;
9537 	int res;
9538 
9539 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9540 	tdata.aad.len += 1;
9541 	res = test_authenticated_decryption(&tdata);
9542 	if (res == -ENOTSUP)
9543 		return res;
9544 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9545 	return TEST_SUCCESS;
9546 }
9547 
9548 static int
9549 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9550 {
9551 	struct aead_test_data tdata;
9552 	uint8_t aad[gcm_test_case_7.aad.len];
9553 	int res;
9554 
9555 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9556 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9557 	aad[0] += 1;
9558 	tdata.aad.data = aad;
9559 	res = test_authenticated_decryption(&tdata);
9560 	if (res == -ENOTSUP)
9561 		return res;
9562 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9563 	return TEST_SUCCESS;
9564 }
9565 
9566 static int
9567 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9568 {
9569 	struct aead_test_data tdata;
9570 	int res;
9571 
9572 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9573 	tdata.auth_tag.data[0] += 1;
9574 	res = test_authenticated_decryption(&tdata);
9575 	if (res == -ENOTSUP)
9576 		return res;
9577 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9578 	return TEST_SUCCESS;
9579 }
9580 
9581 static int
9582 test_authenticated_encryption_oop(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 *ciphertext, *auth_tag;
9589 	uint16_t plaintext_pad_len;
9590 
9591 	/* Verify the capabilities */
9592 	struct rte_cryptodev_sym_capability_idx cap_idx;
9593 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9594 	cap_idx.algo.aead = tdata->algo;
9595 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9596 			&cap_idx) == NULL)
9597 		return -ENOTSUP;
9598 
9599 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9600 		return -ENOTSUP;
9601 
9602 	/* not supported with CPU crypto */
9603 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9604 		return -ENOTSUP;
9605 
9606 	/* Create AEAD session */
9607 	retval = create_aead_session(ts_params->valid_devs[0],
9608 			tdata->algo,
9609 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9610 			tdata->key.data, tdata->key.len,
9611 			tdata->aad.len, tdata->auth_tag.len,
9612 			tdata->iv.len);
9613 	if (retval < 0)
9614 		return retval;
9615 
9616 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9617 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9618 
9619 	/* clear mbuf payload */
9620 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9621 			rte_pktmbuf_tailroom(ut_params->ibuf));
9622 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9623 			rte_pktmbuf_tailroom(ut_params->obuf));
9624 
9625 	/* Create AEAD operation */
9626 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9627 	if (retval < 0)
9628 		return retval;
9629 
9630 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9631 
9632 	ut_params->op->sym->m_src = ut_params->ibuf;
9633 	ut_params->op->sym->m_dst = ut_params->obuf;
9634 
9635 	/* Process crypto operation */
9636 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9637 			ut_params->op), "failed to process sym crypto op");
9638 
9639 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9640 			"crypto op processing failed");
9641 
9642 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9643 
9644 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9645 			ut_params->op->sym->cipher.data.offset);
9646 	auth_tag = ciphertext + plaintext_pad_len;
9647 
9648 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9649 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9650 
9651 	/* Validate obuf */
9652 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9653 			ciphertext,
9654 			tdata->ciphertext.data,
9655 			tdata->ciphertext.len,
9656 			"Ciphertext data not as expected");
9657 
9658 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9659 			auth_tag,
9660 			tdata->auth_tag.data,
9661 			tdata->auth_tag.len,
9662 			"Generated auth tag not as expected");
9663 
9664 	return 0;
9665 
9666 }
9667 
9668 static int
9669 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9670 {
9671 	return test_authenticated_encryption_oop(&gcm_test_case_5);
9672 }
9673 
9674 static int
9675 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9676 {
9677 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9678 	struct crypto_unittest_params *ut_params = &unittest_params;
9679 
9680 	int retval;
9681 	uint8_t *plaintext;
9682 
9683 	/* Verify the capabilities */
9684 	struct rte_cryptodev_sym_capability_idx cap_idx;
9685 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9686 	cap_idx.algo.aead = tdata->algo;
9687 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9688 			&cap_idx) == NULL)
9689 		return -ENOTSUP;
9690 
9691 	/* not supported with CPU crypto and raw data-path APIs*/
9692 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9693 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
9694 		return -ENOTSUP;
9695 
9696 	/* Create AEAD session */
9697 	retval = create_aead_session(ts_params->valid_devs[0],
9698 			tdata->algo,
9699 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9700 			tdata->key.data, tdata->key.len,
9701 			tdata->aad.len, tdata->auth_tag.len,
9702 			tdata->iv.len);
9703 	if (retval < 0)
9704 		return retval;
9705 
9706 	/* alloc mbuf and set payload */
9707 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9708 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9709 
9710 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9711 			rte_pktmbuf_tailroom(ut_params->ibuf));
9712 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9713 			rte_pktmbuf_tailroom(ut_params->obuf));
9714 
9715 	/* Create AEAD operation */
9716 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9717 	if (retval < 0)
9718 		return retval;
9719 
9720 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9721 
9722 	ut_params->op->sym->m_src = ut_params->ibuf;
9723 	ut_params->op->sym->m_dst = ut_params->obuf;
9724 
9725 	/* Process crypto operation */
9726 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9727 			ut_params->op), "failed to process sym crypto op");
9728 
9729 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9730 			"crypto op processing failed");
9731 
9732 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9733 			ut_params->op->sym->cipher.data.offset);
9734 
9735 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9736 
9737 	/* Validate obuf */
9738 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9739 			plaintext,
9740 			tdata->plaintext.data,
9741 			tdata->plaintext.len,
9742 			"Plaintext data not as expected");
9743 
9744 	TEST_ASSERT_EQUAL(ut_params->op->status,
9745 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9746 			"Authentication failed");
9747 	return 0;
9748 }
9749 
9750 static int
9751 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9752 {
9753 	return test_authenticated_decryption_oop(&gcm_test_case_5);
9754 }
9755 
9756 static int
9757 test_authenticated_encryption_sessionless(
9758 		const struct aead_test_data *tdata)
9759 {
9760 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9761 	struct crypto_unittest_params *ut_params = &unittest_params;
9762 
9763 	int retval;
9764 	uint8_t *ciphertext, *auth_tag;
9765 	uint16_t plaintext_pad_len;
9766 	uint8_t key[tdata->key.len + 1];
9767 	struct rte_cryptodev_info dev_info;
9768 
9769 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9770 	uint64_t feat_flags = dev_info.feature_flags;
9771 
9772 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9773 		printf("Device doesn't support Sessionless ops.\n");
9774 		return -ENOTSUP;
9775 	}
9776 
9777 	/* not supported with CPU crypto */
9778 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9779 		return -ENOTSUP;
9780 
9781 	/* Verify the capabilities */
9782 	struct rte_cryptodev_sym_capability_idx cap_idx;
9783 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9784 	cap_idx.algo.aead = tdata->algo;
9785 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9786 			&cap_idx) == NULL)
9787 		return -ENOTSUP;
9788 
9789 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9790 
9791 	/* clear mbuf payload */
9792 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9793 			rte_pktmbuf_tailroom(ut_params->ibuf));
9794 
9795 	/* Create AEAD operation */
9796 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9797 	if (retval < 0)
9798 		return retval;
9799 
9800 	/* Create GCM xform */
9801 	memcpy(key, tdata->key.data, tdata->key.len);
9802 	retval = create_aead_xform(ut_params->op,
9803 			tdata->algo,
9804 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9805 			key, tdata->key.len,
9806 			tdata->aad.len, tdata->auth_tag.len,
9807 			tdata->iv.len);
9808 	if (retval < 0)
9809 		return retval;
9810 
9811 	ut_params->op->sym->m_src = ut_params->ibuf;
9812 
9813 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9814 			RTE_CRYPTO_OP_SESSIONLESS,
9815 			"crypto op session type not sessionless");
9816 
9817 	/* Process crypto operation */
9818 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9819 			ut_params->op), "failed to process sym crypto op");
9820 
9821 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9822 
9823 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9824 			"crypto op status not success");
9825 
9826 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9827 
9828 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9829 			ut_params->op->sym->cipher.data.offset);
9830 	auth_tag = ciphertext + plaintext_pad_len;
9831 
9832 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9833 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9834 
9835 	/* Validate obuf */
9836 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9837 			ciphertext,
9838 			tdata->ciphertext.data,
9839 			tdata->ciphertext.len,
9840 			"Ciphertext data not as expected");
9841 
9842 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9843 			auth_tag,
9844 			tdata->auth_tag.data,
9845 			tdata->auth_tag.len,
9846 			"Generated auth tag not as expected");
9847 
9848 	return 0;
9849 
9850 }
9851 
9852 static int
9853 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9854 {
9855 	return test_authenticated_encryption_sessionless(
9856 			&gcm_test_case_5);
9857 }
9858 
9859 static int
9860 test_authenticated_decryption_sessionless(
9861 		const struct aead_test_data *tdata)
9862 {
9863 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9864 	struct crypto_unittest_params *ut_params = &unittest_params;
9865 
9866 	int retval;
9867 	uint8_t *plaintext;
9868 	uint8_t key[tdata->key.len + 1];
9869 	struct rte_cryptodev_info dev_info;
9870 
9871 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9872 	uint64_t feat_flags = dev_info.feature_flags;
9873 
9874 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9875 		printf("Device doesn't support Sessionless ops.\n");
9876 		return -ENOTSUP;
9877 	}
9878 
9879 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9880 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9881 		printf("Device doesn't support RAW data-path APIs.\n");
9882 		return -ENOTSUP;
9883 	}
9884 
9885 	/* not supported with CPU crypto */
9886 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9887 		return -ENOTSUP;
9888 
9889 	/* Verify the capabilities */
9890 	struct rte_cryptodev_sym_capability_idx cap_idx;
9891 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9892 	cap_idx.algo.aead = tdata->algo;
9893 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9894 			&cap_idx) == NULL)
9895 		return -ENOTSUP;
9896 
9897 	/* alloc mbuf and set payload */
9898 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9899 
9900 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9901 			rte_pktmbuf_tailroom(ut_params->ibuf));
9902 
9903 	/* Create AEAD operation */
9904 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9905 	if (retval < 0)
9906 		return retval;
9907 
9908 	/* Create AEAD xform */
9909 	memcpy(key, tdata->key.data, tdata->key.len);
9910 	retval = create_aead_xform(ut_params->op,
9911 			tdata->algo,
9912 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9913 			key, tdata->key.len,
9914 			tdata->aad.len, tdata->auth_tag.len,
9915 			tdata->iv.len);
9916 	if (retval < 0)
9917 		return retval;
9918 
9919 	ut_params->op->sym->m_src = ut_params->ibuf;
9920 
9921 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9922 			RTE_CRYPTO_OP_SESSIONLESS,
9923 			"crypto op session type not sessionless");
9924 
9925 	/* Process crypto operation */
9926 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9927 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9928 				ut_params->op, 0, 0, 0, 0);
9929 	else
9930 		TEST_ASSERT_NOT_NULL(process_crypto_request(
9931 			ts_params->valid_devs[0], ut_params->op),
9932 				"failed to process sym crypto op");
9933 
9934 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9935 
9936 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9937 			"crypto op status not success");
9938 
9939 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9940 			ut_params->op->sym->cipher.data.offset);
9941 
9942 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9943 
9944 	/* Validate obuf */
9945 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9946 			plaintext,
9947 			tdata->plaintext.data,
9948 			tdata->plaintext.len,
9949 			"Plaintext data not as expected");
9950 
9951 	TEST_ASSERT_EQUAL(ut_params->op->status,
9952 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9953 			"Authentication failed");
9954 	return 0;
9955 }
9956 
9957 static int
9958 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9959 {
9960 	return test_authenticated_decryption_sessionless(
9961 			&gcm_test_case_5);
9962 }
9963 
9964 static int
9965 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9966 {
9967 	return test_authenticated_encryption(&ccm_test_case_128_1);
9968 }
9969 
9970 static int
9971 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9972 {
9973 	return test_authenticated_encryption(&ccm_test_case_128_2);
9974 }
9975 
9976 static int
9977 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9978 {
9979 	return test_authenticated_encryption(&ccm_test_case_128_3);
9980 }
9981 
9982 static int
9983 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9984 {
9985 	return test_authenticated_decryption(&ccm_test_case_128_1);
9986 }
9987 
9988 static int
9989 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9990 {
9991 	return test_authenticated_decryption(&ccm_test_case_128_2);
9992 }
9993 
9994 static int
9995 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
9996 {
9997 	return test_authenticated_decryption(&ccm_test_case_128_3);
9998 }
9999 
10000 static int
10001 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10002 {
10003 	return test_authenticated_encryption(&ccm_test_case_192_1);
10004 }
10005 
10006 static int
10007 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10008 {
10009 	return test_authenticated_encryption(&ccm_test_case_192_2);
10010 }
10011 
10012 static int
10013 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10014 {
10015 	return test_authenticated_encryption(&ccm_test_case_192_3);
10016 }
10017 
10018 static int
10019 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10020 {
10021 	return test_authenticated_decryption(&ccm_test_case_192_1);
10022 }
10023 
10024 static int
10025 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10026 {
10027 	return test_authenticated_decryption(&ccm_test_case_192_2);
10028 }
10029 
10030 static int
10031 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10032 {
10033 	return test_authenticated_decryption(&ccm_test_case_192_3);
10034 }
10035 
10036 static int
10037 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10038 {
10039 	return test_authenticated_encryption(&ccm_test_case_256_1);
10040 }
10041 
10042 static int
10043 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10044 {
10045 	return test_authenticated_encryption(&ccm_test_case_256_2);
10046 }
10047 
10048 static int
10049 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10050 {
10051 	return test_authenticated_encryption(&ccm_test_case_256_3);
10052 }
10053 
10054 static int
10055 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10056 {
10057 	return test_authenticated_decryption(&ccm_test_case_256_1);
10058 }
10059 
10060 static int
10061 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10062 {
10063 	return test_authenticated_decryption(&ccm_test_case_256_2);
10064 }
10065 
10066 static int
10067 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10068 {
10069 	return test_authenticated_decryption(&ccm_test_case_256_3);
10070 }
10071 
10072 static int
10073 test_stats(void)
10074 {
10075 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10076 	struct rte_cryptodev_stats stats;
10077 
10078 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10079 		return -ENOTSUP;
10080 
10081 	/* Verify the capabilities */
10082 	struct rte_cryptodev_sym_capability_idx cap_idx;
10083 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10084 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10085 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10086 			&cap_idx) == NULL)
10087 		return -ENOTSUP;
10088 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10089 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10090 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10091 			&cap_idx) == NULL)
10092 		return -ENOTSUP;
10093 
10094 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10095 			== -ENOTSUP)
10096 		return -ENOTSUP;
10097 
10098 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10099 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10100 			&stats) == -ENODEV),
10101 		"rte_cryptodev_stats_get invalid dev failed");
10102 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10103 		"rte_cryptodev_stats_get invalid Param failed");
10104 
10105 	/* Test expected values */
10106 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10107 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10108 			&stats),
10109 		"rte_cryptodev_stats_get failed");
10110 	TEST_ASSERT((stats.enqueued_count == 1),
10111 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10112 	TEST_ASSERT((stats.dequeued_count == 1),
10113 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10114 	TEST_ASSERT((stats.enqueue_err_count == 0),
10115 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10116 	TEST_ASSERT((stats.dequeue_err_count == 0),
10117 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10118 
10119 	/* invalid device but should ignore and not reset device stats*/
10120 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10121 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10122 			&stats),
10123 		"rte_cryptodev_stats_get failed");
10124 	TEST_ASSERT((stats.enqueued_count == 1),
10125 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10126 
10127 	/* check that a valid reset clears stats */
10128 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10129 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10130 			&stats),
10131 					  "rte_cryptodev_stats_get failed");
10132 	TEST_ASSERT((stats.enqueued_count == 0),
10133 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10134 	TEST_ASSERT((stats.dequeued_count == 0),
10135 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10136 
10137 	return TEST_SUCCESS;
10138 }
10139 
10140 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10141 				   struct crypto_unittest_params *ut_params,
10142 				   enum rte_crypto_auth_operation op,
10143 				   const struct HMAC_MD5_vector *test_case)
10144 {
10145 	uint8_t key[64];
10146 
10147 	memcpy(key, test_case->key.data, test_case->key.len);
10148 
10149 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10150 	ut_params->auth_xform.next = NULL;
10151 	ut_params->auth_xform.auth.op = op;
10152 
10153 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10154 
10155 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10156 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10157 	ut_params->auth_xform.auth.key.data = key;
10158 
10159 	ut_params->sess = rte_cryptodev_sym_session_create(
10160 			ts_params->session_mpool);
10161 
10162 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10163 			ut_params->sess, &ut_params->auth_xform,
10164 			ts_params->session_priv_mpool);
10165 
10166 	if (ut_params->sess == NULL)
10167 		return TEST_FAILED;
10168 
10169 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10170 
10171 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10172 			rte_pktmbuf_tailroom(ut_params->ibuf));
10173 
10174 	return 0;
10175 }
10176 
10177 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10178 			      const struct HMAC_MD5_vector *test_case,
10179 			      uint8_t **plaintext)
10180 {
10181 	uint16_t plaintext_pad_len;
10182 
10183 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10184 
10185 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10186 				16);
10187 
10188 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10189 			plaintext_pad_len);
10190 	memcpy(*plaintext, test_case->plaintext.data,
10191 			test_case->plaintext.len);
10192 
10193 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10194 			ut_params->ibuf, MD5_DIGEST_LEN);
10195 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10196 			"no room to append digest");
10197 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10198 			ut_params->ibuf, plaintext_pad_len);
10199 
10200 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10201 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10202 			   test_case->auth_tag.len);
10203 	}
10204 
10205 	sym_op->auth.data.offset = 0;
10206 	sym_op->auth.data.length = test_case->plaintext.len;
10207 
10208 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10209 	ut_params->op->sym->m_src = ut_params->ibuf;
10210 
10211 	return 0;
10212 }
10213 
10214 static int
10215 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10216 {
10217 	uint16_t plaintext_pad_len;
10218 	uint8_t *plaintext, *auth_tag;
10219 
10220 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10221 	struct crypto_unittest_params *ut_params = &unittest_params;
10222 	struct rte_cryptodev_info dev_info;
10223 
10224 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10225 	uint64_t feat_flags = dev_info.feature_flags;
10226 
10227 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10228 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10229 		printf("Device doesn't support RAW data-path APIs.\n");
10230 		return -ENOTSUP;
10231 	}
10232 
10233 	/* Verify the capabilities */
10234 	struct rte_cryptodev_sym_capability_idx cap_idx;
10235 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10236 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10237 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10238 			&cap_idx) == NULL)
10239 		return -ENOTSUP;
10240 
10241 	if (MD5_HMAC_create_session(ts_params, ut_params,
10242 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10243 		return TEST_FAILED;
10244 
10245 	/* Generate Crypto op data structure */
10246 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10247 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10248 	TEST_ASSERT_NOT_NULL(ut_params->op,
10249 			"Failed to allocate symmetric crypto operation struct");
10250 
10251 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10252 				16);
10253 
10254 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10255 		return TEST_FAILED;
10256 
10257 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10258 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10259 			ut_params->op);
10260 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10261 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10262 				ut_params->op, 0, 1, 0, 0);
10263 	else
10264 		TEST_ASSERT_NOT_NULL(
10265 			process_crypto_request(ts_params->valid_devs[0],
10266 				ut_params->op),
10267 				"failed to process sym crypto op");
10268 
10269 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10270 			"crypto op processing failed");
10271 
10272 	if (ut_params->op->sym->m_dst) {
10273 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10274 				uint8_t *, plaintext_pad_len);
10275 	} else {
10276 		auth_tag = plaintext + plaintext_pad_len;
10277 	}
10278 
10279 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10280 			auth_tag,
10281 			test_case->auth_tag.data,
10282 			test_case->auth_tag.len,
10283 			"HMAC_MD5 generated tag not as expected");
10284 
10285 	return TEST_SUCCESS;
10286 }
10287 
10288 static int
10289 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10290 {
10291 	uint8_t *plaintext;
10292 
10293 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10294 	struct crypto_unittest_params *ut_params = &unittest_params;
10295 	struct rte_cryptodev_info dev_info;
10296 
10297 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10298 	uint64_t feat_flags = dev_info.feature_flags;
10299 
10300 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10301 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10302 		printf("Device doesn't support RAW data-path APIs.\n");
10303 		return -ENOTSUP;
10304 	}
10305 
10306 	/* Verify the capabilities */
10307 	struct rte_cryptodev_sym_capability_idx cap_idx;
10308 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10309 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10310 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10311 			&cap_idx) == NULL)
10312 		return -ENOTSUP;
10313 
10314 	if (MD5_HMAC_create_session(ts_params, ut_params,
10315 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10316 		return TEST_FAILED;
10317 	}
10318 
10319 	/* Generate Crypto op data structure */
10320 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10321 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10322 	TEST_ASSERT_NOT_NULL(ut_params->op,
10323 			"Failed to allocate symmetric crypto operation struct");
10324 
10325 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10326 		return TEST_FAILED;
10327 
10328 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10329 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10330 			ut_params->op);
10331 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10332 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10333 				ut_params->op, 0, 1, 0, 0);
10334 	else
10335 		TEST_ASSERT_NOT_NULL(
10336 			process_crypto_request(ts_params->valid_devs[0],
10337 				ut_params->op),
10338 				"failed to process sym crypto op");
10339 
10340 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10341 			"HMAC_MD5 crypto op processing failed");
10342 
10343 	return TEST_SUCCESS;
10344 }
10345 
10346 static int
10347 test_MD5_HMAC_generate_case_1(void)
10348 {
10349 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10350 }
10351 
10352 static int
10353 test_MD5_HMAC_verify_case_1(void)
10354 {
10355 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10356 }
10357 
10358 static int
10359 test_MD5_HMAC_generate_case_2(void)
10360 {
10361 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10362 }
10363 
10364 static int
10365 test_MD5_HMAC_verify_case_2(void)
10366 {
10367 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10368 }
10369 
10370 static int
10371 test_multi_session(void)
10372 {
10373 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10374 	struct crypto_unittest_params *ut_params = &unittest_params;
10375 
10376 	struct rte_cryptodev_info dev_info;
10377 	struct rte_cryptodev_sym_session **sessions;
10378 
10379 	uint16_t i;
10380 
10381 	/* Verify the capabilities */
10382 	struct rte_cryptodev_sym_capability_idx cap_idx;
10383 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10384 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10385 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10386 			&cap_idx) == NULL)
10387 		return -ENOTSUP;
10388 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10389 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10390 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10391 			&cap_idx) == NULL)
10392 		return -ENOTSUP;
10393 
10394 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10395 			aes_cbc_key, hmac_sha512_key);
10396 
10397 
10398 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10399 
10400 	sessions = rte_malloc(NULL,
10401 			(sizeof(struct rte_cryptodev_sym_session *) *
10402 			MAX_NB_SESSIONS) + 1, 0);
10403 
10404 	/* Create multiple crypto sessions*/
10405 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10406 
10407 		sessions[i] = rte_cryptodev_sym_session_create(
10408 				ts_params->session_mpool);
10409 
10410 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10411 				sessions[i], &ut_params->auth_xform,
10412 				ts_params->session_priv_mpool);
10413 		TEST_ASSERT_NOT_NULL(sessions[i],
10414 				"Session creation failed at session number %u",
10415 				i);
10416 
10417 		/* Attempt to send a request on each session */
10418 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10419 			sessions[i],
10420 			ut_params,
10421 			ts_params,
10422 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10423 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10424 			aes_cbc_iv),
10425 			"Failed to perform decrypt on request number %u.", i);
10426 		/* free crypto operation structure */
10427 		if (ut_params->op)
10428 			rte_crypto_op_free(ut_params->op);
10429 
10430 		/*
10431 		 * free mbuf - both obuf and ibuf are usually the same,
10432 		 * so check if they point at the same address is necessary,
10433 		 * to avoid freeing the mbuf twice.
10434 		 */
10435 		if (ut_params->obuf) {
10436 			rte_pktmbuf_free(ut_params->obuf);
10437 			if (ut_params->ibuf == ut_params->obuf)
10438 				ut_params->ibuf = 0;
10439 			ut_params->obuf = 0;
10440 		}
10441 		if (ut_params->ibuf) {
10442 			rte_pktmbuf_free(ut_params->ibuf);
10443 			ut_params->ibuf = 0;
10444 		}
10445 	}
10446 
10447 	/* Next session create should fail */
10448 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10449 			sessions[i], &ut_params->auth_xform,
10450 			ts_params->session_priv_mpool);
10451 	TEST_ASSERT_NULL(sessions[i],
10452 			"Session creation succeeded unexpectedly!");
10453 
10454 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10455 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10456 				sessions[i]);
10457 		rte_cryptodev_sym_session_free(sessions[i]);
10458 	}
10459 
10460 	rte_free(sessions);
10461 
10462 	return TEST_SUCCESS;
10463 }
10464 
10465 struct multi_session_params {
10466 	struct crypto_unittest_params ut_params;
10467 	uint8_t *cipher_key;
10468 	uint8_t *hmac_key;
10469 	const uint8_t *cipher;
10470 	const uint8_t *digest;
10471 	uint8_t *iv;
10472 };
10473 
10474 #define MB_SESSION_NUMBER 3
10475 
10476 static int
10477 test_multi_session_random_usage(void)
10478 {
10479 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10480 	struct rte_cryptodev_info dev_info;
10481 	struct rte_cryptodev_sym_session **sessions;
10482 	uint32_t i, j;
10483 	struct multi_session_params ut_paramz[] = {
10484 
10485 		{
10486 			.cipher_key = ms_aes_cbc_key0,
10487 			.hmac_key = ms_hmac_key0,
10488 			.cipher = ms_aes_cbc_cipher0,
10489 			.digest = ms_hmac_digest0,
10490 			.iv = ms_aes_cbc_iv0
10491 		},
10492 		{
10493 			.cipher_key = ms_aes_cbc_key1,
10494 			.hmac_key = ms_hmac_key1,
10495 			.cipher = ms_aes_cbc_cipher1,
10496 			.digest = ms_hmac_digest1,
10497 			.iv = ms_aes_cbc_iv1
10498 		},
10499 		{
10500 			.cipher_key = ms_aes_cbc_key2,
10501 			.hmac_key = ms_hmac_key2,
10502 			.cipher = ms_aes_cbc_cipher2,
10503 			.digest = ms_hmac_digest2,
10504 			.iv = ms_aes_cbc_iv2
10505 		},
10506 
10507 	};
10508 
10509 	/* Verify the capabilities */
10510 	struct rte_cryptodev_sym_capability_idx cap_idx;
10511 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10512 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10513 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10514 			&cap_idx) == NULL)
10515 		return -ENOTSUP;
10516 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10517 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10518 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10519 			&cap_idx) == NULL)
10520 		return -ENOTSUP;
10521 
10522 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10523 
10524 	sessions = rte_malloc(NULL,
10525 			(sizeof(struct rte_cryptodev_sym_session *)
10526 					* MAX_NB_SESSIONS) + 1, 0);
10527 
10528 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10529 		sessions[i] = rte_cryptodev_sym_session_create(
10530 				ts_params->session_mpool);
10531 
10532 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10533 				sizeof(struct crypto_unittest_params));
10534 
10535 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10536 				&ut_paramz[i].ut_params,
10537 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10538 
10539 		/* Create multiple crypto sessions*/
10540 		rte_cryptodev_sym_session_init(
10541 				ts_params->valid_devs[0],
10542 				sessions[i],
10543 				&ut_paramz[i].ut_params.auth_xform,
10544 				ts_params->session_priv_mpool);
10545 
10546 		TEST_ASSERT_NOT_NULL(sessions[i],
10547 				"Session creation failed at session number %u",
10548 				i);
10549 
10550 	}
10551 
10552 	srand(time(NULL));
10553 	for (i = 0; i < 40000; i++) {
10554 
10555 		j = rand() % MB_SESSION_NUMBER;
10556 
10557 		TEST_ASSERT_SUCCESS(
10558 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
10559 					sessions[j],
10560 					&ut_paramz[j].ut_params,
10561 					ts_params, ut_paramz[j].cipher,
10562 					ut_paramz[j].digest,
10563 					ut_paramz[j].iv),
10564 			"Failed to perform decrypt on request number %u.", i);
10565 
10566 		if (ut_paramz[j].ut_params.op)
10567 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
10568 
10569 		/*
10570 		 * free mbuf - both obuf and ibuf are usually the same,
10571 		 * so check if they point at the same address is necessary,
10572 		 * to avoid freeing the mbuf twice.
10573 		 */
10574 		if (ut_paramz[j].ut_params.obuf) {
10575 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10576 			if (ut_paramz[j].ut_params.ibuf
10577 					== ut_paramz[j].ut_params.obuf)
10578 				ut_paramz[j].ut_params.ibuf = 0;
10579 			ut_paramz[j].ut_params.obuf = 0;
10580 		}
10581 		if (ut_paramz[j].ut_params.ibuf) {
10582 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10583 			ut_paramz[j].ut_params.ibuf = 0;
10584 		}
10585 	}
10586 
10587 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10588 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10589 				sessions[i]);
10590 		rte_cryptodev_sym_session_free(sessions[i]);
10591 	}
10592 
10593 	rte_free(sessions);
10594 
10595 	return TEST_SUCCESS;
10596 }
10597 
10598 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10599 			0xab, 0xab, 0xab, 0xab,
10600 			0xab, 0xab, 0xab, 0xab,
10601 			0xab, 0xab, 0xab, 0xab};
10602 
10603 static int
10604 test_null_invalid_operation(void)
10605 {
10606 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10607 	struct crypto_unittest_params *ut_params = &unittest_params;
10608 	int ret;
10609 
10610 	/* This test is for NULL PMD only */
10611 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10612 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10613 		return -ENOTSUP;
10614 
10615 	/* Setup Cipher Parameters */
10616 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10617 	ut_params->cipher_xform.next = NULL;
10618 
10619 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10620 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10621 
10622 	ut_params->sess = rte_cryptodev_sym_session_create(
10623 			ts_params->session_mpool);
10624 
10625 	/* Create Crypto session*/
10626 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10627 			ut_params->sess, &ut_params->cipher_xform,
10628 			ts_params->session_priv_mpool);
10629 	TEST_ASSERT(ret < 0,
10630 			"Session creation succeeded unexpectedly");
10631 
10632 
10633 	/* Setup HMAC Parameters */
10634 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10635 	ut_params->auth_xform.next = NULL;
10636 
10637 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10638 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10639 
10640 	ut_params->sess = rte_cryptodev_sym_session_create(
10641 			ts_params->session_mpool);
10642 
10643 	/* Create Crypto session*/
10644 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10645 			ut_params->sess, &ut_params->auth_xform,
10646 			ts_params->session_priv_mpool);
10647 	TEST_ASSERT(ret < 0,
10648 			"Session creation succeeded unexpectedly");
10649 
10650 	return TEST_SUCCESS;
10651 }
10652 
10653 
10654 #define NULL_BURST_LENGTH (32)
10655 
10656 static int
10657 test_null_burst_operation(void)
10658 {
10659 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10660 	struct crypto_unittest_params *ut_params = &unittest_params;
10661 
10662 	unsigned i, burst_len = NULL_BURST_LENGTH;
10663 
10664 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10665 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10666 
10667 	/* This test is for NULL PMD only */
10668 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10669 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10670 		return -ENOTSUP;
10671 
10672 	/* Setup Cipher Parameters */
10673 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10674 	ut_params->cipher_xform.next = &ut_params->auth_xform;
10675 
10676 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10677 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10678 
10679 	/* Setup HMAC Parameters */
10680 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10681 	ut_params->auth_xform.next = NULL;
10682 
10683 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10684 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10685 
10686 	ut_params->sess = rte_cryptodev_sym_session_create(
10687 			ts_params->session_mpool);
10688 
10689 	/* Create Crypto session*/
10690 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10691 			ut_params->sess, &ut_params->cipher_xform,
10692 			ts_params->session_priv_mpool);
10693 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10694 
10695 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10696 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10697 			burst_len, "failed to generate burst of crypto ops");
10698 
10699 	/* Generate an operation for each mbuf in burst */
10700 	for (i = 0; i < burst_len; i++) {
10701 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10702 
10703 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10704 
10705 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10706 				sizeof(unsigned));
10707 		*data = i;
10708 
10709 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10710 
10711 		burst[i]->sym->m_src = m;
10712 	}
10713 
10714 	/* Process crypto operation */
10715 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10716 			0, burst, burst_len),
10717 			burst_len,
10718 			"Error enqueuing burst");
10719 
10720 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10721 			0, burst_dequeued, burst_len),
10722 			burst_len,
10723 			"Error dequeuing burst");
10724 
10725 
10726 	for (i = 0; i < burst_len; i++) {
10727 		TEST_ASSERT_EQUAL(
10728 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10729 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10730 					uint32_t *),
10731 			"data not as expected");
10732 
10733 		rte_pktmbuf_free(burst[i]->sym->m_src);
10734 		rte_crypto_op_free(burst[i]);
10735 	}
10736 
10737 	return TEST_SUCCESS;
10738 }
10739 
10740 static uint16_t
10741 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10742 		  uint16_t nb_ops, void *user_param)
10743 {
10744 	RTE_SET_USED(dev_id);
10745 	RTE_SET_USED(qp_id);
10746 	RTE_SET_USED(ops);
10747 	RTE_SET_USED(user_param);
10748 
10749 	printf("crypto enqueue callback called\n");
10750 	return nb_ops;
10751 }
10752 
10753 static uint16_t
10754 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10755 		  uint16_t nb_ops, void *user_param)
10756 {
10757 	RTE_SET_USED(dev_id);
10758 	RTE_SET_USED(qp_id);
10759 	RTE_SET_USED(ops);
10760 	RTE_SET_USED(user_param);
10761 
10762 	printf("crypto dequeue callback called\n");
10763 	return nb_ops;
10764 }
10765 
10766 /*
10767  * Thread using enqueue/dequeue callback with RCU.
10768  */
10769 static int
10770 test_enqdeq_callback_thread(void *arg)
10771 {
10772 	RTE_SET_USED(arg);
10773 	/* DP thread calls rte_cryptodev_enqueue_burst()/
10774 	 * rte_cryptodev_dequeue_burst() and invokes callback.
10775 	 */
10776 	test_null_burst_operation();
10777 	return 0;
10778 }
10779 
10780 static int
10781 test_enq_callback_setup(void)
10782 {
10783 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10784 	struct rte_cryptodev_info dev_info;
10785 	struct rte_cryptodev_qp_conf qp_conf = {
10786 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
10787 	};
10788 
10789 	struct rte_cryptodev_cb *cb;
10790 	uint16_t qp_id = 0;
10791 
10792 	/* Stop the device in case it's started so it can be configured */
10793 	rte_cryptodev_stop(ts_params->valid_devs[0]);
10794 
10795 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10796 
10797 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10798 			&ts_params->conf),
10799 			"Failed to configure cryptodev %u",
10800 			ts_params->valid_devs[0]);
10801 
10802 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10803 	qp_conf.mp_session = ts_params->session_mpool;
10804 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
10805 
10806 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10807 			ts_params->valid_devs[0], qp_id, &qp_conf,
10808 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10809 			"Failed test for "
10810 			"rte_cryptodev_queue_pair_setup: num_inflights "
10811 			"%u on qp %u on cryptodev %u",
10812 			qp_conf.nb_descriptors, qp_id,
10813 			ts_params->valid_devs[0]);
10814 
10815 	/* Test with invalid crypto device */
10816 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
10817 			qp_id, test_enq_callback, NULL);
10818 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10819 			"cryptodev %u did not fail",
10820 			qp_id, RTE_CRYPTO_MAX_DEVS);
10821 
10822 	/* Test with invalid queue pair */
10823 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10824 			dev_info.max_nb_queue_pairs + 1,
10825 			test_enq_callback, NULL);
10826 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10827 			"cryptodev %u did not fail",
10828 			dev_info.max_nb_queue_pairs + 1,
10829 			ts_params->valid_devs[0]);
10830 
10831 	/* Test with NULL callback */
10832 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10833 			qp_id, NULL, NULL);
10834 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10835 			"cryptodev %u did not fail",
10836 			qp_id, ts_params->valid_devs[0]);
10837 
10838 	/* Test with valid configuration */
10839 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10840 			qp_id, test_enq_callback, NULL);
10841 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10842 			"qp %u on cryptodev %u",
10843 			qp_id, ts_params->valid_devs[0]);
10844 
10845 	rte_cryptodev_start(ts_params->valid_devs[0]);
10846 
10847 	/* Launch a thread */
10848 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10849 				rte_get_next_lcore(-1, 1, 0));
10850 
10851 	/* Wait until reader exited. */
10852 	rte_eal_mp_wait_lcore();
10853 
10854 	/* Test with invalid crypto device */
10855 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10856 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10857 			"Expected call to fail as crypto device is invalid");
10858 
10859 	/* Test with invalid queue pair */
10860 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10861 			ts_params->valid_devs[0],
10862 			dev_info.max_nb_queue_pairs + 1, cb),
10863 			"Expected call to fail as queue pair is invalid");
10864 
10865 	/* Test with NULL callback */
10866 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10867 			ts_params->valid_devs[0], qp_id, NULL),
10868 			"Expected call to fail as callback is NULL");
10869 
10870 	/* Test with valid configuration */
10871 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
10872 			ts_params->valid_devs[0], qp_id, cb),
10873 			"Failed test to remove callback on "
10874 			"qp %u on cryptodev %u",
10875 			qp_id, ts_params->valid_devs[0]);
10876 
10877 	return TEST_SUCCESS;
10878 }
10879 
10880 static int
10881 test_deq_callback_setup(void)
10882 {
10883 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10884 	struct rte_cryptodev_info dev_info;
10885 	struct rte_cryptodev_qp_conf qp_conf = {
10886 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
10887 	};
10888 
10889 	struct rte_cryptodev_cb *cb;
10890 	uint16_t qp_id = 0;
10891 
10892 	/* Stop the device in case it's started so it can be configured */
10893 	rte_cryptodev_stop(ts_params->valid_devs[0]);
10894 
10895 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10896 
10897 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10898 			&ts_params->conf),
10899 			"Failed to configure cryptodev %u",
10900 			ts_params->valid_devs[0]);
10901 
10902 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10903 	qp_conf.mp_session = ts_params->session_mpool;
10904 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
10905 
10906 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10907 			ts_params->valid_devs[0], qp_id, &qp_conf,
10908 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10909 			"Failed test for "
10910 			"rte_cryptodev_queue_pair_setup: num_inflights "
10911 			"%u on qp %u on cryptodev %u",
10912 			qp_conf.nb_descriptors, qp_id,
10913 			ts_params->valid_devs[0]);
10914 
10915 	/* Test with invalid crypto device */
10916 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
10917 			qp_id, test_deq_callback, NULL);
10918 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10919 			"cryptodev %u did not fail",
10920 			qp_id, RTE_CRYPTO_MAX_DEVS);
10921 
10922 	/* Test with invalid queue pair */
10923 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10924 			dev_info.max_nb_queue_pairs + 1,
10925 			test_deq_callback, NULL);
10926 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10927 			"cryptodev %u did not fail",
10928 			dev_info.max_nb_queue_pairs + 1,
10929 			ts_params->valid_devs[0]);
10930 
10931 	/* Test with NULL callback */
10932 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10933 			qp_id, NULL, NULL);
10934 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10935 			"cryptodev %u did not fail",
10936 			qp_id, ts_params->valid_devs[0]);
10937 
10938 	/* Test with valid configuration */
10939 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10940 			qp_id, test_deq_callback, NULL);
10941 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10942 			"qp %u on cryptodev %u",
10943 			qp_id, ts_params->valid_devs[0]);
10944 
10945 	rte_cryptodev_start(ts_params->valid_devs[0]);
10946 
10947 	/* Launch a thread */
10948 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10949 				rte_get_next_lcore(-1, 1, 0));
10950 
10951 	/* Wait until reader exited. */
10952 	rte_eal_mp_wait_lcore();
10953 
10954 	/* Test with invalid crypto device */
10955 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10956 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10957 			"Expected call to fail as crypto device is invalid");
10958 
10959 	/* Test with invalid queue pair */
10960 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10961 			ts_params->valid_devs[0],
10962 			dev_info.max_nb_queue_pairs + 1, cb),
10963 			"Expected call to fail as queue pair is invalid");
10964 
10965 	/* Test with NULL callback */
10966 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10967 			ts_params->valid_devs[0], qp_id, NULL),
10968 			"Expected call to fail as callback is NULL");
10969 
10970 	/* Test with valid configuration */
10971 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
10972 			ts_params->valid_devs[0], qp_id, cb),
10973 			"Failed test to remove callback on "
10974 			"qp %u on cryptodev %u",
10975 			qp_id, ts_params->valid_devs[0]);
10976 
10977 	return TEST_SUCCESS;
10978 }
10979 
10980 static void
10981 generate_gmac_large_plaintext(uint8_t *data)
10982 {
10983 	uint16_t i;
10984 
10985 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10986 		memcpy(&data[i], &data[0], 32);
10987 }
10988 
10989 static int
10990 create_gmac_operation(enum rte_crypto_auth_operation op,
10991 		const struct gmac_test_data *tdata)
10992 {
10993 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10994 	struct crypto_unittest_params *ut_params = &unittest_params;
10995 	struct rte_crypto_sym_op *sym_op;
10996 
10997 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10998 
10999 	/* Generate Crypto op data structure */
11000 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11001 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11002 	TEST_ASSERT_NOT_NULL(ut_params->op,
11003 			"Failed to allocate symmetric crypto operation struct");
11004 
11005 	sym_op = ut_params->op->sym;
11006 
11007 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11008 			ut_params->ibuf, tdata->gmac_tag.len);
11009 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11010 			"no room to append digest");
11011 
11012 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11013 			ut_params->ibuf, plaintext_pad_len);
11014 
11015 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11016 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11017 				tdata->gmac_tag.len);
11018 		debug_hexdump(stdout, "digest:",
11019 				sym_op->auth.digest.data,
11020 				tdata->gmac_tag.len);
11021 	}
11022 
11023 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11024 			uint8_t *, IV_OFFSET);
11025 
11026 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11027 
11028 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11029 
11030 	sym_op->cipher.data.length = 0;
11031 	sym_op->cipher.data.offset = 0;
11032 
11033 	sym_op->auth.data.offset = 0;
11034 	sym_op->auth.data.length = tdata->plaintext.len;
11035 
11036 	return 0;
11037 }
11038 
11039 static int
11040 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11041 		const struct gmac_test_data *tdata,
11042 		void *digest_mem, uint64_t digest_phys)
11043 {
11044 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11045 	struct crypto_unittest_params *ut_params = &unittest_params;
11046 	struct rte_crypto_sym_op *sym_op;
11047 
11048 	/* Generate Crypto op data structure */
11049 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11050 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11051 	TEST_ASSERT_NOT_NULL(ut_params->op,
11052 			"Failed to allocate symmetric crypto operation struct");
11053 
11054 	sym_op = ut_params->op->sym;
11055 
11056 	sym_op->auth.digest.data = digest_mem;
11057 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11058 			"no room to append digest");
11059 
11060 	sym_op->auth.digest.phys_addr = digest_phys;
11061 
11062 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11063 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11064 				tdata->gmac_tag.len);
11065 		debug_hexdump(stdout, "digest:",
11066 				sym_op->auth.digest.data,
11067 				tdata->gmac_tag.len);
11068 	}
11069 
11070 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11071 			uint8_t *, IV_OFFSET);
11072 
11073 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11074 
11075 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11076 
11077 	sym_op->cipher.data.length = 0;
11078 	sym_op->cipher.data.offset = 0;
11079 
11080 	sym_op->auth.data.offset = 0;
11081 	sym_op->auth.data.length = tdata->plaintext.len;
11082 
11083 	return 0;
11084 }
11085 
11086 static int create_gmac_session(uint8_t dev_id,
11087 		const struct gmac_test_data *tdata,
11088 		enum rte_crypto_auth_operation auth_op)
11089 {
11090 	uint8_t auth_key[tdata->key.len];
11091 
11092 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11093 	struct crypto_unittest_params *ut_params = &unittest_params;
11094 
11095 	memcpy(auth_key, tdata->key.data, tdata->key.len);
11096 
11097 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11098 	ut_params->auth_xform.next = NULL;
11099 
11100 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11101 	ut_params->auth_xform.auth.op = auth_op;
11102 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11103 	ut_params->auth_xform.auth.key.length = tdata->key.len;
11104 	ut_params->auth_xform.auth.key.data = auth_key;
11105 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11106 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11107 
11108 
11109 	ut_params->sess = rte_cryptodev_sym_session_create(
11110 			ts_params->session_mpool);
11111 
11112 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11113 			&ut_params->auth_xform,
11114 			ts_params->session_priv_mpool);
11115 
11116 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11117 
11118 	return 0;
11119 }
11120 
11121 static int
11122 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11123 {
11124 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11125 	struct crypto_unittest_params *ut_params = &unittest_params;
11126 	struct rte_cryptodev_info dev_info;
11127 
11128 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11129 	uint64_t feat_flags = dev_info.feature_flags;
11130 
11131 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11132 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11133 		printf("Device doesn't support RAW data-path APIs.\n");
11134 		return -ENOTSUP;
11135 	}
11136 
11137 	int retval;
11138 
11139 	uint8_t *auth_tag, *plaintext;
11140 	uint16_t plaintext_pad_len;
11141 
11142 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11143 			      "No GMAC length in the source data");
11144 
11145 	/* Verify the capabilities */
11146 	struct rte_cryptodev_sym_capability_idx cap_idx;
11147 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11148 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11149 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11150 			&cap_idx) == NULL)
11151 		return -ENOTSUP;
11152 
11153 	retval = create_gmac_session(ts_params->valid_devs[0],
11154 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11155 
11156 	if (retval < 0)
11157 		return retval;
11158 
11159 	if (tdata->plaintext.len > MBUF_SIZE)
11160 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11161 	else
11162 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11163 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11164 			"Failed to allocate input buffer in mempool");
11165 
11166 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11167 			rte_pktmbuf_tailroom(ut_params->ibuf));
11168 
11169 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11170 	/*
11171 	 * Runtime generate the large plain text instead of use hard code
11172 	 * plain text vector. It is done to avoid create huge source file
11173 	 * with the test vector.
11174 	 */
11175 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11176 		generate_gmac_large_plaintext(tdata->plaintext.data);
11177 
11178 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11179 				plaintext_pad_len);
11180 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11181 
11182 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11183 	debug_hexdump(stdout, "plaintext:", plaintext,
11184 			tdata->plaintext.len);
11185 
11186 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11187 			tdata);
11188 
11189 	if (retval < 0)
11190 		return retval;
11191 
11192 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11193 
11194 	ut_params->op->sym->m_src = ut_params->ibuf;
11195 
11196 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11197 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11198 			ut_params->op);
11199 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11200 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11201 				ut_params->op, 0, 1, 0, 0);
11202 	else
11203 		TEST_ASSERT_NOT_NULL(
11204 			process_crypto_request(ts_params->valid_devs[0],
11205 			ut_params->op), "failed to process sym crypto op");
11206 
11207 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11208 			"crypto op processing failed");
11209 
11210 	if (ut_params->op->sym->m_dst) {
11211 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11212 				uint8_t *, plaintext_pad_len);
11213 	} else {
11214 		auth_tag = plaintext + plaintext_pad_len;
11215 	}
11216 
11217 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11218 
11219 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11220 			auth_tag,
11221 			tdata->gmac_tag.data,
11222 			tdata->gmac_tag.len,
11223 			"GMAC Generated auth tag not as expected");
11224 
11225 	return 0;
11226 }
11227 
11228 static int
11229 test_AES_GMAC_authentication_test_case_1(void)
11230 {
11231 	return test_AES_GMAC_authentication(&gmac_test_case_1);
11232 }
11233 
11234 static int
11235 test_AES_GMAC_authentication_test_case_2(void)
11236 {
11237 	return test_AES_GMAC_authentication(&gmac_test_case_2);
11238 }
11239 
11240 static int
11241 test_AES_GMAC_authentication_test_case_3(void)
11242 {
11243 	return test_AES_GMAC_authentication(&gmac_test_case_3);
11244 }
11245 
11246 static int
11247 test_AES_GMAC_authentication_test_case_4(void)
11248 {
11249 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11250 }
11251 
11252 static int
11253 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11254 {
11255 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11256 	struct crypto_unittest_params *ut_params = &unittest_params;
11257 	int retval;
11258 	uint32_t plaintext_pad_len;
11259 	uint8_t *plaintext;
11260 	struct rte_cryptodev_info dev_info;
11261 
11262 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11263 	uint64_t feat_flags = dev_info.feature_flags;
11264 
11265 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11266 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11267 		printf("Device doesn't support RAW data-path APIs.\n");
11268 		return -ENOTSUP;
11269 	}
11270 
11271 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11272 			      "No GMAC length in the source data");
11273 
11274 	/* Verify the capabilities */
11275 	struct rte_cryptodev_sym_capability_idx cap_idx;
11276 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11277 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11278 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11279 			&cap_idx) == NULL)
11280 		return -ENOTSUP;
11281 
11282 	retval = create_gmac_session(ts_params->valid_devs[0],
11283 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11284 
11285 	if (retval < 0)
11286 		return retval;
11287 
11288 	if (tdata->plaintext.len > MBUF_SIZE)
11289 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11290 	else
11291 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11292 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11293 			"Failed to allocate input buffer in mempool");
11294 
11295 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11296 			rte_pktmbuf_tailroom(ut_params->ibuf));
11297 
11298 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11299 
11300 	/*
11301 	 * Runtime generate the large plain text instead of use hard code
11302 	 * plain text vector. It is done to avoid create huge source file
11303 	 * with the test vector.
11304 	 */
11305 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11306 		generate_gmac_large_plaintext(tdata->plaintext.data);
11307 
11308 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11309 				plaintext_pad_len);
11310 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11311 
11312 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11313 	debug_hexdump(stdout, "plaintext:", plaintext,
11314 			tdata->plaintext.len);
11315 
11316 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11317 			tdata);
11318 
11319 	if (retval < 0)
11320 		return retval;
11321 
11322 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11323 
11324 	ut_params->op->sym->m_src = ut_params->ibuf;
11325 
11326 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11327 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11328 			ut_params->op);
11329 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11330 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11331 				ut_params->op, 0, 1, 0, 0);
11332 	else
11333 		TEST_ASSERT_NOT_NULL(
11334 			process_crypto_request(ts_params->valid_devs[0],
11335 			ut_params->op), "failed to process sym crypto op");
11336 
11337 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11338 			"crypto op processing failed");
11339 
11340 	return 0;
11341 
11342 }
11343 
11344 static int
11345 test_AES_GMAC_authentication_verify_test_case_1(void)
11346 {
11347 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11348 }
11349 
11350 static int
11351 test_AES_GMAC_authentication_verify_test_case_2(void)
11352 {
11353 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11354 }
11355 
11356 static int
11357 test_AES_GMAC_authentication_verify_test_case_3(void)
11358 {
11359 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11360 }
11361 
11362 static int
11363 test_AES_GMAC_authentication_verify_test_case_4(void)
11364 {
11365 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11366 }
11367 
11368 static int
11369 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11370 				uint32_t fragsz)
11371 {
11372 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11373 	struct crypto_unittest_params *ut_params = &unittest_params;
11374 	struct rte_cryptodev_info dev_info;
11375 	uint64_t feature_flags;
11376 	unsigned int trn_data = 0;
11377 	void *digest_mem = NULL;
11378 	uint32_t segs = 1;
11379 	unsigned int to_trn = 0;
11380 	struct rte_mbuf *buf = NULL;
11381 	uint8_t *auth_tag, *plaintext;
11382 	int retval;
11383 
11384 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11385 			      "No GMAC length in the source data");
11386 
11387 	/* Verify the capabilities */
11388 	struct rte_cryptodev_sym_capability_idx cap_idx;
11389 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11390 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11391 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11392 			&cap_idx) == NULL)
11393 		return -ENOTSUP;
11394 
11395 	/* Check for any input SGL support */
11396 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11397 	feature_flags = dev_info.feature_flags;
11398 
11399 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11400 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11401 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11402 		return -ENOTSUP;
11403 
11404 	if (fragsz > tdata->plaintext.len)
11405 		fragsz = tdata->plaintext.len;
11406 
11407 	uint16_t plaintext_len = fragsz;
11408 
11409 	retval = create_gmac_session(ts_params->valid_devs[0],
11410 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11411 
11412 	if (retval < 0)
11413 		return retval;
11414 
11415 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11416 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11417 			"Failed to allocate input buffer in mempool");
11418 
11419 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11420 			rte_pktmbuf_tailroom(ut_params->ibuf));
11421 
11422 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11423 				plaintext_len);
11424 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11425 
11426 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11427 
11428 	trn_data += plaintext_len;
11429 
11430 	buf = ut_params->ibuf;
11431 
11432 	/*
11433 	 * Loop until no more fragments
11434 	 */
11435 
11436 	while (trn_data < tdata->plaintext.len) {
11437 		++segs;
11438 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11439 				(tdata->plaintext.len - trn_data) : fragsz;
11440 
11441 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11442 		buf = buf->next;
11443 
11444 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11445 				rte_pktmbuf_tailroom(buf));
11446 
11447 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11448 				to_trn);
11449 
11450 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11451 				to_trn);
11452 		trn_data += to_trn;
11453 		if (trn_data  == tdata->plaintext.len)
11454 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11455 					tdata->gmac_tag.len);
11456 	}
11457 	ut_params->ibuf->nb_segs = segs;
11458 
11459 	/*
11460 	 * Place digest at the end of the last buffer
11461 	 */
11462 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11463 
11464 	if (!digest_mem) {
11465 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11466 				+ tdata->gmac_tag.len);
11467 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11468 				tdata->plaintext.len);
11469 	}
11470 
11471 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11472 			tdata, digest_mem, digest_phys);
11473 
11474 	if (retval < 0)
11475 		return retval;
11476 
11477 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11478 
11479 	ut_params->op->sym->m_src = ut_params->ibuf;
11480 
11481 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11482 		return -ENOTSUP;
11483 
11484 	TEST_ASSERT_NOT_NULL(
11485 		process_crypto_request(ts_params->valid_devs[0],
11486 		ut_params->op), "failed to process sym crypto op");
11487 
11488 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11489 			"crypto op processing failed");
11490 
11491 	auth_tag = digest_mem;
11492 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11493 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11494 			auth_tag,
11495 			tdata->gmac_tag.data,
11496 			tdata->gmac_tag.len,
11497 			"GMAC Generated auth tag not as expected");
11498 
11499 	return 0;
11500 }
11501 
11502 /* Segment size not multiple of block size (16B) */
11503 static int
11504 test_AES_GMAC_authentication_SGL_40B(void)
11505 {
11506 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11507 }
11508 
11509 static int
11510 test_AES_GMAC_authentication_SGL_80B(void)
11511 {
11512 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11513 }
11514 
11515 static int
11516 test_AES_GMAC_authentication_SGL_2048B(void)
11517 {
11518 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11519 }
11520 
11521 /* Segment size not multiple of block size (16B) */
11522 static int
11523 test_AES_GMAC_authentication_SGL_2047B(void)
11524 {
11525 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11526 }
11527 
11528 struct test_crypto_vector {
11529 	enum rte_crypto_cipher_algorithm crypto_algo;
11530 	unsigned int cipher_offset;
11531 	unsigned int cipher_len;
11532 
11533 	struct {
11534 		uint8_t data[64];
11535 		unsigned int len;
11536 	} cipher_key;
11537 
11538 	struct {
11539 		uint8_t data[64];
11540 		unsigned int len;
11541 	} iv;
11542 
11543 	struct {
11544 		const uint8_t *data;
11545 		unsigned int len;
11546 	} plaintext;
11547 
11548 	struct {
11549 		const uint8_t *data;
11550 		unsigned int len;
11551 	} ciphertext;
11552 
11553 	enum rte_crypto_auth_algorithm auth_algo;
11554 	unsigned int auth_offset;
11555 
11556 	struct {
11557 		uint8_t data[128];
11558 		unsigned int len;
11559 	} auth_key;
11560 
11561 	struct {
11562 		const uint8_t *data;
11563 		unsigned int len;
11564 	} aad;
11565 
11566 	struct {
11567 		uint8_t data[128];
11568 		unsigned int len;
11569 	} digest;
11570 };
11571 
11572 static const struct test_crypto_vector
11573 hmac_sha1_test_crypto_vector = {
11574 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11575 	.plaintext = {
11576 		.data = plaintext_hash,
11577 		.len = 512
11578 	},
11579 	.auth_key = {
11580 		.data = {
11581 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11582 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11583 			0xDE, 0xF4, 0xDE, 0xAD
11584 		},
11585 		.len = 20
11586 	},
11587 	.digest = {
11588 		.data = {
11589 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11590 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11591 			0x3F, 0x91, 0x64, 0x59
11592 		},
11593 		.len = 20
11594 	}
11595 };
11596 
11597 static const struct test_crypto_vector
11598 aes128_gmac_test_vector = {
11599 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11600 	.plaintext = {
11601 		.data = plaintext_hash,
11602 		.len = 512
11603 	},
11604 	.iv = {
11605 		.data = {
11606 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11607 			0x08, 0x09, 0x0A, 0x0B
11608 		},
11609 		.len = 12
11610 	},
11611 	.auth_key = {
11612 		.data = {
11613 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11614 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11615 		},
11616 		.len = 16
11617 	},
11618 	.digest = {
11619 		.data = {
11620 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11621 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11622 		},
11623 		.len = 16
11624 	}
11625 };
11626 
11627 static const struct test_crypto_vector
11628 aes128cbc_hmac_sha1_test_vector = {
11629 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11630 	.cipher_offset = 0,
11631 	.cipher_len = 512,
11632 	.cipher_key = {
11633 		.data = {
11634 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11635 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11636 		},
11637 		.len = 16
11638 	},
11639 	.iv = {
11640 		.data = {
11641 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11642 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11643 		},
11644 		.len = 16
11645 	},
11646 	.plaintext = {
11647 		.data = plaintext_hash,
11648 		.len = 512
11649 	},
11650 	.ciphertext = {
11651 		.data = ciphertext512_aes128cbc,
11652 		.len = 512
11653 	},
11654 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11655 	.auth_offset = 0,
11656 	.auth_key = {
11657 		.data = {
11658 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11659 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11660 			0xDE, 0xF4, 0xDE, 0xAD
11661 		},
11662 		.len = 20
11663 	},
11664 	.digest = {
11665 		.data = {
11666 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11667 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11668 			0x18, 0x8C, 0x1D, 0x32
11669 		},
11670 		.len = 20
11671 	}
11672 };
11673 
11674 static const struct test_crypto_vector
11675 aes128cbc_hmac_sha1_aad_test_vector = {
11676 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11677 	.cipher_offset = 8,
11678 	.cipher_len = 496,
11679 	.cipher_key = {
11680 		.data = {
11681 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11682 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11683 		},
11684 		.len = 16
11685 	},
11686 	.iv = {
11687 		.data = {
11688 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11689 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11690 		},
11691 		.len = 16
11692 	},
11693 	.plaintext = {
11694 		.data = plaintext_hash,
11695 		.len = 512
11696 	},
11697 	.ciphertext = {
11698 		.data = ciphertext512_aes128cbc_aad,
11699 		.len = 512
11700 	},
11701 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11702 	.auth_offset = 0,
11703 	.auth_key = {
11704 		.data = {
11705 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11706 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11707 			0xDE, 0xF4, 0xDE, 0xAD
11708 		},
11709 		.len = 20
11710 	},
11711 	.digest = {
11712 		.data = {
11713 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11714 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11715 			0x62, 0x0F, 0xFB, 0x10
11716 		},
11717 		.len = 20
11718 	}
11719 };
11720 
11721 static void
11722 data_corruption(uint8_t *data)
11723 {
11724 	data[0] += 1;
11725 }
11726 
11727 static void
11728 tag_corruption(uint8_t *data, unsigned int tag_offset)
11729 {
11730 	data[tag_offset] += 1;
11731 }
11732 
11733 static int
11734 create_auth_session(struct crypto_unittest_params *ut_params,
11735 		uint8_t dev_id,
11736 		const struct test_crypto_vector *reference,
11737 		enum rte_crypto_auth_operation auth_op)
11738 {
11739 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11740 	uint8_t auth_key[reference->auth_key.len + 1];
11741 
11742 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11743 
11744 	/* Setup Authentication Parameters */
11745 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11746 	ut_params->auth_xform.auth.op = auth_op;
11747 	ut_params->auth_xform.next = NULL;
11748 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11749 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11750 	ut_params->auth_xform.auth.key.data = auth_key;
11751 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11752 
11753 	/* Create Crypto session*/
11754 	ut_params->sess = rte_cryptodev_sym_session_create(
11755 			ts_params->session_mpool);
11756 
11757 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11758 				&ut_params->auth_xform,
11759 				ts_params->session_priv_mpool);
11760 
11761 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11762 
11763 	return 0;
11764 }
11765 
11766 static int
11767 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11768 		uint8_t dev_id,
11769 		const struct test_crypto_vector *reference,
11770 		enum rte_crypto_auth_operation auth_op,
11771 		enum rte_crypto_cipher_operation cipher_op)
11772 {
11773 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11774 	uint8_t cipher_key[reference->cipher_key.len + 1];
11775 	uint8_t auth_key[reference->auth_key.len + 1];
11776 
11777 	memcpy(cipher_key, reference->cipher_key.data,
11778 			reference->cipher_key.len);
11779 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11780 
11781 	/* Setup Authentication Parameters */
11782 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11783 	ut_params->auth_xform.auth.op = auth_op;
11784 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11785 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11786 	ut_params->auth_xform.auth.key.data = auth_key;
11787 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11788 
11789 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11790 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11791 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
11792 	} else {
11793 		ut_params->auth_xform.next = &ut_params->cipher_xform;
11794 
11795 		/* Setup Cipher Parameters */
11796 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11797 		ut_params->cipher_xform.next = NULL;
11798 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11799 		ut_params->cipher_xform.cipher.op = cipher_op;
11800 		ut_params->cipher_xform.cipher.key.data = cipher_key;
11801 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11802 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11803 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11804 	}
11805 
11806 	/* Create Crypto session*/
11807 	ut_params->sess = rte_cryptodev_sym_session_create(
11808 			ts_params->session_mpool);
11809 
11810 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11811 				&ut_params->auth_xform,
11812 				ts_params->session_priv_mpool);
11813 
11814 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11815 
11816 	return 0;
11817 }
11818 
11819 static int
11820 create_auth_operation(struct crypto_testsuite_params *ts_params,
11821 		struct crypto_unittest_params *ut_params,
11822 		const struct test_crypto_vector *reference,
11823 		unsigned int auth_generate)
11824 {
11825 	/* Generate Crypto op data structure */
11826 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11827 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11828 	TEST_ASSERT_NOT_NULL(ut_params->op,
11829 			"Failed to allocate pktmbuf offload");
11830 
11831 	/* Set crypto operation data parameters */
11832 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11833 
11834 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11835 
11836 	/* set crypto operation source mbuf */
11837 	sym_op->m_src = ut_params->ibuf;
11838 
11839 	/* digest */
11840 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11841 			ut_params->ibuf, reference->digest.len);
11842 
11843 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11844 			"no room to append auth tag");
11845 
11846 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11847 			ut_params->ibuf, reference->plaintext.len);
11848 
11849 	if (auth_generate)
11850 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11851 	else
11852 		memcpy(sym_op->auth.digest.data,
11853 				reference->digest.data,
11854 				reference->digest.len);
11855 
11856 	debug_hexdump(stdout, "digest:",
11857 			sym_op->auth.digest.data,
11858 			reference->digest.len);
11859 
11860 	sym_op->auth.data.length = reference->plaintext.len;
11861 	sym_op->auth.data.offset = 0;
11862 
11863 	return 0;
11864 }
11865 
11866 static int
11867 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11868 		struct crypto_unittest_params *ut_params,
11869 		const struct test_crypto_vector *reference,
11870 		unsigned int auth_generate)
11871 {
11872 	/* Generate Crypto op data structure */
11873 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11874 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11875 	TEST_ASSERT_NOT_NULL(ut_params->op,
11876 			"Failed to allocate pktmbuf offload");
11877 
11878 	/* Set crypto operation data parameters */
11879 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11880 
11881 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11882 
11883 	/* set crypto operation source mbuf */
11884 	sym_op->m_src = ut_params->ibuf;
11885 
11886 	/* digest */
11887 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11888 			ut_params->ibuf, reference->digest.len);
11889 
11890 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11891 			"no room to append auth tag");
11892 
11893 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11894 			ut_params->ibuf, reference->ciphertext.len);
11895 
11896 	if (auth_generate)
11897 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11898 	else
11899 		memcpy(sym_op->auth.digest.data,
11900 				reference->digest.data,
11901 				reference->digest.len);
11902 
11903 	debug_hexdump(stdout, "digest:",
11904 			sym_op->auth.digest.data,
11905 			reference->digest.len);
11906 
11907 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11908 			reference->iv.data, reference->iv.len);
11909 
11910 	sym_op->cipher.data.length = 0;
11911 	sym_op->cipher.data.offset = 0;
11912 
11913 	sym_op->auth.data.length = reference->plaintext.len;
11914 	sym_op->auth.data.offset = 0;
11915 
11916 	return 0;
11917 }
11918 
11919 static int
11920 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11921 		struct crypto_unittest_params *ut_params,
11922 		const struct test_crypto_vector *reference,
11923 		unsigned int auth_generate)
11924 {
11925 	/* Generate Crypto op data structure */
11926 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11927 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11928 	TEST_ASSERT_NOT_NULL(ut_params->op,
11929 			"Failed to allocate pktmbuf offload");
11930 
11931 	/* Set crypto operation data parameters */
11932 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11933 
11934 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11935 
11936 	/* set crypto operation source mbuf */
11937 	sym_op->m_src = ut_params->ibuf;
11938 
11939 	/* digest */
11940 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11941 			ut_params->ibuf, reference->digest.len);
11942 
11943 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11944 			"no room to append auth tag");
11945 
11946 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11947 			ut_params->ibuf, reference->ciphertext.len);
11948 
11949 	if (auth_generate)
11950 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11951 	else
11952 		memcpy(sym_op->auth.digest.data,
11953 				reference->digest.data,
11954 				reference->digest.len);
11955 
11956 	debug_hexdump(stdout, "digest:",
11957 			sym_op->auth.digest.data,
11958 			reference->digest.len);
11959 
11960 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11961 			reference->iv.data, reference->iv.len);
11962 
11963 	sym_op->cipher.data.length = reference->cipher_len;
11964 	sym_op->cipher.data.offset = reference->cipher_offset;
11965 
11966 	sym_op->auth.data.length = reference->plaintext.len;
11967 	sym_op->auth.data.offset = reference->auth_offset;
11968 
11969 	return 0;
11970 }
11971 
11972 static int
11973 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11974 		struct crypto_unittest_params *ut_params,
11975 		const struct test_crypto_vector *reference)
11976 {
11977 	return create_auth_operation(ts_params, ut_params, reference, 0);
11978 }
11979 
11980 static int
11981 create_auth_verify_GMAC_operation(
11982 		struct crypto_testsuite_params *ts_params,
11983 		struct crypto_unittest_params *ut_params,
11984 		const struct test_crypto_vector *reference)
11985 {
11986 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
11987 }
11988 
11989 static int
11990 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11991 		struct crypto_unittest_params *ut_params,
11992 		const struct test_crypto_vector *reference)
11993 {
11994 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
11995 }
11996 
11997 static int
11998 test_authentication_verify_fail_when_data_corruption(
11999 		struct crypto_testsuite_params *ts_params,
12000 		struct crypto_unittest_params *ut_params,
12001 		const struct test_crypto_vector *reference,
12002 		unsigned int data_corrupted)
12003 {
12004 	int retval;
12005 
12006 	uint8_t *plaintext;
12007 	struct rte_cryptodev_info dev_info;
12008 
12009 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12010 	uint64_t feat_flags = dev_info.feature_flags;
12011 
12012 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12013 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12014 		printf("Device doesn't support RAW data-path APIs.\n");
12015 		return -ENOTSUP;
12016 	}
12017 
12018 	/* Verify the capabilities */
12019 	struct rte_cryptodev_sym_capability_idx cap_idx;
12020 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12021 	cap_idx.algo.auth = reference->auth_algo;
12022 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12023 			&cap_idx) == NULL)
12024 		return -ENOTSUP;
12025 
12026 
12027 	/* Create session */
12028 	retval = create_auth_session(ut_params,
12029 			ts_params->valid_devs[0],
12030 			reference,
12031 			RTE_CRYPTO_AUTH_OP_VERIFY);
12032 	if (retval < 0)
12033 		return retval;
12034 
12035 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12036 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12037 			"Failed to allocate input buffer in mempool");
12038 
12039 	/* clear mbuf payload */
12040 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12041 			rte_pktmbuf_tailroom(ut_params->ibuf));
12042 
12043 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12044 			reference->plaintext.len);
12045 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12046 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12047 
12048 	debug_hexdump(stdout, "plaintext:", plaintext,
12049 		reference->plaintext.len);
12050 
12051 	/* Create operation */
12052 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
12053 
12054 	if (retval < 0)
12055 		return retval;
12056 
12057 	if (data_corrupted)
12058 		data_corruption(plaintext);
12059 	else
12060 		tag_corruption(plaintext, reference->plaintext.len);
12061 
12062 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12063 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12064 			ut_params->op);
12065 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12066 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12067 			"authentication not failed");
12068 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12069 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12070 				ut_params->op, 0, 1, 0, 0);
12071 	else {
12072 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12073 			ut_params->op);
12074 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12075 	}
12076 
12077 	return 0;
12078 }
12079 
12080 static int
12081 test_authentication_verify_GMAC_fail_when_corruption(
12082 		struct crypto_testsuite_params *ts_params,
12083 		struct crypto_unittest_params *ut_params,
12084 		const struct test_crypto_vector *reference,
12085 		unsigned int data_corrupted)
12086 {
12087 	int retval;
12088 	uint8_t *plaintext;
12089 	struct rte_cryptodev_info dev_info;
12090 
12091 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12092 	uint64_t feat_flags = dev_info.feature_flags;
12093 
12094 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12095 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12096 		printf("Device doesn't support RAW data-path APIs.\n");
12097 		return -ENOTSUP;
12098 	}
12099 
12100 	/* Verify the capabilities */
12101 	struct rte_cryptodev_sym_capability_idx cap_idx;
12102 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12103 	cap_idx.algo.auth = reference->auth_algo;
12104 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12105 			&cap_idx) == NULL)
12106 		return -ENOTSUP;
12107 
12108 	/* Create session */
12109 	retval = create_auth_cipher_session(ut_params,
12110 			ts_params->valid_devs[0],
12111 			reference,
12112 			RTE_CRYPTO_AUTH_OP_VERIFY,
12113 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12114 	if (retval < 0)
12115 		return retval;
12116 
12117 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12118 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12119 			"Failed to allocate input buffer in mempool");
12120 
12121 	/* clear mbuf payload */
12122 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12123 			rte_pktmbuf_tailroom(ut_params->ibuf));
12124 
12125 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12126 			reference->plaintext.len);
12127 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12128 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12129 
12130 	debug_hexdump(stdout, "plaintext:", plaintext,
12131 		reference->plaintext.len);
12132 
12133 	/* Create operation */
12134 	retval = create_auth_verify_GMAC_operation(ts_params,
12135 			ut_params,
12136 			reference);
12137 
12138 	if (retval < 0)
12139 		return retval;
12140 
12141 	if (data_corrupted)
12142 		data_corruption(plaintext);
12143 	else
12144 		tag_corruption(plaintext, reference->aad.len);
12145 
12146 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12147 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12148 			ut_params->op);
12149 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12150 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12151 			"authentication not failed");
12152 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12153 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12154 				ut_params->op, 0, 1, 0, 0);
12155 	else {
12156 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12157 			ut_params->op);
12158 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12159 	}
12160 
12161 	return 0;
12162 }
12163 
12164 static int
12165 test_authenticated_decryption_fail_when_corruption(
12166 		struct crypto_testsuite_params *ts_params,
12167 		struct crypto_unittest_params *ut_params,
12168 		const struct test_crypto_vector *reference,
12169 		unsigned int data_corrupted)
12170 {
12171 	int retval;
12172 
12173 	uint8_t *ciphertext;
12174 	struct rte_cryptodev_info dev_info;
12175 
12176 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12177 	uint64_t feat_flags = dev_info.feature_flags;
12178 
12179 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12180 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12181 		printf("Device doesn't support RAW data-path APIs.\n");
12182 		return -ENOTSUP;
12183 	}
12184 
12185 	/* Verify the capabilities */
12186 	struct rte_cryptodev_sym_capability_idx cap_idx;
12187 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12188 	cap_idx.algo.auth = reference->auth_algo;
12189 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12190 			&cap_idx) == NULL)
12191 		return -ENOTSUP;
12192 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12193 	cap_idx.algo.cipher = reference->crypto_algo;
12194 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12195 			&cap_idx) == NULL)
12196 		return -ENOTSUP;
12197 
12198 	/* Create session */
12199 	retval = create_auth_cipher_session(ut_params,
12200 			ts_params->valid_devs[0],
12201 			reference,
12202 			RTE_CRYPTO_AUTH_OP_VERIFY,
12203 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12204 	if (retval < 0)
12205 		return retval;
12206 
12207 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12208 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12209 			"Failed to allocate input buffer in mempool");
12210 
12211 	/* clear mbuf payload */
12212 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12213 			rte_pktmbuf_tailroom(ut_params->ibuf));
12214 
12215 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12216 			reference->ciphertext.len);
12217 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12218 	memcpy(ciphertext, reference->ciphertext.data,
12219 			reference->ciphertext.len);
12220 
12221 	/* Create operation */
12222 	retval = create_cipher_auth_verify_operation(ts_params,
12223 			ut_params,
12224 			reference);
12225 
12226 	if (retval < 0)
12227 		return retval;
12228 
12229 	if (data_corrupted)
12230 		data_corruption(ciphertext);
12231 	else
12232 		tag_corruption(ciphertext, reference->ciphertext.len);
12233 
12234 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12235 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12236 			ut_params->op);
12237 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12238 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12239 			"authentication not failed");
12240 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12241 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12242 				ut_params->op, 1, 1, 0, 0);
12243 	else {
12244 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12245 			ut_params->op);
12246 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12247 	}
12248 
12249 	return 0;
12250 }
12251 
12252 static int
12253 test_authenticated_encryt_with_esn(
12254 		struct crypto_testsuite_params *ts_params,
12255 		struct crypto_unittest_params *ut_params,
12256 		const struct test_crypto_vector *reference)
12257 {
12258 	int retval;
12259 
12260 	uint8_t *authciphertext, *plaintext, *auth_tag;
12261 	uint16_t plaintext_pad_len;
12262 	uint8_t cipher_key[reference->cipher_key.len + 1];
12263 	uint8_t auth_key[reference->auth_key.len + 1];
12264 	struct rte_cryptodev_info dev_info;
12265 
12266 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12267 	uint64_t feat_flags = dev_info.feature_flags;
12268 
12269 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12270 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12271 		printf("Device doesn't support RAW data-path APIs.\n");
12272 		return -ENOTSUP;
12273 	}
12274 
12275 	/* Verify the capabilities */
12276 	struct rte_cryptodev_sym_capability_idx cap_idx;
12277 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12278 	cap_idx.algo.auth = reference->auth_algo;
12279 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12280 			&cap_idx) == NULL)
12281 		return -ENOTSUP;
12282 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12283 	cap_idx.algo.cipher = reference->crypto_algo;
12284 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12285 			&cap_idx) == NULL)
12286 		return -ENOTSUP;
12287 
12288 	/* Create session */
12289 	memcpy(cipher_key, reference->cipher_key.data,
12290 			reference->cipher_key.len);
12291 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12292 
12293 	/* Setup Cipher Parameters */
12294 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12295 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12296 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12297 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12298 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12299 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12300 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12301 
12302 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12303 
12304 	/* Setup Authentication Parameters */
12305 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12306 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12307 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12308 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12309 	ut_params->auth_xform.auth.key.data = auth_key;
12310 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12311 	ut_params->auth_xform.next = NULL;
12312 
12313 	/* Create Crypto session*/
12314 	ut_params->sess = rte_cryptodev_sym_session_create(
12315 			ts_params->session_mpool);
12316 
12317 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12318 				ut_params->sess,
12319 				&ut_params->cipher_xform,
12320 				ts_params->session_priv_mpool);
12321 
12322 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12323 
12324 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12325 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12326 			"Failed to allocate input buffer in mempool");
12327 
12328 	/* clear mbuf payload */
12329 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12330 			rte_pktmbuf_tailroom(ut_params->ibuf));
12331 
12332 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12333 			reference->plaintext.len);
12334 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12335 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12336 
12337 	/* Create operation */
12338 	retval = create_cipher_auth_operation(ts_params,
12339 			ut_params,
12340 			reference, 0);
12341 
12342 	if (retval < 0)
12343 		return retval;
12344 
12345 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12346 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12347 			ut_params->op);
12348 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12349 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12350 				ut_params->op, 1, 1, 0, 0);
12351 	else
12352 		ut_params->op = process_crypto_request(
12353 			ts_params->valid_devs[0], ut_params->op);
12354 
12355 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12356 
12357 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12358 			"crypto op processing failed");
12359 
12360 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12361 
12362 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12363 			ut_params->op->sym->auth.data.offset);
12364 	auth_tag = authciphertext + plaintext_pad_len;
12365 	debug_hexdump(stdout, "ciphertext:", authciphertext,
12366 			reference->ciphertext.len);
12367 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12368 
12369 	/* Validate obuf */
12370 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12371 			authciphertext,
12372 			reference->ciphertext.data,
12373 			reference->ciphertext.len,
12374 			"Ciphertext data not as expected");
12375 
12376 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12377 			auth_tag,
12378 			reference->digest.data,
12379 			reference->digest.len,
12380 			"Generated digest not as expected");
12381 
12382 	return TEST_SUCCESS;
12383 
12384 }
12385 
12386 static int
12387 test_authenticated_decrypt_with_esn(
12388 		struct crypto_testsuite_params *ts_params,
12389 		struct crypto_unittest_params *ut_params,
12390 		const struct test_crypto_vector *reference)
12391 {
12392 	int retval;
12393 
12394 	uint8_t *ciphertext;
12395 	uint8_t cipher_key[reference->cipher_key.len + 1];
12396 	uint8_t auth_key[reference->auth_key.len + 1];
12397 	struct rte_cryptodev_info dev_info;
12398 
12399 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12400 	uint64_t feat_flags = dev_info.feature_flags;
12401 
12402 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12403 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12404 		printf("Device doesn't support RAW data-path APIs.\n");
12405 		return -ENOTSUP;
12406 	}
12407 
12408 	/* Verify the capabilities */
12409 	struct rte_cryptodev_sym_capability_idx cap_idx;
12410 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12411 	cap_idx.algo.auth = reference->auth_algo;
12412 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12413 			&cap_idx) == NULL)
12414 		return -ENOTSUP;
12415 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12416 	cap_idx.algo.cipher = reference->crypto_algo;
12417 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12418 			&cap_idx) == NULL)
12419 		return -ENOTSUP;
12420 
12421 	/* Create session */
12422 	memcpy(cipher_key, reference->cipher_key.data,
12423 			reference->cipher_key.len);
12424 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12425 
12426 	/* Setup Authentication Parameters */
12427 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12428 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12429 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12430 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12431 	ut_params->auth_xform.auth.key.data = auth_key;
12432 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12433 	ut_params->auth_xform.next = &ut_params->cipher_xform;
12434 
12435 	/* Setup Cipher Parameters */
12436 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12437 	ut_params->cipher_xform.next = NULL;
12438 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12439 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12440 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12441 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12442 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12443 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12444 
12445 	/* Create Crypto session*/
12446 	ut_params->sess = rte_cryptodev_sym_session_create(
12447 			ts_params->session_mpool);
12448 
12449 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12450 				ut_params->sess,
12451 				&ut_params->auth_xform,
12452 				ts_params->session_priv_mpool);
12453 
12454 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12455 
12456 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12457 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12458 			"Failed to allocate input buffer in mempool");
12459 
12460 	/* clear mbuf payload */
12461 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12462 			rte_pktmbuf_tailroom(ut_params->ibuf));
12463 
12464 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12465 			reference->ciphertext.len);
12466 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12467 	memcpy(ciphertext, reference->ciphertext.data,
12468 			reference->ciphertext.len);
12469 
12470 	/* Create operation */
12471 	retval = create_cipher_auth_verify_operation(ts_params,
12472 			ut_params,
12473 			reference);
12474 
12475 	if (retval < 0)
12476 		return retval;
12477 
12478 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12479 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12480 			ut_params->op);
12481 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12482 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12483 				ut_params->op, 1, 1, 0, 0);
12484 	else
12485 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12486 			ut_params->op);
12487 
12488 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12489 	TEST_ASSERT_EQUAL(ut_params->op->status,
12490 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12491 			"crypto op processing passed");
12492 
12493 	ut_params->obuf = ut_params->op->sym->m_src;
12494 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12495 
12496 	return 0;
12497 }
12498 
12499 static int
12500 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12501 		const struct aead_test_data *tdata,
12502 		void *digest_mem, uint64_t digest_phys)
12503 {
12504 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12505 	struct crypto_unittest_params *ut_params = &unittest_params;
12506 
12507 	const unsigned int auth_tag_len = tdata->auth_tag.len;
12508 	const unsigned int iv_len = tdata->iv.len;
12509 	unsigned int aad_len = tdata->aad.len;
12510 	unsigned int aad_len_pad = 0;
12511 
12512 	/* Generate Crypto op data structure */
12513 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12514 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12515 	TEST_ASSERT_NOT_NULL(ut_params->op,
12516 		"Failed to allocate symmetric crypto operation struct");
12517 
12518 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12519 
12520 	sym_op->aead.digest.data = digest_mem;
12521 
12522 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12523 			"no room to append digest");
12524 
12525 	sym_op->aead.digest.phys_addr = digest_phys;
12526 
12527 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12528 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12529 				auth_tag_len);
12530 		debug_hexdump(stdout, "digest:",
12531 				sym_op->aead.digest.data,
12532 				auth_tag_len);
12533 	}
12534 
12535 	/* Append aad data */
12536 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12537 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12538 				uint8_t *, IV_OFFSET);
12539 
12540 		/* Copy IV 1 byte after the IV pointer, according to the API */
12541 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12542 
12543 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12544 
12545 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12546 				ut_params->ibuf, aad_len);
12547 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12548 				"no room to prepend aad");
12549 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12550 				ut_params->ibuf);
12551 
12552 		memset(sym_op->aead.aad.data, 0, aad_len);
12553 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
12554 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12555 
12556 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12557 		debug_hexdump(stdout, "aad:",
12558 				sym_op->aead.aad.data, aad_len);
12559 	} else {
12560 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12561 				uint8_t *, IV_OFFSET);
12562 
12563 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12564 
12565 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12566 
12567 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12568 				ut_params->ibuf, aad_len_pad);
12569 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12570 				"no room to prepend aad");
12571 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12572 				ut_params->ibuf);
12573 
12574 		memset(sym_op->aead.aad.data, 0, aad_len);
12575 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12576 
12577 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12578 		debug_hexdump(stdout, "aad:",
12579 				sym_op->aead.aad.data, aad_len);
12580 	}
12581 
12582 	sym_op->aead.data.length = tdata->plaintext.len;
12583 	sym_op->aead.data.offset = aad_len_pad;
12584 
12585 	return 0;
12586 }
12587 
12588 #define SGL_MAX_NO	16
12589 
12590 static int
12591 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12592 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12593 {
12594 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12595 	struct crypto_unittest_params *ut_params = &unittest_params;
12596 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12597 	int retval;
12598 	int to_trn = 0;
12599 	int to_trn_tbl[SGL_MAX_NO];
12600 	int segs = 1;
12601 	unsigned int trn_data = 0;
12602 	uint8_t *plaintext, *ciphertext, *auth_tag;
12603 	struct rte_cryptodev_info dev_info;
12604 
12605 	/* Verify the capabilities */
12606 	struct rte_cryptodev_sym_capability_idx cap_idx;
12607 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12608 	cap_idx.algo.aead = tdata->algo;
12609 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12610 			&cap_idx) == NULL)
12611 		return -ENOTSUP;
12612 
12613 	/* OOP not supported with CPU crypto */
12614 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12615 		return -ENOTSUP;
12616 
12617 	/* Detailed check for the particular SGL support flag */
12618 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12619 	if (!oop) {
12620 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12621 		if (sgl_in && (!(dev_info.feature_flags &
12622 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12623 			return -ENOTSUP;
12624 
12625 		uint64_t feat_flags = dev_info.feature_flags;
12626 
12627 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12628 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12629 			printf("Device doesn't support RAW data-path APIs.\n");
12630 			return -ENOTSUP;
12631 		}
12632 	} else {
12633 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12634 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12635 				tdata->plaintext.len;
12636 		/* Raw data path API does not support OOP */
12637 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12638 			return -ENOTSUP;
12639 		if (sgl_in && !sgl_out) {
12640 			if (!(dev_info.feature_flags &
12641 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12642 				return -ENOTSUP;
12643 		} else if (!sgl_in && sgl_out) {
12644 			if (!(dev_info.feature_flags &
12645 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12646 				return -ENOTSUP;
12647 		} else if (sgl_in && sgl_out) {
12648 			if (!(dev_info.feature_flags &
12649 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12650 				return -ENOTSUP;
12651 		}
12652 	}
12653 
12654 	if (fragsz > tdata->plaintext.len)
12655 		fragsz = tdata->plaintext.len;
12656 
12657 	uint16_t plaintext_len = fragsz;
12658 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12659 
12660 	if (fragsz_oop > tdata->plaintext.len)
12661 		frag_size_oop = tdata->plaintext.len;
12662 
12663 	int ecx = 0;
12664 	void *digest_mem = NULL;
12665 
12666 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12667 
12668 	if (tdata->plaintext.len % fragsz != 0) {
12669 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12670 			return 1;
12671 	}	else {
12672 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12673 			return 1;
12674 	}
12675 
12676 	/*
12677 	 * For out-op-place we need to alloc another mbuf
12678 	 */
12679 	if (oop) {
12680 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12681 		rte_pktmbuf_append(ut_params->obuf,
12682 				frag_size_oop + prepend_len);
12683 		buf_oop = ut_params->obuf;
12684 	}
12685 
12686 	/* Create AEAD session */
12687 	retval = create_aead_session(ts_params->valid_devs[0],
12688 			tdata->algo,
12689 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
12690 			tdata->key.data, tdata->key.len,
12691 			tdata->aad.len, tdata->auth_tag.len,
12692 			tdata->iv.len);
12693 	if (retval < 0)
12694 		return retval;
12695 
12696 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12697 
12698 	/* clear mbuf payload */
12699 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12700 			rte_pktmbuf_tailroom(ut_params->ibuf));
12701 
12702 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12703 			plaintext_len);
12704 
12705 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12706 
12707 	trn_data += plaintext_len;
12708 
12709 	buf = ut_params->ibuf;
12710 
12711 	/*
12712 	 * Loop until no more fragments
12713 	 */
12714 
12715 	while (trn_data < tdata->plaintext.len) {
12716 		++segs;
12717 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12718 				(tdata->plaintext.len - trn_data) : fragsz;
12719 
12720 		to_trn_tbl[ecx++] = to_trn;
12721 
12722 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12723 		buf = buf->next;
12724 
12725 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12726 				rte_pktmbuf_tailroom(buf));
12727 
12728 		/* OOP */
12729 		if (oop && !fragsz_oop) {
12730 			buf_last_oop = buf_oop->next =
12731 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12732 			buf_oop = buf_oop->next;
12733 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12734 					0, rte_pktmbuf_tailroom(buf_oop));
12735 			rte_pktmbuf_append(buf_oop, to_trn);
12736 		}
12737 
12738 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12739 				to_trn);
12740 
12741 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12742 				to_trn);
12743 		trn_data += to_trn;
12744 		if (trn_data  == tdata->plaintext.len) {
12745 			if (oop) {
12746 				if (!fragsz_oop)
12747 					digest_mem = rte_pktmbuf_append(buf_oop,
12748 						tdata->auth_tag.len);
12749 			} else
12750 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12751 					tdata->auth_tag.len);
12752 		}
12753 	}
12754 
12755 	uint64_t digest_phys = 0;
12756 
12757 	ut_params->ibuf->nb_segs = segs;
12758 
12759 	segs = 1;
12760 	if (fragsz_oop && oop) {
12761 		to_trn = 0;
12762 		ecx = 0;
12763 
12764 		if (frag_size_oop == tdata->plaintext.len) {
12765 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
12766 				tdata->auth_tag.len);
12767 
12768 			digest_phys = rte_pktmbuf_iova_offset(
12769 					ut_params->obuf,
12770 					tdata->plaintext.len + prepend_len);
12771 		}
12772 
12773 		trn_data = frag_size_oop;
12774 		while (trn_data < tdata->plaintext.len) {
12775 			++segs;
12776 			to_trn =
12777 				(tdata->plaintext.len - trn_data <
12778 						frag_size_oop) ?
12779 				(tdata->plaintext.len - trn_data) :
12780 						frag_size_oop;
12781 
12782 			to_trn_tbl[ecx++] = to_trn;
12783 
12784 			buf_last_oop = buf_oop->next =
12785 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12786 			buf_oop = buf_oop->next;
12787 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12788 					0, rte_pktmbuf_tailroom(buf_oop));
12789 			rte_pktmbuf_append(buf_oop, to_trn);
12790 
12791 			trn_data += to_trn;
12792 
12793 			if (trn_data  == tdata->plaintext.len) {
12794 				digest_mem = rte_pktmbuf_append(buf_oop,
12795 					tdata->auth_tag.len);
12796 			}
12797 		}
12798 
12799 		ut_params->obuf->nb_segs = segs;
12800 	}
12801 
12802 	/*
12803 	 * Place digest at the end of the last buffer
12804 	 */
12805 	if (!digest_phys)
12806 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12807 	if (oop && buf_last_oop)
12808 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12809 
12810 	if (!digest_mem && !oop) {
12811 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12812 				+ tdata->auth_tag.len);
12813 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12814 				tdata->plaintext.len);
12815 	}
12816 
12817 	/* Create AEAD operation */
12818 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12819 			tdata, digest_mem, digest_phys);
12820 
12821 	if (retval < 0)
12822 		return retval;
12823 
12824 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12825 
12826 	ut_params->op->sym->m_src = ut_params->ibuf;
12827 	if (oop)
12828 		ut_params->op->sym->m_dst = ut_params->obuf;
12829 
12830 	/* Process crypto operation */
12831 	if (oop == IN_PLACE &&
12832 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12833 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12834 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12835 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12836 				ut_params->op, 0, 0, 0, 0);
12837 	else
12838 		TEST_ASSERT_NOT_NULL(
12839 			process_crypto_request(ts_params->valid_devs[0],
12840 			ut_params->op), "failed to process sym crypto op");
12841 
12842 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12843 			"crypto op processing failed");
12844 
12845 
12846 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12847 			uint8_t *, prepend_len);
12848 	if (oop) {
12849 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12850 				uint8_t *, prepend_len);
12851 	}
12852 
12853 	if (fragsz_oop)
12854 		fragsz = fragsz_oop;
12855 
12856 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12857 			ciphertext,
12858 			tdata->ciphertext.data,
12859 			fragsz,
12860 			"Ciphertext data not as expected");
12861 
12862 	buf = ut_params->op->sym->m_src->next;
12863 	if (oop)
12864 		buf = ut_params->op->sym->m_dst->next;
12865 
12866 	unsigned int off = fragsz;
12867 
12868 	ecx = 0;
12869 	while (buf) {
12870 		ciphertext = rte_pktmbuf_mtod(buf,
12871 				uint8_t *);
12872 
12873 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
12874 				ciphertext,
12875 				tdata->ciphertext.data + off,
12876 				to_trn_tbl[ecx],
12877 				"Ciphertext data not as expected");
12878 
12879 		off += to_trn_tbl[ecx++];
12880 		buf = buf->next;
12881 	}
12882 
12883 	auth_tag = digest_mem;
12884 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12885 			auth_tag,
12886 			tdata->auth_tag.data,
12887 			tdata->auth_tag.len,
12888 			"Generated auth tag not as expected");
12889 
12890 	return 0;
12891 }
12892 
12893 static int
12894 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12895 {
12896 	return test_authenticated_encryption_SGL(
12897 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12898 }
12899 
12900 static int
12901 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12902 {
12903 	return test_authenticated_encryption_SGL(
12904 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12905 }
12906 
12907 static int
12908 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12909 {
12910 	return test_authenticated_encryption_SGL(
12911 			&gcm_test_case_8, OUT_OF_PLACE, 400,
12912 			gcm_test_case_8.plaintext.len);
12913 }
12914 
12915 static int
12916 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12917 {
12918 	/* This test is not for OPENSSL PMD */
12919 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
12920 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12921 		return -ENOTSUP;
12922 
12923 	return test_authenticated_encryption_SGL(
12924 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12925 }
12926 
12927 static int
12928 test_authentication_verify_fail_when_data_corrupted(
12929 		struct crypto_testsuite_params *ts_params,
12930 		struct crypto_unittest_params *ut_params,
12931 		const struct test_crypto_vector *reference)
12932 {
12933 	return test_authentication_verify_fail_when_data_corruption(
12934 			ts_params, ut_params, reference, 1);
12935 }
12936 
12937 static int
12938 test_authentication_verify_fail_when_tag_corrupted(
12939 		struct crypto_testsuite_params *ts_params,
12940 		struct crypto_unittest_params *ut_params,
12941 		const struct test_crypto_vector *reference)
12942 {
12943 	return test_authentication_verify_fail_when_data_corruption(
12944 			ts_params, ut_params, reference, 0);
12945 }
12946 
12947 static int
12948 test_authentication_verify_GMAC_fail_when_data_corrupted(
12949 		struct crypto_testsuite_params *ts_params,
12950 		struct crypto_unittest_params *ut_params,
12951 		const struct test_crypto_vector *reference)
12952 {
12953 	return test_authentication_verify_GMAC_fail_when_corruption(
12954 			ts_params, ut_params, reference, 1);
12955 }
12956 
12957 static int
12958 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12959 		struct crypto_testsuite_params *ts_params,
12960 		struct crypto_unittest_params *ut_params,
12961 		const struct test_crypto_vector *reference)
12962 {
12963 	return test_authentication_verify_GMAC_fail_when_corruption(
12964 			ts_params, ut_params, reference, 0);
12965 }
12966 
12967 static int
12968 test_authenticated_decryption_fail_when_data_corrupted(
12969 		struct crypto_testsuite_params *ts_params,
12970 		struct crypto_unittest_params *ut_params,
12971 		const struct test_crypto_vector *reference)
12972 {
12973 	return test_authenticated_decryption_fail_when_corruption(
12974 			ts_params, ut_params, reference, 1);
12975 }
12976 
12977 static int
12978 test_authenticated_decryption_fail_when_tag_corrupted(
12979 		struct crypto_testsuite_params *ts_params,
12980 		struct crypto_unittest_params *ut_params,
12981 		const struct test_crypto_vector *reference)
12982 {
12983 	return test_authenticated_decryption_fail_when_corruption(
12984 			ts_params, ut_params, reference, 0);
12985 }
12986 
12987 static int
12988 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12989 {
12990 	return test_authentication_verify_fail_when_data_corrupted(
12991 			&testsuite_params, &unittest_params,
12992 			&hmac_sha1_test_crypto_vector);
12993 }
12994 
12995 static int
12996 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
12997 {
12998 	return test_authentication_verify_fail_when_tag_corrupted(
12999 			&testsuite_params, &unittest_params,
13000 			&hmac_sha1_test_crypto_vector);
13001 }
13002 
13003 static int
13004 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13005 {
13006 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13007 			&testsuite_params, &unittest_params,
13008 			&aes128_gmac_test_vector);
13009 }
13010 
13011 static int
13012 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13013 {
13014 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13015 			&testsuite_params, &unittest_params,
13016 			&aes128_gmac_test_vector);
13017 }
13018 
13019 static int
13020 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13021 {
13022 	return test_authenticated_decryption_fail_when_data_corrupted(
13023 			&testsuite_params,
13024 			&unittest_params,
13025 			&aes128cbc_hmac_sha1_test_vector);
13026 }
13027 
13028 static int
13029 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13030 {
13031 	return test_authenticated_decryption_fail_when_tag_corrupted(
13032 			&testsuite_params,
13033 			&unittest_params,
13034 			&aes128cbc_hmac_sha1_test_vector);
13035 }
13036 
13037 static int
13038 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13039 {
13040 	return test_authenticated_encryt_with_esn(
13041 			&testsuite_params,
13042 			&unittest_params,
13043 			&aes128cbc_hmac_sha1_aad_test_vector);
13044 }
13045 
13046 static int
13047 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13048 {
13049 	return test_authenticated_decrypt_with_esn(
13050 			&testsuite_params,
13051 			&unittest_params,
13052 			&aes128cbc_hmac_sha1_aad_test_vector);
13053 }
13054 
13055 static int
13056 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13057 {
13058 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13059 }
13060 
13061 static int
13062 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13063 {
13064 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13065 }
13066 
13067 #ifdef RTE_CRYPTO_SCHEDULER
13068 
13069 /* global AESNI worker IDs for the scheduler test */
13070 uint8_t aesni_ids[2];
13071 
13072 static int
13073 test_scheduler_attach_slave_op(void)
13074 {
13075 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13076 	uint8_t sched_id = ts_params->valid_devs[0];
13077 	uint32_t nb_devs, i, nb_devs_attached = 0;
13078 	int ret;
13079 	char vdev_name[32];
13080 
13081 	/* create 2 AESNI_MB if necessary */
13082 	nb_devs = rte_cryptodev_device_count_by_driver(
13083 			rte_cryptodev_driver_id_get(
13084 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
13085 	if (nb_devs < 2) {
13086 		for (i = nb_devs; i < 2; i++) {
13087 			snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13088 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13089 					i);
13090 			ret = rte_vdev_init(vdev_name, NULL);
13091 
13092 			TEST_ASSERT(ret == 0,
13093 				"Failed to create instance %u of"
13094 				" pmd : %s",
13095 				i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13096 		}
13097 	}
13098 
13099 	/* attach 2 AESNI_MB cdevs */
13100 	for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
13101 			i++) {
13102 		struct rte_cryptodev_info info;
13103 		unsigned int session_size;
13104 
13105 		rte_cryptodev_info_get(i, &info);
13106 		if (info.driver_id != rte_cryptodev_driver_id_get(
13107 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13108 			continue;
13109 
13110 		session_size = rte_cryptodev_sym_get_private_session_size(i);
13111 		/*
13112 		 * Create the session mempool again, since now there are new devices
13113 		 * to use the mempool.
13114 		 */
13115 		if (ts_params->session_mpool) {
13116 			rte_mempool_free(ts_params->session_mpool);
13117 			ts_params->session_mpool = NULL;
13118 		}
13119 		if (ts_params->session_priv_mpool) {
13120 			rte_mempool_free(ts_params->session_priv_mpool);
13121 			ts_params->session_priv_mpool = NULL;
13122 		}
13123 
13124 		if (info.sym.max_nb_sessions != 0 &&
13125 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13126 			RTE_LOG(ERR, USER1,
13127 					"Device does not support "
13128 					"at least %u sessions\n",
13129 					MAX_NB_SESSIONS);
13130 			return TEST_FAILED;
13131 		}
13132 		/*
13133 		 * Create mempool with maximum number of sessions,
13134 		 * to include the session headers
13135 		 */
13136 		if (ts_params->session_mpool == NULL) {
13137 			ts_params->session_mpool =
13138 				rte_cryptodev_sym_session_pool_create(
13139 						"test_sess_mp",
13140 						MAX_NB_SESSIONS, 0, 0, 0,
13141 						SOCKET_ID_ANY);
13142 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13143 					"session mempool allocation failed");
13144 		}
13145 
13146 		/*
13147 		 * Create mempool with maximum number of sessions,
13148 		 * to include device specific session private data
13149 		 */
13150 		if (ts_params->session_priv_mpool == NULL) {
13151 			ts_params->session_priv_mpool = rte_mempool_create(
13152 					"test_sess_mp_priv",
13153 					MAX_NB_SESSIONS,
13154 					session_size,
13155 					0, 0, NULL, NULL, NULL,
13156 					NULL, SOCKET_ID_ANY,
13157 					0);
13158 
13159 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13160 					"session mempool allocation failed");
13161 		}
13162 
13163 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
13164 		ts_params->qp_conf.mp_session_private =
13165 				ts_params->session_priv_mpool;
13166 
13167 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13168 				(uint8_t)i);
13169 
13170 		TEST_ASSERT(ret == 0,
13171 			"Failed to attach device %u of pmd : %s", i,
13172 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13173 
13174 		aesni_ids[nb_devs_attached] = (uint8_t)i;
13175 
13176 		nb_devs_attached++;
13177 	}
13178 
13179 	return 0;
13180 }
13181 
13182 static int
13183 test_scheduler_detach_slave_op(void)
13184 {
13185 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13186 	uint8_t sched_id = ts_params->valid_devs[0];
13187 	uint32_t i;
13188 	int ret;
13189 
13190 	for (i = 0; i < 2; i++) {
13191 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13192 				aesni_ids[i]);
13193 		TEST_ASSERT(ret == 0,
13194 			"Failed to detach device %u", aesni_ids[i]);
13195 	}
13196 
13197 	return 0;
13198 }
13199 
13200 static int
13201 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13202 {
13203 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13204 	uint8_t sched_id = ts_params->valid_devs[0];
13205 	/* set mode */
13206 	return rte_cryptodev_scheduler_mode_set(sched_id,
13207 		scheduler_mode);
13208 }
13209 
13210 static int
13211 test_scheduler_mode_roundrobin_op(void)
13212 {
13213 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13214 			0, "Failed to set roundrobin mode");
13215 	return 0;
13216 
13217 }
13218 
13219 static int
13220 test_scheduler_mode_multicore_op(void)
13221 {
13222 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13223 			0, "Failed to set multicore mode");
13224 
13225 	return 0;
13226 }
13227 
13228 static int
13229 test_scheduler_mode_failover_op(void)
13230 {
13231 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13232 			0, "Failed to set failover mode");
13233 
13234 	return 0;
13235 }
13236 
13237 static int
13238 test_scheduler_mode_pkt_size_distr_op(void)
13239 {
13240 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13241 			0, "Failed to set pktsize mode");
13242 
13243 	return 0;
13244 }
13245 
13246 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
13247 	.suite_name = "Crypto Device Scheduler Unit Test Suite",
13248 	.setup = testsuite_setup,
13249 	.teardown = testsuite_teardown,
13250 	.unit_test_cases = {
13251 		/* Multi Core */
13252 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13253 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13254 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13255 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13256 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13257 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13258 
13259 		/* Round Robin */
13260 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13261 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13262 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13263 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13264 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13265 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13266 
13267 		/* Fail over */
13268 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13269 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13270 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13271 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13272 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13273 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13274 
13275 		/* PKT SIZE */
13276 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13277 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13278 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13279 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13280 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13281 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13282 
13283 		TEST_CASES_END() /**< NULL terminate unit test array */
13284 	}
13285 };
13286 
13287 #endif /* RTE_CRYPTO_SCHEDULER */
13288 
13289 static struct unit_test_suite cryptodev_testsuite  = {
13290 	.suite_name = "Crypto Unit Test Suite",
13291 	.setup = testsuite_setup,
13292 	.teardown = testsuite_teardown,
13293 	.unit_test_cases = {
13294 		TEST_CASE_ST(ut_setup, ut_teardown,
13295 				test_device_configure_invalid_dev_id),
13296 		TEST_CASE_ST(ut_setup, ut_teardown,
13297 				test_queue_pair_descriptor_setup),
13298 		TEST_CASE_ST(ut_setup, ut_teardown,
13299 				test_device_configure_invalid_queue_pair_ids),
13300 		TEST_CASE_ST(ut_setup, ut_teardown,
13301 				test_multi_session),
13302 		TEST_CASE_ST(ut_setup, ut_teardown,
13303 				test_multi_session_random_usage),
13304 
13305 		TEST_CASE_ST(ut_setup, ut_teardown,
13306 			test_null_invalid_operation),
13307 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13308 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13309 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13310 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13311 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13312 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13313 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13314 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13315 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13316 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13317 
13318 		/** AES CCM Authenticated Encryption 128 bits key */
13319 		TEST_CASE_ST(ut_setup, ut_teardown,
13320 			test_AES_CCM_authenticated_encryption_test_case_128_1),
13321 		TEST_CASE_ST(ut_setup, ut_teardown,
13322 			test_AES_CCM_authenticated_encryption_test_case_128_2),
13323 		TEST_CASE_ST(ut_setup, ut_teardown,
13324 			test_AES_CCM_authenticated_encryption_test_case_128_3),
13325 
13326 		/** AES CCM Authenticated Decryption 128 bits key*/
13327 		TEST_CASE_ST(ut_setup, ut_teardown,
13328 			test_AES_CCM_authenticated_decryption_test_case_128_1),
13329 		TEST_CASE_ST(ut_setup, ut_teardown,
13330 			test_AES_CCM_authenticated_decryption_test_case_128_2),
13331 		TEST_CASE_ST(ut_setup, ut_teardown,
13332 			test_AES_CCM_authenticated_decryption_test_case_128_3),
13333 
13334 		/** AES CCM Authenticated Encryption 192 bits key */
13335 		TEST_CASE_ST(ut_setup, ut_teardown,
13336 			test_AES_CCM_authenticated_encryption_test_case_192_1),
13337 		TEST_CASE_ST(ut_setup, ut_teardown,
13338 			test_AES_CCM_authenticated_encryption_test_case_192_2),
13339 		TEST_CASE_ST(ut_setup, ut_teardown,
13340 			test_AES_CCM_authenticated_encryption_test_case_192_3),
13341 
13342 		/** AES CCM Authenticated Decryption 192 bits key*/
13343 		TEST_CASE_ST(ut_setup, ut_teardown,
13344 			test_AES_CCM_authenticated_decryption_test_case_192_1),
13345 		TEST_CASE_ST(ut_setup, ut_teardown,
13346 			test_AES_CCM_authenticated_decryption_test_case_192_2),
13347 		TEST_CASE_ST(ut_setup, ut_teardown,
13348 			test_AES_CCM_authenticated_decryption_test_case_192_3),
13349 
13350 		/** AES CCM Authenticated Encryption 256 bits key */
13351 		TEST_CASE_ST(ut_setup, ut_teardown,
13352 			test_AES_CCM_authenticated_encryption_test_case_256_1),
13353 		TEST_CASE_ST(ut_setup, ut_teardown,
13354 			test_AES_CCM_authenticated_encryption_test_case_256_2),
13355 		TEST_CASE_ST(ut_setup, ut_teardown,
13356 			test_AES_CCM_authenticated_encryption_test_case_256_3),
13357 
13358 		/** AES CCM Authenticated Decryption 256 bits key*/
13359 		TEST_CASE_ST(ut_setup, ut_teardown,
13360 			test_AES_CCM_authenticated_decryption_test_case_256_1),
13361 		TEST_CASE_ST(ut_setup, ut_teardown,
13362 			test_AES_CCM_authenticated_decryption_test_case_256_2),
13363 		TEST_CASE_ST(ut_setup, ut_teardown,
13364 			test_AES_CCM_authenticated_decryption_test_case_256_3),
13365 
13366 		/** AES GCM Authenticated Encryption */
13367 		TEST_CASE_ST(ut_setup, ut_teardown,
13368 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13369 		TEST_CASE_ST(ut_setup, ut_teardown,
13370 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13371 		TEST_CASE_ST(ut_setup, ut_teardown,
13372 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13373 		TEST_CASE_ST(ut_setup, ut_teardown,
13374 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13375 		TEST_CASE_ST(ut_setup, ut_teardown,
13376 			test_AES_GCM_authenticated_encryption_test_case_1),
13377 		TEST_CASE_ST(ut_setup, ut_teardown,
13378 			test_AES_GCM_authenticated_encryption_test_case_2),
13379 		TEST_CASE_ST(ut_setup, ut_teardown,
13380 			test_AES_GCM_authenticated_encryption_test_case_3),
13381 		TEST_CASE_ST(ut_setup, ut_teardown,
13382 			test_AES_GCM_authenticated_encryption_test_case_4),
13383 		TEST_CASE_ST(ut_setup, ut_teardown,
13384 			test_AES_GCM_authenticated_encryption_test_case_5),
13385 		TEST_CASE_ST(ut_setup, ut_teardown,
13386 			test_AES_GCM_authenticated_encryption_test_case_6),
13387 		TEST_CASE_ST(ut_setup, ut_teardown,
13388 			test_AES_GCM_authenticated_encryption_test_case_7),
13389 		TEST_CASE_ST(ut_setup, ut_teardown,
13390 			test_AES_GCM_authenticated_encryption_test_case_8),
13391 		TEST_CASE_ST(ut_setup, ut_teardown,
13392 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
13393 
13394 		/** AES GCM Authenticated Decryption */
13395 		TEST_CASE_ST(ut_setup, ut_teardown,
13396 			test_AES_GCM_authenticated_decryption_test_case_1),
13397 		TEST_CASE_ST(ut_setup, ut_teardown,
13398 			test_AES_GCM_authenticated_decryption_test_case_2),
13399 		TEST_CASE_ST(ut_setup, ut_teardown,
13400 			test_AES_GCM_authenticated_decryption_test_case_3),
13401 		TEST_CASE_ST(ut_setup, ut_teardown,
13402 			test_AES_GCM_authenticated_decryption_test_case_4),
13403 		TEST_CASE_ST(ut_setup, ut_teardown,
13404 			test_AES_GCM_authenticated_decryption_test_case_5),
13405 		TEST_CASE_ST(ut_setup, ut_teardown,
13406 			test_AES_GCM_authenticated_decryption_test_case_6),
13407 		TEST_CASE_ST(ut_setup, ut_teardown,
13408 			test_AES_GCM_authenticated_decryption_test_case_7),
13409 		TEST_CASE_ST(ut_setup, ut_teardown,
13410 			test_AES_GCM_authenticated_decryption_test_case_8),
13411 		TEST_CASE_ST(ut_setup, ut_teardown,
13412 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
13413 
13414 		/** AES GCM Authenticated Encryption 192 bits key */
13415 		TEST_CASE_ST(ut_setup, ut_teardown,
13416 			test_AES_GCM_auth_encryption_test_case_192_1),
13417 		TEST_CASE_ST(ut_setup, ut_teardown,
13418 			test_AES_GCM_auth_encryption_test_case_192_2),
13419 		TEST_CASE_ST(ut_setup, ut_teardown,
13420 			test_AES_GCM_auth_encryption_test_case_192_3),
13421 		TEST_CASE_ST(ut_setup, ut_teardown,
13422 			test_AES_GCM_auth_encryption_test_case_192_4),
13423 		TEST_CASE_ST(ut_setup, ut_teardown,
13424 			test_AES_GCM_auth_encryption_test_case_192_5),
13425 		TEST_CASE_ST(ut_setup, ut_teardown,
13426 			test_AES_GCM_auth_encryption_test_case_192_6),
13427 		TEST_CASE_ST(ut_setup, ut_teardown,
13428 			test_AES_GCM_auth_encryption_test_case_192_7),
13429 
13430 		/** AES GCM Authenticated Decryption 192 bits key */
13431 		TEST_CASE_ST(ut_setup, ut_teardown,
13432 			test_AES_GCM_auth_decryption_test_case_192_1),
13433 		TEST_CASE_ST(ut_setup, ut_teardown,
13434 			test_AES_GCM_auth_decryption_test_case_192_2),
13435 		TEST_CASE_ST(ut_setup, ut_teardown,
13436 			test_AES_GCM_auth_decryption_test_case_192_3),
13437 		TEST_CASE_ST(ut_setup, ut_teardown,
13438 			test_AES_GCM_auth_decryption_test_case_192_4),
13439 		TEST_CASE_ST(ut_setup, ut_teardown,
13440 			test_AES_GCM_auth_decryption_test_case_192_5),
13441 		TEST_CASE_ST(ut_setup, ut_teardown,
13442 			test_AES_GCM_auth_decryption_test_case_192_6),
13443 		TEST_CASE_ST(ut_setup, ut_teardown,
13444 			test_AES_GCM_auth_decryption_test_case_192_7),
13445 
13446 		/** AES GCM Authenticated Encryption 256 bits key */
13447 		TEST_CASE_ST(ut_setup, ut_teardown,
13448 			test_AES_GCM_auth_encryption_test_case_256_1),
13449 		TEST_CASE_ST(ut_setup, ut_teardown,
13450 			test_AES_GCM_auth_encryption_test_case_256_2),
13451 		TEST_CASE_ST(ut_setup, ut_teardown,
13452 			test_AES_GCM_auth_encryption_test_case_256_3),
13453 		TEST_CASE_ST(ut_setup, ut_teardown,
13454 			test_AES_GCM_auth_encryption_test_case_256_4),
13455 		TEST_CASE_ST(ut_setup, ut_teardown,
13456 			test_AES_GCM_auth_encryption_test_case_256_5),
13457 		TEST_CASE_ST(ut_setup, ut_teardown,
13458 			test_AES_GCM_auth_encryption_test_case_256_6),
13459 		TEST_CASE_ST(ut_setup, ut_teardown,
13460 			test_AES_GCM_auth_encryption_test_case_256_7),
13461 
13462 		/** AES GCM Authenticated Decryption 256 bits key */
13463 		TEST_CASE_ST(ut_setup, ut_teardown,
13464 			test_AES_GCM_auth_decryption_test_case_256_1),
13465 		TEST_CASE_ST(ut_setup, ut_teardown,
13466 			test_AES_GCM_auth_decryption_test_case_256_2),
13467 		TEST_CASE_ST(ut_setup, ut_teardown,
13468 			test_AES_GCM_auth_decryption_test_case_256_3),
13469 		TEST_CASE_ST(ut_setup, ut_teardown,
13470 			test_AES_GCM_auth_decryption_test_case_256_4),
13471 		TEST_CASE_ST(ut_setup, ut_teardown,
13472 			test_AES_GCM_auth_decryption_test_case_256_5),
13473 		TEST_CASE_ST(ut_setup, ut_teardown,
13474 			test_AES_GCM_auth_decryption_test_case_256_6),
13475 		TEST_CASE_ST(ut_setup, ut_teardown,
13476 			test_AES_GCM_auth_decryption_test_case_256_7),
13477 
13478 		/** AES GCM Authenticated Encryption big aad size */
13479 		TEST_CASE_ST(ut_setup, ut_teardown,
13480 			test_AES_GCM_auth_encryption_test_case_aad_1),
13481 		TEST_CASE_ST(ut_setup, ut_teardown,
13482 			test_AES_GCM_auth_encryption_test_case_aad_2),
13483 
13484 		/** AES GCM Authenticated Decryption big aad size */
13485 		TEST_CASE_ST(ut_setup, ut_teardown,
13486 			test_AES_GCM_auth_decryption_test_case_aad_1),
13487 		TEST_CASE_ST(ut_setup, ut_teardown,
13488 			test_AES_GCM_auth_decryption_test_case_aad_2),
13489 
13490 		/** Out of place tests */
13491 		TEST_CASE_ST(ut_setup, ut_teardown,
13492 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13493 		TEST_CASE_ST(ut_setup, ut_teardown,
13494 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13495 
13496 		/** Session-less tests */
13497 		TEST_CASE_ST(ut_setup, ut_teardown,
13498 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13499 		TEST_CASE_ST(ut_setup, ut_teardown,
13500 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13501 
13502 		/** AES GMAC Authentication */
13503 		TEST_CASE_ST(ut_setup, ut_teardown,
13504 			test_AES_GMAC_authentication_test_case_1),
13505 		TEST_CASE_ST(ut_setup, ut_teardown,
13506 			test_AES_GMAC_authentication_verify_test_case_1),
13507 		TEST_CASE_ST(ut_setup, ut_teardown,
13508 			test_AES_GMAC_authentication_test_case_2),
13509 		TEST_CASE_ST(ut_setup, ut_teardown,
13510 			test_AES_GMAC_authentication_verify_test_case_2),
13511 		TEST_CASE_ST(ut_setup, ut_teardown,
13512 			test_AES_GMAC_authentication_test_case_3),
13513 		TEST_CASE_ST(ut_setup, ut_teardown,
13514 			test_AES_GMAC_authentication_verify_test_case_3),
13515 		TEST_CASE_ST(ut_setup, ut_teardown,
13516 			test_AES_GMAC_authentication_test_case_4),
13517 		TEST_CASE_ST(ut_setup, ut_teardown,
13518 			test_AES_GMAC_authentication_verify_test_case_4),
13519 		TEST_CASE_ST(ut_setup, ut_teardown,
13520 			test_AES_GMAC_authentication_SGL_40B),
13521 		TEST_CASE_ST(ut_setup, ut_teardown,
13522 			test_AES_GMAC_authentication_SGL_80B),
13523 		TEST_CASE_ST(ut_setup, ut_teardown,
13524 			test_AES_GMAC_authentication_SGL_2048B),
13525 		TEST_CASE_ST(ut_setup, ut_teardown,
13526 			test_AES_GMAC_authentication_SGL_2047B),
13527 
13528 		/** Chacha20-Poly1305 */
13529 		TEST_CASE_ST(ut_setup, ut_teardown,
13530 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
13531 		TEST_CASE_ST(ut_setup, ut_teardown,
13532 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
13533 		/** SNOW 3G encrypt only (UEA2) */
13534 		TEST_CASE_ST(ut_setup, ut_teardown,
13535 			test_snow3g_encryption_test_case_1),
13536 		TEST_CASE_ST(ut_setup, ut_teardown,
13537 			test_snow3g_encryption_test_case_2),
13538 		TEST_CASE_ST(ut_setup, ut_teardown,
13539 			test_snow3g_encryption_test_case_3),
13540 		TEST_CASE_ST(ut_setup, ut_teardown,
13541 			test_snow3g_encryption_test_case_4),
13542 		TEST_CASE_ST(ut_setup, ut_teardown,
13543 			test_snow3g_encryption_test_case_5),
13544 
13545 		TEST_CASE_ST(ut_setup, ut_teardown,
13546 			test_snow3g_encryption_test_case_1_oop),
13547 		TEST_CASE_ST(ut_setup, ut_teardown,
13548 			test_snow3g_encryption_test_case_1_oop_sgl),
13549 		TEST_CASE_ST(ut_setup, ut_teardown,
13550 			test_snow3g_encryption_test_case_1_offset_oop),
13551 		TEST_CASE_ST(ut_setup, ut_teardown,
13552 			test_snow3g_decryption_test_case_1_oop),
13553 
13554 		/** SNOW 3G generate auth, then encrypt (UEA2) */
13555 		TEST_CASE_ST(ut_setup, ut_teardown,
13556 			test_snow3g_auth_cipher_test_case_1),
13557 		TEST_CASE_ST(ut_setup, ut_teardown,
13558 			test_snow3g_auth_cipher_test_case_2),
13559 		TEST_CASE_ST(ut_setup, ut_teardown,
13560 			test_snow3g_auth_cipher_test_case_2_oop),
13561 		TEST_CASE_ST(ut_setup, ut_teardown,
13562 			test_snow3g_auth_cipher_part_digest_enc),
13563 		TEST_CASE_ST(ut_setup, ut_teardown,
13564 			test_snow3g_auth_cipher_part_digest_enc_oop),
13565 		TEST_CASE_ST(ut_setup, ut_teardown,
13566 			test_snow3g_auth_cipher_test_case_3_sgl),
13567 		TEST_CASE_ST(ut_setup, ut_teardown,
13568 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
13569 		TEST_CASE_ST(ut_setup, ut_teardown,
13570 			test_snow3g_auth_cipher_part_digest_enc_sgl),
13571 		TEST_CASE_ST(ut_setup, ut_teardown,
13572 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13573 
13574 		/** SNOW 3G decrypt (UEA2), then verify auth */
13575 		TEST_CASE_ST(ut_setup, ut_teardown,
13576 			test_snow3g_auth_cipher_verify_test_case_1),
13577 		TEST_CASE_ST(ut_setup, ut_teardown,
13578 			test_snow3g_auth_cipher_verify_test_case_2),
13579 		TEST_CASE_ST(ut_setup, ut_teardown,
13580 			test_snow3g_auth_cipher_verify_test_case_2_oop),
13581 		TEST_CASE_ST(ut_setup, ut_teardown,
13582 			test_snow3g_auth_cipher_verify_part_digest_enc),
13583 		TEST_CASE_ST(ut_setup, ut_teardown,
13584 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13585 		TEST_CASE_ST(ut_setup, ut_teardown,
13586 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
13587 		TEST_CASE_ST(ut_setup, ut_teardown,
13588 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13589 		TEST_CASE_ST(ut_setup, ut_teardown,
13590 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13591 		TEST_CASE_ST(ut_setup, ut_teardown,
13592 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13593 
13594 		/** SNOW 3G decrypt only (UEA2) */
13595 		TEST_CASE_ST(ut_setup, ut_teardown,
13596 			test_snow3g_decryption_test_case_1),
13597 		TEST_CASE_ST(ut_setup, ut_teardown,
13598 			test_snow3g_decryption_test_case_2),
13599 		TEST_CASE_ST(ut_setup, ut_teardown,
13600 			test_snow3g_decryption_test_case_3),
13601 		TEST_CASE_ST(ut_setup, ut_teardown,
13602 			test_snow3g_decryption_test_case_4),
13603 		TEST_CASE_ST(ut_setup, ut_teardown,
13604 			test_snow3g_decryption_test_case_5),
13605 		TEST_CASE_ST(ut_setup, ut_teardown,
13606 			test_snow3g_decryption_with_digest_test_case_1),
13607 		TEST_CASE_ST(ut_setup, ut_teardown,
13608 			test_snow3g_hash_generate_test_case_1),
13609 		TEST_CASE_ST(ut_setup, ut_teardown,
13610 			test_snow3g_hash_generate_test_case_2),
13611 		TEST_CASE_ST(ut_setup, ut_teardown,
13612 			test_snow3g_hash_generate_test_case_3),
13613 		/* Tests with buffers which length is not byte-aligned */
13614 		TEST_CASE_ST(ut_setup, ut_teardown,
13615 			test_snow3g_hash_generate_test_case_4),
13616 		TEST_CASE_ST(ut_setup, ut_teardown,
13617 			test_snow3g_hash_generate_test_case_5),
13618 		TEST_CASE_ST(ut_setup, ut_teardown,
13619 			test_snow3g_hash_generate_test_case_6),
13620 		TEST_CASE_ST(ut_setup, ut_teardown,
13621 			test_snow3g_hash_verify_test_case_1),
13622 		TEST_CASE_ST(ut_setup, ut_teardown,
13623 			test_snow3g_hash_verify_test_case_2),
13624 		TEST_CASE_ST(ut_setup, ut_teardown,
13625 			test_snow3g_hash_verify_test_case_3),
13626 		/* Tests with buffers which length is not byte-aligned */
13627 		TEST_CASE_ST(ut_setup, ut_teardown,
13628 			test_snow3g_hash_verify_test_case_4),
13629 		TEST_CASE_ST(ut_setup, ut_teardown,
13630 			test_snow3g_hash_verify_test_case_5),
13631 		TEST_CASE_ST(ut_setup, ut_teardown,
13632 			test_snow3g_hash_verify_test_case_6),
13633 		TEST_CASE_ST(ut_setup, ut_teardown,
13634 			test_snow3g_cipher_auth_test_case_1),
13635 		TEST_CASE_ST(ut_setup, ut_teardown,
13636 			test_snow3g_auth_cipher_with_digest_test_case_1),
13637 
13638 		/** ZUC encrypt only (EEA3) */
13639 		TEST_CASE_ST(ut_setup, ut_teardown,
13640 			test_zuc_encryption_test_case_1),
13641 		TEST_CASE_ST(ut_setup, ut_teardown,
13642 			test_zuc_encryption_test_case_2),
13643 		TEST_CASE_ST(ut_setup, ut_teardown,
13644 			test_zuc_encryption_test_case_3),
13645 		TEST_CASE_ST(ut_setup, ut_teardown,
13646 			test_zuc_encryption_test_case_4),
13647 		TEST_CASE_ST(ut_setup, ut_teardown,
13648 			test_zuc_encryption_test_case_5),
13649 		TEST_CASE_ST(ut_setup, ut_teardown,
13650 			test_zuc_encryption_test_case_6_sgl),
13651 
13652 		/** ZUC authenticate (EIA3) */
13653 		TEST_CASE_ST(ut_setup, ut_teardown,
13654 			test_zuc_hash_generate_test_case_1),
13655 		TEST_CASE_ST(ut_setup, ut_teardown,
13656 			test_zuc_hash_generate_test_case_2),
13657 		TEST_CASE_ST(ut_setup, ut_teardown,
13658 			test_zuc_hash_generate_test_case_3),
13659 		TEST_CASE_ST(ut_setup, ut_teardown,
13660 			test_zuc_hash_generate_test_case_4),
13661 		TEST_CASE_ST(ut_setup, ut_teardown,
13662 			test_zuc_hash_generate_test_case_5),
13663 		TEST_CASE_ST(ut_setup, ut_teardown,
13664 			test_zuc_hash_generate_test_case_6),
13665 		TEST_CASE_ST(ut_setup, ut_teardown,
13666 			test_zuc_hash_generate_test_case_7),
13667 		TEST_CASE_ST(ut_setup, ut_teardown,
13668 			test_zuc_hash_generate_test_case_8),
13669 
13670 		/** ZUC alg-chain (EEA3/EIA3) */
13671 		TEST_CASE_ST(ut_setup, ut_teardown,
13672 			test_zuc_cipher_auth_test_case_1),
13673 		TEST_CASE_ST(ut_setup, ut_teardown,
13674 			test_zuc_cipher_auth_test_case_2),
13675 
13676 		/** ZUC generate auth, then encrypt (EEA3) */
13677 		TEST_CASE_ST(ut_setup, ut_teardown,
13678 			test_zuc_auth_cipher_test_case_1),
13679 		TEST_CASE_ST(ut_setup, ut_teardown,
13680 			test_zuc_auth_cipher_test_case_1_oop),
13681 		TEST_CASE_ST(ut_setup, ut_teardown,
13682 			test_zuc_auth_cipher_test_case_1_sgl),
13683 		TEST_CASE_ST(ut_setup, ut_teardown,
13684 			test_zuc_auth_cipher_test_case_1_oop_sgl),
13685 
13686 		/** ZUC decrypt (EEA3), then verify auth */
13687 		TEST_CASE_ST(ut_setup, ut_teardown,
13688 			test_zuc_auth_cipher_verify_test_case_1),
13689 		TEST_CASE_ST(ut_setup, ut_teardown,
13690 			test_zuc_auth_cipher_verify_test_case_1_oop),
13691 		TEST_CASE_ST(ut_setup, ut_teardown,
13692 			test_zuc_auth_cipher_verify_test_case_1_sgl),
13693 		TEST_CASE_ST(ut_setup, ut_teardown,
13694 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13695 
13696 		/** HMAC_MD5 Authentication */
13697 		TEST_CASE_ST(ut_setup, ut_teardown,
13698 			test_MD5_HMAC_generate_case_1),
13699 		TEST_CASE_ST(ut_setup, ut_teardown,
13700 			test_MD5_HMAC_verify_case_1),
13701 		TEST_CASE_ST(ut_setup, ut_teardown,
13702 			test_MD5_HMAC_generate_case_2),
13703 		TEST_CASE_ST(ut_setup, ut_teardown,
13704 			test_MD5_HMAC_verify_case_2),
13705 
13706 		/** KASUMI hash only (UIA1) */
13707 		TEST_CASE_ST(ut_setup, ut_teardown,
13708 			test_kasumi_hash_generate_test_case_1),
13709 		TEST_CASE_ST(ut_setup, ut_teardown,
13710 			test_kasumi_hash_generate_test_case_2),
13711 		TEST_CASE_ST(ut_setup, ut_teardown,
13712 			test_kasumi_hash_generate_test_case_3),
13713 		TEST_CASE_ST(ut_setup, ut_teardown,
13714 			test_kasumi_hash_generate_test_case_4),
13715 		TEST_CASE_ST(ut_setup, ut_teardown,
13716 			test_kasumi_hash_generate_test_case_5),
13717 		TEST_CASE_ST(ut_setup, ut_teardown,
13718 			test_kasumi_hash_generate_test_case_6),
13719 
13720 		TEST_CASE_ST(ut_setup, ut_teardown,
13721 			test_kasumi_hash_verify_test_case_1),
13722 		TEST_CASE_ST(ut_setup, ut_teardown,
13723 			test_kasumi_hash_verify_test_case_2),
13724 		TEST_CASE_ST(ut_setup, ut_teardown,
13725 			test_kasumi_hash_verify_test_case_3),
13726 		TEST_CASE_ST(ut_setup, ut_teardown,
13727 			test_kasumi_hash_verify_test_case_4),
13728 		TEST_CASE_ST(ut_setup, ut_teardown,
13729 			test_kasumi_hash_verify_test_case_5),
13730 
13731 		/** KASUMI encrypt only (UEA1) */
13732 		TEST_CASE_ST(ut_setup, ut_teardown,
13733 			test_kasumi_encryption_test_case_1),
13734 		TEST_CASE_ST(ut_setup, ut_teardown,
13735 			test_kasumi_encryption_test_case_1_sgl),
13736 		TEST_CASE_ST(ut_setup, ut_teardown,
13737 			test_kasumi_encryption_test_case_1_oop),
13738 		TEST_CASE_ST(ut_setup, ut_teardown,
13739 			test_kasumi_encryption_test_case_1_oop_sgl),
13740 		TEST_CASE_ST(ut_setup, ut_teardown,
13741 			test_kasumi_encryption_test_case_2),
13742 		TEST_CASE_ST(ut_setup, ut_teardown,
13743 			test_kasumi_encryption_test_case_3),
13744 		TEST_CASE_ST(ut_setup, ut_teardown,
13745 			test_kasumi_encryption_test_case_4),
13746 		TEST_CASE_ST(ut_setup, ut_teardown,
13747 			test_kasumi_encryption_test_case_5),
13748 
13749 		/** KASUMI decrypt only (UEA1) */
13750 		TEST_CASE_ST(ut_setup, ut_teardown,
13751 			test_kasumi_decryption_test_case_1),
13752 		TEST_CASE_ST(ut_setup, ut_teardown,
13753 			test_kasumi_decryption_test_case_2),
13754 		TEST_CASE_ST(ut_setup, ut_teardown,
13755 			test_kasumi_decryption_test_case_3),
13756 		TEST_CASE_ST(ut_setup, ut_teardown,
13757 			test_kasumi_decryption_test_case_4),
13758 		TEST_CASE_ST(ut_setup, ut_teardown,
13759 			test_kasumi_decryption_test_case_5),
13760 		TEST_CASE_ST(ut_setup, ut_teardown,
13761 			test_kasumi_decryption_test_case_1_oop),
13762 
13763 		TEST_CASE_ST(ut_setup, ut_teardown,
13764 			test_kasumi_cipher_auth_test_case_1),
13765 
13766 		/** KASUMI generate auth, then encrypt (F8) */
13767 		TEST_CASE_ST(ut_setup, ut_teardown,
13768 			test_kasumi_auth_cipher_test_case_1),
13769 		TEST_CASE_ST(ut_setup, ut_teardown,
13770 			test_kasumi_auth_cipher_test_case_2),
13771 		TEST_CASE_ST(ut_setup, ut_teardown,
13772 			test_kasumi_auth_cipher_test_case_2_oop),
13773 		TEST_CASE_ST(ut_setup, ut_teardown,
13774 			test_kasumi_auth_cipher_test_case_2_sgl),
13775 		TEST_CASE_ST(ut_setup, ut_teardown,
13776 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
13777 
13778 		/** KASUMI decrypt (F8), then verify auth */
13779 		TEST_CASE_ST(ut_setup, ut_teardown,
13780 			test_kasumi_auth_cipher_verify_test_case_1),
13781 		TEST_CASE_ST(ut_setup, ut_teardown,
13782 			test_kasumi_auth_cipher_verify_test_case_2),
13783 		TEST_CASE_ST(ut_setup, ut_teardown,
13784 			test_kasumi_auth_cipher_verify_test_case_2_oop),
13785 		TEST_CASE_ST(ut_setup, ut_teardown,
13786 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
13787 		TEST_CASE_ST(ut_setup, ut_teardown,
13788 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13789 
13790 		/** ESN Testcase */
13791 		TEST_CASE_ST(ut_setup, ut_teardown,
13792 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13793 		TEST_CASE_ST(ut_setup, ut_teardown,
13794 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13795 
13796 		/** Negative tests */
13797 		TEST_CASE_ST(ut_setup, ut_teardown,
13798 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13799 		TEST_CASE_ST(ut_setup, ut_teardown,
13800 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13801 		TEST_CASE_ST(ut_setup, ut_teardown,
13802 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
13803 		TEST_CASE_ST(ut_setup, ut_teardown,
13804 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13805 		TEST_CASE_ST(ut_setup, ut_teardown,
13806 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13807 		TEST_CASE_ST(ut_setup, ut_teardown,
13808 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13809 		TEST_CASE_ST(ut_setup, ut_teardown,
13810 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
13811 		TEST_CASE_ST(ut_setup, ut_teardown,
13812 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
13813 		TEST_CASE_ST(ut_setup, ut_teardown,
13814 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
13815 		TEST_CASE_ST(ut_setup, ut_teardown,
13816 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13817 		TEST_CASE_ST(ut_setup, ut_teardown,
13818 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13819 		TEST_CASE_ST(ut_setup, ut_teardown,
13820 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13821 		TEST_CASE_ST(ut_setup, ut_teardown,
13822 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
13823 		TEST_CASE_ST(ut_setup, ut_teardown,
13824 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
13825 		TEST_CASE_ST(ut_setup, ut_teardown,
13826 			authentication_verify_AES128_GMAC_fail_data_corrupt),
13827 		TEST_CASE_ST(ut_setup, ut_teardown,
13828 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
13829 		TEST_CASE_ST(ut_setup, ut_teardown,
13830 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13831 		TEST_CASE_ST(ut_setup, ut_teardown,
13832 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13833 
13834 		/** Mixed CIPHER + HASH algorithms */
13835 		/** AUTH AES CMAC + CIPHER AES CTR */
13836 		TEST_CASE_ST(ut_setup, ut_teardown,
13837 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13838 		TEST_CASE_ST(ut_setup, ut_teardown,
13839 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13840 		TEST_CASE_ST(ut_setup, ut_teardown,
13841 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13842 		TEST_CASE_ST(ut_setup, ut_teardown,
13843 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13844 		TEST_CASE_ST(ut_setup, ut_teardown,
13845 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13846 		TEST_CASE_ST(ut_setup, ut_teardown,
13847 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13848 		TEST_CASE_ST(ut_setup, ut_teardown,
13849 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13850 		TEST_CASE_ST(ut_setup, ut_teardown,
13851 		   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13852 
13853 		/** AUTH ZUC + CIPHER SNOW3G */
13854 		TEST_CASE_ST(ut_setup, ut_teardown,
13855 			test_auth_zuc_cipher_snow_test_case_1),
13856 		TEST_CASE_ST(ut_setup, ut_teardown,
13857 			test_verify_auth_zuc_cipher_snow_test_case_1),
13858 		/** AUTH AES CMAC + CIPHER SNOW3G */
13859 		TEST_CASE_ST(ut_setup, ut_teardown,
13860 			test_auth_aes_cmac_cipher_snow_test_case_1),
13861 		TEST_CASE_ST(ut_setup, ut_teardown,
13862 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13863 		/** AUTH ZUC + CIPHER AES CTR */
13864 		TEST_CASE_ST(ut_setup, ut_teardown,
13865 			test_auth_zuc_cipher_aes_ctr_test_case_1),
13866 		TEST_CASE_ST(ut_setup, ut_teardown,
13867 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13868 		/** AUTH SNOW3G + CIPHER AES CTR */
13869 		TEST_CASE_ST(ut_setup, ut_teardown,
13870 			test_auth_snow_cipher_aes_ctr_test_case_1),
13871 		TEST_CASE_ST(ut_setup, ut_teardown,
13872 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13873 		/** AUTH SNOW3G + CIPHER ZUC */
13874 		TEST_CASE_ST(ut_setup, ut_teardown,
13875 			test_auth_snow_cipher_zuc_test_case_1),
13876 		TEST_CASE_ST(ut_setup, ut_teardown,
13877 			test_verify_auth_snow_cipher_zuc_test_case_1),
13878 		/** AUTH AES CMAC + CIPHER ZUC */
13879 		TEST_CASE_ST(ut_setup, ut_teardown,
13880 			test_auth_aes_cmac_cipher_zuc_test_case_1),
13881 		TEST_CASE_ST(ut_setup, ut_teardown,
13882 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13883 
13884 		/** AUTH NULL + CIPHER SNOW3G */
13885 		TEST_CASE_ST(ut_setup, ut_teardown,
13886 			test_auth_null_cipher_snow_test_case_1),
13887 		TEST_CASE_ST(ut_setup, ut_teardown,
13888 			test_verify_auth_null_cipher_snow_test_case_1),
13889 		/** AUTH NULL + CIPHER ZUC */
13890 		TEST_CASE_ST(ut_setup, ut_teardown,
13891 			test_auth_null_cipher_zuc_test_case_1),
13892 		TEST_CASE_ST(ut_setup, ut_teardown,
13893 			test_verify_auth_null_cipher_zuc_test_case_1),
13894 		/** AUTH SNOW3G + CIPHER NULL */
13895 		TEST_CASE_ST(ut_setup, ut_teardown,
13896 			test_auth_snow_cipher_null_test_case_1),
13897 		TEST_CASE_ST(ut_setup, ut_teardown,
13898 			test_verify_auth_snow_cipher_null_test_case_1),
13899 		/** AUTH ZUC + CIPHER NULL */
13900 		TEST_CASE_ST(ut_setup, ut_teardown,
13901 			test_auth_zuc_cipher_null_test_case_1),
13902 		TEST_CASE_ST(ut_setup, ut_teardown,
13903 			test_verify_auth_zuc_cipher_null_test_case_1),
13904 		/** AUTH NULL + CIPHER AES CTR */
13905 		TEST_CASE_ST(ut_setup, ut_teardown,
13906 			test_auth_null_cipher_aes_ctr_test_case_1),
13907 		TEST_CASE_ST(ut_setup, ut_teardown,
13908 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
13909 		/** AUTH AES CMAC + CIPHER NULL */
13910 		TEST_CASE_ST(ut_setup, ut_teardown,
13911 			test_auth_aes_cmac_cipher_null_test_case_1),
13912 		TEST_CASE_ST(ut_setup, ut_teardown,
13913 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
13914 
13915 #ifdef RTE_LIB_SECURITY
13916 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13917 			test_PDCP_PROTO_all),
13918 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13919 			test_DOCSIS_PROTO_all),
13920 #endif
13921 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13922 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13923 		TEST_CASES_END() /**< NULL terminate unit test array */
13924 	}
13925 };
13926 
13927 static struct unit_test_suite cryptodev_virtio_testsuite = {
13928 	.suite_name = "Crypto VIRTIO Unit Test Suite",
13929 	.setup = testsuite_setup,
13930 	.teardown = testsuite_teardown,
13931 	.unit_test_cases = {
13932 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13933 
13934 		TEST_CASES_END() /**< NULL terminate unit test array */
13935 	}
13936 };
13937 
13938 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13939 	.suite_name = "Crypto CAAM JR Unit Test Suite",
13940 	.setup = testsuite_setup,
13941 	.teardown = testsuite_teardown,
13942 	.unit_test_cases = {
13943 		TEST_CASE_ST(ut_setup, ut_teardown,
13944 			     test_device_configure_invalid_dev_id),
13945 		TEST_CASE_ST(ut_setup, ut_teardown,
13946 			     test_multi_session),
13947 
13948 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13949 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13950 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13951 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13952 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13953 
13954 		TEST_CASES_END() /**< NULL terminate unit test array */
13955 	}
13956 };
13957 
13958 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13959 	.suite_name = "Crypto Device Marvell Component Test Suite",
13960 	.setup = testsuite_setup,
13961 	.teardown = testsuite_teardown,
13962 	.unit_test_cases = {
13963 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13964 		TEST_CASE_ST(ut_setup, ut_teardown,
13965 				test_multi_session_random_usage),
13966 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13967 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13968 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13969 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13970 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13971 
13972 		/** Negative tests */
13973 		TEST_CASE_ST(ut_setup, ut_teardown,
13974 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13975 		TEST_CASE_ST(ut_setup, ut_teardown,
13976 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13977 		TEST_CASE_ST(ut_setup, ut_teardown,
13978 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13979 		TEST_CASE_ST(ut_setup, ut_teardown,
13980 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13981 
13982 		TEST_CASES_END() /**< NULL terminate unit test array */
13983 	}
13984 };
13985 
13986 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13987 	.suite_name = "Crypto Device CCP Unit Test Suite",
13988 	.setup = testsuite_setup,
13989 	.teardown = testsuite_teardown,
13990 	.unit_test_cases = {
13991 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13992 		TEST_CASE_ST(ut_setup, ut_teardown,
13993 				test_multi_session_random_usage),
13994 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13995 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13996 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13997 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13998 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13999 
14000 		/** Negative tests */
14001 		TEST_CASE_ST(ut_setup, ut_teardown,
14002 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14003 		TEST_CASE_ST(ut_setup, ut_teardown,
14004 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14005 		TEST_CASE_ST(ut_setup, ut_teardown,
14006 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14007 		TEST_CASE_ST(ut_setup, ut_teardown,
14008 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14009 
14010 		TEST_CASES_END() /**< NULL terminate unit test array */
14011 	}
14012 };
14013 
14014 static int
14015 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14016 {
14017 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14018 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14019 
14020 	if (gbl_driver_id == -1) {
14021 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14022 		return TEST_SKIPPED;
14023 	}
14024 
14025 	return unit_test_suite_runner(&cryptodev_testsuite);
14026 }
14027 
14028 static int
14029 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14030 {
14031 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14032 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14033 
14034 	if (gbl_driver_id == -1) {
14035 		RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
14036 		return TEST_FAILED;
14037 	}
14038 
14039 	return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14040 }
14041 
14042 static int
14043 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14044 {
14045 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14046 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14047 
14048 	if (gbl_driver_id == -1) {
14049 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14050 		return TEST_SKIPPED;
14051 	}
14052 
14053 	return unit_test_suite_runner(&cryptodev_testsuite);
14054 }
14055 
14056 static int
14057 test_cryptodev_cpu_aesni_mb(void)
14058 {
14059 	int32_t rc;
14060 	enum rte_security_session_action_type at;
14061 
14062 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14063 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14064 
14065 	if (gbl_driver_id == -1) {
14066 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14067 		return TEST_SKIPPED;
14068 	}
14069 
14070 	at = gbl_action_type;
14071 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14072 	rc = unit_test_suite_runner(&cryptodev_testsuite);
14073 	gbl_action_type = at;
14074 	return rc;
14075 }
14076 
14077 static int
14078 test_cryptodev_openssl(void)
14079 {
14080 	gbl_driver_id = rte_cryptodev_driver_id_get(
14081 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14082 
14083 	if (gbl_driver_id == -1) {
14084 		RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
14085 		return TEST_SKIPPED;
14086 	}
14087 
14088 	return unit_test_suite_runner(&cryptodev_testsuite);
14089 }
14090 
14091 static int
14092 test_cryptodev_aesni_gcm(void)
14093 {
14094 	gbl_driver_id = rte_cryptodev_driver_id_get(
14095 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14096 
14097 	if (gbl_driver_id == -1) {
14098 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14099 		return TEST_SKIPPED;
14100 	}
14101 
14102 	return unit_test_suite_runner(&cryptodev_testsuite);
14103 }
14104 
14105 static int
14106 test_cryptodev_cpu_aesni_gcm(void)
14107 {
14108 	int32_t rc;
14109 	enum rte_security_session_action_type at;
14110 
14111 	gbl_driver_id = rte_cryptodev_driver_id_get(
14112 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14113 
14114 	if (gbl_driver_id == -1) {
14115 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14116 		return TEST_SKIPPED;
14117 	}
14118 
14119 	at = gbl_action_type;
14120 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14121 	rc = unit_test_suite_runner(&cryptodev_testsuite);
14122 	gbl_action_type = at;
14123 	return rc;
14124 }
14125 
14126 static int
14127 test_cryptodev_null(void)
14128 {
14129 	gbl_driver_id = rte_cryptodev_driver_id_get(
14130 			RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14131 
14132 	if (gbl_driver_id == -1) {
14133 		RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
14134 		return TEST_SKIPPED;
14135 	}
14136 
14137 	return unit_test_suite_runner(&cryptodev_testsuite);
14138 }
14139 
14140 static int
14141 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14142 {
14143 	gbl_driver_id = rte_cryptodev_driver_id_get(
14144 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14145 
14146 	if (gbl_driver_id == -1) {
14147 		RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
14148 		return TEST_SKIPPED;
14149 	}
14150 
14151 	return unit_test_suite_runner(&cryptodev_testsuite);
14152 }
14153 
14154 static int
14155 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14156 {
14157 	gbl_driver_id = rte_cryptodev_driver_id_get(
14158 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14159 
14160 	if (gbl_driver_id == -1) {
14161 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14162 		return TEST_SKIPPED;
14163 	}
14164 
14165 	return unit_test_suite_runner(&cryptodev_testsuite);
14166 }
14167 
14168 static int
14169 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14170 {
14171 	gbl_driver_id = rte_cryptodev_driver_id_get(
14172 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14173 
14174 	if (gbl_driver_id == -1) {
14175 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14176 		return TEST_SKIPPED;
14177 	}
14178 
14179 	return unit_test_suite_runner(&cryptodev_testsuite);
14180 }
14181 
14182 static int
14183 test_cryptodev_armv8(void)
14184 {
14185 	gbl_driver_id = rte_cryptodev_driver_id_get(
14186 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14187 
14188 	if (gbl_driver_id == -1) {
14189 		RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
14190 		return TEST_SKIPPED;
14191 	}
14192 
14193 	return unit_test_suite_runner(&cryptodev_testsuite);
14194 }
14195 
14196 static int
14197 test_cryptodev_mrvl(void)
14198 {
14199 	gbl_driver_id = rte_cryptodev_driver_id_get(
14200 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14201 
14202 	if (gbl_driver_id == -1) {
14203 		RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
14204 		return TEST_SKIPPED;
14205 	}
14206 
14207 	return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14208 }
14209 
14210 #ifdef RTE_CRYPTO_SCHEDULER
14211 
14212 static int
14213 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14214 {
14215 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14216 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14217 
14218 	if (gbl_driver_id == -1) {
14219 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14220 		return TEST_SKIPPED;
14221 	}
14222 
14223 	if (rte_cryptodev_driver_id_get(
14224 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14225 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14226 		return TEST_SKIPPED;
14227 }
14228 	return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14229 }
14230 
14231 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14232 
14233 #endif
14234 
14235 static int
14236 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14237 {
14238 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14239 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14240 
14241 	if (gbl_driver_id == -1) {
14242 		RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
14243 		return TEST_SKIPPED;
14244 	}
14245 
14246 	return unit_test_suite_runner(&cryptodev_testsuite);
14247 }
14248 
14249 static int
14250 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14251 {
14252 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14253 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14254 
14255 	if (gbl_driver_id == -1) {
14256 		RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14257 		return TEST_SKIPPED;
14258 	}
14259 
14260 	return unit_test_suite_runner(&cryptodev_testsuite);
14261 }
14262 
14263 static int
14264 test_cryptodev_ccp(void)
14265 {
14266 	gbl_driver_id = rte_cryptodev_driver_id_get(
14267 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14268 
14269 	if (gbl_driver_id == -1) {
14270 		RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14271 		return TEST_FAILED;
14272 	}
14273 
14274 	return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14275 }
14276 
14277 static int
14278 test_cryptodev_octeontx(void)
14279 {
14280 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14281 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14282 	if (gbl_driver_id == -1) {
14283 		RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14284 		return TEST_FAILED;
14285 	}
14286 	return unit_test_suite_runner(&cryptodev_testsuite);
14287 }
14288 
14289 static int
14290 test_cryptodev_octeontx2(void)
14291 {
14292 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14293 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14294 	if (gbl_driver_id == -1) {
14295 		RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14296 		return TEST_FAILED;
14297 	}
14298 	return unit_test_suite_runner(&cryptodev_testsuite);
14299 }
14300 
14301 static int
14302 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14303 {
14304 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14305 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14306 
14307 	if (gbl_driver_id == -1) {
14308 		RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14309 		return TEST_FAILED;
14310 	}
14311 
14312 	return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14313 }
14314 
14315 static int
14316 test_cryptodev_nitrox(void)
14317 {
14318 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14319 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14320 
14321 	if (gbl_driver_id == -1) {
14322 		RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14323 		return TEST_FAILED;
14324 	}
14325 
14326 	return unit_test_suite_runner(&cryptodev_testsuite);
14327 }
14328 
14329 static int
14330 test_cryptodev_bcmfs(void)
14331 {
14332 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14333 			RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14334 
14335 	if (gbl_driver_id == -1) {
14336 		RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14337 		return TEST_FAILED;
14338 	}
14339 
14340 	return unit_test_suite_runner(&cryptodev_testsuite);
14341 }
14342 
14343 static int
14344 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14345 {
14346 	int ret;
14347 
14348 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14349 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14350 
14351 	if (gbl_driver_id == -1) {
14352 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14353 		return TEST_SKIPPED;
14354 	}
14355 
14356 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
14357 	ret = unit_test_suite_runner(&cryptodev_testsuite);
14358 	global_api_test_type = CRYPTODEV_API_TEST;
14359 
14360 	return ret;
14361 }
14362 
14363 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14364 		test_cryptodev_qat_raw_api);
14365 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14366 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14367 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14368 	test_cryptodev_cpu_aesni_mb);
14369 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14370 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14371 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14372 	test_cryptodev_cpu_aesni_gcm);
14373 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14374 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14375 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14376 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14377 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14378 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14379 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14380 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14381 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14382 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14383 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14384 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14385 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14386 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14387 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
14388