xref: /dpdk/app/test/test_cryptodev.c (revision 40892ddb)
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 
6328 	/*
6329 	 * Function prepare data for hash veryfication test case.
6330 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6331 	 */
6332 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6333 
6334 	return test_snow3g_decryption(&snow3g_test_case_7) &
6335 			test_snow3g_authentication_verify(&snow3g_hash_data);
6336 }
6337 
6338 static int
6339 test_snow3g_cipher_auth_test_case_1(void)
6340 {
6341 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6342 }
6343 
6344 static int
6345 test_snow3g_auth_cipher_test_case_1(void)
6346 {
6347 	return test_snow3g_auth_cipher(
6348 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6349 }
6350 
6351 static int
6352 test_snow3g_auth_cipher_test_case_2(void)
6353 {
6354 	return test_snow3g_auth_cipher(
6355 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6356 }
6357 
6358 static int
6359 test_snow3g_auth_cipher_test_case_2_oop(void)
6360 {
6361 	return test_snow3g_auth_cipher(
6362 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6363 }
6364 
6365 static int
6366 test_snow3g_auth_cipher_part_digest_enc(void)
6367 {
6368 	return test_snow3g_auth_cipher(
6369 		&snow3g_auth_cipher_partial_digest_encryption,
6370 			IN_PLACE, 0);
6371 }
6372 
6373 static int
6374 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6375 {
6376 	return test_snow3g_auth_cipher(
6377 		&snow3g_auth_cipher_partial_digest_encryption,
6378 			OUT_OF_PLACE, 0);
6379 }
6380 
6381 static int
6382 test_snow3g_auth_cipher_test_case_3_sgl(void)
6383 {
6384 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6385 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6386 		return -ENOTSUP;
6387 	return test_snow3g_auth_cipher_sgl(
6388 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6389 }
6390 
6391 static int
6392 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6393 {
6394 	return test_snow3g_auth_cipher_sgl(
6395 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6396 }
6397 
6398 static int
6399 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6400 {
6401 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6402 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6403 		return -ENOTSUP;
6404 	return test_snow3g_auth_cipher_sgl(
6405 		&snow3g_auth_cipher_partial_digest_encryption,
6406 			IN_PLACE, 0);
6407 }
6408 
6409 static int
6410 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6411 {
6412 	return test_snow3g_auth_cipher_sgl(
6413 		&snow3g_auth_cipher_partial_digest_encryption,
6414 			OUT_OF_PLACE, 0);
6415 }
6416 
6417 static int
6418 test_snow3g_auth_cipher_verify_test_case_1(void)
6419 {
6420 	return test_snow3g_auth_cipher(
6421 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6422 }
6423 
6424 static int
6425 test_snow3g_auth_cipher_verify_test_case_2(void)
6426 {
6427 	return test_snow3g_auth_cipher(
6428 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6429 }
6430 
6431 static int
6432 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6433 {
6434 	return test_snow3g_auth_cipher(
6435 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6436 }
6437 
6438 static int
6439 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6440 {
6441 	return test_snow3g_auth_cipher(
6442 		&snow3g_auth_cipher_partial_digest_encryption,
6443 			IN_PLACE, 1);
6444 }
6445 
6446 static int
6447 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6448 {
6449 	return test_snow3g_auth_cipher(
6450 		&snow3g_auth_cipher_partial_digest_encryption,
6451 			OUT_OF_PLACE, 1);
6452 }
6453 
6454 static int
6455 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6456 {
6457 	return test_snow3g_auth_cipher_sgl(
6458 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6459 }
6460 
6461 static int
6462 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6463 {
6464 	return test_snow3g_auth_cipher_sgl(
6465 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6466 }
6467 
6468 static int
6469 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6470 {
6471 	return test_snow3g_auth_cipher_sgl(
6472 		&snow3g_auth_cipher_partial_digest_encryption,
6473 			IN_PLACE, 1);
6474 }
6475 
6476 static int
6477 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6478 {
6479 	return test_snow3g_auth_cipher_sgl(
6480 		&snow3g_auth_cipher_partial_digest_encryption,
6481 			OUT_OF_PLACE, 1);
6482 }
6483 
6484 static int
6485 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6486 {
6487 	return test_snow3g_auth_cipher(
6488 		&snow3g_test_case_7, IN_PLACE, 0);
6489 }
6490 
6491 static int
6492 test_kasumi_auth_cipher_test_case_1(void)
6493 {
6494 	return test_kasumi_auth_cipher(
6495 		&kasumi_test_case_3, IN_PLACE, 0);
6496 }
6497 
6498 static int
6499 test_kasumi_auth_cipher_test_case_2(void)
6500 {
6501 	return test_kasumi_auth_cipher(
6502 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6503 }
6504 
6505 static int
6506 test_kasumi_auth_cipher_test_case_2_oop(void)
6507 {
6508 	return test_kasumi_auth_cipher(
6509 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6510 }
6511 
6512 static int
6513 test_kasumi_auth_cipher_test_case_2_sgl(void)
6514 {
6515 	return test_kasumi_auth_cipher_sgl(
6516 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6517 }
6518 
6519 static int
6520 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6521 {
6522 	return test_kasumi_auth_cipher_sgl(
6523 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6524 }
6525 
6526 static int
6527 test_kasumi_auth_cipher_verify_test_case_1(void)
6528 {
6529 	return test_kasumi_auth_cipher(
6530 		&kasumi_test_case_3, IN_PLACE, 1);
6531 }
6532 
6533 static int
6534 test_kasumi_auth_cipher_verify_test_case_2(void)
6535 {
6536 	return test_kasumi_auth_cipher(
6537 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6538 }
6539 
6540 static int
6541 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6542 {
6543 	return test_kasumi_auth_cipher(
6544 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6545 }
6546 
6547 static int
6548 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6549 {
6550 	return test_kasumi_auth_cipher_sgl(
6551 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6552 }
6553 
6554 static int
6555 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6556 {
6557 	return test_kasumi_auth_cipher_sgl(
6558 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6559 }
6560 
6561 static int
6562 test_kasumi_cipher_auth_test_case_1(void)
6563 {
6564 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6565 }
6566 
6567 static int
6568 test_zuc_encryption_test_case_1(void)
6569 {
6570 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6571 }
6572 
6573 static int
6574 test_zuc_encryption_test_case_2(void)
6575 {
6576 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6577 }
6578 
6579 static int
6580 test_zuc_encryption_test_case_3(void)
6581 {
6582 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6583 }
6584 
6585 static int
6586 test_zuc_encryption_test_case_4(void)
6587 {
6588 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6589 }
6590 
6591 static int
6592 test_zuc_encryption_test_case_5(void)
6593 {
6594 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6595 }
6596 
6597 static int
6598 test_zuc_encryption_test_case_6_sgl(void)
6599 {
6600 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6601 }
6602 
6603 static int
6604 test_zuc_hash_generate_test_case_1(void)
6605 {
6606 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6607 }
6608 
6609 static int
6610 test_zuc_hash_generate_test_case_2(void)
6611 {
6612 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6613 }
6614 
6615 static int
6616 test_zuc_hash_generate_test_case_3(void)
6617 {
6618 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6619 }
6620 
6621 static int
6622 test_zuc_hash_generate_test_case_4(void)
6623 {
6624 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6625 }
6626 
6627 static int
6628 test_zuc_hash_generate_test_case_5(void)
6629 {
6630 	return test_zuc_authentication(&zuc_test_auth_5670b);
6631 }
6632 
6633 static int
6634 test_zuc_hash_generate_test_case_6(void)
6635 {
6636 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6637 }
6638 
6639 static int
6640 test_zuc_hash_generate_test_case_7(void)
6641 {
6642 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
6643 }
6644 
6645 static int
6646 test_zuc_hash_generate_test_case_8(void)
6647 {
6648 	return test_zuc_authentication(&zuc_test_case_auth_584b);
6649 }
6650 
6651 static int
6652 test_zuc_cipher_auth_test_case_1(void)
6653 {
6654 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6655 }
6656 
6657 static int
6658 test_zuc_cipher_auth_test_case_2(void)
6659 {
6660 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6661 }
6662 
6663 static int
6664 test_zuc_auth_cipher_test_case_1(void)
6665 {
6666 	return test_zuc_auth_cipher(
6667 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6668 }
6669 
6670 static int
6671 test_zuc_auth_cipher_test_case_1_oop(void)
6672 {
6673 	return test_zuc_auth_cipher(
6674 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6675 }
6676 
6677 static int
6678 test_zuc_auth_cipher_test_case_1_sgl(void)
6679 {
6680 	return test_zuc_auth_cipher_sgl(
6681 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6682 }
6683 
6684 static int
6685 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6686 {
6687 	return test_zuc_auth_cipher_sgl(
6688 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6689 }
6690 
6691 static int
6692 test_zuc_auth_cipher_verify_test_case_1(void)
6693 {
6694 	return test_zuc_auth_cipher(
6695 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6696 }
6697 
6698 static int
6699 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6700 {
6701 	return test_zuc_auth_cipher(
6702 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6703 }
6704 
6705 static int
6706 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6707 {
6708 	return test_zuc_auth_cipher_sgl(
6709 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6710 }
6711 
6712 static int
6713 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6714 {
6715 	return test_zuc_auth_cipher_sgl(
6716 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6717 }
6718 
6719 static int
6720 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6721 {
6722 	uint8_t dev_id = testsuite_params.valid_devs[0];
6723 
6724 	struct rte_cryptodev_sym_capability_idx cap_idx;
6725 
6726 	/* Check if device supports particular cipher algorithm */
6727 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6728 	cap_idx.algo.cipher = tdata->cipher_algo;
6729 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6730 		return -ENOTSUP;
6731 
6732 	/* Check if device supports particular hash algorithm */
6733 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6734 	cap_idx.algo.auth = tdata->auth_algo;
6735 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6736 		return -ENOTSUP;
6737 
6738 	return 0;
6739 }
6740 
6741 static int
6742 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6743 	uint8_t op_mode, uint8_t verify)
6744 {
6745 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6746 	struct crypto_unittest_params *ut_params = &unittest_params;
6747 
6748 	int retval;
6749 
6750 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6751 	unsigned int plaintext_pad_len;
6752 	unsigned int plaintext_len;
6753 	unsigned int ciphertext_pad_len;
6754 	unsigned int ciphertext_len;
6755 
6756 	struct rte_cryptodev_info dev_info;
6757 
6758 	/* Check if device supports particular algorithms separately */
6759 	if (test_mixed_check_if_unsupported(tdata))
6760 		return -ENOTSUP;
6761 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6762 		return -ENOTSUP;
6763 
6764 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6765 
6766 	uint64_t feat_flags = dev_info.feature_flags;
6767 
6768 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6769 		printf("Device doesn't support digest encrypted.\n");
6770 		return -ENOTSUP;
6771 	}
6772 
6773 	if (op_mode == OUT_OF_PLACE)
6774 		return -ENOTSUP;
6775 
6776 	/* Create the session */
6777 	if (verify)
6778 		retval = create_wireless_algo_cipher_auth_session(
6779 				ts_params->valid_devs[0],
6780 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
6781 				RTE_CRYPTO_AUTH_OP_VERIFY,
6782 				tdata->auth_algo,
6783 				tdata->cipher_algo,
6784 				tdata->auth_key.data, tdata->auth_key.len,
6785 				tdata->auth_iv.len, tdata->digest_enc.len,
6786 				tdata->cipher_iv.len);
6787 	else
6788 		retval = create_wireless_algo_auth_cipher_session(
6789 				ts_params->valid_devs[0],
6790 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6791 				RTE_CRYPTO_AUTH_OP_GENERATE,
6792 				tdata->auth_algo,
6793 				tdata->cipher_algo,
6794 				tdata->auth_key.data, tdata->auth_key.len,
6795 				tdata->auth_iv.len, tdata->digest_enc.len,
6796 				tdata->cipher_iv.len);
6797 	if (retval < 0)
6798 		return retval;
6799 
6800 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6801 	if (op_mode == OUT_OF_PLACE)
6802 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6803 
6804 	/* clear mbuf payload */
6805 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6806 		rte_pktmbuf_tailroom(ut_params->ibuf));
6807 	if (op_mode == OUT_OF_PLACE) {
6808 
6809 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6810 				rte_pktmbuf_tailroom(ut_params->obuf));
6811 	}
6812 
6813 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6814 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6815 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6816 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6817 
6818 	if (verify) {
6819 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6820 				ciphertext_pad_len);
6821 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6822 		if (op_mode == OUT_OF_PLACE)
6823 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6824 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6825 				ciphertext_len);
6826 	} else {
6827 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6828 				plaintext_pad_len);
6829 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6830 		if (op_mode == OUT_OF_PLACE)
6831 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6832 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6833 	}
6834 
6835 	/* Create the operation */
6836 	retval = create_wireless_algo_auth_cipher_operation(
6837 			tdata->digest_enc.data, tdata->digest_enc.len,
6838 			tdata->cipher_iv.data, tdata->cipher_iv.len,
6839 			tdata->auth_iv.data, tdata->auth_iv.len,
6840 			(tdata->digest_enc.offset == 0 ?
6841 				plaintext_pad_len
6842 				: tdata->digest_enc.offset),
6843 			tdata->validCipherLen.len_bits,
6844 			tdata->cipher.offset_bits,
6845 			tdata->validAuthLen.len_bits,
6846 			tdata->auth.offset_bits,
6847 			op_mode, 0, verify);
6848 
6849 	if (retval < 0)
6850 		return retval;
6851 
6852 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6853 			ut_params->op);
6854 
6855 	/* Check if the op failed because the device doesn't */
6856 	/* support this particular combination of algorithms */
6857 	if (ut_params->op == NULL && ut_params->op->status ==
6858 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6859 		printf("Device doesn't support this mixed combination. "
6860 				"Test Skipped.\n");
6861 		return -ENOTSUP;
6862 	}
6863 
6864 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6865 
6866 	ut_params->obuf = (op_mode == IN_PLACE ?
6867 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6868 
6869 	if (verify) {
6870 		if (ut_params->obuf)
6871 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6872 							uint8_t *);
6873 		else
6874 			plaintext = ciphertext +
6875 					(tdata->cipher.offset_bits >> 3);
6876 
6877 		debug_hexdump(stdout, "plaintext:", plaintext,
6878 				tdata->plaintext.len_bits >> 3);
6879 		debug_hexdump(stdout, "plaintext expected:",
6880 				tdata->plaintext.data,
6881 				tdata->plaintext.len_bits >> 3);
6882 	} else {
6883 		if (ut_params->obuf)
6884 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6885 					uint8_t *);
6886 		else
6887 			ciphertext = plaintext;
6888 
6889 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6890 				ciphertext_len);
6891 		debug_hexdump(stdout, "ciphertext expected:",
6892 				tdata->ciphertext.data,
6893 				tdata->ciphertext.len_bits >> 3);
6894 
6895 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6896 				+ (tdata->digest_enc.offset == 0 ?
6897 		plaintext_pad_len : tdata->digest_enc.offset);
6898 
6899 		debug_hexdump(stdout, "digest:", ut_params->digest,
6900 				tdata->digest_enc.len);
6901 		debug_hexdump(stdout, "digest expected:",
6902 				tdata->digest_enc.data,
6903 				tdata->digest_enc.len);
6904 	}
6905 
6906 	/* Validate obuf */
6907 	if (verify) {
6908 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6909 				plaintext,
6910 				tdata->plaintext.data,
6911 				tdata->plaintext.len_bits >> 3,
6912 				"Plaintext data not as expected");
6913 	} else {
6914 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6915 				ciphertext,
6916 				tdata->ciphertext.data,
6917 				tdata->validDataLen.len_bits,
6918 				"Ciphertext data not as expected");
6919 
6920 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6921 				ut_params->digest,
6922 				tdata->digest_enc.data,
6923 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6924 				"Generated auth tag not as expected");
6925 	}
6926 
6927 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6928 			"crypto op processing failed");
6929 
6930 	return 0;
6931 }
6932 
6933 static int
6934 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6935 	uint8_t op_mode, uint8_t verify)
6936 {
6937 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6938 	struct crypto_unittest_params *ut_params = &unittest_params;
6939 
6940 	int retval;
6941 
6942 	const uint8_t *plaintext = NULL;
6943 	const uint8_t *ciphertext = NULL;
6944 	const uint8_t *digest = NULL;
6945 	unsigned int plaintext_pad_len;
6946 	unsigned int plaintext_len;
6947 	unsigned int ciphertext_pad_len;
6948 	unsigned int ciphertext_len;
6949 	uint8_t buffer[10000];
6950 	uint8_t digest_buffer[10000];
6951 
6952 	struct rte_cryptodev_info dev_info;
6953 
6954 	/* Check if device supports particular algorithms */
6955 	if (test_mixed_check_if_unsupported(tdata))
6956 		return -ENOTSUP;
6957 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6958 		return -ENOTSUP;
6959 
6960 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6961 
6962 	uint64_t feat_flags = dev_info.feature_flags;
6963 
6964 	if (op_mode == IN_PLACE) {
6965 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6966 			printf("Device doesn't support in-place scatter-gather "
6967 					"in both input and output mbufs.\n");
6968 			return -ENOTSUP;
6969 		}
6970 	} else {
6971 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6972 			printf("Device doesn't support out-of-place scatter-gather "
6973 					"in both input and output mbufs.\n");
6974 			return -ENOTSUP;
6975 		}
6976 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6977 			printf("Device doesn't support digest encrypted.\n");
6978 			return -ENOTSUP;
6979 		}
6980 	}
6981 
6982 	/* Create the session */
6983 	if (verify)
6984 		retval = create_wireless_algo_cipher_auth_session(
6985 				ts_params->valid_devs[0],
6986 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
6987 				RTE_CRYPTO_AUTH_OP_VERIFY,
6988 				tdata->auth_algo,
6989 				tdata->cipher_algo,
6990 				tdata->auth_key.data, tdata->auth_key.len,
6991 				tdata->auth_iv.len, tdata->digest_enc.len,
6992 				tdata->cipher_iv.len);
6993 	else
6994 		retval = create_wireless_algo_auth_cipher_session(
6995 				ts_params->valid_devs[0],
6996 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6997 				RTE_CRYPTO_AUTH_OP_GENERATE,
6998 				tdata->auth_algo,
6999 				tdata->cipher_algo,
7000 				tdata->auth_key.data, tdata->auth_key.len,
7001 				tdata->auth_iv.len, tdata->digest_enc.len,
7002 				tdata->cipher_iv.len);
7003 	if (retval < 0)
7004 		return retval;
7005 
7006 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7007 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7008 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7009 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7010 
7011 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7012 			ciphertext_pad_len, 15, 0);
7013 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7014 			"Failed to allocate input buffer in mempool");
7015 
7016 	if (op_mode == OUT_OF_PLACE) {
7017 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7018 				plaintext_pad_len, 15, 0);
7019 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7020 				"Failed to allocate output buffer in mempool");
7021 	}
7022 
7023 	if (verify) {
7024 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7025 			tdata->ciphertext.data);
7026 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7027 					ciphertext_len, buffer);
7028 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7029 			ciphertext_len);
7030 	} else {
7031 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7032 			tdata->plaintext.data);
7033 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7034 					plaintext_len, buffer);
7035 		debug_hexdump(stdout, "plaintext:", plaintext,
7036 			plaintext_len);
7037 	}
7038 	memset(buffer, 0, sizeof(buffer));
7039 
7040 	/* Create the operation */
7041 	retval = create_wireless_algo_auth_cipher_operation(
7042 			tdata->digest_enc.data, tdata->digest_enc.len,
7043 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7044 			tdata->auth_iv.data, tdata->auth_iv.len,
7045 			(tdata->digest_enc.offset == 0 ?
7046 				plaintext_pad_len
7047 				: tdata->digest_enc.offset),
7048 			tdata->validCipherLen.len_bits,
7049 			tdata->cipher.offset_bits,
7050 			tdata->validAuthLen.len_bits,
7051 			tdata->auth.offset_bits,
7052 			op_mode, 1, verify);
7053 
7054 	if (retval < 0)
7055 		return retval;
7056 
7057 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
7058 			ut_params->op);
7059 
7060 	/* Check if the op failed because the device doesn't */
7061 	/* support this particular combination of algorithms */
7062 	if (ut_params->op == NULL && ut_params->op->status ==
7063 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7064 		printf("Device doesn't support this mixed combination. "
7065 				"Test Skipped.\n");
7066 		return -ENOTSUP;
7067 	}
7068 
7069 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7070 
7071 	ut_params->obuf = (op_mode == IN_PLACE ?
7072 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7073 
7074 	if (verify) {
7075 		if (ut_params->obuf)
7076 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7077 					plaintext_len, buffer);
7078 		else
7079 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7080 					plaintext_len, buffer);
7081 
7082 		debug_hexdump(stdout, "plaintext:", plaintext,
7083 				(tdata->plaintext.len_bits >> 3) -
7084 				tdata->digest_enc.len);
7085 		debug_hexdump(stdout, "plaintext expected:",
7086 				tdata->plaintext.data,
7087 				(tdata->plaintext.len_bits >> 3) -
7088 				tdata->digest_enc.len);
7089 	} else {
7090 		if (ut_params->obuf)
7091 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7092 					ciphertext_len, buffer);
7093 		else
7094 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7095 					ciphertext_len, buffer);
7096 
7097 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7098 			ciphertext_len);
7099 		debug_hexdump(stdout, "ciphertext expected:",
7100 			tdata->ciphertext.data,
7101 			tdata->ciphertext.len_bits >> 3);
7102 
7103 		if (ut_params->obuf)
7104 			digest = rte_pktmbuf_read(ut_params->obuf,
7105 					(tdata->digest_enc.offset == 0 ?
7106 						plaintext_pad_len :
7107 						tdata->digest_enc.offset),
7108 					tdata->digest_enc.len, digest_buffer);
7109 		else
7110 			digest = rte_pktmbuf_read(ut_params->ibuf,
7111 					(tdata->digest_enc.offset == 0 ?
7112 						plaintext_pad_len :
7113 						tdata->digest_enc.offset),
7114 					tdata->digest_enc.len, digest_buffer);
7115 
7116 		debug_hexdump(stdout, "digest:", digest,
7117 				tdata->digest_enc.len);
7118 		debug_hexdump(stdout, "digest expected:",
7119 				tdata->digest_enc.data, tdata->digest_enc.len);
7120 	}
7121 
7122 	/* Validate obuf */
7123 	if (verify) {
7124 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7125 				plaintext,
7126 				tdata->plaintext.data,
7127 				tdata->plaintext.len_bits >> 3,
7128 				"Plaintext data not as expected");
7129 	} else {
7130 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7131 				ciphertext,
7132 				tdata->ciphertext.data,
7133 				tdata->validDataLen.len_bits,
7134 				"Ciphertext data not as expected");
7135 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7136 				digest,
7137 				tdata->digest_enc.data,
7138 				tdata->digest_enc.len,
7139 				"Generated auth tag not as expected");
7140 	}
7141 
7142 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7143 			"crypto op processing failed");
7144 
7145 	return 0;
7146 }
7147 
7148 /** AUTH AES CMAC + CIPHER AES CTR */
7149 
7150 static int
7151 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7152 {
7153 	return test_mixed_auth_cipher(
7154 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7155 }
7156 
7157 static int
7158 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7159 {
7160 	return test_mixed_auth_cipher(
7161 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7162 }
7163 
7164 static int
7165 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7166 {
7167 	return test_mixed_auth_cipher_sgl(
7168 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7169 }
7170 
7171 static int
7172 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7173 {
7174 	return test_mixed_auth_cipher_sgl(
7175 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7176 }
7177 
7178 static int
7179 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7180 {
7181 	return test_mixed_auth_cipher(
7182 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7183 }
7184 
7185 static int
7186 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7187 {
7188 	return test_mixed_auth_cipher(
7189 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7190 }
7191 
7192 static int
7193 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7194 {
7195 	return test_mixed_auth_cipher_sgl(
7196 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7197 }
7198 
7199 static int
7200 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7201 {
7202 	return test_mixed_auth_cipher_sgl(
7203 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7204 }
7205 
7206 /** MIXED AUTH + CIPHER */
7207 
7208 static int
7209 test_auth_zuc_cipher_snow_test_case_1(void)
7210 {
7211 	return test_mixed_auth_cipher(
7212 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7213 }
7214 
7215 static int
7216 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7217 {
7218 	return test_mixed_auth_cipher(
7219 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7220 }
7221 
7222 static int
7223 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7224 {
7225 	return test_mixed_auth_cipher(
7226 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7227 }
7228 
7229 static int
7230 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7231 {
7232 	return test_mixed_auth_cipher(
7233 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7234 }
7235 
7236 static int
7237 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7238 {
7239 	return test_mixed_auth_cipher(
7240 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7241 }
7242 
7243 static int
7244 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7245 {
7246 	return test_mixed_auth_cipher(
7247 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7248 }
7249 
7250 static int
7251 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7252 {
7253 	return test_mixed_auth_cipher(
7254 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7255 }
7256 
7257 static int
7258 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7259 {
7260 	return test_mixed_auth_cipher(
7261 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7262 }
7263 
7264 static int
7265 test_auth_snow_cipher_zuc_test_case_1(void)
7266 {
7267 	return test_mixed_auth_cipher(
7268 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7269 }
7270 
7271 static int
7272 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7273 {
7274 	return test_mixed_auth_cipher(
7275 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7276 }
7277 
7278 static int
7279 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7280 {
7281 	return test_mixed_auth_cipher(
7282 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7283 }
7284 
7285 static int
7286 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7287 {
7288 	return test_mixed_auth_cipher(
7289 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7290 }
7291 
7292 static int
7293 test_auth_null_cipher_snow_test_case_1(void)
7294 {
7295 	return test_mixed_auth_cipher(
7296 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7297 }
7298 
7299 static int
7300 test_verify_auth_null_cipher_snow_test_case_1(void)
7301 {
7302 	return test_mixed_auth_cipher(
7303 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7304 }
7305 
7306 static int
7307 test_auth_null_cipher_zuc_test_case_1(void)
7308 {
7309 	return test_mixed_auth_cipher(
7310 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7311 }
7312 
7313 static int
7314 test_verify_auth_null_cipher_zuc_test_case_1(void)
7315 {
7316 	return test_mixed_auth_cipher(
7317 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7318 }
7319 
7320 static int
7321 test_auth_snow_cipher_null_test_case_1(void)
7322 {
7323 	return test_mixed_auth_cipher(
7324 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7325 }
7326 
7327 static int
7328 test_verify_auth_snow_cipher_null_test_case_1(void)
7329 {
7330 	return test_mixed_auth_cipher(
7331 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7332 }
7333 
7334 static int
7335 test_auth_zuc_cipher_null_test_case_1(void)
7336 {
7337 	return test_mixed_auth_cipher(
7338 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7339 }
7340 
7341 static int
7342 test_verify_auth_zuc_cipher_null_test_case_1(void)
7343 {
7344 	return test_mixed_auth_cipher(
7345 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7346 }
7347 
7348 static int
7349 test_auth_null_cipher_aes_ctr_test_case_1(void)
7350 {
7351 	return test_mixed_auth_cipher(
7352 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7353 }
7354 
7355 static int
7356 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7357 {
7358 	return test_mixed_auth_cipher(
7359 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7360 }
7361 
7362 static int
7363 test_auth_aes_cmac_cipher_null_test_case_1(void)
7364 {
7365 	return test_mixed_auth_cipher(
7366 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7367 }
7368 
7369 static int
7370 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7371 {
7372 	return test_mixed_auth_cipher(
7373 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7374 }
7375 
7376 /* ***** AEAD algorithm Tests ***** */
7377 
7378 static int
7379 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7380 		enum rte_crypto_aead_operation op,
7381 		const uint8_t *key, const uint8_t key_len,
7382 		const uint16_t aad_len, const uint8_t auth_len,
7383 		uint8_t iv_len)
7384 {
7385 	uint8_t aead_key[key_len];
7386 
7387 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7388 	struct crypto_unittest_params *ut_params = &unittest_params;
7389 
7390 	memcpy(aead_key, key, key_len);
7391 
7392 	/* Setup AEAD Parameters */
7393 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7394 	ut_params->aead_xform.next = NULL;
7395 	ut_params->aead_xform.aead.algo = algo;
7396 	ut_params->aead_xform.aead.op = op;
7397 	ut_params->aead_xform.aead.key.data = aead_key;
7398 	ut_params->aead_xform.aead.key.length = key_len;
7399 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7400 	ut_params->aead_xform.aead.iv.length = iv_len;
7401 	ut_params->aead_xform.aead.digest_length = auth_len;
7402 	ut_params->aead_xform.aead.aad_length = aad_len;
7403 
7404 	debug_hexdump(stdout, "key:", key, key_len);
7405 
7406 	/* Create Crypto session*/
7407 	ut_params->sess = rte_cryptodev_sym_session_create(
7408 			ts_params->session_mpool);
7409 
7410 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7411 			&ut_params->aead_xform,
7412 			ts_params->session_priv_mpool);
7413 
7414 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7415 
7416 	return 0;
7417 }
7418 
7419 static int
7420 create_aead_xform(struct rte_crypto_op *op,
7421 		enum rte_crypto_aead_algorithm algo,
7422 		enum rte_crypto_aead_operation aead_op,
7423 		uint8_t *key, const uint8_t key_len,
7424 		const uint8_t aad_len, const uint8_t auth_len,
7425 		uint8_t iv_len)
7426 {
7427 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7428 			"failed to allocate space for crypto transform");
7429 
7430 	struct rte_crypto_sym_op *sym_op = op->sym;
7431 
7432 	/* Setup AEAD Parameters */
7433 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7434 	sym_op->xform->next = NULL;
7435 	sym_op->xform->aead.algo = algo;
7436 	sym_op->xform->aead.op = aead_op;
7437 	sym_op->xform->aead.key.data = key;
7438 	sym_op->xform->aead.key.length = key_len;
7439 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7440 	sym_op->xform->aead.iv.length = iv_len;
7441 	sym_op->xform->aead.digest_length = auth_len;
7442 	sym_op->xform->aead.aad_length = aad_len;
7443 
7444 	debug_hexdump(stdout, "key:", key, key_len);
7445 
7446 	return 0;
7447 }
7448 
7449 static int
7450 create_aead_operation(enum rte_crypto_aead_operation op,
7451 		const struct aead_test_data *tdata)
7452 {
7453 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7454 	struct crypto_unittest_params *ut_params = &unittest_params;
7455 
7456 	uint8_t *plaintext, *ciphertext;
7457 	unsigned int aad_pad_len, plaintext_pad_len;
7458 
7459 	/* Generate Crypto op data structure */
7460 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7461 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7462 	TEST_ASSERT_NOT_NULL(ut_params->op,
7463 			"Failed to allocate symmetric crypto operation struct");
7464 
7465 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7466 
7467 	/* Append aad data */
7468 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7469 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7470 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7471 				aad_pad_len);
7472 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7473 				"no room to append aad");
7474 
7475 		sym_op->aead.aad.phys_addr =
7476 				rte_pktmbuf_iova(ut_params->ibuf);
7477 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7478 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7479 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7480 			tdata->aad.len);
7481 
7482 		/* Append IV at the end of the crypto operation*/
7483 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7484 				uint8_t *, IV_OFFSET);
7485 
7486 		/* Copy IV 1 byte after the IV pointer, according to the API */
7487 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7488 		debug_hexdump(stdout, "iv:", iv_ptr,
7489 			tdata->iv.len);
7490 	} else {
7491 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7492 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7493 				aad_pad_len);
7494 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7495 				"no room to append aad");
7496 
7497 		sym_op->aead.aad.phys_addr =
7498 				rte_pktmbuf_iova(ut_params->ibuf);
7499 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7500 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7501 			tdata->aad.len);
7502 
7503 		/* Append IV at the end of the crypto operation*/
7504 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7505 				uint8_t *, IV_OFFSET);
7506 
7507 		if (tdata->iv.len == 0) {
7508 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7509 			debug_hexdump(stdout, "iv:", iv_ptr,
7510 				AES_GCM_J0_LENGTH);
7511 		} else {
7512 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7513 			debug_hexdump(stdout, "iv:", iv_ptr,
7514 				tdata->iv.len);
7515 		}
7516 	}
7517 
7518 	/* Append plaintext/ciphertext */
7519 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7520 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7521 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7522 				plaintext_pad_len);
7523 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7524 
7525 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7526 		debug_hexdump(stdout, "plaintext:", plaintext,
7527 				tdata->plaintext.len);
7528 
7529 		if (ut_params->obuf) {
7530 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7531 					ut_params->obuf,
7532 					plaintext_pad_len + aad_pad_len);
7533 			TEST_ASSERT_NOT_NULL(ciphertext,
7534 					"no room to append ciphertext");
7535 
7536 			memset(ciphertext + aad_pad_len, 0,
7537 					tdata->ciphertext.len);
7538 		}
7539 	} else {
7540 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7541 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7542 				plaintext_pad_len);
7543 		TEST_ASSERT_NOT_NULL(ciphertext,
7544 				"no room to append ciphertext");
7545 
7546 		memcpy(ciphertext, tdata->ciphertext.data,
7547 				tdata->ciphertext.len);
7548 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7549 				tdata->ciphertext.len);
7550 
7551 		if (ut_params->obuf) {
7552 			plaintext = (uint8_t *)rte_pktmbuf_append(
7553 					ut_params->obuf,
7554 					plaintext_pad_len + aad_pad_len);
7555 			TEST_ASSERT_NOT_NULL(plaintext,
7556 					"no room to append plaintext");
7557 
7558 			memset(plaintext + aad_pad_len, 0,
7559 					tdata->plaintext.len);
7560 		}
7561 	}
7562 
7563 	/* Append digest data */
7564 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7565 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7566 				ut_params->obuf ? ut_params->obuf :
7567 						ut_params->ibuf,
7568 						tdata->auth_tag.len);
7569 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7570 				"no room to append digest");
7571 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7572 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7573 				ut_params->obuf ? ut_params->obuf :
7574 						ut_params->ibuf,
7575 						plaintext_pad_len +
7576 						aad_pad_len);
7577 	} else {
7578 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7579 				ut_params->ibuf, tdata->auth_tag.len);
7580 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7581 				"no room to append digest");
7582 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7583 				ut_params->ibuf,
7584 				plaintext_pad_len + aad_pad_len);
7585 
7586 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7587 			tdata->auth_tag.len);
7588 		debug_hexdump(stdout, "digest:",
7589 			sym_op->aead.digest.data,
7590 			tdata->auth_tag.len);
7591 	}
7592 
7593 	sym_op->aead.data.length = tdata->plaintext.len;
7594 	sym_op->aead.data.offset = aad_pad_len;
7595 
7596 	return 0;
7597 }
7598 
7599 static int
7600 test_authenticated_encryption(const struct aead_test_data *tdata)
7601 {
7602 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7603 	struct crypto_unittest_params *ut_params = &unittest_params;
7604 
7605 	int retval;
7606 	uint8_t *ciphertext, *auth_tag;
7607 	uint16_t plaintext_pad_len;
7608 	uint32_t i;
7609 	struct rte_cryptodev_info dev_info;
7610 
7611 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7612 	uint64_t feat_flags = dev_info.feature_flags;
7613 
7614 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7615 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7616 		printf("Device doesn't support RAW data-path APIs.\n");
7617 		return -ENOTSUP;
7618 	}
7619 
7620 	/* Verify the capabilities */
7621 	struct rte_cryptodev_sym_capability_idx cap_idx;
7622 	const struct rte_cryptodev_symmetric_capability *capability;
7623 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7624 	cap_idx.algo.aead = tdata->algo;
7625 	capability = rte_cryptodev_sym_capability_get(
7626 			ts_params->valid_devs[0], &cap_idx);
7627 	if (capability == NULL)
7628 		return -ENOTSUP;
7629 	if (rte_cryptodev_sym_capability_check_aead(
7630 			capability, tdata->key.len, tdata->auth_tag.len,
7631 			tdata->aad.len, tdata->iv.len))
7632 		return -ENOTSUP;
7633 
7634 	/* Create AEAD session */
7635 	retval = create_aead_session(ts_params->valid_devs[0],
7636 			tdata->algo,
7637 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7638 			tdata->key.data, tdata->key.len,
7639 			tdata->aad.len, tdata->auth_tag.len,
7640 			tdata->iv.len);
7641 	if (retval < 0)
7642 		return retval;
7643 
7644 	if (tdata->aad.len > MBUF_SIZE) {
7645 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7646 		/* Populate full size of add data */
7647 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7648 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7649 	} else
7650 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7651 
7652 	/* clear mbuf payload */
7653 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7654 			rte_pktmbuf_tailroom(ut_params->ibuf));
7655 
7656 	/* Create AEAD operation */
7657 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7658 	if (retval < 0)
7659 		return retval;
7660 
7661 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7662 
7663 	ut_params->op->sym->m_src = ut_params->ibuf;
7664 
7665 	/* Process crypto operation */
7666 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7667 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7668 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7669 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7670 				ut_params->op, 0, 0, 0, 0);
7671 	else
7672 		TEST_ASSERT_NOT_NULL(
7673 			process_crypto_request(ts_params->valid_devs[0],
7674 			ut_params->op), "failed to process sym crypto op");
7675 
7676 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7677 			"crypto op processing failed");
7678 
7679 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7680 
7681 	if (ut_params->op->sym->m_dst) {
7682 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7683 				uint8_t *);
7684 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7685 				uint8_t *, plaintext_pad_len);
7686 	} else {
7687 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7688 				uint8_t *,
7689 				ut_params->op->sym->cipher.data.offset);
7690 		auth_tag = ciphertext + plaintext_pad_len;
7691 	}
7692 
7693 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7694 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7695 
7696 	/* Validate obuf */
7697 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7698 			ciphertext,
7699 			tdata->ciphertext.data,
7700 			tdata->ciphertext.len,
7701 			"Ciphertext data not as expected");
7702 
7703 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7704 			auth_tag,
7705 			tdata->auth_tag.data,
7706 			tdata->auth_tag.len,
7707 			"Generated auth tag not as expected");
7708 
7709 	return 0;
7710 
7711 }
7712 
7713 #ifdef RTE_LIB_SECURITY
7714 static int
7715 security_proto_supported(enum rte_security_session_action_type action,
7716 	enum rte_security_session_protocol proto)
7717 {
7718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7719 
7720 	const struct rte_security_capability *capabilities;
7721 	const struct rte_security_capability *capability;
7722 	uint16_t i = 0;
7723 
7724 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7725 				rte_cryptodev_get_sec_ctx(
7726 				ts_params->valid_devs[0]);
7727 
7728 
7729 	capabilities = rte_security_capabilities_get(ctx);
7730 
7731 	if (capabilities == NULL)
7732 		return -ENOTSUP;
7733 
7734 	while ((capability = &capabilities[i++])->action !=
7735 			RTE_SECURITY_ACTION_TYPE_NONE) {
7736 		if (capability->action == action &&
7737 				capability->protocol == proto)
7738 			return 0;
7739 	}
7740 
7741 	return -ENOTSUP;
7742 }
7743 
7744 /* Basic algorithm run function for async inplace mode.
7745  * Creates a session from input parameters and runs one operation
7746  * on input_vec. Checks the output of the crypto operation against
7747  * output_vec.
7748  */
7749 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7750 			   enum rte_crypto_auth_operation opa,
7751 			   const uint8_t *input_vec, unsigned int input_vec_len,
7752 			   const uint8_t *output_vec,
7753 			   unsigned int output_vec_len,
7754 			   enum rte_crypto_cipher_algorithm cipher_alg,
7755 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
7756 			   enum rte_crypto_auth_algorithm auth_alg,
7757 			   const uint8_t *auth_key, uint32_t auth_key_len,
7758 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
7759 			   uint8_t packet_direction, uint8_t sn_size,
7760 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7761 {
7762 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7763 	struct crypto_unittest_params *ut_params = &unittest_params;
7764 	uint8_t *plaintext;
7765 	int ret = TEST_SUCCESS;
7766 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7767 				rte_cryptodev_get_sec_ctx(
7768 				ts_params->valid_devs[0]);
7769 
7770 	/* Verify the capabilities */
7771 	struct rte_security_capability_idx sec_cap_idx;
7772 
7773 	sec_cap_idx.action = ut_params->type;
7774 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7775 	sec_cap_idx.pdcp.domain = domain;
7776 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7777 		return -ENOTSUP;
7778 
7779 	/* Generate test mbuf data */
7780 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7781 
7782 	/* clear mbuf payload */
7783 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7784 			rte_pktmbuf_tailroom(ut_params->ibuf));
7785 
7786 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7787 						  input_vec_len);
7788 	memcpy(plaintext, input_vec, input_vec_len);
7789 
7790 	/* Out of place support */
7791 	if (oop) {
7792 		/*
7793 		 * For out-op-place we need to alloc another mbuf
7794 		 */
7795 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7796 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7797 	}
7798 
7799 	/* Setup Cipher Parameters */
7800 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7801 	ut_params->cipher_xform.cipher.algo = cipher_alg;
7802 	ut_params->cipher_xform.cipher.op = opc;
7803 	ut_params->cipher_xform.cipher.key.data = cipher_key;
7804 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7805 	ut_params->cipher_xform.cipher.iv.length =
7806 				packet_direction ? 4 : 0;
7807 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7808 
7809 	/* Setup HMAC Parameters if ICV header is required */
7810 	if (auth_alg != 0) {
7811 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7812 		ut_params->auth_xform.next = NULL;
7813 		ut_params->auth_xform.auth.algo = auth_alg;
7814 		ut_params->auth_xform.auth.op = opa;
7815 		ut_params->auth_xform.auth.key.data = auth_key;
7816 		ut_params->auth_xform.auth.key.length = auth_key_len;
7817 
7818 		ut_params->cipher_xform.next = &ut_params->auth_xform;
7819 	} else {
7820 		ut_params->cipher_xform.next = NULL;
7821 	}
7822 
7823 	struct rte_security_session_conf sess_conf = {
7824 		.action_type = ut_params->type,
7825 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
7826 		{.pdcp = {
7827 			.bearer = bearer,
7828 			.domain = domain,
7829 			.pkt_dir = packet_direction,
7830 			.sn_size = sn_size,
7831 			.hfn = packet_direction ? 0 : hfn,
7832 			/**
7833 			 * hfn can be set as pdcp_test_hfn[i]
7834 			 * if hfn_ovrd is not set. Here, PDCP
7835 			 * packet direction is just used to
7836 			 * run half of the cases with session
7837 			 * HFN and other half with per packet
7838 			 * HFN.
7839 			 */
7840 			.hfn_threshold = hfn_threshold,
7841 			.hfn_ovrd = packet_direction ? 1 : 0,
7842 			.sdap_enabled = sdap,
7843 		} },
7844 		.crypto_xform = &ut_params->cipher_xform
7845 	};
7846 
7847 	/* Create security session */
7848 	ut_params->sec_session = rte_security_session_create(ctx,
7849 				&sess_conf, ts_params->session_mpool,
7850 				ts_params->session_priv_mpool);
7851 
7852 	if (!ut_params->sec_session) {
7853 		printf("TestCase %s()-%d line %d failed %s: ",
7854 			__func__, i, __LINE__, "Failed to allocate session");
7855 		ret = TEST_FAILED;
7856 		goto on_err;
7857 	}
7858 
7859 	/* Generate crypto op data structure */
7860 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7861 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7862 	if (!ut_params->op) {
7863 		printf("TestCase %s()-%d line %d failed %s: ",
7864 			__func__, i, __LINE__,
7865 			"Failed to allocate symmetric crypto operation struct");
7866 		ret = TEST_FAILED;
7867 		goto on_err;
7868 	}
7869 
7870 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7871 					uint32_t *, IV_OFFSET);
7872 	*per_pkt_hfn = packet_direction ? hfn : 0;
7873 
7874 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
7875 
7876 	/* set crypto operation source mbuf */
7877 	ut_params->op->sym->m_src = ut_params->ibuf;
7878 	if (oop)
7879 		ut_params->op->sym->m_dst = ut_params->obuf;
7880 
7881 	/* Process crypto operation */
7882 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7883 		== NULL) {
7884 		printf("TestCase %s()-%d line %d failed %s: ",
7885 			__func__, i, __LINE__,
7886 			"failed to process sym crypto op");
7887 		ret = TEST_FAILED;
7888 		goto on_err;
7889 	}
7890 
7891 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7892 		printf("TestCase %s()-%d line %d failed %s: ",
7893 			__func__, i, __LINE__, "crypto op processing failed");
7894 		ret = TEST_FAILED;
7895 		goto on_err;
7896 	}
7897 
7898 	/* Validate obuf */
7899 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7900 			uint8_t *);
7901 	if (oop) {
7902 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7903 				uint8_t *);
7904 	}
7905 
7906 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
7907 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7908 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7909 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7910 		ret = TEST_FAILED;
7911 		goto on_err;
7912 	}
7913 
7914 on_err:
7915 	rte_crypto_op_free(ut_params->op);
7916 	ut_params->op = NULL;
7917 
7918 	if (ut_params->sec_session)
7919 		rte_security_session_destroy(ctx, ut_params->sec_session);
7920 	ut_params->sec_session = NULL;
7921 
7922 	rte_pktmbuf_free(ut_params->ibuf);
7923 	ut_params->ibuf = NULL;
7924 	if (oop) {
7925 		rte_pktmbuf_free(ut_params->obuf);
7926 		ut_params->obuf = NULL;
7927 	}
7928 
7929 	return ret;
7930 }
7931 
7932 static int
7933 test_pdcp_proto_SGL(int i, int oop,
7934 	enum rte_crypto_cipher_operation opc,
7935 	enum rte_crypto_auth_operation opa,
7936 	uint8_t *input_vec,
7937 	unsigned int input_vec_len,
7938 	uint8_t *output_vec,
7939 	unsigned int output_vec_len,
7940 	uint32_t fragsz,
7941 	uint32_t fragsz_oop)
7942 {
7943 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7944 	struct crypto_unittest_params *ut_params = &unittest_params;
7945 	uint8_t *plaintext;
7946 	struct rte_mbuf *buf, *buf_oop = NULL;
7947 	int ret = TEST_SUCCESS;
7948 	int to_trn = 0;
7949 	int to_trn_tbl[16];
7950 	int segs = 1;
7951 	unsigned int trn_data = 0;
7952 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7953 				rte_cryptodev_get_sec_ctx(
7954 				ts_params->valid_devs[0]);
7955 
7956 	/* Verify the capabilities */
7957 	struct rte_security_capability_idx sec_cap_idx;
7958 
7959 	sec_cap_idx.action = ut_params->type;
7960 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7961 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7962 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7963 		return -ENOTSUP;
7964 
7965 	if (fragsz > input_vec_len)
7966 		fragsz = input_vec_len;
7967 
7968 	uint16_t plaintext_len = fragsz;
7969 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
7970 
7971 	if (fragsz_oop > output_vec_len)
7972 		frag_size_oop = output_vec_len;
7973 
7974 	int ecx = 0;
7975 	if (input_vec_len % fragsz != 0) {
7976 		if (input_vec_len / fragsz + 1 > 16)
7977 			return 1;
7978 	} else if (input_vec_len / fragsz > 16)
7979 		return 1;
7980 
7981 	/* Out of place support */
7982 	if (oop) {
7983 		/*
7984 		 * For out-op-place we need to alloc another mbuf
7985 		 */
7986 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7987 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
7988 		buf_oop = ut_params->obuf;
7989 	}
7990 
7991 	/* Generate test mbuf data */
7992 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7993 
7994 	/* clear mbuf payload */
7995 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7996 			rte_pktmbuf_tailroom(ut_params->ibuf));
7997 
7998 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7999 						  plaintext_len);
8000 	memcpy(plaintext, input_vec, plaintext_len);
8001 	trn_data += plaintext_len;
8002 
8003 	buf = ut_params->ibuf;
8004 
8005 	/*
8006 	 * Loop until no more fragments
8007 	 */
8008 
8009 	while (trn_data < input_vec_len) {
8010 		++segs;
8011 		to_trn = (input_vec_len - trn_data < fragsz) ?
8012 				(input_vec_len - trn_data) : fragsz;
8013 
8014 		to_trn_tbl[ecx++] = to_trn;
8015 
8016 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8017 		buf = buf->next;
8018 
8019 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8020 				rte_pktmbuf_tailroom(buf));
8021 
8022 		/* OOP */
8023 		if (oop && !fragsz_oop) {
8024 			buf_oop->next =
8025 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8026 			buf_oop = buf_oop->next;
8027 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8028 					0, rte_pktmbuf_tailroom(buf_oop));
8029 			rte_pktmbuf_append(buf_oop, to_trn);
8030 		}
8031 
8032 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8033 				to_trn);
8034 
8035 		memcpy(plaintext, input_vec + trn_data, to_trn);
8036 		trn_data += to_trn;
8037 	}
8038 
8039 	ut_params->ibuf->nb_segs = segs;
8040 
8041 	segs = 1;
8042 	if (fragsz_oop && oop) {
8043 		to_trn = 0;
8044 		ecx = 0;
8045 
8046 		trn_data = frag_size_oop;
8047 		while (trn_data < output_vec_len) {
8048 			++segs;
8049 			to_trn =
8050 				(output_vec_len - trn_data <
8051 						frag_size_oop) ?
8052 				(output_vec_len - trn_data) :
8053 						frag_size_oop;
8054 
8055 			to_trn_tbl[ecx++] = to_trn;
8056 
8057 			buf_oop->next =
8058 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8059 			buf_oop = buf_oop->next;
8060 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8061 					0, rte_pktmbuf_tailroom(buf_oop));
8062 			rte_pktmbuf_append(buf_oop, to_trn);
8063 
8064 			trn_data += to_trn;
8065 		}
8066 		ut_params->obuf->nb_segs = segs;
8067 	}
8068 
8069 	/* Setup Cipher Parameters */
8070 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8071 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8072 	ut_params->cipher_xform.cipher.op = opc;
8073 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8074 	ut_params->cipher_xform.cipher.key.length =
8075 					pdcp_test_params[i].cipher_key_len;
8076 	ut_params->cipher_xform.cipher.iv.length = 0;
8077 
8078 	/* Setup HMAC Parameters if ICV header is required */
8079 	if (pdcp_test_params[i].auth_alg != 0) {
8080 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8081 		ut_params->auth_xform.next = NULL;
8082 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8083 		ut_params->auth_xform.auth.op = opa;
8084 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8085 		ut_params->auth_xform.auth.key.length =
8086 					pdcp_test_params[i].auth_key_len;
8087 
8088 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8089 	} else {
8090 		ut_params->cipher_xform.next = NULL;
8091 	}
8092 
8093 	struct rte_security_session_conf sess_conf = {
8094 		.action_type = ut_params->type,
8095 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8096 		{.pdcp = {
8097 			.bearer = pdcp_test_bearer[i],
8098 			.domain = pdcp_test_params[i].domain,
8099 			.pkt_dir = pdcp_test_packet_direction[i],
8100 			.sn_size = pdcp_test_data_sn_size[i],
8101 			.hfn = pdcp_test_hfn[i],
8102 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8103 			.hfn_ovrd = 0,
8104 		} },
8105 		.crypto_xform = &ut_params->cipher_xform
8106 	};
8107 
8108 	/* Create security session */
8109 	ut_params->sec_session = rte_security_session_create(ctx,
8110 				&sess_conf, ts_params->session_mpool,
8111 				ts_params->session_priv_mpool);
8112 
8113 	if (!ut_params->sec_session) {
8114 		printf("TestCase %s()-%d line %d failed %s: ",
8115 			__func__, i, __LINE__, "Failed to allocate session");
8116 		ret = TEST_FAILED;
8117 		goto on_err;
8118 	}
8119 
8120 	/* Generate crypto op data structure */
8121 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8122 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8123 	if (!ut_params->op) {
8124 		printf("TestCase %s()-%d line %d failed %s: ",
8125 			__func__, i, __LINE__,
8126 			"Failed to allocate symmetric crypto operation struct");
8127 		ret = TEST_FAILED;
8128 		goto on_err;
8129 	}
8130 
8131 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8132 
8133 	/* set crypto operation source mbuf */
8134 	ut_params->op->sym->m_src = ut_params->ibuf;
8135 	if (oop)
8136 		ut_params->op->sym->m_dst = ut_params->obuf;
8137 
8138 	/* Process crypto operation */
8139 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8140 		== NULL) {
8141 		printf("TestCase %s()-%d line %d failed %s: ",
8142 			__func__, i, __LINE__,
8143 			"failed to process sym crypto op");
8144 		ret = TEST_FAILED;
8145 		goto on_err;
8146 	}
8147 
8148 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8149 		printf("TestCase %s()-%d line %d failed %s: ",
8150 			__func__, i, __LINE__, "crypto op processing failed");
8151 		ret = TEST_FAILED;
8152 		goto on_err;
8153 	}
8154 
8155 	/* Validate obuf */
8156 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8157 			uint8_t *);
8158 	if (oop) {
8159 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8160 				uint8_t *);
8161 	}
8162 	if (fragsz_oop)
8163 		fragsz = frag_size_oop;
8164 	if (memcmp(ciphertext, output_vec, fragsz)) {
8165 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8166 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8167 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8168 		ret = TEST_FAILED;
8169 		goto on_err;
8170 	}
8171 
8172 	buf = ut_params->op->sym->m_src->next;
8173 	if (oop)
8174 		buf = ut_params->op->sym->m_dst->next;
8175 
8176 	unsigned int off = fragsz;
8177 
8178 	ecx = 0;
8179 	while (buf) {
8180 		ciphertext = rte_pktmbuf_mtod(buf,
8181 				uint8_t *);
8182 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8183 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8184 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8185 			rte_hexdump(stdout, "reference", output_vec + off,
8186 					to_trn_tbl[ecx]);
8187 			ret = TEST_FAILED;
8188 			goto on_err;
8189 		}
8190 		off += to_trn_tbl[ecx++];
8191 		buf = buf->next;
8192 	}
8193 on_err:
8194 	rte_crypto_op_free(ut_params->op);
8195 	ut_params->op = NULL;
8196 
8197 	if (ut_params->sec_session)
8198 		rte_security_session_destroy(ctx, ut_params->sec_session);
8199 	ut_params->sec_session = NULL;
8200 
8201 	rte_pktmbuf_free(ut_params->ibuf);
8202 	ut_params->ibuf = NULL;
8203 	if (oop) {
8204 		rte_pktmbuf_free(ut_params->obuf);
8205 		ut_params->obuf = NULL;
8206 	}
8207 
8208 	return ret;
8209 }
8210 
8211 int
8212 test_pdcp_proto_cplane_encap(int i)
8213 {
8214 	return test_pdcp_proto(
8215 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8216 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8217 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8218 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8219 		pdcp_test_params[i].cipher_key_len,
8220 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8221 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8222 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8223 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8224 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8225 }
8226 
8227 int
8228 test_pdcp_proto_uplane_encap(int i)
8229 {
8230 	return test_pdcp_proto(
8231 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8232 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8233 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8234 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8235 		pdcp_test_params[i].cipher_key_len,
8236 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8237 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8238 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8239 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8240 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8241 }
8242 
8243 int
8244 test_pdcp_proto_uplane_encap_with_int(int i)
8245 {
8246 	return test_pdcp_proto(
8247 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8248 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8249 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8250 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8251 		pdcp_test_params[i].cipher_key_len,
8252 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8253 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8254 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8255 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8256 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8257 }
8258 
8259 int
8260 test_pdcp_proto_cplane_decap(int i)
8261 {
8262 	return test_pdcp_proto(
8263 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8264 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8265 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8266 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8267 		pdcp_test_params[i].cipher_key_len,
8268 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8269 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8270 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8271 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8272 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8273 }
8274 
8275 int
8276 test_pdcp_proto_uplane_decap(int i)
8277 {
8278 	return test_pdcp_proto(
8279 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8280 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8281 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8282 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8283 		pdcp_test_params[i].cipher_key_len,
8284 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8285 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8286 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8287 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8288 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8289 }
8290 
8291 int
8292 test_pdcp_proto_uplane_decap_with_int(int i)
8293 {
8294 	return test_pdcp_proto(
8295 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8296 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8297 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8298 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8299 		pdcp_test_params[i].cipher_key_len,
8300 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8301 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8302 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8303 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8304 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8305 }
8306 
8307 static int
8308 test_PDCP_PROTO_SGL_in_place_32B(void)
8309 {
8310 	/* i can be used for running any PDCP case
8311 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8312 	 */
8313 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8314 	return test_pdcp_proto_SGL(i, IN_PLACE,
8315 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8316 			RTE_CRYPTO_AUTH_OP_GENERATE,
8317 			pdcp_test_data_in[i],
8318 			pdcp_test_data_in_len[i],
8319 			pdcp_test_data_out[i],
8320 			pdcp_test_data_in_len[i]+4,
8321 			32, 0);
8322 }
8323 static int
8324 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8325 {
8326 	/* i can be used for running any PDCP case
8327 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8328 	 */
8329 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8330 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8331 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8332 			RTE_CRYPTO_AUTH_OP_GENERATE,
8333 			pdcp_test_data_in[i],
8334 			pdcp_test_data_in_len[i],
8335 			pdcp_test_data_out[i],
8336 			pdcp_test_data_in_len[i]+4,
8337 			32, 128);
8338 }
8339 static int
8340 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8341 {
8342 	/* i can be used for running any PDCP case
8343 	 * In this case it is uplane 18-bit AES DL encap
8344 	 */
8345 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8346 			+ DOWNLINK;
8347 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8348 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8349 			RTE_CRYPTO_AUTH_OP_GENERATE,
8350 			pdcp_test_data_in[i],
8351 			pdcp_test_data_in_len[i],
8352 			pdcp_test_data_out[i],
8353 			pdcp_test_data_in_len[i],
8354 			32, 40);
8355 }
8356 static int
8357 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8358 {
8359 	/* i can be used for running any PDCP case
8360 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8361 	 */
8362 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8363 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8364 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8365 			RTE_CRYPTO_AUTH_OP_GENERATE,
8366 			pdcp_test_data_in[i],
8367 			pdcp_test_data_in_len[i],
8368 			pdcp_test_data_out[i],
8369 			pdcp_test_data_in_len[i]+4,
8370 			128, 32);
8371 }
8372 
8373 static int
8374 test_PDCP_SDAP_PROTO_encap_all(void)
8375 {
8376 	int i = 0, size = 0;
8377 	int err, all_err = TEST_SUCCESS;
8378 	const struct pdcp_sdap_test *cur_test;
8379 
8380 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8381 
8382 	for (i = 0; i < size; i++) {
8383 		cur_test = &list_pdcp_sdap_tests[i];
8384 		err = test_pdcp_proto(
8385 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8386 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8387 			cur_test->in_len, cur_test->data_out,
8388 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8389 			cur_test->param.cipher_alg, cur_test->cipher_key,
8390 			cur_test->param.cipher_key_len,
8391 			cur_test->param.auth_alg,
8392 			cur_test->auth_key, cur_test->param.auth_key_len,
8393 			cur_test->bearer, cur_test->param.domain,
8394 			cur_test->packet_direction, cur_test->sn_size,
8395 			cur_test->hfn,
8396 			cur_test->hfn_threshold, SDAP_ENABLED);
8397 		if (err) {
8398 			printf("\t%d) %s: Encapsulation failed\n",
8399 					cur_test->test_idx,
8400 					cur_test->param.name);
8401 			err = TEST_FAILED;
8402 		} else {
8403 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8404 					cur_test->param.name);
8405 			err = TEST_SUCCESS;
8406 		}
8407 		all_err += err;
8408 	}
8409 
8410 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8411 
8412 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8413 }
8414 
8415 static int
8416 test_PDCP_SDAP_PROTO_decap_all(void)
8417 {
8418 	int i = 0, size = 0;
8419 	int err, all_err = TEST_SUCCESS;
8420 	const struct pdcp_sdap_test *cur_test;
8421 
8422 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8423 
8424 	for (i = 0; i < size; i++) {
8425 		cur_test = &list_pdcp_sdap_tests[i];
8426 		err = test_pdcp_proto(
8427 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8428 			RTE_CRYPTO_AUTH_OP_VERIFY,
8429 			cur_test->data_out,
8430 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8431 			cur_test->data_in, cur_test->in_len,
8432 			cur_test->param.cipher_alg,
8433 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8434 			cur_test->param.auth_alg, cur_test->auth_key,
8435 			cur_test->param.auth_key_len, cur_test->bearer,
8436 			cur_test->param.domain, cur_test->packet_direction,
8437 			cur_test->sn_size, cur_test->hfn,
8438 			cur_test->hfn_threshold, SDAP_ENABLED);
8439 		if (err) {
8440 			printf("\t%d) %s: Decapsulation failed\n",
8441 					cur_test->test_idx,
8442 					cur_test->param.name);
8443 			err = TEST_FAILED;
8444 		} else {
8445 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8446 					cur_test->param.name);
8447 			err = TEST_SUCCESS;
8448 		}
8449 		all_err += err;
8450 	}
8451 
8452 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8453 
8454 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8455 }
8456 
8457 static int
8458 test_PDCP_PROTO_all(void)
8459 {
8460 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8461 	struct crypto_unittest_params *ut_params = &unittest_params;
8462 	struct rte_cryptodev_info dev_info;
8463 	int status;
8464 
8465 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8466 	uint64_t feat_flags = dev_info.feature_flags;
8467 
8468 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8469 		return -ENOTSUP;
8470 
8471 	/* Set action type */
8472 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8473 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8474 		gbl_action_type;
8475 
8476 	if (security_proto_supported(ut_params->type,
8477 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
8478 		return -ENOTSUP;
8479 
8480 	status = test_PDCP_PROTO_cplane_encap_all();
8481 	status += test_PDCP_PROTO_cplane_decap_all();
8482 	status += test_PDCP_PROTO_uplane_encap_all();
8483 	status += test_PDCP_PROTO_uplane_decap_all();
8484 	status += test_PDCP_PROTO_SGL_in_place_32B();
8485 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
8486 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
8487 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
8488 	status += test_PDCP_SDAP_PROTO_encap_all();
8489 	status += test_PDCP_SDAP_PROTO_decap_all();
8490 
8491 	if (status)
8492 		return TEST_FAILED;
8493 	else
8494 		return TEST_SUCCESS;
8495 }
8496 
8497 static int
8498 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8499 {
8500 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8501 	struct crypto_unittest_params *ut_params = &unittest_params;
8502 	uint8_t *plaintext, *ciphertext;
8503 	uint8_t *iv_ptr;
8504 	int32_t cipher_len, crc_len;
8505 	uint32_t crc_data_len;
8506 	int ret = TEST_SUCCESS;
8507 
8508 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8509 					rte_cryptodev_get_sec_ctx(
8510 						ts_params->valid_devs[0]);
8511 
8512 	/* Verify the capabilities */
8513 	struct rte_security_capability_idx sec_cap_idx;
8514 	const struct rte_security_capability *sec_cap;
8515 	const struct rte_cryptodev_capabilities *crypto_cap;
8516 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8517 	int j = 0;
8518 
8519 	sec_cap_idx.action = ut_params->type;
8520 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8521 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8522 
8523 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8524 	if (sec_cap == NULL)
8525 		return -ENOTSUP;
8526 
8527 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8528 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8529 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8530 				crypto_cap->sym.xform_type ==
8531 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8532 				crypto_cap->sym.cipher.algo ==
8533 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8534 			sym_cap = &crypto_cap->sym;
8535 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8536 						d_td->key.len,
8537 						d_td->iv.len) == 0)
8538 				break;
8539 		}
8540 	}
8541 
8542 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8543 		return -ENOTSUP;
8544 
8545 	/* Setup source mbuf payload */
8546 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8547 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8548 			rte_pktmbuf_tailroom(ut_params->ibuf));
8549 
8550 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8551 			d_td->ciphertext.len);
8552 
8553 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8554 
8555 	/* Setup cipher session parameters */
8556 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8557 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8558 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8559 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8560 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8561 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8562 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8563 	ut_params->cipher_xform.next = NULL;
8564 
8565 	/* Setup DOCSIS session parameters */
8566 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8567 
8568 	struct rte_security_session_conf sess_conf = {
8569 		.action_type = ut_params->type,
8570 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8571 		.docsis = ut_params->docsis_xform,
8572 		.crypto_xform = &ut_params->cipher_xform,
8573 	};
8574 
8575 	/* Create security session */
8576 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8577 					ts_params->session_mpool,
8578 					ts_params->session_priv_mpool);
8579 
8580 	if (!ut_params->sec_session) {
8581 		printf("TestCase %s(%d) line %d: %s\n",
8582 			__func__, i, __LINE__, "failed to allocate session");
8583 		ret = TEST_FAILED;
8584 		goto on_err;
8585 	}
8586 
8587 	/* Generate crypto op data structure */
8588 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8589 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8590 	if (!ut_params->op) {
8591 		printf("TestCase %s(%d) line %d: %s\n",
8592 			__func__, i, __LINE__,
8593 			"failed to allocate symmetric crypto operation");
8594 		ret = TEST_FAILED;
8595 		goto on_err;
8596 	}
8597 
8598 	/* Setup CRC operation parameters */
8599 	crc_len = d_td->ciphertext.no_crc == false ?
8600 			(d_td->ciphertext.len -
8601 				d_td->ciphertext.crc_offset -
8602 				RTE_ETHER_CRC_LEN) :
8603 			0;
8604 	crc_len = crc_len > 0 ? crc_len : 0;
8605 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8606 	ut_params->op->sym->auth.data.length = crc_len;
8607 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8608 
8609 	/* Setup cipher operation parameters */
8610 	cipher_len = d_td->ciphertext.no_cipher == false ?
8611 			(d_td->ciphertext.len -
8612 				d_td->ciphertext.cipher_offset) :
8613 			0;
8614 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8615 	ut_params->op->sym->cipher.data.length = cipher_len;
8616 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8617 
8618 	/* Setup cipher IV */
8619 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8620 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8621 
8622 	/* Attach session to operation */
8623 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8624 
8625 	/* Set crypto operation mbufs */
8626 	ut_params->op->sym->m_src = ut_params->ibuf;
8627 	ut_params->op->sym->m_dst = NULL;
8628 
8629 	/* Process crypto operation */
8630 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8631 			NULL) {
8632 		printf("TestCase %s(%d) line %d: %s\n",
8633 			__func__, i, __LINE__,
8634 			"failed to process security crypto op");
8635 		ret = TEST_FAILED;
8636 		goto on_err;
8637 	}
8638 
8639 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8640 		printf("TestCase %s(%d) line %d: %s\n",
8641 			__func__, i, __LINE__, "crypto op processing failed");
8642 		ret = TEST_FAILED;
8643 		goto on_err;
8644 	}
8645 
8646 	/* Validate plaintext */
8647 	plaintext = ciphertext;
8648 
8649 	if (memcmp(plaintext, d_td->plaintext.data,
8650 			d_td->plaintext.len - crc_data_len)) {
8651 		printf("TestCase %s(%d) line %d: %s\n",
8652 			__func__, i, __LINE__, "plaintext not as expected\n");
8653 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
8654 				d_td->plaintext.len);
8655 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8656 		ret = TEST_FAILED;
8657 		goto on_err;
8658 	}
8659 
8660 on_err:
8661 	rte_crypto_op_free(ut_params->op);
8662 	ut_params->op = NULL;
8663 
8664 	if (ut_params->sec_session)
8665 		rte_security_session_destroy(ctx, ut_params->sec_session);
8666 	ut_params->sec_session = NULL;
8667 
8668 	rte_pktmbuf_free(ut_params->ibuf);
8669 	ut_params->ibuf = NULL;
8670 
8671 	return ret;
8672 }
8673 
8674 static int
8675 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8676 {
8677 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8678 	struct crypto_unittest_params *ut_params = &unittest_params;
8679 	uint8_t *plaintext, *ciphertext;
8680 	uint8_t *iv_ptr;
8681 	int32_t cipher_len, crc_len;
8682 	int ret = TEST_SUCCESS;
8683 
8684 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8685 					rte_cryptodev_get_sec_ctx(
8686 						ts_params->valid_devs[0]);
8687 
8688 	/* Verify the capabilities */
8689 	struct rte_security_capability_idx sec_cap_idx;
8690 	const struct rte_security_capability *sec_cap;
8691 	const struct rte_cryptodev_capabilities *crypto_cap;
8692 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8693 	int j = 0;
8694 
8695 	sec_cap_idx.action = ut_params->type;
8696 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8697 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8698 
8699 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8700 	if (sec_cap == NULL)
8701 		return -ENOTSUP;
8702 
8703 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8704 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8705 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8706 				crypto_cap->sym.xform_type ==
8707 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8708 				crypto_cap->sym.cipher.algo ==
8709 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8710 			sym_cap = &crypto_cap->sym;
8711 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8712 						d_td->key.len,
8713 						d_td->iv.len) == 0)
8714 				break;
8715 		}
8716 	}
8717 
8718 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8719 		return -ENOTSUP;
8720 
8721 	/* Setup source mbuf payload */
8722 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8723 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8724 			rte_pktmbuf_tailroom(ut_params->ibuf));
8725 
8726 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8727 			d_td->plaintext.len);
8728 
8729 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8730 
8731 	/* Setup cipher session parameters */
8732 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8733 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8734 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8735 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8736 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8737 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8738 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8739 	ut_params->cipher_xform.next = NULL;
8740 
8741 	/* Setup DOCSIS session parameters */
8742 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8743 
8744 	struct rte_security_session_conf sess_conf = {
8745 		.action_type = ut_params->type,
8746 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8747 		.docsis = ut_params->docsis_xform,
8748 		.crypto_xform = &ut_params->cipher_xform,
8749 	};
8750 
8751 	/* Create security session */
8752 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8753 					ts_params->session_mpool,
8754 					ts_params->session_priv_mpool);
8755 
8756 	if (!ut_params->sec_session) {
8757 		printf("TestCase %s(%d) line %d: %s\n",
8758 			__func__, i, __LINE__, "failed to allocate session");
8759 		ret = TEST_FAILED;
8760 		goto on_err;
8761 	}
8762 
8763 	/* Generate crypto op data structure */
8764 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8765 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8766 	if (!ut_params->op) {
8767 		printf("TestCase %s(%d) line %d: %s\n",
8768 			__func__, i, __LINE__,
8769 			"failed to allocate security crypto operation");
8770 		ret = TEST_FAILED;
8771 		goto on_err;
8772 	}
8773 
8774 	/* Setup CRC operation parameters */
8775 	crc_len = d_td->plaintext.no_crc == false ?
8776 			(d_td->plaintext.len -
8777 				d_td->plaintext.crc_offset -
8778 				RTE_ETHER_CRC_LEN) :
8779 			0;
8780 	crc_len = crc_len > 0 ? crc_len : 0;
8781 	ut_params->op->sym->auth.data.length = crc_len;
8782 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8783 
8784 	/* Setup cipher operation parameters */
8785 	cipher_len = d_td->plaintext.no_cipher == false ?
8786 			(d_td->plaintext.len -
8787 				d_td->plaintext.cipher_offset) :
8788 			0;
8789 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8790 	ut_params->op->sym->cipher.data.length = cipher_len;
8791 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8792 
8793 	/* Setup cipher IV */
8794 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8795 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8796 
8797 	/* Attach session to operation */
8798 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8799 
8800 	/* Set crypto operation mbufs */
8801 	ut_params->op->sym->m_src = ut_params->ibuf;
8802 	ut_params->op->sym->m_dst = NULL;
8803 
8804 	/* Process crypto operation */
8805 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8806 			NULL) {
8807 		printf("TestCase %s(%d) line %d: %s\n",
8808 			__func__, i, __LINE__,
8809 			"failed to process security crypto op");
8810 		ret = TEST_FAILED;
8811 		goto on_err;
8812 	}
8813 
8814 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8815 		printf("TestCase %s(%d) line %d: %s\n",
8816 			__func__, i, __LINE__, "crypto op processing failed");
8817 		ret = TEST_FAILED;
8818 		goto on_err;
8819 	}
8820 
8821 	/* Validate ciphertext */
8822 	ciphertext = plaintext;
8823 
8824 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8825 		printf("TestCase %s(%d) line %d: %s\n",
8826 			__func__, i, __LINE__, "ciphertext not as expected\n");
8827 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8828 				d_td->ciphertext.len);
8829 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8830 		ret = TEST_FAILED;
8831 		goto on_err;
8832 	}
8833 
8834 on_err:
8835 	rte_crypto_op_free(ut_params->op);
8836 	ut_params->op = NULL;
8837 
8838 	if (ut_params->sec_session)
8839 		rte_security_session_destroy(ctx, ut_params->sec_session);
8840 	ut_params->sec_session = NULL;
8841 
8842 	rte_pktmbuf_free(ut_params->ibuf);
8843 	ut_params->ibuf = NULL;
8844 
8845 	return ret;
8846 }
8847 
8848 #define TEST_DOCSIS_COUNT(func) do {			\
8849 	int ret = func;					\
8850 	if (ret == TEST_SUCCESS)  {			\
8851 		printf("\t%2d)", n++);			\
8852 		printf("+++++ PASSED:" #func"\n");	\
8853 		p++;					\
8854 	} else if (ret == -ENOTSUP) {			\
8855 		printf("\t%2d)", n++);			\
8856 		printf("~~~~~ UNSUPP:" #func"\n");	\
8857 		u++;					\
8858 	} else {					\
8859 		printf("\t%2d)", n++);			\
8860 		printf("----- FAILED:" #func"\n");	\
8861 		f++;					\
8862 	}						\
8863 } while (0)
8864 
8865 static int
8866 test_DOCSIS_PROTO_uplink_all(void)
8867 {
8868 	int p = 0, u = 0, f = 0, n = 0;
8869 
8870 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8871 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8872 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8873 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8874 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8875 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8876 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8877 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8878 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8879 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8880 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8881 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8882 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8883 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8884 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8885 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8886 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8887 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8888 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8889 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8890 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8891 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8892 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8893 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8894 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8895 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8896 
8897 	if (f)
8898 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8899 			__func__, p, n, u);
8900 
8901 	return f;
8902 };
8903 
8904 static int
8905 test_DOCSIS_PROTO_downlink_all(void)
8906 {
8907 	int p = 0, u = 0, f = 0, n = 0;
8908 
8909 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8910 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8911 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8912 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8913 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8914 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8915 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8916 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8917 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8918 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8919 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8920 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8921 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8922 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8923 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8924 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8925 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8926 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8927 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8928 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8929 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8930 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8931 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8932 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8933 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8934 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8935 
8936 	if (f)
8937 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8938 			__func__, p, n, u);
8939 
8940 	return f;
8941 };
8942 
8943 static int
8944 test_DOCSIS_PROTO_all(void)
8945 {
8946 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8947 	struct crypto_unittest_params *ut_params = &unittest_params;
8948 	struct rte_cryptodev_info dev_info;
8949 	int status;
8950 
8951 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8952 	uint64_t feat_flags = dev_info.feature_flags;
8953 
8954 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8955 		return -ENOTSUP;
8956 
8957 	/* Set action type */
8958 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8959 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8960 		gbl_action_type;
8961 
8962 	if (security_proto_supported(ut_params->type,
8963 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8964 		return -ENOTSUP;
8965 
8966 	status = test_DOCSIS_PROTO_uplink_all();
8967 	status += test_DOCSIS_PROTO_downlink_all();
8968 
8969 	if (status)
8970 		return TEST_FAILED;
8971 	else
8972 		return TEST_SUCCESS;
8973 }
8974 #endif
8975 
8976 static int
8977 test_AES_GCM_authenticated_encryption_test_case_1(void)
8978 {
8979 	return test_authenticated_encryption(&gcm_test_case_1);
8980 }
8981 
8982 static int
8983 test_AES_GCM_authenticated_encryption_test_case_2(void)
8984 {
8985 	return test_authenticated_encryption(&gcm_test_case_2);
8986 }
8987 
8988 static int
8989 test_AES_GCM_authenticated_encryption_test_case_3(void)
8990 {
8991 	return test_authenticated_encryption(&gcm_test_case_3);
8992 }
8993 
8994 static int
8995 test_AES_GCM_authenticated_encryption_test_case_4(void)
8996 {
8997 	return test_authenticated_encryption(&gcm_test_case_4);
8998 }
8999 
9000 static int
9001 test_AES_GCM_authenticated_encryption_test_case_5(void)
9002 {
9003 	return test_authenticated_encryption(&gcm_test_case_5);
9004 }
9005 
9006 static int
9007 test_AES_GCM_authenticated_encryption_test_case_6(void)
9008 {
9009 	return test_authenticated_encryption(&gcm_test_case_6);
9010 }
9011 
9012 static int
9013 test_AES_GCM_authenticated_encryption_test_case_7(void)
9014 {
9015 	return test_authenticated_encryption(&gcm_test_case_7);
9016 }
9017 
9018 static int
9019 test_AES_GCM_authenticated_encryption_test_case_8(void)
9020 {
9021 	return test_authenticated_encryption(&gcm_test_case_8);
9022 }
9023 
9024 static int
9025 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9026 {
9027 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9028 }
9029 
9030 static int
9031 test_AES_GCM_auth_encryption_test_case_192_1(void)
9032 {
9033 	return test_authenticated_encryption(&gcm_test_case_192_1);
9034 }
9035 
9036 static int
9037 test_AES_GCM_auth_encryption_test_case_192_2(void)
9038 {
9039 	return test_authenticated_encryption(&gcm_test_case_192_2);
9040 }
9041 
9042 static int
9043 test_AES_GCM_auth_encryption_test_case_192_3(void)
9044 {
9045 	return test_authenticated_encryption(&gcm_test_case_192_3);
9046 }
9047 
9048 static int
9049 test_AES_GCM_auth_encryption_test_case_192_4(void)
9050 {
9051 	return test_authenticated_encryption(&gcm_test_case_192_4);
9052 }
9053 
9054 static int
9055 test_AES_GCM_auth_encryption_test_case_192_5(void)
9056 {
9057 	return test_authenticated_encryption(&gcm_test_case_192_5);
9058 }
9059 
9060 static int
9061 test_AES_GCM_auth_encryption_test_case_192_6(void)
9062 {
9063 	return test_authenticated_encryption(&gcm_test_case_192_6);
9064 }
9065 
9066 static int
9067 test_AES_GCM_auth_encryption_test_case_192_7(void)
9068 {
9069 	return test_authenticated_encryption(&gcm_test_case_192_7);
9070 }
9071 
9072 static int
9073 test_AES_GCM_auth_encryption_test_case_256_1(void)
9074 {
9075 	return test_authenticated_encryption(&gcm_test_case_256_1);
9076 }
9077 
9078 static int
9079 test_AES_GCM_auth_encryption_test_case_256_2(void)
9080 {
9081 	return test_authenticated_encryption(&gcm_test_case_256_2);
9082 }
9083 
9084 static int
9085 test_AES_GCM_auth_encryption_test_case_256_3(void)
9086 {
9087 	return test_authenticated_encryption(&gcm_test_case_256_3);
9088 }
9089 
9090 static int
9091 test_AES_GCM_auth_encryption_test_case_256_4(void)
9092 {
9093 	return test_authenticated_encryption(&gcm_test_case_256_4);
9094 }
9095 
9096 static int
9097 test_AES_GCM_auth_encryption_test_case_256_5(void)
9098 {
9099 	return test_authenticated_encryption(&gcm_test_case_256_5);
9100 }
9101 
9102 static int
9103 test_AES_GCM_auth_encryption_test_case_256_6(void)
9104 {
9105 	return test_authenticated_encryption(&gcm_test_case_256_6);
9106 }
9107 
9108 static int
9109 test_AES_GCM_auth_encryption_test_case_256_7(void)
9110 {
9111 	return test_authenticated_encryption(&gcm_test_case_256_7);
9112 }
9113 
9114 static int
9115 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9116 {
9117 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9118 }
9119 
9120 static int
9121 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9122 {
9123 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9124 }
9125 
9126 static int
9127 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9128 {
9129 	struct aead_test_data tdata;
9130 	int res;
9131 
9132 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9133 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9134 	tdata.iv.data[0] += 1;
9135 	res = test_authenticated_encryption(&tdata);
9136 	if (res == -ENOTSUP)
9137 		return res;
9138 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9139 	return TEST_SUCCESS;
9140 }
9141 
9142 static int
9143 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9144 {
9145 	struct aead_test_data tdata;
9146 	int res;
9147 
9148 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9149 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9150 	tdata.plaintext.data[0] += 1;
9151 	res = test_authenticated_encryption(&tdata);
9152 	if (res == -ENOTSUP)
9153 		return res;
9154 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9155 	return TEST_SUCCESS;
9156 }
9157 
9158 static int
9159 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9160 {
9161 	struct aead_test_data tdata;
9162 	int res;
9163 
9164 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9165 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9166 	tdata.ciphertext.data[0] += 1;
9167 	res = test_authenticated_encryption(&tdata);
9168 	if (res == -ENOTSUP)
9169 		return res;
9170 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9171 	return TEST_SUCCESS;
9172 }
9173 
9174 static int
9175 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9176 {
9177 	struct aead_test_data tdata;
9178 	int res;
9179 
9180 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9181 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9182 	tdata.aad.len += 1;
9183 	res = test_authenticated_encryption(&tdata);
9184 	if (res == -ENOTSUP)
9185 		return res;
9186 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9187 	return TEST_SUCCESS;
9188 }
9189 
9190 static int
9191 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9192 {
9193 	struct aead_test_data tdata;
9194 	uint8_t aad[gcm_test_case_7.aad.len];
9195 	int res;
9196 
9197 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9198 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9199 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9200 	aad[0] += 1;
9201 	tdata.aad.data = aad;
9202 	res = test_authenticated_encryption(&tdata);
9203 	if (res == -ENOTSUP)
9204 		return res;
9205 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9206 	return TEST_SUCCESS;
9207 }
9208 
9209 static int
9210 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9211 {
9212 	struct aead_test_data tdata;
9213 	int res;
9214 
9215 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9216 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9217 	tdata.auth_tag.data[0] += 1;
9218 	res = test_authenticated_encryption(&tdata);
9219 	if (res == -ENOTSUP)
9220 		return res;
9221 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9222 	return TEST_SUCCESS;
9223 }
9224 
9225 static int
9226 test_authenticated_decryption(const struct aead_test_data *tdata)
9227 {
9228 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9229 	struct crypto_unittest_params *ut_params = &unittest_params;
9230 
9231 	int retval;
9232 	uint8_t *plaintext;
9233 	uint32_t i;
9234 	struct rte_cryptodev_info dev_info;
9235 
9236 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9237 	uint64_t feat_flags = dev_info.feature_flags;
9238 
9239 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9240 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9241 		printf("Device doesn't support RAW data-path APIs.\n");
9242 		return -ENOTSUP;
9243 	}
9244 
9245 	/* Verify the capabilities */
9246 	struct rte_cryptodev_sym_capability_idx cap_idx;
9247 	const struct rte_cryptodev_symmetric_capability *capability;
9248 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9249 	cap_idx.algo.aead = tdata->algo;
9250 	capability = rte_cryptodev_sym_capability_get(
9251 			ts_params->valid_devs[0], &cap_idx);
9252 	if (capability == NULL)
9253 		return -ENOTSUP;
9254 	if (rte_cryptodev_sym_capability_check_aead(
9255 			capability, tdata->key.len, tdata->auth_tag.len,
9256 			tdata->aad.len, tdata->iv.len))
9257 		return -ENOTSUP;
9258 
9259 	/* Create AEAD session */
9260 	retval = create_aead_session(ts_params->valid_devs[0],
9261 			tdata->algo,
9262 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9263 			tdata->key.data, tdata->key.len,
9264 			tdata->aad.len, tdata->auth_tag.len,
9265 			tdata->iv.len);
9266 	if (retval < 0)
9267 		return retval;
9268 
9269 	/* alloc mbuf and set payload */
9270 	if (tdata->aad.len > MBUF_SIZE) {
9271 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9272 		/* Populate full size of add data */
9273 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9274 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9275 	} else
9276 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9277 
9278 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9279 			rte_pktmbuf_tailroom(ut_params->ibuf));
9280 
9281 	/* Create AEAD operation */
9282 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9283 	if (retval < 0)
9284 		return retval;
9285 
9286 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9287 
9288 	ut_params->op->sym->m_src = ut_params->ibuf;
9289 
9290 	/* Process crypto operation */
9291 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9292 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9293 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9294 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9295 				ut_params->op, 0, 0, 0, 0);
9296 	else
9297 		TEST_ASSERT_NOT_NULL(
9298 			process_crypto_request(ts_params->valid_devs[0],
9299 			ut_params->op), "failed to process sym crypto op");
9300 
9301 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9302 			"crypto op processing failed");
9303 
9304 	if (ut_params->op->sym->m_dst)
9305 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9306 				uint8_t *);
9307 	else
9308 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9309 				uint8_t *,
9310 				ut_params->op->sym->cipher.data.offset);
9311 
9312 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9313 
9314 	/* Validate obuf */
9315 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9316 			plaintext,
9317 			tdata->plaintext.data,
9318 			tdata->plaintext.len,
9319 			"Plaintext data not as expected");
9320 
9321 	TEST_ASSERT_EQUAL(ut_params->op->status,
9322 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9323 			"Authentication failed");
9324 
9325 	return 0;
9326 }
9327 
9328 static int
9329 test_AES_GCM_authenticated_decryption_test_case_1(void)
9330 {
9331 	return test_authenticated_decryption(&gcm_test_case_1);
9332 }
9333 
9334 static int
9335 test_AES_GCM_authenticated_decryption_test_case_2(void)
9336 {
9337 	return test_authenticated_decryption(&gcm_test_case_2);
9338 }
9339 
9340 static int
9341 test_AES_GCM_authenticated_decryption_test_case_3(void)
9342 {
9343 	return test_authenticated_decryption(&gcm_test_case_3);
9344 }
9345 
9346 static int
9347 test_AES_GCM_authenticated_decryption_test_case_4(void)
9348 {
9349 	return test_authenticated_decryption(&gcm_test_case_4);
9350 }
9351 
9352 static int
9353 test_AES_GCM_authenticated_decryption_test_case_5(void)
9354 {
9355 	return test_authenticated_decryption(&gcm_test_case_5);
9356 }
9357 
9358 static int
9359 test_AES_GCM_authenticated_decryption_test_case_6(void)
9360 {
9361 	return test_authenticated_decryption(&gcm_test_case_6);
9362 }
9363 
9364 static int
9365 test_AES_GCM_authenticated_decryption_test_case_7(void)
9366 {
9367 	return test_authenticated_decryption(&gcm_test_case_7);
9368 }
9369 
9370 static int
9371 test_AES_GCM_authenticated_decryption_test_case_8(void)
9372 {
9373 	return test_authenticated_decryption(&gcm_test_case_8);
9374 }
9375 
9376 static int
9377 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9378 {
9379 	return test_authenticated_decryption(&gcm_J0_test_case_1);
9380 }
9381 
9382 static int
9383 test_AES_GCM_auth_decryption_test_case_192_1(void)
9384 {
9385 	return test_authenticated_decryption(&gcm_test_case_192_1);
9386 }
9387 
9388 static int
9389 test_AES_GCM_auth_decryption_test_case_192_2(void)
9390 {
9391 	return test_authenticated_decryption(&gcm_test_case_192_2);
9392 }
9393 
9394 static int
9395 test_AES_GCM_auth_decryption_test_case_192_3(void)
9396 {
9397 	return test_authenticated_decryption(&gcm_test_case_192_3);
9398 }
9399 
9400 static int
9401 test_AES_GCM_auth_decryption_test_case_192_4(void)
9402 {
9403 	return test_authenticated_decryption(&gcm_test_case_192_4);
9404 }
9405 
9406 static int
9407 test_AES_GCM_auth_decryption_test_case_192_5(void)
9408 {
9409 	return test_authenticated_decryption(&gcm_test_case_192_5);
9410 }
9411 
9412 static int
9413 test_AES_GCM_auth_decryption_test_case_192_6(void)
9414 {
9415 	return test_authenticated_decryption(&gcm_test_case_192_6);
9416 }
9417 
9418 static int
9419 test_AES_GCM_auth_decryption_test_case_192_7(void)
9420 {
9421 	return test_authenticated_decryption(&gcm_test_case_192_7);
9422 }
9423 
9424 static int
9425 test_AES_GCM_auth_decryption_test_case_256_1(void)
9426 {
9427 	return test_authenticated_decryption(&gcm_test_case_256_1);
9428 }
9429 
9430 static int
9431 test_AES_GCM_auth_decryption_test_case_256_2(void)
9432 {
9433 	return test_authenticated_decryption(&gcm_test_case_256_2);
9434 }
9435 
9436 static int
9437 test_AES_GCM_auth_decryption_test_case_256_3(void)
9438 {
9439 	return test_authenticated_decryption(&gcm_test_case_256_3);
9440 }
9441 
9442 static int
9443 test_AES_GCM_auth_decryption_test_case_256_4(void)
9444 {
9445 	return test_authenticated_decryption(&gcm_test_case_256_4);
9446 }
9447 
9448 static int
9449 test_AES_GCM_auth_decryption_test_case_256_5(void)
9450 {
9451 	return test_authenticated_decryption(&gcm_test_case_256_5);
9452 }
9453 
9454 static int
9455 test_AES_GCM_auth_decryption_test_case_256_6(void)
9456 {
9457 	return test_authenticated_decryption(&gcm_test_case_256_6);
9458 }
9459 
9460 static int
9461 test_AES_GCM_auth_decryption_test_case_256_7(void)
9462 {
9463 	return test_authenticated_decryption(&gcm_test_case_256_7);
9464 }
9465 
9466 static int
9467 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9468 {
9469 	return test_authenticated_decryption(&gcm_test_case_aad_1);
9470 }
9471 
9472 static int
9473 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9474 {
9475 	return test_authenticated_decryption(&gcm_test_case_aad_2);
9476 }
9477 
9478 static int
9479 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
9480 {
9481 	struct aead_test_data tdata;
9482 	int res;
9483 
9484 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9485 	tdata.iv.data[0] += 1;
9486 	res = test_authenticated_decryption(&tdata);
9487 	if (res == -ENOTSUP)
9488 		return res;
9489 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9490 	return TEST_SUCCESS;
9491 }
9492 
9493 static int
9494 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
9495 {
9496 	struct aead_test_data tdata;
9497 	int res;
9498 
9499 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9500 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9501 	tdata.plaintext.data[0] += 1;
9502 	res = test_authenticated_decryption(&tdata);
9503 	if (res == -ENOTSUP)
9504 		return res;
9505 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9506 	return TEST_SUCCESS;
9507 }
9508 
9509 static int
9510 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9511 {
9512 	struct aead_test_data tdata;
9513 	int res;
9514 
9515 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9516 	tdata.ciphertext.data[0] += 1;
9517 	res = test_authenticated_decryption(&tdata);
9518 	if (res == -ENOTSUP)
9519 		return res;
9520 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9521 	return TEST_SUCCESS;
9522 }
9523 
9524 static int
9525 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9526 {
9527 	struct aead_test_data tdata;
9528 	int res;
9529 
9530 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9531 	tdata.aad.len += 1;
9532 	res = test_authenticated_decryption(&tdata);
9533 	if (res == -ENOTSUP)
9534 		return res;
9535 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9536 	return TEST_SUCCESS;
9537 }
9538 
9539 static int
9540 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9541 {
9542 	struct aead_test_data tdata;
9543 	uint8_t aad[gcm_test_case_7.aad.len];
9544 	int res;
9545 
9546 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9547 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9548 	aad[0] += 1;
9549 	tdata.aad.data = aad;
9550 	res = test_authenticated_decryption(&tdata);
9551 	if (res == -ENOTSUP)
9552 		return res;
9553 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9554 	return TEST_SUCCESS;
9555 }
9556 
9557 static int
9558 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9559 {
9560 	struct aead_test_data tdata;
9561 	int res;
9562 
9563 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9564 	tdata.auth_tag.data[0] += 1;
9565 	res = test_authenticated_decryption(&tdata);
9566 	if (res == -ENOTSUP)
9567 		return res;
9568 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9569 	return TEST_SUCCESS;
9570 }
9571 
9572 static int
9573 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9574 {
9575 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9576 	struct crypto_unittest_params *ut_params = &unittest_params;
9577 
9578 	int retval;
9579 	uint8_t *ciphertext, *auth_tag;
9580 	uint16_t plaintext_pad_len;
9581 
9582 	/* Verify the capabilities */
9583 	struct rte_cryptodev_sym_capability_idx cap_idx;
9584 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9585 	cap_idx.algo.aead = tdata->algo;
9586 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9587 			&cap_idx) == NULL)
9588 		return -ENOTSUP;
9589 
9590 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9591 		return -ENOTSUP;
9592 
9593 	/* not supported with CPU crypto */
9594 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9595 		return -ENOTSUP;
9596 
9597 	/* Create AEAD session */
9598 	retval = create_aead_session(ts_params->valid_devs[0],
9599 			tdata->algo,
9600 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9601 			tdata->key.data, tdata->key.len,
9602 			tdata->aad.len, tdata->auth_tag.len,
9603 			tdata->iv.len);
9604 	if (retval < 0)
9605 		return retval;
9606 
9607 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9608 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9609 
9610 	/* clear mbuf payload */
9611 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9612 			rte_pktmbuf_tailroom(ut_params->ibuf));
9613 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9614 			rte_pktmbuf_tailroom(ut_params->obuf));
9615 
9616 	/* Create AEAD operation */
9617 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9618 	if (retval < 0)
9619 		return retval;
9620 
9621 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9622 
9623 	ut_params->op->sym->m_src = ut_params->ibuf;
9624 	ut_params->op->sym->m_dst = ut_params->obuf;
9625 
9626 	/* Process crypto operation */
9627 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9628 			ut_params->op), "failed to process sym crypto op");
9629 
9630 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9631 			"crypto op processing failed");
9632 
9633 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9634 
9635 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9636 			ut_params->op->sym->cipher.data.offset);
9637 	auth_tag = ciphertext + plaintext_pad_len;
9638 
9639 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9640 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9641 
9642 	/* Validate obuf */
9643 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9644 			ciphertext,
9645 			tdata->ciphertext.data,
9646 			tdata->ciphertext.len,
9647 			"Ciphertext data not as expected");
9648 
9649 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9650 			auth_tag,
9651 			tdata->auth_tag.data,
9652 			tdata->auth_tag.len,
9653 			"Generated auth tag not as expected");
9654 
9655 	return 0;
9656 
9657 }
9658 
9659 static int
9660 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9661 {
9662 	return test_authenticated_encryption_oop(&gcm_test_case_5);
9663 }
9664 
9665 static int
9666 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9667 {
9668 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9669 	struct crypto_unittest_params *ut_params = &unittest_params;
9670 
9671 	int retval;
9672 	uint8_t *plaintext;
9673 
9674 	/* Verify the capabilities */
9675 	struct rte_cryptodev_sym_capability_idx cap_idx;
9676 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9677 	cap_idx.algo.aead = tdata->algo;
9678 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9679 			&cap_idx) == NULL)
9680 		return -ENOTSUP;
9681 
9682 	/* not supported with CPU crypto and raw data-path APIs*/
9683 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9684 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
9685 		return -ENOTSUP;
9686 
9687 	/* Create AEAD session */
9688 	retval = create_aead_session(ts_params->valid_devs[0],
9689 			tdata->algo,
9690 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9691 			tdata->key.data, tdata->key.len,
9692 			tdata->aad.len, tdata->auth_tag.len,
9693 			tdata->iv.len);
9694 	if (retval < 0)
9695 		return retval;
9696 
9697 	/* alloc mbuf and set payload */
9698 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9699 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9700 
9701 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9702 			rte_pktmbuf_tailroom(ut_params->ibuf));
9703 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9704 			rte_pktmbuf_tailroom(ut_params->obuf));
9705 
9706 	/* Create AEAD operation */
9707 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9708 	if (retval < 0)
9709 		return retval;
9710 
9711 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9712 
9713 	ut_params->op->sym->m_src = ut_params->ibuf;
9714 	ut_params->op->sym->m_dst = ut_params->obuf;
9715 
9716 	/* Process crypto operation */
9717 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9718 			ut_params->op), "failed to process sym crypto op");
9719 
9720 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9721 			"crypto op processing failed");
9722 
9723 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9724 			ut_params->op->sym->cipher.data.offset);
9725 
9726 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9727 
9728 	/* Validate obuf */
9729 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9730 			plaintext,
9731 			tdata->plaintext.data,
9732 			tdata->plaintext.len,
9733 			"Plaintext data not as expected");
9734 
9735 	TEST_ASSERT_EQUAL(ut_params->op->status,
9736 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9737 			"Authentication failed");
9738 	return 0;
9739 }
9740 
9741 static int
9742 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9743 {
9744 	return test_authenticated_decryption_oop(&gcm_test_case_5);
9745 }
9746 
9747 static int
9748 test_authenticated_encryption_sessionless(
9749 		const struct aead_test_data *tdata)
9750 {
9751 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9752 	struct crypto_unittest_params *ut_params = &unittest_params;
9753 
9754 	int retval;
9755 	uint8_t *ciphertext, *auth_tag;
9756 	uint16_t plaintext_pad_len;
9757 	uint8_t key[tdata->key.len + 1];
9758 	struct rte_cryptodev_info dev_info;
9759 
9760 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9761 	uint64_t feat_flags = dev_info.feature_flags;
9762 
9763 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9764 		printf("Device doesn't support Sessionless ops.\n");
9765 		return -ENOTSUP;
9766 	}
9767 
9768 	/* not supported with CPU crypto */
9769 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9770 		return -ENOTSUP;
9771 
9772 	/* Verify the capabilities */
9773 	struct rte_cryptodev_sym_capability_idx cap_idx;
9774 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9775 	cap_idx.algo.aead = tdata->algo;
9776 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9777 			&cap_idx) == NULL)
9778 		return -ENOTSUP;
9779 
9780 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9781 
9782 	/* clear mbuf payload */
9783 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9784 			rte_pktmbuf_tailroom(ut_params->ibuf));
9785 
9786 	/* Create AEAD operation */
9787 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9788 	if (retval < 0)
9789 		return retval;
9790 
9791 	/* Create GCM xform */
9792 	memcpy(key, tdata->key.data, tdata->key.len);
9793 	retval = create_aead_xform(ut_params->op,
9794 			tdata->algo,
9795 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9796 			key, tdata->key.len,
9797 			tdata->aad.len, tdata->auth_tag.len,
9798 			tdata->iv.len);
9799 	if (retval < 0)
9800 		return retval;
9801 
9802 	ut_params->op->sym->m_src = ut_params->ibuf;
9803 
9804 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9805 			RTE_CRYPTO_OP_SESSIONLESS,
9806 			"crypto op session type not sessionless");
9807 
9808 	/* Process crypto operation */
9809 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9810 			ut_params->op), "failed to process sym crypto op");
9811 
9812 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9813 
9814 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9815 			"crypto op status not success");
9816 
9817 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9818 
9819 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9820 			ut_params->op->sym->cipher.data.offset);
9821 	auth_tag = ciphertext + plaintext_pad_len;
9822 
9823 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9824 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9825 
9826 	/* Validate obuf */
9827 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9828 			ciphertext,
9829 			tdata->ciphertext.data,
9830 			tdata->ciphertext.len,
9831 			"Ciphertext data not as expected");
9832 
9833 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9834 			auth_tag,
9835 			tdata->auth_tag.data,
9836 			tdata->auth_tag.len,
9837 			"Generated auth tag not as expected");
9838 
9839 	return 0;
9840 
9841 }
9842 
9843 static int
9844 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9845 {
9846 	return test_authenticated_encryption_sessionless(
9847 			&gcm_test_case_5);
9848 }
9849 
9850 static int
9851 test_authenticated_decryption_sessionless(
9852 		const struct aead_test_data *tdata)
9853 {
9854 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9855 	struct crypto_unittest_params *ut_params = &unittest_params;
9856 
9857 	int retval;
9858 	uint8_t *plaintext;
9859 	uint8_t key[tdata->key.len + 1];
9860 	struct rte_cryptodev_info dev_info;
9861 
9862 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9863 	uint64_t feat_flags = dev_info.feature_flags;
9864 
9865 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9866 		printf("Device doesn't support Sessionless ops.\n");
9867 		return -ENOTSUP;
9868 	}
9869 
9870 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9871 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9872 		printf("Device doesn't support RAW data-path APIs.\n");
9873 		return -ENOTSUP;
9874 	}
9875 
9876 	/* not supported with CPU crypto */
9877 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9878 		return -ENOTSUP;
9879 
9880 	/* Verify the capabilities */
9881 	struct rte_cryptodev_sym_capability_idx cap_idx;
9882 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9883 	cap_idx.algo.aead = tdata->algo;
9884 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9885 			&cap_idx) == NULL)
9886 		return -ENOTSUP;
9887 
9888 	/* alloc mbuf and set payload */
9889 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9890 
9891 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9892 			rte_pktmbuf_tailroom(ut_params->ibuf));
9893 
9894 	/* Create AEAD operation */
9895 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9896 	if (retval < 0)
9897 		return retval;
9898 
9899 	/* Create AEAD xform */
9900 	memcpy(key, tdata->key.data, tdata->key.len);
9901 	retval = create_aead_xform(ut_params->op,
9902 			tdata->algo,
9903 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9904 			key, tdata->key.len,
9905 			tdata->aad.len, tdata->auth_tag.len,
9906 			tdata->iv.len);
9907 	if (retval < 0)
9908 		return retval;
9909 
9910 	ut_params->op->sym->m_src = ut_params->ibuf;
9911 
9912 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9913 			RTE_CRYPTO_OP_SESSIONLESS,
9914 			"crypto op session type not sessionless");
9915 
9916 	/* Process crypto operation */
9917 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9918 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9919 				ut_params->op, 0, 0, 0, 0);
9920 	else
9921 		TEST_ASSERT_NOT_NULL(process_crypto_request(
9922 			ts_params->valid_devs[0], ut_params->op),
9923 				"failed to process sym crypto op");
9924 
9925 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9926 
9927 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9928 			"crypto op status not success");
9929 
9930 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9931 			ut_params->op->sym->cipher.data.offset);
9932 
9933 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9934 
9935 	/* Validate obuf */
9936 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9937 			plaintext,
9938 			tdata->plaintext.data,
9939 			tdata->plaintext.len,
9940 			"Plaintext data not as expected");
9941 
9942 	TEST_ASSERT_EQUAL(ut_params->op->status,
9943 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9944 			"Authentication failed");
9945 	return 0;
9946 }
9947 
9948 static int
9949 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9950 {
9951 	return test_authenticated_decryption_sessionless(
9952 			&gcm_test_case_5);
9953 }
9954 
9955 static int
9956 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9957 {
9958 	return test_authenticated_encryption(&ccm_test_case_128_1);
9959 }
9960 
9961 static int
9962 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9963 {
9964 	return test_authenticated_encryption(&ccm_test_case_128_2);
9965 }
9966 
9967 static int
9968 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
9969 {
9970 	return test_authenticated_encryption(&ccm_test_case_128_3);
9971 }
9972 
9973 static int
9974 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
9975 {
9976 	return test_authenticated_decryption(&ccm_test_case_128_1);
9977 }
9978 
9979 static int
9980 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
9981 {
9982 	return test_authenticated_decryption(&ccm_test_case_128_2);
9983 }
9984 
9985 static int
9986 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
9987 {
9988 	return test_authenticated_decryption(&ccm_test_case_128_3);
9989 }
9990 
9991 static int
9992 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
9993 {
9994 	return test_authenticated_encryption(&ccm_test_case_192_1);
9995 }
9996 
9997 static int
9998 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
9999 {
10000 	return test_authenticated_encryption(&ccm_test_case_192_2);
10001 }
10002 
10003 static int
10004 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10005 {
10006 	return test_authenticated_encryption(&ccm_test_case_192_3);
10007 }
10008 
10009 static int
10010 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10011 {
10012 	return test_authenticated_decryption(&ccm_test_case_192_1);
10013 }
10014 
10015 static int
10016 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10017 {
10018 	return test_authenticated_decryption(&ccm_test_case_192_2);
10019 }
10020 
10021 static int
10022 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10023 {
10024 	return test_authenticated_decryption(&ccm_test_case_192_3);
10025 }
10026 
10027 static int
10028 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10029 {
10030 	return test_authenticated_encryption(&ccm_test_case_256_1);
10031 }
10032 
10033 static int
10034 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10035 {
10036 	return test_authenticated_encryption(&ccm_test_case_256_2);
10037 }
10038 
10039 static int
10040 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10041 {
10042 	return test_authenticated_encryption(&ccm_test_case_256_3);
10043 }
10044 
10045 static int
10046 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10047 {
10048 	return test_authenticated_decryption(&ccm_test_case_256_1);
10049 }
10050 
10051 static int
10052 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10053 {
10054 	return test_authenticated_decryption(&ccm_test_case_256_2);
10055 }
10056 
10057 static int
10058 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10059 {
10060 	return test_authenticated_decryption(&ccm_test_case_256_3);
10061 }
10062 
10063 static int
10064 test_stats(void)
10065 {
10066 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10067 	struct rte_cryptodev_stats stats;
10068 
10069 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10070 		return -ENOTSUP;
10071 
10072 	/* Verify the capabilities */
10073 	struct rte_cryptodev_sym_capability_idx cap_idx;
10074 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10075 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10076 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10077 			&cap_idx) == NULL)
10078 		return -ENOTSUP;
10079 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10080 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10081 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10082 			&cap_idx) == NULL)
10083 		return -ENOTSUP;
10084 
10085 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10086 			== -ENOTSUP)
10087 		return -ENOTSUP;
10088 
10089 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10090 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10091 			&stats) == -ENODEV),
10092 		"rte_cryptodev_stats_get invalid dev failed");
10093 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10094 		"rte_cryptodev_stats_get invalid Param failed");
10095 
10096 	/* Test expected values */
10097 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10098 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10099 			&stats),
10100 		"rte_cryptodev_stats_get failed");
10101 	TEST_ASSERT((stats.enqueued_count == 1),
10102 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10103 	TEST_ASSERT((stats.dequeued_count == 1),
10104 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10105 	TEST_ASSERT((stats.enqueue_err_count == 0),
10106 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10107 	TEST_ASSERT((stats.dequeue_err_count == 0),
10108 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10109 
10110 	/* invalid device but should ignore and not reset device stats*/
10111 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10112 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10113 			&stats),
10114 		"rte_cryptodev_stats_get failed");
10115 	TEST_ASSERT((stats.enqueued_count == 1),
10116 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10117 
10118 	/* check that a valid reset clears stats */
10119 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10120 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10121 			&stats),
10122 					  "rte_cryptodev_stats_get failed");
10123 	TEST_ASSERT((stats.enqueued_count == 0),
10124 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10125 	TEST_ASSERT((stats.dequeued_count == 0),
10126 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10127 
10128 	return TEST_SUCCESS;
10129 }
10130 
10131 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10132 				   struct crypto_unittest_params *ut_params,
10133 				   enum rte_crypto_auth_operation op,
10134 				   const struct HMAC_MD5_vector *test_case)
10135 {
10136 	uint8_t key[64];
10137 
10138 	memcpy(key, test_case->key.data, test_case->key.len);
10139 
10140 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10141 	ut_params->auth_xform.next = NULL;
10142 	ut_params->auth_xform.auth.op = op;
10143 
10144 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10145 
10146 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10147 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10148 	ut_params->auth_xform.auth.key.data = key;
10149 
10150 	ut_params->sess = rte_cryptodev_sym_session_create(
10151 			ts_params->session_mpool);
10152 
10153 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10154 			ut_params->sess, &ut_params->auth_xform,
10155 			ts_params->session_priv_mpool);
10156 
10157 	if (ut_params->sess == NULL)
10158 		return TEST_FAILED;
10159 
10160 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10161 
10162 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10163 			rte_pktmbuf_tailroom(ut_params->ibuf));
10164 
10165 	return 0;
10166 }
10167 
10168 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10169 			      const struct HMAC_MD5_vector *test_case,
10170 			      uint8_t **plaintext)
10171 {
10172 	uint16_t plaintext_pad_len;
10173 
10174 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10175 
10176 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10177 				16);
10178 
10179 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10180 			plaintext_pad_len);
10181 	memcpy(*plaintext, test_case->plaintext.data,
10182 			test_case->plaintext.len);
10183 
10184 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10185 			ut_params->ibuf, MD5_DIGEST_LEN);
10186 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10187 			"no room to append digest");
10188 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10189 			ut_params->ibuf, plaintext_pad_len);
10190 
10191 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10192 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10193 			   test_case->auth_tag.len);
10194 	}
10195 
10196 	sym_op->auth.data.offset = 0;
10197 	sym_op->auth.data.length = test_case->plaintext.len;
10198 
10199 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10200 	ut_params->op->sym->m_src = ut_params->ibuf;
10201 
10202 	return 0;
10203 }
10204 
10205 static int
10206 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10207 {
10208 	uint16_t plaintext_pad_len;
10209 	uint8_t *plaintext, *auth_tag;
10210 
10211 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10212 	struct crypto_unittest_params *ut_params = &unittest_params;
10213 	struct rte_cryptodev_info dev_info;
10214 
10215 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10216 	uint64_t feat_flags = dev_info.feature_flags;
10217 
10218 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10219 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10220 		printf("Device doesn't support RAW data-path APIs.\n");
10221 		return -ENOTSUP;
10222 	}
10223 
10224 	/* Verify the capabilities */
10225 	struct rte_cryptodev_sym_capability_idx cap_idx;
10226 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10227 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10228 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10229 			&cap_idx) == NULL)
10230 		return -ENOTSUP;
10231 
10232 	if (MD5_HMAC_create_session(ts_params, ut_params,
10233 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10234 		return TEST_FAILED;
10235 
10236 	/* Generate Crypto op data structure */
10237 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10238 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10239 	TEST_ASSERT_NOT_NULL(ut_params->op,
10240 			"Failed to allocate symmetric crypto operation struct");
10241 
10242 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10243 				16);
10244 
10245 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10246 		return TEST_FAILED;
10247 
10248 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10249 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10250 			ut_params->op);
10251 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10252 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10253 				ut_params->op, 0, 1, 0, 0);
10254 	else
10255 		TEST_ASSERT_NOT_NULL(
10256 			process_crypto_request(ts_params->valid_devs[0],
10257 				ut_params->op),
10258 				"failed to process sym crypto op");
10259 
10260 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10261 			"crypto op processing failed");
10262 
10263 	if (ut_params->op->sym->m_dst) {
10264 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10265 				uint8_t *, plaintext_pad_len);
10266 	} else {
10267 		auth_tag = plaintext + plaintext_pad_len;
10268 	}
10269 
10270 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10271 			auth_tag,
10272 			test_case->auth_tag.data,
10273 			test_case->auth_tag.len,
10274 			"HMAC_MD5 generated tag not as expected");
10275 
10276 	return TEST_SUCCESS;
10277 }
10278 
10279 static int
10280 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10281 {
10282 	uint8_t *plaintext;
10283 
10284 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10285 	struct crypto_unittest_params *ut_params = &unittest_params;
10286 	struct rte_cryptodev_info dev_info;
10287 
10288 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10289 	uint64_t feat_flags = dev_info.feature_flags;
10290 
10291 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10292 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10293 		printf("Device doesn't support RAW data-path APIs.\n");
10294 		return -ENOTSUP;
10295 	}
10296 
10297 	/* Verify the capabilities */
10298 	struct rte_cryptodev_sym_capability_idx cap_idx;
10299 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10300 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10301 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10302 			&cap_idx) == NULL)
10303 		return -ENOTSUP;
10304 
10305 	if (MD5_HMAC_create_session(ts_params, ut_params,
10306 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10307 		return TEST_FAILED;
10308 	}
10309 
10310 	/* Generate Crypto op data structure */
10311 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10312 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10313 	TEST_ASSERT_NOT_NULL(ut_params->op,
10314 			"Failed to allocate symmetric crypto operation struct");
10315 
10316 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10317 		return TEST_FAILED;
10318 
10319 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10320 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10321 			ut_params->op);
10322 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10323 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10324 				ut_params->op, 0, 1, 0, 0);
10325 	else
10326 		TEST_ASSERT_NOT_NULL(
10327 			process_crypto_request(ts_params->valid_devs[0],
10328 				ut_params->op),
10329 				"failed to process sym crypto op");
10330 
10331 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10332 			"HMAC_MD5 crypto op processing failed");
10333 
10334 	return TEST_SUCCESS;
10335 }
10336 
10337 static int
10338 test_MD5_HMAC_generate_case_1(void)
10339 {
10340 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10341 }
10342 
10343 static int
10344 test_MD5_HMAC_verify_case_1(void)
10345 {
10346 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10347 }
10348 
10349 static int
10350 test_MD5_HMAC_generate_case_2(void)
10351 {
10352 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10353 }
10354 
10355 static int
10356 test_MD5_HMAC_verify_case_2(void)
10357 {
10358 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10359 }
10360 
10361 static int
10362 test_multi_session(void)
10363 {
10364 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10365 	struct crypto_unittest_params *ut_params = &unittest_params;
10366 
10367 	struct rte_cryptodev_info dev_info;
10368 	struct rte_cryptodev_sym_session **sessions;
10369 
10370 	uint16_t i;
10371 
10372 	/* Verify the capabilities */
10373 	struct rte_cryptodev_sym_capability_idx cap_idx;
10374 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10375 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10376 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10377 			&cap_idx) == NULL)
10378 		return -ENOTSUP;
10379 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10380 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10381 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10382 			&cap_idx) == NULL)
10383 		return -ENOTSUP;
10384 
10385 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10386 			aes_cbc_key, hmac_sha512_key);
10387 
10388 
10389 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10390 
10391 	sessions = rte_malloc(NULL,
10392 			(sizeof(struct rte_cryptodev_sym_session *) *
10393 			MAX_NB_SESSIONS) + 1, 0);
10394 
10395 	/* Create multiple crypto sessions*/
10396 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10397 
10398 		sessions[i] = rte_cryptodev_sym_session_create(
10399 				ts_params->session_mpool);
10400 
10401 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10402 				sessions[i], &ut_params->auth_xform,
10403 				ts_params->session_priv_mpool);
10404 		TEST_ASSERT_NOT_NULL(sessions[i],
10405 				"Session creation failed at session number %u",
10406 				i);
10407 
10408 		/* Attempt to send a request on each session */
10409 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10410 			sessions[i],
10411 			ut_params,
10412 			ts_params,
10413 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10414 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10415 			aes_cbc_iv),
10416 			"Failed to perform decrypt on request number %u.", i);
10417 		/* free crypto operation structure */
10418 		if (ut_params->op)
10419 			rte_crypto_op_free(ut_params->op);
10420 
10421 		/*
10422 		 * free mbuf - both obuf and ibuf are usually the same,
10423 		 * so check if they point at the same address is necessary,
10424 		 * to avoid freeing the mbuf twice.
10425 		 */
10426 		if (ut_params->obuf) {
10427 			rte_pktmbuf_free(ut_params->obuf);
10428 			if (ut_params->ibuf == ut_params->obuf)
10429 				ut_params->ibuf = 0;
10430 			ut_params->obuf = 0;
10431 		}
10432 		if (ut_params->ibuf) {
10433 			rte_pktmbuf_free(ut_params->ibuf);
10434 			ut_params->ibuf = 0;
10435 		}
10436 	}
10437 
10438 	/* Next session create should fail */
10439 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10440 			sessions[i], &ut_params->auth_xform,
10441 			ts_params->session_priv_mpool);
10442 	TEST_ASSERT_NULL(sessions[i],
10443 			"Session creation succeeded unexpectedly!");
10444 
10445 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10446 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10447 				sessions[i]);
10448 		rte_cryptodev_sym_session_free(sessions[i]);
10449 	}
10450 
10451 	rte_free(sessions);
10452 
10453 	return TEST_SUCCESS;
10454 }
10455 
10456 struct multi_session_params {
10457 	struct crypto_unittest_params ut_params;
10458 	uint8_t *cipher_key;
10459 	uint8_t *hmac_key;
10460 	const uint8_t *cipher;
10461 	const uint8_t *digest;
10462 	uint8_t *iv;
10463 };
10464 
10465 #define MB_SESSION_NUMBER 3
10466 
10467 static int
10468 test_multi_session_random_usage(void)
10469 {
10470 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10471 	struct rte_cryptodev_info dev_info;
10472 	struct rte_cryptodev_sym_session **sessions;
10473 	uint32_t i, j;
10474 	struct multi_session_params ut_paramz[] = {
10475 
10476 		{
10477 			.cipher_key = ms_aes_cbc_key0,
10478 			.hmac_key = ms_hmac_key0,
10479 			.cipher = ms_aes_cbc_cipher0,
10480 			.digest = ms_hmac_digest0,
10481 			.iv = ms_aes_cbc_iv0
10482 		},
10483 		{
10484 			.cipher_key = ms_aes_cbc_key1,
10485 			.hmac_key = ms_hmac_key1,
10486 			.cipher = ms_aes_cbc_cipher1,
10487 			.digest = ms_hmac_digest1,
10488 			.iv = ms_aes_cbc_iv1
10489 		},
10490 		{
10491 			.cipher_key = ms_aes_cbc_key2,
10492 			.hmac_key = ms_hmac_key2,
10493 			.cipher = ms_aes_cbc_cipher2,
10494 			.digest = ms_hmac_digest2,
10495 			.iv = ms_aes_cbc_iv2
10496 		},
10497 
10498 	};
10499 
10500 	/* Verify the capabilities */
10501 	struct rte_cryptodev_sym_capability_idx cap_idx;
10502 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10503 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10504 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10505 			&cap_idx) == NULL)
10506 		return -ENOTSUP;
10507 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10508 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10509 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10510 			&cap_idx) == NULL)
10511 		return -ENOTSUP;
10512 
10513 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10514 
10515 	sessions = rte_malloc(NULL,
10516 			(sizeof(struct rte_cryptodev_sym_session *)
10517 					* MAX_NB_SESSIONS) + 1, 0);
10518 
10519 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10520 		sessions[i] = rte_cryptodev_sym_session_create(
10521 				ts_params->session_mpool);
10522 
10523 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10524 				sizeof(struct crypto_unittest_params));
10525 
10526 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10527 				&ut_paramz[i].ut_params,
10528 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10529 
10530 		/* Create multiple crypto sessions*/
10531 		rte_cryptodev_sym_session_init(
10532 				ts_params->valid_devs[0],
10533 				sessions[i],
10534 				&ut_paramz[i].ut_params.auth_xform,
10535 				ts_params->session_priv_mpool);
10536 
10537 		TEST_ASSERT_NOT_NULL(sessions[i],
10538 				"Session creation failed at session number %u",
10539 				i);
10540 
10541 	}
10542 
10543 	srand(time(NULL));
10544 	for (i = 0; i < 40000; i++) {
10545 
10546 		j = rand() % MB_SESSION_NUMBER;
10547 
10548 		TEST_ASSERT_SUCCESS(
10549 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
10550 					sessions[j],
10551 					&ut_paramz[j].ut_params,
10552 					ts_params, ut_paramz[j].cipher,
10553 					ut_paramz[j].digest,
10554 					ut_paramz[j].iv),
10555 			"Failed to perform decrypt on request number %u.", i);
10556 
10557 		if (ut_paramz[j].ut_params.op)
10558 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
10559 
10560 		/*
10561 		 * free mbuf - both obuf and ibuf are usually the same,
10562 		 * so check if they point at the same address is necessary,
10563 		 * to avoid freeing the mbuf twice.
10564 		 */
10565 		if (ut_paramz[j].ut_params.obuf) {
10566 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10567 			if (ut_paramz[j].ut_params.ibuf
10568 					== ut_paramz[j].ut_params.obuf)
10569 				ut_paramz[j].ut_params.ibuf = 0;
10570 			ut_paramz[j].ut_params.obuf = 0;
10571 		}
10572 		if (ut_paramz[j].ut_params.ibuf) {
10573 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10574 			ut_paramz[j].ut_params.ibuf = 0;
10575 		}
10576 	}
10577 
10578 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10579 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10580 				sessions[i]);
10581 		rte_cryptodev_sym_session_free(sessions[i]);
10582 	}
10583 
10584 	rte_free(sessions);
10585 
10586 	return TEST_SUCCESS;
10587 }
10588 
10589 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10590 			0xab, 0xab, 0xab, 0xab,
10591 			0xab, 0xab, 0xab, 0xab,
10592 			0xab, 0xab, 0xab, 0xab};
10593 
10594 static int
10595 test_null_invalid_operation(void)
10596 {
10597 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10598 	struct crypto_unittest_params *ut_params = &unittest_params;
10599 	int ret;
10600 
10601 	/* This test is for NULL PMD only */
10602 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10603 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10604 		return -ENOTSUP;
10605 
10606 	/* Setup Cipher Parameters */
10607 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10608 	ut_params->cipher_xform.next = NULL;
10609 
10610 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10611 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10612 
10613 	ut_params->sess = rte_cryptodev_sym_session_create(
10614 			ts_params->session_mpool);
10615 
10616 	/* Create Crypto session*/
10617 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10618 			ut_params->sess, &ut_params->cipher_xform,
10619 			ts_params->session_priv_mpool);
10620 	TEST_ASSERT(ret < 0,
10621 			"Session creation succeeded unexpectedly");
10622 
10623 
10624 	/* Setup HMAC Parameters */
10625 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10626 	ut_params->auth_xform.next = NULL;
10627 
10628 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10629 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10630 
10631 	ut_params->sess = rte_cryptodev_sym_session_create(
10632 			ts_params->session_mpool);
10633 
10634 	/* Create Crypto session*/
10635 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10636 			ut_params->sess, &ut_params->auth_xform,
10637 			ts_params->session_priv_mpool);
10638 	TEST_ASSERT(ret < 0,
10639 			"Session creation succeeded unexpectedly");
10640 
10641 	return TEST_SUCCESS;
10642 }
10643 
10644 
10645 #define NULL_BURST_LENGTH (32)
10646 
10647 static int
10648 test_null_burst_operation(void)
10649 {
10650 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10651 	struct crypto_unittest_params *ut_params = &unittest_params;
10652 
10653 	unsigned i, burst_len = NULL_BURST_LENGTH;
10654 
10655 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10656 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10657 
10658 	/* This test is for NULL PMD only */
10659 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10660 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10661 		return -ENOTSUP;
10662 
10663 	/* Setup Cipher Parameters */
10664 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10665 	ut_params->cipher_xform.next = &ut_params->auth_xform;
10666 
10667 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10668 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10669 
10670 	/* Setup HMAC Parameters */
10671 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10672 	ut_params->auth_xform.next = NULL;
10673 
10674 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10675 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10676 
10677 	ut_params->sess = rte_cryptodev_sym_session_create(
10678 			ts_params->session_mpool);
10679 
10680 	/* Create Crypto session*/
10681 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10682 			ut_params->sess, &ut_params->cipher_xform,
10683 			ts_params->session_priv_mpool);
10684 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10685 
10686 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10687 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10688 			burst_len, "failed to generate burst of crypto ops");
10689 
10690 	/* Generate an operation for each mbuf in burst */
10691 	for (i = 0; i < burst_len; i++) {
10692 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10693 
10694 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10695 
10696 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10697 				sizeof(unsigned));
10698 		*data = i;
10699 
10700 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10701 
10702 		burst[i]->sym->m_src = m;
10703 	}
10704 
10705 	/* Process crypto operation */
10706 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10707 			0, burst, burst_len),
10708 			burst_len,
10709 			"Error enqueuing burst");
10710 
10711 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10712 			0, burst_dequeued, burst_len),
10713 			burst_len,
10714 			"Error dequeuing burst");
10715 
10716 
10717 	for (i = 0; i < burst_len; i++) {
10718 		TEST_ASSERT_EQUAL(
10719 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10720 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10721 					uint32_t *),
10722 			"data not as expected");
10723 
10724 		rte_pktmbuf_free(burst[i]->sym->m_src);
10725 		rte_crypto_op_free(burst[i]);
10726 	}
10727 
10728 	return TEST_SUCCESS;
10729 }
10730 
10731 static void
10732 generate_gmac_large_plaintext(uint8_t *data)
10733 {
10734 	uint16_t i;
10735 
10736 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
10737 		memcpy(&data[i], &data[0], 32);
10738 }
10739 
10740 static int
10741 create_gmac_operation(enum rte_crypto_auth_operation op,
10742 		const struct gmac_test_data *tdata)
10743 {
10744 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10745 	struct crypto_unittest_params *ut_params = &unittest_params;
10746 	struct rte_crypto_sym_op *sym_op;
10747 
10748 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10749 
10750 	/* Generate Crypto op data structure */
10751 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10752 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10753 	TEST_ASSERT_NOT_NULL(ut_params->op,
10754 			"Failed to allocate symmetric crypto operation struct");
10755 
10756 	sym_op = ut_params->op->sym;
10757 
10758 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10759 			ut_params->ibuf, tdata->gmac_tag.len);
10760 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10761 			"no room to append digest");
10762 
10763 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10764 			ut_params->ibuf, plaintext_pad_len);
10765 
10766 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10767 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
10768 				tdata->gmac_tag.len);
10769 		debug_hexdump(stdout, "digest:",
10770 				sym_op->auth.digest.data,
10771 				tdata->gmac_tag.len);
10772 	}
10773 
10774 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
10775 			uint8_t *, IV_OFFSET);
10776 
10777 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
10778 
10779 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
10780 
10781 	sym_op->cipher.data.length = 0;
10782 	sym_op->cipher.data.offset = 0;
10783 
10784 	sym_op->auth.data.offset = 0;
10785 	sym_op->auth.data.length = tdata->plaintext.len;
10786 
10787 	return 0;
10788 }
10789 
10790 static int
10791 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
10792 		const struct gmac_test_data *tdata,
10793 		void *digest_mem, uint64_t digest_phys)
10794 {
10795 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10796 	struct crypto_unittest_params *ut_params = &unittest_params;
10797 	struct rte_crypto_sym_op *sym_op;
10798 
10799 	/* Generate Crypto op data structure */
10800 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10801 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10802 	TEST_ASSERT_NOT_NULL(ut_params->op,
10803 			"Failed to allocate symmetric crypto operation struct");
10804 
10805 	sym_op = ut_params->op->sym;
10806 
10807 	sym_op->auth.digest.data = digest_mem;
10808 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10809 			"no room to append digest");
10810 
10811 	sym_op->auth.digest.phys_addr = digest_phys;
10812 
10813 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10814 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
10815 				tdata->gmac_tag.len);
10816 		debug_hexdump(stdout, "digest:",
10817 				sym_op->auth.digest.data,
10818 				tdata->gmac_tag.len);
10819 	}
10820 
10821 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
10822 			uint8_t *, IV_OFFSET);
10823 
10824 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
10825 
10826 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
10827 
10828 	sym_op->cipher.data.length = 0;
10829 	sym_op->cipher.data.offset = 0;
10830 
10831 	sym_op->auth.data.offset = 0;
10832 	sym_op->auth.data.length = tdata->plaintext.len;
10833 
10834 	return 0;
10835 }
10836 
10837 static int create_gmac_session(uint8_t dev_id,
10838 		const struct gmac_test_data *tdata,
10839 		enum rte_crypto_auth_operation auth_op)
10840 {
10841 	uint8_t auth_key[tdata->key.len];
10842 
10843 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10844 	struct crypto_unittest_params *ut_params = &unittest_params;
10845 
10846 	memcpy(auth_key, tdata->key.data, tdata->key.len);
10847 
10848 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10849 	ut_params->auth_xform.next = NULL;
10850 
10851 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
10852 	ut_params->auth_xform.auth.op = auth_op;
10853 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
10854 	ut_params->auth_xform.auth.key.length = tdata->key.len;
10855 	ut_params->auth_xform.auth.key.data = auth_key;
10856 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
10857 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
10858 
10859 
10860 	ut_params->sess = rte_cryptodev_sym_session_create(
10861 			ts_params->session_mpool);
10862 
10863 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
10864 			&ut_params->auth_xform,
10865 			ts_params->session_priv_mpool);
10866 
10867 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10868 
10869 	return 0;
10870 }
10871 
10872 static int
10873 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
10874 {
10875 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10876 	struct crypto_unittest_params *ut_params = &unittest_params;
10877 	struct rte_cryptodev_info dev_info;
10878 
10879 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10880 	uint64_t feat_flags = dev_info.feature_flags;
10881 
10882 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10883 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10884 		printf("Device doesn't support RAW data-path APIs.\n");
10885 		return -ENOTSUP;
10886 	}
10887 
10888 	int retval;
10889 
10890 	uint8_t *auth_tag, *plaintext;
10891 	uint16_t plaintext_pad_len;
10892 
10893 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
10894 			      "No GMAC length in the source data");
10895 
10896 	/* Verify the capabilities */
10897 	struct rte_cryptodev_sym_capability_idx cap_idx;
10898 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10899 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
10900 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10901 			&cap_idx) == NULL)
10902 		return -ENOTSUP;
10903 
10904 	retval = create_gmac_session(ts_params->valid_devs[0],
10905 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
10906 
10907 	if (retval < 0)
10908 		return retval;
10909 
10910 	if (tdata->plaintext.len > MBUF_SIZE)
10911 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10912 	else
10913 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10914 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
10915 			"Failed to allocate input buffer in mempool");
10916 
10917 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10918 			rte_pktmbuf_tailroom(ut_params->ibuf));
10919 
10920 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
10921 	/*
10922 	 * Runtime generate the large plain text instead of use hard code
10923 	 * plain text vector. It is done to avoid create huge source file
10924 	 * with the test vector.
10925 	 */
10926 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
10927 		generate_gmac_large_plaintext(tdata->plaintext.data);
10928 
10929 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10930 				plaintext_pad_len);
10931 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
10932 
10933 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
10934 	debug_hexdump(stdout, "plaintext:", plaintext,
10935 			tdata->plaintext.len);
10936 
10937 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
10938 			tdata);
10939 
10940 	if (retval < 0)
10941 		return retval;
10942 
10943 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10944 
10945 	ut_params->op->sym->m_src = ut_params->ibuf;
10946 
10947 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10948 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10949 			ut_params->op);
10950 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10951 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10952 				ut_params->op, 0, 1, 0, 0);
10953 	else
10954 		TEST_ASSERT_NOT_NULL(
10955 			process_crypto_request(ts_params->valid_devs[0],
10956 			ut_params->op), "failed to process sym crypto op");
10957 
10958 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10959 			"crypto op processing failed");
10960 
10961 	if (ut_params->op->sym->m_dst) {
10962 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10963 				uint8_t *, plaintext_pad_len);
10964 	} else {
10965 		auth_tag = plaintext + plaintext_pad_len;
10966 	}
10967 
10968 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
10969 
10970 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10971 			auth_tag,
10972 			tdata->gmac_tag.data,
10973 			tdata->gmac_tag.len,
10974 			"GMAC Generated auth tag not as expected");
10975 
10976 	return 0;
10977 }
10978 
10979 static int
10980 test_AES_GMAC_authentication_test_case_1(void)
10981 {
10982 	return test_AES_GMAC_authentication(&gmac_test_case_1);
10983 }
10984 
10985 static int
10986 test_AES_GMAC_authentication_test_case_2(void)
10987 {
10988 	return test_AES_GMAC_authentication(&gmac_test_case_2);
10989 }
10990 
10991 static int
10992 test_AES_GMAC_authentication_test_case_3(void)
10993 {
10994 	return test_AES_GMAC_authentication(&gmac_test_case_3);
10995 }
10996 
10997 static int
10998 test_AES_GMAC_authentication_test_case_4(void)
10999 {
11000 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11001 }
11002 
11003 static int
11004 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11005 {
11006 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11007 	struct crypto_unittest_params *ut_params = &unittest_params;
11008 	int retval;
11009 	uint32_t plaintext_pad_len;
11010 	uint8_t *plaintext;
11011 	struct rte_cryptodev_info dev_info;
11012 
11013 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11014 	uint64_t feat_flags = dev_info.feature_flags;
11015 
11016 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11017 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11018 		printf("Device doesn't support RAW data-path APIs.\n");
11019 		return -ENOTSUP;
11020 	}
11021 
11022 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11023 			      "No GMAC length in the source data");
11024 
11025 	/* Verify the capabilities */
11026 	struct rte_cryptodev_sym_capability_idx cap_idx;
11027 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11028 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11029 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11030 			&cap_idx) == NULL)
11031 		return -ENOTSUP;
11032 
11033 	retval = create_gmac_session(ts_params->valid_devs[0],
11034 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11035 
11036 	if (retval < 0)
11037 		return retval;
11038 
11039 	if (tdata->plaintext.len > MBUF_SIZE)
11040 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11041 	else
11042 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11043 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11044 			"Failed to allocate input buffer in mempool");
11045 
11046 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11047 			rte_pktmbuf_tailroom(ut_params->ibuf));
11048 
11049 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11050 
11051 	/*
11052 	 * Runtime generate the large plain text instead of use hard code
11053 	 * plain text vector. It is done to avoid create huge source file
11054 	 * with the test vector.
11055 	 */
11056 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11057 		generate_gmac_large_plaintext(tdata->plaintext.data);
11058 
11059 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11060 				plaintext_pad_len);
11061 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11062 
11063 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11064 	debug_hexdump(stdout, "plaintext:", plaintext,
11065 			tdata->plaintext.len);
11066 
11067 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11068 			tdata);
11069 
11070 	if (retval < 0)
11071 		return retval;
11072 
11073 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11074 
11075 	ut_params->op->sym->m_src = ut_params->ibuf;
11076 
11077 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11078 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11079 			ut_params->op);
11080 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11081 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11082 				ut_params->op, 0, 1, 0, 0);
11083 	else
11084 		TEST_ASSERT_NOT_NULL(
11085 			process_crypto_request(ts_params->valid_devs[0],
11086 			ut_params->op), "failed to process sym crypto op");
11087 
11088 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11089 			"crypto op processing failed");
11090 
11091 	return 0;
11092 
11093 }
11094 
11095 static int
11096 test_AES_GMAC_authentication_verify_test_case_1(void)
11097 {
11098 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11099 }
11100 
11101 static int
11102 test_AES_GMAC_authentication_verify_test_case_2(void)
11103 {
11104 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11105 }
11106 
11107 static int
11108 test_AES_GMAC_authentication_verify_test_case_3(void)
11109 {
11110 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11111 }
11112 
11113 static int
11114 test_AES_GMAC_authentication_verify_test_case_4(void)
11115 {
11116 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11117 }
11118 
11119 static int
11120 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11121 				uint32_t fragsz)
11122 {
11123 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11124 	struct crypto_unittest_params *ut_params = &unittest_params;
11125 	struct rte_cryptodev_info dev_info;
11126 	uint64_t feature_flags;
11127 	unsigned int trn_data = 0;
11128 	void *digest_mem = NULL;
11129 	uint32_t segs = 1;
11130 	unsigned int to_trn = 0;
11131 	struct rte_mbuf *buf = NULL;
11132 	uint8_t *auth_tag, *plaintext;
11133 	int retval;
11134 
11135 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11136 			      "No GMAC length in the source data");
11137 
11138 	/* Verify the capabilities */
11139 	struct rte_cryptodev_sym_capability_idx cap_idx;
11140 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11141 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11142 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11143 			&cap_idx) == NULL)
11144 		return -ENOTSUP;
11145 
11146 	/* Check for any input SGL support */
11147 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11148 	feature_flags = dev_info.feature_flags;
11149 
11150 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) &&
11151 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) &&
11152 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11153 		return -ENOTSUP;
11154 
11155 	if (fragsz > tdata->plaintext.len)
11156 		fragsz = tdata->plaintext.len;
11157 
11158 	uint16_t plaintext_len = fragsz;
11159 
11160 	retval = create_gmac_session(ts_params->valid_devs[0],
11161 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11162 
11163 	if (retval < 0)
11164 		return retval;
11165 
11166 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11167 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11168 			"Failed to allocate input buffer in mempool");
11169 
11170 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11171 			rte_pktmbuf_tailroom(ut_params->ibuf));
11172 
11173 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11174 				plaintext_len);
11175 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11176 
11177 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11178 
11179 	trn_data += plaintext_len;
11180 
11181 	buf = ut_params->ibuf;
11182 
11183 	/*
11184 	 * Loop until no more fragments
11185 	 */
11186 
11187 	while (trn_data < tdata->plaintext.len) {
11188 		++segs;
11189 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11190 				(tdata->plaintext.len - trn_data) : fragsz;
11191 
11192 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11193 		buf = buf->next;
11194 
11195 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11196 				rte_pktmbuf_tailroom(buf));
11197 
11198 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11199 				to_trn);
11200 
11201 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11202 				to_trn);
11203 		trn_data += to_trn;
11204 		if (trn_data  == tdata->plaintext.len)
11205 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11206 					tdata->gmac_tag.len);
11207 	}
11208 	ut_params->ibuf->nb_segs = segs;
11209 
11210 	/*
11211 	 * Place digest at the end of the last buffer
11212 	 */
11213 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11214 
11215 	if (!digest_mem) {
11216 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11217 				+ tdata->gmac_tag.len);
11218 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11219 				tdata->plaintext.len);
11220 	}
11221 
11222 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11223 			tdata, digest_mem, digest_phys);
11224 
11225 	if (retval < 0)
11226 		return retval;
11227 
11228 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11229 
11230 	ut_params->op->sym->m_src = ut_params->ibuf;
11231 
11232 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11233 		return -ENOTSUP;
11234 
11235 	TEST_ASSERT_NOT_NULL(
11236 		process_crypto_request(ts_params->valid_devs[0],
11237 		ut_params->op), "failed to process sym crypto op");
11238 
11239 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11240 			"crypto op processing failed");
11241 
11242 	auth_tag = digest_mem;
11243 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11244 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11245 			auth_tag,
11246 			tdata->gmac_tag.data,
11247 			tdata->gmac_tag.len,
11248 			"GMAC Generated auth tag not as expected");
11249 
11250 	return 0;
11251 }
11252 
11253 /* Segment size not multiple of block size (16B) */
11254 static int
11255 test_AES_GMAC_authentication_SGL_40B(void)
11256 {
11257 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11258 }
11259 
11260 static int
11261 test_AES_GMAC_authentication_SGL_80B(void)
11262 {
11263 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11264 }
11265 
11266 static int
11267 test_AES_GMAC_authentication_SGL_2048B(void)
11268 {
11269 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11270 }
11271 
11272 /* Segment size not multiple of block size (16B) */
11273 static int
11274 test_AES_GMAC_authentication_SGL_2047B(void)
11275 {
11276 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11277 }
11278 
11279 struct test_crypto_vector {
11280 	enum rte_crypto_cipher_algorithm crypto_algo;
11281 	unsigned int cipher_offset;
11282 	unsigned int cipher_len;
11283 
11284 	struct {
11285 		uint8_t data[64];
11286 		unsigned int len;
11287 	} cipher_key;
11288 
11289 	struct {
11290 		uint8_t data[64];
11291 		unsigned int len;
11292 	} iv;
11293 
11294 	struct {
11295 		const uint8_t *data;
11296 		unsigned int len;
11297 	} plaintext;
11298 
11299 	struct {
11300 		const uint8_t *data;
11301 		unsigned int len;
11302 	} ciphertext;
11303 
11304 	enum rte_crypto_auth_algorithm auth_algo;
11305 	unsigned int auth_offset;
11306 
11307 	struct {
11308 		uint8_t data[128];
11309 		unsigned int len;
11310 	} auth_key;
11311 
11312 	struct {
11313 		const uint8_t *data;
11314 		unsigned int len;
11315 	} aad;
11316 
11317 	struct {
11318 		uint8_t data[128];
11319 		unsigned int len;
11320 	} digest;
11321 };
11322 
11323 static const struct test_crypto_vector
11324 hmac_sha1_test_crypto_vector = {
11325 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11326 	.plaintext = {
11327 		.data = plaintext_hash,
11328 		.len = 512
11329 	},
11330 	.auth_key = {
11331 		.data = {
11332 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11333 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11334 			0xDE, 0xF4, 0xDE, 0xAD
11335 		},
11336 		.len = 20
11337 	},
11338 	.digest = {
11339 		.data = {
11340 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11341 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11342 			0x3F, 0x91, 0x64, 0x59
11343 		},
11344 		.len = 20
11345 	}
11346 };
11347 
11348 static const struct test_crypto_vector
11349 aes128_gmac_test_vector = {
11350 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11351 	.plaintext = {
11352 		.data = plaintext_hash,
11353 		.len = 512
11354 	},
11355 	.iv = {
11356 		.data = {
11357 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11358 			0x08, 0x09, 0x0A, 0x0B
11359 		},
11360 		.len = 12
11361 	},
11362 	.auth_key = {
11363 		.data = {
11364 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11365 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11366 		},
11367 		.len = 16
11368 	},
11369 	.digest = {
11370 		.data = {
11371 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11372 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11373 		},
11374 		.len = 16
11375 	}
11376 };
11377 
11378 static const struct test_crypto_vector
11379 aes128cbc_hmac_sha1_test_vector = {
11380 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11381 	.cipher_offset = 0,
11382 	.cipher_len = 512,
11383 	.cipher_key = {
11384 		.data = {
11385 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11386 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11387 		},
11388 		.len = 16
11389 	},
11390 	.iv = {
11391 		.data = {
11392 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11393 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11394 		},
11395 		.len = 16
11396 	},
11397 	.plaintext = {
11398 		.data = plaintext_hash,
11399 		.len = 512
11400 	},
11401 	.ciphertext = {
11402 		.data = ciphertext512_aes128cbc,
11403 		.len = 512
11404 	},
11405 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11406 	.auth_offset = 0,
11407 	.auth_key = {
11408 		.data = {
11409 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11410 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11411 			0xDE, 0xF4, 0xDE, 0xAD
11412 		},
11413 		.len = 20
11414 	},
11415 	.digest = {
11416 		.data = {
11417 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11418 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11419 			0x18, 0x8C, 0x1D, 0x32
11420 		},
11421 		.len = 20
11422 	}
11423 };
11424 
11425 static const struct test_crypto_vector
11426 aes128cbc_hmac_sha1_aad_test_vector = {
11427 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11428 	.cipher_offset = 8,
11429 	.cipher_len = 496,
11430 	.cipher_key = {
11431 		.data = {
11432 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11433 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11434 		},
11435 		.len = 16
11436 	},
11437 	.iv = {
11438 		.data = {
11439 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11440 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11441 		},
11442 		.len = 16
11443 	},
11444 	.plaintext = {
11445 		.data = plaintext_hash,
11446 		.len = 512
11447 	},
11448 	.ciphertext = {
11449 		.data = ciphertext512_aes128cbc_aad,
11450 		.len = 512
11451 	},
11452 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11453 	.auth_offset = 0,
11454 	.auth_key = {
11455 		.data = {
11456 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11457 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11458 			0xDE, 0xF4, 0xDE, 0xAD
11459 		},
11460 		.len = 20
11461 	},
11462 	.digest = {
11463 		.data = {
11464 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11465 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11466 			0x62, 0x0F, 0xFB, 0x10
11467 		},
11468 		.len = 20
11469 	}
11470 };
11471 
11472 static void
11473 data_corruption(uint8_t *data)
11474 {
11475 	data[0] += 1;
11476 }
11477 
11478 static void
11479 tag_corruption(uint8_t *data, unsigned int tag_offset)
11480 {
11481 	data[tag_offset] += 1;
11482 }
11483 
11484 static int
11485 create_auth_session(struct crypto_unittest_params *ut_params,
11486 		uint8_t dev_id,
11487 		const struct test_crypto_vector *reference,
11488 		enum rte_crypto_auth_operation auth_op)
11489 {
11490 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11491 	uint8_t auth_key[reference->auth_key.len + 1];
11492 
11493 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11494 
11495 	/* Setup Authentication Parameters */
11496 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11497 	ut_params->auth_xform.auth.op = auth_op;
11498 	ut_params->auth_xform.next = NULL;
11499 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11500 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11501 	ut_params->auth_xform.auth.key.data = auth_key;
11502 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11503 
11504 	/* Create Crypto session*/
11505 	ut_params->sess = rte_cryptodev_sym_session_create(
11506 			ts_params->session_mpool);
11507 
11508 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11509 				&ut_params->auth_xform,
11510 				ts_params->session_priv_mpool);
11511 
11512 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11513 
11514 	return 0;
11515 }
11516 
11517 static int
11518 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11519 		uint8_t dev_id,
11520 		const struct test_crypto_vector *reference,
11521 		enum rte_crypto_auth_operation auth_op,
11522 		enum rte_crypto_cipher_operation cipher_op)
11523 {
11524 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11525 	uint8_t cipher_key[reference->cipher_key.len + 1];
11526 	uint8_t auth_key[reference->auth_key.len + 1];
11527 
11528 	memcpy(cipher_key, reference->cipher_key.data,
11529 			reference->cipher_key.len);
11530 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11531 
11532 	/* Setup Authentication Parameters */
11533 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11534 	ut_params->auth_xform.auth.op = auth_op;
11535 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11536 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11537 	ut_params->auth_xform.auth.key.data = auth_key;
11538 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11539 
11540 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11541 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11542 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
11543 	} else {
11544 		ut_params->auth_xform.next = &ut_params->cipher_xform;
11545 
11546 		/* Setup Cipher Parameters */
11547 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11548 		ut_params->cipher_xform.next = NULL;
11549 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11550 		ut_params->cipher_xform.cipher.op = cipher_op;
11551 		ut_params->cipher_xform.cipher.key.data = cipher_key;
11552 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11553 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11554 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11555 	}
11556 
11557 	/* Create Crypto session*/
11558 	ut_params->sess = rte_cryptodev_sym_session_create(
11559 			ts_params->session_mpool);
11560 
11561 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11562 				&ut_params->auth_xform,
11563 				ts_params->session_priv_mpool);
11564 
11565 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11566 
11567 	return 0;
11568 }
11569 
11570 static int
11571 create_auth_operation(struct crypto_testsuite_params *ts_params,
11572 		struct crypto_unittest_params *ut_params,
11573 		const struct test_crypto_vector *reference,
11574 		unsigned int auth_generate)
11575 {
11576 	/* Generate Crypto op data structure */
11577 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11578 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11579 	TEST_ASSERT_NOT_NULL(ut_params->op,
11580 			"Failed to allocate pktmbuf offload");
11581 
11582 	/* Set crypto operation data parameters */
11583 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11584 
11585 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11586 
11587 	/* set crypto operation source mbuf */
11588 	sym_op->m_src = ut_params->ibuf;
11589 
11590 	/* digest */
11591 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11592 			ut_params->ibuf, reference->digest.len);
11593 
11594 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11595 			"no room to append auth tag");
11596 
11597 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11598 			ut_params->ibuf, reference->plaintext.len);
11599 
11600 	if (auth_generate)
11601 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11602 	else
11603 		memcpy(sym_op->auth.digest.data,
11604 				reference->digest.data,
11605 				reference->digest.len);
11606 
11607 	debug_hexdump(stdout, "digest:",
11608 			sym_op->auth.digest.data,
11609 			reference->digest.len);
11610 
11611 	sym_op->auth.data.length = reference->plaintext.len;
11612 	sym_op->auth.data.offset = 0;
11613 
11614 	return 0;
11615 }
11616 
11617 static int
11618 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11619 		struct crypto_unittest_params *ut_params,
11620 		const struct test_crypto_vector *reference,
11621 		unsigned int auth_generate)
11622 {
11623 	/* Generate Crypto op data structure */
11624 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11625 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11626 	TEST_ASSERT_NOT_NULL(ut_params->op,
11627 			"Failed to allocate pktmbuf offload");
11628 
11629 	/* Set crypto operation data parameters */
11630 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11631 
11632 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11633 
11634 	/* set crypto operation source mbuf */
11635 	sym_op->m_src = ut_params->ibuf;
11636 
11637 	/* digest */
11638 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11639 			ut_params->ibuf, reference->digest.len);
11640 
11641 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11642 			"no room to append auth tag");
11643 
11644 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11645 			ut_params->ibuf, reference->ciphertext.len);
11646 
11647 	if (auth_generate)
11648 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11649 	else
11650 		memcpy(sym_op->auth.digest.data,
11651 				reference->digest.data,
11652 				reference->digest.len);
11653 
11654 	debug_hexdump(stdout, "digest:",
11655 			sym_op->auth.digest.data,
11656 			reference->digest.len);
11657 
11658 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11659 			reference->iv.data, reference->iv.len);
11660 
11661 	sym_op->cipher.data.length = 0;
11662 	sym_op->cipher.data.offset = 0;
11663 
11664 	sym_op->auth.data.length = reference->plaintext.len;
11665 	sym_op->auth.data.offset = 0;
11666 
11667 	return 0;
11668 }
11669 
11670 static int
11671 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11672 		struct crypto_unittest_params *ut_params,
11673 		const struct test_crypto_vector *reference,
11674 		unsigned int auth_generate)
11675 {
11676 	/* Generate Crypto op data structure */
11677 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11678 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11679 	TEST_ASSERT_NOT_NULL(ut_params->op,
11680 			"Failed to allocate pktmbuf offload");
11681 
11682 	/* Set crypto operation data parameters */
11683 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11684 
11685 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11686 
11687 	/* set crypto operation source mbuf */
11688 	sym_op->m_src = ut_params->ibuf;
11689 
11690 	/* digest */
11691 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11692 			ut_params->ibuf, reference->digest.len);
11693 
11694 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11695 			"no room to append auth tag");
11696 
11697 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11698 			ut_params->ibuf, reference->ciphertext.len);
11699 
11700 	if (auth_generate)
11701 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11702 	else
11703 		memcpy(sym_op->auth.digest.data,
11704 				reference->digest.data,
11705 				reference->digest.len);
11706 
11707 	debug_hexdump(stdout, "digest:",
11708 			sym_op->auth.digest.data,
11709 			reference->digest.len);
11710 
11711 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11712 			reference->iv.data, reference->iv.len);
11713 
11714 	sym_op->cipher.data.length = reference->cipher_len;
11715 	sym_op->cipher.data.offset = reference->cipher_offset;
11716 
11717 	sym_op->auth.data.length = reference->plaintext.len;
11718 	sym_op->auth.data.offset = reference->auth_offset;
11719 
11720 	return 0;
11721 }
11722 
11723 static int
11724 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11725 		struct crypto_unittest_params *ut_params,
11726 		const struct test_crypto_vector *reference)
11727 {
11728 	return create_auth_operation(ts_params, ut_params, reference, 0);
11729 }
11730 
11731 static int
11732 create_auth_verify_GMAC_operation(
11733 		struct crypto_testsuite_params *ts_params,
11734 		struct crypto_unittest_params *ut_params,
11735 		const struct test_crypto_vector *reference)
11736 {
11737 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
11738 }
11739 
11740 static int
11741 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11742 		struct crypto_unittest_params *ut_params,
11743 		const struct test_crypto_vector *reference)
11744 {
11745 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
11746 }
11747 
11748 static int
11749 test_authentication_verify_fail_when_data_corruption(
11750 		struct crypto_testsuite_params *ts_params,
11751 		struct crypto_unittest_params *ut_params,
11752 		const struct test_crypto_vector *reference,
11753 		unsigned int data_corrupted)
11754 {
11755 	int retval;
11756 
11757 	uint8_t *plaintext;
11758 	struct rte_cryptodev_info dev_info;
11759 
11760 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11761 	uint64_t feat_flags = dev_info.feature_flags;
11762 
11763 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11764 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11765 		printf("Device doesn't support RAW data-path APIs.\n");
11766 		return -ENOTSUP;
11767 	}
11768 
11769 	/* Verify the capabilities */
11770 	struct rte_cryptodev_sym_capability_idx cap_idx;
11771 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11772 	cap_idx.algo.auth = reference->auth_algo;
11773 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11774 			&cap_idx) == NULL)
11775 		return -ENOTSUP;
11776 
11777 
11778 	/* Create session */
11779 	retval = create_auth_session(ut_params,
11780 			ts_params->valid_devs[0],
11781 			reference,
11782 			RTE_CRYPTO_AUTH_OP_VERIFY);
11783 	if (retval < 0)
11784 		return retval;
11785 
11786 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11787 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11788 			"Failed to allocate input buffer in mempool");
11789 
11790 	/* clear mbuf payload */
11791 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11792 			rte_pktmbuf_tailroom(ut_params->ibuf));
11793 
11794 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11795 			reference->plaintext.len);
11796 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11797 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
11798 
11799 	debug_hexdump(stdout, "plaintext:", plaintext,
11800 		reference->plaintext.len);
11801 
11802 	/* Create operation */
11803 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
11804 
11805 	if (retval < 0)
11806 		return retval;
11807 
11808 	if (data_corrupted)
11809 		data_corruption(plaintext);
11810 	else
11811 		tag_corruption(plaintext, reference->plaintext.len);
11812 
11813 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11814 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11815 			ut_params->op);
11816 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11817 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11818 			"authentication not failed");
11819 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11820 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11821 				ut_params->op, 0, 1, 0, 0);
11822 	else {
11823 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11824 			ut_params->op);
11825 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11826 	}
11827 
11828 	return 0;
11829 }
11830 
11831 static int
11832 test_authentication_verify_GMAC_fail_when_corruption(
11833 		struct crypto_testsuite_params *ts_params,
11834 		struct crypto_unittest_params *ut_params,
11835 		const struct test_crypto_vector *reference,
11836 		unsigned int data_corrupted)
11837 {
11838 	int retval;
11839 	uint8_t *plaintext;
11840 	struct rte_cryptodev_info dev_info;
11841 
11842 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11843 	uint64_t feat_flags = dev_info.feature_flags;
11844 
11845 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11846 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11847 		printf("Device doesn't support RAW data-path APIs.\n");
11848 		return -ENOTSUP;
11849 	}
11850 
11851 	/* Verify the capabilities */
11852 	struct rte_cryptodev_sym_capability_idx cap_idx;
11853 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11854 	cap_idx.algo.auth = reference->auth_algo;
11855 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11856 			&cap_idx) == NULL)
11857 		return -ENOTSUP;
11858 
11859 	/* Create session */
11860 	retval = create_auth_cipher_session(ut_params,
11861 			ts_params->valid_devs[0],
11862 			reference,
11863 			RTE_CRYPTO_AUTH_OP_VERIFY,
11864 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
11865 	if (retval < 0)
11866 		return retval;
11867 
11868 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11869 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11870 			"Failed to allocate input buffer in mempool");
11871 
11872 	/* clear mbuf payload */
11873 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11874 			rte_pktmbuf_tailroom(ut_params->ibuf));
11875 
11876 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11877 			reference->plaintext.len);
11878 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11879 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
11880 
11881 	debug_hexdump(stdout, "plaintext:", plaintext,
11882 		reference->plaintext.len);
11883 
11884 	/* Create operation */
11885 	retval = create_auth_verify_GMAC_operation(ts_params,
11886 			ut_params,
11887 			reference);
11888 
11889 	if (retval < 0)
11890 		return retval;
11891 
11892 	if (data_corrupted)
11893 		data_corruption(plaintext);
11894 	else
11895 		tag_corruption(plaintext, reference->aad.len);
11896 
11897 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11898 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11899 			ut_params->op);
11900 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11901 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11902 			"authentication not failed");
11903 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11904 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11905 				ut_params->op, 0, 1, 0, 0);
11906 	else {
11907 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11908 			ut_params->op);
11909 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11910 	}
11911 
11912 	return 0;
11913 }
11914 
11915 static int
11916 test_authenticated_decryption_fail_when_corruption(
11917 		struct crypto_testsuite_params *ts_params,
11918 		struct crypto_unittest_params *ut_params,
11919 		const struct test_crypto_vector *reference,
11920 		unsigned int data_corrupted)
11921 {
11922 	int retval;
11923 
11924 	uint8_t *ciphertext;
11925 	struct rte_cryptodev_info dev_info;
11926 
11927 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11928 	uint64_t feat_flags = dev_info.feature_flags;
11929 
11930 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11931 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11932 		printf("Device doesn't support RAW data-path APIs.\n");
11933 		return -ENOTSUP;
11934 	}
11935 
11936 	/* Verify the capabilities */
11937 	struct rte_cryptodev_sym_capability_idx cap_idx;
11938 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11939 	cap_idx.algo.auth = reference->auth_algo;
11940 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11941 			&cap_idx) == NULL)
11942 		return -ENOTSUP;
11943 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11944 	cap_idx.algo.cipher = reference->crypto_algo;
11945 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11946 			&cap_idx) == NULL)
11947 		return -ENOTSUP;
11948 
11949 	/* Create session */
11950 	retval = create_auth_cipher_session(ut_params,
11951 			ts_params->valid_devs[0],
11952 			reference,
11953 			RTE_CRYPTO_AUTH_OP_VERIFY,
11954 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
11955 	if (retval < 0)
11956 		return retval;
11957 
11958 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11959 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11960 			"Failed to allocate input buffer in mempool");
11961 
11962 	/* clear mbuf payload */
11963 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11964 			rte_pktmbuf_tailroom(ut_params->ibuf));
11965 
11966 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11967 			reference->ciphertext.len);
11968 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
11969 	memcpy(ciphertext, reference->ciphertext.data,
11970 			reference->ciphertext.len);
11971 
11972 	/* Create operation */
11973 	retval = create_cipher_auth_verify_operation(ts_params,
11974 			ut_params,
11975 			reference);
11976 
11977 	if (retval < 0)
11978 		return retval;
11979 
11980 	if (data_corrupted)
11981 		data_corruption(ciphertext);
11982 	else
11983 		tag_corruption(ciphertext, reference->ciphertext.len);
11984 
11985 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
11986 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11987 			ut_params->op);
11988 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
11989 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11990 			"authentication not failed");
11991 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11992 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11993 				ut_params->op, 1, 1, 0, 0);
11994 	else {
11995 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
11996 			ut_params->op);
11997 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
11998 	}
11999 
12000 	return 0;
12001 }
12002 
12003 static int
12004 test_authenticated_encryt_with_esn(
12005 		struct crypto_testsuite_params *ts_params,
12006 		struct crypto_unittest_params *ut_params,
12007 		const struct test_crypto_vector *reference)
12008 {
12009 	int retval;
12010 
12011 	uint8_t *authciphertext, *plaintext, *auth_tag;
12012 	uint16_t plaintext_pad_len;
12013 	uint8_t cipher_key[reference->cipher_key.len + 1];
12014 	uint8_t auth_key[reference->auth_key.len + 1];
12015 	struct rte_cryptodev_info dev_info;
12016 
12017 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12018 	uint64_t feat_flags = dev_info.feature_flags;
12019 
12020 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12021 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12022 		printf("Device doesn't support RAW data-path APIs.\n");
12023 		return -ENOTSUP;
12024 	}
12025 
12026 	/* Verify the capabilities */
12027 	struct rte_cryptodev_sym_capability_idx cap_idx;
12028 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12029 	cap_idx.algo.auth = reference->auth_algo;
12030 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12031 			&cap_idx) == NULL)
12032 		return -ENOTSUP;
12033 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12034 	cap_idx.algo.cipher = reference->crypto_algo;
12035 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12036 			&cap_idx) == NULL)
12037 		return -ENOTSUP;
12038 
12039 	/* Create session */
12040 	memcpy(cipher_key, reference->cipher_key.data,
12041 			reference->cipher_key.len);
12042 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12043 
12044 	/* Setup Cipher Parameters */
12045 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12046 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12047 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12048 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12049 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12050 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12051 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12052 
12053 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12054 
12055 	/* Setup Authentication Parameters */
12056 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12057 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12058 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12059 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12060 	ut_params->auth_xform.auth.key.data = auth_key;
12061 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12062 	ut_params->auth_xform.next = NULL;
12063 
12064 	/* Create Crypto session*/
12065 	ut_params->sess = rte_cryptodev_sym_session_create(
12066 			ts_params->session_mpool);
12067 
12068 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12069 				ut_params->sess,
12070 				&ut_params->cipher_xform,
12071 				ts_params->session_priv_mpool);
12072 
12073 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12074 
12075 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12076 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12077 			"Failed to allocate input buffer in mempool");
12078 
12079 	/* clear mbuf payload */
12080 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12081 			rte_pktmbuf_tailroom(ut_params->ibuf));
12082 
12083 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12084 			reference->plaintext.len);
12085 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12086 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12087 
12088 	/* Create operation */
12089 	retval = create_cipher_auth_operation(ts_params,
12090 			ut_params,
12091 			reference, 0);
12092 
12093 	if (retval < 0)
12094 		return retval;
12095 
12096 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12097 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12098 			ut_params->op);
12099 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12100 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12101 				ut_params->op, 1, 1, 0, 0);
12102 	else
12103 		ut_params->op = process_crypto_request(
12104 			ts_params->valid_devs[0], ut_params->op);
12105 
12106 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12107 
12108 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12109 			"crypto op processing failed");
12110 
12111 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12112 
12113 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12114 			ut_params->op->sym->auth.data.offset);
12115 	auth_tag = authciphertext + plaintext_pad_len;
12116 	debug_hexdump(stdout, "ciphertext:", authciphertext,
12117 			reference->ciphertext.len);
12118 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12119 
12120 	/* Validate obuf */
12121 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12122 			authciphertext,
12123 			reference->ciphertext.data,
12124 			reference->ciphertext.len,
12125 			"Ciphertext data not as expected");
12126 
12127 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12128 			auth_tag,
12129 			reference->digest.data,
12130 			reference->digest.len,
12131 			"Generated digest not as expected");
12132 
12133 	return TEST_SUCCESS;
12134 
12135 }
12136 
12137 static int
12138 test_authenticated_decrypt_with_esn(
12139 		struct crypto_testsuite_params *ts_params,
12140 		struct crypto_unittest_params *ut_params,
12141 		const struct test_crypto_vector *reference)
12142 {
12143 	int retval;
12144 
12145 	uint8_t *ciphertext;
12146 	uint8_t cipher_key[reference->cipher_key.len + 1];
12147 	uint8_t auth_key[reference->auth_key.len + 1];
12148 	struct rte_cryptodev_info dev_info;
12149 
12150 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12151 	uint64_t feat_flags = dev_info.feature_flags;
12152 
12153 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12154 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12155 		printf("Device doesn't support RAW data-path APIs.\n");
12156 		return -ENOTSUP;
12157 	}
12158 
12159 	/* Verify the capabilities */
12160 	struct rte_cryptodev_sym_capability_idx cap_idx;
12161 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12162 	cap_idx.algo.auth = reference->auth_algo;
12163 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12164 			&cap_idx) == NULL)
12165 		return -ENOTSUP;
12166 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12167 	cap_idx.algo.cipher = reference->crypto_algo;
12168 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12169 			&cap_idx) == NULL)
12170 		return -ENOTSUP;
12171 
12172 	/* Create session */
12173 	memcpy(cipher_key, reference->cipher_key.data,
12174 			reference->cipher_key.len);
12175 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12176 
12177 	/* Setup Authentication Parameters */
12178 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12179 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12180 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12181 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12182 	ut_params->auth_xform.auth.key.data = auth_key;
12183 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12184 	ut_params->auth_xform.next = &ut_params->cipher_xform;
12185 
12186 	/* Setup Cipher Parameters */
12187 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12188 	ut_params->cipher_xform.next = NULL;
12189 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12190 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12191 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12192 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12193 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12194 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12195 
12196 	/* Create Crypto session*/
12197 	ut_params->sess = rte_cryptodev_sym_session_create(
12198 			ts_params->session_mpool);
12199 
12200 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12201 				ut_params->sess,
12202 				&ut_params->auth_xform,
12203 				ts_params->session_priv_mpool);
12204 
12205 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
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 (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12230 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12231 			ut_params->op);
12232 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12233 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12234 				ut_params->op, 1, 1, 0, 0);
12235 	else
12236 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12237 			ut_params->op);
12238 
12239 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12240 	TEST_ASSERT_EQUAL(ut_params->op->status,
12241 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12242 			"crypto op processing passed");
12243 
12244 	ut_params->obuf = ut_params->op->sym->m_src;
12245 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12246 
12247 	return 0;
12248 }
12249 
12250 static int
12251 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12252 		const struct aead_test_data *tdata,
12253 		void *digest_mem, uint64_t digest_phys)
12254 {
12255 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12256 	struct crypto_unittest_params *ut_params = &unittest_params;
12257 
12258 	const unsigned int auth_tag_len = tdata->auth_tag.len;
12259 	const unsigned int iv_len = tdata->iv.len;
12260 	unsigned int aad_len = tdata->aad.len;
12261 	unsigned int aad_len_pad = 0;
12262 
12263 	/* Generate Crypto op data structure */
12264 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12265 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12266 	TEST_ASSERT_NOT_NULL(ut_params->op,
12267 		"Failed to allocate symmetric crypto operation struct");
12268 
12269 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12270 
12271 	sym_op->aead.digest.data = digest_mem;
12272 
12273 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12274 			"no room to append digest");
12275 
12276 	sym_op->aead.digest.phys_addr = digest_phys;
12277 
12278 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12279 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12280 				auth_tag_len);
12281 		debug_hexdump(stdout, "digest:",
12282 				sym_op->aead.digest.data,
12283 				auth_tag_len);
12284 	}
12285 
12286 	/* Append aad data */
12287 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12288 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12289 				uint8_t *, IV_OFFSET);
12290 
12291 		/* Copy IV 1 byte after the IV pointer, according to the API */
12292 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12293 
12294 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12295 
12296 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12297 				ut_params->ibuf, aad_len);
12298 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12299 				"no room to prepend aad");
12300 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12301 				ut_params->ibuf);
12302 
12303 		memset(sym_op->aead.aad.data, 0, aad_len);
12304 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
12305 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12306 
12307 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12308 		debug_hexdump(stdout, "aad:",
12309 				sym_op->aead.aad.data, aad_len);
12310 	} else {
12311 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12312 				uint8_t *, IV_OFFSET);
12313 
12314 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12315 
12316 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12317 
12318 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12319 				ut_params->ibuf, aad_len_pad);
12320 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12321 				"no room to prepend aad");
12322 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12323 				ut_params->ibuf);
12324 
12325 		memset(sym_op->aead.aad.data, 0, aad_len);
12326 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12327 
12328 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12329 		debug_hexdump(stdout, "aad:",
12330 				sym_op->aead.aad.data, aad_len);
12331 	}
12332 
12333 	sym_op->aead.data.length = tdata->plaintext.len;
12334 	sym_op->aead.data.offset = aad_len_pad;
12335 
12336 	return 0;
12337 }
12338 
12339 #define SGL_MAX_NO	16
12340 
12341 static int
12342 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12343 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12344 {
12345 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12346 	struct crypto_unittest_params *ut_params = &unittest_params;
12347 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12348 	int retval;
12349 	int to_trn = 0;
12350 	int to_trn_tbl[SGL_MAX_NO];
12351 	int segs = 1;
12352 	unsigned int trn_data = 0;
12353 	uint8_t *plaintext, *ciphertext, *auth_tag;
12354 	struct rte_cryptodev_info dev_info;
12355 
12356 	/* Verify the capabilities */
12357 	struct rte_cryptodev_sym_capability_idx cap_idx;
12358 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12359 	cap_idx.algo.aead = tdata->algo;
12360 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12361 			&cap_idx) == NULL)
12362 		return -ENOTSUP;
12363 
12364 	/* OOP not supported with CPU crypto */
12365 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12366 		return -ENOTSUP;
12367 
12368 	/* Detailed check for the particular SGL support flag */
12369 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12370 	if (!oop) {
12371 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12372 		if (sgl_in && (!(dev_info.feature_flags &
12373 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12374 			return -ENOTSUP;
12375 
12376 		uint64_t feat_flags = dev_info.feature_flags;
12377 
12378 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12379 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12380 			printf("Device doesn't support RAW data-path APIs.\n");
12381 			return -ENOTSUP;
12382 		}
12383 	} else {
12384 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12385 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12386 				tdata->plaintext.len;
12387 		/* Raw data path API does not support OOP */
12388 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12389 			return -ENOTSUP;
12390 		if (sgl_in && !sgl_out) {
12391 			if (!(dev_info.feature_flags &
12392 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12393 				return -ENOTSUP;
12394 		} else if (!sgl_in && sgl_out) {
12395 			if (!(dev_info.feature_flags &
12396 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12397 				return -ENOTSUP;
12398 		} else if (sgl_in && sgl_out) {
12399 			if (!(dev_info.feature_flags &
12400 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12401 				return -ENOTSUP;
12402 		}
12403 	}
12404 
12405 	if (fragsz > tdata->plaintext.len)
12406 		fragsz = tdata->plaintext.len;
12407 
12408 	uint16_t plaintext_len = fragsz;
12409 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12410 
12411 	if (fragsz_oop > tdata->plaintext.len)
12412 		frag_size_oop = tdata->plaintext.len;
12413 
12414 	int ecx = 0;
12415 	void *digest_mem = NULL;
12416 
12417 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12418 
12419 	if (tdata->plaintext.len % fragsz != 0) {
12420 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12421 			return 1;
12422 	}	else {
12423 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12424 			return 1;
12425 	}
12426 
12427 	/*
12428 	 * For out-op-place we need to alloc another mbuf
12429 	 */
12430 	if (oop) {
12431 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12432 		rte_pktmbuf_append(ut_params->obuf,
12433 				frag_size_oop + prepend_len);
12434 		buf_oop = ut_params->obuf;
12435 	}
12436 
12437 	/* Create AEAD session */
12438 	retval = create_aead_session(ts_params->valid_devs[0],
12439 			tdata->algo,
12440 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
12441 			tdata->key.data, tdata->key.len,
12442 			tdata->aad.len, tdata->auth_tag.len,
12443 			tdata->iv.len);
12444 	if (retval < 0)
12445 		return retval;
12446 
12447 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12448 
12449 	/* clear mbuf payload */
12450 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12451 			rte_pktmbuf_tailroom(ut_params->ibuf));
12452 
12453 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12454 			plaintext_len);
12455 
12456 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12457 
12458 	trn_data += plaintext_len;
12459 
12460 	buf = ut_params->ibuf;
12461 
12462 	/*
12463 	 * Loop until no more fragments
12464 	 */
12465 
12466 	while (trn_data < tdata->plaintext.len) {
12467 		++segs;
12468 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12469 				(tdata->plaintext.len - trn_data) : fragsz;
12470 
12471 		to_trn_tbl[ecx++] = to_trn;
12472 
12473 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12474 		buf = buf->next;
12475 
12476 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12477 				rte_pktmbuf_tailroom(buf));
12478 
12479 		/* OOP */
12480 		if (oop && !fragsz_oop) {
12481 			buf_last_oop = buf_oop->next =
12482 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12483 			buf_oop = buf_oop->next;
12484 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12485 					0, rte_pktmbuf_tailroom(buf_oop));
12486 			rte_pktmbuf_append(buf_oop, to_trn);
12487 		}
12488 
12489 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12490 				to_trn);
12491 
12492 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12493 				to_trn);
12494 		trn_data += to_trn;
12495 		if (trn_data  == tdata->plaintext.len) {
12496 			if (oop) {
12497 				if (!fragsz_oop)
12498 					digest_mem = rte_pktmbuf_append(buf_oop,
12499 						tdata->auth_tag.len);
12500 			} else
12501 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12502 					tdata->auth_tag.len);
12503 		}
12504 	}
12505 
12506 	uint64_t digest_phys = 0;
12507 
12508 	ut_params->ibuf->nb_segs = segs;
12509 
12510 	segs = 1;
12511 	if (fragsz_oop && oop) {
12512 		to_trn = 0;
12513 		ecx = 0;
12514 
12515 		if (frag_size_oop == tdata->plaintext.len) {
12516 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
12517 				tdata->auth_tag.len);
12518 
12519 			digest_phys = rte_pktmbuf_iova_offset(
12520 					ut_params->obuf,
12521 					tdata->plaintext.len + prepend_len);
12522 		}
12523 
12524 		trn_data = frag_size_oop;
12525 		while (trn_data < tdata->plaintext.len) {
12526 			++segs;
12527 			to_trn =
12528 				(tdata->plaintext.len - trn_data <
12529 						frag_size_oop) ?
12530 				(tdata->plaintext.len - trn_data) :
12531 						frag_size_oop;
12532 
12533 			to_trn_tbl[ecx++] = to_trn;
12534 
12535 			buf_last_oop = buf_oop->next =
12536 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12537 			buf_oop = buf_oop->next;
12538 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12539 					0, rte_pktmbuf_tailroom(buf_oop));
12540 			rte_pktmbuf_append(buf_oop, to_trn);
12541 
12542 			trn_data += to_trn;
12543 
12544 			if (trn_data  == tdata->plaintext.len) {
12545 				digest_mem = rte_pktmbuf_append(buf_oop,
12546 					tdata->auth_tag.len);
12547 			}
12548 		}
12549 
12550 		ut_params->obuf->nb_segs = segs;
12551 	}
12552 
12553 	/*
12554 	 * Place digest at the end of the last buffer
12555 	 */
12556 	if (!digest_phys)
12557 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12558 	if (oop && buf_last_oop)
12559 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12560 
12561 	if (!digest_mem && !oop) {
12562 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12563 				+ tdata->auth_tag.len);
12564 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12565 				tdata->plaintext.len);
12566 	}
12567 
12568 	/* Create AEAD operation */
12569 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12570 			tdata, digest_mem, digest_phys);
12571 
12572 	if (retval < 0)
12573 		return retval;
12574 
12575 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12576 
12577 	ut_params->op->sym->m_src = ut_params->ibuf;
12578 	if (oop)
12579 		ut_params->op->sym->m_dst = ut_params->obuf;
12580 
12581 	/* Process crypto operation */
12582 	if (oop == IN_PLACE &&
12583 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12584 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12585 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12586 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12587 				ut_params->op, 0, 0, 0, 0);
12588 	else
12589 		TEST_ASSERT_NOT_NULL(
12590 			process_crypto_request(ts_params->valid_devs[0],
12591 			ut_params->op), "failed to process sym crypto op");
12592 
12593 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12594 			"crypto op processing failed");
12595 
12596 
12597 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12598 			uint8_t *, prepend_len);
12599 	if (oop) {
12600 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12601 				uint8_t *, prepend_len);
12602 	}
12603 
12604 	if (fragsz_oop)
12605 		fragsz = fragsz_oop;
12606 
12607 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12608 			ciphertext,
12609 			tdata->ciphertext.data,
12610 			fragsz,
12611 			"Ciphertext data not as expected");
12612 
12613 	buf = ut_params->op->sym->m_src->next;
12614 	if (oop)
12615 		buf = ut_params->op->sym->m_dst->next;
12616 
12617 	unsigned int off = fragsz;
12618 
12619 	ecx = 0;
12620 	while (buf) {
12621 		ciphertext = rte_pktmbuf_mtod(buf,
12622 				uint8_t *);
12623 
12624 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
12625 				ciphertext,
12626 				tdata->ciphertext.data + off,
12627 				to_trn_tbl[ecx],
12628 				"Ciphertext data not as expected");
12629 
12630 		off += to_trn_tbl[ecx++];
12631 		buf = buf->next;
12632 	}
12633 
12634 	auth_tag = digest_mem;
12635 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12636 			auth_tag,
12637 			tdata->auth_tag.data,
12638 			tdata->auth_tag.len,
12639 			"Generated auth tag not as expected");
12640 
12641 	return 0;
12642 }
12643 
12644 static int
12645 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12646 {
12647 	return test_authenticated_encryption_SGL(
12648 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12649 }
12650 
12651 static int
12652 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12653 {
12654 	return test_authenticated_encryption_SGL(
12655 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12656 }
12657 
12658 static int
12659 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12660 {
12661 	return test_authenticated_encryption_SGL(
12662 			&gcm_test_case_8, OUT_OF_PLACE, 400,
12663 			gcm_test_case_8.plaintext.len);
12664 }
12665 
12666 static int
12667 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12668 {
12669 	/* This test is not for OPENSSL PMD */
12670 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
12671 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12672 		return -ENOTSUP;
12673 
12674 	return test_authenticated_encryption_SGL(
12675 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12676 }
12677 
12678 static int
12679 test_authentication_verify_fail_when_data_corrupted(
12680 		struct crypto_testsuite_params *ts_params,
12681 		struct crypto_unittest_params *ut_params,
12682 		const struct test_crypto_vector *reference)
12683 {
12684 	return test_authentication_verify_fail_when_data_corruption(
12685 			ts_params, ut_params, reference, 1);
12686 }
12687 
12688 static int
12689 test_authentication_verify_fail_when_tag_corrupted(
12690 		struct crypto_testsuite_params *ts_params,
12691 		struct crypto_unittest_params *ut_params,
12692 		const struct test_crypto_vector *reference)
12693 {
12694 	return test_authentication_verify_fail_when_data_corruption(
12695 			ts_params, ut_params, reference, 0);
12696 }
12697 
12698 static int
12699 test_authentication_verify_GMAC_fail_when_data_corrupted(
12700 		struct crypto_testsuite_params *ts_params,
12701 		struct crypto_unittest_params *ut_params,
12702 		const struct test_crypto_vector *reference)
12703 {
12704 	return test_authentication_verify_GMAC_fail_when_corruption(
12705 			ts_params, ut_params, reference, 1);
12706 }
12707 
12708 static int
12709 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12710 		struct crypto_testsuite_params *ts_params,
12711 		struct crypto_unittest_params *ut_params,
12712 		const struct test_crypto_vector *reference)
12713 {
12714 	return test_authentication_verify_GMAC_fail_when_corruption(
12715 			ts_params, ut_params, reference, 0);
12716 }
12717 
12718 static int
12719 test_authenticated_decryption_fail_when_data_corrupted(
12720 		struct crypto_testsuite_params *ts_params,
12721 		struct crypto_unittest_params *ut_params,
12722 		const struct test_crypto_vector *reference)
12723 {
12724 	return test_authenticated_decryption_fail_when_corruption(
12725 			ts_params, ut_params, reference, 1);
12726 }
12727 
12728 static int
12729 test_authenticated_decryption_fail_when_tag_corrupted(
12730 		struct crypto_testsuite_params *ts_params,
12731 		struct crypto_unittest_params *ut_params,
12732 		const struct test_crypto_vector *reference)
12733 {
12734 	return test_authenticated_decryption_fail_when_corruption(
12735 			ts_params, ut_params, reference, 0);
12736 }
12737 
12738 static int
12739 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
12740 {
12741 	return test_authentication_verify_fail_when_data_corrupted(
12742 			&testsuite_params, &unittest_params,
12743 			&hmac_sha1_test_crypto_vector);
12744 }
12745 
12746 static int
12747 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
12748 {
12749 	return test_authentication_verify_fail_when_tag_corrupted(
12750 			&testsuite_params, &unittest_params,
12751 			&hmac_sha1_test_crypto_vector);
12752 }
12753 
12754 static int
12755 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
12756 {
12757 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
12758 			&testsuite_params, &unittest_params,
12759 			&aes128_gmac_test_vector);
12760 }
12761 
12762 static int
12763 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
12764 {
12765 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
12766 			&testsuite_params, &unittest_params,
12767 			&aes128_gmac_test_vector);
12768 }
12769 
12770 static int
12771 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
12772 {
12773 	return test_authenticated_decryption_fail_when_data_corrupted(
12774 			&testsuite_params,
12775 			&unittest_params,
12776 			&aes128cbc_hmac_sha1_test_vector);
12777 }
12778 
12779 static int
12780 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
12781 {
12782 	return test_authenticated_decryption_fail_when_tag_corrupted(
12783 			&testsuite_params,
12784 			&unittest_params,
12785 			&aes128cbc_hmac_sha1_test_vector);
12786 }
12787 
12788 static int
12789 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
12790 {
12791 	return test_authenticated_encryt_with_esn(
12792 			&testsuite_params,
12793 			&unittest_params,
12794 			&aes128cbc_hmac_sha1_aad_test_vector);
12795 }
12796 
12797 static int
12798 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
12799 {
12800 	return test_authenticated_decrypt_with_esn(
12801 			&testsuite_params,
12802 			&unittest_params,
12803 			&aes128cbc_hmac_sha1_aad_test_vector);
12804 }
12805 
12806 static int
12807 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
12808 {
12809 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
12810 }
12811 
12812 static int
12813 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
12814 {
12815 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
12816 }
12817 
12818 #ifdef RTE_CRYPTO_SCHEDULER
12819 
12820 /* global AESNI worker IDs for the scheduler test */
12821 uint8_t aesni_ids[2];
12822 
12823 static int
12824 test_scheduler_attach_slave_op(void)
12825 {
12826 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12827 	uint8_t sched_id = ts_params->valid_devs[0];
12828 	uint32_t nb_devs, i, nb_devs_attached = 0;
12829 	int ret;
12830 	char vdev_name[32];
12831 
12832 	/* create 2 AESNI_MB if necessary */
12833 	nb_devs = rte_cryptodev_device_count_by_driver(
12834 			rte_cryptodev_driver_id_get(
12835 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
12836 	if (nb_devs < 2) {
12837 		for (i = nb_devs; i < 2; i++) {
12838 			snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
12839 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
12840 					i);
12841 			ret = rte_vdev_init(vdev_name, NULL);
12842 
12843 			TEST_ASSERT(ret == 0,
12844 				"Failed to create instance %u of"
12845 				" pmd : %s",
12846 				i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
12847 		}
12848 	}
12849 
12850 	/* attach 2 AESNI_MB cdevs */
12851 	for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
12852 			i++) {
12853 		struct rte_cryptodev_info info;
12854 		unsigned int session_size;
12855 
12856 		rte_cryptodev_info_get(i, &info);
12857 		if (info.driver_id != rte_cryptodev_driver_id_get(
12858 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
12859 			continue;
12860 
12861 		session_size = rte_cryptodev_sym_get_private_session_size(i);
12862 		/*
12863 		 * Create the session mempool again, since now there are new devices
12864 		 * to use the mempool.
12865 		 */
12866 		if (ts_params->session_mpool) {
12867 			rte_mempool_free(ts_params->session_mpool);
12868 			ts_params->session_mpool = NULL;
12869 		}
12870 		if (ts_params->session_priv_mpool) {
12871 			rte_mempool_free(ts_params->session_priv_mpool);
12872 			ts_params->session_priv_mpool = NULL;
12873 		}
12874 
12875 		if (info.sym.max_nb_sessions != 0 &&
12876 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
12877 			RTE_LOG(ERR, USER1,
12878 					"Device does not support "
12879 					"at least %u sessions\n",
12880 					MAX_NB_SESSIONS);
12881 			return TEST_FAILED;
12882 		}
12883 		/*
12884 		 * Create mempool with maximum number of sessions,
12885 		 * to include the session headers
12886 		 */
12887 		if (ts_params->session_mpool == NULL) {
12888 			ts_params->session_mpool =
12889 				rte_cryptodev_sym_session_pool_create(
12890 						"test_sess_mp",
12891 						MAX_NB_SESSIONS, 0, 0, 0,
12892 						SOCKET_ID_ANY);
12893 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
12894 					"session mempool allocation failed");
12895 		}
12896 
12897 		/*
12898 		 * Create mempool with maximum number of sessions,
12899 		 * to include device specific session private data
12900 		 */
12901 		if (ts_params->session_priv_mpool == NULL) {
12902 			ts_params->session_priv_mpool = rte_mempool_create(
12903 					"test_sess_mp_priv",
12904 					MAX_NB_SESSIONS,
12905 					session_size,
12906 					0, 0, NULL, NULL, NULL,
12907 					NULL, SOCKET_ID_ANY,
12908 					0);
12909 
12910 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
12911 					"session mempool allocation failed");
12912 		}
12913 
12914 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
12915 		ts_params->qp_conf.mp_session_private =
12916 				ts_params->session_priv_mpool;
12917 
12918 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
12919 				(uint8_t)i);
12920 
12921 		TEST_ASSERT(ret == 0,
12922 			"Failed to attach device %u of pmd : %s", i,
12923 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
12924 
12925 		aesni_ids[nb_devs_attached] = (uint8_t)i;
12926 
12927 		nb_devs_attached++;
12928 	}
12929 
12930 	return 0;
12931 }
12932 
12933 static int
12934 test_scheduler_detach_slave_op(void)
12935 {
12936 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12937 	uint8_t sched_id = ts_params->valid_devs[0];
12938 	uint32_t i;
12939 	int ret;
12940 
12941 	for (i = 0; i < 2; i++) {
12942 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
12943 				aesni_ids[i]);
12944 		TEST_ASSERT(ret == 0,
12945 			"Failed to detach device %u", aesni_ids[i]);
12946 	}
12947 
12948 	return 0;
12949 }
12950 
12951 static int
12952 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
12953 {
12954 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12955 	uint8_t sched_id = ts_params->valid_devs[0];
12956 	/* set mode */
12957 	return rte_cryptodev_scheduler_mode_set(sched_id,
12958 		scheduler_mode);
12959 }
12960 
12961 static int
12962 test_scheduler_mode_roundrobin_op(void)
12963 {
12964 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
12965 			0, "Failed to set roundrobin mode");
12966 	return 0;
12967 
12968 }
12969 
12970 static int
12971 test_scheduler_mode_multicore_op(void)
12972 {
12973 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
12974 			0, "Failed to set multicore mode");
12975 
12976 	return 0;
12977 }
12978 
12979 static int
12980 test_scheduler_mode_failover_op(void)
12981 {
12982 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
12983 			0, "Failed to set failover mode");
12984 
12985 	return 0;
12986 }
12987 
12988 static int
12989 test_scheduler_mode_pkt_size_distr_op(void)
12990 {
12991 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
12992 			0, "Failed to set pktsize mode");
12993 
12994 	return 0;
12995 }
12996 
12997 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
12998 	.suite_name = "Crypto Device Scheduler Unit Test Suite",
12999 	.setup = testsuite_setup,
13000 	.teardown = testsuite_teardown,
13001 	.unit_test_cases = {
13002 		/* Multi Core */
13003 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13004 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13005 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13006 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13007 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13008 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13009 
13010 		/* Round Robin */
13011 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13012 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13013 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13014 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13015 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13016 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13017 
13018 		/* Fail over */
13019 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13020 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13021 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13022 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13023 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13024 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13025 
13026 		/* PKT SIZE */
13027 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13028 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13029 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13030 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13031 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13032 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13033 
13034 		TEST_CASES_END() /**< NULL terminate unit test array */
13035 	}
13036 };
13037 
13038 #endif /* RTE_CRYPTO_SCHEDULER */
13039 
13040 static struct unit_test_suite cryptodev_testsuite  = {
13041 	.suite_name = "Crypto Unit Test Suite",
13042 	.setup = testsuite_setup,
13043 	.teardown = testsuite_teardown,
13044 	.unit_test_cases = {
13045 		TEST_CASE_ST(ut_setup, ut_teardown,
13046 				test_device_configure_invalid_dev_id),
13047 		TEST_CASE_ST(ut_setup, ut_teardown,
13048 				test_queue_pair_descriptor_setup),
13049 		TEST_CASE_ST(ut_setup, ut_teardown,
13050 				test_device_configure_invalid_queue_pair_ids),
13051 
13052 		TEST_CASE_ST(ut_setup, ut_teardown,
13053 				test_multi_session),
13054 		TEST_CASE_ST(ut_setup, ut_teardown,
13055 				test_multi_session_random_usage),
13056 
13057 		TEST_CASE_ST(ut_setup, ut_teardown,
13058 			test_null_invalid_operation),
13059 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13060 
13061 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13062 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13063 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13064 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13065 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13066 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13067 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13068 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13069 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13070 
13071 		/** AES CCM Authenticated Encryption 128 bits key */
13072 		TEST_CASE_ST(ut_setup, ut_teardown,
13073 			test_AES_CCM_authenticated_encryption_test_case_128_1),
13074 		TEST_CASE_ST(ut_setup, ut_teardown,
13075 			test_AES_CCM_authenticated_encryption_test_case_128_2),
13076 		TEST_CASE_ST(ut_setup, ut_teardown,
13077 			test_AES_CCM_authenticated_encryption_test_case_128_3),
13078 
13079 		/** AES CCM Authenticated Decryption 128 bits key*/
13080 		TEST_CASE_ST(ut_setup, ut_teardown,
13081 			test_AES_CCM_authenticated_decryption_test_case_128_1),
13082 		TEST_CASE_ST(ut_setup, ut_teardown,
13083 			test_AES_CCM_authenticated_decryption_test_case_128_2),
13084 		TEST_CASE_ST(ut_setup, ut_teardown,
13085 			test_AES_CCM_authenticated_decryption_test_case_128_3),
13086 
13087 		/** AES CCM Authenticated Encryption 192 bits key */
13088 		TEST_CASE_ST(ut_setup, ut_teardown,
13089 			test_AES_CCM_authenticated_encryption_test_case_192_1),
13090 		TEST_CASE_ST(ut_setup, ut_teardown,
13091 			test_AES_CCM_authenticated_encryption_test_case_192_2),
13092 		TEST_CASE_ST(ut_setup, ut_teardown,
13093 			test_AES_CCM_authenticated_encryption_test_case_192_3),
13094 
13095 		/** AES CCM Authenticated Decryption 192 bits key*/
13096 		TEST_CASE_ST(ut_setup, ut_teardown,
13097 			test_AES_CCM_authenticated_decryption_test_case_192_1),
13098 		TEST_CASE_ST(ut_setup, ut_teardown,
13099 			test_AES_CCM_authenticated_decryption_test_case_192_2),
13100 		TEST_CASE_ST(ut_setup, ut_teardown,
13101 			test_AES_CCM_authenticated_decryption_test_case_192_3),
13102 
13103 		/** AES CCM Authenticated Encryption 256 bits key */
13104 		TEST_CASE_ST(ut_setup, ut_teardown,
13105 			test_AES_CCM_authenticated_encryption_test_case_256_1),
13106 		TEST_CASE_ST(ut_setup, ut_teardown,
13107 			test_AES_CCM_authenticated_encryption_test_case_256_2),
13108 		TEST_CASE_ST(ut_setup, ut_teardown,
13109 			test_AES_CCM_authenticated_encryption_test_case_256_3),
13110 
13111 		/** AES CCM Authenticated Decryption 256 bits key*/
13112 		TEST_CASE_ST(ut_setup, ut_teardown,
13113 			test_AES_CCM_authenticated_decryption_test_case_256_1),
13114 		TEST_CASE_ST(ut_setup, ut_teardown,
13115 			test_AES_CCM_authenticated_decryption_test_case_256_2),
13116 		TEST_CASE_ST(ut_setup, ut_teardown,
13117 			test_AES_CCM_authenticated_decryption_test_case_256_3),
13118 
13119 		/** AES GCM Authenticated Encryption */
13120 		TEST_CASE_ST(ut_setup, ut_teardown,
13121 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13122 		TEST_CASE_ST(ut_setup, ut_teardown,
13123 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13124 		TEST_CASE_ST(ut_setup, ut_teardown,
13125 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13126 		TEST_CASE_ST(ut_setup, ut_teardown,
13127 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13128 		TEST_CASE_ST(ut_setup, ut_teardown,
13129 			test_AES_GCM_authenticated_encryption_test_case_1),
13130 		TEST_CASE_ST(ut_setup, ut_teardown,
13131 			test_AES_GCM_authenticated_encryption_test_case_2),
13132 		TEST_CASE_ST(ut_setup, ut_teardown,
13133 			test_AES_GCM_authenticated_encryption_test_case_3),
13134 		TEST_CASE_ST(ut_setup, ut_teardown,
13135 			test_AES_GCM_authenticated_encryption_test_case_4),
13136 		TEST_CASE_ST(ut_setup, ut_teardown,
13137 			test_AES_GCM_authenticated_encryption_test_case_5),
13138 		TEST_CASE_ST(ut_setup, ut_teardown,
13139 			test_AES_GCM_authenticated_encryption_test_case_6),
13140 		TEST_CASE_ST(ut_setup, ut_teardown,
13141 			test_AES_GCM_authenticated_encryption_test_case_7),
13142 		TEST_CASE_ST(ut_setup, ut_teardown,
13143 			test_AES_GCM_authenticated_encryption_test_case_8),
13144 		TEST_CASE_ST(ut_setup, ut_teardown,
13145 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
13146 
13147 		/** AES GCM Authenticated Decryption */
13148 		TEST_CASE_ST(ut_setup, ut_teardown,
13149 			test_AES_GCM_authenticated_decryption_test_case_1),
13150 		TEST_CASE_ST(ut_setup, ut_teardown,
13151 			test_AES_GCM_authenticated_decryption_test_case_2),
13152 		TEST_CASE_ST(ut_setup, ut_teardown,
13153 			test_AES_GCM_authenticated_decryption_test_case_3),
13154 		TEST_CASE_ST(ut_setup, ut_teardown,
13155 			test_AES_GCM_authenticated_decryption_test_case_4),
13156 		TEST_CASE_ST(ut_setup, ut_teardown,
13157 			test_AES_GCM_authenticated_decryption_test_case_5),
13158 		TEST_CASE_ST(ut_setup, ut_teardown,
13159 			test_AES_GCM_authenticated_decryption_test_case_6),
13160 		TEST_CASE_ST(ut_setup, ut_teardown,
13161 			test_AES_GCM_authenticated_decryption_test_case_7),
13162 		TEST_CASE_ST(ut_setup, ut_teardown,
13163 			test_AES_GCM_authenticated_decryption_test_case_8),
13164 		TEST_CASE_ST(ut_setup, ut_teardown,
13165 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
13166 
13167 		/** AES GCM Authenticated Encryption 192 bits key */
13168 		TEST_CASE_ST(ut_setup, ut_teardown,
13169 			test_AES_GCM_auth_encryption_test_case_192_1),
13170 		TEST_CASE_ST(ut_setup, ut_teardown,
13171 			test_AES_GCM_auth_encryption_test_case_192_2),
13172 		TEST_CASE_ST(ut_setup, ut_teardown,
13173 			test_AES_GCM_auth_encryption_test_case_192_3),
13174 		TEST_CASE_ST(ut_setup, ut_teardown,
13175 			test_AES_GCM_auth_encryption_test_case_192_4),
13176 		TEST_CASE_ST(ut_setup, ut_teardown,
13177 			test_AES_GCM_auth_encryption_test_case_192_5),
13178 		TEST_CASE_ST(ut_setup, ut_teardown,
13179 			test_AES_GCM_auth_encryption_test_case_192_6),
13180 		TEST_CASE_ST(ut_setup, ut_teardown,
13181 			test_AES_GCM_auth_encryption_test_case_192_7),
13182 
13183 		/** AES GCM Authenticated Decryption 192 bits key */
13184 		TEST_CASE_ST(ut_setup, ut_teardown,
13185 			test_AES_GCM_auth_decryption_test_case_192_1),
13186 		TEST_CASE_ST(ut_setup, ut_teardown,
13187 			test_AES_GCM_auth_decryption_test_case_192_2),
13188 		TEST_CASE_ST(ut_setup, ut_teardown,
13189 			test_AES_GCM_auth_decryption_test_case_192_3),
13190 		TEST_CASE_ST(ut_setup, ut_teardown,
13191 			test_AES_GCM_auth_decryption_test_case_192_4),
13192 		TEST_CASE_ST(ut_setup, ut_teardown,
13193 			test_AES_GCM_auth_decryption_test_case_192_5),
13194 		TEST_CASE_ST(ut_setup, ut_teardown,
13195 			test_AES_GCM_auth_decryption_test_case_192_6),
13196 		TEST_CASE_ST(ut_setup, ut_teardown,
13197 			test_AES_GCM_auth_decryption_test_case_192_7),
13198 
13199 		/** AES GCM Authenticated Encryption 256 bits key */
13200 		TEST_CASE_ST(ut_setup, ut_teardown,
13201 			test_AES_GCM_auth_encryption_test_case_256_1),
13202 		TEST_CASE_ST(ut_setup, ut_teardown,
13203 			test_AES_GCM_auth_encryption_test_case_256_2),
13204 		TEST_CASE_ST(ut_setup, ut_teardown,
13205 			test_AES_GCM_auth_encryption_test_case_256_3),
13206 		TEST_CASE_ST(ut_setup, ut_teardown,
13207 			test_AES_GCM_auth_encryption_test_case_256_4),
13208 		TEST_CASE_ST(ut_setup, ut_teardown,
13209 			test_AES_GCM_auth_encryption_test_case_256_5),
13210 		TEST_CASE_ST(ut_setup, ut_teardown,
13211 			test_AES_GCM_auth_encryption_test_case_256_6),
13212 		TEST_CASE_ST(ut_setup, ut_teardown,
13213 			test_AES_GCM_auth_encryption_test_case_256_7),
13214 
13215 		/** AES GCM Authenticated Decryption 256 bits key */
13216 		TEST_CASE_ST(ut_setup, ut_teardown,
13217 			test_AES_GCM_auth_decryption_test_case_256_1),
13218 		TEST_CASE_ST(ut_setup, ut_teardown,
13219 			test_AES_GCM_auth_decryption_test_case_256_2),
13220 		TEST_CASE_ST(ut_setup, ut_teardown,
13221 			test_AES_GCM_auth_decryption_test_case_256_3),
13222 		TEST_CASE_ST(ut_setup, ut_teardown,
13223 			test_AES_GCM_auth_decryption_test_case_256_4),
13224 		TEST_CASE_ST(ut_setup, ut_teardown,
13225 			test_AES_GCM_auth_decryption_test_case_256_5),
13226 		TEST_CASE_ST(ut_setup, ut_teardown,
13227 			test_AES_GCM_auth_decryption_test_case_256_6),
13228 		TEST_CASE_ST(ut_setup, ut_teardown,
13229 			test_AES_GCM_auth_decryption_test_case_256_7),
13230 
13231 		/** AES GCM Authenticated Encryption big aad size */
13232 		TEST_CASE_ST(ut_setup, ut_teardown,
13233 			test_AES_GCM_auth_encryption_test_case_aad_1),
13234 		TEST_CASE_ST(ut_setup, ut_teardown,
13235 			test_AES_GCM_auth_encryption_test_case_aad_2),
13236 
13237 		/** AES GCM Authenticated Decryption big aad size */
13238 		TEST_CASE_ST(ut_setup, ut_teardown,
13239 			test_AES_GCM_auth_decryption_test_case_aad_1),
13240 		TEST_CASE_ST(ut_setup, ut_teardown,
13241 			test_AES_GCM_auth_decryption_test_case_aad_2),
13242 
13243 		/** Out of place tests */
13244 		TEST_CASE_ST(ut_setup, ut_teardown,
13245 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13246 		TEST_CASE_ST(ut_setup, ut_teardown,
13247 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13248 
13249 		/** Session-less tests */
13250 		TEST_CASE_ST(ut_setup, ut_teardown,
13251 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13252 		TEST_CASE_ST(ut_setup, ut_teardown,
13253 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13254 
13255 		/** AES GMAC Authentication */
13256 		TEST_CASE_ST(ut_setup, ut_teardown,
13257 			test_AES_GMAC_authentication_test_case_1),
13258 		TEST_CASE_ST(ut_setup, ut_teardown,
13259 			test_AES_GMAC_authentication_verify_test_case_1),
13260 		TEST_CASE_ST(ut_setup, ut_teardown,
13261 			test_AES_GMAC_authentication_test_case_2),
13262 		TEST_CASE_ST(ut_setup, ut_teardown,
13263 			test_AES_GMAC_authentication_verify_test_case_2),
13264 		TEST_CASE_ST(ut_setup, ut_teardown,
13265 			test_AES_GMAC_authentication_test_case_3),
13266 		TEST_CASE_ST(ut_setup, ut_teardown,
13267 			test_AES_GMAC_authentication_verify_test_case_3),
13268 		TEST_CASE_ST(ut_setup, ut_teardown,
13269 			test_AES_GMAC_authentication_test_case_4),
13270 		TEST_CASE_ST(ut_setup, ut_teardown,
13271 			test_AES_GMAC_authentication_verify_test_case_4),
13272 		TEST_CASE_ST(ut_setup, ut_teardown,
13273 			test_AES_GMAC_authentication_SGL_40B),
13274 		TEST_CASE_ST(ut_setup, ut_teardown,
13275 			test_AES_GMAC_authentication_SGL_80B),
13276 		TEST_CASE_ST(ut_setup, ut_teardown,
13277 			test_AES_GMAC_authentication_SGL_2048B),
13278 		TEST_CASE_ST(ut_setup, ut_teardown,
13279 			test_AES_GMAC_authentication_SGL_2047B),
13280 
13281 		/** Chacha20-Poly1305 */
13282 		TEST_CASE_ST(ut_setup, ut_teardown,
13283 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
13284 		TEST_CASE_ST(ut_setup, ut_teardown,
13285 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
13286 		/** SNOW 3G encrypt only (UEA2) */
13287 		TEST_CASE_ST(ut_setup, ut_teardown,
13288 			test_snow3g_encryption_test_case_1),
13289 		TEST_CASE_ST(ut_setup, ut_teardown,
13290 			test_snow3g_encryption_test_case_2),
13291 		TEST_CASE_ST(ut_setup, ut_teardown,
13292 			test_snow3g_encryption_test_case_3),
13293 		TEST_CASE_ST(ut_setup, ut_teardown,
13294 			test_snow3g_encryption_test_case_4),
13295 		TEST_CASE_ST(ut_setup, ut_teardown,
13296 			test_snow3g_encryption_test_case_5),
13297 
13298 		TEST_CASE_ST(ut_setup, ut_teardown,
13299 			test_snow3g_encryption_test_case_1_oop),
13300 		TEST_CASE_ST(ut_setup, ut_teardown,
13301 			test_snow3g_encryption_test_case_1_oop_sgl),
13302 		TEST_CASE_ST(ut_setup, ut_teardown,
13303 			test_snow3g_encryption_test_case_1_offset_oop),
13304 		TEST_CASE_ST(ut_setup, ut_teardown,
13305 			test_snow3g_decryption_test_case_1_oop),
13306 
13307 		/** SNOW 3G generate auth, then encrypt (UEA2) */
13308 		TEST_CASE_ST(ut_setup, ut_teardown,
13309 			test_snow3g_auth_cipher_test_case_1),
13310 		TEST_CASE_ST(ut_setup, ut_teardown,
13311 			test_snow3g_auth_cipher_test_case_2),
13312 		TEST_CASE_ST(ut_setup, ut_teardown,
13313 			test_snow3g_auth_cipher_test_case_2_oop),
13314 		TEST_CASE_ST(ut_setup, ut_teardown,
13315 			test_snow3g_auth_cipher_part_digest_enc),
13316 		TEST_CASE_ST(ut_setup, ut_teardown,
13317 			test_snow3g_auth_cipher_part_digest_enc_oop),
13318 		TEST_CASE_ST(ut_setup, ut_teardown,
13319 			test_snow3g_auth_cipher_test_case_3_sgl),
13320 		TEST_CASE_ST(ut_setup, ut_teardown,
13321 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
13322 		TEST_CASE_ST(ut_setup, ut_teardown,
13323 			test_snow3g_auth_cipher_part_digest_enc_sgl),
13324 		TEST_CASE_ST(ut_setup, ut_teardown,
13325 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13326 
13327 		/** SNOW 3G decrypt (UEA2), then verify auth */
13328 		TEST_CASE_ST(ut_setup, ut_teardown,
13329 			test_snow3g_auth_cipher_verify_test_case_1),
13330 		TEST_CASE_ST(ut_setup, ut_teardown,
13331 			test_snow3g_auth_cipher_verify_test_case_2),
13332 		TEST_CASE_ST(ut_setup, ut_teardown,
13333 			test_snow3g_auth_cipher_verify_test_case_2_oop),
13334 		TEST_CASE_ST(ut_setup, ut_teardown,
13335 			test_snow3g_auth_cipher_verify_part_digest_enc),
13336 		TEST_CASE_ST(ut_setup, ut_teardown,
13337 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13338 		TEST_CASE_ST(ut_setup, ut_teardown,
13339 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
13340 		TEST_CASE_ST(ut_setup, ut_teardown,
13341 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13342 		TEST_CASE_ST(ut_setup, ut_teardown,
13343 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13344 		TEST_CASE_ST(ut_setup, ut_teardown,
13345 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13346 
13347 		/** SNOW 3G decrypt only (UEA2) */
13348 		TEST_CASE_ST(ut_setup, ut_teardown,
13349 			test_snow3g_decryption_test_case_1),
13350 		TEST_CASE_ST(ut_setup, ut_teardown,
13351 			test_snow3g_decryption_test_case_2),
13352 		TEST_CASE_ST(ut_setup, ut_teardown,
13353 			test_snow3g_decryption_test_case_3),
13354 		TEST_CASE_ST(ut_setup, ut_teardown,
13355 			test_snow3g_decryption_test_case_4),
13356 		TEST_CASE_ST(ut_setup, ut_teardown,
13357 			test_snow3g_decryption_test_case_5),
13358 		TEST_CASE_ST(ut_setup, ut_teardown,
13359 			test_snow3g_decryption_with_digest_test_case_1),
13360 		TEST_CASE_ST(ut_setup, ut_teardown,
13361 			test_snow3g_hash_generate_test_case_1),
13362 		TEST_CASE_ST(ut_setup, ut_teardown,
13363 			test_snow3g_hash_generate_test_case_2),
13364 		TEST_CASE_ST(ut_setup, ut_teardown,
13365 			test_snow3g_hash_generate_test_case_3),
13366 		/* Tests with buffers which length is not byte-aligned */
13367 		TEST_CASE_ST(ut_setup, ut_teardown,
13368 			test_snow3g_hash_generate_test_case_4),
13369 		TEST_CASE_ST(ut_setup, ut_teardown,
13370 			test_snow3g_hash_generate_test_case_5),
13371 		TEST_CASE_ST(ut_setup, ut_teardown,
13372 			test_snow3g_hash_generate_test_case_6),
13373 		TEST_CASE_ST(ut_setup, ut_teardown,
13374 			test_snow3g_hash_verify_test_case_1),
13375 		TEST_CASE_ST(ut_setup, ut_teardown,
13376 			test_snow3g_hash_verify_test_case_2),
13377 		TEST_CASE_ST(ut_setup, ut_teardown,
13378 			test_snow3g_hash_verify_test_case_3),
13379 		/* Tests with buffers which length is not byte-aligned */
13380 		TEST_CASE_ST(ut_setup, ut_teardown,
13381 			test_snow3g_hash_verify_test_case_4),
13382 		TEST_CASE_ST(ut_setup, ut_teardown,
13383 			test_snow3g_hash_verify_test_case_5),
13384 		TEST_CASE_ST(ut_setup, ut_teardown,
13385 			test_snow3g_hash_verify_test_case_6),
13386 		TEST_CASE_ST(ut_setup, ut_teardown,
13387 			test_snow3g_cipher_auth_test_case_1),
13388 		TEST_CASE_ST(ut_setup, ut_teardown,
13389 			test_snow3g_auth_cipher_with_digest_test_case_1),
13390 
13391 		/** ZUC encrypt only (EEA3) */
13392 		TEST_CASE_ST(ut_setup, ut_teardown,
13393 			test_zuc_encryption_test_case_1),
13394 		TEST_CASE_ST(ut_setup, ut_teardown,
13395 			test_zuc_encryption_test_case_2),
13396 		TEST_CASE_ST(ut_setup, ut_teardown,
13397 			test_zuc_encryption_test_case_3),
13398 		TEST_CASE_ST(ut_setup, ut_teardown,
13399 			test_zuc_encryption_test_case_4),
13400 		TEST_CASE_ST(ut_setup, ut_teardown,
13401 			test_zuc_encryption_test_case_5),
13402 		TEST_CASE_ST(ut_setup, ut_teardown,
13403 			test_zuc_encryption_test_case_6_sgl),
13404 
13405 		/** ZUC authenticate (EIA3) */
13406 		TEST_CASE_ST(ut_setup, ut_teardown,
13407 			test_zuc_hash_generate_test_case_1),
13408 		TEST_CASE_ST(ut_setup, ut_teardown,
13409 			test_zuc_hash_generate_test_case_2),
13410 		TEST_CASE_ST(ut_setup, ut_teardown,
13411 			test_zuc_hash_generate_test_case_3),
13412 		TEST_CASE_ST(ut_setup, ut_teardown,
13413 			test_zuc_hash_generate_test_case_4),
13414 		TEST_CASE_ST(ut_setup, ut_teardown,
13415 			test_zuc_hash_generate_test_case_5),
13416 		TEST_CASE_ST(ut_setup, ut_teardown,
13417 			test_zuc_hash_generate_test_case_6),
13418 		TEST_CASE_ST(ut_setup, ut_teardown,
13419 			test_zuc_hash_generate_test_case_7),
13420 		TEST_CASE_ST(ut_setup, ut_teardown,
13421 			test_zuc_hash_generate_test_case_8),
13422 
13423 		/** ZUC alg-chain (EEA3/EIA3) */
13424 		TEST_CASE_ST(ut_setup, ut_teardown,
13425 			test_zuc_cipher_auth_test_case_1),
13426 		TEST_CASE_ST(ut_setup, ut_teardown,
13427 			test_zuc_cipher_auth_test_case_2),
13428 
13429 		/** ZUC generate auth, then encrypt (EEA3) */
13430 		TEST_CASE_ST(ut_setup, ut_teardown,
13431 			test_zuc_auth_cipher_test_case_1),
13432 		TEST_CASE_ST(ut_setup, ut_teardown,
13433 			test_zuc_auth_cipher_test_case_1_oop),
13434 		TEST_CASE_ST(ut_setup, ut_teardown,
13435 			test_zuc_auth_cipher_test_case_1_sgl),
13436 		TEST_CASE_ST(ut_setup, ut_teardown,
13437 			test_zuc_auth_cipher_test_case_1_oop_sgl),
13438 
13439 		/** ZUC decrypt (EEA3), then verify auth */
13440 		TEST_CASE_ST(ut_setup, ut_teardown,
13441 			test_zuc_auth_cipher_verify_test_case_1),
13442 		TEST_CASE_ST(ut_setup, ut_teardown,
13443 			test_zuc_auth_cipher_verify_test_case_1_oop),
13444 		TEST_CASE_ST(ut_setup, ut_teardown,
13445 			test_zuc_auth_cipher_verify_test_case_1_sgl),
13446 		TEST_CASE_ST(ut_setup, ut_teardown,
13447 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13448 
13449 		/** HMAC_MD5 Authentication */
13450 		TEST_CASE_ST(ut_setup, ut_teardown,
13451 			test_MD5_HMAC_generate_case_1),
13452 		TEST_CASE_ST(ut_setup, ut_teardown,
13453 			test_MD5_HMAC_verify_case_1),
13454 		TEST_CASE_ST(ut_setup, ut_teardown,
13455 			test_MD5_HMAC_generate_case_2),
13456 		TEST_CASE_ST(ut_setup, ut_teardown,
13457 			test_MD5_HMAC_verify_case_2),
13458 
13459 		/** KASUMI hash only (UIA1) */
13460 		TEST_CASE_ST(ut_setup, ut_teardown,
13461 			test_kasumi_hash_generate_test_case_1),
13462 		TEST_CASE_ST(ut_setup, ut_teardown,
13463 			test_kasumi_hash_generate_test_case_2),
13464 		TEST_CASE_ST(ut_setup, ut_teardown,
13465 			test_kasumi_hash_generate_test_case_3),
13466 		TEST_CASE_ST(ut_setup, ut_teardown,
13467 			test_kasumi_hash_generate_test_case_4),
13468 		TEST_CASE_ST(ut_setup, ut_teardown,
13469 			test_kasumi_hash_generate_test_case_5),
13470 		TEST_CASE_ST(ut_setup, ut_teardown,
13471 			test_kasumi_hash_generate_test_case_6),
13472 
13473 		TEST_CASE_ST(ut_setup, ut_teardown,
13474 			test_kasumi_hash_verify_test_case_1),
13475 		TEST_CASE_ST(ut_setup, ut_teardown,
13476 			test_kasumi_hash_verify_test_case_2),
13477 		TEST_CASE_ST(ut_setup, ut_teardown,
13478 			test_kasumi_hash_verify_test_case_3),
13479 		TEST_CASE_ST(ut_setup, ut_teardown,
13480 			test_kasumi_hash_verify_test_case_4),
13481 		TEST_CASE_ST(ut_setup, ut_teardown,
13482 			test_kasumi_hash_verify_test_case_5),
13483 
13484 		/** KASUMI encrypt only (UEA1) */
13485 		TEST_CASE_ST(ut_setup, ut_teardown,
13486 			test_kasumi_encryption_test_case_1),
13487 		TEST_CASE_ST(ut_setup, ut_teardown,
13488 			test_kasumi_encryption_test_case_1_sgl),
13489 		TEST_CASE_ST(ut_setup, ut_teardown,
13490 			test_kasumi_encryption_test_case_1_oop),
13491 		TEST_CASE_ST(ut_setup, ut_teardown,
13492 			test_kasumi_encryption_test_case_1_oop_sgl),
13493 		TEST_CASE_ST(ut_setup, ut_teardown,
13494 			test_kasumi_encryption_test_case_2),
13495 		TEST_CASE_ST(ut_setup, ut_teardown,
13496 			test_kasumi_encryption_test_case_3),
13497 		TEST_CASE_ST(ut_setup, ut_teardown,
13498 			test_kasumi_encryption_test_case_4),
13499 		TEST_CASE_ST(ut_setup, ut_teardown,
13500 			test_kasumi_encryption_test_case_5),
13501 
13502 		/** KASUMI decrypt only (UEA1) */
13503 		TEST_CASE_ST(ut_setup, ut_teardown,
13504 			test_kasumi_decryption_test_case_1),
13505 		TEST_CASE_ST(ut_setup, ut_teardown,
13506 			test_kasumi_decryption_test_case_2),
13507 		TEST_CASE_ST(ut_setup, ut_teardown,
13508 			test_kasumi_decryption_test_case_3),
13509 		TEST_CASE_ST(ut_setup, ut_teardown,
13510 			test_kasumi_decryption_test_case_4),
13511 		TEST_CASE_ST(ut_setup, ut_teardown,
13512 			test_kasumi_decryption_test_case_5),
13513 		TEST_CASE_ST(ut_setup, ut_teardown,
13514 			test_kasumi_decryption_test_case_1_oop),
13515 
13516 		TEST_CASE_ST(ut_setup, ut_teardown,
13517 			test_kasumi_cipher_auth_test_case_1),
13518 
13519 		/** KASUMI generate auth, then encrypt (F8) */
13520 		TEST_CASE_ST(ut_setup, ut_teardown,
13521 			test_kasumi_auth_cipher_test_case_1),
13522 		TEST_CASE_ST(ut_setup, ut_teardown,
13523 			test_kasumi_auth_cipher_test_case_2),
13524 		TEST_CASE_ST(ut_setup, ut_teardown,
13525 			test_kasumi_auth_cipher_test_case_2_oop),
13526 		TEST_CASE_ST(ut_setup, ut_teardown,
13527 			test_kasumi_auth_cipher_test_case_2_sgl),
13528 		TEST_CASE_ST(ut_setup, ut_teardown,
13529 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
13530 
13531 		/** KASUMI decrypt (F8), then verify auth */
13532 		TEST_CASE_ST(ut_setup, ut_teardown,
13533 			test_kasumi_auth_cipher_verify_test_case_1),
13534 		TEST_CASE_ST(ut_setup, ut_teardown,
13535 			test_kasumi_auth_cipher_verify_test_case_2),
13536 		TEST_CASE_ST(ut_setup, ut_teardown,
13537 			test_kasumi_auth_cipher_verify_test_case_2_oop),
13538 		TEST_CASE_ST(ut_setup, ut_teardown,
13539 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
13540 		TEST_CASE_ST(ut_setup, ut_teardown,
13541 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13542 
13543 		/** ESN Testcase */
13544 		TEST_CASE_ST(ut_setup, ut_teardown,
13545 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13546 		TEST_CASE_ST(ut_setup, ut_teardown,
13547 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13548 
13549 		/** Negative tests */
13550 		TEST_CASE_ST(ut_setup, ut_teardown,
13551 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13552 		TEST_CASE_ST(ut_setup, ut_teardown,
13553 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13554 		TEST_CASE_ST(ut_setup, ut_teardown,
13555 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
13556 		TEST_CASE_ST(ut_setup, ut_teardown,
13557 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13558 		TEST_CASE_ST(ut_setup, ut_teardown,
13559 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13560 		TEST_CASE_ST(ut_setup, ut_teardown,
13561 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13562 		TEST_CASE_ST(ut_setup, ut_teardown,
13563 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
13564 		TEST_CASE_ST(ut_setup, ut_teardown,
13565 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
13566 		TEST_CASE_ST(ut_setup, ut_teardown,
13567 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
13568 		TEST_CASE_ST(ut_setup, ut_teardown,
13569 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13570 		TEST_CASE_ST(ut_setup, ut_teardown,
13571 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13572 		TEST_CASE_ST(ut_setup, ut_teardown,
13573 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13574 		TEST_CASE_ST(ut_setup, ut_teardown,
13575 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
13576 		TEST_CASE_ST(ut_setup, ut_teardown,
13577 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
13578 		TEST_CASE_ST(ut_setup, ut_teardown,
13579 			authentication_verify_AES128_GMAC_fail_data_corrupt),
13580 		TEST_CASE_ST(ut_setup, ut_teardown,
13581 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
13582 		TEST_CASE_ST(ut_setup, ut_teardown,
13583 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13584 		TEST_CASE_ST(ut_setup, ut_teardown,
13585 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13586 
13587 		/** Mixed CIPHER + HASH algorithms */
13588 		/** AUTH AES CMAC + CIPHER AES CTR */
13589 		TEST_CASE_ST(ut_setup, ut_teardown,
13590 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13591 		TEST_CASE_ST(ut_setup, ut_teardown,
13592 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13593 		TEST_CASE_ST(ut_setup, ut_teardown,
13594 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13595 		TEST_CASE_ST(ut_setup, ut_teardown,
13596 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13597 		TEST_CASE_ST(ut_setup, ut_teardown,
13598 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13599 		TEST_CASE_ST(ut_setup, ut_teardown,
13600 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13601 		TEST_CASE_ST(ut_setup, ut_teardown,
13602 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13603 		TEST_CASE_ST(ut_setup, ut_teardown,
13604 		   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13605 
13606 		/** AUTH ZUC + CIPHER SNOW3G */
13607 		TEST_CASE_ST(ut_setup, ut_teardown,
13608 			test_auth_zuc_cipher_snow_test_case_1),
13609 		TEST_CASE_ST(ut_setup, ut_teardown,
13610 			test_verify_auth_zuc_cipher_snow_test_case_1),
13611 		/** AUTH AES CMAC + CIPHER SNOW3G */
13612 		TEST_CASE_ST(ut_setup, ut_teardown,
13613 			test_auth_aes_cmac_cipher_snow_test_case_1),
13614 		TEST_CASE_ST(ut_setup, ut_teardown,
13615 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13616 		/** AUTH ZUC + CIPHER AES CTR */
13617 		TEST_CASE_ST(ut_setup, ut_teardown,
13618 			test_auth_zuc_cipher_aes_ctr_test_case_1),
13619 		TEST_CASE_ST(ut_setup, ut_teardown,
13620 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13621 		/** AUTH SNOW3G + CIPHER AES CTR */
13622 		TEST_CASE_ST(ut_setup, ut_teardown,
13623 			test_auth_snow_cipher_aes_ctr_test_case_1),
13624 		TEST_CASE_ST(ut_setup, ut_teardown,
13625 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13626 		/** AUTH SNOW3G + CIPHER ZUC */
13627 		TEST_CASE_ST(ut_setup, ut_teardown,
13628 			test_auth_snow_cipher_zuc_test_case_1),
13629 		TEST_CASE_ST(ut_setup, ut_teardown,
13630 			test_verify_auth_snow_cipher_zuc_test_case_1),
13631 		/** AUTH AES CMAC + CIPHER ZUC */
13632 		TEST_CASE_ST(ut_setup, ut_teardown,
13633 			test_auth_aes_cmac_cipher_zuc_test_case_1),
13634 		TEST_CASE_ST(ut_setup, ut_teardown,
13635 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13636 
13637 		/** AUTH NULL + CIPHER SNOW3G */
13638 		TEST_CASE_ST(ut_setup, ut_teardown,
13639 			test_auth_null_cipher_snow_test_case_1),
13640 		TEST_CASE_ST(ut_setup, ut_teardown,
13641 			test_verify_auth_null_cipher_snow_test_case_1),
13642 		/** AUTH NULL + CIPHER ZUC */
13643 		TEST_CASE_ST(ut_setup, ut_teardown,
13644 			test_auth_null_cipher_zuc_test_case_1),
13645 		TEST_CASE_ST(ut_setup, ut_teardown,
13646 			test_verify_auth_null_cipher_zuc_test_case_1),
13647 		/** AUTH SNOW3G + CIPHER NULL */
13648 		TEST_CASE_ST(ut_setup, ut_teardown,
13649 			test_auth_snow_cipher_null_test_case_1),
13650 		TEST_CASE_ST(ut_setup, ut_teardown,
13651 			test_verify_auth_snow_cipher_null_test_case_1),
13652 		/** AUTH ZUC + CIPHER NULL */
13653 		TEST_CASE_ST(ut_setup, ut_teardown,
13654 			test_auth_zuc_cipher_null_test_case_1),
13655 		TEST_CASE_ST(ut_setup, ut_teardown,
13656 			test_verify_auth_zuc_cipher_null_test_case_1),
13657 		/** AUTH NULL + CIPHER AES CTR */
13658 		TEST_CASE_ST(ut_setup, ut_teardown,
13659 			test_auth_null_cipher_aes_ctr_test_case_1),
13660 		TEST_CASE_ST(ut_setup, ut_teardown,
13661 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
13662 		/** AUTH AES CMAC + CIPHER NULL */
13663 		TEST_CASE_ST(ut_setup, ut_teardown,
13664 			test_auth_aes_cmac_cipher_null_test_case_1),
13665 		TEST_CASE_ST(ut_setup, ut_teardown,
13666 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
13667 
13668 #ifdef RTE_LIB_SECURITY
13669 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13670 			test_PDCP_PROTO_all),
13671 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13672 			test_DOCSIS_PROTO_all),
13673 #endif
13674 		TEST_CASES_END() /**< NULL terminate unit test array */
13675 	}
13676 };
13677 
13678 static struct unit_test_suite cryptodev_virtio_testsuite = {
13679 	.suite_name = "Crypto VIRTIO Unit Test Suite",
13680 	.setup = testsuite_setup,
13681 	.teardown = testsuite_teardown,
13682 	.unit_test_cases = {
13683 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13684 
13685 		TEST_CASES_END() /**< NULL terminate unit test array */
13686 	}
13687 };
13688 
13689 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13690 	.suite_name = "Crypto CAAM JR Unit Test Suite",
13691 	.setup = testsuite_setup,
13692 	.teardown = testsuite_teardown,
13693 	.unit_test_cases = {
13694 		TEST_CASE_ST(ut_setup, ut_teardown,
13695 			     test_device_configure_invalid_dev_id),
13696 		TEST_CASE_ST(ut_setup, ut_teardown,
13697 			     test_multi_session),
13698 
13699 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13700 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13701 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13702 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13703 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13704 
13705 		TEST_CASES_END() /**< NULL terminate unit test array */
13706 	}
13707 };
13708 
13709 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13710 	.suite_name = "Crypto Device Marvell Component Test Suite",
13711 	.setup = testsuite_setup,
13712 	.teardown = testsuite_teardown,
13713 	.unit_test_cases = {
13714 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13715 		TEST_CASE_ST(ut_setup, ut_teardown,
13716 				test_multi_session_random_usage),
13717 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13718 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13719 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13720 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13721 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13722 
13723 		/** Negative tests */
13724 		TEST_CASE_ST(ut_setup, ut_teardown,
13725 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13726 		TEST_CASE_ST(ut_setup, ut_teardown,
13727 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13728 		TEST_CASE_ST(ut_setup, ut_teardown,
13729 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13730 		TEST_CASE_ST(ut_setup, ut_teardown,
13731 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13732 
13733 		TEST_CASES_END() /**< NULL terminate unit test array */
13734 	}
13735 };
13736 
13737 static struct unit_test_suite cryptodev_ccp_testsuite  = {
13738 	.suite_name = "Crypto Device CCP Unit Test Suite",
13739 	.setup = testsuite_setup,
13740 	.teardown = testsuite_teardown,
13741 	.unit_test_cases = {
13742 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13743 		TEST_CASE_ST(ut_setup, ut_teardown,
13744 				test_multi_session_random_usage),
13745 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13746 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13747 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13748 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13749 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13750 
13751 		/** Negative tests */
13752 		TEST_CASE_ST(ut_setup, ut_teardown,
13753 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13754 		TEST_CASE_ST(ut_setup, ut_teardown,
13755 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13756 		TEST_CASE_ST(ut_setup, ut_teardown,
13757 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13758 		TEST_CASE_ST(ut_setup, ut_teardown,
13759 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13760 
13761 		TEST_CASES_END() /**< NULL terminate unit test array */
13762 	}
13763 };
13764 
13765 static int
13766 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
13767 {
13768 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13769 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
13770 
13771 	if (gbl_driver_id == -1) {
13772 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
13773 		return TEST_SKIPPED;
13774 	}
13775 
13776 	return unit_test_suite_runner(&cryptodev_testsuite);
13777 }
13778 
13779 static int
13780 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
13781 {
13782 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13783 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
13784 
13785 	if (gbl_driver_id == -1) {
13786 		RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
13787 		return TEST_FAILED;
13788 	}
13789 
13790 	return unit_test_suite_runner(&cryptodev_virtio_testsuite);
13791 }
13792 
13793 static int
13794 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
13795 {
13796 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13797 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13798 
13799 	if (gbl_driver_id == -1) {
13800 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13801 		return TEST_SKIPPED;
13802 	}
13803 
13804 	return unit_test_suite_runner(&cryptodev_testsuite);
13805 }
13806 
13807 static int
13808 test_cryptodev_cpu_aesni_mb(void)
13809 {
13810 	int32_t rc;
13811 	enum rte_security_session_action_type at;
13812 
13813 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13814 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13815 
13816 	if (gbl_driver_id == -1) {
13817 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13818 		return TEST_SKIPPED;
13819 	}
13820 
13821 	at = gbl_action_type;
13822 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13823 	rc = unit_test_suite_runner(&cryptodev_testsuite);
13824 	gbl_action_type = at;
13825 	return rc;
13826 }
13827 
13828 static int
13829 test_cryptodev_openssl(void)
13830 {
13831 	gbl_driver_id = rte_cryptodev_driver_id_get(
13832 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
13833 
13834 	if (gbl_driver_id == -1) {
13835 		RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
13836 		return TEST_SKIPPED;
13837 	}
13838 
13839 	return unit_test_suite_runner(&cryptodev_testsuite);
13840 }
13841 
13842 static int
13843 test_cryptodev_aesni_gcm(void)
13844 {
13845 	gbl_driver_id = rte_cryptodev_driver_id_get(
13846 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13847 
13848 	if (gbl_driver_id == -1) {
13849 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
13850 		return TEST_SKIPPED;
13851 	}
13852 
13853 	return unit_test_suite_runner(&cryptodev_testsuite);
13854 }
13855 
13856 static int
13857 test_cryptodev_cpu_aesni_gcm(void)
13858 {
13859 	int32_t rc;
13860 	enum rte_security_session_action_type at;
13861 
13862 	gbl_driver_id = rte_cryptodev_driver_id_get(
13863 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
13864 
13865 	if (gbl_driver_id == -1) {
13866 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
13867 		return TEST_SKIPPED;
13868 	}
13869 
13870 	at = gbl_action_type;
13871 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
13872 	rc = unit_test_suite_runner(&cryptodev_testsuite);
13873 	gbl_action_type = at;
13874 	return rc;
13875 }
13876 
13877 static int
13878 test_cryptodev_null(void)
13879 {
13880 	gbl_driver_id = rte_cryptodev_driver_id_get(
13881 			RTE_STR(CRYPTODEV_NAME_NULL_PMD));
13882 
13883 	if (gbl_driver_id == -1) {
13884 		RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
13885 		return TEST_SKIPPED;
13886 	}
13887 
13888 	return unit_test_suite_runner(&cryptodev_testsuite);
13889 }
13890 
13891 static int
13892 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
13893 {
13894 	gbl_driver_id = rte_cryptodev_driver_id_get(
13895 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
13896 
13897 	if (gbl_driver_id == -1) {
13898 		RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
13899 		return TEST_SKIPPED;
13900 	}
13901 
13902 	return unit_test_suite_runner(&cryptodev_testsuite);
13903 }
13904 
13905 static int
13906 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
13907 {
13908 	gbl_driver_id = rte_cryptodev_driver_id_get(
13909 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
13910 
13911 	if (gbl_driver_id == -1) {
13912 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
13913 		return TEST_SKIPPED;
13914 	}
13915 
13916 	return unit_test_suite_runner(&cryptodev_testsuite);
13917 }
13918 
13919 static int
13920 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
13921 {
13922 	gbl_driver_id = rte_cryptodev_driver_id_get(
13923 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
13924 
13925 	if (gbl_driver_id == -1) {
13926 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
13927 		return TEST_SKIPPED;
13928 	}
13929 
13930 	return unit_test_suite_runner(&cryptodev_testsuite);
13931 }
13932 
13933 static int
13934 test_cryptodev_armv8(void)
13935 {
13936 	gbl_driver_id = rte_cryptodev_driver_id_get(
13937 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
13938 
13939 	if (gbl_driver_id == -1) {
13940 		RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
13941 		return TEST_SKIPPED;
13942 	}
13943 
13944 	return unit_test_suite_runner(&cryptodev_testsuite);
13945 }
13946 
13947 static int
13948 test_cryptodev_mrvl(void)
13949 {
13950 	gbl_driver_id = rte_cryptodev_driver_id_get(
13951 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
13952 
13953 	if (gbl_driver_id == -1) {
13954 		RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
13955 		return TEST_SKIPPED;
13956 	}
13957 
13958 	return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
13959 }
13960 
13961 #ifdef RTE_CRYPTO_SCHEDULER
13962 
13963 static int
13964 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
13965 {
13966 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13967 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
13968 
13969 	if (gbl_driver_id == -1) {
13970 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
13971 		return TEST_SKIPPED;
13972 	}
13973 
13974 	if (rte_cryptodev_driver_id_get(
13975 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
13976 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
13977 		return TEST_SKIPPED;
13978 }
13979 	return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
13980 }
13981 
13982 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
13983 
13984 #endif
13985 
13986 static int
13987 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
13988 {
13989 	gbl_driver_id =	rte_cryptodev_driver_id_get(
13990 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
13991 
13992 	if (gbl_driver_id == -1) {
13993 		RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
13994 		return TEST_SKIPPED;
13995 	}
13996 
13997 	return unit_test_suite_runner(&cryptodev_testsuite);
13998 }
13999 
14000 static int
14001 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14002 {
14003 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14004 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14005 
14006 	if (gbl_driver_id == -1) {
14007 		RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14008 		return TEST_SKIPPED;
14009 	}
14010 
14011 	return unit_test_suite_runner(&cryptodev_testsuite);
14012 }
14013 
14014 static int
14015 test_cryptodev_ccp(void)
14016 {
14017 	gbl_driver_id = rte_cryptodev_driver_id_get(
14018 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14019 
14020 	if (gbl_driver_id == -1) {
14021 		RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14022 		return TEST_FAILED;
14023 	}
14024 
14025 	return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14026 }
14027 
14028 static int
14029 test_cryptodev_octeontx(void)
14030 {
14031 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14032 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14033 	if (gbl_driver_id == -1) {
14034 		RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14035 		return TEST_FAILED;
14036 	}
14037 	return unit_test_suite_runner(&cryptodev_testsuite);
14038 }
14039 
14040 static int
14041 test_cryptodev_octeontx2(void)
14042 {
14043 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14044 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14045 	if (gbl_driver_id == -1) {
14046 		RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14047 		return TEST_FAILED;
14048 	}
14049 	return unit_test_suite_runner(&cryptodev_testsuite);
14050 }
14051 
14052 static int
14053 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14054 {
14055 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14056 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14057 
14058 	if (gbl_driver_id == -1) {
14059 		RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14060 		return TEST_FAILED;
14061 	}
14062 
14063 	return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14064 }
14065 
14066 static int
14067 test_cryptodev_nitrox(void)
14068 {
14069 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14070 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14071 
14072 	if (gbl_driver_id == -1) {
14073 		RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14074 		return TEST_FAILED;
14075 	}
14076 
14077 	return unit_test_suite_runner(&cryptodev_testsuite);
14078 }
14079 
14080 static int
14081 test_cryptodev_bcmfs(void)
14082 {
14083 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14084 			RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14085 
14086 	if (gbl_driver_id == -1) {
14087 		RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14088 		return TEST_FAILED;
14089 	}
14090 
14091 	return unit_test_suite_runner(&cryptodev_testsuite);
14092 }
14093 
14094 static int
14095 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14096 {
14097 	int ret;
14098 
14099 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14100 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14101 
14102 	if (gbl_driver_id == -1) {
14103 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14104 		return TEST_SKIPPED;
14105 	}
14106 
14107 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
14108 	ret = unit_test_suite_runner(&cryptodev_testsuite);
14109 	global_api_test_type = CRYPTODEV_API_TEST;
14110 
14111 	return ret;
14112 }
14113 
14114 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14115 		test_cryptodev_qat_raw_api);
14116 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14117 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14118 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14119 	test_cryptodev_cpu_aesni_mb);
14120 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14121 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14122 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14123 	test_cryptodev_cpu_aesni_gcm);
14124 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14125 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14126 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14127 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14128 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14129 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14130 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14131 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14132 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14133 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14134 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14135 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14136 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14137 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14138 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
14139