xref: /dpdk/app/test/test_cryptodev.c (revision 428eaeb8)
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 void
166 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
167 		uint8_t is_op_success)
168 {
169 	struct rte_crypto_op *op = user_data;
170 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
171 			RTE_CRYPTO_OP_STATUS_ERROR;
172 }
173 
174 void
175 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
176 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
177 		uint8_t len_in_bits, uint8_t cipher_iv_len)
178 {
179 	struct rte_crypto_sym_op *sop = op->sym;
180 	struct rte_crypto_op *ret_op = NULL;
181 	struct rte_crypto_vec data_vec[UINT8_MAX];
182 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
183 	union rte_crypto_sym_ofs ofs;
184 	struct rte_crypto_sym_vec vec;
185 	struct rte_crypto_sgl sgl;
186 	uint32_t max_len;
187 	union rte_cryptodev_session_ctx sess;
188 	uint32_t count = 0;
189 	struct rte_crypto_raw_dp_ctx *ctx;
190 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
191 			auth_len = 0;
192 	int32_t n;
193 	uint32_t n_success;
194 	int ctx_service_size;
195 	int32_t status = 0;
196 	int enqueue_status, dequeue_status;
197 
198 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
199 	if (ctx_service_size < 0) {
200 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
201 		return;
202 	}
203 
204 	ctx = malloc(ctx_service_size);
205 	if (!ctx) {
206 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
207 		return;
208 	}
209 
210 	/* Both are enums, setting crypto_sess will suit any session type */
211 	sess.crypto_sess = op->sym->session;
212 
213 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
214 			op->sess_type, sess, 0) < 0) {
215 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
216 		goto exit;
217 	}
218 
219 	cipher_iv.iova = 0;
220 	cipher_iv.va = NULL;
221 	aad_auth_iv.iova = 0;
222 	aad_auth_iv.va = NULL;
223 	digest.iova = 0;
224 	digest.va = NULL;
225 	sgl.vec = data_vec;
226 	vec.num = 1;
227 	vec.sgl = &sgl;
228 	vec.iv = &cipher_iv;
229 	vec.digest = &digest;
230 	vec.aad = &aad_auth_iv;
231 	vec.status = &status;
232 
233 	ofs.raw = 0;
234 
235 	if (is_cipher && is_auth) {
236 		cipher_offset = sop->cipher.data.offset;
237 		cipher_len = sop->cipher.data.length;
238 		auth_offset = sop->auth.data.offset;
239 		auth_len = sop->auth.data.length;
240 		max_len = RTE_MAX(cipher_offset + cipher_len,
241 				auth_offset + auth_len);
242 		if (len_in_bits) {
243 			max_len = max_len >> 3;
244 			cipher_offset = cipher_offset >> 3;
245 			auth_offset = auth_offset >> 3;
246 			cipher_len = cipher_len >> 3;
247 			auth_len = auth_len >> 3;
248 		}
249 		ofs.ofs.cipher.head = cipher_offset;
250 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
251 		ofs.ofs.auth.head = auth_offset;
252 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
253 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
254 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
255 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
256 				op, void *, IV_OFFSET + cipher_iv_len);
257 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
258 				cipher_iv_len);
259 		digest.va = (void *)sop->auth.digest.data;
260 		digest.iova = sop->auth.digest.phys_addr;
261 
262 	} else if (is_cipher) {
263 		cipher_offset = sop->cipher.data.offset;
264 		cipher_len = sop->cipher.data.length;
265 		max_len = cipher_len + cipher_offset;
266 		if (len_in_bits) {
267 			max_len = max_len >> 3;
268 			cipher_offset = cipher_offset >> 3;
269 			cipher_len = cipher_len >> 3;
270 		}
271 		ofs.ofs.cipher.head = cipher_offset;
272 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
273 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
274 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
275 
276 	} else if (is_auth) {
277 		auth_offset = sop->auth.data.offset;
278 		auth_len = sop->auth.data.length;
279 		max_len = auth_len + auth_offset;
280 		if (len_in_bits) {
281 			max_len = max_len >> 3;
282 			auth_offset = auth_offset >> 3;
283 			auth_len = auth_len >> 3;
284 		}
285 		ofs.ofs.auth.head = auth_offset;
286 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
287 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
288 				op, void *, IV_OFFSET + cipher_iv_len);
289 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
290 				cipher_iv_len);
291 		digest.va = (void *)sop->auth.digest.data;
292 		digest.iova = sop->auth.digest.phys_addr;
293 
294 	} else { /* aead */
295 		cipher_offset = sop->aead.data.offset;
296 		cipher_len = sop->aead.data.length;
297 		max_len = cipher_len + cipher_offset;
298 		if (len_in_bits) {
299 			max_len = max_len >> 3;
300 			cipher_offset = cipher_offset >> 3;
301 			cipher_len = cipher_len >> 3;
302 		}
303 		ofs.ofs.cipher.head = cipher_offset;
304 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
305 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
306 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
307 		aad_auth_iv.va = (void *)sop->aead.aad.data;
308 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
309 		digest.va = (void *)sop->aead.digest.data;
310 		digest.iova = sop->aead.digest.phys_addr;
311 	}
312 
313 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
314 			data_vec, RTE_DIM(data_vec));
315 	if (n < 0 || n > sop->m_src->nb_segs) {
316 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
317 		goto exit;
318 	}
319 
320 	sgl.num = n;
321 
322 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
323 			&enqueue_status) < 1) {
324 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
325 		goto exit;
326 	}
327 
328 	if (enqueue_status == 0) {
329 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
330 		if (status < 0) {
331 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
332 			goto exit;
333 		}
334 	} else if (enqueue_status < 0) {
335 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
336 		goto exit;
337 	}
338 
339 	n = n_success = 0;
340 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
341 		n = rte_cryptodev_raw_dequeue_burst(ctx,
342 			NULL, 1, post_process_raw_dp_op,
343 				(void **)&ret_op, 0, &n_success,
344 				&dequeue_status);
345 		if (dequeue_status < 0) {
346 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
347 			goto exit;
348 		}
349 		if (n == 0)
350 			rte_pause();
351 	}
352 
353 	if (n == 1 && dequeue_status == 0) {
354 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
355 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
356 			goto exit;
357 		}
358 	}
359 
360 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
361 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
362 					RTE_CRYPTO_OP_STATUS_SUCCESS;
363 
364 exit:
365 	free(ctx);
366 }
367 
368 static void
369 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
370 {
371 	int32_t n, st;
372 	struct rte_crypto_sym_op *sop;
373 	union rte_crypto_sym_ofs ofs;
374 	struct rte_crypto_sgl sgl;
375 	struct rte_crypto_sym_vec symvec;
376 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
377 	struct rte_crypto_vec vec[UINT8_MAX];
378 
379 	sop = op->sym;
380 
381 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
382 		sop->aead.data.length, vec, RTE_DIM(vec));
383 
384 	if (n < 0 || n != sop->m_src->nb_segs) {
385 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
386 		return;
387 	}
388 
389 	sgl.vec = vec;
390 	sgl.num = n;
391 	symvec.sgl = &sgl;
392 	symvec.iv = &iv_ptr;
393 	symvec.digest = &digest_ptr;
394 	symvec.aad = &aad_ptr;
395 	symvec.status = &st;
396 	symvec.num = 1;
397 
398 	/* for CPU crypto the IOVA address is not required */
399 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
400 	digest_ptr.va = (void *)sop->aead.digest.data;
401 	aad_ptr.va = (void *)sop->aead.aad.data;
402 
403 	ofs.raw = 0;
404 
405 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
406 		&symvec);
407 
408 	if (n != 1)
409 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
410 	else
411 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
412 }
413 
414 static void
415 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
416 {
417 	int32_t n, st;
418 	struct rte_crypto_sym_op *sop;
419 	union rte_crypto_sym_ofs ofs;
420 	struct rte_crypto_sgl sgl;
421 	struct rte_crypto_sym_vec symvec;
422 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
423 	struct rte_crypto_vec vec[UINT8_MAX];
424 
425 	sop = op->sym;
426 
427 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
428 		sop->auth.data.length, vec, RTE_DIM(vec));
429 
430 	if (n < 0 || n != sop->m_src->nb_segs) {
431 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
432 		return;
433 	}
434 
435 	sgl.vec = vec;
436 	sgl.num = n;
437 	symvec.sgl = &sgl;
438 	symvec.iv = &iv_ptr;
439 	symvec.digest = &digest_ptr;
440 	symvec.status = &st;
441 	symvec.num = 1;
442 
443 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
444 	digest_ptr.va = (void *)sop->auth.digest.data;
445 
446 	ofs.raw = 0;
447 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
448 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
449 		(sop->cipher.data.offset + sop->cipher.data.length);
450 
451 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
452 		&symvec);
453 
454 	if (n != 1)
455 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
456 	else
457 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
458 }
459 
460 static struct rte_crypto_op *
461 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
462 {
463 
464 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
465 
466 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
467 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
468 		return NULL;
469 	}
470 
471 	op = NULL;
472 
473 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
474 		rte_pause();
475 
476 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
477 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
478 		return NULL;
479 	}
480 
481 	return op;
482 }
483 
484 static struct crypto_testsuite_params testsuite_params = { NULL };
485 static struct crypto_unittest_params unittest_params;
486 
487 static int
488 testsuite_setup(void)
489 {
490 	struct crypto_testsuite_params *ts_params = &testsuite_params;
491 	struct rte_cryptodev_info info;
492 	uint32_t i = 0, nb_devs, dev_id;
493 	int ret;
494 	uint16_t qp_id;
495 
496 	memset(ts_params, 0, sizeof(*ts_params));
497 
498 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
499 	if (ts_params->mbuf_pool == NULL) {
500 		/* Not already created so create */
501 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
502 				"CRYPTO_MBUFPOOL",
503 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
504 				rte_socket_id());
505 		if (ts_params->mbuf_pool == NULL) {
506 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
507 			return TEST_FAILED;
508 		}
509 	}
510 
511 	ts_params->large_mbuf_pool = rte_mempool_lookup(
512 			"CRYPTO_LARGE_MBUFPOOL");
513 	if (ts_params->large_mbuf_pool == NULL) {
514 		/* Not already created so create */
515 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
516 				"CRYPTO_LARGE_MBUFPOOL",
517 				1, 0, 0, UINT16_MAX,
518 				rte_socket_id());
519 		if (ts_params->large_mbuf_pool == NULL) {
520 			RTE_LOG(ERR, USER1,
521 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
522 			return TEST_FAILED;
523 		}
524 	}
525 
526 	ts_params->op_mpool = rte_crypto_op_pool_create(
527 			"MBUF_CRYPTO_SYM_OP_POOL",
528 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
529 			NUM_MBUFS, MBUF_CACHE_SIZE,
530 			DEFAULT_NUM_XFORMS *
531 			sizeof(struct rte_crypto_sym_xform) +
532 			MAXIMUM_IV_LENGTH,
533 			rte_socket_id());
534 	if (ts_params->op_mpool == NULL) {
535 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
536 		return TEST_FAILED;
537 	}
538 
539 	/* Create an AESNI MB device if required */
540 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
541 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD))) {
542 		nb_devs = rte_cryptodev_device_count_by_driver(
543 				rte_cryptodev_driver_id_get(
544 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
545 		if (nb_devs < 1) {
546 			ret = rte_vdev_init(
547 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD), NULL);
548 
549 			TEST_ASSERT(ret == 0,
550 				"Failed to create instance of"
551 				" pmd : %s",
552 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
553 		}
554 	}
555 
556 	/* Create an AESNI GCM device if required */
557 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
558 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD))) {
559 		nb_devs = rte_cryptodev_device_count_by_driver(
560 				rte_cryptodev_driver_id_get(
561 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD)));
562 		if (nb_devs < 1) {
563 			TEST_ASSERT_SUCCESS(rte_vdev_init(
564 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD), NULL),
565 				"Failed to create instance of"
566 				" pmd : %s",
567 				RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
568 		}
569 	}
570 
571 	/* Create a SNOW 3G device if required */
572 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
573 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD))) {
574 		nb_devs = rte_cryptodev_device_count_by_driver(
575 				rte_cryptodev_driver_id_get(
576 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD)));
577 		if (nb_devs < 1) {
578 			TEST_ASSERT_SUCCESS(rte_vdev_init(
579 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD), NULL),
580 				"Failed to create instance of"
581 				" pmd : %s",
582 				RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
583 		}
584 	}
585 
586 	/* Create a KASUMI device if required */
587 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
588 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD))) {
589 		nb_devs = rte_cryptodev_device_count_by_driver(
590 				rte_cryptodev_driver_id_get(
591 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD)));
592 		if (nb_devs < 1) {
593 			TEST_ASSERT_SUCCESS(rte_vdev_init(
594 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD), NULL),
595 				"Failed to create instance of"
596 				" pmd : %s",
597 				RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
598 		}
599 	}
600 
601 	/* Create a ZUC device if required */
602 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
603 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD))) {
604 		nb_devs = rte_cryptodev_device_count_by_driver(
605 				rte_cryptodev_driver_id_get(
606 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD)));
607 		if (nb_devs < 1) {
608 			TEST_ASSERT_SUCCESS(rte_vdev_init(
609 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD), NULL),
610 				"Failed to create instance of"
611 				" pmd : %s",
612 				RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
613 		}
614 	}
615 
616 	/* Create a NULL device if required */
617 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
618 			RTE_STR(CRYPTODEV_NAME_NULL_PMD))) {
619 		nb_devs = rte_cryptodev_device_count_by_driver(
620 				rte_cryptodev_driver_id_get(
621 				RTE_STR(CRYPTODEV_NAME_NULL_PMD)));
622 		if (nb_devs < 1) {
623 			ret = rte_vdev_init(
624 				RTE_STR(CRYPTODEV_NAME_NULL_PMD), NULL);
625 
626 			TEST_ASSERT(ret == 0,
627 				"Failed to create instance of"
628 				" pmd : %s",
629 				RTE_STR(CRYPTODEV_NAME_NULL_PMD));
630 		}
631 	}
632 
633 	/* Create an OPENSSL device if required */
634 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
635 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD))) {
636 		nb_devs = rte_cryptodev_device_count_by_driver(
637 				rte_cryptodev_driver_id_get(
638 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)));
639 		if (nb_devs < 1) {
640 			ret = rte_vdev_init(
641 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD),
642 				NULL);
643 
644 			TEST_ASSERT(ret == 0, "Failed to create "
645 				"instance of pmd : %s",
646 				RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
647 		}
648 	}
649 
650 	/* Create a ARMv8 device if required */
651 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
652 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD))) {
653 		nb_devs = rte_cryptodev_device_count_by_driver(
654 				rte_cryptodev_driver_id_get(
655 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD)));
656 		if (nb_devs < 1) {
657 			ret = rte_vdev_init(
658 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD),
659 				NULL);
660 
661 			TEST_ASSERT(ret == 0, "Failed to create "
662 				"instance of pmd : %s",
663 				RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
664 		}
665 	}
666 
667 	/* Create a MVSAM device if required */
668 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
669 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD))) {
670 		nb_devs = rte_cryptodev_device_count_by_driver(
671 				rte_cryptodev_driver_id_get(
672 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD)));
673 		if (nb_devs < 1) {
674 			ret = rte_vdev_init(
675 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD),
676 				NULL);
677 
678 			TEST_ASSERT(ret == 0, "Failed to create "
679 				"instance of pmd : %s",
680 				RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
681 		}
682 	}
683 
684 	/* Create an CCP device if required */
685 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
686 			RTE_STR(CRYPTODEV_NAME_CCP_PMD))) {
687 		nb_devs = rte_cryptodev_device_count_by_driver(
688 				rte_cryptodev_driver_id_get(
689 				RTE_STR(CRYPTODEV_NAME_CCP_PMD)));
690 		if (nb_devs < 1) {
691 			ret = rte_vdev_init(
692 				RTE_STR(CRYPTODEV_NAME_CCP_PMD),
693 				NULL);
694 
695 			TEST_ASSERT(ret == 0, "Failed to create "
696 				"instance of pmd : %s",
697 				RTE_STR(CRYPTODEV_NAME_CCP_PMD));
698 		}
699 	}
700 
701 #ifdef RTE_CRYPTO_SCHEDULER
702 	char vdev_args[VDEV_ARGS_SIZE] = {""};
703 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
704 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
705 	uint16_t worker_core_count = 0;
706 	uint16_t socket_id = 0;
707 
708 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
709 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
710 
711 		/* Identify the Worker Cores
712 		 * Use 2 worker cores for the device args
713 		 */
714 		RTE_LCORE_FOREACH_WORKER(i) {
715 			if (worker_core_count > 1)
716 				break;
717 			snprintf(vdev_args, sizeof(vdev_args),
718 					"%s%d", temp_str, i);
719 			strcpy(temp_str, vdev_args);
720 			strlcat(temp_str, ";", sizeof(temp_str));
721 			worker_core_count++;
722 			socket_id = rte_lcore_to_socket_id(i);
723 		}
724 		if (worker_core_count != 2) {
725 			RTE_LOG(ERR, USER1,
726 				"Cryptodev scheduler test require at least "
727 				"two worker cores to run. "
728 				"Please use the correct coremask.\n");
729 			return TEST_FAILED;
730 		}
731 		strcpy(temp_str, vdev_args);
732 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
733 				temp_str, socket_id);
734 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
735 		nb_devs = rte_cryptodev_device_count_by_driver(
736 				rte_cryptodev_driver_id_get(
737 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
738 		if (nb_devs < 1) {
739 			ret = rte_vdev_init(
740 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
741 					vdev_args);
742 			TEST_ASSERT(ret == 0,
743 				"Failed to create instance %u of"
744 				" pmd : %s",
745 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
746 		}
747 	}
748 #endif /* RTE_CRYPTO_SCHEDULER */
749 
750 	nb_devs = rte_cryptodev_count();
751 	if (nb_devs < 1) {
752 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
753 		return TEST_SKIPPED;
754 	}
755 
756 	/* Create list of valid crypto devs */
757 	for (i = 0; i < nb_devs; i++) {
758 		rte_cryptodev_info_get(i, &info);
759 		if (info.driver_id == gbl_driver_id)
760 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
761 	}
762 
763 	if (ts_params->valid_dev_count < 1)
764 		return TEST_FAILED;
765 
766 	/* Set up all the qps on the first of the valid devices found */
767 
768 	dev_id = ts_params->valid_devs[0];
769 
770 	rte_cryptodev_info_get(dev_id, &info);
771 
772 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
773 	ts_params->conf.socket_id = SOCKET_ID_ANY;
774 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
775 
776 	unsigned int session_size =
777 		rte_cryptodev_sym_get_private_session_size(dev_id);
778 
779 #ifdef RTE_LIB_SECURITY
780 	unsigned int security_session_size = rte_security_session_get_size(
781 			rte_cryptodev_get_sec_ctx(dev_id));
782 
783 	if (session_size < security_session_size)
784 		session_size = security_session_size;
785 #endif
786 	/*
787 	 * Create mempool with maximum number of sessions.
788 	 */
789 	if (info.sym.max_nb_sessions != 0 &&
790 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
791 		RTE_LOG(ERR, USER1, "Device does not support "
792 				"at least %u sessions\n",
793 				MAX_NB_SESSIONS);
794 		return TEST_FAILED;
795 	}
796 
797 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
798 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
799 			SOCKET_ID_ANY);
800 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
801 			"session mempool allocation failed");
802 
803 	ts_params->session_priv_mpool = rte_mempool_create(
804 			"test_sess_mp_priv",
805 			MAX_NB_SESSIONS,
806 			session_size,
807 			0, 0, NULL, NULL, NULL,
808 			NULL, SOCKET_ID_ANY,
809 			0);
810 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
811 			"session mempool allocation failed");
812 
813 
814 
815 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
816 			&ts_params->conf),
817 			"Failed to configure cryptodev %u with %u qps",
818 			dev_id, ts_params->conf.nb_queue_pairs);
819 
820 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
821 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
822 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
823 
824 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
825 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
826 			dev_id, qp_id, &ts_params->qp_conf,
827 			rte_cryptodev_socket_id(dev_id)),
828 			"Failed to setup queue pair %u on cryptodev %u",
829 			qp_id, dev_id);
830 	}
831 
832 	return TEST_SUCCESS;
833 }
834 
835 static void
836 testsuite_teardown(void)
837 {
838 	struct crypto_testsuite_params *ts_params = &testsuite_params;
839 	int res;
840 
841 	if (ts_params->mbuf_pool != NULL) {
842 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
843 		rte_mempool_avail_count(ts_params->mbuf_pool));
844 	}
845 
846 	if (ts_params->op_mpool != NULL) {
847 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
848 		rte_mempool_avail_count(ts_params->op_mpool));
849 	}
850 
851 	/* Free session mempools */
852 	if (ts_params->session_priv_mpool != NULL) {
853 		rte_mempool_free(ts_params->session_priv_mpool);
854 		ts_params->session_priv_mpool = NULL;
855 	}
856 
857 	if (ts_params->session_mpool != NULL) {
858 		rte_mempool_free(ts_params->session_mpool);
859 		ts_params->session_mpool = NULL;
860 	}
861 
862 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
863 	if (res)
864 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
865 }
866 
867 static int
868 dev_configure_and_start(uint64_t ff_disable)
869 {
870 	struct crypto_testsuite_params *ts_params = &testsuite_params;
871 	struct crypto_unittest_params *ut_params = &unittest_params;
872 
873 	uint16_t qp_id;
874 
875 	/* Clear unit test parameters before running test */
876 	memset(ut_params, 0, sizeof(*ut_params));
877 
878 	/* Reconfigure device to default parameters */
879 	ts_params->conf.socket_id = SOCKET_ID_ANY;
880 	ts_params->conf.ff_disable = ff_disable;
881 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
882 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
883 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
884 
885 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
886 			&ts_params->conf),
887 			"Failed to configure cryptodev %u",
888 			ts_params->valid_devs[0]);
889 
890 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
891 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
892 			ts_params->valid_devs[0], qp_id,
893 			&ts_params->qp_conf,
894 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
895 			"Failed to setup queue pair %u on cryptodev %u",
896 			qp_id, ts_params->valid_devs[0]);
897 	}
898 
899 
900 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
901 
902 	/* Start the device */
903 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
904 			"Failed to start cryptodev %u",
905 			ts_params->valid_devs[0]);
906 
907 	return TEST_SUCCESS;
908 }
909 
910 static int
911 ut_setup(void)
912 {
913 	/* Configure and start the device with security feature disabled */
914 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
915 }
916 
917 static int
918 ut_setup_security(void)
919 {
920 	/* Configure and start the device with no features disabled */
921 	return dev_configure_and_start(0);
922 }
923 
924 static void
925 ut_teardown(void)
926 {
927 	struct crypto_testsuite_params *ts_params = &testsuite_params;
928 	struct crypto_unittest_params *ut_params = &unittest_params;
929 	struct rte_cryptodev_stats stats;
930 
931 	/* free crypto session structure */
932 #ifdef RTE_LIB_SECURITY
933 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
934 		if (ut_params->sec_session) {
935 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
936 						(ts_params->valid_devs[0]),
937 						ut_params->sec_session);
938 			ut_params->sec_session = NULL;
939 		}
940 	} else
941 #endif
942 	{
943 		if (ut_params->sess) {
944 			rte_cryptodev_sym_session_clear(
945 					ts_params->valid_devs[0],
946 					ut_params->sess);
947 			rte_cryptodev_sym_session_free(ut_params->sess);
948 			ut_params->sess = NULL;
949 		}
950 	}
951 
952 	/* free crypto operation structure */
953 	if (ut_params->op)
954 		rte_crypto_op_free(ut_params->op);
955 
956 	/*
957 	 * free mbuf - both obuf and ibuf are usually the same,
958 	 * so check if they point at the same address is necessary,
959 	 * to avoid freeing the mbuf twice.
960 	 */
961 	if (ut_params->obuf) {
962 		rte_pktmbuf_free(ut_params->obuf);
963 		if (ut_params->ibuf == ut_params->obuf)
964 			ut_params->ibuf = 0;
965 		ut_params->obuf = 0;
966 	}
967 	if (ut_params->ibuf) {
968 		rte_pktmbuf_free(ut_params->ibuf);
969 		ut_params->ibuf = 0;
970 	}
971 
972 	if (ts_params->mbuf_pool != NULL)
973 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
974 			rte_mempool_avail_count(ts_params->mbuf_pool));
975 
976 	rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats);
977 
978 	/* Stop the device */
979 	rte_cryptodev_stop(ts_params->valid_devs[0]);
980 }
981 
982 static int
983 test_device_configure_invalid_dev_id(void)
984 {
985 	struct crypto_testsuite_params *ts_params = &testsuite_params;
986 	uint16_t dev_id, num_devs = 0;
987 
988 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
989 			"Need at least %d devices for test", 1);
990 
991 	/* valid dev_id values */
992 	dev_id = ts_params->valid_devs[0];
993 
994 	/* Stop the device in case it's started so it can be configured */
995 	rte_cryptodev_stop(dev_id);
996 
997 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
998 			"Failed test for rte_cryptodev_configure: "
999 			"invalid dev_num %u", dev_id);
1000 
1001 	/* invalid dev_id values */
1002 	dev_id = num_devs;
1003 
1004 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1005 			"Failed test for rte_cryptodev_configure: "
1006 			"invalid dev_num %u", dev_id);
1007 
1008 	dev_id = 0xff;
1009 
1010 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1011 			"Failed test for rte_cryptodev_configure:"
1012 			"invalid dev_num %u", dev_id);
1013 
1014 	return TEST_SUCCESS;
1015 }
1016 
1017 static int
1018 test_device_configure_invalid_queue_pair_ids(void)
1019 {
1020 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1021 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1022 
1023 	/* Stop the device in case it's started so it can be configured */
1024 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1025 
1026 	/* valid - max value queue pairs */
1027 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1028 
1029 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1030 			&ts_params->conf),
1031 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1032 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1033 
1034 	/* valid - one queue pairs */
1035 	ts_params->conf.nb_queue_pairs = 1;
1036 
1037 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1038 			&ts_params->conf),
1039 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1040 			ts_params->valid_devs[0],
1041 			ts_params->conf.nb_queue_pairs);
1042 
1043 
1044 	/* invalid - zero queue pairs */
1045 	ts_params->conf.nb_queue_pairs = 0;
1046 
1047 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1048 			&ts_params->conf),
1049 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1050 			" invalid qps: %u",
1051 			ts_params->valid_devs[0],
1052 			ts_params->conf.nb_queue_pairs);
1053 
1054 
1055 	/* invalid - max value supported by field queue pairs */
1056 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1057 
1058 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1059 			&ts_params->conf),
1060 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1061 			" invalid qps: %u",
1062 			ts_params->valid_devs[0],
1063 			ts_params->conf.nb_queue_pairs);
1064 
1065 
1066 	/* invalid - max value + 1 queue pairs */
1067 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1068 
1069 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1070 			&ts_params->conf),
1071 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1072 			" invalid qps: %u",
1073 			ts_params->valid_devs[0],
1074 			ts_params->conf.nb_queue_pairs);
1075 
1076 	/* revert to original testsuite value */
1077 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1078 
1079 	return TEST_SUCCESS;
1080 }
1081 
1082 static int
1083 test_queue_pair_descriptor_setup(void)
1084 {
1085 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1086 	struct rte_cryptodev_qp_conf qp_conf = {
1087 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1088 	};
1089 	uint16_t qp_id;
1090 
1091 	/* Stop the device in case it's started so it can be configured */
1092 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1093 
1094 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1095 			&ts_params->conf),
1096 			"Failed to configure cryptodev %u",
1097 			ts_params->valid_devs[0]);
1098 
1099 	/*
1100 	 * Test various ring sizes on this device. memzones can't be
1101 	 * freed so are re-used if ring is released and re-created.
1102 	 */
1103 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1104 	qp_conf.mp_session = ts_params->session_mpool;
1105 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1106 
1107 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1108 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1109 				ts_params->valid_devs[0], qp_id, &qp_conf,
1110 				rte_cryptodev_socket_id(
1111 						ts_params->valid_devs[0])),
1112 				"Failed test for "
1113 				"rte_cryptodev_queue_pair_setup: num_inflights "
1114 				"%u on qp %u on cryptodev %u",
1115 				qp_conf.nb_descriptors, qp_id,
1116 				ts_params->valid_devs[0]);
1117 	}
1118 
1119 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1120 
1121 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1122 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1123 				ts_params->valid_devs[0], qp_id, &qp_conf,
1124 				rte_cryptodev_socket_id(
1125 						ts_params->valid_devs[0])),
1126 				"Failed test for"
1127 				" rte_cryptodev_queue_pair_setup: num_inflights"
1128 				" %u on qp %u on cryptodev %u",
1129 				qp_conf.nb_descriptors, qp_id,
1130 				ts_params->valid_devs[0]);
1131 	}
1132 
1133 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1134 
1135 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1136 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1137 				ts_params->valid_devs[0], qp_id, &qp_conf,
1138 				rte_cryptodev_socket_id(
1139 						ts_params->valid_devs[0])),
1140 				"Failed test for "
1141 				"rte_cryptodev_queue_pair_setup: num_inflights"
1142 				" %u on qp %u on cryptodev %u",
1143 				qp_conf.nb_descriptors, qp_id,
1144 				ts_params->valid_devs[0]);
1145 	}
1146 
1147 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1148 
1149 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1150 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1151 				ts_params->valid_devs[0], qp_id, &qp_conf,
1152 				rte_cryptodev_socket_id(
1153 						ts_params->valid_devs[0])),
1154 				"Failed test for"
1155 				" rte_cryptodev_queue_pair_setup:"
1156 				"num_inflights %u on qp %u on cryptodev %u",
1157 				qp_conf.nb_descriptors, qp_id,
1158 				ts_params->valid_devs[0]);
1159 	}
1160 
1161 	/* test invalid queue pair id */
1162 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1163 
1164 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1165 
1166 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1167 			ts_params->valid_devs[0],
1168 			qp_id, &qp_conf,
1169 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1170 			"Failed test for rte_cryptodev_queue_pair_setup:"
1171 			"invalid qp %u on cryptodev %u",
1172 			qp_id, ts_params->valid_devs[0]);
1173 
1174 	qp_id = 0xffff; /*invalid*/
1175 
1176 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1177 			ts_params->valid_devs[0],
1178 			qp_id, &qp_conf,
1179 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1180 			"Failed test for rte_cryptodev_queue_pair_setup:"
1181 			"invalid qp %u on cryptodev %u",
1182 			qp_id, ts_params->valid_devs[0]);
1183 
1184 	return TEST_SUCCESS;
1185 }
1186 
1187 /* ***** Plaintext data for tests ***** */
1188 
1189 const char catch_22_quote_1[] =
1190 		"There was only one catch and that was Catch-22, which "
1191 		"specified that a concern for one's safety in the face of "
1192 		"dangers that were real and immediate was the process of a "
1193 		"rational mind. Orr was crazy and could be grounded. All he "
1194 		"had to do was ask; and as soon as he did, he would no longer "
1195 		"be crazy and would have to fly more missions. Orr would be "
1196 		"crazy to fly more missions and sane if he didn't, but if he "
1197 		"was sane he had to fly them. If he flew them he was crazy "
1198 		"and didn't have to; but if he didn't want to he was sane and "
1199 		"had to. Yossarian was moved very deeply by the absolute "
1200 		"simplicity of this clause of Catch-22 and let out a "
1201 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1202 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1203 
1204 const char catch_22_quote[] =
1205 		"What a lousy earth! He wondered how many people were "
1206 		"destitute that same night even in his own prosperous country, "
1207 		"how many homes were shanties, how many husbands were drunk "
1208 		"and wives socked, and how many children were bullied, abused, "
1209 		"or abandoned. How many families hungered for food they could "
1210 		"not afford to buy? How many hearts were broken? How many "
1211 		"suicides would take place that same night, how many people "
1212 		"would go insane? How many cockroaches and landlords would "
1213 		"triumph? How many winners were losers, successes failures, "
1214 		"and rich men poor men? How many wise guys were stupid? How "
1215 		"many happy endings were unhappy endings? How many honest men "
1216 		"were liars, brave men cowards, loyal men traitors, how many "
1217 		"sainted men were corrupt, how many people in positions of "
1218 		"trust had sold their souls to bodyguards, how many had never "
1219 		"had souls? How many straight-and-narrow paths were crooked "
1220 		"paths? How many best families were worst families and how "
1221 		"many good people were bad people? When you added them all up "
1222 		"and then subtracted, you might be left with only the children, "
1223 		"and perhaps with Albert Einstein and an old violinist or "
1224 		"sculptor somewhere.";
1225 
1226 #define QUOTE_480_BYTES		(480)
1227 #define QUOTE_512_BYTES		(512)
1228 #define QUOTE_768_BYTES		(768)
1229 #define QUOTE_1024_BYTES	(1024)
1230 
1231 
1232 
1233 /* ***** SHA1 Hash Tests ***** */
1234 
1235 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1236 
1237 static uint8_t hmac_sha1_key[] = {
1238 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1239 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1240 	0xDE, 0xF4, 0xDE, 0xAD };
1241 
1242 /* ***** SHA224 Hash Tests ***** */
1243 
1244 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1245 
1246 
1247 /* ***** AES-CBC Cipher Tests ***** */
1248 
1249 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1250 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1251 
1252 static uint8_t aes_cbc_key[] = {
1253 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1254 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1255 
1256 static uint8_t aes_cbc_iv[] = {
1257 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1258 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1259 
1260 
1261 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1262 
1263 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1264 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1265 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1266 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1267 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1268 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1269 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1270 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1271 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1272 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1273 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1274 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1275 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1276 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1277 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1278 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1279 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1280 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1281 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1282 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1283 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1284 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1285 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1286 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1287 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1288 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1289 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1290 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1291 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1292 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1293 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1294 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1295 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1296 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1297 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1298 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1299 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1300 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1301 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1302 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1303 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1304 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1305 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1306 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1307 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1308 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1309 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1310 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1311 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1312 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1313 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1314 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1315 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1316 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1317 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1318 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1319 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1320 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1321 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1322 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1323 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1324 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1325 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1326 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1327 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1328 };
1329 
1330 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1331 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1332 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1333 	0x18, 0x8c, 0x1d, 0x32
1334 };
1335 
1336 
1337 /* Multisession Vector context Test */
1338 /*Begin Session 0 */
1339 static uint8_t ms_aes_cbc_key0[] = {
1340 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1341 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1342 };
1343 
1344 static uint8_t ms_aes_cbc_iv0[] = {
1345 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1346 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1347 };
1348 
1349 static const uint8_t ms_aes_cbc_cipher0[] = {
1350 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1351 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1352 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1353 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1354 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1355 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1356 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1357 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1358 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1359 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1360 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1361 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1362 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1363 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1364 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1365 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1366 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1367 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1368 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1369 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1370 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1371 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1372 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1373 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1374 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1375 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1376 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1377 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1378 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1379 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1380 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1381 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1382 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1383 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1384 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1385 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1386 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1387 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1388 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1389 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1390 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1391 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1392 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1393 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1394 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1395 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1396 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1397 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1398 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1399 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1400 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1401 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1402 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1403 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1404 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1405 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1406 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1407 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1408 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1409 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1410 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1411 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1412 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1413 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1414 };
1415 
1416 
1417 static  uint8_t ms_hmac_key0[] = {
1418 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1419 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1420 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1421 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1422 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1423 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1424 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1425 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1426 };
1427 
1428 static const uint8_t ms_hmac_digest0[] = {
1429 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1430 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1431 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1432 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1433 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1434 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1435 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1436 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1437 		};
1438 
1439 /* End Session 0 */
1440 /* Begin session 1 */
1441 
1442 static  uint8_t ms_aes_cbc_key1[] = {
1443 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1444 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1445 };
1446 
1447 static  uint8_t ms_aes_cbc_iv1[] = {
1448 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1449 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1450 };
1451 
1452 static const uint8_t ms_aes_cbc_cipher1[] = {
1453 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1454 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1455 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1456 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1457 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1458 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1459 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1460 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1461 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1462 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1463 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1464 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1465 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1466 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1467 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1468 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1469 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1470 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1471 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1472 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1473 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1474 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1475 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1476 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1477 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1478 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1479 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1480 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1481 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1482 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1483 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1484 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1485 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1486 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1487 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1488 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1489 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1490 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1491 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1492 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1493 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1494 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1495 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1496 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1497 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1498 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1499 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1500 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1501 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
1502 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
1503 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
1504 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
1505 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
1506 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
1507 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
1508 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
1509 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
1510 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
1511 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
1512 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
1513 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
1514 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
1515 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
1516 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
1517 
1518 };
1519 
1520 static uint8_t ms_hmac_key1[] = {
1521 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1522 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1523 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1524 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1525 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1526 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1527 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1528 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1529 };
1530 
1531 static const uint8_t ms_hmac_digest1[] = {
1532 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
1533 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
1534 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
1535 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
1536 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
1537 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
1538 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
1539 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
1540 };
1541 /* End Session 1  */
1542 /* Begin Session 2 */
1543 static  uint8_t ms_aes_cbc_key2[] = {
1544 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1545 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1546 };
1547 
1548 static  uint8_t ms_aes_cbc_iv2[] = {
1549 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1550 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1551 };
1552 
1553 static const uint8_t ms_aes_cbc_cipher2[] = {
1554 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
1555 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
1556 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
1557 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
1558 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
1559 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
1560 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
1561 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
1562 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
1563 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
1564 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
1565 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
1566 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
1567 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
1568 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
1569 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
1570 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
1571 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
1572 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
1573 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
1574 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
1575 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
1576 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
1577 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
1578 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
1579 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
1580 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
1581 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
1582 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
1583 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
1584 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
1585 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
1586 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
1587 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
1588 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
1589 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
1590 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
1591 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
1592 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
1593 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
1594 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
1595 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
1596 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
1597 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
1598 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
1599 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
1600 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
1601 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
1602 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
1603 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
1604 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
1605 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
1606 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
1607 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
1608 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
1609 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
1610 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
1611 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
1612 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
1613 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
1614 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
1615 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
1616 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
1617 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
1618 };
1619 
1620 static  uint8_t ms_hmac_key2[] = {
1621 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1622 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1623 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1624 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1625 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1626 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1627 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1628 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1629 };
1630 
1631 static const uint8_t ms_hmac_digest2[] = {
1632 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
1633 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
1634 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
1635 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
1636 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
1637 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
1638 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
1639 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
1640 };
1641 
1642 /* End Session 2 */
1643 
1644 
1645 static int
1646 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
1647 {
1648 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1649 	struct crypto_unittest_params *ut_params = &unittest_params;
1650 
1651 	/* Verify the capabilities */
1652 	struct rte_cryptodev_sym_capability_idx cap_idx;
1653 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1654 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
1655 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1656 			&cap_idx) == NULL)
1657 		return -ENOTSUP;
1658 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1659 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
1660 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
1661 			&cap_idx) == NULL)
1662 		return -ENOTSUP;
1663 
1664 	/* Generate test mbuf data and space for digest */
1665 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1666 			catch_22_quote,	QUOTE_512_BYTES, 0);
1667 
1668 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1669 			DIGEST_BYTE_LENGTH_SHA1);
1670 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1671 
1672 	/* Setup Cipher Parameters */
1673 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1674 	ut_params->cipher_xform.next = &ut_params->auth_xform;
1675 
1676 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1677 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
1678 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
1679 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1680 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1681 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1682 
1683 	/* Setup HMAC Parameters */
1684 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1685 
1686 	ut_params->auth_xform.next = NULL;
1687 
1688 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
1689 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
1690 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
1691 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
1692 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
1693 
1694 	ut_params->sess = rte_cryptodev_sym_session_create(
1695 			ts_params->session_mpool);
1696 
1697 	/* Create crypto session*/
1698 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
1699 			ut_params->sess, &ut_params->cipher_xform,
1700 			ts_params->session_priv_mpool);
1701 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
1702 
1703 	/* Generate crypto op data structure */
1704 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1705 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1706 	TEST_ASSERT_NOT_NULL(ut_params->op,
1707 			"Failed to allocate symmetric crypto operation struct");
1708 
1709 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
1710 
1711 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1712 
1713 	/* set crypto operation source mbuf */
1714 	sym_op->m_src = ut_params->ibuf;
1715 
1716 	/* Set crypto operation authentication parameters */
1717 	sym_op->auth.digest.data = ut_params->digest;
1718 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1719 			ut_params->ibuf, QUOTE_512_BYTES);
1720 
1721 	sym_op->auth.data.offset = 0;
1722 	sym_op->auth.data.length = QUOTE_512_BYTES;
1723 
1724 	/* Copy IV at the end of the crypto operation */
1725 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1726 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
1727 
1728 	/* Set crypto operation cipher parameters */
1729 	sym_op->cipher.data.offset = 0;
1730 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1731 
1732 	/* Process crypto operation */
1733 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1734 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1735 			ut_params->op);
1736 	else
1737 		TEST_ASSERT_NOT_NULL(
1738 			process_crypto_request(ts_params->valid_devs[0],
1739 				ut_params->op),
1740 				"failed to process sym crypto op");
1741 
1742 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1743 			"crypto op processing failed");
1744 
1745 	/* Validate obuf */
1746 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
1747 			uint8_t *);
1748 
1749 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
1750 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
1751 			QUOTE_512_BYTES,
1752 			"ciphertext data not as expected");
1753 
1754 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
1755 
1756 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
1757 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
1758 			gbl_driver_id == rte_cryptodev_driver_id_get(
1759 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
1760 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
1761 					DIGEST_BYTE_LENGTH_SHA1,
1762 			"Generated digest data not as expected");
1763 
1764 	return TEST_SUCCESS;
1765 }
1766 
1767 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
1768 
1769 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
1770 
1771 static uint8_t hmac_sha512_key[] = {
1772 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1773 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1774 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1775 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
1776 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
1777 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1778 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
1779 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
1780 
1781 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
1782 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
1783 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
1784 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
1785 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
1786 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
1787 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
1788 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
1789 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
1790 
1791 
1792 
1793 static int
1794 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1795 		struct crypto_unittest_params *ut_params,
1796 		uint8_t *cipher_key,
1797 		uint8_t *hmac_key);
1798 
1799 static int
1800 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1801 		struct crypto_unittest_params *ut_params,
1802 		struct crypto_testsuite_params *ts_params,
1803 		const uint8_t *cipher,
1804 		const uint8_t *digest,
1805 		const uint8_t *iv);
1806 
1807 
1808 static int
1809 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
1810 		struct crypto_unittest_params *ut_params,
1811 		uint8_t *cipher_key,
1812 		uint8_t *hmac_key)
1813 {
1814 
1815 	/* Setup Cipher Parameters */
1816 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
1817 	ut_params->cipher_xform.next = NULL;
1818 
1819 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
1820 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
1821 	ut_params->cipher_xform.cipher.key.data = cipher_key;
1822 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
1823 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
1824 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
1825 
1826 	/* Setup HMAC Parameters */
1827 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
1828 	ut_params->auth_xform.next = &ut_params->cipher_xform;
1829 
1830 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
1831 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
1832 	ut_params->auth_xform.auth.key.data = hmac_key;
1833 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
1834 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
1835 
1836 	return TEST_SUCCESS;
1837 }
1838 
1839 
1840 static int
1841 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
1842 		struct crypto_unittest_params *ut_params,
1843 		struct crypto_testsuite_params *ts_params,
1844 		const uint8_t *cipher,
1845 		const uint8_t *digest,
1846 		const uint8_t *iv)
1847 {
1848 	/* Generate test mbuf data and digest */
1849 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
1850 			(const char *)
1851 			cipher,
1852 			QUOTE_512_BYTES, 0);
1853 
1854 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
1855 			DIGEST_BYTE_LENGTH_SHA512);
1856 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
1857 
1858 	rte_memcpy(ut_params->digest,
1859 			digest,
1860 			DIGEST_BYTE_LENGTH_SHA512);
1861 
1862 	/* Generate Crypto op data structure */
1863 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
1864 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
1865 	TEST_ASSERT_NOT_NULL(ut_params->op,
1866 			"Failed to allocate symmetric crypto operation struct");
1867 
1868 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
1869 
1870 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
1871 
1872 	/* set crypto operation source mbuf */
1873 	sym_op->m_src = ut_params->ibuf;
1874 
1875 	sym_op->auth.digest.data = ut_params->digest;
1876 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
1877 			ut_params->ibuf, QUOTE_512_BYTES);
1878 
1879 	sym_op->auth.data.offset = 0;
1880 	sym_op->auth.data.length = QUOTE_512_BYTES;
1881 
1882 	/* Copy IV at the end of the crypto operation */
1883 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
1884 			iv, CIPHER_IV_LENGTH_AES_CBC);
1885 
1886 	sym_op->cipher.data.offset = 0;
1887 	sym_op->cipher.data.length = QUOTE_512_BYTES;
1888 
1889 	/* Process crypto operation */
1890 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
1891 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
1892 			ut_params->op);
1893 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1894 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
1895 				ut_params->op, 1, 1, 0, 0);
1896 	else
1897 		TEST_ASSERT_NOT_NULL(
1898 				process_crypto_request(ts_params->valid_devs[0],
1899 					ut_params->op),
1900 					"failed to process sym crypto op");
1901 
1902 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1903 			"crypto op processing failed");
1904 
1905 	ut_params->obuf = ut_params->op->sym->m_src;
1906 
1907 	/* Validate obuf */
1908 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
1909 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
1910 			catch_22_quote,
1911 			QUOTE_512_BYTES,
1912 			"Plaintext data not as expected");
1913 
1914 	/* Validate obuf */
1915 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
1916 			"Digest verification failed");
1917 
1918 	return TEST_SUCCESS;
1919 }
1920 
1921 static int
1922 test_blockcipher(enum blockcipher_test_type test_type)
1923 {
1924 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1925 	int status;
1926 
1927 	status = test_blockcipher_all_tests(ts_params->mbuf_pool,
1928 		ts_params->op_mpool,
1929 		ts_params->session_mpool, ts_params->session_priv_mpool,
1930 		ts_params->valid_devs[0],
1931 		test_type);
1932 
1933 	if (status == -ENOTSUP)
1934 		return status;
1935 
1936 	TEST_ASSERT_EQUAL(status, 0, "Test failed");
1937 
1938 	return TEST_SUCCESS;
1939 }
1940 
1941 static int
1942 test_AES_cipheronly_all(void)
1943 {
1944 	return test_blockcipher(BLKCIPHER_AES_CIPHERONLY_TYPE);
1945 }
1946 
1947 static int
1948 test_AES_docsis_all(void)
1949 {
1950 	/* Data-path service does not support DOCSIS yet */
1951 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1952 		return -ENOTSUP;
1953 	return test_blockcipher(BLKCIPHER_AES_DOCSIS_TYPE);
1954 }
1955 
1956 static int
1957 test_DES_docsis_all(void)
1958 {
1959 	/* Data-path service does not support DOCSIS yet */
1960 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
1961 		return -ENOTSUP;
1962 	return test_blockcipher(BLKCIPHER_DES_DOCSIS_TYPE);
1963 }
1964 
1965 static int
1966 test_DES_cipheronly_all(void)
1967 {
1968 	return test_blockcipher(BLKCIPHER_DES_CIPHERONLY_TYPE);
1969 }
1970 
1971 static int
1972 test_authonly_all(void)
1973 {
1974 	return test_blockcipher(BLKCIPHER_AUTHONLY_TYPE);
1975 }
1976 
1977 static int
1978 test_AES_chain_all(void)
1979 {
1980 	return test_blockcipher(BLKCIPHER_AES_CHAIN_TYPE);
1981 }
1982 
1983 static int
1984 test_3DES_chain_all(void)
1985 {
1986 	return test_blockcipher(BLKCIPHER_3DES_CHAIN_TYPE);
1987 }
1988 
1989 static int
1990 test_3DES_cipheronly_all(void)
1991 {
1992 	return test_blockcipher(BLKCIPHER_3DES_CIPHERONLY_TYPE);
1993 }
1994 
1995 /* ***** SNOW 3G Tests ***** */
1996 static int
1997 create_wireless_algo_hash_session(uint8_t dev_id,
1998 	const uint8_t *key, const uint8_t key_len,
1999 	const uint8_t iv_len, const uint8_t auth_len,
2000 	enum rte_crypto_auth_operation op,
2001 	enum rte_crypto_auth_algorithm algo)
2002 {
2003 	uint8_t hash_key[key_len];
2004 	int status;
2005 
2006 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2007 	struct crypto_unittest_params *ut_params = &unittest_params;
2008 
2009 	memcpy(hash_key, key, key_len);
2010 
2011 	debug_hexdump(stdout, "key:", key, key_len);
2012 
2013 	/* Setup Authentication Parameters */
2014 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2015 	ut_params->auth_xform.next = NULL;
2016 
2017 	ut_params->auth_xform.auth.op = op;
2018 	ut_params->auth_xform.auth.algo = algo;
2019 	ut_params->auth_xform.auth.key.length = key_len;
2020 	ut_params->auth_xform.auth.key.data = hash_key;
2021 	ut_params->auth_xform.auth.digest_length = auth_len;
2022 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2023 	ut_params->auth_xform.auth.iv.length = iv_len;
2024 	ut_params->sess = rte_cryptodev_sym_session_create(
2025 			ts_params->session_mpool);
2026 
2027 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2028 			&ut_params->auth_xform,
2029 			ts_params->session_priv_mpool);
2030 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2031 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2032 	return 0;
2033 }
2034 
2035 static int
2036 create_wireless_algo_cipher_session(uint8_t dev_id,
2037 			enum rte_crypto_cipher_operation op,
2038 			enum rte_crypto_cipher_algorithm algo,
2039 			const uint8_t *key, const uint8_t key_len,
2040 			uint8_t iv_len)
2041 {
2042 	uint8_t cipher_key[key_len];
2043 	int status;
2044 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2045 	struct crypto_unittest_params *ut_params = &unittest_params;
2046 
2047 	memcpy(cipher_key, key, key_len);
2048 
2049 	/* Setup Cipher Parameters */
2050 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2051 	ut_params->cipher_xform.next = NULL;
2052 
2053 	ut_params->cipher_xform.cipher.algo = algo;
2054 	ut_params->cipher_xform.cipher.op = op;
2055 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2056 	ut_params->cipher_xform.cipher.key.length = key_len;
2057 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2058 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2059 
2060 	debug_hexdump(stdout, "key:", key, key_len);
2061 
2062 	/* Create Crypto session */
2063 	ut_params->sess = rte_cryptodev_sym_session_create(
2064 			ts_params->session_mpool);
2065 
2066 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2067 			&ut_params->cipher_xform,
2068 			ts_params->session_priv_mpool);
2069 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2070 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2071 	return 0;
2072 }
2073 
2074 static int
2075 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2076 			unsigned int cipher_len,
2077 			unsigned int cipher_offset)
2078 {
2079 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2080 	struct crypto_unittest_params *ut_params = &unittest_params;
2081 
2082 	/* Generate Crypto op data structure */
2083 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2084 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2085 	TEST_ASSERT_NOT_NULL(ut_params->op,
2086 				"Failed to allocate pktmbuf offload");
2087 
2088 	/* Set crypto operation data parameters */
2089 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2090 
2091 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2092 
2093 	/* set crypto operation source mbuf */
2094 	sym_op->m_src = ut_params->ibuf;
2095 
2096 	/* iv */
2097 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2098 			iv, iv_len);
2099 	sym_op->cipher.data.length = cipher_len;
2100 	sym_op->cipher.data.offset = cipher_offset;
2101 	return 0;
2102 }
2103 
2104 static int
2105 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2106 			unsigned int cipher_len,
2107 			unsigned int cipher_offset)
2108 {
2109 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2110 	struct crypto_unittest_params *ut_params = &unittest_params;
2111 
2112 	/* Generate Crypto op data structure */
2113 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2114 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2115 	TEST_ASSERT_NOT_NULL(ut_params->op,
2116 				"Failed to allocate pktmbuf offload");
2117 
2118 	/* Set crypto operation data parameters */
2119 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2120 
2121 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2122 
2123 	/* set crypto operation source mbuf */
2124 	sym_op->m_src = ut_params->ibuf;
2125 	sym_op->m_dst = ut_params->obuf;
2126 
2127 	/* iv */
2128 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2129 			iv, iv_len);
2130 	sym_op->cipher.data.length = cipher_len;
2131 	sym_op->cipher.data.offset = cipher_offset;
2132 	return 0;
2133 }
2134 
2135 static int
2136 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2137 		enum rte_crypto_cipher_operation cipher_op,
2138 		enum rte_crypto_auth_operation auth_op,
2139 		enum rte_crypto_auth_algorithm auth_algo,
2140 		enum rte_crypto_cipher_algorithm cipher_algo,
2141 		const uint8_t *key, uint8_t key_len,
2142 		uint8_t auth_iv_len, uint8_t auth_len,
2143 		uint8_t cipher_iv_len)
2144 
2145 {
2146 	uint8_t cipher_auth_key[key_len];
2147 	int status;
2148 
2149 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2150 	struct crypto_unittest_params *ut_params = &unittest_params;
2151 
2152 	memcpy(cipher_auth_key, key, key_len);
2153 
2154 	/* Setup Authentication Parameters */
2155 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2156 	ut_params->auth_xform.next = NULL;
2157 
2158 	ut_params->auth_xform.auth.op = auth_op;
2159 	ut_params->auth_xform.auth.algo = auth_algo;
2160 	ut_params->auth_xform.auth.key.length = key_len;
2161 	/* Hash key = cipher key */
2162 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2163 	ut_params->auth_xform.auth.digest_length = auth_len;
2164 	/* Auth IV will be after cipher IV */
2165 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2166 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2167 
2168 	/* Setup Cipher Parameters */
2169 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2170 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2171 
2172 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2173 	ut_params->cipher_xform.cipher.op = cipher_op;
2174 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2175 	ut_params->cipher_xform.cipher.key.length = key_len;
2176 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2177 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2178 
2179 	debug_hexdump(stdout, "key:", key, key_len);
2180 
2181 	/* Create Crypto session*/
2182 	ut_params->sess = rte_cryptodev_sym_session_create(
2183 			ts_params->session_mpool);
2184 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2185 
2186 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2187 			&ut_params->cipher_xform,
2188 			ts_params->session_priv_mpool);
2189 	if (status == -ENOTSUP)
2190 		return status;
2191 
2192 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2193 	return 0;
2194 }
2195 
2196 static int
2197 create_wireless_cipher_auth_session(uint8_t dev_id,
2198 		enum rte_crypto_cipher_operation cipher_op,
2199 		enum rte_crypto_auth_operation auth_op,
2200 		enum rte_crypto_auth_algorithm auth_algo,
2201 		enum rte_crypto_cipher_algorithm cipher_algo,
2202 		const struct wireless_test_data *tdata)
2203 {
2204 	const uint8_t key_len = tdata->key.len;
2205 	uint8_t cipher_auth_key[key_len];
2206 	int status;
2207 
2208 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2209 	struct crypto_unittest_params *ut_params = &unittest_params;
2210 	const uint8_t *key = tdata->key.data;
2211 	const uint8_t auth_len = tdata->digest.len;
2212 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2213 	uint8_t auth_iv_len = tdata->auth_iv.len;
2214 
2215 	memcpy(cipher_auth_key, key, key_len);
2216 
2217 	/* Setup Authentication Parameters */
2218 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2219 	ut_params->auth_xform.next = NULL;
2220 
2221 	ut_params->auth_xform.auth.op = auth_op;
2222 	ut_params->auth_xform.auth.algo = auth_algo;
2223 	ut_params->auth_xform.auth.key.length = key_len;
2224 	/* Hash key = cipher key */
2225 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2226 	ut_params->auth_xform.auth.digest_length = auth_len;
2227 	/* Auth IV will be after cipher IV */
2228 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2229 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2230 
2231 	/* Setup Cipher Parameters */
2232 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2233 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2234 
2235 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2236 	ut_params->cipher_xform.cipher.op = cipher_op;
2237 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2238 	ut_params->cipher_xform.cipher.key.length = key_len;
2239 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2240 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2241 
2242 
2243 	debug_hexdump(stdout, "key:", key, key_len);
2244 
2245 	/* Create Crypto session*/
2246 	ut_params->sess = rte_cryptodev_sym_session_create(
2247 			ts_params->session_mpool);
2248 
2249 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2250 			&ut_params->cipher_xform,
2251 			ts_params->session_priv_mpool);
2252 	if (status == -ENOTSUP)
2253 		return status;
2254 
2255 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2256 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2257 	return 0;
2258 }
2259 
2260 static int
2261 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2262 		const struct wireless_test_data *tdata)
2263 {
2264 	return create_wireless_cipher_auth_session(dev_id,
2265 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2266 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2267 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2268 }
2269 
2270 static int
2271 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2272 		enum rte_crypto_cipher_operation cipher_op,
2273 		enum rte_crypto_auth_operation auth_op,
2274 		enum rte_crypto_auth_algorithm auth_algo,
2275 		enum rte_crypto_cipher_algorithm cipher_algo,
2276 		const uint8_t *key, const uint8_t key_len,
2277 		uint8_t auth_iv_len, uint8_t auth_len,
2278 		uint8_t cipher_iv_len)
2279 {
2280 	uint8_t auth_cipher_key[key_len];
2281 	int status;
2282 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2283 	struct crypto_unittest_params *ut_params = &unittest_params;
2284 
2285 	memcpy(auth_cipher_key, key, key_len);
2286 
2287 	/* Setup Authentication Parameters */
2288 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2289 	ut_params->auth_xform.auth.op = auth_op;
2290 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2291 	ut_params->auth_xform.auth.algo = auth_algo;
2292 	ut_params->auth_xform.auth.key.length = key_len;
2293 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2294 	ut_params->auth_xform.auth.digest_length = auth_len;
2295 	/* Auth IV will be after cipher IV */
2296 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2297 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2298 
2299 	/* Setup Cipher Parameters */
2300 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2301 	ut_params->cipher_xform.next = NULL;
2302 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2303 	ut_params->cipher_xform.cipher.op = cipher_op;
2304 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2305 	ut_params->cipher_xform.cipher.key.length = key_len;
2306 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2307 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2308 
2309 	debug_hexdump(stdout, "key:", key, key_len);
2310 
2311 	/* Create Crypto session*/
2312 	ut_params->sess = rte_cryptodev_sym_session_create(
2313 			ts_params->session_mpool);
2314 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2315 
2316 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2317 		ut_params->auth_xform.next = NULL;
2318 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2319 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2320 				&ut_params->cipher_xform,
2321 				ts_params->session_priv_mpool);
2322 
2323 	} else
2324 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2325 				&ut_params->auth_xform,
2326 				ts_params->session_priv_mpool);
2327 
2328 	if (status == -ENOTSUP)
2329 		return status;
2330 
2331 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2332 
2333 	return 0;
2334 }
2335 
2336 static int
2337 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2338 		unsigned int auth_tag_len,
2339 		const uint8_t *iv, unsigned int iv_len,
2340 		unsigned int data_pad_len,
2341 		enum rte_crypto_auth_operation op,
2342 		unsigned int auth_len, unsigned int auth_offset)
2343 {
2344 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2345 
2346 	struct crypto_unittest_params *ut_params = &unittest_params;
2347 
2348 	/* Generate Crypto op data structure */
2349 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2350 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2351 	TEST_ASSERT_NOT_NULL(ut_params->op,
2352 		"Failed to allocate pktmbuf offload");
2353 
2354 	/* Set crypto operation data parameters */
2355 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2356 
2357 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2358 
2359 	/* set crypto operation source mbuf */
2360 	sym_op->m_src = ut_params->ibuf;
2361 
2362 	/* iv */
2363 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2364 			iv, iv_len);
2365 	/* digest */
2366 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2367 					ut_params->ibuf, auth_tag_len);
2368 
2369 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2370 				"no room to append auth tag");
2371 	ut_params->digest = sym_op->auth.digest.data;
2372 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2373 			ut_params->ibuf, data_pad_len);
2374 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2375 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2376 	else
2377 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2378 
2379 	debug_hexdump(stdout, "digest:",
2380 		sym_op->auth.digest.data,
2381 		auth_tag_len);
2382 
2383 	sym_op->auth.data.length = auth_len;
2384 	sym_op->auth.data.offset = auth_offset;
2385 
2386 	return 0;
2387 }
2388 
2389 static int
2390 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2391 	enum rte_crypto_auth_operation op)
2392 {
2393 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2394 	struct crypto_unittest_params *ut_params = &unittest_params;
2395 
2396 	const uint8_t *auth_tag = tdata->digest.data;
2397 	const unsigned int auth_tag_len = tdata->digest.len;
2398 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2399 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2400 
2401 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2402 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2403 	const uint8_t *auth_iv = tdata->auth_iv.data;
2404 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2405 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2406 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2407 
2408 	/* Generate Crypto op data structure */
2409 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2410 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2411 	TEST_ASSERT_NOT_NULL(ut_params->op,
2412 			"Failed to allocate pktmbuf offload");
2413 	/* Set crypto operation data parameters */
2414 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2415 
2416 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2417 
2418 	/* set crypto operation source mbuf */
2419 	sym_op->m_src = ut_params->ibuf;
2420 
2421 	/* digest */
2422 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2423 			ut_params->ibuf, auth_tag_len);
2424 
2425 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2426 			"no room to append auth tag");
2427 	ut_params->digest = sym_op->auth.digest.data;
2428 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2429 			ut_params->ibuf, data_pad_len);
2430 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2431 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2432 	else
2433 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2434 
2435 	debug_hexdump(stdout, "digest:",
2436 		sym_op->auth.digest.data,
2437 		auth_tag_len);
2438 
2439 	/* Copy cipher and auth IVs at the end of the crypto operation */
2440 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2441 						IV_OFFSET);
2442 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2443 	iv_ptr += cipher_iv_len;
2444 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2445 
2446 	sym_op->cipher.data.length = cipher_len;
2447 	sym_op->cipher.data.offset = 0;
2448 	sym_op->auth.data.length = auth_len;
2449 	sym_op->auth.data.offset = 0;
2450 
2451 	return 0;
2452 }
2453 
2454 static int
2455 create_zuc_cipher_hash_generate_operation(
2456 		const struct wireless_test_data *tdata)
2457 {
2458 	return create_wireless_cipher_hash_operation(tdata,
2459 		RTE_CRYPTO_AUTH_OP_GENERATE);
2460 }
2461 
2462 static int
2463 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2464 		const unsigned auth_tag_len,
2465 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2466 		unsigned data_pad_len,
2467 		enum rte_crypto_auth_operation op,
2468 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2469 		const unsigned cipher_len, const unsigned cipher_offset,
2470 		const unsigned auth_len, const unsigned auth_offset)
2471 {
2472 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2473 	struct crypto_unittest_params *ut_params = &unittest_params;
2474 
2475 	enum rte_crypto_cipher_algorithm cipher_algo =
2476 			ut_params->cipher_xform.cipher.algo;
2477 	enum rte_crypto_auth_algorithm auth_algo =
2478 			ut_params->auth_xform.auth.algo;
2479 
2480 	/* Generate Crypto op data structure */
2481 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2482 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2483 	TEST_ASSERT_NOT_NULL(ut_params->op,
2484 			"Failed to allocate pktmbuf offload");
2485 	/* Set crypto operation data parameters */
2486 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2487 
2488 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2489 
2490 	/* set crypto operation source mbuf */
2491 	sym_op->m_src = ut_params->ibuf;
2492 
2493 	/* digest */
2494 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2495 			ut_params->ibuf, auth_tag_len);
2496 
2497 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2498 			"no room to append auth tag");
2499 	ut_params->digest = sym_op->auth.digest.data;
2500 
2501 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2502 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2503 				ut_params->ibuf, data_pad_len);
2504 	} else {
2505 		struct rte_mbuf *m = ut_params->ibuf;
2506 		unsigned int offset = data_pad_len;
2507 
2508 		while (offset > m->data_len && m->next != NULL) {
2509 			offset -= m->data_len;
2510 			m = m->next;
2511 		}
2512 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2513 			m, offset);
2514 	}
2515 
2516 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2517 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2518 	else
2519 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2520 
2521 	debug_hexdump(stdout, "digest:",
2522 		sym_op->auth.digest.data,
2523 		auth_tag_len);
2524 
2525 	/* Copy cipher and auth IVs at the end of the crypto operation */
2526 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2527 						IV_OFFSET);
2528 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2529 	iv_ptr += cipher_iv_len;
2530 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2531 
2532 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2533 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2534 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2535 		sym_op->cipher.data.length = cipher_len;
2536 		sym_op->cipher.data.offset = cipher_offset;
2537 	} else {
2538 		sym_op->cipher.data.length = cipher_len >> 3;
2539 		sym_op->cipher.data.offset = cipher_offset >> 3;
2540 	}
2541 
2542 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2543 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2544 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2545 		sym_op->auth.data.length = auth_len;
2546 		sym_op->auth.data.offset = auth_offset;
2547 	} else {
2548 		sym_op->auth.data.length = auth_len >> 3;
2549 		sym_op->auth.data.offset = auth_offset >> 3;
2550 	}
2551 
2552 	return 0;
2553 }
2554 
2555 static int
2556 create_wireless_algo_auth_cipher_operation(
2557 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2558 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2559 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2560 		unsigned int data_pad_len,
2561 		unsigned int cipher_len, unsigned int cipher_offset,
2562 		unsigned int auth_len, unsigned int auth_offset,
2563 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
2564 {
2565 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2566 	struct crypto_unittest_params *ut_params = &unittest_params;
2567 
2568 	enum rte_crypto_cipher_algorithm cipher_algo =
2569 			ut_params->cipher_xform.cipher.algo;
2570 	enum rte_crypto_auth_algorithm auth_algo =
2571 			ut_params->auth_xform.auth.algo;
2572 
2573 	/* Generate Crypto op data structure */
2574 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2575 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2576 	TEST_ASSERT_NOT_NULL(ut_params->op,
2577 			"Failed to allocate pktmbuf offload");
2578 
2579 	/* Set crypto operation data parameters */
2580 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2581 
2582 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2583 
2584 	/* set crypto operation mbufs */
2585 	sym_op->m_src = ut_params->ibuf;
2586 	if (op_mode == OUT_OF_PLACE)
2587 		sym_op->m_dst = ut_params->obuf;
2588 
2589 	/* digest */
2590 	if (!do_sgl) {
2591 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
2592 			(op_mode == IN_PLACE ?
2593 				ut_params->ibuf : ut_params->obuf),
2594 			uint8_t *, data_pad_len);
2595 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2596 			(op_mode == IN_PLACE ?
2597 				ut_params->ibuf : ut_params->obuf),
2598 			data_pad_len);
2599 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2600 	} else {
2601 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
2602 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
2603 				sym_op->m_src : sym_op->m_dst);
2604 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
2605 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
2606 			sgl_buf = sgl_buf->next;
2607 		}
2608 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
2609 				uint8_t *, remaining_off);
2610 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
2611 				remaining_off);
2612 		memset(sym_op->auth.digest.data, 0, remaining_off);
2613 		while (sgl_buf->next != NULL) {
2614 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
2615 				0, rte_pktmbuf_data_len(sgl_buf));
2616 			sgl_buf = sgl_buf->next;
2617 		}
2618 	}
2619 
2620 	/* Copy digest for the verification */
2621 	if (verify)
2622 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2623 
2624 	/* Copy cipher and auth IVs at the end of the crypto operation */
2625 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
2626 			ut_params->op, uint8_t *, IV_OFFSET);
2627 
2628 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2629 	iv_ptr += cipher_iv_len;
2630 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2631 
2632 	/* Only copy over the offset data needed from src to dst in OOP,
2633 	 * if the auth and cipher offsets are not aligned
2634 	 */
2635 	if (op_mode == OUT_OF_PLACE) {
2636 		if (cipher_offset > auth_offset)
2637 			rte_memcpy(
2638 				rte_pktmbuf_mtod_offset(
2639 					sym_op->m_dst,
2640 					uint8_t *, auth_offset >> 3),
2641 				rte_pktmbuf_mtod_offset(
2642 					sym_op->m_src,
2643 					uint8_t *, auth_offset >> 3),
2644 				((cipher_offset >> 3) - (auth_offset >> 3)));
2645 	}
2646 
2647 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2648 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2649 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2650 		sym_op->cipher.data.length = cipher_len;
2651 		sym_op->cipher.data.offset = cipher_offset;
2652 	} else {
2653 		sym_op->cipher.data.length = cipher_len >> 3;
2654 		sym_op->cipher.data.offset = cipher_offset >> 3;
2655 	}
2656 
2657 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2658 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2659 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2660 		sym_op->auth.data.length = auth_len;
2661 		sym_op->auth.data.offset = auth_offset;
2662 	} else {
2663 		sym_op->auth.data.length = auth_len >> 3;
2664 		sym_op->auth.data.offset = auth_offset >> 3;
2665 	}
2666 
2667 	return 0;
2668 }
2669 
2670 static int
2671 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
2672 {
2673 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2674 	struct crypto_unittest_params *ut_params = &unittest_params;
2675 
2676 	int retval;
2677 	unsigned plaintext_pad_len;
2678 	unsigned plaintext_len;
2679 	uint8_t *plaintext;
2680 	struct rte_cryptodev_info dev_info;
2681 
2682 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2683 	uint64_t feat_flags = dev_info.feature_flags;
2684 
2685 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2686 			((tdata->validAuthLenInBits.len % 8) != 0)) {
2687 		printf("Device doesn't support NON-Byte Aligned Data.\n");
2688 		return -ENOTSUP;
2689 	}
2690 
2691 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2692 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2693 		printf("Device doesn't support RAW data-path APIs.\n");
2694 		return -ENOTSUP;
2695 	}
2696 
2697 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2698 		return -ENOTSUP;
2699 
2700 	/* Verify the capabilities */
2701 	struct rte_cryptodev_sym_capability_idx cap_idx;
2702 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2703 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2704 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2705 			&cap_idx) == NULL)
2706 		return -ENOTSUP;
2707 
2708 	/* Create SNOW 3G session */
2709 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2710 			tdata->key.data, tdata->key.len,
2711 			tdata->auth_iv.len, tdata->digest.len,
2712 			RTE_CRYPTO_AUTH_OP_GENERATE,
2713 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2714 	if (retval < 0)
2715 		return retval;
2716 
2717 	/* alloc mbuf and set payload */
2718 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2719 
2720 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2721 	rte_pktmbuf_tailroom(ut_params->ibuf));
2722 
2723 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2724 	/* Append data which is padded to a multiple of */
2725 	/* the algorithms block size */
2726 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2727 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2728 				plaintext_pad_len);
2729 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2730 
2731 	/* Create SNOW 3G operation */
2732 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2733 			tdata->auth_iv.data, tdata->auth_iv.len,
2734 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2735 			tdata->validAuthLenInBits.len,
2736 			0);
2737 	if (retval < 0)
2738 		return retval;
2739 
2740 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2741 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2742 				ut_params->op, 0, 1, 1, 0);
2743 	else
2744 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2745 				ut_params->op);
2746 	ut_params->obuf = ut_params->op->sym->m_src;
2747 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2748 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2749 			+ plaintext_pad_len;
2750 
2751 	/* Validate obuf */
2752 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2753 	ut_params->digest,
2754 	tdata->digest.data,
2755 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
2756 	"SNOW 3G Generated auth tag not as expected");
2757 
2758 	return 0;
2759 }
2760 
2761 static int
2762 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
2763 {
2764 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2765 	struct crypto_unittest_params *ut_params = &unittest_params;
2766 
2767 	int retval;
2768 	unsigned plaintext_pad_len;
2769 	unsigned plaintext_len;
2770 	uint8_t *plaintext;
2771 	struct rte_cryptodev_info dev_info;
2772 
2773 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2774 	uint64_t feat_flags = dev_info.feature_flags;
2775 
2776 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
2777 			((tdata->validAuthLenInBits.len % 8) != 0)) {
2778 		printf("Device doesn't support NON-Byte Aligned Data.\n");
2779 		return -ENOTSUP;
2780 	}
2781 
2782 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2783 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2784 		printf("Device doesn't support RAW data-path APIs.\n");
2785 		return -ENOTSUP;
2786 	}
2787 
2788 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2789 		return -ENOTSUP;
2790 
2791 	/* Verify the capabilities */
2792 	struct rte_cryptodev_sym_capability_idx cap_idx;
2793 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2794 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
2795 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2796 			&cap_idx) == NULL)
2797 		return -ENOTSUP;
2798 
2799 	/* Create SNOW 3G session */
2800 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2801 				tdata->key.data, tdata->key.len,
2802 				tdata->auth_iv.len, tdata->digest.len,
2803 				RTE_CRYPTO_AUTH_OP_VERIFY,
2804 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
2805 	if (retval < 0)
2806 		return retval;
2807 	/* alloc mbuf and set payload */
2808 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2809 
2810 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2811 	rte_pktmbuf_tailroom(ut_params->ibuf));
2812 
2813 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2814 	/* Append data which is padded to a multiple of */
2815 	/* the algorithms block size */
2816 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2817 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2818 				plaintext_pad_len);
2819 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2820 
2821 	/* Create SNOW 3G operation */
2822 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2823 			tdata->digest.len,
2824 			tdata->auth_iv.data, tdata->auth_iv.len,
2825 			plaintext_pad_len,
2826 			RTE_CRYPTO_AUTH_OP_VERIFY,
2827 			tdata->validAuthLenInBits.len,
2828 			0);
2829 	if (retval < 0)
2830 		return retval;
2831 
2832 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2833 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2834 				ut_params->op, 0, 1, 1, 0);
2835 	else
2836 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2837 				ut_params->op);
2838 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2839 	ut_params->obuf = ut_params->op->sym->m_src;
2840 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2841 				+ plaintext_pad_len;
2842 
2843 	/* Validate obuf */
2844 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
2845 		return 0;
2846 	else
2847 		return -1;
2848 
2849 	return 0;
2850 }
2851 
2852 static int
2853 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
2854 {
2855 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2856 	struct crypto_unittest_params *ut_params = &unittest_params;
2857 
2858 	int retval;
2859 	unsigned plaintext_pad_len;
2860 	unsigned plaintext_len;
2861 	uint8_t *plaintext;
2862 	struct rte_cryptodev_info dev_info;
2863 
2864 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2865 	uint64_t feat_flags = dev_info.feature_flags;
2866 
2867 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2868 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2869 		printf("Device doesn't support RAW data-path APIs.\n");
2870 		return -ENOTSUP;
2871 	}
2872 
2873 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2874 		return -ENOTSUP;
2875 
2876 	/* Verify the capabilities */
2877 	struct rte_cryptodev_sym_capability_idx cap_idx;
2878 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2879 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2880 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2881 			&cap_idx) == NULL)
2882 		return -ENOTSUP;
2883 
2884 	/* Create KASUMI session */
2885 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2886 			tdata->key.data, tdata->key.len,
2887 			0, tdata->digest.len,
2888 			RTE_CRYPTO_AUTH_OP_GENERATE,
2889 			RTE_CRYPTO_AUTH_KASUMI_F9);
2890 	if (retval < 0)
2891 		return retval;
2892 
2893 	/* alloc mbuf and set payload */
2894 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2895 
2896 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2897 	rte_pktmbuf_tailroom(ut_params->ibuf));
2898 
2899 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2900 	/* Append data which is padded to a multiple of */
2901 	/* the algorithms block size */
2902 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2903 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2904 				plaintext_pad_len);
2905 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2906 
2907 	/* Create KASUMI operation */
2908 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
2909 			NULL, 0,
2910 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
2911 			tdata->plaintext.len,
2912 			0);
2913 	if (retval < 0)
2914 		return retval;
2915 
2916 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2917 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2918 			ut_params->op);
2919 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2920 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2921 				ut_params->op, 0, 1, 1, 0);
2922 	else
2923 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
2924 			ut_params->op);
2925 
2926 	ut_params->obuf = ut_params->op->sym->m_src;
2927 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
2928 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
2929 			+ plaintext_pad_len;
2930 
2931 	/* Validate obuf */
2932 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2933 	ut_params->digest,
2934 	tdata->digest.data,
2935 	DIGEST_BYTE_LENGTH_KASUMI_F9,
2936 	"KASUMI Generated auth tag not as expected");
2937 
2938 	return 0;
2939 }
2940 
2941 static int
2942 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
2943 {
2944 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2945 	struct crypto_unittest_params *ut_params = &unittest_params;
2946 
2947 	int retval;
2948 	unsigned plaintext_pad_len;
2949 	unsigned plaintext_len;
2950 	uint8_t *plaintext;
2951 	struct rte_cryptodev_info dev_info;
2952 
2953 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
2954 	uint64_t feat_flags = dev_info.feature_flags;
2955 
2956 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
2957 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
2958 		printf("Device doesn't support RAW data-path APIs.\n");
2959 		return -ENOTSUP;
2960 	}
2961 
2962 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2963 		return -ENOTSUP;
2964 
2965 	/* Verify the capabilities */
2966 	struct rte_cryptodev_sym_capability_idx cap_idx;
2967 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2968 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
2969 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2970 			&cap_idx) == NULL)
2971 		return -ENOTSUP;
2972 
2973 	/* Create KASUMI session */
2974 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
2975 				tdata->key.data, tdata->key.len,
2976 				0, tdata->digest.len,
2977 				RTE_CRYPTO_AUTH_OP_VERIFY,
2978 				RTE_CRYPTO_AUTH_KASUMI_F9);
2979 	if (retval < 0)
2980 		return retval;
2981 	/* alloc mbuf and set payload */
2982 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
2983 
2984 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
2985 	rte_pktmbuf_tailroom(ut_params->ibuf));
2986 
2987 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
2988 	/* Append data which is padded to a multiple */
2989 	/* of the algorithms block size */
2990 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
2991 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2992 				plaintext_pad_len);
2993 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
2994 
2995 	/* Create KASUMI operation */
2996 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
2997 			tdata->digest.len,
2998 			NULL, 0,
2999 			plaintext_pad_len,
3000 			RTE_CRYPTO_AUTH_OP_VERIFY,
3001 			tdata->plaintext.len,
3002 			0);
3003 	if (retval < 0)
3004 		return retval;
3005 
3006 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3007 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3008 				ut_params->op, 0, 1, 1, 0);
3009 	else
3010 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3011 				ut_params->op);
3012 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3013 	ut_params->obuf = ut_params->op->sym->m_src;
3014 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3015 				+ plaintext_pad_len;
3016 
3017 	/* Validate obuf */
3018 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3019 		return 0;
3020 	else
3021 		return -1;
3022 
3023 	return 0;
3024 }
3025 
3026 static int
3027 test_snow3g_hash_generate_test_case_1(void)
3028 {
3029 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3030 }
3031 
3032 static int
3033 test_snow3g_hash_generate_test_case_2(void)
3034 {
3035 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3036 }
3037 
3038 static int
3039 test_snow3g_hash_generate_test_case_3(void)
3040 {
3041 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3042 }
3043 
3044 static int
3045 test_snow3g_hash_generate_test_case_4(void)
3046 {
3047 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3048 }
3049 
3050 static int
3051 test_snow3g_hash_generate_test_case_5(void)
3052 {
3053 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3054 }
3055 
3056 static int
3057 test_snow3g_hash_generate_test_case_6(void)
3058 {
3059 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3060 }
3061 
3062 static int
3063 test_snow3g_hash_verify_test_case_1(void)
3064 {
3065 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3066 
3067 }
3068 
3069 static int
3070 test_snow3g_hash_verify_test_case_2(void)
3071 {
3072 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3073 }
3074 
3075 static int
3076 test_snow3g_hash_verify_test_case_3(void)
3077 {
3078 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3079 }
3080 
3081 static int
3082 test_snow3g_hash_verify_test_case_4(void)
3083 {
3084 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3085 }
3086 
3087 static int
3088 test_snow3g_hash_verify_test_case_5(void)
3089 {
3090 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3091 }
3092 
3093 static int
3094 test_snow3g_hash_verify_test_case_6(void)
3095 {
3096 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3097 }
3098 
3099 static int
3100 test_kasumi_hash_generate_test_case_1(void)
3101 {
3102 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3103 }
3104 
3105 static int
3106 test_kasumi_hash_generate_test_case_2(void)
3107 {
3108 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3109 }
3110 
3111 static int
3112 test_kasumi_hash_generate_test_case_3(void)
3113 {
3114 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3115 }
3116 
3117 static int
3118 test_kasumi_hash_generate_test_case_4(void)
3119 {
3120 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3121 }
3122 
3123 static int
3124 test_kasumi_hash_generate_test_case_5(void)
3125 {
3126 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3127 }
3128 
3129 static int
3130 test_kasumi_hash_generate_test_case_6(void)
3131 {
3132 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3133 }
3134 
3135 static int
3136 test_kasumi_hash_verify_test_case_1(void)
3137 {
3138 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3139 }
3140 
3141 static int
3142 test_kasumi_hash_verify_test_case_2(void)
3143 {
3144 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3145 }
3146 
3147 static int
3148 test_kasumi_hash_verify_test_case_3(void)
3149 {
3150 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3151 }
3152 
3153 static int
3154 test_kasumi_hash_verify_test_case_4(void)
3155 {
3156 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3157 }
3158 
3159 static int
3160 test_kasumi_hash_verify_test_case_5(void)
3161 {
3162 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3163 }
3164 
3165 static int
3166 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3167 {
3168 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3169 	struct crypto_unittest_params *ut_params = &unittest_params;
3170 
3171 	int retval;
3172 	uint8_t *plaintext, *ciphertext;
3173 	unsigned plaintext_pad_len;
3174 	unsigned plaintext_len;
3175 	struct rte_cryptodev_info dev_info;
3176 
3177 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3178 	uint64_t feat_flags = dev_info.feature_flags;
3179 
3180 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3181 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3182 		printf("Device doesn't support RAW data-path APIs.\n");
3183 		return -ENOTSUP;
3184 	}
3185 
3186 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3187 		return -ENOTSUP;
3188 
3189 	/* Verify the capabilities */
3190 	struct rte_cryptodev_sym_capability_idx cap_idx;
3191 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3192 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3193 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3194 			&cap_idx) == NULL)
3195 		return -ENOTSUP;
3196 
3197 	/* Create KASUMI session */
3198 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3199 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3200 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3201 					tdata->key.data, tdata->key.len,
3202 					tdata->cipher_iv.len);
3203 	if (retval < 0)
3204 		return retval;
3205 
3206 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3207 
3208 	/* Clear mbuf payload */
3209 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3210 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3211 
3212 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3213 	/* Append data which is padded to a multiple */
3214 	/* of the algorithms block size */
3215 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3216 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3217 				plaintext_pad_len);
3218 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3219 
3220 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3221 
3222 	/* Create KASUMI operation */
3223 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3224 				tdata->cipher_iv.len,
3225 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3226 				tdata->validCipherOffsetInBits.len);
3227 	if (retval < 0)
3228 		return retval;
3229 
3230 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3231 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3232 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3233 	else
3234 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3235 				ut_params->op);
3236 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3237 
3238 	ut_params->obuf = ut_params->op->sym->m_dst;
3239 	if (ut_params->obuf)
3240 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3241 	else
3242 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3243 
3244 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3245 
3246 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3247 				(tdata->validCipherOffsetInBits.len >> 3);
3248 	/* Validate obuf */
3249 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3250 		ciphertext,
3251 		reference_ciphertext,
3252 		tdata->validCipherLenInBits.len,
3253 		"KASUMI Ciphertext data not as expected");
3254 	return 0;
3255 }
3256 
3257 static int
3258 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3259 {
3260 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3261 	struct crypto_unittest_params *ut_params = &unittest_params;
3262 
3263 	int retval;
3264 
3265 	unsigned int plaintext_pad_len;
3266 	unsigned int plaintext_len;
3267 
3268 	uint8_t buffer[10000];
3269 	const uint8_t *ciphertext;
3270 
3271 	struct rte_cryptodev_info dev_info;
3272 
3273 	/* Verify the capabilities */
3274 	struct rte_cryptodev_sym_capability_idx cap_idx;
3275 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3276 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3277 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3278 			&cap_idx) == NULL)
3279 		return -ENOTSUP;
3280 
3281 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3282 
3283 	uint64_t feat_flags = dev_info.feature_flags;
3284 
3285 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3286 		printf("Device doesn't support in-place scatter-gather. "
3287 				"Test Skipped.\n");
3288 		return -ENOTSUP;
3289 	}
3290 
3291 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3292 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3293 		printf("Device doesn't support RAW data-path APIs.\n");
3294 		return -ENOTSUP;
3295 	}
3296 
3297 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3298 		return -ENOTSUP;
3299 
3300 	/* Create KASUMI session */
3301 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3302 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3303 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3304 					tdata->key.data, tdata->key.len,
3305 					tdata->cipher_iv.len);
3306 	if (retval < 0)
3307 		return retval;
3308 
3309 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3310 
3311 
3312 	/* Append data which is padded to a multiple */
3313 	/* of the algorithms block size */
3314 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3315 
3316 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3317 			plaintext_pad_len, 10, 0);
3318 
3319 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3320 
3321 	/* Create KASUMI operation */
3322 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3323 				tdata->cipher_iv.len,
3324 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3325 				tdata->validCipherOffsetInBits.len);
3326 	if (retval < 0)
3327 		return retval;
3328 
3329 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3330 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3331 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3332 	else
3333 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3334 						ut_params->op);
3335 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3336 
3337 	ut_params->obuf = ut_params->op->sym->m_dst;
3338 
3339 	if (ut_params->obuf)
3340 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3341 				plaintext_len, buffer);
3342 	else
3343 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3344 				tdata->validCipherOffsetInBits.len >> 3,
3345 				plaintext_len, buffer);
3346 
3347 	/* Validate obuf */
3348 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3349 
3350 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3351 				(tdata->validCipherOffsetInBits.len >> 3);
3352 	/* Validate obuf */
3353 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3354 		ciphertext,
3355 		reference_ciphertext,
3356 		tdata->validCipherLenInBits.len,
3357 		"KASUMI Ciphertext data not as expected");
3358 	return 0;
3359 }
3360 
3361 static int
3362 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3363 {
3364 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3365 	struct crypto_unittest_params *ut_params = &unittest_params;
3366 
3367 	int retval;
3368 	uint8_t *plaintext, *ciphertext;
3369 	unsigned plaintext_pad_len;
3370 	unsigned plaintext_len;
3371 
3372 	/* Verify the capabilities */
3373 	struct rte_cryptodev_sym_capability_idx cap_idx;
3374 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3375 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3376 	/* Data-path service does not support OOP */
3377 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3378 			&cap_idx) == NULL)
3379 		return -ENOTSUP;
3380 
3381 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3382 		return -ENOTSUP;
3383 
3384 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3385 		return -ENOTSUP;
3386 
3387 	/* Create KASUMI session */
3388 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3389 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3390 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3391 					tdata->key.data, tdata->key.len,
3392 					tdata->cipher_iv.len);
3393 	if (retval < 0)
3394 		return retval;
3395 
3396 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3397 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3398 
3399 	/* Clear mbuf payload */
3400 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3401 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3402 
3403 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3404 	/* Append data which is padded to a multiple */
3405 	/* of the algorithms block size */
3406 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3407 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3408 				plaintext_pad_len);
3409 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3410 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3411 
3412 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3413 
3414 	/* Create KASUMI operation */
3415 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3416 				tdata->cipher_iv.len,
3417 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3418 				tdata->validCipherOffsetInBits.len);
3419 	if (retval < 0)
3420 		return retval;
3421 
3422 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3423 						ut_params->op);
3424 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3425 
3426 	ut_params->obuf = ut_params->op->sym->m_dst;
3427 	if (ut_params->obuf)
3428 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3429 	else
3430 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3431 
3432 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3433 
3434 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3435 				(tdata->validCipherOffsetInBits.len >> 3);
3436 	/* Validate obuf */
3437 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3438 		ciphertext,
3439 		reference_ciphertext,
3440 		tdata->validCipherLenInBits.len,
3441 		"KASUMI Ciphertext data not as expected");
3442 	return 0;
3443 }
3444 
3445 static int
3446 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3447 {
3448 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3449 	struct crypto_unittest_params *ut_params = &unittest_params;
3450 
3451 	int retval;
3452 	unsigned int plaintext_pad_len;
3453 	unsigned int plaintext_len;
3454 
3455 	const uint8_t *ciphertext;
3456 	uint8_t buffer[2048];
3457 
3458 	struct rte_cryptodev_info dev_info;
3459 
3460 	/* Verify the capabilities */
3461 	struct rte_cryptodev_sym_capability_idx cap_idx;
3462 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3463 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3464 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3465 			&cap_idx) == NULL)
3466 		return -ENOTSUP;
3467 
3468 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3469 		return -ENOTSUP;
3470 
3471 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3472 		return -ENOTSUP;
3473 
3474 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3475 
3476 	uint64_t feat_flags = dev_info.feature_flags;
3477 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3478 		printf("Device doesn't support out-of-place scatter-gather "
3479 				"in both input and output mbufs. "
3480 				"Test Skipped.\n");
3481 		return -ENOTSUP;
3482 	}
3483 
3484 	/* Create KASUMI session */
3485 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3486 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3487 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3488 					tdata->key.data, tdata->key.len,
3489 					tdata->cipher_iv.len);
3490 	if (retval < 0)
3491 		return retval;
3492 
3493 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3494 	/* Append data which is padded to a multiple */
3495 	/* of the algorithms block size */
3496 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3497 
3498 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3499 			plaintext_pad_len, 10, 0);
3500 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3501 			plaintext_pad_len, 3, 0);
3502 
3503 	/* Append data which is padded to a multiple */
3504 	/* of the algorithms block size */
3505 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3506 
3507 	/* Create KASUMI operation */
3508 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3509 				tdata->cipher_iv.len,
3510 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3511 				tdata->validCipherOffsetInBits.len);
3512 	if (retval < 0)
3513 		return retval;
3514 
3515 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3516 						ut_params->op);
3517 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3518 
3519 	ut_params->obuf = ut_params->op->sym->m_dst;
3520 	if (ut_params->obuf)
3521 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3522 				plaintext_pad_len, buffer);
3523 	else
3524 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3525 				tdata->validCipherOffsetInBits.len >> 3,
3526 				plaintext_pad_len, buffer);
3527 
3528 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3529 				(tdata->validCipherOffsetInBits.len >> 3);
3530 	/* Validate obuf */
3531 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3532 		ciphertext,
3533 		reference_ciphertext,
3534 		tdata->validCipherLenInBits.len,
3535 		"KASUMI Ciphertext data not as expected");
3536 	return 0;
3537 }
3538 
3539 
3540 static int
3541 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3542 {
3543 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3544 	struct crypto_unittest_params *ut_params = &unittest_params;
3545 
3546 	int retval;
3547 	uint8_t *ciphertext, *plaintext;
3548 	unsigned ciphertext_pad_len;
3549 	unsigned ciphertext_len;
3550 
3551 	/* Verify the capabilities */
3552 	struct rte_cryptodev_sym_capability_idx cap_idx;
3553 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3554 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3555 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3556 			&cap_idx) == NULL)
3557 		return -ENOTSUP;
3558 
3559 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3560 		return -ENOTSUP;
3561 
3562 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3563 		return -ENOTSUP;
3564 
3565 	/* Create KASUMI session */
3566 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3567 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3568 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3569 					tdata->key.data, tdata->key.len,
3570 					tdata->cipher_iv.len);
3571 	if (retval < 0)
3572 		return retval;
3573 
3574 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3575 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3576 
3577 	/* Clear mbuf payload */
3578 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3579 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3580 
3581 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3582 	/* Append data which is padded to a multiple */
3583 	/* of the algorithms block size */
3584 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3585 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3586 				ciphertext_pad_len);
3587 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
3588 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3589 
3590 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3591 
3592 	/* Create KASUMI operation */
3593 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3594 				tdata->cipher_iv.len,
3595 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3596 				tdata->validCipherOffsetInBits.len);
3597 	if (retval < 0)
3598 		return retval;
3599 
3600 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3601 						ut_params->op);
3602 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3603 
3604 	ut_params->obuf = ut_params->op->sym->m_dst;
3605 	if (ut_params->obuf)
3606 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3607 	else
3608 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3609 
3610 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3611 
3612 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3613 				(tdata->validCipherOffsetInBits.len >> 3);
3614 	/* Validate obuf */
3615 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3616 		plaintext,
3617 		reference_plaintext,
3618 		tdata->validCipherLenInBits.len,
3619 		"KASUMI Plaintext data not as expected");
3620 	return 0;
3621 }
3622 
3623 static int
3624 test_kasumi_decryption(const struct kasumi_test_data *tdata)
3625 {
3626 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3627 	struct crypto_unittest_params *ut_params = &unittest_params;
3628 
3629 	int retval;
3630 	uint8_t *ciphertext, *plaintext;
3631 	unsigned ciphertext_pad_len;
3632 	unsigned ciphertext_len;
3633 	struct rte_cryptodev_info dev_info;
3634 
3635 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3636 	uint64_t feat_flags = dev_info.feature_flags;
3637 
3638 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3639 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3640 		printf("Device doesn't support RAW data-path APIs.\n");
3641 		return -ENOTSUP;
3642 	}
3643 
3644 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3645 		return -ENOTSUP;
3646 
3647 	/* Verify the capabilities */
3648 	struct rte_cryptodev_sym_capability_idx cap_idx;
3649 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3650 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3651 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3652 			&cap_idx) == NULL)
3653 		return -ENOTSUP;
3654 
3655 	/* Create KASUMI session */
3656 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3657 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
3658 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3659 					tdata->key.data, tdata->key.len,
3660 					tdata->cipher_iv.len);
3661 	if (retval < 0)
3662 		return retval;
3663 
3664 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3665 
3666 	/* Clear mbuf payload */
3667 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3668 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3669 
3670 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
3671 	/* Append data which is padded to a multiple */
3672 	/* of the algorithms block size */
3673 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
3674 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3675 				ciphertext_pad_len);
3676 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
3677 
3678 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
3679 
3680 	/* Create KASUMI operation */
3681 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3682 					tdata->cipher_iv.len,
3683 					tdata->ciphertext.len,
3684 					tdata->validCipherOffsetInBits.len);
3685 	if (retval < 0)
3686 		return retval;
3687 
3688 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3689 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3690 				ut_params->op, 1, 0, 1, 0);
3691 	else
3692 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3693 						ut_params->op);
3694 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3695 
3696 	ut_params->obuf = ut_params->op->sym->m_dst;
3697 	if (ut_params->obuf)
3698 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3699 	else
3700 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
3701 
3702 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
3703 
3704 	const uint8_t *reference_plaintext = tdata->plaintext.data +
3705 				(tdata->validCipherOffsetInBits.len >> 3);
3706 	/* Validate obuf */
3707 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3708 		plaintext,
3709 		reference_plaintext,
3710 		tdata->validCipherLenInBits.len,
3711 		"KASUMI Plaintext data not as expected");
3712 	return 0;
3713 }
3714 
3715 static int
3716 test_snow3g_encryption(const struct snow3g_test_data *tdata)
3717 {
3718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3719 	struct crypto_unittest_params *ut_params = &unittest_params;
3720 
3721 	int retval;
3722 	uint8_t *plaintext, *ciphertext;
3723 	unsigned plaintext_pad_len;
3724 	unsigned plaintext_len;
3725 	struct rte_cryptodev_info dev_info;
3726 
3727 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3728 	uint64_t feat_flags = dev_info.feature_flags;
3729 
3730 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3731 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3732 		printf("Device doesn't support RAW data-path APIs.\n");
3733 		return -ENOTSUP;
3734 	}
3735 
3736 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3737 		return -ENOTSUP;
3738 
3739 	/* Verify the capabilities */
3740 	struct rte_cryptodev_sym_capability_idx cap_idx;
3741 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3742 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3743 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3744 			&cap_idx) == NULL)
3745 		return -ENOTSUP;
3746 
3747 	/* Create SNOW 3G session */
3748 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3749 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3750 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3751 					tdata->key.data, tdata->key.len,
3752 					tdata->cipher_iv.len);
3753 	if (retval < 0)
3754 		return retval;
3755 
3756 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3757 
3758 	/* Clear mbuf payload */
3759 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3760 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3761 
3762 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3763 	/* Append data which is padded to a multiple of */
3764 	/* the algorithms block size */
3765 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3766 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3767 				plaintext_pad_len);
3768 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3769 
3770 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3771 
3772 	/* Create SNOW 3G operation */
3773 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3774 					tdata->cipher_iv.len,
3775 					tdata->validCipherLenInBits.len,
3776 					0);
3777 	if (retval < 0)
3778 		return retval;
3779 
3780 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3781 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3782 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3783 	else
3784 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3785 						ut_params->op);
3786 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3787 
3788 	ut_params->obuf = ut_params->op->sym->m_dst;
3789 	if (ut_params->obuf)
3790 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3791 	else
3792 		ciphertext = plaintext;
3793 
3794 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3795 
3796 	/* Validate obuf */
3797 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3798 		ciphertext,
3799 		tdata->ciphertext.data,
3800 		tdata->validDataLenInBits.len,
3801 		"SNOW 3G Ciphertext data not as expected");
3802 	return 0;
3803 }
3804 
3805 
3806 static int
3807 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
3808 {
3809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3810 	struct crypto_unittest_params *ut_params = &unittest_params;
3811 	uint8_t *plaintext, *ciphertext;
3812 
3813 	int retval;
3814 	unsigned plaintext_pad_len;
3815 	unsigned plaintext_len;
3816 
3817 	/* Verify the capabilities */
3818 	struct rte_cryptodev_sym_capability_idx cap_idx;
3819 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3820 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3821 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3822 			&cap_idx) == NULL)
3823 		return -ENOTSUP;
3824 
3825 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3826 		return -ENOTSUP;
3827 
3828 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3829 		return -ENOTSUP;
3830 
3831 	/* Create SNOW 3G session */
3832 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3833 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3834 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3835 					tdata->key.data, tdata->key.len,
3836 					tdata->cipher_iv.len);
3837 	if (retval < 0)
3838 		return retval;
3839 
3840 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3841 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3842 
3843 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3844 			"Failed to allocate input buffer in mempool");
3845 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3846 			"Failed to allocate output buffer in mempool");
3847 
3848 	/* Clear mbuf payload */
3849 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3850 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3851 
3852 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3853 	/* Append data which is padded to a multiple of */
3854 	/* the algorithms block size */
3855 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3856 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3857 				plaintext_pad_len);
3858 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3859 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3860 
3861 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3862 
3863 	/* Create SNOW 3G operation */
3864 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3865 					tdata->cipher_iv.len,
3866 					tdata->validCipherLenInBits.len,
3867 					0);
3868 	if (retval < 0)
3869 		return retval;
3870 
3871 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3872 						ut_params->op);
3873 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3874 
3875 	ut_params->obuf = ut_params->op->sym->m_dst;
3876 	if (ut_params->obuf)
3877 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3878 	else
3879 		ciphertext = plaintext;
3880 
3881 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3882 
3883 	/* Validate obuf */
3884 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3885 		ciphertext,
3886 		tdata->ciphertext.data,
3887 		tdata->validDataLenInBits.len,
3888 		"SNOW 3G Ciphertext data not as expected");
3889 	return 0;
3890 }
3891 
3892 static int
3893 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
3894 {
3895 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3896 	struct crypto_unittest_params *ut_params = &unittest_params;
3897 
3898 	int retval;
3899 	unsigned int plaintext_pad_len;
3900 	unsigned int plaintext_len;
3901 	uint8_t buffer[10000];
3902 	const uint8_t *ciphertext;
3903 
3904 	struct rte_cryptodev_info dev_info;
3905 
3906 	/* Verify the capabilities */
3907 	struct rte_cryptodev_sym_capability_idx cap_idx;
3908 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3909 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
3910 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3911 			&cap_idx) == NULL)
3912 		return -ENOTSUP;
3913 
3914 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3915 		return -ENOTSUP;
3916 
3917 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3918 		return -ENOTSUP;
3919 
3920 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3921 
3922 	uint64_t feat_flags = dev_info.feature_flags;
3923 
3924 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3925 		printf("Device doesn't support out-of-place scatter-gather "
3926 				"in both input and output mbufs. "
3927 				"Test Skipped.\n");
3928 		return -ENOTSUP;
3929 	}
3930 
3931 	/* Create SNOW 3G session */
3932 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3933 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3934 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
3935 					tdata->key.data, tdata->key.len,
3936 					tdata->cipher_iv.len);
3937 	if (retval < 0)
3938 		return retval;
3939 
3940 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3941 	/* Append data which is padded to a multiple of */
3942 	/* the algorithms block size */
3943 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3944 
3945 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3946 			plaintext_pad_len, 10, 0);
3947 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3948 			plaintext_pad_len, 3, 0);
3949 
3950 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
3951 			"Failed to allocate input buffer in mempool");
3952 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
3953 			"Failed to allocate output buffer in mempool");
3954 
3955 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3956 
3957 	/* Create SNOW 3G operation */
3958 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3959 					tdata->cipher_iv.len,
3960 					tdata->validCipherLenInBits.len,
3961 					0);
3962 	if (retval < 0)
3963 		return retval;
3964 
3965 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3966 						ut_params->op);
3967 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3968 
3969 	ut_params->obuf = ut_params->op->sym->m_dst;
3970 	if (ut_params->obuf)
3971 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3972 				plaintext_len, buffer);
3973 	else
3974 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
3975 				plaintext_len, buffer);
3976 
3977 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3978 
3979 	/* Validate obuf */
3980 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3981 		ciphertext,
3982 		tdata->ciphertext.data,
3983 		tdata->validDataLenInBits.len,
3984 		"SNOW 3G Ciphertext data not as expected");
3985 
3986 	return 0;
3987 }
3988 
3989 /* Shift right a buffer by "offset" bits, "offset" < 8 */
3990 static void
3991 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
3992 {
3993 	uint8_t curr_byte, prev_byte;
3994 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
3995 	uint8_t lower_byte_mask = (1 << offset) - 1;
3996 	unsigned i;
3997 
3998 	prev_byte = buffer[0];
3999 	buffer[0] >>= offset;
4000 
4001 	for (i = 1; i < length_in_bytes; i++) {
4002 		curr_byte = buffer[i];
4003 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4004 				(curr_byte >> offset);
4005 		prev_byte = curr_byte;
4006 	}
4007 }
4008 
4009 static int
4010 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4011 {
4012 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4013 	struct crypto_unittest_params *ut_params = &unittest_params;
4014 	uint8_t *plaintext, *ciphertext;
4015 	int retval;
4016 	uint32_t plaintext_len;
4017 	uint32_t plaintext_pad_len;
4018 	uint8_t extra_offset = 4;
4019 	uint8_t *expected_ciphertext_shifted;
4020 	struct rte_cryptodev_info dev_info;
4021 
4022 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4023 	uint64_t feat_flags = dev_info.feature_flags;
4024 
4025 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4026 			((tdata->validDataLenInBits.len % 8) != 0)) {
4027 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4028 		return -ENOTSUP;
4029 	}
4030 
4031 	/* Verify the capabilities */
4032 	struct rte_cryptodev_sym_capability_idx cap_idx;
4033 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4034 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4035 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4036 			&cap_idx) == NULL)
4037 		return -ENOTSUP;
4038 
4039 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4040 		return -ENOTSUP;
4041 
4042 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4043 		return -ENOTSUP;
4044 
4045 	/* Create SNOW 3G session */
4046 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4047 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4048 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4049 					tdata->key.data, tdata->key.len,
4050 					tdata->cipher_iv.len);
4051 	if (retval < 0)
4052 		return retval;
4053 
4054 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4055 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4056 
4057 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4058 			"Failed to allocate input buffer in mempool");
4059 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4060 			"Failed to allocate output buffer in mempool");
4061 
4062 	/* Clear mbuf payload */
4063 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4064 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4065 
4066 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4067 	/*
4068 	 * Append data which is padded to a
4069 	 * multiple of the algorithms block size
4070 	 */
4071 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4072 
4073 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4074 						plaintext_pad_len);
4075 
4076 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4077 
4078 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4079 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4080 
4081 #ifdef RTE_APP_TEST_DEBUG
4082 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4083 #endif
4084 	/* Create SNOW 3G operation */
4085 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4086 					tdata->cipher_iv.len,
4087 					tdata->validCipherLenInBits.len,
4088 					extra_offset);
4089 	if (retval < 0)
4090 		return retval;
4091 
4092 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4093 						ut_params->op);
4094 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4095 
4096 	ut_params->obuf = ut_params->op->sym->m_dst;
4097 	if (ut_params->obuf)
4098 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4099 	else
4100 		ciphertext = plaintext;
4101 
4102 #ifdef RTE_APP_TEST_DEBUG
4103 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4104 #endif
4105 
4106 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4107 
4108 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4109 			"failed to reserve memory for ciphertext shifted\n");
4110 
4111 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4112 			ceil_byte_length(tdata->ciphertext.len));
4113 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4114 			extra_offset);
4115 	/* Validate obuf */
4116 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4117 		ciphertext,
4118 		expected_ciphertext_shifted,
4119 		tdata->validDataLenInBits.len,
4120 		extra_offset,
4121 		"SNOW 3G Ciphertext data not as expected");
4122 	return 0;
4123 }
4124 
4125 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4126 {
4127 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4128 	struct crypto_unittest_params *ut_params = &unittest_params;
4129 
4130 	int retval;
4131 
4132 	uint8_t *plaintext, *ciphertext;
4133 	unsigned ciphertext_pad_len;
4134 	unsigned ciphertext_len;
4135 	struct rte_cryptodev_info dev_info;
4136 
4137 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4138 	uint64_t feat_flags = dev_info.feature_flags;
4139 
4140 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4141 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4142 		printf("Device doesn't support RAW data-path APIs.\n");
4143 		return -ENOTSUP;
4144 	}
4145 
4146 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4147 		return -ENOTSUP;
4148 
4149 	/* Verify the capabilities */
4150 	struct rte_cryptodev_sym_capability_idx cap_idx;
4151 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4152 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4153 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4154 			&cap_idx) == NULL)
4155 		return -ENOTSUP;
4156 
4157 	/* Create SNOW 3G session */
4158 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4159 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4160 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4161 					tdata->key.data, tdata->key.len,
4162 					tdata->cipher_iv.len);
4163 	if (retval < 0)
4164 		return retval;
4165 
4166 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4167 
4168 	/* Clear mbuf payload */
4169 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4170 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4171 
4172 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4173 	/* Append data which is padded to a multiple of */
4174 	/* the algorithms block size */
4175 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4176 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4177 				ciphertext_pad_len);
4178 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4179 
4180 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4181 
4182 	/* Create SNOW 3G operation */
4183 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4184 					tdata->cipher_iv.len,
4185 					tdata->validCipherLenInBits.len,
4186 					tdata->cipher.offset_bits);
4187 	if (retval < 0)
4188 		return retval;
4189 
4190 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4191 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4192 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4193 	else
4194 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4195 						ut_params->op);
4196 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4197 	ut_params->obuf = ut_params->op->sym->m_dst;
4198 	if (ut_params->obuf)
4199 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4200 	else
4201 		plaintext = ciphertext;
4202 
4203 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4204 
4205 	/* Validate obuf */
4206 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4207 				tdata->plaintext.data,
4208 				tdata->validDataLenInBits.len,
4209 				"SNOW 3G Plaintext data not as expected");
4210 	return 0;
4211 }
4212 
4213 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4214 {
4215 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4216 	struct crypto_unittest_params *ut_params = &unittest_params;
4217 
4218 	int retval;
4219 
4220 	uint8_t *plaintext, *ciphertext;
4221 	unsigned ciphertext_pad_len;
4222 	unsigned ciphertext_len;
4223 
4224 	/* Verify the capabilities */
4225 	struct rte_cryptodev_sym_capability_idx cap_idx;
4226 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4227 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4228 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4229 			&cap_idx) == NULL)
4230 		return -ENOTSUP;
4231 
4232 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4233 		return -ENOTSUP;
4234 
4235 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4236 		return -ENOTSUP;
4237 
4238 	/* Create SNOW 3G session */
4239 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4240 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4241 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4242 					tdata->key.data, tdata->key.len,
4243 					tdata->cipher_iv.len);
4244 	if (retval < 0)
4245 		return retval;
4246 
4247 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4248 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4249 
4250 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4251 			"Failed to allocate input buffer");
4252 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4253 			"Failed to allocate output buffer");
4254 
4255 	/* Clear mbuf payload */
4256 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4257 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4258 
4259 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4260 		       rte_pktmbuf_tailroom(ut_params->obuf));
4261 
4262 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4263 	/* Append data which is padded to a multiple of */
4264 	/* the algorithms block size */
4265 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4266 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4267 				ciphertext_pad_len);
4268 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4269 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4270 
4271 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4272 
4273 	/* Create SNOW 3G operation */
4274 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4275 					tdata->cipher_iv.len,
4276 					tdata->validCipherLenInBits.len,
4277 					0);
4278 	if (retval < 0)
4279 		return retval;
4280 
4281 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4282 						ut_params->op);
4283 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4284 	ut_params->obuf = ut_params->op->sym->m_dst;
4285 	if (ut_params->obuf)
4286 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4287 	else
4288 		plaintext = ciphertext;
4289 
4290 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4291 
4292 	/* Validate obuf */
4293 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4294 				tdata->plaintext.data,
4295 				tdata->validDataLenInBits.len,
4296 				"SNOW 3G Plaintext data not as expected");
4297 	return 0;
4298 }
4299 
4300 static int
4301 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4302 {
4303 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4304 	struct crypto_unittest_params *ut_params = &unittest_params;
4305 
4306 	int retval;
4307 
4308 	uint8_t *plaintext, *ciphertext;
4309 	unsigned int plaintext_pad_len;
4310 	unsigned int plaintext_len;
4311 
4312 	struct rte_cryptodev_info dev_info;
4313 	struct rte_cryptodev_sym_capability_idx cap_idx;
4314 
4315 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4316 	uint64_t feat_flags = dev_info.feature_flags;
4317 
4318 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4319 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4320 			(tdata->validDataLenInBits.len % 8 != 0))) {
4321 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4322 		return -ENOTSUP;
4323 	}
4324 
4325 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4326 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4327 		printf("Device doesn't support RAW data-path APIs.\n");
4328 		return -ENOTSUP;
4329 	}
4330 
4331 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4332 		return -ENOTSUP;
4333 
4334 	/* Check if device supports ZUC EEA3 */
4335 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4336 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4337 
4338 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4339 			&cap_idx) == NULL)
4340 		return -ENOTSUP;
4341 
4342 	/* Check if device supports ZUC EIA3 */
4343 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4344 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4345 
4346 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4347 			&cap_idx) == NULL)
4348 		return -ENOTSUP;
4349 
4350 	/* Create ZUC session */
4351 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4352 			ts_params->valid_devs[0],
4353 			tdata);
4354 	if (retval < 0)
4355 		return retval;
4356 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4357 
4358 	/* clear mbuf payload */
4359 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4360 			rte_pktmbuf_tailroom(ut_params->ibuf));
4361 
4362 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4363 	/* Append data which is padded to a multiple of */
4364 	/* the algorithms block size */
4365 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4366 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4367 				plaintext_pad_len);
4368 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4369 
4370 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4371 
4372 	/* Create ZUC operation */
4373 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4374 	if (retval < 0)
4375 		return retval;
4376 
4377 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4378 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4379 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4380 	else
4381 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4382 			ut_params->op);
4383 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4384 	ut_params->obuf = ut_params->op->sym->m_src;
4385 	if (ut_params->obuf)
4386 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4387 	else
4388 		ciphertext = plaintext;
4389 
4390 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4391 	/* Validate obuf */
4392 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4393 			ciphertext,
4394 			tdata->ciphertext.data,
4395 			tdata->validDataLenInBits.len,
4396 			"ZUC Ciphertext data not as expected");
4397 
4398 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4399 	    + plaintext_pad_len;
4400 
4401 	/* Validate obuf */
4402 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4403 			ut_params->digest,
4404 			tdata->digest.data,
4405 			4,
4406 			"ZUC Generated auth tag not as expected");
4407 	return 0;
4408 }
4409 
4410 static int
4411 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4412 {
4413 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4414 	struct crypto_unittest_params *ut_params = &unittest_params;
4415 
4416 	int retval;
4417 
4418 	uint8_t *plaintext, *ciphertext;
4419 	unsigned plaintext_pad_len;
4420 	unsigned plaintext_len;
4421 	struct rte_cryptodev_info dev_info;
4422 
4423 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4424 	uint64_t feat_flags = dev_info.feature_flags;
4425 
4426 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4427 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4428 		printf("Device doesn't support RAW data-path APIs.\n");
4429 		return -ENOTSUP;
4430 	}
4431 
4432 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4433 		return -ENOTSUP;
4434 
4435 	/* Verify the capabilities */
4436 	struct rte_cryptodev_sym_capability_idx cap_idx;
4437 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4438 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4439 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4440 			&cap_idx) == NULL)
4441 		return -ENOTSUP;
4442 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4443 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4444 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4445 			&cap_idx) == NULL)
4446 		return -ENOTSUP;
4447 
4448 	/* Create SNOW 3G session */
4449 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4450 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4451 			RTE_CRYPTO_AUTH_OP_GENERATE,
4452 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4453 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4454 			tdata->key.data, tdata->key.len,
4455 			tdata->auth_iv.len, tdata->digest.len,
4456 			tdata->cipher_iv.len);
4457 	if (retval < 0)
4458 		return retval;
4459 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4460 
4461 	/* clear mbuf payload */
4462 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4463 			rte_pktmbuf_tailroom(ut_params->ibuf));
4464 
4465 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4466 	/* Append data which is padded to a multiple of */
4467 	/* the algorithms block size */
4468 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4469 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4470 				plaintext_pad_len);
4471 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4472 
4473 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4474 
4475 	/* Create SNOW 3G operation */
4476 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4477 			tdata->digest.len, tdata->auth_iv.data,
4478 			tdata->auth_iv.len,
4479 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4480 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4481 			tdata->validCipherLenInBits.len,
4482 			0,
4483 			tdata->validAuthLenInBits.len,
4484 			0
4485 			);
4486 	if (retval < 0)
4487 		return retval;
4488 
4489 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4490 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4491 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4492 	else
4493 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4494 			ut_params->op);
4495 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4496 	ut_params->obuf = ut_params->op->sym->m_src;
4497 	if (ut_params->obuf)
4498 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4499 	else
4500 		ciphertext = plaintext;
4501 
4502 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4503 	/* Validate obuf */
4504 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4505 			ciphertext,
4506 			tdata->ciphertext.data,
4507 			tdata->validDataLenInBits.len,
4508 			"SNOW 3G Ciphertext data not as expected");
4509 
4510 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4511 	    + plaintext_pad_len;
4512 
4513 	/* Validate obuf */
4514 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4515 			ut_params->digest,
4516 			tdata->digest.data,
4517 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4518 			"SNOW 3G Generated auth tag not as expected");
4519 	return 0;
4520 }
4521 
4522 static int
4523 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
4524 	uint8_t op_mode, uint8_t verify)
4525 {
4526 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4527 	struct crypto_unittest_params *ut_params = &unittest_params;
4528 
4529 	int retval;
4530 
4531 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4532 	unsigned int plaintext_pad_len;
4533 	unsigned int plaintext_len;
4534 	unsigned int ciphertext_pad_len;
4535 	unsigned int ciphertext_len;
4536 
4537 	struct rte_cryptodev_info dev_info;
4538 
4539 	/* Verify the capabilities */
4540 	struct rte_cryptodev_sym_capability_idx cap_idx;
4541 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4542 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4543 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4544 			&cap_idx) == NULL)
4545 		return -ENOTSUP;
4546 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4547 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4548 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4549 			&cap_idx) == NULL)
4550 		return -ENOTSUP;
4551 
4552 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4553 		return -ENOTSUP;
4554 
4555 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4556 
4557 	uint64_t feat_flags = dev_info.feature_flags;
4558 
4559 	if (op_mode == OUT_OF_PLACE) {
4560 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4561 			printf("Device doesn't support digest encrypted.\n");
4562 			return -ENOTSUP;
4563 		}
4564 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4565 			return -ENOTSUP;
4566 	}
4567 
4568 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4569 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4570 		printf("Device doesn't support RAW data-path APIs.\n");
4571 		return -ENOTSUP;
4572 	}
4573 
4574 	/* Create SNOW 3G session */
4575 	retval = create_wireless_algo_auth_cipher_session(
4576 			ts_params->valid_devs[0],
4577 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4578 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4579 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4580 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4581 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4582 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4583 			tdata->key.data, tdata->key.len,
4584 			tdata->auth_iv.len, tdata->digest.len,
4585 			tdata->cipher_iv.len);
4586 
4587 	if (retval < 0)
4588 		return retval;
4589 
4590 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4591 	if (op_mode == OUT_OF_PLACE)
4592 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4593 
4594 	/* clear mbuf payload */
4595 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4596 		rte_pktmbuf_tailroom(ut_params->ibuf));
4597 	if (op_mode == OUT_OF_PLACE)
4598 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4599 			rte_pktmbuf_tailroom(ut_params->obuf));
4600 
4601 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4602 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4603 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4604 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4605 
4606 	if (verify) {
4607 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4608 					ciphertext_pad_len);
4609 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4610 		if (op_mode == OUT_OF_PLACE)
4611 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4612 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4613 			ciphertext_len);
4614 	} else {
4615 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4616 					plaintext_pad_len);
4617 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4618 		if (op_mode == OUT_OF_PLACE)
4619 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4620 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4621 	}
4622 
4623 	/* Create SNOW 3G operation */
4624 	retval = create_wireless_algo_auth_cipher_operation(
4625 		tdata->digest.data, tdata->digest.len,
4626 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4627 		tdata->auth_iv.data, tdata->auth_iv.len,
4628 		(tdata->digest.offset_bytes == 0 ?
4629 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4630 			: tdata->digest.offset_bytes),
4631 		tdata->validCipherLenInBits.len,
4632 		tdata->cipher.offset_bits,
4633 		tdata->validAuthLenInBits.len,
4634 		tdata->auth.offset_bits,
4635 		op_mode, 0, verify);
4636 
4637 	if (retval < 0)
4638 		return retval;
4639 
4640 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4641 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4642 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4643 	else
4644 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4645 			ut_params->op);
4646 
4647 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4648 
4649 	ut_params->obuf = (op_mode == IN_PLACE ?
4650 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4651 
4652 	if (verify) {
4653 		if (ut_params->obuf)
4654 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
4655 							uint8_t *);
4656 		else
4657 			plaintext = ciphertext +
4658 				(tdata->cipher.offset_bits >> 3);
4659 
4660 		debug_hexdump(stdout, "plaintext:", plaintext,
4661 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4662 		debug_hexdump(stdout, "plaintext expected:",
4663 			tdata->plaintext.data,
4664 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4665 	} else {
4666 		if (ut_params->obuf)
4667 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
4668 							uint8_t *);
4669 		else
4670 			ciphertext = plaintext;
4671 
4672 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4673 			ciphertext_len);
4674 		debug_hexdump(stdout, "ciphertext expected:",
4675 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4676 
4677 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4678 			+ (tdata->digest.offset_bytes == 0 ?
4679 		plaintext_pad_len : tdata->digest.offset_bytes);
4680 
4681 		debug_hexdump(stdout, "digest:", ut_params->digest,
4682 			tdata->digest.len);
4683 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
4684 				tdata->digest.len);
4685 	}
4686 
4687 	/* Validate obuf */
4688 	if (verify) {
4689 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4690 			plaintext,
4691 			tdata->plaintext.data,
4692 			(tdata->plaintext.len - tdata->cipher.offset_bits -
4693 			 (tdata->digest.len << 3)),
4694 			tdata->cipher.offset_bits,
4695 			"SNOW 3G Plaintext data not as expected");
4696 	} else {
4697 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4698 			ciphertext,
4699 			tdata->ciphertext.data,
4700 			(tdata->validDataLenInBits.len -
4701 			 tdata->cipher.offset_bits),
4702 			tdata->cipher.offset_bits,
4703 			"SNOW 3G Ciphertext data not as expected");
4704 
4705 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4706 			ut_params->digest,
4707 			tdata->digest.data,
4708 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4709 			"SNOW 3G Generated auth tag not as expected");
4710 	}
4711 	return 0;
4712 }
4713 
4714 static int
4715 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
4716 	uint8_t op_mode, uint8_t verify)
4717 {
4718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4719 	struct crypto_unittest_params *ut_params = &unittest_params;
4720 
4721 	int retval;
4722 
4723 	const uint8_t *plaintext = NULL;
4724 	const uint8_t *ciphertext = NULL;
4725 	const uint8_t *digest = NULL;
4726 	unsigned int plaintext_pad_len;
4727 	unsigned int plaintext_len;
4728 	unsigned int ciphertext_pad_len;
4729 	unsigned int ciphertext_len;
4730 	uint8_t buffer[10000];
4731 	uint8_t digest_buffer[10000];
4732 
4733 	struct rte_cryptodev_info dev_info;
4734 
4735 	/* Verify the capabilities */
4736 	struct rte_cryptodev_sym_capability_idx cap_idx;
4737 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4738 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4739 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4740 			&cap_idx) == NULL)
4741 		return -ENOTSUP;
4742 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4743 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4744 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4745 			&cap_idx) == NULL)
4746 		return -ENOTSUP;
4747 
4748 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4749 		return -ENOTSUP;
4750 
4751 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4752 
4753 	uint64_t feat_flags = dev_info.feature_flags;
4754 
4755 	if (op_mode == IN_PLACE) {
4756 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
4757 			printf("Device doesn't support in-place scatter-gather "
4758 					"in both input and output mbufs.\n");
4759 			return -ENOTSUP;
4760 		}
4761 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4762 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4763 			printf("Device doesn't support RAW data-path APIs.\n");
4764 			return -ENOTSUP;
4765 		}
4766 	} else {
4767 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4768 			return -ENOTSUP;
4769 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4770 			printf("Device doesn't support out-of-place scatter-gather "
4771 					"in both input and output mbufs.\n");
4772 			return -ENOTSUP;
4773 		}
4774 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4775 			printf("Device doesn't support digest encrypted.\n");
4776 			return -ENOTSUP;
4777 		}
4778 	}
4779 
4780 	/* Create SNOW 3G session */
4781 	retval = create_wireless_algo_auth_cipher_session(
4782 			ts_params->valid_devs[0],
4783 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4784 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4785 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4786 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4787 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4788 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4789 			tdata->key.data, tdata->key.len,
4790 			tdata->auth_iv.len, tdata->digest.len,
4791 			tdata->cipher_iv.len);
4792 
4793 	if (retval < 0)
4794 		return retval;
4795 
4796 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4797 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4798 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4799 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4800 
4801 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4802 			plaintext_pad_len, 15, 0);
4803 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4804 			"Failed to allocate input buffer in mempool");
4805 
4806 	if (op_mode == OUT_OF_PLACE) {
4807 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4808 				plaintext_pad_len, 15, 0);
4809 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
4810 				"Failed to allocate output buffer in mempool");
4811 	}
4812 
4813 	if (verify) {
4814 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
4815 			tdata->ciphertext.data);
4816 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4817 					ciphertext_len, buffer);
4818 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4819 			ciphertext_len);
4820 	} else {
4821 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
4822 			tdata->plaintext.data);
4823 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4824 					plaintext_len, buffer);
4825 		debug_hexdump(stdout, "plaintext:", plaintext,
4826 			plaintext_len);
4827 	}
4828 	memset(buffer, 0, sizeof(buffer));
4829 
4830 	/* Create SNOW 3G operation */
4831 	retval = create_wireless_algo_auth_cipher_operation(
4832 		tdata->digest.data, tdata->digest.len,
4833 		tdata->cipher_iv.data, tdata->cipher_iv.len,
4834 		tdata->auth_iv.data, tdata->auth_iv.len,
4835 		(tdata->digest.offset_bytes == 0 ?
4836 		(verify ? ciphertext_pad_len : plaintext_pad_len)
4837 			: tdata->digest.offset_bytes),
4838 		tdata->validCipherLenInBits.len,
4839 		tdata->cipher.offset_bits,
4840 		tdata->validAuthLenInBits.len,
4841 		tdata->auth.offset_bits,
4842 		op_mode, 1, verify);
4843 
4844 	if (retval < 0)
4845 		return retval;
4846 
4847 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4848 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4849 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4850 	else
4851 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4852 			ut_params->op);
4853 
4854 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4855 
4856 	ut_params->obuf = (op_mode == IN_PLACE ?
4857 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
4858 
4859 	if (verify) {
4860 		if (ut_params->obuf)
4861 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
4862 					plaintext_len, buffer);
4863 		else
4864 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
4865 					plaintext_len, buffer);
4866 
4867 		debug_hexdump(stdout, "plaintext:", plaintext,
4868 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4869 		debug_hexdump(stdout, "plaintext expected:",
4870 			tdata->plaintext.data,
4871 			(tdata->plaintext.len >> 3) - tdata->digest.len);
4872 	} else {
4873 		if (ut_params->obuf)
4874 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4875 					ciphertext_len, buffer);
4876 		else
4877 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4878 					ciphertext_len, buffer);
4879 
4880 		debug_hexdump(stdout, "ciphertext:", ciphertext,
4881 			ciphertext_len);
4882 		debug_hexdump(stdout, "ciphertext expected:",
4883 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
4884 
4885 		if (ut_params->obuf)
4886 			digest = rte_pktmbuf_read(ut_params->obuf,
4887 				(tdata->digest.offset_bytes == 0 ?
4888 				plaintext_pad_len : tdata->digest.offset_bytes),
4889 				tdata->digest.len, digest_buffer);
4890 		else
4891 			digest = rte_pktmbuf_read(ut_params->ibuf,
4892 				(tdata->digest.offset_bytes == 0 ?
4893 				plaintext_pad_len : tdata->digest.offset_bytes),
4894 				tdata->digest.len, digest_buffer);
4895 
4896 		debug_hexdump(stdout, "digest:", digest,
4897 			tdata->digest.len);
4898 		debug_hexdump(stdout, "digest expected:",
4899 			tdata->digest.data, tdata->digest.len);
4900 	}
4901 
4902 	/* Validate obuf */
4903 	if (verify) {
4904 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4905 			plaintext,
4906 			tdata->plaintext.data,
4907 			(tdata->plaintext.len - tdata->cipher.offset_bits -
4908 			 (tdata->digest.len << 3)),
4909 			tdata->cipher.offset_bits,
4910 			"SNOW 3G Plaintext data not as expected");
4911 	} else {
4912 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4913 			ciphertext,
4914 			tdata->ciphertext.data,
4915 			(tdata->validDataLenInBits.len -
4916 			 tdata->cipher.offset_bits),
4917 			tdata->cipher.offset_bits,
4918 			"SNOW 3G Ciphertext data not as expected");
4919 
4920 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
4921 			digest,
4922 			tdata->digest.data,
4923 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4924 			"SNOW 3G Generated auth tag not as expected");
4925 	}
4926 	return 0;
4927 }
4928 
4929 static int
4930 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
4931 	uint8_t op_mode, uint8_t verify)
4932 {
4933 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4934 	struct crypto_unittest_params *ut_params = &unittest_params;
4935 
4936 	int retval;
4937 
4938 	uint8_t *plaintext = NULL, *ciphertext = NULL;
4939 	unsigned int plaintext_pad_len;
4940 	unsigned int plaintext_len;
4941 	unsigned int ciphertext_pad_len;
4942 	unsigned int ciphertext_len;
4943 
4944 	struct rte_cryptodev_info dev_info;
4945 
4946 	/* Verify the capabilities */
4947 	struct rte_cryptodev_sym_capability_idx cap_idx;
4948 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4949 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
4950 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4951 			&cap_idx) == NULL)
4952 		return -ENOTSUP;
4953 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4954 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4955 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4956 			&cap_idx) == NULL)
4957 		return -ENOTSUP;
4958 
4959 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4960 
4961 	uint64_t feat_flags = dev_info.feature_flags;
4962 
4963 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4964 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4965 		printf("Device doesn't support RAW data-path APIs.\n");
4966 		return -ENOTSUP;
4967 	}
4968 
4969 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4970 		return -ENOTSUP;
4971 
4972 	if (op_mode == OUT_OF_PLACE) {
4973 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4974 			return -ENOTSUP;
4975 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
4976 			printf("Device doesn't support digest encrypted.\n");
4977 			return -ENOTSUP;
4978 		}
4979 	}
4980 
4981 	/* Create KASUMI session */
4982 	retval = create_wireless_algo_auth_cipher_session(
4983 			ts_params->valid_devs[0],
4984 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
4985 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
4986 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
4987 					: RTE_CRYPTO_AUTH_OP_GENERATE),
4988 			RTE_CRYPTO_AUTH_KASUMI_F9,
4989 			RTE_CRYPTO_CIPHER_KASUMI_F8,
4990 			tdata->key.data, tdata->key.len,
4991 			0, tdata->digest.len,
4992 			tdata->cipher_iv.len);
4993 
4994 	if (retval < 0)
4995 		return retval;
4996 
4997 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4998 	if (op_mode == OUT_OF_PLACE)
4999 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5000 
5001 	/* clear mbuf payload */
5002 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5003 		rte_pktmbuf_tailroom(ut_params->ibuf));
5004 	if (op_mode == OUT_OF_PLACE)
5005 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5006 			rte_pktmbuf_tailroom(ut_params->obuf));
5007 
5008 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5009 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5010 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5011 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5012 
5013 	if (verify) {
5014 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5015 					ciphertext_pad_len);
5016 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5017 		if (op_mode == OUT_OF_PLACE)
5018 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5019 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5020 			ciphertext_len);
5021 	} else {
5022 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5023 					plaintext_pad_len);
5024 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5025 		if (op_mode == OUT_OF_PLACE)
5026 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5027 		debug_hexdump(stdout, "plaintext:", plaintext,
5028 			plaintext_len);
5029 	}
5030 
5031 	/* Create KASUMI operation */
5032 	retval = create_wireless_algo_auth_cipher_operation(
5033 		tdata->digest.data, tdata->digest.len,
5034 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5035 		NULL, 0,
5036 		(tdata->digest.offset_bytes == 0 ?
5037 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5038 			: tdata->digest.offset_bytes),
5039 		tdata->validCipherLenInBits.len,
5040 		tdata->validCipherOffsetInBits.len,
5041 		tdata->validAuthLenInBits.len,
5042 		0,
5043 		op_mode, 0, verify);
5044 
5045 	if (retval < 0)
5046 		return retval;
5047 
5048 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5049 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5050 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5051 	else
5052 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5053 			ut_params->op);
5054 
5055 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5056 
5057 	ut_params->obuf = (op_mode == IN_PLACE ?
5058 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5059 
5060 
5061 	if (verify) {
5062 		if (ut_params->obuf)
5063 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5064 							uint8_t *);
5065 		else
5066 			plaintext = ciphertext;
5067 
5068 		debug_hexdump(stdout, "plaintext:", plaintext,
5069 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5070 		debug_hexdump(stdout, "plaintext expected:",
5071 			tdata->plaintext.data,
5072 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5073 	} else {
5074 		if (ut_params->obuf)
5075 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5076 							uint8_t *);
5077 		else
5078 			ciphertext = plaintext;
5079 
5080 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5081 			ciphertext_len);
5082 		debug_hexdump(stdout, "ciphertext expected:",
5083 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5084 
5085 		ut_params->digest = rte_pktmbuf_mtod(
5086 			ut_params->obuf, uint8_t *) +
5087 			(tdata->digest.offset_bytes == 0 ?
5088 			plaintext_pad_len : tdata->digest.offset_bytes);
5089 
5090 		debug_hexdump(stdout, "digest:", ut_params->digest,
5091 			tdata->digest.len);
5092 		debug_hexdump(stdout, "digest expected:",
5093 			tdata->digest.data, tdata->digest.len);
5094 	}
5095 
5096 	/* Validate obuf */
5097 	if (verify) {
5098 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5099 			plaintext,
5100 			tdata->plaintext.data,
5101 			tdata->plaintext.len >> 3,
5102 			"KASUMI Plaintext data not as expected");
5103 	} else {
5104 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5105 			ciphertext,
5106 			tdata->ciphertext.data,
5107 			tdata->ciphertext.len >> 3,
5108 			"KASUMI Ciphertext data not as expected");
5109 
5110 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5111 			ut_params->digest,
5112 			tdata->digest.data,
5113 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5114 			"KASUMI Generated auth tag not as expected");
5115 	}
5116 	return 0;
5117 }
5118 
5119 static int
5120 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5121 	uint8_t op_mode, uint8_t verify)
5122 {
5123 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5124 	struct crypto_unittest_params *ut_params = &unittest_params;
5125 
5126 	int retval;
5127 
5128 	const uint8_t *plaintext = NULL;
5129 	const uint8_t *ciphertext = NULL;
5130 	const uint8_t *digest = NULL;
5131 	unsigned int plaintext_pad_len;
5132 	unsigned int plaintext_len;
5133 	unsigned int ciphertext_pad_len;
5134 	unsigned int ciphertext_len;
5135 	uint8_t buffer[10000];
5136 	uint8_t digest_buffer[10000];
5137 
5138 	struct rte_cryptodev_info dev_info;
5139 
5140 	/* Verify the capabilities */
5141 	struct rte_cryptodev_sym_capability_idx cap_idx;
5142 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5143 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5144 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5145 			&cap_idx) == NULL)
5146 		return -ENOTSUP;
5147 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5148 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5149 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5150 			&cap_idx) == NULL)
5151 		return -ENOTSUP;
5152 
5153 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5154 		return -ENOTSUP;
5155 
5156 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5157 
5158 	uint64_t feat_flags = dev_info.feature_flags;
5159 
5160 	if (op_mode == IN_PLACE) {
5161 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5162 			printf("Device doesn't support in-place scatter-gather "
5163 					"in both input and output mbufs.\n");
5164 			return -ENOTSUP;
5165 		}
5166 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5167 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5168 			printf("Device doesn't support RAW data-path APIs.\n");
5169 			return -ENOTSUP;
5170 		}
5171 	} else {
5172 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5173 			return -ENOTSUP;
5174 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5175 			printf("Device doesn't support out-of-place scatter-gather "
5176 					"in both input and output mbufs.\n");
5177 			return -ENOTSUP;
5178 		}
5179 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5180 			printf("Device doesn't support digest encrypted.\n");
5181 			return -ENOTSUP;
5182 		}
5183 	}
5184 
5185 	/* Create KASUMI session */
5186 	retval = create_wireless_algo_auth_cipher_session(
5187 			ts_params->valid_devs[0],
5188 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5189 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5190 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5191 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5192 			RTE_CRYPTO_AUTH_KASUMI_F9,
5193 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5194 			tdata->key.data, tdata->key.len,
5195 			0, tdata->digest.len,
5196 			tdata->cipher_iv.len);
5197 
5198 	if (retval < 0)
5199 		return retval;
5200 
5201 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5202 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5203 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5204 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5205 
5206 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5207 			plaintext_pad_len, 15, 0);
5208 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5209 			"Failed to allocate input buffer in mempool");
5210 
5211 	if (op_mode == OUT_OF_PLACE) {
5212 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5213 				plaintext_pad_len, 15, 0);
5214 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5215 				"Failed to allocate output buffer in mempool");
5216 	}
5217 
5218 	if (verify) {
5219 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5220 			tdata->ciphertext.data);
5221 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5222 					ciphertext_len, buffer);
5223 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5224 			ciphertext_len);
5225 	} else {
5226 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5227 			tdata->plaintext.data);
5228 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5229 					plaintext_len, buffer);
5230 		debug_hexdump(stdout, "plaintext:", plaintext,
5231 			plaintext_len);
5232 	}
5233 	memset(buffer, 0, sizeof(buffer));
5234 
5235 	/* Create KASUMI operation */
5236 	retval = create_wireless_algo_auth_cipher_operation(
5237 		tdata->digest.data, tdata->digest.len,
5238 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5239 		NULL, 0,
5240 		(tdata->digest.offset_bytes == 0 ?
5241 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5242 			: tdata->digest.offset_bytes),
5243 		tdata->validCipherLenInBits.len,
5244 		tdata->validCipherOffsetInBits.len,
5245 		tdata->validAuthLenInBits.len,
5246 		0,
5247 		op_mode, 1, verify);
5248 
5249 	if (retval < 0)
5250 		return retval;
5251 
5252 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5253 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5254 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5255 	else
5256 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5257 			ut_params->op);
5258 
5259 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5260 
5261 	ut_params->obuf = (op_mode == IN_PLACE ?
5262 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5263 
5264 	if (verify) {
5265 		if (ut_params->obuf)
5266 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5267 					plaintext_len, buffer);
5268 		else
5269 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5270 					plaintext_len, buffer);
5271 
5272 		debug_hexdump(stdout, "plaintext:", plaintext,
5273 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5274 		debug_hexdump(stdout, "plaintext expected:",
5275 			tdata->plaintext.data,
5276 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5277 	} else {
5278 		if (ut_params->obuf)
5279 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5280 					ciphertext_len, buffer);
5281 		else
5282 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5283 					ciphertext_len, buffer);
5284 
5285 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5286 			ciphertext_len);
5287 		debug_hexdump(stdout, "ciphertext expected:",
5288 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5289 
5290 		if (ut_params->obuf)
5291 			digest = rte_pktmbuf_read(ut_params->obuf,
5292 				(tdata->digest.offset_bytes == 0 ?
5293 				plaintext_pad_len : tdata->digest.offset_bytes),
5294 				tdata->digest.len, digest_buffer);
5295 		else
5296 			digest = rte_pktmbuf_read(ut_params->ibuf,
5297 				(tdata->digest.offset_bytes == 0 ?
5298 				plaintext_pad_len : tdata->digest.offset_bytes),
5299 				tdata->digest.len, digest_buffer);
5300 
5301 		debug_hexdump(stdout, "digest:", digest,
5302 			tdata->digest.len);
5303 		debug_hexdump(stdout, "digest expected:",
5304 			tdata->digest.data, tdata->digest.len);
5305 	}
5306 
5307 	/* Validate obuf */
5308 	if (verify) {
5309 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5310 			plaintext,
5311 			tdata->plaintext.data,
5312 			tdata->plaintext.len >> 3,
5313 			"KASUMI Plaintext data not as expected");
5314 	} else {
5315 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5316 			ciphertext,
5317 			tdata->ciphertext.data,
5318 			tdata->validDataLenInBits.len,
5319 			"KASUMI Ciphertext data not as expected");
5320 
5321 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5322 			digest,
5323 			tdata->digest.data,
5324 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5325 			"KASUMI Generated auth tag not as expected");
5326 	}
5327 	return 0;
5328 }
5329 
5330 static int
5331 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5332 {
5333 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5334 	struct crypto_unittest_params *ut_params = &unittest_params;
5335 
5336 	int retval;
5337 
5338 	uint8_t *plaintext, *ciphertext;
5339 	unsigned plaintext_pad_len;
5340 	unsigned plaintext_len;
5341 	struct rte_cryptodev_info dev_info;
5342 
5343 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5344 	uint64_t feat_flags = dev_info.feature_flags;
5345 
5346 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5347 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5348 		printf("Device doesn't support RAW data-path APIs.\n");
5349 		return -ENOTSUP;
5350 	}
5351 
5352 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5353 		return -ENOTSUP;
5354 
5355 	/* Verify the capabilities */
5356 	struct rte_cryptodev_sym_capability_idx cap_idx;
5357 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5358 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5359 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5360 			&cap_idx) == NULL)
5361 		return -ENOTSUP;
5362 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5363 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5364 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5365 			&cap_idx) == NULL)
5366 		return -ENOTSUP;
5367 
5368 	/* Create KASUMI session */
5369 	retval = create_wireless_algo_cipher_auth_session(
5370 			ts_params->valid_devs[0],
5371 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5372 			RTE_CRYPTO_AUTH_OP_GENERATE,
5373 			RTE_CRYPTO_AUTH_KASUMI_F9,
5374 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5375 			tdata->key.data, tdata->key.len,
5376 			0, tdata->digest.len,
5377 			tdata->cipher_iv.len);
5378 	if (retval < 0)
5379 		return retval;
5380 
5381 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5382 
5383 	/* clear mbuf payload */
5384 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5385 			rte_pktmbuf_tailroom(ut_params->ibuf));
5386 
5387 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5388 	/* Append data which is padded to a multiple of */
5389 	/* the algorithms block size */
5390 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5391 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5392 				plaintext_pad_len);
5393 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5394 
5395 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5396 
5397 	/* Create KASUMI operation */
5398 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5399 				tdata->digest.len, NULL, 0,
5400 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5401 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5402 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5403 				tdata->validCipherOffsetInBits.len,
5404 				tdata->validAuthLenInBits.len,
5405 				0
5406 				);
5407 	if (retval < 0)
5408 		return retval;
5409 
5410 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5411 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5412 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5413 	else
5414 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5415 			ut_params->op);
5416 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5417 
5418 	if (ut_params->op->sym->m_dst)
5419 		ut_params->obuf = ut_params->op->sym->m_dst;
5420 	else
5421 		ut_params->obuf = ut_params->op->sym->m_src;
5422 
5423 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5424 				tdata->validCipherOffsetInBits.len >> 3);
5425 
5426 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5427 			+ plaintext_pad_len;
5428 
5429 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5430 				(tdata->validCipherOffsetInBits.len >> 3);
5431 	/* Validate obuf */
5432 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5433 		ciphertext,
5434 		reference_ciphertext,
5435 		tdata->validCipherLenInBits.len,
5436 		"KASUMI Ciphertext data not as expected");
5437 
5438 	/* Validate obuf */
5439 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5440 		ut_params->digest,
5441 		tdata->digest.data,
5442 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5443 		"KASUMI Generated auth tag not as expected");
5444 	return 0;
5445 }
5446 
5447 static int
5448 test_zuc_encryption(const struct wireless_test_data *tdata)
5449 {
5450 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5451 	struct crypto_unittest_params *ut_params = &unittest_params;
5452 
5453 	int retval;
5454 	uint8_t *plaintext, *ciphertext;
5455 	unsigned plaintext_pad_len;
5456 	unsigned plaintext_len;
5457 	struct rte_cryptodev_info dev_info;
5458 
5459 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5460 	uint64_t feat_flags = dev_info.feature_flags;
5461 
5462 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5463 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5464 		printf("Device doesn't support RAW data-path APIs.\n");
5465 		return -ENOTSUP;
5466 	}
5467 
5468 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5469 		return -ENOTSUP;
5470 
5471 	struct rte_cryptodev_sym_capability_idx cap_idx;
5472 
5473 	/* Check if device supports ZUC EEA3 */
5474 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5475 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5476 
5477 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5478 			&cap_idx) == NULL)
5479 		return -ENOTSUP;
5480 
5481 	/* Create ZUC session */
5482 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5483 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5484 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
5485 					tdata->key.data, tdata->key.len,
5486 					tdata->cipher_iv.len);
5487 	if (retval < 0)
5488 		return retval;
5489 
5490 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5491 
5492 	/* Clear mbuf payload */
5493 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5494 	       rte_pktmbuf_tailroom(ut_params->ibuf));
5495 
5496 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5497 	/* Append data which is padded to a multiple */
5498 	/* of the algorithms block size */
5499 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5500 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5501 				plaintext_pad_len);
5502 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5503 
5504 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5505 
5506 	/* Create ZUC operation */
5507 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5508 					tdata->cipher_iv.len,
5509 					tdata->plaintext.len,
5510 					0);
5511 	if (retval < 0)
5512 		return retval;
5513 
5514 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5515 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5516 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5517 	else
5518 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5519 						ut_params->op);
5520 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5521 
5522 	ut_params->obuf = ut_params->op->sym->m_dst;
5523 	if (ut_params->obuf)
5524 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
5525 	else
5526 		ciphertext = plaintext;
5527 
5528 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5529 
5530 	/* Validate obuf */
5531 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5532 		ciphertext,
5533 		tdata->ciphertext.data,
5534 		tdata->validCipherLenInBits.len,
5535 		"ZUC Ciphertext data not as expected");
5536 	return 0;
5537 }
5538 
5539 static int
5540 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
5541 {
5542 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5543 	struct crypto_unittest_params *ut_params = &unittest_params;
5544 
5545 	int retval;
5546 
5547 	unsigned int plaintext_pad_len;
5548 	unsigned int plaintext_len;
5549 	const uint8_t *ciphertext;
5550 	uint8_t ciphertext_buffer[2048];
5551 	struct rte_cryptodev_info dev_info;
5552 
5553 	struct rte_cryptodev_sym_capability_idx cap_idx;
5554 
5555 	/* Check if device supports ZUC EEA3 */
5556 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5557 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
5558 
5559 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5560 			&cap_idx) == NULL)
5561 		return -ENOTSUP;
5562 
5563 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5564 		return -ENOTSUP;
5565 
5566 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5567 
5568 	uint64_t feat_flags = dev_info.feature_flags;
5569 
5570 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5571 		printf("Device doesn't support in-place scatter-gather. "
5572 				"Test Skipped.\n");
5573 		return -ENOTSUP;
5574 	}
5575 
5576 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5577 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5578 		printf("Device doesn't support RAW data-path APIs.\n");
5579 		return -ENOTSUP;
5580 	}
5581 
5582 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5583 
5584 	/* Append data which is padded to a multiple */
5585 	/* of the algorithms block size */
5586 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5587 
5588 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5589 			plaintext_pad_len, 10, 0);
5590 
5591 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5592 			tdata->plaintext.data);
5593 
5594 	/* Create ZUC session */
5595 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
5596 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5597 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5598 			tdata->key.data, tdata->key.len,
5599 			tdata->cipher_iv.len);
5600 	if (retval < 0)
5601 		return retval;
5602 
5603 	/* Clear mbuf payload */
5604 
5605 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
5606 
5607 	/* Create ZUC operation */
5608 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
5609 			tdata->cipher_iv.len, tdata->plaintext.len,
5610 			0);
5611 	if (retval < 0)
5612 		return retval;
5613 
5614 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5615 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5616 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
5617 	else
5618 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5619 						ut_params->op);
5620 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5621 
5622 	ut_params->obuf = ut_params->op->sym->m_dst;
5623 	if (ut_params->obuf)
5624 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
5625 			0, plaintext_len, ciphertext_buffer);
5626 	else
5627 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
5628 			0, plaintext_len, ciphertext_buffer);
5629 
5630 	/* Validate obuf */
5631 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
5632 
5633 	/* Validate obuf */
5634 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5635 		ciphertext,
5636 		tdata->ciphertext.data,
5637 		tdata->validCipherLenInBits.len,
5638 		"ZUC Ciphertext data not as expected");
5639 
5640 	return 0;
5641 }
5642 
5643 static int
5644 test_zuc_authentication(const struct wireless_test_data *tdata)
5645 {
5646 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5647 	struct crypto_unittest_params *ut_params = &unittest_params;
5648 
5649 	int retval;
5650 	unsigned plaintext_pad_len;
5651 	unsigned plaintext_len;
5652 	uint8_t *plaintext;
5653 
5654 	struct rte_cryptodev_sym_capability_idx cap_idx;
5655 	struct rte_cryptodev_info dev_info;
5656 
5657 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5658 	uint64_t feat_flags = dev_info.feature_flags;
5659 
5660 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
5661 			(tdata->validAuthLenInBits.len % 8 != 0)) {
5662 		printf("Device doesn't support NON-Byte Aligned Data.\n");
5663 		return -ENOTSUP;
5664 	}
5665 
5666 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5667 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5668 		printf("Device doesn't support RAW data-path APIs.\n");
5669 		return -ENOTSUP;
5670 	}
5671 
5672 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5673 		return -ENOTSUP;
5674 
5675 	/* Check if device supports ZUC EIA3 */
5676 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5677 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5678 
5679 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5680 			&cap_idx) == NULL)
5681 		return -ENOTSUP;
5682 
5683 	/* Create ZUC session */
5684 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
5685 			tdata->key.data, tdata->key.len,
5686 			tdata->auth_iv.len, tdata->digest.len,
5687 			RTE_CRYPTO_AUTH_OP_GENERATE,
5688 			RTE_CRYPTO_AUTH_ZUC_EIA3);
5689 	if (retval < 0)
5690 		return retval;
5691 
5692 	/* alloc mbuf and set payload */
5693 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5694 
5695 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5696 	rte_pktmbuf_tailroom(ut_params->ibuf));
5697 
5698 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5699 	/* Append data which is padded to a multiple of */
5700 	/* the algorithms block size */
5701 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
5702 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5703 				plaintext_pad_len);
5704 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5705 
5706 	/* Create ZUC operation */
5707 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
5708 			tdata->auth_iv.data, tdata->auth_iv.len,
5709 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5710 			tdata->validAuthLenInBits.len,
5711 			0);
5712 	if (retval < 0)
5713 		return retval;
5714 
5715 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5716 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5717 				ut_params->op, 0, 1, 1, 0);
5718 	else
5719 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5720 				ut_params->op);
5721 	ut_params->obuf = ut_params->op->sym->m_src;
5722 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5723 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5724 			+ plaintext_pad_len;
5725 
5726 	/* Validate obuf */
5727 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5728 	ut_params->digest,
5729 	tdata->digest.data,
5730 	tdata->digest.len,
5731 	"ZUC Generated auth tag not as expected");
5732 
5733 	return 0;
5734 }
5735 
5736 static int
5737 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
5738 	uint8_t op_mode, uint8_t verify)
5739 {
5740 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5741 	struct crypto_unittest_params *ut_params = &unittest_params;
5742 
5743 	int retval;
5744 
5745 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5746 	unsigned int plaintext_pad_len;
5747 	unsigned int plaintext_len;
5748 	unsigned int ciphertext_pad_len;
5749 	unsigned int ciphertext_len;
5750 
5751 	struct rte_cryptodev_info dev_info;
5752 	struct rte_cryptodev_sym_capability_idx cap_idx;
5753 
5754 	/* Check if device supports ZUC EIA3 */
5755 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5756 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5757 
5758 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5759 			&cap_idx) == NULL)
5760 		return -ENOTSUP;
5761 
5762 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5763 
5764 	uint64_t feat_flags = dev_info.feature_flags;
5765 
5766 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5767 		printf("Device doesn't support digest encrypted.\n");
5768 		return -ENOTSUP;
5769 	}
5770 	if (op_mode == IN_PLACE) {
5771 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5772 			printf("Device doesn't support in-place scatter-gather "
5773 					"in both input and output mbufs.\n");
5774 			return -ENOTSUP;
5775 		}
5776 
5777 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5778 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5779 			printf("Device doesn't support RAW data-path APIs.\n");
5780 			return -ENOTSUP;
5781 		}
5782 	} else {
5783 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5784 			return -ENOTSUP;
5785 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5786 			printf("Device doesn't support out-of-place scatter-gather "
5787 					"in both input and output mbufs.\n");
5788 			return -ENOTSUP;
5789 		}
5790 	}
5791 
5792 	/* Create ZUC session */
5793 	retval = create_wireless_algo_auth_cipher_session(
5794 			ts_params->valid_devs[0],
5795 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5796 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5797 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5798 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5799 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5800 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5801 			tdata->key.data, tdata->key.len,
5802 			tdata->auth_iv.len, tdata->digest.len,
5803 			tdata->cipher_iv.len);
5804 
5805 	if (retval < 0)
5806 		return retval;
5807 
5808 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5809 	if (op_mode == OUT_OF_PLACE)
5810 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5811 
5812 	/* clear mbuf payload */
5813 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5814 		rte_pktmbuf_tailroom(ut_params->ibuf));
5815 	if (op_mode == OUT_OF_PLACE)
5816 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5817 			rte_pktmbuf_tailroom(ut_params->obuf));
5818 
5819 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5820 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5821 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5822 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5823 
5824 	if (verify) {
5825 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5826 					ciphertext_pad_len);
5827 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5828 		if (op_mode == OUT_OF_PLACE)
5829 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5830 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5831 			ciphertext_len);
5832 	} else {
5833 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5834 					plaintext_pad_len);
5835 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5836 		if (op_mode == OUT_OF_PLACE)
5837 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5838 		debug_hexdump(stdout, "plaintext:", plaintext,
5839 			plaintext_len);
5840 	}
5841 
5842 	/* Create ZUC operation */
5843 	retval = create_wireless_algo_auth_cipher_operation(
5844 		tdata->digest.data, tdata->digest.len,
5845 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5846 		tdata->auth_iv.data, tdata->auth_iv.len,
5847 		(tdata->digest.offset_bytes == 0 ?
5848 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5849 			: tdata->digest.offset_bytes),
5850 		tdata->validCipherLenInBits.len,
5851 		tdata->validCipherOffsetInBits.len,
5852 		tdata->validAuthLenInBits.len,
5853 		0,
5854 		op_mode, 0, verify);
5855 
5856 	if (retval < 0)
5857 		return retval;
5858 
5859 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5860 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5861 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5862 	else
5863 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5864 			ut_params->op);
5865 
5866 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5867 
5868 	ut_params->obuf = (op_mode == IN_PLACE ?
5869 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5870 
5871 
5872 	if (verify) {
5873 		if (ut_params->obuf)
5874 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5875 							uint8_t *);
5876 		else
5877 			plaintext = ciphertext;
5878 
5879 		debug_hexdump(stdout, "plaintext:", plaintext,
5880 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5881 		debug_hexdump(stdout, "plaintext expected:",
5882 			tdata->plaintext.data,
5883 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5884 	} else {
5885 		if (ut_params->obuf)
5886 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5887 							uint8_t *);
5888 		else
5889 			ciphertext = plaintext;
5890 
5891 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5892 			ciphertext_len);
5893 		debug_hexdump(stdout, "ciphertext expected:",
5894 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5895 
5896 		ut_params->digest = rte_pktmbuf_mtod(
5897 			ut_params->obuf, uint8_t *) +
5898 			(tdata->digest.offset_bytes == 0 ?
5899 			plaintext_pad_len : tdata->digest.offset_bytes);
5900 
5901 		debug_hexdump(stdout, "digest:", ut_params->digest,
5902 			tdata->digest.len);
5903 		debug_hexdump(stdout, "digest expected:",
5904 			tdata->digest.data, tdata->digest.len);
5905 	}
5906 
5907 	/* Validate obuf */
5908 	if (verify) {
5909 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5910 			plaintext,
5911 			tdata->plaintext.data,
5912 			tdata->plaintext.len >> 3,
5913 			"ZUC Plaintext data not as expected");
5914 	} else {
5915 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5916 			ciphertext,
5917 			tdata->ciphertext.data,
5918 			tdata->ciphertext.len >> 3,
5919 			"ZUC Ciphertext data not as expected");
5920 
5921 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5922 			ut_params->digest,
5923 			tdata->digest.data,
5924 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5925 			"ZUC Generated auth tag not as expected");
5926 	}
5927 	return 0;
5928 }
5929 
5930 static int
5931 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
5932 	uint8_t op_mode, uint8_t verify)
5933 {
5934 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5935 	struct crypto_unittest_params *ut_params = &unittest_params;
5936 
5937 	int retval;
5938 
5939 	const uint8_t *plaintext = NULL;
5940 	const uint8_t *ciphertext = NULL;
5941 	const uint8_t *digest = NULL;
5942 	unsigned int plaintext_pad_len;
5943 	unsigned int plaintext_len;
5944 	unsigned int ciphertext_pad_len;
5945 	unsigned int ciphertext_len;
5946 	uint8_t buffer[10000];
5947 	uint8_t digest_buffer[10000];
5948 
5949 	struct rte_cryptodev_info dev_info;
5950 	struct rte_cryptodev_sym_capability_idx cap_idx;
5951 
5952 	/* Check if device supports ZUC EIA3 */
5953 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5954 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
5955 
5956 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5957 			&cap_idx) == NULL)
5958 		return -ENOTSUP;
5959 
5960 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5961 
5962 	uint64_t feat_flags = dev_info.feature_flags;
5963 
5964 	if (op_mode == IN_PLACE) {
5965 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5966 			printf("Device doesn't support in-place scatter-gather "
5967 					"in both input and output mbufs.\n");
5968 			return -ENOTSUP;
5969 		}
5970 
5971 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5972 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5973 			printf("Device doesn't support RAW data-path APIs.\n");
5974 			return -ENOTSUP;
5975 		}
5976 	} else {
5977 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5978 			return -ENOTSUP;
5979 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5980 			printf("Device doesn't support out-of-place scatter-gather "
5981 					"in both input and output mbufs.\n");
5982 			return -ENOTSUP;
5983 		}
5984 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5985 			printf("Device doesn't support digest encrypted.\n");
5986 			return -ENOTSUP;
5987 		}
5988 	}
5989 
5990 	/* Create ZUC session */
5991 	retval = create_wireless_algo_auth_cipher_session(
5992 			ts_params->valid_devs[0],
5993 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5994 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5995 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5996 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5997 			RTE_CRYPTO_AUTH_ZUC_EIA3,
5998 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
5999 			tdata->key.data, tdata->key.len,
6000 			tdata->auth_iv.len, tdata->digest.len,
6001 			tdata->cipher_iv.len);
6002 
6003 	if (retval < 0)
6004 		return retval;
6005 
6006 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6007 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6008 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6009 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6010 
6011 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6012 			plaintext_pad_len, 15, 0);
6013 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6014 			"Failed to allocate input buffer in mempool");
6015 
6016 	if (op_mode == OUT_OF_PLACE) {
6017 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6018 				plaintext_pad_len, 15, 0);
6019 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6020 				"Failed to allocate output buffer in mempool");
6021 	}
6022 
6023 	if (verify) {
6024 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6025 			tdata->ciphertext.data);
6026 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6027 					ciphertext_len, buffer);
6028 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6029 			ciphertext_len);
6030 	} else {
6031 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6032 			tdata->plaintext.data);
6033 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6034 					plaintext_len, buffer);
6035 		debug_hexdump(stdout, "plaintext:", plaintext,
6036 			plaintext_len);
6037 	}
6038 	memset(buffer, 0, sizeof(buffer));
6039 
6040 	/* Create ZUC operation */
6041 	retval = create_wireless_algo_auth_cipher_operation(
6042 		tdata->digest.data, tdata->digest.len,
6043 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6044 		NULL, 0,
6045 		(tdata->digest.offset_bytes == 0 ?
6046 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6047 			: tdata->digest.offset_bytes),
6048 		tdata->validCipherLenInBits.len,
6049 		tdata->validCipherOffsetInBits.len,
6050 		tdata->validAuthLenInBits.len,
6051 		0,
6052 		op_mode, 1, verify);
6053 
6054 	if (retval < 0)
6055 		return retval;
6056 
6057 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6058 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6059 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6060 	else
6061 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6062 			ut_params->op);
6063 
6064 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6065 
6066 	ut_params->obuf = (op_mode == IN_PLACE ?
6067 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6068 
6069 	if (verify) {
6070 		if (ut_params->obuf)
6071 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6072 					plaintext_len, buffer);
6073 		else
6074 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6075 					plaintext_len, buffer);
6076 
6077 		debug_hexdump(stdout, "plaintext:", plaintext,
6078 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6079 		debug_hexdump(stdout, "plaintext expected:",
6080 			tdata->plaintext.data,
6081 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6082 	} else {
6083 		if (ut_params->obuf)
6084 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6085 					ciphertext_len, buffer);
6086 		else
6087 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6088 					ciphertext_len, buffer);
6089 
6090 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6091 			ciphertext_len);
6092 		debug_hexdump(stdout, "ciphertext expected:",
6093 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6094 
6095 		if (ut_params->obuf)
6096 			digest = rte_pktmbuf_read(ut_params->obuf,
6097 				(tdata->digest.offset_bytes == 0 ?
6098 				plaintext_pad_len : tdata->digest.offset_bytes),
6099 				tdata->digest.len, digest_buffer);
6100 		else
6101 			digest = rte_pktmbuf_read(ut_params->ibuf,
6102 				(tdata->digest.offset_bytes == 0 ?
6103 				plaintext_pad_len : tdata->digest.offset_bytes),
6104 				tdata->digest.len, digest_buffer);
6105 
6106 		debug_hexdump(stdout, "digest:", digest,
6107 			tdata->digest.len);
6108 		debug_hexdump(stdout, "digest expected:",
6109 			tdata->digest.data, tdata->digest.len);
6110 	}
6111 
6112 	/* Validate obuf */
6113 	if (verify) {
6114 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6115 			plaintext,
6116 			tdata->plaintext.data,
6117 			tdata->plaintext.len >> 3,
6118 			"ZUC Plaintext data not as expected");
6119 	} else {
6120 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6121 			ciphertext,
6122 			tdata->ciphertext.data,
6123 			tdata->validDataLenInBits.len,
6124 			"ZUC Ciphertext data not as expected");
6125 
6126 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6127 			digest,
6128 			tdata->digest.data,
6129 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6130 			"ZUC Generated auth tag not as expected");
6131 	}
6132 	return 0;
6133 }
6134 
6135 static int
6136 test_kasumi_encryption_test_case_1(void)
6137 {
6138 	return test_kasumi_encryption(&kasumi_test_case_1);
6139 }
6140 
6141 static int
6142 test_kasumi_encryption_test_case_1_sgl(void)
6143 {
6144 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6145 }
6146 
6147 static int
6148 test_kasumi_encryption_test_case_1_oop(void)
6149 {
6150 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6151 }
6152 
6153 static int
6154 test_kasumi_encryption_test_case_1_oop_sgl(void)
6155 {
6156 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6157 }
6158 
6159 static int
6160 test_kasumi_encryption_test_case_2(void)
6161 {
6162 	return test_kasumi_encryption(&kasumi_test_case_2);
6163 }
6164 
6165 static int
6166 test_kasumi_encryption_test_case_3(void)
6167 {
6168 	return test_kasumi_encryption(&kasumi_test_case_3);
6169 }
6170 
6171 static int
6172 test_kasumi_encryption_test_case_4(void)
6173 {
6174 	return test_kasumi_encryption(&kasumi_test_case_4);
6175 }
6176 
6177 static int
6178 test_kasumi_encryption_test_case_5(void)
6179 {
6180 	return test_kasumi_encryption(&kasumi_test_case_5);
6181 }
6182 
6183 static int
6184 test_kasumi_decryption_test_case_1(void)
6185 {
6186 	return test_kasumi_decryption(&kasumi_test_case_1);
6187 }
6188 
6189 static int
6190 test_kasumi_decryption_test_case_1_oop(void)
6191 {
6192 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6193 }
6194 
6195 static int
6196 test_kasumi_decryption_test_case_2(void)
6197 {
6198 	return test_kasumi_decryption(&kasumi_test_case_2);
6199 }
6200 
6201 static int
6202 test_kasumi_decryption_test_case_3(void)
6203 {
6204 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6205 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6206 		return -ENOTSUP;
6207 	return test_kasumi_decryption(&kasumi_test_case_3);
6208 }
6209 
6210 static int
6211 test_kasumi_decryption_test_case_4(void)
6212 {
6213 	return test_kasumi_decryption(&kasumi_test_case_4);
6214 }
6215 
6216 static int
6217 test_kasumi_decryption_test_case_5(void)
6218 {
6219 	return test_kasumi_decryption(&kasumi_test_case_5);
6220 }
6221 static int
6222 test_snow3g_encryption_test_case_1(void)
6223 {
6224 	return test_snow3g_encryption(&snow3g_test_case_1);
6225 }
6226 
6227 static int
6228 test_snow3g_encryption_test_case_1_oop(void)
6229 {
6230 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6231 }
6232 
6233 static int
6234 test_snow3g_encryption_test_case_1_oop_sgl(void)
6235 {
6236 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6237 }
6238 
6239 
6240 static int
6241 test_snow3g_encryption_test_case_1_offset_oop(void)
6242 {
6243 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6244 }
6245 
6246 static int
6247 test_snow3g_encryption_test_case_2(void)
6248 {
6249 	return test_snow3g_encryption(&snow3g_test_case_2);
6250 }
6251 
6252 static int
6253 test_snow3g_encryption_test_case_3(void)
6254 {
6255 	return test_snow3g_encryption(&snow3g_test_case_3);
6256 }
6257 
6258 static int
6259 test_snow3g_encryption_test_case_4(void)
6260 {
6261 	return test_snow3g_encryption(&snow3g_test_case_4);
6262 }
6263 
6264 static int
6265 test_snow3g_encryption_test_case_5(void)
6266 {
6267 	return test_snow3g_encryption(&snow3g_test_case_5);
6268 }
6269 
6270 static int
6271 test_snow3g_decryption_test_case_1(void)
6272 {
6273 	return test_snow3g_decryption(&snow3g_test_case_1);
6274 }
6275 
6276 static int
6277 test_snow3g_decryption_test_case_1_oop(void)
6278 {
6279 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6280 }
6281 
6282 static int
6283 test_snow3g_decryption_test_case_2(void)
6284 {
6285 	return test_snow3g_decryption(&snow3g_test_case_2);
6286 }
6287 
6288 static int
6289 test_snow3g_decryption_test_case_3(void)
6290 {
6291 	return test_snow3g_decryption(&snow3g_test_case_3);
6292 }
6293 
6294 static int
6295 test_snow3g_decryption_test_case_4(void)
6296 {
6297 	return test_snow3g_decryption(&snow3g_test_case_4);
6298 }
6299 
6300 static int
6301 test_snow3g_decryption_test_case_5(void)
6302 {
6303 	return test_snow3g_decryption(&snow3g_test_case_5);
6304 }
6305 
6306 /*
6307  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6308  * Pattern digest from snow3g_test_data must be allocated as
6309  * 4 last bytes in plaintext.
6310  */
6311 static void
6312 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6313 		struct snow3g_hash_test_data *output)
6314 {
6315 	if ((pattern != NULL) && (output != NULL)) {
6316 		output->key.len = pattern->key.len;
6317 
6318 		memcpy(output->key.data,
6319 		pattern->key.data, pattern->key.len);
6320 
6321 		output->auth_iv.len = pattern->auth_iv.len;
6322 
6323 		memcpy(output->auth_iv.data,
6324 		pattern->auth_iv.data, pattern->auth_iv.len);
6325 
6326 		output->plaintext.len = pattern->plaintext.len;
6327 
6328 		memcpy(output->plaintext.data,
6329 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6330 
6331 		output->digest.len = pattern->digest.len;
6332 
6333 		memcpy(output->digest.data,
6334 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6335 		pattern->digest.len);
6336 
6337 		output->validAuthLenInBits.len =
6338 		pattern->validAuthLenInBits.len;
6339 	}
6340 }
6341 
6342 /*
6343  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6344  */
6345 static int
6346 test_snow3g_decryption_with_digest_test_case_1(void)
6347 {
6348 	struct snow3g_hash_test_data snow3g_hash_data;
6349 	struct rte_cryptodev_info dev_info;
6350 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6351 
6352 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6353 	uint64_t feat_flags = dev_info.feature_flags;
6354 
6355 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6356 		printf("Device doesn't support encrypted digest operations.\n");
6357 		return -ENOTSUP;
6358 	}
6359 
6360 	/*
6361 	 * Function prepare data for hash veryfication test case.
6362 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6363 	 */
6364 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6365 
6366 	return test_snow3g_decryption(&snow3g_test_case_7) &
6367 			test_snow3g_authentication_verify(&snow3g_hash_data);
6368 }
6369 
6370 static int
6371 test_snow3g_cipher_auth_test_case_1(void)
6372 {
6373 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6374 }
6375 
6376 static int
6377 test_snow3g_auth_cipher_test_case_1(void)
6378 {
6379 	return test_snow3g_auth_cipher(
6380 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6381 }
6382 
6383 static int
6384 test_snow3g_auth_cipher_test_case_2(void)
6385 {
6386 	return test_snow3g_auth_cipher(
6387 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6388 }
6389 
6390 static int
6391 test_snow3g_auth_cipher_test_case_2_oop(void)
6392 {
6393 	return test_snow3g_auth_cipher(
6394 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6395 }
6396 
6397 static int
6398 test_snow3g_auth_cipher_part_digest_enc(void)
6399 {
6400 	return test_snow3g_auth_cipher(
6401 		&snow3g_auth_cipher_partial_digest_encryption,
6402 			IN_PLACE, 0);
6403 }
6404 
6405 static int
6406 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6407 {
6408 	return test_snow3g_auth_cipher(
6409 		&snow3g_auth_cipher_partial_digest_encryption,
6410 			OUT_OF_PLACE, 0);
6411 }
6412 
6413 static int
6414 test_snow3g_auth_cipher_test_case_3_sgl(void)
6415 {
6416 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6417 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6418 		return -ENOTSUP;
6419 	return test_snow3g_auth_cipher_sgl(
6420 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6421 }
6422 
6423 static int
6424 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6425 {
6426 	return test_snow3g_auth_cipher_sgl(
6427 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6428 }
6429 
6430 static int
6431 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6432 {
6433 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6434 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6435 		return -ENOTSUP;
6436 	return test_snow3g_auth_cipher_sgl(
6437 		&snow3g_auth_cipher_partial_digest_encryption,
6438 			IN_PLACE, 0);
6439 }
6440 
6441 static int
6442 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6443 {
6444 	return test_snow3g_auth_cipher_sgl(
6445 		&snow3g_auth_cipher_partial_digest_encryption,
6446 			OUT_OF_PLACE, 0);
6447 }
6448 
6449 static int
6450 test_snow3g_auth_cipher_verify_test_case_1(void)
6451 {
6452 	return test_snow3g_auth_cipher(
6453 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6454 }
6455 
6456 static int
6457 test_snow3g_auth_cipher_verify_test_case_2(void)
6458 {
6459 	return test_snow3g_auth_cipher(
6460 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6461 }
6462 
6463 static int
6464 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6465 {
6466 	return test_snow3g_auth_cipher(
6467 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6468 }
6469 
6470 static int
6471 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6472 {
6473 	return test_snow3g_auth_cipher(
6474 		&snow3g_auth_cipher_partial_digest_encryption,
6475 			IN_PLACE, 1);
6476 }
6477 
6478 static int
6479 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
6480 {
6481 	return test_snow3g_auth_cipher(
6482 		&snow3g_auth_cipher_partial_digest_encryption,
6483 			OUT_OF_PLACE, 1);
6484 }
6485 
6486 static int
6487 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
6488 {
6489 	return test_snow3g_auth_cipher_sgl(
6490 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
6491 }
6492 
6493 static int
6494 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
6495 {
6496 	return test_snow3g_auth_cipher_sgl(
6497 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
6498 }
6499 
6500 static int
6501 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
6502 {
6503 	return test_snow3g_auth_cipher_sgl(
6504 		&snow3g_auth_cipher_partial_digest_encryption,
6505 			IN_PLACE, 1);
6506 }
6507 
6508 static int
6509 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
6510 {
6511 	return test_snow3g_auth_cipher_sgl(
6512 		&snow3g_auth_cipher_partial_digest_encryption,
6513 			OUT_OF_PLACE, 1);
6514 }
6515 
6516 static int
6517 test_snow3g_auth_cipher_with_digest_test_case_1(void)
6518 {
6519 	return test_snow3g_auth_cipher(
6520 		&snow3g_test_case_7, IN_PLACE, 0);
6521 }
6522 
6523 static int
6524 test_kasumi_auth_cipher_test_case_1(void)
6525 {
6526 	return test_kasumi_auth_cipher(
6527 		&kasumi_test_case_3, IN_PLACE, 0);
6528 }
6529 
6530 static int
6531 test_kasumi_auth_cipher_test_case_2(void)
6532 {
6533 	return test_kasumi_auth_cipher(
6534 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6535 }
6536 
6537 static int
6538 test_kasumi_auth_cipher_test_case_2_oop(void)
6539 {
6540 	return test_kasumi_auth_cipher(
6541 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6542 }
6543 
6544 static int
6545 test_kasumi_auth_cipher_test_case_2_sgl(void)
6546 {
6547 	return test_kasumi_auth_cipher_sgl(
6548 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
6549 }
6550 
6551 static int
6552 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
6553 {
6554 	return test_kasumi_auth_cipher_sgl(
6555 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6556 }
6557 
6558 static int
6559 test_kasumi_auth_cipher_verify_test_case_1(void)
6560 {
6561 	return test_kasumi_auth_cipher(
6562 		&kasumi_test_case_3, IN_PLACE, 1);
6563 }
6564 
6565 static int
6566 test_kasumi_auth_cipher_verify_test_case_2(void)
6567 {
6568 	return test_kasumi_auth_cipher(
6569 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6570 }
6571 
6572 static int
6573 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
6574 {
6575 	return test_kasumi_auth_cipher(
6576 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6577 }
6578 
6579 static int
6580 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
6581 {
6582 	return test_kasumi_auth_cipher_sgl(
6583 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
6584 }
6585 
6586 static int
6587 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
6588 {
6589 	return test_kasumi_auth_cipher_sgl(
6590 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6591 }
6592 
6593 static int
6594 test_kasumi_cipher_auth_test_case_1(void)
6595 {
6596 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
6597 }
6598 
6599 static int
6600 test_zuc_encryption_test_case_1(void)
6601 {
6602 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
6603 }
6604 
6605 static int
6606 test_zuc_encryption_test_case_2(void)
6607 {
6608 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
6609 }
6610 
6611 static int
6612 test_zuc_encryption_test_case_3(void)
6613 {
6614 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
6615 }
6616 
6617 static int
6618 test_zuc_encryption_test_case_4(void)
6619 {
6620 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
6621 }
6622 
6623 static int
6624 test_zuc_encryption_test_case_5(void)
6625 {
6626 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
6627 }
6628 
6629 static int
6630 test_zuc_encryption_test_case_6_sgl(void)
6631 {
6632 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
6633 }
6634 
6635 static int
6636 test_zuc_hash_generate_test_case_1(void)
6637 {
6638 	return test_zuc_authentication(&zuc_test_case_auth_1b);
6639 }
6640 
6641 static int
6642 test_zuc_hash_generate_test_case_2(void)
6643 {
6644 	return test_zuc_authentication(&zuc_test_case_auth_90b);
6645 }
6646 
6647 static int
6648 test_zuc_hash_generate_test_case_3(void)
6649 {
6650 	return test_zuc_authentication(&zuc_test_case_auth_577b);
6651 }
6652 
6653 static int
6654 test_zuc_hash_generate_test_case_4(void)
6655 {
6656 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
6657 }
6658 
6659 static int
6660 test_zuc_hash_generate_test_case_5(void)
6661 {
6662 	return test_zuc_authentication(&zuc_test_auth_5670b);
6663 }
6664 
6665 static int
6666 test_zuc_hash_generate_test_case_6(void)
6667 {
6668 	return test_zuc_authentication(&zuc_test_case_auth_128b);
6669 }
6670 
6671 static int
6672 test_zuc_hash_generate_test_case_7(void)
6673 {
6674 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
6675 }
6676 
6677 static int
6678 test_zuc_hash_generate_test_case_8(void)
6679 {
6680 	return test_zuc_authentication(&zuc_test_case_auth_584b);
6681 }
6682 
6683 static int
6684 test_zuc_cipher_auth_test_case_1(void)
6685 {
6686 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
6687 }
6688 
6689 static int
6690 test_zuc_cipher_auth_test_case_2(void)
6691 {
6692 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
6693 }
6694 
6695 static int
6696 test_zuc_auth_cipher_test_case_1(void)
6697 {
6698 	return test_zuc_auth_cipher(
6699 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6700 }
6701 
6702 static int
6703 test_zuc_auth_cipher_test_case_1_oop(void)
6704 {
6705 	return test_zuc_auth_cipher(
6706 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6707 }
6708 
6709 static int
6710 test_zuc_auth_cipher_test_case_1_sgl(void)
6711 {
6712 	return test_zuc_auth_cipher_sgl(
6713 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
6714 }
6715 
6716 static int
6717 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
6718 {
6719 	return test_zuc_auth_cipher_sgl(
6720 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
6721 }
6722 
6723 static int
6724 test_zuc_auth_cipher_verify_test_case_1(void)
6725 {
6726 	return test_zuc_auth_cipher(
6727 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6728 }
6729 
6730 static int
6731 test_zuc_auth_cipher_verify_test_case_1_oop(void)
6732 {
6733 	return test_zuc_auth_cipher(
6734 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6735 }
6736 
6737 static int
6738 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
6739 {
6740 	return test_zuc_auth_cipher_sgl(
6741 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
6742 }
6743 
6744 static int
6745 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
6746 {
6747 	return test_zuc_auth_cipher_sgl(
6748 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
6749 }
6750 
6751 static int
6752 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
6753 {
6754 	uint8_t dev_id = testsuite_params.valid_devs[0];
6755 
6756 	struct rte_cryptodev_sym_capability_idx cap_idx;
6757 
6758 	/* Check if device supports particular cipher algorithm */
6759 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
6760 	cap_idx.algo.cipher = tdata->cipher_algo;
6761 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6762 		return -ENOTSUP;
6763 
6764 	/* Check if device supports particular hash algorithm */
6765 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
6766 	cap_idx.algo.auth = tdata->auth_algo;
6767 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
6768 		return -ENOTSUP;
6769 
6770 	return 0;
6771 }
6772 
6773 static int
6774 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
6775 	uint8_t op_mode, uint8_t verify)
6776 {
6777 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6778 	struct crypto_unittest_params *ut_params = &unittest_params;
6779 
6780 	int retval;
6781 
6782 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6783 	unsigned int plaintext_pad_len;
6784 	unsigned int plaintext_len;
6785 	unsigned int ciphertext_pad_len;
6786 	unsigned int ciphertext_len;
6787 
6788 	struct rte_cryptodev_info dev_info;
6789 	struct rte_crypto_op *op;
6790 
6791 	/* Check if device supports particular algorithms separately */
6792 	if (test_mixed_check_if_unsupported(tdata))
6793 		return -ENOTSUP;
6794 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6795 		return -ENOTSUP;
6796 
6797 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6798 
6799 	uint64_t feat_flags = dev_info.feature_flags;
6800 
6801 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6802 		printf("Device doesn't support digest encrypted.\n");
6803 		return -ENOTSUP;
6804 	}
6805 
6806 	/* Create the session */
6807 	if (verify)
6808 		retval = create_wireless_algo_cipher_auth_session(
6809 				ts_params->valid_devs[0],
6810 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
6811 				RTE_CRYPTO_AUTH_OP_VERIFY,
6812 				tdata->auth_algo,
6813 				tdata->cipher_algo,
6814 				tdata->auth_key.data, tdata->auth_key.len,
6815 				tdata->auth_iv.len, tdata->digest_enc.len,
6816 				tdata->cipher_iv.len);
6817 	else
6818 		retval = create_wireless_algo_auth_cipher_session(
6819 				ts_params->valid_devs[0],
6820 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6821 				RTE_CRYPTO_AUTH_OP_GENERATE,
6822 				tdata->auth_algo,
6823 				tdata->cipher_algo,
6824 				tdata->auth_key.data, tdata->auth_key.len,
6825 				tdata->auth_iv.len, tdata->digest_enc.len,
6826 				tdata->cipher_iv.len);
6827 	if (retval < 0)
6828 		return retval;
6829 
6830 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6831 	if (op_mode == OUT_OF_PLACE)
6832 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6833 
6834 	/* clear mbuf payload */
6835 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6836 		rte_pktmbuf_tailroom(ut_params->ibuf));
6837 	if (op_mode == OUT_OF_PLACE) {
6838 
6839 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6840 				rte_pktmbuf_tailroom(ut_params->obuf));
6841 	}
6842 
6843 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
6844 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
6845 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6846 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6847 
6848 	if (verify) {
6849 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6850 				ciphertext_pad_len);
6851 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6852 		if (op_mode == OUT_OF_PLACE)
6853 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6854 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6855 				ciphertext_len);
6856 	} else {
6857 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6858 				plaintext_pad_len);
6859 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6860 		if (op_mode == OUT_OF_PLACE)
6861 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
6862 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6863 	}
6864 
6865 	/* Create the operation */
6866 	retval = create_wireless_algo_auth_cipher_operation(
6867 			tdata->digest_enc.data, tdata->digest_enc.len,
6868 			tdata->cipher_iv.data, tdata->cipher_iv.len,
6869 			tdata->auth_iv.data, tdata->auth_iv.len,
6870 			(tdata->digest_enc.offset == 0 ?
6871 				plaintext_pad_len
6872 				: tdata->digest_enc.offset),
6873 			tdata->validCipherLen.len_bits,
6874 			tdata->cipher.offset_bits,
6875 			tdata->validAuthLen.len_bits,
6876 			tdata->auth.offset_bits,
6877 			op_mode, 0, verify);
6878 
6879 	if (retval < 0)
6880 		return retval;
6881 
6882 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
6883 
6884 	/* Check if the op failed because the device doesn't */
6885 	/* support this particular combination of algorithms */
6886 	if (op == NULL && ut_params->op->status ==
6887 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
6888 		printf("Device doesn't support this mixed combination. "
6889 				"Test Skipped.\n");
6890 		return -ENOTSUP;
6891 	}
6892 	ut_params->op = op;
6893 
6894 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6895 
6896 	ut_params->obuf = (op_mode == IN_PLACE ?
6897 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6898 
6899 	if (verify) {
6900 		if (ut_params->obuf)
6901 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6902 							uint8_t *);
6903 		else
6904 			plaintext = ciphertext +
6905 					(tdata->cipher.offset_bits >> 3);
6906 
6907 		debug_hexdump(stdout, "plaintext:", plaintext,
6908 				tdata->plaintext.len_bits >> 3);
6909 		debug_hexdump(stdout, "plaintext expected:",
6910 				tdata->plaintext.data,
6911 				tdata->plaintext.len_bits >> 3);
6912 	} else {
6913 		if (ut_params->obuf)
6914 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6915 					uint8_t *);
6916 		else
6917 			ciphertext = plaintext;
6918 
6919 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6920 				ciphertext_len);
6921 		debug_hexdump(stdout, "ciphertext expected:",
6922 				tdata->ciphertext.data,
6923 				tdata->ciphertext.len_bits >> 3);
6924 
6925 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6926 				+ (tdata->digest_enc.offset == 0 ?
6927 		plaintext_pad_len : tdata->digest_enc.offset);
6928 
6929 		debug_hexdump(stdout, "digest:", ut_params->digest,
6930 				tdata->digest_enc.len);
6931 		debug_hexdump(stdout, "digest expected:",
6932 				tdata->digest_enc.data,
6933 				tdata->digest_enc.len);
6934 	}
6935 
6936 	/* Validate obuf */
6937 	if (verify) {
6938 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6939 				plaintext,
6940 				tdata->plaintext.data,
6941 				tdata->plaintext.len_bits >> 3,
6942 				"Plaintext data not as expected");
6943 	} else {
6944 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6945 				ciphertext,
6946 				tdata->ciphertext.data,
6947 				tdata->validDataLen.len_bits,
6948 				"Ciphertext data not as expected");
6949 
6950 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6951 				ut_params->digest,
6952 				tdata->digest_enc.data,
6953 				DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
6954 				"Generated auth tag not as expected");
6955 	}
6956 
6957 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
6958 			"crypto op processing failed");
6959 
6960 	return 0;
6961 }
6962 
6963 static int
6964 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
6965 	uint8_t op_mode, uint8_t verify)
6966 {
6967 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6968 	struct crypto_unittest_params *ut_params = &unittest_params;
6969 
6970 	int retval;
6971 
6972 	const uint8_t *plaintext = NULL;
6973 	const uint8_t *ciphertext = NULL;
6974 	const uint8_t *digest = NULL;
6975 	unsigned int plaintext_pad_len;
6976 	unsigned int plaintext_len;
6977 	unsigned int ciphertext_pad_len;
6978 	unsigned int ciphertext_len;
6979 	uint8_t buffer[10000];
6980 	uint8_t digest_buffer[10000];
6981 
6982 	struct rte_cryptodev_info dev_info;
6983 	struct rte_crypto_op *op;
6984 
6985 	/* Check if device supports particular algorithms */
6986 	if (test_mixed_check_if_unsupported(tdata))
6987 		return -ENOTSUP;
6988 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6989 		return -ENOTSUP;
6990 
6991 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6992 
6993 	uint64_t feat_flags = dev_info.feature_flags;
6994 
6995 	if (op_mode == IN_PLACE) {
6996 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6997 			printf("Device doesn't support in-place scatter-gather "
6998 					"in both input and output mbufs.\n");
6999 			return -ENOTSUP;
7000 		}
7001 	} else {
7002 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7003 			printf("Device doesn't support out-of-place scatter-gather "
7004 					"in both input and output mbufs.\n");
7005 			return -ENOTSUP;
7006 		}
7007 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7008 			printf("Device doesn't support digest encrypted.\n");
7009 			return -ENOTSUP;
7010 		}
7011 	}
7012 
7013 	/* Create the session */
7014 	if (verify)
7015 		retval = create_wireless_algo_cipher_auth_session(
7016 				ts_params->valid_devs[0],
7017 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7018 				RTE_CRYPTO_AUTH_OP_VERIFY,
7019 				tdata->auth_algo,
7020 				tdata->cipher_algo,
7021 				tdata->auth_key.data, tdata->auth_key.len,
7022 				tdata->auth_iv.len, tdata->digest_enc.len,
7023 				tdata->cipher_iv.len);
7024 	else
7025 		retval = create_wireless_algo_auth_cipher_session(
7026 				ts_params->valid_devs[0],
7027 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7028 				RTE_CRYPTO_AUTH_OP_GENERATE,
7029 				tdata->auth_algo,
7030 				tdata->cipher_algo,
7031 				tdata->auth_key.data, tdata->auth_key.len,
7032 				tdata->auth_iv.len, tdata->digest_enc.len,
7033 				tdata->cipher_iv.len);
7034 	if (retval < 0)
7035 		return retval;
7036 
7037 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7038 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7039 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7040 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7041 
7042 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7043 			ciphertext_pad_len, 15, 0);
7044 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7045 			"Failed to allocate input buffer in mempool");
7046 
7047 	if (op_mode == OUT_OF_PLACE) {
7048 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7049 				plaintext_pad_len, 15, 0);
7050 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7051 				"Failed to allocate output buffer in mempool");
7052 	}
7053 
7054 	if (verify) {
7055 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7056 			tdata->ciphertext.data);
7057 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7058 					ciphertext_len, buffer);
7059 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7060 			ciphertext_len);
7061 	} else {
7062 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7063 			tdata->plaintext.data);
7064 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7065 					plaintext_len, buffer);
7066 		debug_hexdump(stdout, "plaintext:", plaintext,
7067 			plaintext_len);
7068 	}
7069 	memset(buffer, 0, sizeof(buffer));
7070 
7071 	/* Create the operation */
7072 	retval = create_wireless_algo_auth_cipher_operation(
7073 			tdata->digest_enc.data, tdata->digest_enc.len,
7074 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7075 			tdata->auth_iv.data, tdata->auth_iv.len,
7076 			(tdata->digest_enc.offset == 0 ?
7077 				plaintext_pad_len
7078 				: tdata->digest_enc.offset),
7079 			tdata->validCipherLen.len_bits,
7080 			tdata->cipher.offset_bits,
7081 			tdata->validAuthLen.len_bits,
7082 			tdata->auth.offset_bits,
7083 			op_mode, 1, verify);
7084 
7085 	if (retval < 0)
7086 		return retval;
7087 
7088 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7089 
7090 	/* Check if the op failed because the device doesn't */
7091 	/* support this particular combination of algorithms */
7092 	if (op == NULL && ut_params->op->status ==
7093 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7094 		printf("Device doesn't support this mixed combination. "
7095 				"Test Skipped.\n");
7096 		return -ENOTSUP;
7097 	}
7098 	ut_params->op = op;
7099 
7100 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7101 
7102 	ut_params->obuf = (op_mode == IN_PLACE ?
7103 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7104 
7105 	if (verify) {
7106 		if (ut_params->obuf)
7107 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7108 					plaintext_len, buffer);
7109 		else
7110 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7111 					plaintext_len, buffer);
7112 
7113 		debug_hexdump(stdout, "plaintext:", plaintext,
7114 				(tdata->plaintext.len_bits >> 3) -
7115 				tdata->digest_enc.len);
7116 		debug_hexdump(stdout, "plaintext expected:",
7117 				tdata->plaintext.data,
7118 				(tdata->plaintext.len_bits >> 3) -
7119 				tdata->digest_enc.len);
7120 	} else {
7121 		if (ut_params->obuf)
7122 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7123 					ciphertext_len, buffer);
7124 		else
7125 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7126 					ciphertext_len, buffer);
7127 
7128 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7129 			ciphertext_len);
7130 		debug_hexdump(stdout, "ciphertext expected:",
7131 			tdata->ciphertext.data,
7132 			tdata->ciphertext.len_bits >> 3);
7133 
7134 		if (ut_params->obuf)
7135 			digest = rte_pktmbuf_read(ut_params->obuf,
7136 					(tdata->digest_enc.offset == 0 ?
7137 						plaintext_pad_len :
7138 						tdata->digest_enc.offset),
7139 					tdata->digest_enc.len, digest_buffer);
7140 		else
7141 			digest = rte_pktmbuf_read(ut_params->ibuf,
7142 					(tdata->digest_enc.offset == 0 ?
7143 						plaintext_pad_len :
7144 						tdata->digest_enc.offset),
7145 					tdata->digest_enc.len, digest_buffer);
7146 
7147 		debug_hexdump(stdout, "digest:", digest,
7148 				tdata->digest_enc.len);
7149 		debug_hexdump(stdout, "digest expected:",
7150 				tdata->digest_enc.data, tdata->digest_enc.len);
7151 	}
7152 
7153 	/* Validate obuf */
7154 	if (verify) {
7155 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7156 				plaintext,
7157 				tdata->plaintext.data,
7158 				tdata->plaintext.len_bits >> 3,
7159 				"Plaintext data not as expected");
7160 	} else {
7161 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7162 				ciphertext,
7163 				tdata->ciphertext.data,
7164 				tdata->validDataLen.len_bits,
7165 				"Ciphertext data not as expected");
7166 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7167 				digest,
7168 				tdata->digest_enc.data,
7169 				tdata->digest_enc.len,
7170 				"Generated auth tag not as expected");
7171 	}
7172 
7173 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7174 			"crypto op processing failed");
7175 
7176 	return 0;
7177 }
7178 
7179 /** AUTH AES CMAC + CIPHER AES CTR */
7180 
7181 static int
7182 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7183 {
7184 	return test_mixed_auth_cipher(
7185 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7186 }
7187 
7188 static int
7189 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7190 {
7191 	return test_mixed_auth_cipher(
7192 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7193 }
7194 
7195 static int
7196 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7197 {
7198 	return test_mixed_auth_cipher_sgl(
7199 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7200 }
7201 
7202 static int
7203 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7204 {
7205 	return test_mixed_auth_cipher_sgl(
7206 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7207 }
7208 
7209 static int
7210 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7211 {
7212 	return test_mixed_auth_cipher(
7213 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7214 }
7215 
7216 static int
7217 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7218 {
7219 	return test_mixed_auth_cipher(
7220 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7221 }
7222 
7223 static int
7224 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7225 {
7226 	return test_mixed_auth_cipher_sgl(
7227 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7228 }
7229 
7230 static int
7231 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7232 {
7233 	return test_mixed_auth_cipher_sgl(
7234 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7235 }
7236 
7237 /** MIXED AUTH + CIPHER */
7238 
7239 static int
7240 test_auth_zuc_cipher_snow_test_case_1(void)
7241 {
7242 	return test_mixed_auth_cipher(
7243 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7244 }
7245 
7246 static int
7247 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7248 {
7249 	return test_mixed_auth_cipher(
7250 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7251 }
7252 
7253 static int
7254 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7255 {
7256 	return test_mixed_auth_cipher(
7257 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7258 }
7259 
7260 static int
7261 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7262 {
7263 	return test_mixed_auth_cipher(
7264 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7265 }
7266 
7267 static int
7268 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7269 {
7270 	return test_mixed_auth_cipher(
7271 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7272 }
7273 
7274 static int
7275 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7276 {
7277 	return test_mixed_auth_cipher(
7278 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7279 }
7280 
7281 static int
7282 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7283 {
7284 	return test_mixed_auth_cipher(
7285 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7286 }
7287 
7288 static int
7289 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7290 {
7291 	return test_mixed_auth_cipher(
7292 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7293 }
7294 
7295 static int
7296 test_auth_snow_cipher_zuc_test_case_1(void)
7297 {
7298 	return test_mixed_auth_cipher(
7299 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7300 }
7301 
7302 static int
7303 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7304 {
7305 	return test_mixed_auth_cipher(
7306 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7307 }
7308 
7309 static int
7310 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7311 {
7312 	return test_mixed_auth_cipher(
7313 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7314 }
7315 
7316 static int
7317 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7318 {
7319 	return test_mixed_auth_cipher(
7320 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7321 }
7322 
7323 static int
7324 test_auth_null_cipher_snow_test_case_1(void)
7325 {
7326 	return test_mixed_auth_cipher(
7327 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7328 }
7329 
7330 static int
7331 test_verify_auth_null_cipher_snow_test_case_1(void)
7332 {
7333 	return test_mixed_auth_cipher(
7334 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7335 }
7336 
7337 static int
7338 test_auth_null_cipher_zuc_test_case_1(void)
7339 {
7340 	return test_mixed_auth_cipher(
7341 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7342 }
7343 
7344 static int
7345 test_verify_auth_null_cipher_zuc_test_case_1(void)
7346 {
7347 	return test_mixed_auth_cipher(
7348 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7349 }
7350 
7351 static int
7352 test_auth_snow_cipher_null_test_case_1(void)
7353 {
7354 	return test_mixed_auth_cipher(
7355 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7356 }
7357 
7358 static int
7359 test_verify_auth_snow_cipher_null_test_case_1(void)
7360 {
7361 	return test_mixed_auth_cipher(
7362 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7363 }
7364 
7365 static int
7366 test_auth_zuc_cipher_null_test_case_1(void)
7367 {
7368 	return test_mixed_auth_cipher(
7369 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7370 }
7371 
7372 static int
7373 test_verify_auth_zuc_cipher_null_test_case_1(void)
7374 {
7375 	return test_mixed_auth_cipher(
7376 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7377 }
7378 
7379 static int
7380 test_auth_null_cipher_aes_ctr_test_case_1(void)
7381 {
7382 	return test_mixed_auth_cipher(
7383 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7384 }
7385 
7386 static int
7387 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7388 {
7389 	return test_mixed_auth_cipher(
7390 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7391 }
7392 
7393 static int
7394 test_auth_aes_cmac_cipher_null_test_case_1(void)
7395 {
7396 	return test_mixed_auth_cipher(
7397 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7398 }
7399 
7400 static int
7401 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7402 {
7403 	return test_mixed_auth_cipher(
7404 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7405 }
7406 
7407 /* ***** AEAD algorithm Tests ***** */
7408 
7409 static int
7410 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7411 		enum rte_crypto_aead_operation op,
7412 		const uint8_t *key, const uint8_t key_len,
7413 		const uint16_t aad_len, const uint8_t auth_len,
7414 		uint8_t iv_len)
7415 {
7416 	uint8_t aead_key[key_len];
7417 
7418 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7419 	struct crypto_unittest_params *ut_params = &unittest_params;
7420 
7421 	memcpy(aead_key, key, key_len);
7422 
7423 	/* Setup AEAD Parameters */
7424 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7425 	ut_params->aead_xform.next = NULL;
7426 	ut_params->aead_xform.aead.algo = algo;
7427 	ut_params->aead_xform.aead.op = op;
7428 	ut_params->aead_xform.aead.key.data = aead_key;
7429 	ut_params->aead_xform.aead.key.length = key_len;
7430 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
7431 	ut_params->aead_xform.aead.iv.length = iv_len;
7432 	ut_params->aead_xform.aead.digest_length = auth_len;
7433 	ut_params->aead_xform.aead.aad_length = aad_len;
7434 
7435 	debug_hexdump(stdout, "key:", key, key_len);
7436 
7437 	/* Create Crypto session*/
7438 	ut_params->sess = rte_cryptodev_sym_session_create(
7439 			ts_params->session_mpool);
7440 
7441 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
7442 			&ut_params->aead_xform,
7443 			ts_params->session_priv_mpool);
7444 
7445 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
7446 
7447 	return 0;
7448 }
7449 
7450 static int
7451 create_aead_xform(struct rte_crypto_op *op,
7452 		enum rte_crypto_aead_algorithm algo,
7453 		enum rte_crypto_aead_operation aead_op,
7454 		uint8_t *key, const uint8_t key_len,
7455 		const uint8_t aad_len, const uint8_t auth_len,
7456 		uint8_t iv_len)
7457 {
7458 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
7459 			"failed to allocate space for crypto transform");
7460 
7461 	struct rte_crypto_sym_op *sym_op = op->sym;
7462 
7463 	/* Setup AEAD Parameters */
7464 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
7465 	sym_op->xform->next = NULL;
7466 	sym_op->xform->aead.algo = algo;
7467 	sym_op->xform->aead.op = aead_op;
7468 	sym_op->xform->aead.key.data = key;
7469 	sym_op->xform->aead.key.length = key_len;
7470 	sym_op->xform->aead.iv.offset = IV_OFFSET;
7471 	sym_op->xform->aead.iv.length = iv_len;
7472 	sym_op->xform->aead.digest_length = auth_len;
7473 	sym_op->xform->aead.aad_length = aad_len;
7474 
7475 	debug_hexdump(stdout, "key:", key, key_len);
7476 
7477 	return 0;
7478 }
7479 
7480 static int
7481 create_aead_operation(enum rte_crypto_aead_operation op,
7482 		const struct aead_test_data *tdata)
7483 {
7484 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7485 	struct crypto_unittest_params *ut_params = &unittest_params;
7486 
7487 	uint8_t *plaintext, *ciphertext;
7488 	unsigned int aad_pad_len, plaintext_pad_len;
7489 
7490 	/* Generate Crypto op data structure */
7491 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7492 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7493 	TEST_ASSERT_NOT_NULL(ut_params->op,
7494 			"Failed to allocate symmetric crypto operation struct");
7495 
7496 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
7497 
7498 	/* Append aad data */
7499 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
7500 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
7501 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7502 				aad_pad_len);
7503 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7504 				"no room to append aad");
7505 
7506 		sym_op->aead.aad.phys_addr =
7507 				rte_pktmbuf_iova(ut_params->ibuf);
7508 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
7509 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
7510 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7511 			tdata->aad.len);
7512 
7513 		/* Append IV at the end of the crypto operation*/
7514 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7515 				uint8_t *, IV_OFFSET);
7516 
7517 		/* Copy IV 1 byte after the IV pointer, according to the API */
7518 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
7519 		debug_hexdump(stdout, "iv:", iv_ptr,
7520 			tdata->iv.len);
7521 	} else {
7522 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
7523 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7524 				aad_pad_len);
7525 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
7526 				"no room to append aad");
7527 
7528 		sym_op->aead.aad.phys_addr =
7529 				rte_pktmbuf_iova(ut_params->ibuf);
7530 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
7531 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
7532 			tdata->aad.len);
7533 
7534 		/* Append IV at the end of the crypto operation*/
7535 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
7536 				uint8_t *, IV_OFFSET);
7537 
7538 		if (tdata->iv.len == 0) {
7539 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
7540 			debug_hexdump(stdout, "iv:", iv_ptr,
7541 				AES_GCM_J0_LENGTH);
7542 		} else {
7543 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
7544 			debug_hexdump(stdout, "iv:", iv_ptr,
7545 				tdata->iv.len);
7546 		}
7547 	}
7548 
7549 	/* Append plaintext/ciphertext */
7550 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7551 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7552 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7553 				plaintext_pad_len);
7554 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
7555 
7556 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
7557 		debug_hexdump(stdout, "plaintext:", plaintext,
7558 				tdata->plaintext.len);
7559 
7560 		if (ut_params->obuf) {
7561 			ciphertext = (uint8_t *)rte_pktmbuf_append(
7562 					ut_params->obuf,
7563 					plaintext_pad_len + aad_pad_len);
7564 			TEST_ASSERT_NOT_NULL(ciphertext,
7565 					"no room to append ciphertext");
7566 
7567 			memset(ciphertext + aad_pad_len, 0,
7568 					tdata->ciphertext.len);
7569 		}
7570 	} else {
7571 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
7572 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7573 				plaintext_pad_len);
7574 		TEST_ASSERT_NOT_NULL(ciphertext,
7575 				"no room to append ciphertext");
7576 
7577 		memcpy(ciphertext, tdata->ciphertext.data,
7578 				tdata->ciphertext.len);
7579 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7580 				tdata->ciphertext.len);
7581 
7582 		if (ut_params->obuf) {
7583 			plaintext = (uint8_t *)rte_pktmbuf_append(
7584 					ut_params->obuf,
7585 					plaintext_pad_len + aad_pad_len);
7586 			TEST_ASSERT_NOT_NULL(plaintext,
7587 					"no room to append plaintext");
7588 
7589 			memset(plaintext + aad_pad_len, 0,
7590 					tdata->plaintext.len);
7591 		}
7592 	}
7593 
7594 	/* Append digest data */
7595 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
7596 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7597 				ut_params->obuf ? ut_params->obuf :
7598 						ut_params->ibuf,
7599 						tdata->auth_tag.len);
7600 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7601 				"no room to append digest");
7602 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
7603 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7604 				ut_params->obuf ? ut_params->obuf :
7605 						ut_params->ibuf,
7606 						plaintext_pad_len +
7607 						aad_pad_len);
7608 	} else {
7609 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
7610 				ut_params->ibuf, tdata->auth_tag.len);
7611 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
7612 				"no room to append digest");
7613 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
7614 				ut_params->ibuf,
7615 				plaintext_pad_len + aad_pad_len);
7616 
7617 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
7618 			tdata->auth_tag.len);
7619 		debug_hexdump(stdout, "digest:",
7620 			sym_op->aead.digest.data,
7621 			tdata->auth_tag.len);
7622 	}
7623 
7624 	sym_op->aead.data.length = tdata->plaintext.len;
7625 	sym_op->aead.data.offset = aad_pad_len;
7626 
7627 	return 0;
7628 }
7629 
7630 static int
7631 test_authenticated_encryption(const struct aead_test_data *tdata)
7632 {
7633 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7634 	struct crypto_unittest_params *ut_params = &unittest_params;
7635 
7636 	int retval;
7637 	uint8_t *ciphertext, *auth_tag;
7638 	uint16_t plaintext_pad_len;
7639 	uint32_t i;
7640 	struct rte_cryptodev_info dev_info;
7641 
7642 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7643 	uint64_t feat_flags = dev_info.feature_flags;
7644 
7645 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
7646 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
7647 		printf("Device doesn't support RAW data-path APIs.\n");
7648 		return -ENOTSUP;
7649 	}
7650 
7651 	/* Verify the capabilities */
7652 	struct rte_cryptodev_sym_capability_idx cap_idx;
7653 	const struct rte_cryptodev_symmetric_capability *capability;
7654 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7655 	cap_idx.algo.aead = tdata->algo;
7656 	capability = rte_cryptodev_sym_capability_get(
7657 			ts_params->valid_devs[0], &cap_idx);
7658 	if (capability == NULL)
7659 		return -ENOTSUP;
7660 	if (rte_cryptodev_sym_capability_check_aead(
7661 			capability, tdata->key.len, tdata->auth_tag.len,
7662 			tdata->aad.len, tdata->iv.len))
7663 		return -ENOTSUP;
7664 
7665 	/* Create AEAD session */
7666 	retval = create_aead_session(ts_params->valid_devs[0],
7667 			tdata->algo,
7668 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
7669 			tdata->key.data, tdata->key.len,
7670 			tdata->aad.len, tdata->auth_tag.len,
7671 			tdata->iv.len);
7672 	if (retval < 0)
7673 		return retval;
7674 
7675 	if (tdata->aad.len > MBUF_SIZE) {
7676 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
7677 		/* Populate full size of add data */
7678 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
7679 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
7680 	} else
7681 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7682 
7683 	/* clear mbuf payload */
7684 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7685 			rte_pktmbuf_tailroom(ut_params->ibuf));
7686 
7687 	/* Create AEAD operation */
7688 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
7689 	if (retval < 0)
7690 		return retval;
7691 
7692 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
7693 
7694 	ut_params->op->sym->m_src = ut_params->ibuf;
7695 
7696 	/* Process crypto operation */
7697 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
7698 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
7699 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7700 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
7701 				ut_params->op, 0, 0, 0, 0);
7702 	else
7703 		TEST_ASSERT_NOT_NULL(
7704 			process_crypto_request(ts_params->valid_devs[0],
7705 			ut_params->op), "failed to process sym crypto op");
7706 
7707 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7708 			"crypto op processing failed");
7709 
7710 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
7711 
7712 	if (ut_params->op->sym->m_dst) {
7713 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7714 				uint8_t *);
7715 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
7716 				uint8_t *, plaintext_pad_len);
7717 	} else {
7718 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
7719 				uint8_t *,
7720 				ut_params->op->sym->cipher.data.offset);
7721 		auth_tag = ciphertext + plaintext_pad_len;
7722 	}
7723 
7724 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
7725 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
7726 
7727 	/* Validate obuf */
7728 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7729 			ciphertext,
7730 			tdata->ciphertext.data,
7731 			tdata->ciphertext.len,
7732 			"Ciphertext data not as expected");
7733 
7734 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
7735 			auth_tag,
7736 			tdata->auth_tag.data,
7737 			tdata->auth_tag.len,
7738 			"Generated auth tag not as expected");
7739 
7740 	return 0;
7741 
7742 }
7743 
7744 #ifdef RTE_LIB_SECURITY
7745 static int
7746 security_proto_supported(enum rte_security_session_action_type action,
7747 	enum rte_security_session_protocol proto)
7748 {
7749 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7750 
7751 	const struct rte_security_capability *capabilities;
7752 	const struct rte_security_capability *capability;
7753 	uint16_t i = 0;
7754 
7755 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7756 				rte_cryptodev_get_sec_ctx(
7757 				ts_params->valid_devs[0]);
7758 
7759 
7760 	capabilities = rte_security_capabilities_get(ctx);
7761 
7762 	if (capabilities == NULL)
7763 		return -ENOTSUP;
7764 
7765 	while ((capability = &capabilities[i++])->action !=
7766 			RTE_SECURITY_ACTION_TYPE_NONE) {
7767 		if (capability->action == action &&
7768 				capability->protocol == proto)
7769 			return 0;
7770 	}
7771 
7772 	return -ENOTSUP;
7773 }
7774 
7775 /* Basic algorithm run function for async inplace mode.
7776  * Creates a session from input parameters and runs one operation
7777  * on input_vec. Checks the output of the crypto operation against
7778  * output_vec.
7779  */
7780 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
7781 			   enum rte_crypto_auth_operation opa,
7782 			   const uint8_t *input_vec, unsigned int input_vec_len,
7783 			   const uint8_t *output_vec,
7784 			   unsigned int output_vec_len,
7785 			   enum rte_crypto_cipher_algorithm cipher_alg,
7786 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
7787 			   enum rte_crypto_auth_algorithm auth_alg,
7788 			   const uint8_t *auth_key, uint32_t auth_key_len,
7789 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
7790 			   uint8_t packet_direction, uint8_t sn_size,
7791 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
7792 {
7793 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7794 	struct crypto_unittest_params *ut_params = &unittest_params;
7795 	uint8_t *plaintext;
7796 	int ret = TEST_SUCCESS;
7797 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7798 				rte_cryptodev_get_sec_ctx(
7799 				ts_params->valid_devs[0]);
7800 
7801 	/* Verify the capabilities */
7802 	struct rte_security_capability_idx sec_cap_idx;
7803 
7804 	sec_cap_idx.action = ut_params->type;
7805 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7806 	sec_cap_idx.pdcp.domain = domain;
7807 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7808 		return -ENOTSUP;
7809 
7810 	/* Generate test mbuf data */
7811 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7812 
7813 	/* clear mbuf payload */
7814 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7815 			rte_pktmbuf_tailroom(ut_params->ibuf));
7816 
7817 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7818 						  input_vec_len);
7819 	memcpy(plaintext, input_vec, input_vec_len);
7820 
7821 	/* Out of place support */
7822 	if (oop) {
7823 		/*
7824 		 * For out-op-place we need to alloc another mbuf
7825 		 */
7826 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7827 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
7828 	}
7829 
7830 	/* Setup Cipher Parameters */
7831 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7832 	ut_params->cipher_xform.cipher.algo = cipher_alg;
7833 	ut_params->cipher_xform.cipher.op = opc;
7834 	ut_params->cipher_xform.cipher.key.data = cipher_key;
7835 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
7836 	ut_params->cipher_xform.cipher.iv.length =
7837 				packet_direction ? 4 : 0;
7838 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
7839 
7840 	/* Setup HMAC Parameters if ICV header is required */
7841 	if (auth_alg != 0) {
7842 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7843 		ut_params->auth_xform.next = NULL;
7844 		ut_params->auth_xform.auth.algo = auth_alg;
7845 		ut_params->auth_xform.auth.op = opa;
7846 		ut_params->auth_xform.auth.key.data = auth_key;
7847 		ut_params->auth_xform.auth.key.length = auth_key_len;
7848 
7849 		ut_params->cipher_xform.next = &ut_params->auth_xform;
7850 	} else {
7851 		ut_params->cipher_xform.next = NULL;
7852 	}
7853 
7854 	struct rte_security_session_conf sess_conf = {
7855 		.action_type = ut_params->type,
7856 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
7857 		{.pdcp = {
7858 			.bearer = bearer,
7859 			.domain = domain,
7860 			.pkt_dir = packet_direction,
7861 			.sn_size = sn_size,
7862 			.hfn = packet_direction ? 0 : hfn,
7863 			/**
7864 			 * hfn can be set as pdcp_test_hfn[i]
7865 			 * if hfn_ovrd is not set. Here, PDCP
7866 			 * packet direction is just used to
7867 			 * run half of the cases with session
7868 			 * HFN and other half with per packet
7869 			 * HFN.
7870 			 */
7871 			.hfn_threshold = hfn_threshold,
7872 			.hfn_ovrd = packet_direction ? 1 : 0,
7873 			.sdap_enabled = sdap,
7874 		} },
7875 		.crypto_xform = &ut_params->cipher_xform
7876 	};
7877 
7878 	/* Create security session */
7879 	ut_params->sec_session = rte_security_session_create(ctx,
7880 				&sess_conf, ts_params->session_mpool,
7881 				ts_params->session_priv_mpool);
7882 
7883 	if (!ut_params->sec_session) {
7884 		printf("TestCase %s()-%d line %d failed %s: ",
7885 			__func__, i, __LINE__, "Failed to allocate session");
7886 		ret = TEST_FAILED;
7887 		goto on_err;
7888 	}
7889 
7890 	/* Generate crypto op data structure */
7891 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
7892 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
7893 	if (!ut_params->op) {
7894 		printf("TestCase %s()-%d line %d failed %s: ",
7895 			__func__, i, __LINE__,
7896 			"Failed to allocate symmetric crypto operation struct");
7897 		ret = TEST_FAILED;
7898 		goto on_err;
7899 	}
7900 
7901 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
7902 					uint32_t *, IV_OFFSET);
7903 	*per_pkt_hfn = packet_direction ? hfn : 0;
7904 
7905 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
7906 
7907 	/* set crypto operation source mbuf */
7908 	ut_params->op->sym->m_src = ut_params->ibuf;
7909 	if (oop)
7910 		ut_params->op->sym->m_dst = ut_params->obuf;
7911 
7912 	/* Process crypto operation */
7913 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
7914 		== NULL) {
7915 		printf("TestCase %s()-%d line %d failed %s: ",
7916 			__func__, i, __LINE__,
7917 			"failed to process sym crypto op");
7918 		ret = TEST_FAILED;
7919 		goto on_err;
7920 	}
7921 
7922 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
7923 		printf("TestCase %s()-%d line %d failed %s: ",
7924 			__func__, i, __LINE__, "crypto op processing failed");
7925 		ret = TEST_FAILED;
7926 		goto on_err;
7927 	}
7928 
7929 	/* Validate obuf */
7930 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
7931 			uint8_t *);
7932 	if (oop) {
7933 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
7934 				uint8_t *);
7935 	}
7936 
7937 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
7938 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
7939 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
7940 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
7941 		ret = TEST_FAILED;
7942 		goto on_err;
7943 	}
7944 
7945 on_err:
7946 	rte_crypto_op_free(ut_params->op);
7947 	ut_params->op = NULL;
7948 
7949 	if (ut_params->sec_session)
7950 		rte_security_session_destroy(ctx, ut_params->sec_session);
7951 	ut_params->sec_session = NULL;
7952 
7953 	rte_pktmbuf_free(ut_params->ibuf);
7954 	ut_params->ibuf = NULL;
7955 	if (oop) {
7956 		rte_pktmbuf_free(ut_params->obuf);
7957 		ut_params->obuf = NULL;
7958 	}
7959 
7960 	return ret;
7961 }
7962 
7963 static int
7964 test_pdcp_proto_SGL(int i, int oop,
7965 	enum rte_crypto_cipher_operation opc,
7966 	enum rte_crypto_auth_operation opa,
7967 	uint8_t *input_vec,
7968 	unsigned int input_vec_len,
7969 	uint8_t *output_vec,
7970 	unsigned int output_vec_len,
7971 	uint32_t fragsz,
7972 	uint32_t fragsz_oop)
7973 {
7974 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7975 	struct crypto_unittest_params *ut_params = &unittest_params;
7976 	uint8_t *plaintext;
7977 	struct rte_mbuf *buf, *buf_oop = NULL;
7978 	int ret = TEST_SUCCESS;
7979 	int to_trn = 0;
7980 	int to_trn_tbl[16];
7981 	int segs = 1;
7982 	unsigned int trn_data = 0;
7983 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
7984 				rte_cryptodev_get_sec_ctx(
7985 				ts_params->valid_devs[0]);
7986 
7987 	/* Verify the capabilities */
7988 	struct rte_security_capability_idx sec_cap_idx;
7989 
7990 	sec_cap_idx.action = ut_params->type;
7991 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
7992 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
7993 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
7994 		return -ENOTSUP;
7995 
7996 	if (fragsz > input_vec_len)
7997 		fragsz = input_vec_len;
7998 
7999 	uint16_t plaintext_len = fragsz;
8000 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8001 
8002 	if (fragsz_oop > output_vec_len)
8003 		frag_size_oop = output_vec_len;
8004 
8005 	int ecx = 0;
8006 	if (input_vec_len % fragsz != 0) {
8007 		if (input_vec_len / fragsz + 1 > 16)
8008 			return 1;
8009 	} else if (input_vec_len / fragsz > 16)
8010 		return 1;
8011 
8012 	/* Out of place support */
8013 	if (oop) {
8014 		/*
8015 		 * For out-op-place we need to alloc another mbuf
8016 		 */
8017 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8018 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8019 		buf_oop = ut_params->obuf;
8020 	}
8021 
8022 	/* Generate test mbuf data */
8023 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8024 
8025 	/* clear mbuf payload */
8026 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8027 			rte_pktmbuf_tailroom(ut_params->ibuf));
8028 
8029 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8030 						  plaintext_len);
8031 	memcpy(plaintext, input_vec, plaintext_len);
8032 	trn_data += plaintext_len;
8033 
8034 	buf = ut_params->ibuf;
8035 
8036 	/*
8037 	 * Loop until no more fragments
8038 	 */
8039 
8040 	while (trn_data < input_vec_len) {
8041 		++segs;
8042 		to_trn = (input_vec_len - trn_data < fragsz) ?
8043 				(input_vec_len - trn_data) : fragsz;
8044 
8045 		to_trn_tbl[ecx++] = to_trn;
8046 
8047 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8048 		buf = buf->next;
8049 
8050 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8051 				rte_pktmbuf_tailroom(buf));
8052 
8053 		/* OOP */
8054 		if (oop && !fragsz_oop) {
8055 			buf_oop->next =
8056 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8057 			buf_oop = buf_oop->next;
8058 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8059 					0, rte_pktmbuf_tailroom(buf_oop));
8060 			rte_pktmbuf_append(buf_oop, to_trn);
8061 		}
8062 
8063 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8064 				to_trn);
8065 
8066 		memcpy(plaintext, input_vec + trn_data, to_trn);
8067 		trn_data += to_trn;
8068 	}
8069 
8070 	ut_params->ibuf->nb_segs = segs;
8071 
8072 	segs = 1;
8073 	if (fragsz_oop && oop) {
8074 		to_trn = 0;
8075 		ecx = 0;
8076 
8077 		trn_data = frag_size_oop;
8078 		while (trn_data < output_vec_len) {
8079 			++segs;
8080 			to_trn =
8081 				(output_vec_len - trn_data <
8082 						frag_size_oop) ?
8083 				(output_vec_len - trn_data) :
8084 						frag_size_oop;
8085 
8086 			to_trn_tbl[ecx++] = to_trn;
8087 
8088 			buf_oop->next =
8089 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8090 			buf_oop = buf_oop->next;
8091 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8092 					0, rte_pktmbuf_tailroom(buf_oop));
8093 			rte_pktmbuf_append(buf_oop, to_trn);
8094 
8095 			trn_data += to_trn;
8096 		}
8097 		ut_params->obuf->nb_segs = segs;
8098 	}
8099 
8100 	/* Setup Cipher Parameters */
8101 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8102 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8103 	ut_params->cipher_xform.cipher.op = opc;
8104 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8105 	ut_params->cipher_xform.cipher.key.length =
8106 					pdcp_test_params[i].cipher_key_len;
8107 	ut_params->cipher_xform.cipher.iv.length = 0;
8108 
8109 	/* Setup HMAC Parameters if ICV header is required */
8110 	if (pdcp_test_params[i].auth_alg != 0) {
8111 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8112 		ut_params->auth_xform.next = NULL;
8113 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8114 		ut_params->auth_xform.auth.op = opa;
8115 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8116 		ut_params->auth_xform.auth.key.length =
8117 					pdcp_test_params[i].auth_key_len;
8118 
8119 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8120 	} else {
8121 		ut_params->cipher_xform.next = NULL;
8122 	}
8123 
8124 	struct rte_security_session_conf sess_conf = {
8125 		.action_type = ut_params->type,
8126 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8127 		{.pdcp = {
8128 			.bearer = pdcp_test_bearer[i],
8129 			.domain = pdcp_test_params[i].domain,
8130 			.pkt_dir = pdcp_test_packet_direction[i],
8131 			.sn_size = pdcp_test_data_sn_size[i],
8132 			.hfn = pdcp_test_hfn[i],
8133 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8134 			.hfn_ovrd = 0,
8135 		} },
8136 		.crypto_xform = &ut_params->cipher_xform
8137 	};
8138 
8139 	/* Create security session */
8140 	ut_params->sec_session = rte_security_session_create(ctx,
8141 				&sess_conf, ts_params->session_mpool,
8142 				ts_params->session_priv_mpool);
8143 
8144 	if (!ut_params->sec_session) {
8145 		printf("TestCase %s()-%d line %d failed %s: ",
8146 			__func__, i, __LINE__, "Failed to allocate session");
8147 		ret = TEST_FAILED;
8148 		goto on_err;
8149 	}
8150 
8151 	/* Generate crypto op data structure */
8152 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8153 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8154 	if (!ut_params->op) {
8155 		printf("TestCase %s()-%d line %d failed %s: ",
8156 			__func__, i, __LINE__,
8157 			"Failed to allocate symmetric crypto operation struct");
8158 		ret = TEST_FAILED;
8159 		goto on_err;
8160 	}
8161 
8162 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8163 
8164 	/* set crypto operation source mbuf */
8165 	ut_params->op->sym->m_src = ut_params->ibuf;
8166 	if (oop)
8167 		ut_params->op->sym->m_dst = ut_params->obuf;
8168 
8169 	/* Process crypto operation */
8170 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op)
8171 		== NULL) {
8172 		printf("TestCase %s()-%d line %d failed %s: ",
8173 			__func__, i, __LINE__,
8174 			"failed to process sym crypto op");
8175 		ret = TEST_FAILED;
8176 		goto on_err;
8177 	}
8178 
8179 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8180 		printf("TestCase %s()-%d line %d failed %s: ",
8181 			__func__, i, __LINE__, "crypto op processing failed");
8182 		ret = TEST_FAILED;
8183 		goto on_err;
8184 	}
8185 
8186 	/* Validate obuf */
8187 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8188 			uint8_t *);
8189 	if (oop) {
8190 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8191 				uint8_t *);
8192 	}
8193 	if (fragsz_oop)
8194 		fragsz = frag_size_oop;
8195 	if (memcmp(ciphertext, output_vec, fragsz)) {
8196 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8197 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8198 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8199 		ret = TEST_FAILED;
8200 		goto on_err;
8201 	}
8202 
8203 	buf = ut_params->op->sym->m_src->next;
8204 	if (oop)
8205 		buf = ut_params->op->sym->m_dst->next;
8206 
8207 	unsigned int off = fragsz;
8208 
8209 	ecx = 0;
8210 	while (buf) {
8211 		ciphertext = rte_pktmbuf_mtod(buf,
8212 				uint8_t *);
8213 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8214 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8215 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8216 			rte_hexdump(stdout, "reference", output_vec + off,
8217 					to_trn_tbl[ecx]);
8218 			ret = TEST_FAILED;
8219 			goto on_err;
8220 		}
8221 		off += to_trn_tbl[ecx++];
8222 		buf = buf->next;
8223 	}
8224 on_err:
8225 	rte_crypto_op_free(ut_params->op);
8226 	ut_params->op = NULL;
8227 
8228 	if (ut_params->sec_session)
8229 		rte_security_session_destroy(ctx, ut_params->sec_session);
8230 	ut_params->sec_session = NULL;
8231 
8232 	rte_pktmbuf_free(ut_params->ibuf);
8233 	ut_params->ibuf = NULL;
8234 	if (oop) {
8235 		rte_pktmbuf_free(ut_params->obuf);
8236 		ut_params->obuf = NULL;
8237 	}
8238 
8239 	return ret;
8240 }
8241 
8242 int
8243 test_pdcp_proto_cplane_encap(int i)
8244 {
8245 	return test_pdcp_proto(
8246 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8247 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8248 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8249 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8250 		pdcp_test_params[i].cipher_key_len,
8251 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8252 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8253 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8254 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8255 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8256 }
8257 
8258 int
8259 test_pdcp_proto_uplane_encap(int i)
8260 {
8261 	return test_pdcp_proto(
8262 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8263 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8264 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8265 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8266 		pdcp_test_params[i].cipher_key_len,
8267 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8268 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8269 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8270 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8271 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8272 }
8273 
8274 int
8275 test_pdcp_proto_uplane_encap_with_int(int i)
8276 {
8277 	return test_pdcp_proto(
8278 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8279 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8280 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8281 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8282 		pdcp_test_params[i].cipher_key_len,
8283 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8284 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8285 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8286 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8287 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8288 }
8289 
8290 int
8291 test_pdcp_proto_cplane_decap(int i)
8292 {
8293 	return test_pdcp_proto(
8294 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8295 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8296 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8297 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8298 		pdcp_test_params[i].cipher_key_len,
8299 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8300 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8301 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8302 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8303 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8304 }
8305 
8306 int
8307 test_pdcp_proto_uplane_decap(int i)
8308 {
8309 	return test_pdcp_proto(
8310 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8311 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8312 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8313 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8314 		pdcp_test_params[i].cipher_key_len,
8315 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8316 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8317 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8318 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8319 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8320 }
8321 
8322 int
8323 test_pdcp_proto_uplane_decap_with_int(int i)
8324 {
8325 	return test_pdcp_proto(
8326 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8327 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8328 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8329 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8330 		pdcp_test_params[i].cipher_key_len,
8331 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8332 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8333 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8334 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8335 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8336 }
8337 
8338 static int
8339 test_PDCP_PROTO_SGL_in_place_32B(void)
8340 {
8341 	/* i can be used for running any PDCP case
8342 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8343 	 */
8344 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8345 	return test_pdcp_proto_SGL(i, IN_PLACE,
8346 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8347 			RTE_CRYPTO_AUTH_OP_GENERATE,
8348 			pdcp_test_data_in[i],
8349 			pdcp_test_data_in_len[i],
8350 			pdcp_test_data_out[i],
8351 			pdcp_test_data_in_len[i]+4,
8352 			32, 0);
8353 }
8354 static int
8355 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8356 {
8357 	/* i can be used for running any PDCP case
8358 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8359 	 */
8360 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8361 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8362 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8363 			RTE_CRYPTO_AUTH_OP_GENERATE,
8364 			pdcp_test_data_in[i],
8365 			pdcp_test_data_in_len[i],
8366 			pdcp_test_data_out[i],
8367 			pdcp_test_data_in_len[i]+4,
8368 			32, 128);
8369 }
8370 static int
8371 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8372 {
8373 	/* i can be used for running any PDCP case
8374 	 * In this case it is uplane 18-bit AES DL encap
8375 	 */
8376 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8377 			+ DOWNLINK;
8378 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8379 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8380 			RTE_CRYPTO_AUTH_OP_GENERATE,
8381 			pdcp_test_data_in[i],
8382 			pdcp_test_data_in_len[i],
8383 			pdcp_test_data_out[i],
8384 			pdcp_test_data_in_len[i],
8385 			32, 40);
8386 }
8387 static int
8388 test_PDCP_PROTO_SGL_oop_128B_32B(void)
8389 {
8390 	/* i can be used for running any PDCP case
8391 	 * In this case it is cplane 12-bit AES-ZUC DL encap
8392 	 */
8393 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
8394 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8395 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8396 			RTE_CRYPTO_AUTH_OP_GENERATE,
8397 			pdcp_test_data_in[i],
8398 			pdcp_test_data_in_len[i],
8399 			pdcp_test_data_out[i],
8400 			pdcp_test_data_in_len[i]+4,
8401 			128, 32);
8402 }
8403 
8404 static int
8405 test_PDCP_SDAP_PROTO_encap_all(void)
8406 {
8407 	int i = 0, size = 0;
8408 	int err, all_err = TEST_SUCCESS;
8409 	const struct pdcp_sdap_test *cur_test;
8410 
8411 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8412 
8413 	for (i = 0; i < size; i++) {
8414 		cur_test = &list_pdcp_sdap_tests[i];
8415 		err = test_pdcp_proto(
8416 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8417 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
8418 			cur_test->in_len, cur_test->data_out,
8419 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8420 			cur_test->param.cipher_alg, cur_test->cipher_key,
8421 			cur_test->param.cipher_key_len,
8422 			cur_test->param.auth_alg,
8423 			cur_test->auth_key, cur_test->param.auth_key_len,
8424 			cur_test->bearer, cur_test->param.domain,
8425 			cur_test->packet_direction, cur_test->sn_size,
8426 			cur_test->hfn,
8427 			cur_test->hfn_threshold, SDAP_ENABLED);
8428 		if (err) {
8429 			printf("\t%d) %s: Encapsulation failed\n",
8430 					cur_test->test_idx,
8431 					cur_test->param.name);
8432 			err = TEST_FAILED;
8433 		} else {
8434 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
8435 					cur_test->param.name);
8436 			err = TEST_SUCCESS;
8437 		}
8438 		all_err += err;
8439 	}
8440 
8441 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8442 
8443 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8444 }
8445 
8446 static int
8447 test_PDCP_SDAP_PROTO_decap_all(void)
8448 {
8449 	int i = 0, size = 0;
8450 	int err, all_err = TEST_SUCCESS;
8451 	const struct pdcp_sdap_test *cur_test;
8452 
8453 	size = ARRAY_SIZE(list_pdcp_sdap_tests);
8454 
8455 	for (i = 0; i < size; i++) {
8456 		cur_test = &list_pdcp_sdap_tests[i];
8457 		err = test_pdcp_proto(
8458 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
8459 			RTE_CRYPTO_AUTH_OP_VERIFY,
8460 			cur_test->data_out,
8461 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
8462 			cur_test->data_in, cur_test->in_len,
8463 			cur_test->param.cipher_alg,
8464 			cur_test->cipher_key, cur_test->param.cipher_key_len,
8465 			cur_test->param.auth_alg, cur_test->auth_key,
8466 			cur_test->param.auth_key_len, cur_test->bearer,
8467 			cur_test->param.domain, cur_test->packet_direction,
8468 			cur_test->sn_size, cur_test->hfn,
8469 			cur_test->hfn_threshold, SDAP_ENABLED);
8470 		if (err) {
8471 			printf("\t%d) %s: Decapsulation failed\n",
8472 					cur_test->test_idx,
8473 					cur_test->param.name);
8474 			err = TEST_FAILED;
8475 		} else {
8476 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
8477 					cur_test->param.name);
8478 			err = TEST_SUCCESS;
8479 		}
8480 		all_err += err;
8481 	}
8482 
8483 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
8484 
8485 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
8486 }
8487 
8488 static int
8489 test_PDCP_PROTO_all(void)
8490 {
8491 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8492 	struct crypto_unittest_params *ut_params = &unittest_params;
8493 	struct rte_cryptodev_info dev_info;
8494 	int status;
8495 
8496 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8497 	uint64_t feat_flags = dev_info.feature_flags;
8498 
8499 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8500 		return -ENOTSUP;
8501 
8502 	/* Set action type */
8503 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8504 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8505 		gbl_action_type;
8506 
8507 	if (security_proto_supported(ut_params->type,
8508 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
8509 		return -ENOTSUP;
8510 
8511 	status = test_PDCP_PROTO_cplane_encap_all();
8512 	status += test_PDCP_PROTO_cplane_decap_all();
8513 	status += test_PDCP_PROTO_uplane_encap_all();
8514 	status += test_PDCP_PROTO_uplane_decap_all();
8515 	status += test_PDCP_PROTO_SGL_in_place_32B();
8516 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
8517 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
8518 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
8519 	status += test_PDCP_SDAP_PROTO_encap_all();
8520 	status += test_PDCP_SDAP_PROTO_decap_all();
8521 
8522 	if (status)
8523 		return TEST_FAILED;
8524 	else
8525 		return TEST_SUCCESS;
8526 }
8527 
8528 static int
8529 test_docsis_proto_uplink(int i, struct docsis_test_data *d_td)
8530 {
8531 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8532 	struct crypto_unittest_params *ut_params = &unittest_params;
8533 	uint8_t *plaintext, *ciphertext;
8534 	uint8_t *iv_ptr;
8535 	int32_t cipher_len, crc_len;
8536 	uint32_t crc_data_len;
8537 	int ret = TEST_SUCCESS;
8538 
8539 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8540 					rte_cryptodev_get_sec_ctx(
8541 						ts_params->valid_devs[0]);
8542 
8543 	/* Verify the capabilities */
8544 	struct rte_security_capability_idx sec_cap_idx;
8545 	const struct rte_security_capability *sec_cap;
8546 	const struct rte_cryptodev_capabilities *crypto_cap;
8547 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8548 	int j = 0;
8549 
8550 	sec_cap_idx.action = ut_params->type;
8551 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8552 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
8553 
8554 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8555 	if (sec_cap == NULL)
8556 		return -ENOTSUP;
8557 
8558 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8559 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8560 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8561 				crypto_cap->sym.xform_type ==
8562 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8563 				crypto_cap->sym.cipher.algo ==
8564 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8565 			sym_cap = &crypto_cap->sym;
8566 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8567 						d_td->key.len,
8568 						d_td->iv.len) == 0)
8569 				break;
8570 		}
8571 	}
8572 
8573 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8574 		return -ENOTSUP;
8575 
8576 	/* Setup source mbuf payload */
8577 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8578 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8579 			rte_pktmbuf_tailroom(ut_params->ibuf));
8580 
8581 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8582 			d_td->ciphertext.len);
8583 
8584 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
8585 
8586 	/* Setup cipher session parameters */
8587 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8588 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8589 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
8590 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8591 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8592 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8593 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8594 	ut_params->cipher_xform.next = NULL;
8595 
8596 	/* Setup DOCSIS session parameters */
8597 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
8598 
8599 	struct rte_security_session_conf sess_conf = {
8600 		.action_type = ut_params->type,
8601 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8602 		.docsis = ut_params->docsis_xform,
8603 		.crypto_xform = &ut_params->cipher_xform,
8604 	};
8605 
8606 	/* Create security session */
8607 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8608 					ts_params->session_mpool,
8609 					ts_params->session_priv_mpool);
8610 
8611 	if (!ut_params->sec_session) {
8612 		printf("TestCase %s(%d) line %d: %s\n",
8613 			__func__, i, __LINE__, "failed to allocate session");
8614 		ret = TEST_FAILED;
8615 		goto on_err;
8616 	}
8617 
8618 	/* Generate crypto op data structure */
8619 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8620 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8621 	if (!ut_params->op) {
8622 		printf("TestCase %s(%d) line %d: %s\n",
8623 			__func__, i, __LINE__,
8624 			"failed to allocate symmetric crypto operation");
8625 		ret = TEST_FAILED;
8626 		goto on_err;
8627 	}
8628 
8629 	/* Setup CRC operation parameters */
8630 	crc_len = d_td->ciphertext.no_crc == false ?
8631 			(d_td->ciphertext.len -
8632 				d_td->ciphertext.crc_offset -
8633 				RTE_ETHER_CRC_LEN) :
8634 			0;
8635 	crc_len = crc_len > 0 ? crc_len : 0;
8636 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
8637 	ut_params->op->sym->auth.data.length = crc_len;
8638 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
8639 
8640 	/* Setup cipher operation parameters */
8641 	cipher_len = d_td->ciphertext.no_cipher == false ?
8642 			(d_td->ciphertext.len -
8643 				d_td->ciphertext.cipher_offset) :
8644 			0;
8645 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8646 	ut_params->op->sym->cipher.data.length = cipher_len;
8647 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
8648 
8649 	/* Setup cipher IV */
8650 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8651 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8652 
8653 	/* Attach session to operation */
8654 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8655 
8656 	/* Set crypto operation mbufs */
8657 	ut_params->op->sym->m_src = ut_params->ibuf;
8658 	ut_params->op->sym->m_dst = NULL;
8659 
8660 	/* Process crypto operation */
8661 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8662 			NULL) {
8663 		printf("TestCase %s(%d) line %d: %s\n",
8664 			__func__, i, __LINE__,
8665 			"failed to process security crypto op");
8666 		ret = TEST_FAILED;
8667 		goto on_err;
8668 	}
8669 
8670 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8671 		printf("TestCase %s(%d) line %d: %s\n",
8672 			__func__, i, __LINE__, "crypto op processing failed");
8673 		ret = TEST_FAILED;
8674 		goto on_err;
8675 	}
8676 
8677 	/* Validate plaintext */
8678 	plaintext = ciphertext;
8679 
8680 	if (memcmp(plaintext, d_td->plaintext.data,
8681 			d_td->plaintext.len - crc_data_len)) {
8682 		printf("TestCase %s(%d) line %d: %s\n",
8683 			__func__, i, __LINE__, "plaintext not as expected\n");
8684 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
8685 				d_td->plaintext.len);
8686 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
8687 		ret = TEST_FAILED;
8688 		goto on_err;
8689 	}
8690 
8691 on_err:
8692 	rte_crypto_op_free(ut_params->op);
8693 	ut_params->op = NULL;
8694 
8695 	if (ut_params->sec_session)
8696 		rte_security_session_destroy(ctx, ut_params->sec_session);
8697 	ut_params->sec_session = NULL;
8698 
8699 	rte_pktmbuf_free(ut_params->ibuf);
8700 	ut_params->ibuf = NULL;
8701 
8702 	return ret;
8703 }
8704 
8705 static int
8706 test_docsis_proto_downlink(int i, struct docsis_test_data *d_td)
8707 {
8708 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8709 	struct crypto_unittest_params *ut_params = &unittest_params;
8710 	uint8_t *plaintext, *ciphertext;
8711 	uint8_t *iv_ptr;
8712 	int32_t cipher_len, crc_len;
8713 	int ret = TEST_SUCCESS;
8714 
8715 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8716 					rte_cryptodev_get_sec_ctx(
8717 						ts_params->valid_devs[0]);
8718 
8719 	/* Verify the capabilities */
8720 	struct rte_security_capability_idx sec_cap_idx;
8721 	const struct rte_security_capability *sec_cap;
8722 	const struct rte_cryptodev_capabilities *crypto_cap;
8723 	const struct rte_cryptodev_symmetric_capability *sym_cap;
8724 	int j = 0;
8725 
8726 	sec_cap_idx.action = ut_params->type;
8727 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
8728 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8729 
8730 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
8731 	if (sec_cap == NULL)
8732 		return -ENOTSUP;
8733 
8734 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
8735 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
8736 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
8737 				crypto_cap->sym.xform_type ==
8738 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
8739 				crypto_cap->sym.cipher.algo ==
8740 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
8741 			sym_cap = &crypto_cap->sym;
8742 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
8743 						d_td->key.len,
8744 						d_td->iv.len) == 0)
8745 				break;
8746 		}
8747 	}
8748 
8749 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
8750 		return -ENOTSUP;
8751 
8752 	/* Setup source mbuf payload */
8753 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8754 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8755 			rte_pktmbuf_tailroom(ut_params->ibuf));
8756 
8757 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8758 			d_td->plaintext.len);
8759 
8760 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
8761 
8762 	/* Setup cipher session parameters */
8763 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8764 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
8765 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
8766 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
8767 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
8768 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
8769 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8770 	ut_params->cipher_xform.next = NULL;
8771 
8772 	/* Setup DOCSIS session parameters */
8773 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
8774 
8775 	struct rte_security_session_conf sess_conf = {
8776 		.action_type = ut_params->type,
8777 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
8778 		.docsis = ut_params->docsis_xform,
8779 		.crypto_xform = &ut_params->cipher_xform,
8780 	};
8781 
8782 	/* Create security session */
8783 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
8784 					ts_params->session_mpool,
8785 					ts_params->session_priv_mpool);
8786 
8787 	if (!ut_params->sec_session) {
8788 		printf("TestCase %s(%d) line %d: %s\n",
8789 			__func__, i, __LINE__, "failed to allocate session");
8790 		ret = TEST_FAILED;
8791 		goto on_err;
8792 	}
8793 
8794 	/* Generate crypto op data structure */
8795 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8796 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8797 	if (!ut_params->op) {
8798 		printf("TestCase %s(%d) line %d: %s\n",
8799 			__func__, i, __LINE__,
8800 			"failed to allocate security crypto operation");
8801 		ret = TEST_FAILED;
8802 		goto on_err;
8803 	}
8804 
8805 	/* Setup CRC operation parameters */
8806 	crc_len = d_td->plaintext.no_crc == false ?
8807 			(d_td->plaintext.len -
8808 				d_td->plaintext.crc_offset -
8809 				RTE_ETHER_CRC_LEN) :
8810 			0;
8811 	crc_len = crc_len > 0 ? crc_len : 0;
8812 	ut_params->op->sym->auth.data.length = crc_len;
8813 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
8814 
8815 	/* Setup cipher operation parameters */
8816 	cipher_len = d_td->plaintext.no_cipher == false ?
8817 			(d_td->plaintext.len -
8818 				d_td->plaintext.cipher_offset) :
8819 			0;
8820 	cipher_len = cipher_len > 0 ? cipher_len : 0;
8821 	ut_params->op->sym->cipher.data.length = cipher_len;
8822 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
8823 
8824 	/* Setup cipher IV */
8825 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
8826 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
8827 
8828 	/* Attach session to operation */
8829 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8830 
8831 	/* Set crypto operation mbufs */
8832 	ut_params->op->sym->m_src = ut_params->ibuf;
8833 	ut_params->op->sym->m_dst = NULL;
8834 
8835 	/* Process crypto operation */
8836 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
8837 			NULL) {
8838 		printf("TestCase %s(%d) line %d: %s\n",
8839 			__func__, i, __LINE__,
8840 			"failed to process security crypto op");
8841 		ret = TEST_FAILED;
8842 		goto on_err;
8843 	}
8844 
8845 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8846 		printf("TestCase %s(%d) line %d: %s\n",
8847 			__func__, i, __LINE__, "crypto op processing failed");
8848 		ret = TEST_FAILED;
8849 		goto on_err;
8850 	}
8851 
8852 	/* Validate ciphertext */
8853 	ciphertext = plaintext;
8854 
8855 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
8856 		printf("TestCase %s(%d) line %d: %s\n",
8857 			__func__, i, __LINE__, "ciphertext not as expected\n");
8858 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
8859 				d_td->ciphertext.len);
8860 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
8861 		ret = TEST_FAILED;
8862 		goto on_err;
8863 	}
8864 
8865 on_err:
8866 	rte_crypto_op_free(ut_params->op);
8867 	ut_params->op = NULL;
8868 
8869 	if (ut_params->sec_session)
8870 		rte_security_session_destroy(ctx, ut_params->sec_session);
8871 	ut_params->sec_session = NULL;
8872 
8873 	rte_pktmbuf_free(ut_params->ibuf);
8874 	ut_params->ibuf = NULL;
8875 
8876 	return ret;
8877 }
8878 
8879 #define TEST_DOCSIS_COUNT(func) do {			\
8880 	int ret = func;					\
8881 	if (ret == TEST_SUCCESS)  {			\
8882 		printf("\t%2d)", n++);			\
8883 		printf("+++++ PASSED:" #func"\n");	\
8884 		p++;					\
8885 	} else if (ret == -ENOTSUP) {			\
8886 		printf("\t%2d)", n++);			\
8887 		printf("~~~~~ UNSUPP:" #func"\n");	\
8888 		u++;					\
8889 	} else {					\
8890 		printf("\t%2d)", n++);			\
8891 		printf("----- FAILED:" #func"\n");	\
8892 		f++;					\
8893 	}						\
8894 } while (0)
8895 
8896 static int
8897 test_DOCSIS_PROTO_uplink_all(void)
8898 {
8899 	int p = 0, u = 0, f = 0, n = 0;
8900 
8901 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(1, &docsis_test_case_1));
8902 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(2, &docsis_test_case_2));
8903 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(3, &docsis_test_case_3));
8904 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(4, &docsis_test_case_4));
8905 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(5, &docsis_test_case_5));
8906 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(6, &docsis_test_case_6));
8907 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(7, &docsis_test_case_7));
8908 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(8, &docsis_test_case_8));
8909 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(9, &docsis_test_case_9));
8910 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(10, &docsis_test_case_10));
8911 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(11, &docsis_test_case_11));
8912 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(12, &docsis_test_case_12));
8913 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(13, &docsis_test_case_13));
8914 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(14, &docsis_test_case_14));
8915 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(15, &docsis_test_case_15));
8916 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(16, &docsis_test_case_16));
8917 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(17, &docsis_test_case_17));
8918 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(18, &docsis_test_case_18));
8919 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(19, &docsis_test_case_19));
8920 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(20, &docsis_test_case_20));
8921 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(21, &docsis_test_case_21));
8922 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(22, &docsis_test_case_22));
8923 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(23, &docsis_test_case_23));
8924 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(24, &docsis_test_case_24));
8925 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(25, &docsis_test_case_25));
8926 	TEST_DOCSIS_COUNT(test_docsis_proto_uplink(26, &docsis_test_case_26));
8927 
8928 	if (f)
8929 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8930 			__func__, p, n, u);
8931 
8932 	return f;
8933 };
8934 
8935 static int
8936 test_DOCSIS_PROTO_downlink_all(void)
8937 {
8938 	int p = 0, u = 0, f = 0, n = 0;
8939 
8940 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(1, &docsis_test_case_1));
8941 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(2, &docsis_test_case_2));
8942 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(3, &docsis_test_case_3));
8943 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(4, &docsis_test_case_4));
8944 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(5, &docsis_test_case_5));
8945 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(6, &docsis_test_case_6));
8946 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(7, &docsis_test_case_7));
8947 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(8, &docsis_test_case_8));
8948 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(9, &docsis_test_case_9));
8949 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(10, &docsis_test_case_10));
8950 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(11, &docsis_test_case_11));
8951 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(12, &docsis_test_case_12));
8952 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(13, &docsis_test_case_13));
8953 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(14, &docsis_test_case_14));
8954 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(15, &docsis_test_case_15));
8955 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(16, &docsis_test_case_16));
8956 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(17, &docsis_test_case_17));
8957 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(18, &docsis_test_case_18));
8958 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(19, &docsis_test_case_19));
8959 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(20, &docsis_test_case_20));
8960 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(21, &docsis_test_case_21));
8961 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(22, &docsis_test_case_22));
8962 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(23, &docsis_test_case_23));
8963 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(24, &docsis_test_case_24));
8964 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(25, &docsis_test_case_25));
8965 	TEST_DOCSIS_COUNT(test_docsis_proto_downlink(26, &docsis_test_case_26));
8966 
8967 	if (f)
8968 		printf("## %s: %d passed out of %d (%d unsupported)\n",
8969 			__func__, p, n, u);
8970 
8971 	return f;
8972 };
8973 
8974 static int
8975 test_DOCSIS_PROTO_all(void)
8976 {
8977 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8978 	struct crypto_unittest_params *ut_params = &unittest_params;
8979 	struct rte_cryptodev_info dev_info;
8980 	int status;
8981 
8982 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8983 	uint64_t feat_flags = dev_info.feature_flags;
8984 
8985 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
8986 		return -ENOTSUP;
8987 
8988 	/* Set action type */
8989 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
8990 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
8991 		gbl_action_type;
8992 
8993 	if (security_proto_supported(ut_params->type,
8994 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
8995 		return -ENOTSUP;
8996 
8997 	status = test_DOCSIS_PROTO_uplink_all();
8998 	status += test_DOCSIS_PROTO_downlink_all();
8999 
9000 	if (status)
9001 		return TEST_FAILED;
9002 	else
9003 		return TEST_SUCCESS;
9004 }
9005 #endif
9006 
9007 static int
9008 test_AES_GCM_authenticated_encryption_test_case_1(void)
9009 {
9010 	return test_authenticated_encryption(&gcm_test_case_1);
9011 }
9012 
9013 static int
9014 test_AES_GCM_authenticated_encryption_test_case_2(void)
9015 {
9016 	return test_authenticated_encryption(&gcm_test_case_2);
9017 }
9018 
9019 static int
9020 test_AES_GCM_authenticated_encryption_test_case_3(void)
9021 {
9022 	return test_authenticated_encryption(&gcm_test_case_3);
9023 }
9024 
9025 static int
9026 test_AES_GCM_authenticated_encryption_test_case_4(void)
9027 {
9028 	return test_authenticated_encryption(&gcm_test_case_4);
9029 }
9030 
9031 static int
9032 test_AES_GCM_authenticated_encryption_test_case_5(void)
9033 {
9034 	return test_authenticated_encryption(&gcm_test_case_5);
9035 }
9036 
9037 static int
9038 test_AES_GCM_authenticated_encryption_test_case_6(void)
9039 {
9040 	return test_authenticated_encryption(&gcm_test_case_6);
9041 }
9042 
9043 static int
9044 test_AES_GCM_authenticated_encryption_test_case_7(void)
9045 {
9046 	return test_authenticated_encryption(&gcm_test_case_7);
9047 }
9048 
9049 static int
9050 test_AES_GCM_authenticated_encryption_test_case_8(void)
9051 {
9052 	return test_authenticated_encryption(&gcm_test_case_8);
9053 }
9054 
9055 static int
9056 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
9057 {
9058 	return test_authenticated_encryption(&gcm_J0_test_case_1);
9059 }
9060 
9061 static int
9062 test_AES_GCM_auth_encryption_test_case_192_1(void)
9063 {
9064 	return test_authenticated_encryption(&gcm_test_case_192_1);
9065 }
9066 
9067 static int
9068 test_AES_GCM_auth_encryption_test_case_192_2(void)
9069 {
9070 	return test_authenticated_encryption(&gcm_test_case_192_2);
9071 }
9072 
9073 static int
9074 test_AES_GCM_auth_encryption_test_case_192_3(void)
9075 {
9076 	return test_authenticated_encryption(&gcm_test_case_192_3);
9077 }
9078 
9079 static int
9080 test_AES_GCM_auth_encryption_test_case_192_4(void)
9081 {
9082 	return test_authenticated_encryption(&gcm_test_case_192_4);
9083 }
9084 
9085 static int
9086 test_AES_GCM_auth_encryption_test_case_192_5(void)
9087 {
9088 	return test_authenticated_encryption(&gcm_test_case_192_5);
9089 }
9090 
9091 static int
9092 test_AES_GCM_auth_encryption_test_case_192_6(void)
9093 {
9094 	return test_authenticated_encryption(&gcm_test_case_192_6);
9095 }
9096 
9097 static int
9098 test_AES_GCM_auth_encryption_test_case_192_7(void)
9099 {
9100 	return test_authenticated_encryption(&gcm_test_case_192_7);
9101 }
9102 
9103 static int
9104 test_AES_GCM_auth_encryption_test_case_256_1(void)
9105 {
9106 	return test_authenticated_encryption(&gcm_test_case_256_1);
9107 }
9108 
9109 static int
9110 test_AES_GCM_auth_encryption_test_case_256_2(void)
9111 {
9112 	return test_authenticated_encryption(&gcm_test_case_256_2);
9113 }
9114 
9115 static int
9116 test_AES_GCM_auth_encryption_test_case_256_3(void)
9117 {
9118 	return test_authenticated_encryption(&gcm_test_case_256_3);
9119 }
9120 
9121 static int
9122 test_AES_GCM_auth_encryption_test_case_256_4(void)
9123 {
9124 	return test_authenticated_encryption(&gcm_test_case_256_4);
9125 }
9126 
9127 static int
9128 test_AES_GCM_auth_encryption_test_case_256_5(void)
9129 {
9130 	return test_authenticated_encryption(&gcm_test_case_256_5);
9131 }
9132 
9133 static int
9134 test_AES_GCM_auth_encryption_test_case_256_6(void)
9135 {
9136 	return test_authenticated_encryption(&gcm_test_case_256_6);
9137 }
9138 
9139 static int
9140 test_AES_GCM_auth_encryption_test_case_256_7(void)
9141 {
9142 	return test_authenticated_encryption(&gcm_test_case_256_7);
9143 }
9144 
9145 static int
9146 test_AES_GCM_auth_encryption_test_case_aad_1(void)
9147 {
9148 	return test_authenticated_encryption(&gcm_test_case_aad_1);
9149 }
9150 
9151 static int
9152 test_AES_GCM_auth_encryption_test_case_aad_2(void)
9153 {
9154 	return test_authenticated_encryption(&gcm_test_case_aad_2);
9155 }
9156 
9157 static int
9158 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
9159 {
9160 	struct aead_test_data tdata;
9161 	int res;
9162 
9163 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9164 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9165 	tdata.iv.data[0] += 1;
9166 	res = test_authenticated_encryption(&tdata);
9167 	if (res == -ENOTSUP)
9168 		return res;
9169 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9170 	return TEST_SUCCESS;
9171 }
9172 
9173 static int
9174 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
9175 {
9176 	struct aead_test_data tdata;
9177 	int res;
9178 
9179 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9180 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9181 	tdata.plaintext.data[0] += 1;
9182 	res = test_authenticated_encryption(&tdata);
9183 	if (res == -ENOTSUP)
9184 		return res;
9185 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9186 	return TEST_SUCCESS;
9187 }
9188 
9189 static int
9190 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
9191 {
9192 	struct aead_test_data tdata;
9193 	int res;
9194 
9195 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9196 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9197 	tdata.ciphertext.data[0] += 1;
9198 	res = test_authenticated_encryption(&tdata);
9199 	if (res == -ENOTSUP)
9200 		return res;
9201 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9202 	return TEST_SUCCESS;
9203 }
9204 
9205 static int
9206 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
9207 {
9208 	struct aead_test_data tdata;
9209 	int res;
9210 
9211 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9212 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9213 	tdata.aad.len += 1;
9214 	res = test_authenticated_encryption(&tdata);
9215 	if (res == -ENOTSUP)
9216 		return res;
9217 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9218 	return TEST_SUCCESS;
9219 }
9220 
9221 static int
9222 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
9223 {
9224 	struct aead_test_data tdata;
9225 	uint8_t aad[gcm_test_case_7.aad.len];
9226 	int res;
9227 
9228 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9229 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9230 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9231 	aad[0] += 1;
9232 	tdata.aad.data = aad;
9233 	res = test_authenticated_encryption(&tdata);
9234 	if (res == -ENOTSUP)
9235 		return res;
9236 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9237 	return TEST_SUCCESS;
9238 }
9239 
9240 static int
9241 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
9242 {
9243 	struct aead_test_data tdata;
9244 	int res;
9245 
9246 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9247 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9248 	tdata.auth_tag.data[0] += 1;
9249 	res = test_authenticated_encryption(&tdata);
9250 	if (res == -ENOTSUP)
9251 		return res;
9252 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
9253 	return TEST_SUCCESS;
9254 }
9255 
9256 static int
9257 test_authenticated_decryption(const struct aead_test_data *tdata)
9258 {
9259 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9260 	struct crypto_unittest_params *ut_params = &unittest_params;
9261 
9262 	int retval;
9263 	uint8_t *plaintext;
9264 	uint32_t i;
9265 	struct rte_cryptodev_info dev_info;
9266 
9267 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9268 	uint64_t feat_flags = dev_info.feature_flags;
9269 
9270 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9271 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9272 		printf("Device doesn't support RAW data-path APIs.\n");
9273 		return -ENOTSUP;
9274 	}
9275 
9276 	/* Verify the capabilities */
9277 	struct rte_cryptodev_sym_capability_idx cap_idx;
9278 	const struct rte_cryptodev_symmetric_capability *capability;
9279 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9280 	cap_idx.algo.aead = tdata->algo;
9281 	capability = rte_cryptodev_sym_capability_get(
9282 			ts_params->valid_devs[0], &cap_idx);
9283 	if (capability == NULL)
9284 		return -ENOTSUP;
9285 	if (rte_cryptodev_sym_capability_check_aead(
9286 			capability, tdata->key.len, tdata->auth_tag.len,
9287 			tdata->aad.len, tdata->iv.len))
9288 		return -ENOTSUP;
9289 
9290 	/* Create AEAD session */
9291 	retval = create_aead_session(ts_params->valid_devs[0],
9292 			tdata->algo,
9293 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9294 			tdata->key.data, tdata->key.len,
9295 			tdata->aad.len, tdata->auth_tag.len,
9296 			tdata->iv.len);
9297 	if (retval < 0)
9298 		return retval;
9299 
9300 	/* alloc mbuf and set payload */
9301 	if (tdata->aad.len > MBUF_SIZE) {
9302 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
9303 		/* Populate full size of add data */
9304 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
9305 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
9306 	} else
9307 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9308 
9309 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9310 			rte_pktmbuf_tailroom(ut_params->ibuf));
9311 
9312 	/* Create AEAD operation */
9313 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9314 	if (retval < 0)
9315 		return retval;
9316 
9317 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9318 
9319 	ut_params->op->sym->m_src = ut_params->ibuf;
9320 
9321 	/* Process crypto operation */
9322 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9323 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
9324 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9325 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9326 				ut_params->op, 0, 0, 0, 0);
9327 	else
9328 		TEST_ASSERT_NOT_NULL(
9329 			process_crypto_request(ts_params->valid_devs[0],
9330 			ut_params->op), "failed to process sym crypto op");
9331 
9332 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9333 			"crypto op processing failed");
9334 
9335 	if (ut_params->op->sym->m_dst)
9336 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
9337 				uint8_t *);
9338 	else
9339 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
9340 				uint8_t *,
9341 				ut_params->op->sym->cipher.data.offset);
9342 
9343 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9344 
9345 	/* Validate obuf */
9346 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9347 			plaintext,
9348 			tdata->plaintext.data,
9349 			tdata->plaintext.len,
9350 			"Plaintext data not as expected");
9351 
9352 	TEST_ASSERT_EQUAL(ut_params->op->status,
9353 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9354 			"Authentication failed");
9355 
9356 	return 0;
9357 }
9358 
9359 static int
9360 test_AES_GCM_authenticated_decryption_test_case_1(void)
9361 {
9362 	return test_authenticated_decryption(&gcm_test_case_1);
9363 }
9364 
9365 static int
9366 test_AES_GCM_authenticated_decryption_test_case_2(void)
9367 {
9368 	return test_authenticated_decryption(&gcm_test_case_2);
9369 }
9370 
9371 static int
9372 test_AES_GCM_authenticated_decryption_test_case_3(void)
9373 {
9374 	return test_authenticated_decryption(&gcm_test_case_3);
9375 }
9376 
9377 static int
9378 test_AES_GCM_authenticated_decryption_test_case_4(void)
9379 {
9380 	return test_authenticated_decryption(&gcm_test_case_4);
9381 }
9382 
9383 static int
9384 test_AES_GCM_authenticated_decryption_test_case_5(void)
9385 {
9386 	return test_authenticated_decryption(&gcm_test_case_5);
9387 }
9388 
9389 static int
9390 test_AES_GCM_authenticated_decryption_test_case_6(void)
9391 {
9392 	return test_authenticated_decryption(&gcm_test_case_6);
9393 }
9394 
9395 static int
9396 test_AES_GCM_authenticated_decryption_test_case_7(void)
9397 {
9398 	return test_authenticated_decryption(&gcm_test_case_7);
9399 }
9400 
9401 static int
9402 test_AES_GCM_authenticated_decryption_test_case_8(void)
9403 {
9404 	return test_authenticated_decryption(&gcm_test_case_8);
9405 }
9406 
9407 static int
9408 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
9409 {
9410 	return test_authenticated_decryption(&gcm_J0_test_case_1);
9411 }
9412 
9413 static int
9414 test_AES_GCM_auth_decryption_test_case_192_1(void)
9415 {
9416 	return test_authenticated_decryption(&gcm_test_case_192_1);
9417 }
9418 
9419 static int
9420 test_AES_GCM_auth_decryption_test_case_192_2(void)
9421 {
9422 	return test_authenticated_decryption(&gcm_test_case_192_2);
9423 }
9424 
9425 static int
9426 test_AES_GCM_auth_decryption_test_case_192_3(void)
9427 {
9428 	return test_authenticated_decryption(&gcm_test_case_192_3);
9429 }
9430 
9431 static int
9432 test_AES_GCM_auth_decryption_test_case_192_4(void)
9433 {
9434 	return test_authenticated_decryption(&gcm_test_case_192_4);
9435 }
9436 
9437 static int
9438 test_AES_GCM_auth_decryption_test_case_192_5(void)
9439 {
9440 	return test_authenticated_decryption(&gcm_test_case_192_5);
9441 }
9442 
9443 static int
9444 test_AES_GCM_auth_decryption_test_case_192_6(void)
9445 {
9446 	return test_authenticated_decryption(&gcm_test_case_192_6);
9447 }
9448 
9449 static int
9450 test_AES_GCM_auth_decryption_test_case_192_7(void)
9451 {
9452 	return test_authenticated_decryption(&gcm_test_case_192_7);
9453 }
9454 
9455 static int
9456 test_AES_GCM_auth_decryption_test_case_256_1(void)
9457 {
9458 	return test_authenticated_decryption(&gcm_test_case_256_1);
9459 }
9460 
9461 static int
9462 test_AES_GCM_auth_decryption_test_case_256_2(void)
9463 {
9464 	return test_authenticated_decryption(&gcm_test_case_256_2);
9465 }
9466 
9467 static int
9468 test_AES_GCM_auth_decryption_test_case_256_3(void)
9469 {
9470 	return test_authenticated_decryption(&gcm_test_case_256_3);
9471 }
9472 
9473 static int
9474 test_AES_GCM_auth_decryption_test_case_256_4(void)
9475 {
9476 	return test_authenticated_decryption(&gcm_test_case_256_4);
9477 }
9478 
9479 static int
9480 test_AES_GCM_auth_decryption_test_case_256_5(void)
9481 {
9482 	return test_authenticated_decryption(&gcm_test_case_256_5);
9483 }
9484 
9485 static int
9486 test_AES_GCM_auth_decryption_test_case_256_6(void)
9487 {
9488 	return test_authenticated_decryption(&gcm_test_case_256_6);
9489 }
9490 
9491 static int
9492 test_AES_GCM_auth_decryption_test_case_256_7(void)
9493 {
9494 	return test_authenticated_decryption(&gcm_test_case_256_7);
9495 }
9496 
9497 static int
9498 test_AES_GCM_auth_decryption_test_case_aad_1(void)
9499 {
9500 	return test_authenticated_decryption(&gcm_test_case_aad_1);
9501 }
9502 
9503 static int
9504 test_AES_GCM_auth_decryption_test_case_aad_2(void)
9505 {
9506 	return test_authenticated_decryption(&gcm_test_case_aad_2);
9507 }
9508 
9509 static int
9510 test_AES_GCM_auth_decryption_fail_iv_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.iv.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_in_data_corrupt(void)
9526 {
9527 	struct aead_test_data tdata;
9528 	int res;
9529 
9530 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
9531 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9532 	tdata.plaintext.data[0] += 1;
9533 	res = test_authenticated_decryption(&tdata);
9534 	if (res == -ENOTSUP)
9535 		return res;
9536 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9537 	return TEST_SUCCESS;
9538 }
9539 
9540 static int
9541 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
9542 {
9543 	struct aead_test_data tdata;
9544 	int res;
9545 
9546 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9547 	tdata.ciphertext.data[0] += 1;
9548 	res = test_authenticated_decryption(&tdata);
9549 	if (res == -ENOTSUP)
9550 		return res;
9551 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9552 	return TEST_SUCCESS;
9553 }
9554 
9555 static int
9556 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
9557 {
9558 	struct aead_test_data tdata;
9559 	int res;
9560 
9561 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9562 	tdata.aad.len += 1;
9563 	res = test_authenticated_decryption(&tdata);
9564 	if (res == -ENOTSUP)
9565 		return res;
9566 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9567 	return TEST_SUCCESS;
9568 }
9569 
9570 static int
9571 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
9572 {
9573 	struct aead_test_data tdata;
9574 	uint8_t aad[gcm_test_case_7.aad.len];
9575 	int res;
9576 
9577 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9578 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
9579 	aad[0] += 1;
9580 	tdata.aad.data = aad;
9581 	res = test_authenticated_decryption(&tdata);
9582 	if (res == -ENOTSUP)
9583 		return res;
9584 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
9585 	return TEST_SUCCESS;
9586 }
9587 
9588 static int
9589 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
9590 {
9591 	struct aead_test_data tdata;
9592 	int res;
9593 
9594 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
9595 	tdata.auth_tag.data[0] += 1;
9596 	res = test_authenticated_decryption(&tdata);
9597 	if (res == -ENOTSUP)
9598 		return res;
9599 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
9600 	return TEST_SUCCESS;
9601 }
9602 
9603 static int
9604 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
9605 {
9606 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9607 	struct crypto_unittest_params *ut_params = &unittest_params;
9608 
9609 	int retval;
9610 	uint8_t *ciphertext, *auth_tag;
9611 	uint16_t plaintext_pad_len;
9612 
9613 	/* Verify the capabilities */
9614 	struct rte_cryptodev_sym_capability_idx cap_idx;
9615 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9616 	cap_idx.algo.aead = tdata->algo;
9617 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9618 			&cap_idx) == NULL)
9619 		return -ENOTSUP;
9620 
9621 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9622 		return -ENOTSUP;
9623 
9624 	/* not supported with CPU crypto */
9625 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9626 		return -ENOTSUP;
9627 
9628 	/* Create AEAD session */
9629 	retval = create_aead_session(ts_params->valid_devs[0],
9630 			tdata->algo,
9631 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9632 			tdata->key.data, tdata->key.len,
9633 			tdata->aad.len, tdata->auth_tag.len,
9634 			tdata->iv.len);
9635 	if (retval < 0)
9636 		return retval;
9637 
9638 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9639 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9640 
9641 	/* clear mbuf payload */
9642 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9643 			rte_pktmbuf_tailroom(ut_params->ibuf));
9644 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9645 			rte_pktmbuf_tailroom(ut_params->obuf));
9646 
9647 	/* Create AEAD operation */
9648 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9649 	if (retval < 0)
9650 		return retval;
9651 
9652 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9653 
9654 	ut_params->op->sym->m_src = ut_params->ibuf;
9655 	ut_params->op->sym->m_dst = ut_params->obuf;
9656 
9657 	/* Process crypto operation */
9658 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9659 			ut_params->op), "failed to process sym crypto op");
9660 
9661 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9662 			"crypto op processing failed");
9663 
9664 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9665 
9666 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9667 			ut_params->op->sym->cipher.data.offset);
9668 	auth_tag = ciphertext + plaintext_pad_len;
9669 
9670 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9671 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9672 
9673 	/* Validate obuf */
9674 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9675 			ciphertext,
9676 			tdata->ciphertext.data,
9677 			tdata->ciphertext.len,
9678 			"Ciphertext data not as expected");
9679 
9680 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9681 			auth_tag,
9682 			tdata->auth_tag.data,
9683 			tdata->auth_tag.len,
9684 			"Generated auth tag not as expected");
9685 
9686 	return 0;
9687 
9688 }
9689 
9690 static int
9691 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
9692 {
9693 	return test_authenticated_encryption_oop(&gcm_test_case_5);
9694 }
9695 
9696 static int
9697 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
9698 {
9699 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9700 	struct crypto_unittest_params *ut_params = &unittest_params;
9701 
9702 	int retval;
9703 	uint8_t *plaintext;
9704 
9705 	/* Verify the capabilities */
9706 	struct rte_cryptodev_sym_capability_idx cap_idx;
9707 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9708 	cap_idx.algo.aead = tdata->algo;
9709 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9710 			&cap_idx) == NULL)
9711 		return -ENOTSUP;
9712 
9713 	/* not supported with CPU crypto and raw data-path APIs*/
9714 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
9715 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
9716 		return -ENOTSUP;
9717 
9718 	/* Create AEAD session */
9719 	retval = create_aead_session(ts_params->valid_devs[0],
9720 			tdata->algo,
9721 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9722 			tdata->key.data, tdata->key.len,
9723 			tdata->aad.len, tdata->auth_tag.len,
9724 			tdata->iv.len);
9725 	if (retval < 0)
9726 		return retval;
9727 
9728 	/* alloc mbuf and set payload */
9729 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9730 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9731 
9732 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9733 			rte_pktmbuf_tailroom(ut_params->ibuf));
9734 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
9735 			rte_pktmbuf_tailroom(ut_params->obuf));
9736 
9737 	/* Create AEAD operation */
9738 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9739 	if (retval < 0)
9740 		return retval;
9741 
9742 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
9743 
9744 	ut_params->op->sym->m_src = ut_params->ibuf;
9745 	ut_params->op->sym->m_dst = ut_params->obuf;
9746 
9747 	/* Process crypto operation */
9748 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9749 			ut_params->op), "failed to process sym crypto op");
9750 
9751 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9752 			"crypto op processing failed");
9753 
9754 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
9755 			ut_params->op->sym->cipher.data.offset);
9756 
9757 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9758 
9759 	/* Validate obuf */
9760 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9761 			plaintext,
9762 			tdata->plaintext.data,
9763 			tdata->plaintext.len,
9764 			"Plaintext data not as expected");
9765 
9766 	TEST_ASSERT_EQUAL(ut_params->op->status,
9767 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9768 			"Authentication failed");
9769 	return 0;
9770 }
9771 
9772 static int
9773 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
9774 {
9775 	return test_authenticated_decryption_oop(&gcm_test_case_5);
9776 }
9777 
9778 static int
9779 test_authenticated_encryption_sessionless(
9780 		const struct aead_test_data *tdata)
9781 {
9782 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9783 	struct crypto_unittest_params *ut_params = &unittest_params;
9784 
9785 	int retval;
9786 	uint8_t *ciphertext, *auth_tag;
9787 	uint16_t plaintext_pad_len;
9788 	uint8_t key[tdata->key.len + 1];
9789 	struct rte_cryptodev_info dev_info;
9790 
9791 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9792 	uint64_t feat_flags = dev_info.feature_flags;
9793 
9794 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9795 		printf("Device doesn't support Sessionless ops.\n");
9796 		return -ENOTSUP;
9797 	}
9798 
9799 	/* not supported with CPU crypto */
9800 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9801 		return -ENOTSUP;
9802 
9803 	/* Verify the capabilities */
9804 	struct rte_cryptodev_sym_capability_idx cap_idx;
9805 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9806 	cap_idx.algo.aead = tdata->algo;
9807 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9808 			&cap_idx) == NULL)
9809 		return -ENOTSUP;
9810 
9811 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9812 
9813 	/* clear mbuf payload */
9814 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9815 			rte_pktmbuf_tailroom(ut_params->ibuf));
9816 
9817 	/* Create AEAD operation */
9818 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
9819 	if (retval < 0)
9820 		return retval;
9821 
9822 	/* Create GCM xform */
9823 	memcpy(key, tdata->key.data, tdata->key.len);
9824 	retval = create_aead_xform(ut_params->op,
9825 			tdata->algo,
9826 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
9827 			key, tdata->key.len,
9828 			tdata->aad.len, tdata->auth_tag.len,
9829 			tdata->iv.len);
9830 	if (retval < 0)
9831 		return retval;
9832 
9833 	ut_params->op->sym->m_src = ut_params->ibuf;
9834 
9835 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9836 			RTE_CRYPTO_OP_SESSIONLESS,
9837 			"crypto op session type not sessionless");
9838 
9839 	/* Process crypto operation */
9840 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
9841 			ut_params->op), "failed to process sym crypto op");
9842 
9843 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9844 
9845 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9846 			"crypto op status not success");
9847 
9848 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
9849 
9850 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9851 			ut_params->op->sym->cipher.data.offset);
9852 	auth_tag = ciphertext + plaintext_pad_len;
9853 
9854 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
9855 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
9856 
9857 	/* Validate obuf */
9858 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9859 			ciphertext,
9860 			tdata->ciphertext.data,
9861 			tdata->ciphertext.len,
9862 			"Ciphertext data not as expected");
9863 
9864 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9865 			auth_tag,
9866 			tdata->auth_tag.data,
9867 			tdata->auth_tag.len,
9868 			"Generated auth tag not as expected");
9869 
9870 	return 0;
9871 
9872 }
9873 
9874 static int
9875 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
9876 {
9877 	return test_authenticated_encryption_sessionless(
9878 			&gcm_test_case_5);
9879 }
9880 
9881 static int
9882 test_authenticated_decryption_sessionless(
9883 		const struct aead_test_data *tdata)
9884 {
9885 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9886 	struct crypto_unittest_params *ut_params = &unittest_params;
9887 
9888 	int retval;
9889 	uint8_t *plaintext;
9890 	uint8_t key[tdata->key.len + 1];
9891 	struct rte_cryptodev_info dev_info;
9892 
9893 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
9894 	uint64_t feat_flags = dev_info.feature_flags;
9895 
9896 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
9897 		printf("Device doesn't support Sessionless ops.\n");
9898 		return -ENOTSUP;
9899 	}
9900 
9901 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
9902 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
9903 		printf("Device doesn't support RAW data-path APIs.\n");
9904 		return -ENOTSUP;
9905 	}
9906 
9907 	/* not supported with CPU crypto */
9908 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
9909 		return -ENOTSUP;
9910 
9911 	/* Verify the capabilities */
9912 	struct rte_cryptodev_sym_capability_idx cap_idx;
9913 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
9914 	cap_idx.algo.aead = tdata->algo;
9915 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
9916 			&cap_idx) == NULL)
9917 		return -ENOTSUP;
9918 
9919 	/* alloc mbuf and set payload */
9920 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9921 
9922 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9923 			rte_pktmbuf_tailroom(ut_params->ibuf));
9924 
9925 	/* Create AEAD operation */
9926 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
9927 	if (retval < 0)
9928 		return retval;
9929 
9930 	/* Create AEAD xform */
9931 	memcpy(key, tdata->key.data, tdata->key.len);
9932 	retval = create_aead_xform(ut_params->op,
9933 			tdata->algo,
9934 			RTE_CRYPTO_AEAD_OP_DECRYPT,
9935 			key, tdata->key.len,
9936 			tdata->aad.len, tdata->auth_tag.len,
9937 			tdata->iv.len);
9938 	if (retval < 0)
9939 		return retval;
9940 
9941 	ut_params->op->sym->m_src = ut_params->ibuf;
9942 
9943 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
9944 			RTE_CRYPTO_OP_SESSIONLESS,
9945 			"crypto op session type not sessionless");
9946 
9947 	/* Process crypto operation */
9948 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
9949 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
9950 				ut_params->op, 0, 0, 0, 0);
9951 	else
9952 		TEST_ASSERT_NOT_NULL(process_crypto_request(
9953 			ts_params->valid_devs[0], ut_params->op),
9954 				"failed to process sym crypto op");
9955 
9956 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
9957 
9958 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
9959 			"crypto op status not success");
9960 
9961 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
9962 			ut_params->op->sym->cipher.data.offset);
9963 
9964 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
9965 
9966 	/* Validate obuf */
9967 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
9968 			plaintext,
9969 			tdata->plaintext.data,
9970 			tdata->plaintext.len,
9971 			"Plaintext data not as expected");
9972 
9973 	TEST_ASSERT_EQUAL(ut_params->op->status,
9974 			RTE_CRYPTO_OP_STATUS_SUCCESS,
9975 			"Authentication failed");
9976 	return 0;
9977 }
9978 
9979 static int
9980 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
9981 {
9982 	return test_authenticated_decryption_sessionless(
9983 			&gcm_test_case_5);
9984 }
9985 
9986 static int
9987 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
9988 {
9989 	return test_authenticated_encryption(&ccm_test_case_128_1);
9990 }
9991 
9992 static int
9993 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
9994 {
9995 	return test_authenticated_encryption(&ccm_test_case_128_2);
9996 }
9997 
9998 static int
9999 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
10000 {
10001 	return test_authenticated_encryption(&ccm_test_case_128_3);
10002 }
10003 
10004 static int
10005 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
10006 {
10007 	return test_authenticated_decryption(&ccm_test_case_128_1);
10008 }
10009 
10010 static int
10011 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
10012 {
10013 	return test_authenticated_decryption(&ccm_test_case_128_2);
10014 }
10015 
10016 static int
10017 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
10018 {
10019 	return test_authenticated_decryption(&ccm_test_case_128_3);
10020 }
10021 
10022 static int
10023 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
10024 {
10025 	return test_authenticated_encryption(&ccm_test_case_192_1);
10026 }
10027 
10028 static int
10029 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
10030 {
10031 	return test_authenticated_encryption(&ccm_test_case_192_2);
10032 }
10033 
10034 static int
10035 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
10036 {
10037 	return test_authenticated_encryption(&ccm_test_case_192_3);
10038 }
10039 
10040 static int
10041 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
10042 {
10043 	return test_authenticated_decryption(&ccm_test_case_192_1);
10044 }
10045 
10046 static int
10047 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
10048 {
10049 	return test_authenticated_decryption(&ccm_test_case_192_2);
10050 }
10051 
10052 static int
10053 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
10054 {
10055 	return test_authenticated_decryption(&ccm_test_case_192_3);
10056 }
10057 
10058 static int
10059 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
10060 {
10061 	return test_authenticated_encryption(&ccm_test_case_256_1);
10062 }
10063 
10064 static int
10065 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
10066 {
10067 	return test_authenticated_encryption(&ccm_test_case_256_2);
10068 }
10069 
10070 static int
10071 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
10072 {
10073 	return test_authenticated_encryption(&ccm_test_case_256_3);
10074 }
10075 
10076 static int
10077 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
10078 {
10079 	return test_authenticated_decryption(&ccm_test_case_256_1);
10080 }
10081 
10082 static int
10083 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
10084 {
10085 	return test_authenticated_decryption(&ccm_test_case_256_2);
10086 }
10087 
10088 static int
10089 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
10090 {
10091 	return test_authenticated_decryption(&ccm_test_case_256_3);
10092 }
10093 
10094 static int
10095 test_stats(void)
10096 {
10097 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10098 	struct rte_cryptodev_stats stats;
10099 
10100 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10101 		return -ENOTSUP;
10102 
10103 	/* Verify the capabilities */
10104 	struct rte_cryptodev_sym_capability_idx cap_idx;
10105 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10106 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
10107 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10108 			&cap_idx) == NULL)
10109 		return -ENOTSUP;
10110 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10111 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10112 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10113 			&cap_idx) == NULL)
10114 		return -ENOTSUP;
10115 
10116 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
10117 			== -ENOTSUP)
10118 		return -ENOTSUP;
10119 
10120 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10121 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
10122 			&stats) == -ENODEV),
10123 		"rte_cryptodev_stats_get invalid dev failed");
10124 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
10125 		"rte_cryptodev_stats_get invalid Param failed");
10126 
10127 	/* Test expected values */
10128 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
10129 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10130 			&stats),
10131 		"rte_cryptodev_stats_get failed");
10132 	TEST_ASSERT((stats.enqueued_count == 1),
10133 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10134 	TEST_ASSERT((stats.dequeued_count == 1),
10135 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10136 	TEST_ASSERT((stats.enqueue_err_count == 0),
10137 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10138 	TEST_ASSERT((stats.dequeue_err_count == 0),
10139 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10140 
10141 	/* invalid device but should ignore and not reset device stats*/
10142 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
10143 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10144 			&stats),
10145 		"rte_cryptodev_stats_get failed");
10146 	TEST_ASSERT((stats.enqueued_count == 1),
10147 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10148 
10149 	/* check that a valid reset clears stats */
10150 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
10151 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
10152 			&stats),
10153 					  "rte_cryptodev_stats_get failed");
10154 	TEST_ASSERT((stats.enqueued_count == 0),
10155 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10156 	TEST_ASSERT((stats.dequeued_count == 0),
10157 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
10158 
10159 	return TEST_SUCCESS;
10160 }
10161 
10162 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
10163 				   struct crypto_unittest_params *ut_params,
10164 				   enum rte_crypto_auth_operation op,
10165 				   const struct HMAC_MD5_vector *test_case)
10166 {
10167 	uint8_t key[64];
10168 
10169 	memcpy(key, test_case->key.data, test_case->key.len);
10170 
10171 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10172 	ut_params->auth_xform.next = NULL;
10173 	ut_params->auth_xform.auth.op = op;
10174 
10175 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
10176 
10177 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
10178 	ut_params->auth_xform.auth.key.length = test_case->key.len;
10179 	ut_params->auth_xform.auth.key.data = key;
10180 
10181 	ut_params->sess = rte_cryptodev_sym_session_create(
10182 			ts_params->session_mpool);
10183 
10184 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10185 			ut_params->sess, &ut_params->auth_xform,
10186 			ts_params->session_priv_mpool);
10187 
10188 	if (ut_params->sess == NULL)
10189 		return TEST_FAILED;
10190 
10191 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10192 
10193 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10194 			rte_pktmbuf_tailroom(ut_params->ibuf));
10195 
10196 	return 0;
10197 }
10198 
10199 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
10200 			      const struct HMAC_MD5_vector *test_case,
10201 			      uint8_t **plaintext)
10202 {
10203 	uint16_t plaintext_pad_len;
10204 
10205 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
10206 
10207 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10208 				16);
10209 
10210 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10211 			plaintext_pad_len);
10212 	memcpy(*plaintext, test_case->plaintext.data,
10213 			test_case->plaintext.len);
10214 
10215 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
10216 			ut_params->ibuf, MD5_DIGEST_LEN);
10217 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
10218 			"no room to append digest");
10219 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
10220 			ut_params->ibuf, plaintext_pad_len);
10221 
10222 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
10223 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
10224 			   test_case->auth_tag.len);
10225 	}
10226 
10227 	sym_op->auth.data.offset = 0;
10228 	sym_op->auth.data.length = test_case->plaintext.len;
10229 
10230 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10231 	ut_params->op->sym->m_src = ut_params->ibuf;
10232 
10233 	return 0;
10234 }
10235 
10236 static int
10237 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
10238 {
10239 	uint16_t plaintext_pad_len;
10240 	uint8_t *plaintext, *auth_tag;
10241 
10242 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10243 	struct crypto_unittest_params *ut_params = &unittest_params;
10244 	struct rte_cryptodev_info dev_info;
10245 
10246 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10247 	uint64_t feat_flags = dev_info.feature_flags;
10248 
10249 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10250 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10251 		printf("Device doesn't support RAW data-path APIs.\n");
10252 		return -ENOTSUP;
10253 	}
10254 
10255 	/* Verify the capabilities */
10256 	struct rte_cryptodev_sym_capability_idx cap_idx;
10257 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10258 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10259 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10260 			&cap_idx) == NULL)
10261 		return -ENOTSUP;
10262 
10263 	if (MD5_HMAC_create_session(ts_params, ut_params,
10264 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
10265 		return TEST_FAILED;
10266 
10267 	/* Generate Crypto op data structure */
10268 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10269 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10270 	TEST_ASSERT_NOT_NULL(ut_params->op,
10271 			"Failed to allocate symmetric crypto operation struct");
10272 
10273 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
10274 				16);
10275 
10276 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10277 		return TEST_FAILED;
10278 
10279 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10280 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10281 			ut_params->op);
10282 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10283 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10284 				ut_params->op, 0, 1, 0, 0);
10285 	else
10286 		TEST_ASSERT_NOT_NULL(
10287 			process_crypto_request(ts_params->valid_devs[0],
10288 				ut_params->op),
10289 				"failed to process sym crypto op");
10290 
10291 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10292 			"crypto op processing failed");
10293 
10294 	if (ut_params->op->sym->m_dst) {
10295 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
10296 				uint8_t *, plaintext_pad_len);
10297 	} else {
10298 		auth_tag = plaintext + plaintext_pad_len;
10299 	}
10300 
10301 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10302 			auth_tag,
10303 			test_case->auth_tag.data,
10304 			test_case->auth_tag.len,
10305 			"HMAC_MD5 generated tag not as expected");
10306 
10307 	return TEST_SUCCESS;
10308 }
10309 
10310 static int
10311 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
10312 {
10313 	uint8_t *plaintext;
10314 
10315 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10316 	struct crypto_unittest_params *ut_params = &unittest_params;
10317 	struct rte_cryptodev_info dev_info;
10318 
10319 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10320 	uint64_t feat_flags = dev_info.feature_flags;
10321 
10322 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10323 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10324 		printf("Device doesn't support RAW data-path APIs.\n");
10325 		return -ENOTSUP;
10326 	}
10327 
10328 	/* Verify the capabilities */
10329 	struct rte_cryptodev_sym_capability_idx cap_idx;
10330 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10331 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
10332 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10333 			&cap_idx) == NULL)
10334 		return -ENOTSUP;
10335 
10336 	if (MD5_HMAC_create_session(ts_params, ut_params,
10337 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
10338 		return TEST_FAILED;
10339 	}
10340 
10341 	/* Generate Crypto op data structure */
10342 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10343 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10344 	TEST_ASSERT_NOT_NULL(ut_params->op,
10345 			"Failed to allocate symmetric crypto operation struct");
10346 
10347 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
10348 		return TEST_FAILED;
10349 
10350 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10351 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
10352 			ut_params->op);
10353 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10354 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10355 				ut_params->op, 0, 1, 0, 0);
10356 	else
10357 		TEST_ASSERT_NOT_NULL(
10358 			process_crypto_request(ts_params->valid_devs[0],
10359 				ut_params->op),
10360 				"failed to process sym crypto op");
10361 
10362 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10363 			"HMAC_MD5 crypto op processing failed");
10364 
10365 	return TEST_SUCCESS;
10366 }
10367 
10368 static int
10369 test_MD5_HMAC_generate_case_1(void)
10370 {
10371 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
10372 }
10373 
10374 static int
10375 test_MD5_HMAC_verify_case_1(void)
10376 {
10377 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
10378 }
10379 
10380 static int
10381 test_MD5_HMAC_generate_case_2(void)
10382 {
10383 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
10384 }
10385 
10386 static int
10387 test_MD5_HMAC_verify_case_2(void)
10388 {
10389 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
10390 }
10391 
10392 static int
10393 test_multi_session(void)
10394 {
10395 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10396 	struct crypto_unittest_params *ut_params = &unittest_params;
10397 
10398 	struct rte_cryptodev_info dev_info;
10399 	struct rte_cryptodev_sym_session **sessions;
10400 
10401 	uint16_t i;
10402 
10403 	/* Verify the capabilities */
10404 	struct rte_cryptodev_sym_capability_idx cap_idx;
10405 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10406 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10407 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10408 			&cap_idx) == NULL)
10409 		return -ENOTSUP;
10410 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10411 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10412 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10413 			&cap_idx) == NULL)
10414 		return -ENOTSUP;
10415 
10416 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
10417 			aes_cbc_key, hmac_sha512_key);
10418 
10419 
10420 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10421 
10422 	sessions = rte_malloc(NULL,
10423 			(sizeof(struct rte_cryptodev_sym_session *) *
10424 			MAX_NB_SESSIONS) + 1, 0);
10425 
10426 	/* Create multiple crypto sessions*/
10427 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10428 
10429 		sessions[i] = rte_cryptodev_sym_session_create(
10430 				ts_params->session_mpool);
10431 
10432 		rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10433 				sessions[i], &ut_params->auth_xform,
10434 				ts_params->session_priv_mpool);
10435 		TEST_ASSERT_NOT_NULL(sessions[i],
10436 				"Session creation failed at session number %u",
10437 				i);
10438 
10439 		/* Attempt to send a request on each session */
10440 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
10441 			sessions[i],
10442 			ut_params,
10443 			ts_params,
10444 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
10445 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
10446 			aes_cbc_iv),
10447 			"Failed to perform decrypt on request number %u.", i);
10448 		/* free crypto operation structure */
10449 		if (ut_params->op)
10450 			rte_crypto_op_free(ut_params->op);
10451 
10452 		/*
10453 		 * free mbuf - both obuf and ibuf are usually the same,
10454 		 * so check if they point at the same address is necessary,
10455 		 * to avoid freeing the mbuf twice.
10456 		 */
10457 		if (ut_params->obuf) {
10458 			rte_pktmbuf_free(ut_params->obuf);
10459 			if (ut_params->ibuf == ut_params->obuf)
10460 				ut_params->ibuf = 0;
10461 			ut_params->obuf = 0;
10462 		}
10463 		if (ut_params->ibuf) {
10464 			rte_pktmbuf_free(ut_params->ibuf);
10465 			ut_params->ibuf = 0;
10466 		}
10467 	}
10468 
10469 	/* Next session create should fail */
10470 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10471 			sessions[i], &ut_params->auth_xform,
10472 			ts_params->session_priv_mpool);
10473 	TEST_ASSERT_NULL(sessions[i],
10474 			"Session creation succeeded unexpectedly!");
10475 
10476 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
10477 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10478 				sessions[i]);
10479 		rte_cryptodev_sym_session_free(sessions[i]);
10480 	}
10481 
10482 	rte_free(sessions);
10483 
10484 	return TEST_SUCCESS;
10485 }
10486 
10487 struct multi_session_params {
10488 	struct crypto_unittest_params ut_params;
10489 	uint8_t *cipher_key;
10490 	uint8_t *hmac_key;
10491 	const uint8_t *cipher;
10492 	const uint8_t *digest;
10493 	uint8_t *iv;
10494 };
10495 
10496 #define MB_SESSION_NUMBER 3
10497 
10498 static int
10499 test_multi_session_random_usage(void)
10500 {
10501 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10502 	struct rte_cryptodev_info dev_info;
10503 	struct rte_cryptodev_sym_session **sessions;
10504 	uint32_t i, j;
10505 	struct multi_session_params ut_paramz[] = {
10506 
10507 		{
10508 			.cipher_key = ms_aes_cbc_key0,
10509 			.hmac_key = ms_hmac_key0,
10510 			.cipher = ms_aes_cbc_cipher0,
10511 			.digest = ms_hmac_digest0,
10512 			.iv = ms_aes_cbc_iv0
10513 		},
10514 		{
10515 			.cipher_key = ms_aes_cbc_key1,
10516 			.hmac_key = ms_hmac_key1,
10517 			.cipher = ms_aes_cbc_cipher1,
10518 			.digest = ms_hmac_digest1,
10519 			.iv = ms_aes_cbc_iv1
10520 		},
10521 		{
10522 			.cipher_key = ms_aes_cbc_key2,
10523 			.hmac_key = ms_hmac_key2,
10524 			.cipher = ms_aes_cbc_cipher2,
10525 			.digest = ms_hmac_digest2,
10526 			.iv = ms_aes_cbc_iv2
10527 		},
10528 
10529 	};
10530 
10531 	/* Verify the capabilities */
10532 	struct rte_cryptodev_sym_capability_idx cap_idx;
10533 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10534 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
10535 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10536 			&cap_idx) == NULL)
10537 		return -ENOTSUP;
10538 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10539 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
10540 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
10541 			&cap_idx) == NULL)
10542 		return -ENOTSUP;
10543 
10544 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10545 
10546 	sessions = rte_malloc(NULL,
10547 			(sizeof(struct rte_cryptodev_sym_session *)
10548 					* MAX_NB_SESSIONS) + 1, 0);
10549 
10550 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10551 		sessions[i] = rte_cryptodev_sym_session_create(
10552 				ts_params->session_mpool);
10553 
10554 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
10555 				sizeof(struct crypto_unittest_params));
10556 
10557 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
10558 				&ut_paramz[i].ut_params,
10559 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
10560 
10561 		/* Create multiple crypto sessions*/
10562 		rte_cryptodev_sym_session_init(
10563 				ts_params->valid_devs[0],
10564 				sessions[i],
10565 				&ut_paramz[i].ut_params.auth_xform,
10566 				ts_params->session_priv_mpool);
10567 
10568 		TEST_ASSERT_NOT_NULL(sessions[i],
10569 				"Session creation failed at session number %u",
10570 				i);
10571 
10572 	}
10573 
10574 	srand(time(NULL));
10575 	for (i = 0; i < 40000; i++) {
10576 
10577 		j = rand() % MB_SESSION_NUMBER;
10578 
10579 		TEST_ASSERT_SUCCESS(
10580 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
10581 					sessions[j],
10582 					&ut_paramz[j].ut_params,
10583 					ts_params, ut_paramz[j].cipher,
10584 					ut_paramz[j].digest,
10585 					ut_paramz[j].iv),
10586 			"Failed to perform decrypt on request number %u.", i);
10587 
10588 		if (ut_paramz[j].ut_params.op)
10589 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
10590 
10591 		/*
10592 		 * free mbuf - both obuf and ibuf are usually the same,
10593 		 * so check if they point at the same address is necessary,
10594 		 * to avoid freeing the mbuf twice.
10595 		 */
10596 		if (ut_paramz[j].ut_params.obuf) {
10597 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
10598 			if (ut_paramz[j].ut_params.ibuf
10599 					== ut_paramz[j].ut_params.obuf)
10600 				ut_paramz[j].ut_params.ibuf = 0;
10601 			ut_paramz[j].ut_params.obuf = 0;
10602 		}
10603 		if (ut_paramz[j].ut_params.ibuf) {
10604 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
10605 			ut_paramz[j].ut_params.ibuf = 0;
10606 		}
10607 	}
10608 
10609 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
10610 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
10611 				sessions[i]);
10612 		rte_cryptodev_sym_session_free(sessions[i]);
10613 	}
10614 
10615 	rte_free(sessions);
10616 
10617 	return TEST_SUCCESS;
10618 }
10619 
10620 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
10621 			0xab, 0xab, 0xab, 0xab,
10622 			0xab, 0xab, 0xab, 0xab,
10623 			0xab, 0xab, 0xab, 0xab};
10624 
10625 static int
10626 test_null_invalid_operation(void)
10627 {
10628 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10629 	struct crypto_unittest_params *ut_params = &unittest_params;
10630 	int ret;
10631 
10632 	/* This test is for NULL PMD only */
10633 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10634 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10635 		return -ENOTSUP;
10636 
10637 	/* Setup Cipher Parameters */
10638 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10639 	ut_params->cipher_xform.next = NULL;
10640 
10641 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
10642 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10643 
10644 	ut_params->sess = rte_cryptodev_sym_session_create(
10645 			ts_params->session_mpool);
10646 
10647 	/* Create Crypto session*/
10648 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10649 			ut_params->sess, &ut_params->cipher_xform,
10650 			ts_params->session_priv_mpool);
10651 	TEST_ASSERT(ret < 0,
10652 			"Session creation succeeded unexpectedly");
10653 
10654 
10655 	/* Setup HMAC Parameters */
10656 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10657 	ut_params->auth_xform.next = NULL;
10658 
10659 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
10660 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10661 
10662 	ut_params->sess = rte_cryptodev_sym_session_create(
10663 			ts_params->session_mpool);
10664 
10665 	/* Create Crypto session*/
10666 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10667 			ut_params->sess, &ut_params->auth_xform,
10668 			ts_params->session_priv_mpool);
10669 	TEST_ASSERT(ret < 0,
10670 			"Session creation succeeded unexpectedly");
10671 
10672 	return TEST_SUCCESS;
10673 }
10674 
10675 
10676 #define NULL_BURST_LENGTH (32)
10677 
10678 static int
10679 test_null_burst_operation(void)
10680 {
10681 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10682 	struct crypto_unittest_params *ut_params = &unittest_params;
10683 
10684 	unsigned i, burst_len = NULL_BURST_LENGTH;
10685 
10686 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
10687 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
10688 
10689 	/* This test is for NULL PMD only */
10690 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
10691 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
10692 		return -ENOTSUP;
10693 
10694 	/* Setup Cipher Parameters */
10695 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10696 	ut_params->cipher_xform.next = &ut_params->auth_xform;
10697 
10698 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
10699 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10700 
10701 	/* Setup HMAC Parameters */
10702 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
10703 	ut_params->auth_xform.next = NULL;
10704 
10705 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
10706 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
10707 
10708 	ut_params->sess = rte_cryptodev_sym_session_create(
10709 			ts_params->session_mpool);
10710 
10711 	/* Create Crypto session*/
10712 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
10713 			ut_params->sess, &ut_params->cipher_xform,
10714 			ts_params->session_priv_mpool);
10715 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
10716 
10717 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
10718 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
10719 			burst_len, "failed to generate burst of crypto ops");
10720 
10721 	/* Generate an operation for each mbuf in burst */
10722 	for (i = 0; i < burst_len; i++) {
10723 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10724 
10725 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
10726 
10727 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
10728 				sizeof(unsigned));
10729 		*data = i;
10730 
10731 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
10732 
10733 		burst[i]->sym->m_src = m;
10734 	}
10735 
10736 	/* Process crypto operation */
10737 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
10738 			0, burst, burst_len),
10739 			burst_len,
10740 			"Error enqueuing burst");
10741 
10742 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
10743 			0, burst_dequeued, burst_len),
10744 			burst_len,
10745 			"Error dequeuing burst");
10746 
10747 
10748 	for (i = 0; i < burst_len; i++) {
10749 		TEST_ASSERT_EQUAL(
10750 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
10751 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
10752 					uint32_t *),
10753 			"data not as expected");
10754 
10755 		rte_pktmbuf_free(burst[i]->sym->m_src);
10756 		rte_crypto_op_free(burst[i]);
10757 	}
10758 
10759 	return TEST_SUCCESS;
10760 }
10761 
10762 static uint16_t
10763 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10764 		  uint16_t nb_ops, void *user_param)
10765 {
10766 	RTE_SET_USED(dev_id);
10767 	RTE_SET_USED(qp_id);
10768 	RTE_SET_USED(ops);
10769 	RTE_SET_USED(user_param);
10770 
10771 	printf("crypto enqueue callback called\n");
10772 	return nb_ops;
10773 }
10774 
10775 static uint16_t
10776 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
10777 		  uint16_t nb_ops, void *user_param)
10778 {
10779 	RTE_SET_USED(dev_id);
10780 	RTE_SET_USED(qp_id);
10781 	RTE_SET_USED(ops);
10782 	RTE_SET_USED(user_param);
10783 
10784 	printf("crypto dequeue callback called\n");
10785 	return nb_ops;
10786 }
10787 
10788 /*
10789  * Thread using enqueue/dequeue callback with RCU.
10790  */
10791 static int
10792 test_enqdeq_callback_thread(void *arg)
10793 {
10794 	RTE_SET_USED(arg);
10795 	/* DP thread calls rte_cryptodev_enqueue_burst()/
10796 	 * rte_cryptodev_dequeue_burst() and invokes callback.
10797 	 */
10798 	test_null_burst_operation();
10799 	return 0;
10800 }
10801 
10802 static int
10803 test_enq_callback_setup(void)
10804 {
10805 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10806 	struct rte_cryptodev_info dev_info;
10807 	struct rte_cryptodev_qp_conf qp_conf = {
10808 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
10809 	};
10810 
10811 	struct rte_cryptodev_cb *cb;
10812 	uint16_t qp_id = 0;
10813 
10814 	/* Stop the device in case it's started so it can be configured */
10815 	rte_cryptodev_stop(ts_params->valid_devs[0]);
10816 
10817 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10818 
10819 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10820 			&ts_params->conf),
10821 			"Failed to configure cryptodev %u",
10822 			ts_params->valid_devs[0]);
10823 
10824 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10825 	qp_conf.mp_session = ts_params->session_mpool;
10826 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
10827 
10828 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10829 			ts_params->valid_devs[0], qp_id, &qp_conf,
10830 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10831 			"Failed test for "
10832 			"rte_cryptodev_queue_pair_setup: num_inflights "
10833 			"%u on qp %u on cryptodev %u",
10834 			qp_conf.nb_descriptors, qp_id,
10835 			ts_params->valid_devs[0]);
10836 
10837 	/* Test with invalid crypto device */
10838 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
10839 			qp_id, test_enq_callback, NULL);
10840 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10841 			"cryptodev %u did not fail",
10842 			qp_id, RTE_CRYPTO_MAX_DEVS);
10843 
10844 	/* Test with invalid queue pair */
10845 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10846 			dev_info.max_nb_queue_pairs + 1,
10847 			test_enq_callback, NULL);
10848 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10849 			"cryptodev %u did not fail",
10850 			dev_info.max_nb_queue_pairs + 1,
10851 			ts_params->valid_devs[0]);
10852 
10853 	/* Test with NULL callback */
10854 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10855 			qp_id, NULL, NULL);
10856 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10857 			"cryptodev %u did not fail",
10858 			qp_id, ts_params->valid_devs[0]);
10859 
10860 	/* Test with valid configuration */
10861 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
10862 			qp_id, test_enq_callback, NULL);
10863 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10864 			"qp %u on cryptodev %u",
10865 			qp_id, ts_params->valid_devs[0]);
10866 
10867 	rte_cryptodev_start(ts_params->valid_devs[0]);
10868 
10869 	/* Launch a thread */
10870 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10871 				rte_get_next_lcore(-1, 1, 0));
10872 
10873 	/* Wait until reader exited. */
10874 	rte_eal_mp_wait_lcore();
10875 
10876 	/* Test with invalid crypto device */
10877 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10878 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10879 			"Expected call to fail as crypto device is invalid");
10880 
10881 	/* Test with invalid queue pair */
10882 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10883 			ts_params->valid_devs[0],
10884 			dev_info.max_nb_queue_pairs + 1, cb),
10885 			"Expected call to fail as queue pair is invalid");
10886 
10887 	/* Test with NULL callback */
10888 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
10889 			ts_params->valid_devs[0], qp_id, NULL),
10890 			"Expected call to fail as callback is NULL");
10891 
10892 	/* Test with valid configuration */
10893 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
10894 			ts_params->valid_devs[0], qp_id, cb),
10895 			"Failed test to remove callback on "
10896 			"qp %u on cryptodev %u",
10897 			qp_id, ts_params->valid_devs[0]);
10898 
10899 	return TEST_SUCCESS;
10900 }
10901 
10902 static int
10903 test_deq_callback_setup(void)
10904 {
10905 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10906 	struct rte_cryptodev_info dev_info;
10907 	struct rte_cryptodev_qp_conf qp_conf = {
10908 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
10909 	};
10910 
10911 	struct rte_cryptodev_cb *cb;
10912 	uint16_t qp_id = 0;
10913 
10914 	/* Stop the device in case it's started so it can be configured */
10915 	rte_cryptodev_stop(ts_params->valid_devs[0]);
10916 
10917 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10918 
10919 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
10920 			&ts_params->conf),
10921 			"Failed to configure cryptodev %u",
10922 			ts_params->valid_devs[0]);
10923 
10924 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
10925 	qp_conf.mp_session = ts_params->session_mpool;
10926 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
10927 
10928 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
10929 			ts_params->valid_devs[0], qp_id, &qp_conf,
10930 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
10931 			"Failed test for "
10932 			"rte_cryptodev_queue_pair_setup: num_inflights "
10933 			"%u on qp %u on cryptodev %u",
10934 			qp_conf.nb_descriptors, qp_id,
10935 			ts_params->valid_devs[0]);
10936 
10937 	/* Test with invalid crypto device */
10938 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
10939 			qp_id, test_deq_callback, NULL);
10940 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10941 			"cryptodev %u did not fail",
10942 			qp_id, RTE_CRYPTO_MAX_DEVS);
10943 
10944 	/* Test with invalid queue pair */
10945 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10946 			dev_info.max_nb_queue_pairs + 1,
10947 			test_deq_callback, NULL);
10948 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10949 			"cryptodev %u did not fail",
10950 			dev_info.max_nb_queue_pairs + 1,
10951 			ts_params->valid_devs[0]);
10952 
10953 	/* Test with NULL callback */
10954 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10955 			qp_id, NULL, NULL);
10956 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
10957 			"cryptodev %u did not fail",
10958 			qp_id, ts_params->valid_devs[0]);
10959 
10960 	/* Test with valid configuration */
10961 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
10962 			qp_id, test_deq_callback, NULL);
10963 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
10964 			"qp %u on cryptodev %u",
10965 			qp_id, ts_params->valid_devs[0]);
10966 
10967 	rte_cryptodev_start(ts_params->valid_devs[0]);
10968 
10969 	/* Launch a thread */
10970 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
10971 				rte_get_next_lcore(-1, 1, 0));
10972 
10973 	/* Wait until reader exited. */
10974 	rte_eal_mp_wait_lcore();
10975 
10976 	/* Test with invalid crypto device */
10977 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10978 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
10979 			"Expected call to fail as crypto device is invalid");
10980 
10981 	/* Test with invalid queue pair */
10982 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10983 			ts_params->valid_devs[0],
10984 			dev_info.max_nb_queue_pairs + 1, cb),
10985 			"Expected call to fail as queue pair is invalid");
10986 
10987 	/* Test with NULL callback */
10988 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
10989 			ts_params->valid_devs[0], qp_id, NULL),
10990 			"Expected call to fail as callback is NULL");
10991 
10992 	/* Test with valid configuration */
10993 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
10994 			ts_params->valid_devs[0], qp_id, cb),
10995 			"Failed test to remove callback on "
10996 			"qp %u on cryptodev %u",
10997 			qp_id, ts_params->valid_devs[0]);
10998 
10999 	return TEST_SUCCESS;
11000 }
11001 
11002 static void
11003 generate_gmac_large_plaintext(uint8_t *data)
11004 {
11005 	uint16_t i;
11006 
11007 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
11008 		memcpy(&data[i], &data[0], 32);
11009 }
11010 
11011 static int
11012 create_gmac_operation(enum rte_crypto_auth_operation op,
11013 		const struct gmac_test_data *tdata)
11014 {
11015 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11016 	struct crypto_unittest_params *ut_params = &unittest_params;
11017 	struct rte_crypto_sym_op *sym_op;
11018 
11019 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11020 
11021 	/* Generate Crypto op data structure */
11022 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11023 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11024 	TEST_ASSERT_NOT_NULL(ut_params->op,
11025 			"Failed to allocate symmetric crypto operation struct");
11026 
11027 	sym_op = ut_params->op->sym;
11028 
11029 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11030 			ut_params->ibuf, tdata->gmac_tag.len);
11031 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11032 			"no room to append digest");
11033 
11034 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11035 			ut_params->ibuf, plaintext_pad_len);
11036 
11037 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11038 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11039 				tdata->gmac_tag.len);
11040 		debug_hexdump(stdout, "digest:",
11041 				sym_op->auth.digest.data,
11042 				tdata->gmac_tag.len);
11043 	}
11044 
11045 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11046 			uint8_t *, IV_OFFSET);
11047 
11048 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11049 
11050 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11051 
11052 	sym_op->cipher.data.length = 0;
11053 	sym_op->cipher.data.offset = 0;
11054 
11055 	sym_op->auth.data.offset = 0;
11056 	sym_op->auth.data.length = tdata->plaintext.len;
11057 
11058 	return 0;
11059 }
11060 
11061 static int
11062 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
11063 		const struct gmac_test_data *tdata,
11064 		void *digest_mem, uint64_t digest_phys)
11065 {
11066 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11067 	struct crypto_unittest_params *ut_params = &unittest_params;
11068 	struct rte_crypto_sym_op *sym_op;
11069 
11070 	/* Generate Crypto op data structure */
11071 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11072 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11073 	TEST_ASSERT_NOT_NULL(ut_params->op,
11074 			"Failed to allocate symmetric crypto operation struct");
11075 
11076 	sym_op = ut_params->op->sym;
11077 
11078 	sym_op->auth.digest.data = digest_mem;
11079 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11080 			"no room to append digest");
11081 
11082 	sym_op->auth.digest.phys_addr = digest_phys;
11083 
11084 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11085 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
11086 				tdata->gmac_tag.len);
11087 		debug_hexdump(stdout, "digest:",
11088 				sym_op->auth.digest.data,
11089 				tdata->gmac_tag.len);
11090 	}
11091 
11092 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
11093 			uint8_t *, IV_OFFSET);
11094 
11095 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
11096 
11097 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
11098 
11099 	sym_op->cipher.data.length = 0;
11100 	sym_op->cipher.data.offset = 0;
11101 
11102 	sym_op->auth.data.offset = 0;
11103 	sym_op->auth.data.length = tdata->plaintext.len;
11104 
11105 	return 0;
11106 }
11107 
11108 static int create_gmac_session(uint8_t dev_id,
11109 		const struct gmac_test_data *tdata,
11110 		enum rte_crypto_auth_operation auth_op)
11111 {
11112 	uint8_t auth_key[tdata->key.len];
11113 
11114 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11115 	struct crypto_unittest_params *ut_params = &unittest_params;
11116 
11117 	memcpy(auth_key, tdata->key.data, tdata->key.len);
11118 
11119 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11120 	ut_params->auth_xform.next = NULL;
11121 
11122 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
11123 	ut_params->auth_xform.auth.op = auth_op;
11124 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
11125 	ut_params->auth_xform.auth.key.length = tdata->key.len;
11126 	ut_params->auth_xform.auth.key.data = auth_key;
11127 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11128 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
11129 
11130 
11131 	ut_params->sess = rte_cryptodev_sym_session_create(
11132 			ts_params->session_mpool);
11133 
11134 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11135 			&ut_params->auth_xform,
11136 			ts_params->session_priv_mpool);
11137 
11138 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11139 
11140 	return 0;
11141 }
11142 
11143 static int
11144 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
11145 {
11146 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11147 	struct crypto_unittest_params *ut_params = &unittest_params;
11148 	struct rte_cryptodev_info dev_info;
11149 
11150 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11151 	uint64_t feat_flags = dev_info.feature_flags;
11152 
11153 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11154 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11155 		printf("Device doesn't support RAW data-path APIs.\n");
11156 		return -ENOTSUP;
11157 	}
11158 
11159 	int retval;
11160 
11161 	uint8_t *auth_tag, *plaintext;
11162 	uint16_t plaintext_pad_len;
11163 
11164 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11165 			      "No GMAC length in the source data");
11166 
11167 	/* Verify the capabilities */
11168 	struct rte_cryptodev_sym_capability_idx cap_idx;
11169 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11170 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11171 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11172 			&cap_idx) == NULL)
11173 		return -ENOTSUP;
11174 
11175 	retval = create_gmac_session(ts_params->valid_devs[0],
11176 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11177 
11178 	if (retval < 0)
11179 		return retval;
11180 
11181 	if (tdata->plaintext.len > MBUF_SIZE)
11182 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11183 	else
11184 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11185 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11186 			"Failed to allocate input buffer in mempool");
11187 
11188 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11189 			rte_pktmbuf_tailroom(ut_params->ibuf));
11190 
11191 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11192 	/*
11193 	 * Runtime generate the large plain text instead of use hard code
11194 	 * plain text vector. It is done to avoid create huge source file
11195 	 * with the test vector.
11196 	 */
11197 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11198 		generate_gmac_large_plaintext(tdata->plaintext.data);
11199 
11200 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11201 				plaintext_pad_len);
11202 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11203 
11204 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11205 	debug_hexdump(stdout, "plaintext:", plaintext,
11206 			tdata->plaintext.len);
11207 
11208 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
11209 			tdata);
11210 
11211 	if (retval < 0)
11212 		return retval;
11213 
11214 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11215 
11216 	ut_params->op->sym->m_src = ut_params->ibuf;
11217 
11218 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11219 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11220 			ut_params->op);
11221 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11222 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11223 				ut_params->op, 0, 1, 0, 0);
11224 	else
11225 		TEST_ASSERT_NOT_NULL(
11226 			process_crypto_request(ts_params->valid_devs[0],
11227 			ut_params->op), "failed to process sym crypto op");
11228 
11229 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11230 			"crypto op processing failed");
11231 
11232 	if (ut_params->op->sym->m_dst) {
11233 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11234 				uint8_t *, plaintext_pad_len);
11235 	} else {
11236 		auth_tag = plaintext + plaintext_pad_len;
11237 	}
11238 
11239 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11240 
11241 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11242 			auth_tag,
11243 			tdata->gmac_tag.data,
11244 			tdata->gmac_tag.len,
11245 			"GMAC Generated auth tag not as expected");
11246 
11247 	return 0;
11248 }
11249 
11250 static int
11251 test_AES_GMAC_authentication_test_case_1(void)
11252 {
11253 	return test_AES_GMAC_authentication(&gmac_test_case_1);
11254 }
11255 
11256 static int
11257 test_AES_GMAC_authentication_test_case_2(void)
11258 {
11259 	return test_AES_GMAC_authentication(&gmac_test_case_2);
11260 }
11261 
11262 static int
11263 test_AES_GMAC_authentication_test_case_3(void)
11264 {
11265 	return test_AES_GMAC_authentication(&gmac_test_case_3);
11266 }
11267 
11268 static int
11269 test_AES_GMAC_authentication_test_case_4(void)
11270 {
11271 	return test_AES_GMAC_authentication(&gmac_test_case_4);
11272 }
11273 
11274 static int
11275 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
11276 {
11277 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11278 	struct crypto_unittest_params *ut_params = &unittest_params;
11279 	int retval;
11280 	uint32_t plaintext_pad_len;
11281 	uint8_t *plaintext;
11282 	struct rte_cryptodev_info dev_info;
11283 
11284 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11285 	uint64_t feat_flags = dev_info.feature_flags;
11286 
11287 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11288 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11289 		printf("Device doesn't support RAW data-path APIs.\n");
11290 		return -ENOTSUP;
11291 	}
11292 
11293 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11294 			      "No GMAC length in the source data");
11295 
11296 	/* Verify the capabilities */
11297 	struct rte_cryptodev_sym_capability_idx cap_idx;
11298 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11299 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11300 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11301 			&cap_idx) == NULL)
11302 		return -ENOTSUP;
11303 
11304 	retval = create_gmac_session(ts_params->valid_devs[0],
11305 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
11306 
11307 	if (retval < 0)
11308 		return retval;
11309 
11310 	if (tdata->plaintext.len > MBUF_SIZE)
11311 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
11312 	else
11313 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11314 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11315 			"Failed to allocate input buffer in mempool");
11316 
11317 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11318 			rte_pktmbuf_tailroom(ut_params->ibuf));
11319 
11320 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11321 
11322 	/*
11323 	 * Runtime generate the large plain text instead of use hard code
11324 	 * plain text vector. It is done to avoid create huge source file
11325 	 * with the test vector.
11326 	 */
11327 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
11328 		generate_gmac_large_plaintext(tdata->plaintext.data);
11329 
11330 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11331 				plaintext_pad_len);
11332 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11333 
11334 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
11335 	debug_hexdump(stdout, "plaintext:", plaintext,
11336 			tdata->plaintext.len);
11337 
11338 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
11339 			tdata);
11340 
11341 	if (retval < 0)
11342 		return retval;
11343 
11344 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11345 
11346 	ut_params->op->sym->m_src = ut_params->ibuf;
11347 
11348 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11349 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11350 			ut_params->op);
11351 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11352 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11353 				ut_params->op, 0, 1, 0, 0);
11354 	else
11355 		TEST_ASSERT_NOT_NULL(
11356 			process_crypto_request(ts_params->valid_devs[0],
11357 			ut_params->op), "failed to process sym crypto op");
11358 
11359 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11360 			"crypto op processing failed");
11361 
11362 	return 0;
11363 
11364 }
11365 
11366 static int
11367 test_AES_GMAC_authentication_verify_test_case_1(void)
11368 {
11369 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
11370 }
11371 
11372 static int
11373 test_AES_GMAC_authentication_verify_test_case_2(void)
11374 {
11375 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
11376 }
11377 
11378 static int
11379 test_AES_GMAC_authentication_verify_test_case_3(void)
11380 {
11381 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
11382 }
11383 
11384 static int
11385 test_AES_GMAC_authentication_verify_test_case_4(void)
11386 {
11387 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
11388 }
11389 
11390 static int
11391 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
11392 				uint32_t fragsz)
11393 {
11394 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11395 	struct crypto_unittest_params *ut_params = &unittest_params;
11396 	struct rte_cryptodev_info dev_info;
11397 	uint64_t feature_flags;
11398 	unsigned int trn_data = 0;
11399 	void *digest_mem = NULL;
11400 	uint32_t segs = 1;
11401 	unsigned int to_trn = 0;
11402 	struct rte_mbuf *buf = NULL;
11403 	uint8_t *auth_tag, *plaintext;
11404 	int retval;
11405 
11406 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
11407 			      "No GMAC length in the source data");
11408 
11409 	/* Verify the capabilities */
11410 	struct rte_cryptodev_sym_capability_idx cap_idx;
11411 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11412 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
11413 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11414 			&cap_idx) == NULL)
11415 		return -ENOTSUP;
11416 
11417 	/* Check for any input SGL support */
11418 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11419 	feature_flags = dev_info.feature_flags;
11420 
11421 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
11422 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
11423 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
11424 		return -ENOTSUP;
11425 
11426 	if (fragsz > tdata->plaintext.len)
11427 		fragsz = tdata->plaintext.len;
11428 
11429 	uint16_t plaintext_len = fragsz;
11430 
11431 	retval = create_gmac_session(ts_params->valid_devs[0],
11432 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
11433 
11434 	if (retval < 0)
11435 		return retval;
11436 
11437 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11438 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
11439 			"Failed to allocate input buffer in mempool");
11440 
11441 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11442 			rte_pktmbuf_tailroom(ut_params->ibuf));
11443 
11444 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11445 				plaintext_len);
11446 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
11447 
11448 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
11449 
11450 	trn_data += plaintext_len;
11451 
11452 	buf = ut_params->ibuf;
11453 
11454 	/*
11455 	 * Loop until no more fragments
11456 	 */
11457 
11458 	while (trn_data < tdata->plaintext.len) {
11459 		++segs;
11460 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
11461 				(tdata->plaintext.len - trn_data) : fragsz;
11462 
11463 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11464 		buf = buf->next;
11465 
11466 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
11467 				rte_pktmbuf_tailroom(buf));
11468 
11469 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
11470 				to_trn);
11471 
11472 		memcpy(plaintext, tdata->plaintext.data + trn_data,
11473 				to_trn);
11474 		trn_data += to_trn;
11475 		if (trn_data  == tdata->plaintext.len)
11476 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
11477 					tdata->gmac_tag.len);
11478 	}
11479 	ut_params->ibuf->nb_segs = segs;
11480 
11481 	/*
11482 	 * Place digest at the end of the last buffer
11483 	 */
11484 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
11485 
11486 	if (!digest_mem) {
11487 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11488 				+ tdata->gmac_tag.len);
11489 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
11490 				tdata->plaintext.len);
11491 	}
11492 
11493 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
11494 			tdata, digest_mem, digest_phys);
11495 
11496 	if (retval < 0)
11497 		return retval;
11498 
11499 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11500 
11501 	ut_params->op->sym->m_src = ut_params->ibuf;
11502 
11503 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11504 		return -ENOTSUP;
11505 
11506 	TEST_ASSERT_NOT_NULL(
11507 		process_crypto_request(ts_params->valid_devs[0],
11508 		ut_params->op), "failed to process sym crypto op");
11509 
11510 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11511 			"crypto op processing failed");
11512 
11513 	auth_tag = digest_mem;
11514 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
11515 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11516 			auth_tag,
11517 			tdata->gmac_tag.data,
11518 			tdata->gmac_tag.len,
11519 			"GMAC Generated auth tag not as expected");
11520 
11521 	return 0;
11522 }
11523 
11524 /* Segment size not multiple of block size (16B) */
11525 static int
11526 test_AES_GMAC_authentication_SGL_40B(void)
11527 {
11528 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
11529 }
11530 
11531 static int
11532 test_AES_GMAC_authentication_SGL_80B(void)
11533 {
11534 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
11535 }
11536 
11537 static int
11538 test_AES_GMAC_authentication_SGL_2048B(void)
11539 {
11540 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
11541 }
11542 
11543 /* Segment size not multiple of block size (16B) */
11544 static int
11545 test_AES_GMAC_authentication_SGL_2047B(void)
11546 {
11547 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
11548 }
11549 
11550 struct test_crypto_vector {
11551 	enum rte_crypto_cipher_algorithm crypto_algo;
11552 	unsigned int cipher_offset;
11553 	unsigned int cipher_len;
11554 
11555 	struct {
11556 		uint8_t data[64];
11557 		unsigned int len;
11558 	} cipher_key;
11559 
11560 	struct {
11561 		uint8_t data[64];
11562 		unsigned int len;
11563 	} iv;
11564 
11565 	struct {
11566 		const uint8_t *data;
11567 		unsigned int len;
11568 	} plaintext;
11569 
11570 	struct {
11571 		const uint8_t *data;
11572 		unsigned int len;
11573 	} ciphertext;
11574 
11575 	enum rte_crypto_auth_algorithm auth_algo;
11576 	unsigned int auth_offset;
11577 
11578 	struct {
11579 		uint8_t data[128];
11580 		unsigned int len;
11581 	} auth_key;
11582 
11583 	struct {
11584 		const uint8_t *data;
11585 		unsigned int len;
11586 	} aad;
11587 
11588 	struct {
11589 		uint8_t data[128];
11590 		unsigned int len;
11591 	} digest;
11592 };
11593 
11594 static const struct test_crypto_vector
11595 hmac_sha1_test_crypto_vector = {
11596 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11597 	.plaintext = {
11598 		.data = plaintext_hash,
11599 		.len = 512
11600 	},
11601 	.auth_key = {
11602 		.data = {
11603 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11604 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11605 			0xDE, 0xF4, 0xDE, 0xAD
11606 		},
11607 		.len = 20
11608 	},
11609 	.digest = {
11610 		.data = {
11611 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
11612 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
11613 			0x3F, 0x91, 0x64, 0x59
11614 		},
11615 		.len = 20
11616 	}
11617 };
11618 
11619 static const struct test_crypto_vector
11620 aes128_gmac_test_vector = {
11621 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
11622 	.plaintext = {
11623 		.data = plaintext_hash,
11624 		.len = 512
11625 	},
11626 	.iv = {
11627 		.data = {
11628 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11629 			0x08, 0x09, 0x0A, 0x0B
11630 		},
11631 		.len = 12
11632 	},
11633 	.auth_key = {
11634 		.data = {
11635 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11636 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
11637 		},
11638 		.len = 16
11639 	},
11640 	.digest = {
11641 		.data = {
11642 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
11643 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
11644 		},
11645 		.len = 16
11646 	}
11647 };
11648 
11649 static const struct test_crypto_vector
11650 aes128cbc_hmac_sha1_test_vector = {
11651 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11652 	.cipher_offset = 0,
11653 	.cipher_len = 512,
11654 	.cipher_key = {
11655 		.data = {
11656 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11657 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11658 		},
11659 		.len = 16
11660 	},
11661 	.iv = {
11662 		.data = {
11663 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11664 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11665 		},
11666 		.len = 16
11667 	},
11668 	.plaintext = {
11669 		.data = plaintext_hash,
11670 		.len = 512
11671 	},
11672 	.ciphertext = {
11673 		.data = ciphertext512_aes128cbc,
11674 		.len = 512
11675 	},
11676 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11677 	.auth_offset = 0,
11678 	.auth_key = {
11679 		.data = {
11680 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11681 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11682 			0xDE, 0xF4, 0xDE, 0xAD
11683 		},
11684 		.len = 20
11685 	},
11686 	.digest = {
11687 		.data = {
11688 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
11689 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
11690 			0x18, 0x8C, 0x1D, 0x32
11691 		},
11692 		.len = 20
11693 	}
11694 };
11695 
11696 static const struct test_crypto_vector
11697 aes128cbc_hmac_sha1_aad_test_vector = {
11698 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
11699 	.cipher_offset = 8,
11700 	.cipher_len = 496,
11701 	.cipher_key = {
11702 		.data = {
11703 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
11704 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
11705 		},
11706 		.len = 16
11707 	},
11708 	.iv = {
11709 		.data = {
11710 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
11711 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11712 		},
11713 		.len = 16
11714 	},
11715 	.plaintext = {
11716 		.data = plaintext_hash,
11717 		.len = 512
11718 	},
11719 	.ciphertext = {
11720 		.data = ciphertext512_aes128cbc_aad,
11721 		.len = 512
11722 	},
11723 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
11724 	.auth_offset = 0,
11725 	.auth_key = {
11726 		.data = {
11727 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
11728 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
11729 			0xDE, 0xF4, 0xDE, 0xAD
11730 		},
11731 		.len = 20
11732 	},
11733 	.digest = {
11734 		.data = {
11735 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
11736 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
11737 			0x62, 0x0F, 0xFB, 0x10
11738 		},
11739 		.len = 20
11740 	}
11741 };
11742 
11743 static void
11744 data_corruption(uint8_t *data)
11745 {
11746 	data[0] += 1;
11747 }
11748 
11749 static void
11750 tag_corruption(uint8_t *data, unsigned int tag_offset)
11751 {
11752 	data[tag_offset] += 1;
11753 }
11754 
11755 static int
11756 create_auth_session(struct crypto_unittest_params *ut_params,
11757 		uint8_t dev_id,
11758 		const struct test_crypto_vector *reference,
11759 		enum rte_crypto_auth_operation auth_op)
11760 {
11761 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11762 	uint8_t auth_key[reference->auth_key.len + 1];
11763 
11764 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11765 
11766 	/* Setup Authentication Parameters */
11767 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11768 	ut_params->auth_xform.auth.op = auth_op;
11769 	ut_params->auth_xform.next = NULL;
11770 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11771 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11772 	ut_params->auth_xform.auth.key.data = auth_key;
11773 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11774 
11775 	/* Create Crypto session*/
11776 	ut_params->sess = rte_cryptodev_sym_session_create(
11777 			ts_params->session_mpool);
11778 
11779 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11780 				&ut_params->auth_xform,
11781 				ts_params->session_priv_mpool);
11782 
11783 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11784 
11785 	return 0;
11786 }
11787 
11788 static int
11789 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
11790 		uint8_t dev_id,
11791 		const struct test_crypto_vector *reference,
11792 		enum rte_crypto_auth_operation auth_op,
11793 		enum rte_crypto_cipher_operation cipher_op)
11794 {
11795 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11796 	uint8_t cipher_key[reference->cipher_key.len + 1];
11797 	uint8_t auth_key[reference->auth_key.len + 1];
11798 
11799 	memcpy(cipher_key, reference->cipher_key.data,
11800 			reference->cipher_key.len);
11801 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
11802 
11803 	/* Setup Authentication Parameters */
11804 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11805 	ut_params->auth_xform.auth.op = auth_op;
11806 	ut_params->auth_xform.auth.algo = reference->auth_algo;
11807 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
11808 	ut_params->auth_xform.auth.key.data = auth_key;
11809 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
11810 
11811 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
11812 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
11813 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
11814 	} else {
11815 		ut_params->auth_xform.next = &ut_params->cipher_xform;
11816 
11817 		/* Setup Cipher Parameters */
11818 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11819 		ut_params->cipher_xform.next = NULL;
11820 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
11821 		ut_params->cipher_xform.cipher.op = cipher_op;
11822 		ut_params->cipher_xform.cipher.key.data = cipher_key;
11823 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
11824 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
11825 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
11826 	}
11827 
11828 	/* Create Crypto session*/
11829 	ut_params->sess = rte_cryptodev_sym_session_create(
11830 			ts_params->session_mpool);
11831 
11832 	rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
11833 				&ut_params->auth_xform,
11834 				ts_params->session_priv_mpool);
11835 
11836 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11837 
11838 	return 0;
11839 }
11840 
11841 static int
11842 create_auth_operation(struct crypto_testsuite_params *ts_params,
11843 		struct crypto_unittest_params *ut_params,
11844 		const struct test_crypto_vector *reference,
11845 		unsigned int auth_generate)
11846 {
11847 	/* Generate Crypto op data structure */
11848 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11849 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11850 	TEST_ASSERT_NOT_NULL(ut_params->op,
11851 			"Failed to allocate pktmbuf offload");
11852 
11853 	/* Set crypto operation data parameters */
11854 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11855 
11856 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11857 
11858 	/* set crypto operation source mbuf */
11859 	sym_op->m_src = ut_params->ibuf;
11860 
11861 	/* digest */
11862 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11863 			ut_params->ibuf, reference->digest.len);
11864 
11865 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11866 			"no room to append auth tag");
11867 
11868 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11869 			ut_params->ibuf, reference->plaintext.len);
11870 
11871 	if (auth_generate)
11872 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11873 	else
11874 		memcpy(sym_op->auth.digest.data,
11875 				reference->digest.data,
11876 				reference->digest.len);
11877 
11878 	debug_hexdump(stdout, "digest:",
11879 			sym_op->auth.digest.data,
11880 			reference->digest.len);
11881 
11882 	sym_op->auth.data.length = reference->plaintext.len;
11883 	sym_op->auth.data.offset = 0;
11884 
11885 	return 0;
11886 }
11887 
11888 static int
11889 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
11890 		struct crypto_unittest_params *ut_params,
11891 		const struct test_crypto_vector *reference,
11892 		unsigned int auth_generate)
11893 {
11894 	/* Generate Crypto op data structure */
11895 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11896 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11897 	TEST_ASSERT_NOT_NULL(ut_params->op,
11898 			"Failed to allocate pktmbuf offload");
11899 
11900 	/* Set crypto operation data parameters */
11901 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11902 
11903 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11904 
11905 	/* set crypto operation source mbuf */
11906 	sym_op->m_src = ut_params->ibuf;
11907 
11908 	/* digest */
11909 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11910 			ut_params->ibuf, reference->digest.len);
11911 
11912 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11913 			"no room to append auth tag");
11914 
11915 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11916 			ut_params->ibuf, reference->ciphertext.len);
11917 
11918 	if (auth_generate)
11919 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11920 	else
11921 		memcpy(sym_op->auth.digest.data,
11922 				reference->digest.data,
11923 				reference->digest.len);
11924 
11925 	debug_hexdump(stdout, "digest:",
11926 			sym_op->auth.digest.data,
11927 			reference->digest.len);
11928 
11929 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11930 			reference->iv.data, reference->iv.len);
11931 
11932 	sym_op->cipher.data.length = 0;
11933 	sym_op->cipher.data.offset = 0;
11934 
11935 	sym_op->auth.data.length = reference->plaintext.len;
11936 	sym_op->auth.data.offset = 0;
11937 
11938 	return 0;
11939 }
11940 
11941 static int
11942 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
11943 		struct crypto_unittest_params *ut_params,
11944 		const struct test_crypto_vector *reference,
11945 		unsigned int auth_generate)
11946 {
11947 	/* Generate Crypto op data structure */
11948 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11949 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11950 	TEST_ASSERT_NOT_NULL(ut_params->op,
11951 			"Failed to allocate pktmbuf offload");
11952 
11953 	/* Set crypto operation data parameters */
11954 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11955 
11956 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11957 
11958 	/* set crypto operation source mbuf */
11959 	sym_op->m_src = ut_params->ibuf;
11960 
11961 	/* digest */
11962 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11963 			ut_params->ibuf, reference->digest.len);
11964 
11965 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11966 			"no room to append auth tag");
11967 
11968 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11969 			ut_params->ibuf, reference->ciphertext.len);
11970 
11971 	if (auth_generate)
11972 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
11973 	else
11974 		memcpy(sym_op->auth.digest.data,
11975 				reference->digest.data,
11976 				reference->digest.len);
11977 
11978 	debug_hexdump(stdout, "digest:",
11979 			sym_op->auth.digest.data,
11980 			reference->digest.len);
11981 
11982 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
11983 			reference->iv.data, reference->iv.len);
11984 
11985 	sym_op->cipher.data.length = reference->cipher_len;
11986 	sym_op->cipher.data.offset = reference->cipher_offset;
11987 
11988 	sym_op->auth.data.length = reference->plaintext.len;
11989 	sym_op->auth.data.offset = reference->auth_offset;
11990 
11991 	return 0;
11992 }
11993 
11994 static int
11995 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
11996 		struct crypto_unittest_params *ut_params,
11997 		const struct test_crypto_vector *reference)
11998 {
11999 	return create_auth_operation(ts_params, ut_params, reference, 0);
12000 }
12001 
12002 static int
12003 create_auth_verify_GMAC_operation(
12004 		struct crypto_testsuite_params *ts_params,
12005 		struct crypto_unittest_params *ut_params,
12006 		const struct test_crypto_vector *reference)
12007 {
12008 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
12009 }
12010 
12011 static int
12012 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
12013 		struct crypto_unittest_params *ut_params,
12014 		const struct test_crypto_vector *reference)
12015 {
12016 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
12017 }
12018 
12019 static int
12020 test_authentication_verify_fail_when_data_corruption(
12021 		struct crypto_testsuite_params *ts_params,
12022 		struct crypto_unittest_params *ut_params,
12023 		const struct test_crypto_vector *reference,
12024 		unsigned int data_corrupted)
12025 {
12026 	int retval;
12027 
12028 	uint8_t *plaintext;
12029 	struct rte_cryptodev_info dev_info;
12030 
12031 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12032 	uint64_t feat_flags = dev_info.feature_flags;
12033 
12034 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12035 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12036 		printf("Device doesn't support RAW data-path APIs.\n");
12037 		return -ENOTSUP;
12038 	}
12039 
12040 	/* Verify the capabilities */
12041 	struct rte_cryptodev_sym_capability_idx cap_idx;
12042 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12043 	cap_idx.algo.auth = reference->auth_algo;
12044 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12045 			&cap_idx) == NULL)
12046 		return -ENOTSUP;
12047 
12048 
12049 	/* Create session */
12050 	retval = create_auth_session(ut_params,
12051 			ts_params->valid_devs[0],
12052 			reference,
12053 			RTE_CRYPTO_AUTH_OP_VERIFY);
12054 	if (retval < 0)
12055 		return retval;
12056 
12057 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12058 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12059 			"Failed to allocate input buffer in mempool");
12060 
12061 	/* clear mbuf payload */
12062 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12063 			rte_pktmbuf_tailroom(ut_params->ibuf));
12064 
12065 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12066 			reference->plaintext.len);
12067 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12068 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12069 
12070 	debug_hexdump(stdout, "plaintext:", plaintext,
12071 		reference->plaintext.len);
12072 
12073 	/* Create operation */
12074 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
12075 
12076 	if (retval < 0)
12077 		return retval;
12078 
12079 	if (data_corrupted)
12080 		data_corruption(plaintext);
12081 	else
12082 		tag_corruption(plaintext, reference->plaintext.len);
12083 
12084 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12085 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12086 			ut_params->op);
12087 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12088 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12089 			"authentication not failed");
12090 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12091 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12092 				ut_params->op, 0, 1, 0, 0);
12093 	else {
12094 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12095 			ut_params->op);
12096 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12097 	}
12098 
12099 	return 0;
12100 }
12101 
12102 static int
12103 test_authentication_verify_GMAC_fail_when_corruption(
12104 		struct crypto_testsuite_params *ts_params,
12105 		struct crypto_unittest_params *ut_params,
12106 		const struct test_crypto_vector *reference,
12107 		unsigned int data_corrupted)
12108 {
12109 	int retval;
12110 	uint8_t *plaintext;
12111 	struct rte_cryptodev_info dev_info;
12112 
12113 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12114 	uint64_t feat_flags = dev_info.feature_flags;
12115 
12116 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12117 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12118 		printf("Device doesn't support RAW data-path APIs.\n");
12119 		return -ENOTSUP;
12120 	}
12121 
12122 	/* Verify the capabilities */
12123 	struct rte_cryptodev_sym_capability_idx cap_idx;
12124 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12125 	cap_idx.algo.auth = reference->auth_algo;
12126 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12127 			&cap_idx) == NULL)
12128 		return -ENOTSUP;
12129 
12130 	/* Create session */
12131 	retval = create_auth_cipher_session(ut_params,
12132 			ts_params->valid_devs[0],
12133 			reference,
12134 			RTE_CRYPTO_AUTH_OP_VERIFY,
12135 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12136 	if (retval < 0)
12137 		return retval;
12138 
12139 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12140 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12141 			"Failed to allocate input buffer in mempool");
12142 
12143 	/* clear mbuf payload */
12144 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12145 			rte_pktmbuf_tailroom(ut_params->ibuf));
12146 
12147 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12148 			reference->plaintext.len);
12149 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12150 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12151 
12152 	debug_hexdump(stdout, "plaintext:", plaintext,
12153 		reference->plaintext.len);
12154 
12155 	/* Create operation */
12156 	retval = create_auth_verify_GMAC_operation(ts_params,
12157 			ut_params,
12158 			reference);
12159 
12160 	if (retval < 0)
12161 		return retval;
12162 
12163 	if (data_corrupted)
12164 		data_corruption(plaintext);
12165 	else
12166 		tag_corruption(plaintext, reference->aad.len);
12167 
12168 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12169 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12170 			ut_params->op);
12171 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12172 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12173 			"authentication not failed");
12174 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12175 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12176 				ut_params->op, 0, 1, 0, 0);
12177 	else {
12178 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12179 			ut_params->op);
12180 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12181 	}
12182 
12183 	return 0;
12184 }
12185 
12186 static int
12187 test_authenticated_decryption_fail_when_corruption(
12188 		struct crypto_testsuite_params *ts_params,
12189 		struct crypto_unittest_params *ut_params,
12190 		const struct test_crypto_vector *reference,
12191 		unsigned int data_corrupted)
12192 {
12193 	int retval;
12194 
12195 	uint8_t *ciphertext;
12196 	struct rte_cryptodev_info dev_info;
12197 
12198 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12199 	uint64_t feat_flags = dev_info.feature_flags;
12200 
12201 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12202 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12203 		printf("Device doesn't support RAW data-path APIs.\n");
12204 		return -ENOTSUP;
12205 	}
12206 
12207 	/* Verify the capabilities */
12208 	struct rte_cryptodev_sym_capability_idx cap_idx;
12209 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12210 	cap_idx.algo.auth = reference->auth_algo;
12211 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12212 			&cap_idx) == NULL)
12213 		return -ENOTSUP;
12214 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12215 	cap_idx.algo.cipher = reference->crypto_algo;
12216 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12217 			&cap_idx) == NULL)
12218 		return -ENOTSUP;
12219 
12220 	/* Create session */
12221 	retval = create_auth_cipher_session(ut_params,
12222 			ts_params->valid_devs[0],
12223 			reference,
12224 			RTE_CRYPTO_AUTH_OP_VERIFY,
12225 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
12226 	if (retval < 0)
12227 		return retval;
12228 
12229 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12230 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12231 			"Failed to allocate input buffer in mempool");
12232 
12233 	/* clear mbuf payload */
12234 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12235 			rte_pktmbuf_tailroom(ut_params->ibuf));
12236 
12237 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12238 			reference->ciphertext.len);
12239 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12240 	memcpy(ciphertext, reference->ciphertext.data,
12241 			reference->ciphertext.len);
12242 
12243 	/* Create operation */
12244 	retval = create_cipher_auth_verify_operation(ts_params,
12245 			ut_params,
12246 			reference);
12247 
12248 	if (retval < 0)
12249 		return retval;
12250 
12251 	if (data_corrupted)
12252 		data_corruption(ciphertext);
12253 	else
12254 		tag_corruption(ciphertext, reference->ciphertext.len);
12255 
12256 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
12257 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12258 			ut_params->op);
12259 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
12260 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12261 			"authentication not failed");
12262 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12263 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12264 				ut_params->op, 1, 1, 0, 0);
12265 	else {
12266 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12267 			ut_params->op);
12268 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
12269 	}
12270 
12271 	return 0;
12272 }
12273 
12274 static int
12275 test_authenticated_encryt_with_esn(
12276 		struct crypto_testsuite_params *ts_params,
12277 		struct crypto_unittest_params *ut_params,
12278 		const struct test_crypto_vector *reference)
12279 {
12280 	int retval;
12281 
12282 	uint8_t *authciphertext, *plaintext, *auth_tag;
12283 	uint16_t plaintext_pad_len;
12284 	uint8_t cipher_key[reference->cipher_key.len + 1];
12285 	uint8_t auth_key[reference->auth_key.len + 1];
12286 	struct rte_cryptodev_info dev_info;
12287 
12288 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12289 	uint64_t feat_flags = dev_info.feature_flags;
12290 
12291 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12292 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12293 		printf("Device doesn't support RAW data-path APIs.\n");
12294 		return -ENOTSUP;
12295 	}
12296 
12297 	/* Verify the capabilities */
12298 	struct rte_cryptodev_sym_capability_idx cap_idx;
12299 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12300 	cap_idx.algo.auth = reference->auth_algo;
12301 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12302 			&cap_idx) == NULL)
12303 		return -ENOTSUP;
12304 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12305 	cap_idx.algo.cipher = reference->crypto_algo;
12306 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12307 			&cap_idx) == NULL)
12308 		return -ENOTSUP;
12309 
12310 	/* Create session */
12311 	memcpy(cipher_key, reference->cipher_key.data,
12312 			reference->cipher_key.len);
12313 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12314 
12315 	/* Setup Cipher Parameters */
12316 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12317 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12318 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12319 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12320 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12321 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12322 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12323 
12324 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12325 
12326 	/* Setup Authentication Parameters */
12327 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12328 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12329 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12330 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12331 	ut_params->auth_xform.auth.key.data = auth_key;
12332 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12333 	ut_params->auth_xform.next = NULL;
12334 
12335 	/* Create Crypto session*/
12336 	ut_params->sess = rte_cryptodev_sym_session_create(
12337 			ts_params->session_mpool);
12338 
12339 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12340 				ut_params->sess,
12341 				&ut_params->cipher_xform,
12342 				ts_params->session_priv_mpool);
12343 
12344 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12345 
12346 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12347 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12348 			"Failed to allocate input buffer in mempool");
12349 
12350 	/* clear mbuf payload */
12351 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12352 			rte_pktmbuf_tailroom(ut_params->ibuf));
12353 
12354 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12355 			reference->plaintext.len);
12356 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12357 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
12358 
12359 	/* Create operation */
12360 	retval = create_cipher_auth_operation(ts_params,
12361 			ut_params,
12362 			reference, 0);
12363 
12364 	if (retval < 0)
12365 		return retval;
12366 
12367 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12368 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12369 			ut_params->op);
12370 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12371 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12372 				ut_params->op, 1, 1, 0, 0);
12373 	else
12374 		ut_params->op = process_crypto_request(
12375 			ts_params->valid_devs[0], ut_params->op);
12376 
12377 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
12378 
12379 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12380 			"crypto op processing failed");
12381 
12382 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
12383 
12384 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
12385 			ut_params->op->sym->auth.data.offset);
12386 	auth_tag = authciphertext + plaintext_pad_len;
12387 	debug_hexdump(stdout, "ciphertext:", authciphertext,
12388 			reference->ciphertext.len);
12389 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
12390 
12391 	/* Validate obuf */
12392 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12393 			authciphertext,
12394 			reference->ciphertext.data,
12395 			reference->ciphertext.len,
12396 			"Ciphertext data not as expected");
12397 
12398 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12399 			auth_tag,
12400 			reference->digest.data,
12401 			reference->digest.len,
12402 			"Generated digest not as expected");
12403 
12404 	return TEST_SUCCESS;
12405 
12406 }
12407 
12408 static int
12409 test_authenticated_decrypt_with_esn(
12410 		struct crypto_testsuite_params *ts_params,
12411 		struct crypto_unittest_params *ut_params,
12412 		const struct test_crypto_vector *reference)
12413 {
12414 	int retval;
12415 
12416 	uint8_t *ciphertext;
12417 	uint8_t cipher_key[reference->cipher_key.len + 1];
12418 	uint8_t auth_key[reference->auth_key.len + 1];
12419 	struct rte_cryptodev_info dev_info;
12420 
12421 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12422 	uint64_t feat_flags = dev_info.feature_flags;
12423 
12424 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12425 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12426 		printf("Device doesn't support RAW data-path APIs.\n");
12427 		return -ENOTSUP;
12428 	}
12429 
12430 	/* Verify the capabilities */
12431 	struct rte_cryptodev_sym_capability_idx cap_idx;
12432 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12433 	cap_idx.algo.auth = reference->auth_algo;
12434 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12435 			&cap_idx) == NULL)
12436 		return -ENOTSUP;
12437 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12438 	cap_idx.algo.cipher = reference->crypto_algo;
12439 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12440 			&cap_idx) == NULL)
12441 		return -ENOTSUP;
12442 
12443 	/* Create session */
12444 	memcpy(cipher_key, reference->cipher_key.data,
12445 			reference->cipher_key.len);
12446 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
12447 
12448 	/* Setup Authentication Parameters */
12449 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12450 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
12451 	ut_params->auth_xform.auth.algo = reference->auth_algo;
12452 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
12453 	ut_params->auth_xform.auth.key.data = auth_key;
12454 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
12455 	ut_params->auth_xform.next = &ut_params->cipher_xform;
12456 
12457 	/* Setup Cipher Parameters */
12458 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12459 	ut_params->cipher_xform.next = NULL;
12460 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
12461 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
12462 	ut_params->cipher_xform.cipher.key.data = cipher_key;
12463 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
12464 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
12465 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
12466 
12467 	/* Create Crypto session*/
12468 	ut_params->sess = rte_cryptodev_sym_session_create(
12469 			ts_params->session_mpool);
12470 
12471 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12472 				ut_params->sess,
12473 				&ut_params->auth_xform,
12474 				ts_params->session_priv_mpool);
12475 
12476 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12477 
12478 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12479 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12480 			"Failed to allocate input buffer in mempool");
12481 
12482 	/* clear mbuf payload */
12483 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12484 			rte_pktmbuf_tailroom(ut_params->ibuf));
12485 
12486 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12487 			reference->ciphertext.len);
12488 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
12489 	memcpy(ciphertext, reference->ciphertext.data,
12490 			reference->ciphertext.len);
12491 
12492 	/* Create operation */
12493 	retval = create_cipher_auth_verify_operation(ts_params,
12494 			ut_params,
12495 			reference);
12496 
12497 	if (retval < 0)
12498 		return retval;
12499 
12500 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12501 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12502 			ut_params->op);
12503 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12504 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12505 				ut_params->op, 1, 1, 0, 0);
12506 	else
12507 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
12508 			ut_params->op);
12509 
12510 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
12511 	TEST_ASSERT_EQUAL(ut_params->op->status,
12512 			RTE_CRYPTO_OP_STATUS_SUCCESS,
12513 			"crypto op processing passed");
12514 
12515 	ut_params->obuf = ut_params->op->sym->m_src;
12516 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
12517 
12518 	return 0;
12519 }
12520 
12521 static int
12522 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
12523 		const struct aead_test_data *tdata,
12524 		void *digest_mem, uint64_t digest_phys)
12525 {
12526 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12527 	struct crypto_unittest_params *ut_params = &unittest_params;
12528 
12529 	const unsigned int auth_tag_len = tdata->auth_tag.len;
12530 	const unsigned int iv_len = tdata->iv.len;
12531 	unsigned int aad_len = tdata->aad.len;
12532 	unsigned int aad_len_pad = 0;
12533 
12534 	/* Generate Crypto op data structure */
12535 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12536 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12537 	TEST_ASSERT_NOT_NULL(ut_params->op,
12538 		"Failed to allocate symmetric crypto operation struct");
12539 
12540 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
12541 
12542 	sym_op->aead.digest.data = digest_mem;
12543 
12544 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
12545 			"no room to append digest");
12546 
12547 	sym_op->aead.digest.phys_addr = digest_phys;
12548 
12549 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
12550 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
12551 				auth_tag_len);
12552 		debug_hexdump(stdout, "digest:",
12553 				sym_op->aead.digest.data,
12554 				auth_tag_len);
12555 	}
12556 
12557 	/* Append aad data */
12558 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
12559 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12560 				uint8_t *, IV_OFFSET);
12561 
12562 		/* Copy IV 1 byte after the IV pointer, according to the API */
12563 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
12564 
12565 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
12566 
12567 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12568 				ut_params->ibuf, aad_len);
12569 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12570 				"no room to prepend aad");
12571 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12572 				ut_params->ibuf);
12573 
12574 		memset(sym_op->aead.aad.data, 0, aad_len);
12575 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
12576 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12577 
12578 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12579 		debug_hexdump(stdout, "aad:",
12580 				sym_op->aead.aad.data, aad_len);
12581 	} else {
12582 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12583 				uint8_t *, IV_OFFSET);
12584 
12585 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
12586 
12587 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
12588 
12589 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
12590 				ut_params->ibuf, aad_len_pad);
12591 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
12592 				"no room to prepend aad");
12593 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
12594 				ut_params->ibuf);
12595 
12596 		memset(sym_op->aead.aad.data, 0, aad_len);
12597 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
12598 
12599 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
12600 		debug_hexdump(stdout, "aad:",
12601 				sym_op->aead.aad.data, aad_len);
12602 	}
12603 
12604 	sym_op->aead.data.length = tdata->plaintext.len;
12605 	sym_op->aead.data.offset = aad_len_pad;
12606 
12607 	return 0;
12608 }
12609 
12610 #define SGL_MAX_NO	16
12611 
12612 static int
12613 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
12614 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
12615 {
12616 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12617 	struct crypto_unittest_params *ut_params = &unittest_params;
12618 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
12619 	int retval;
12620 	int to_trn = 0;
12621 	int to_trn_tbl[SGL_MAX_NO];
12622 	int segs = 1;
12623 	unsigned int trn_data = 0;
12624 	uint8_t *plaintext, *ciphertext, *auth_tag;
12625 	struct rte_cryptodev_info dev_info;
12626 
12627 	/* Verify the capabilities */
12628 	struct rte_cryptodev_sym_capability_idx cap_idx;
12629 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
12630 	cap_idx.algo.aead = tdata->algo;
12631 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12632 			&cap_idx) == NULL)
12633 		return -ENOTSUP;
12634 
12635 	/* OOP not supported with CPU crypto */
12636 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12637 		return -ENOTSUP;
12638 
12639 	/* Detailed check for the particular SGL support flag */
12640 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12641 	if (!oop) {
12642 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12643 		if (sgl_in && (!(dev_info.feature_flags &
12644 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
12645 			return -ENOTSUP;
12646 
12647 		uint64_t feat_flags = dev_info.feature_flags;
12648 
12649 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12650 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12651 			printf("Device doesn't support RAW data-path APIs.\n");
12652 			return -ENOTSUP;
12653 		}
12654 	} else {
12655 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
12656 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
12657 				tdata->plaintext.len;
12658 		/* Raw data path API does not support OOP */
12659 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12660 			return -ENOTSUP;
12661 		if (sgl_in && !sgl_out) {
12662 			if (!(dev_info.feature_flags &
12663 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
12664 				return -ENOTSUP;
12665 		} else if (!sgl_in && sgl_out) {
12666 			if (!(dev_info.feature_flags &
12667 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
12668 				return -ENOTSUP;
12669 		} else if (sgl_in && sgl_out) {
12670 			if (!(dev_info.feature_flags &
12671 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
12672 				return -ENOTSUP;
12673 		}
12674 	}
12675 
12676 	if (fragsz > tdata->plaintext.len)
12677 		fragsz = tdata->plaintext.len;
12678 
12679 	uint16_t plaintext_len = fragsz;
12680 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
12681 
12682 	if (fragsz_oop > tdata->plaintext.len)
12683 		frag_size_oop = tdata->plaintext.len;
12684 
12685 	int ecx = 0;
12686 	void *digest_mem = NULL;
12687 
12688 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
12689 
12690 	if (tdata->plaintext.len % fragsz != 0) {
12691 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
12692 			return 1;
12693 	}	else {
12694 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
12695 			return 1;
12696 	}
12697 
12698 	/*
12699 	 * For out-op-place we need to alloc another mbuf
12700 	 */
12701 	if (oop) {
12702 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12703 		rte_pktmbuf_append(ut_params->obuf,
12704 				frag_size_oop + prepend_len);
12705 		buf_oop = ut_params->obuf;
12706 	}
12707 
12708 	/* Create AEAD session */
12709 	retval = create_aead_session(ts_params->valid_devs[0],
12710 			tdata->algo,
12711 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
12712 			tdata->key.data, tdata->key.len,
12713 			tdata->aad.len, tdata->auth_tag.len,
12714 			tdata->iv.len);
12715 	if (retval < 0)
12716 		return retval;
12717 
12718 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12719 
12720 	/* clear mbuf payload */
12721 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12722 			rte_pktmbuf_tailroom(ut_params->ibuf));
12723 
12724 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12725 			plaintext_len);
12726 
12727 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
12728 
12729 	trn_data += plaintext_len;
12730 
12731 	buf = ut_params->ibuf;
12732 
12733 	/*
12734 	 * Loop until no more fragments
12735 	 */
12736 
12737 	while (trn_data < tdata->plaintext.len) {
12738 		++segs;
12739 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
12740 				(tdata->plaintext.len - trn_data) : fragsz;
12741 
12742 		to_trn_tbl[ecx++] = to_trn;
12743 
12744 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12745 		buf = buf->next;
12746 
12747 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
12748 				rte_pktmbuf_tailroom(buf));
12749 
12750 		/* OOP */
12751 		if (oop && !fragsz_oop) {
12752 			buf_last_oop = buf_oop->next =
12753 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12754 			buf_oop = buf_oop->next;
12755 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12756 					0, rte_pktmbuf_tailroom(buf_oop));
12757 			rte_pktmbuf_append(buf_oop, to_trn);
12758 		}
12759 
12760 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
12761 				to_trn);
12762 
12763 		memcpy(plaintext, tdata->plaintext.data + trn_data,
12764 				to_trn);
12765 		trn_data += to_trn;
12766 		if (trn_data  == tdata->plaintext.len) {
12767 			if (oop) {
12768 				if (!fragsz_oop)
12769 					digest_mem = rte_pktmbuf_append(buf_oop,
12770 						tdata->auth_tag.len);
12771 			} else
12772 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
12773 					tdata->auth_tag.len);
12774 		}
12775 	}
12776 
12777 	uint64_t digest_phys = 0;
12778 
12779 	ut_params->ibuf->nb_segs = segs;
12780 
12781 	segs = 1;
12782 	if (fragsz_oop && oop) {
12783 		to_trn = 0;
12784 		ecx = 0;
12785 
12786 		if (frag_size_oop == tdata->plaintext.len) {
12787 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
12788 				tdata->auth_tag.len);
12789 
12790 			digest_phys = rte_pktmbuf_iova_offset(
12791 					ut_params->obuf,
12792 					tdata->plaintext.len + prepend_len);
12793 		}
12794 
12795 		trn_data = frag_size_oop;
12796 		while (trn_data < tdata->plaintext.len) {
12797 			++segs;
12798 			to_trn =
12799 				(tdata->plaintext.len - trn_data <
12800 						frag_size_oop) ?
12801 				(tdata->plaintext.len - trn_data) :
12802 						frag_size_oop;
12803 
12804 			to_trn_tbl[ecx++] = to_trn;
12805 
12806 			buf_last_oop = buf_oop->next =
12807 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
12808 			buf_oop = buf_oop->next;
12809 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
12810 					0, rte_pktmbuf_tailroom(buf_oop));
12811 			rte_pktmbuf_append(buf_oop, to_trn);
12812 
12813 			trn_data += to_trn;
12814 
12815 			if (trn_data  == tdata->plaintext.len) {
12816 				digest_mem = rte_pktmbuf_append(buf_oop,
12817 					tdata->auth_tag.len);
12818 			}
12819 		}
12820 
12821 		ut_params->obuf->nb_segs = segs;
12822 	}
12823 
12824 	/*
12825 	 * Place digest at the end of the last buffer
12826 	 */
12827 	if (!digest_phys)
12828 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
12829 	if (oop && buf_last_oop)
12830 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
12831 
12832 	if (!digest_mem && !oop) {
12833 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12834 				+ tdata->auth_tag.len);
12835 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
12836 				tdata->plaintext.len);
12837 	}
12838 
12839 	/* Create AEAD operation */
12840 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
12841 			tdata, digest_mem, digest_phys);
12842 
12843 	if (retval < 0)
12844 		return retval;
12845 
12846 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12847 
12848 	ut_params->op->sym->m_src = ut_params->ibuf;
12849 	if (oop)
12850 		ut_params->op->sym->m_dst = ut_params->obuf;
12851 
12852 	/* Process crypto operation */
12853 	if (oop == IN_PLACE &&
12854 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12855 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
12856 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12857 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12858 				ut_params->op, 0, 0, 0, 0);
12859 	else
12860 		TEST_ASSERT_NOT_NULL(
12861 			process_crypto_request(ts_params->valid_devs[0],
12862 			ut_params->op), "failed to process sym crypto op");
12863 
12864 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12865 			"crypto op processing failed");
12866 
12867 
12868 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
12869 			uint8_t *, prepend_len);
12870 	if (oop) {
12871 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12872 				uint8_t *, prepend_len);
12873 	}
12874 
12875 	if (fragsz_oop)
12876 		fragsz = fragsz_oop;
12877 
12878 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12879 			ciphertext,
12880 			tdata->ciphertext.data,
12881 			fragsz,
12882 			"Ciphertext data not as expected");
12883 
12884 	buf = ut_params->op->sym->m_src->next;
12885 	if (oop)
12886 		buf = ut_params->op->sym->m_dst->next;
12887 
12888 	unsigned int off = fragsz;
12889 
12890 	ecx = 0;
12891 	while (buf) {
12892 		ciphertext = rte_pktmbuf_mtod(buf,
12893 				uint8_t *);
12894 
12895 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
12896 				ciphertext,
12897 				tdata->ciphertext.data + off,
12898 				to_trn_tbl[ecx],
12899 				"Ciphertext data not as expected");
12900 
12901 		off += to_trn_tbl[ecx++];
12902 		buf = buf->next;
12903 	}
12904 
12905 	auth_tag = digest_mem;
12906 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12907 			auth_tag,
12908 			tdata->auth_tag.data,
12909 			tdata->auth_tag.len,
12910 			"Generated auth tag not as expected");
12911 
12912 	return 0;
12913 }
12914 
12915 static int
12916 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
12917 {
12918 	return test_authenticated_encryption_SGL(
12919 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
12920 }
12921 
12922 static int
12923 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
12924 {
12925 	return test_authenticated_encryption_SGL(
12926 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
12927 }
12928 
12929 static int
12930 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
12931 {
12932 	return test_authenticated_encryption_SGL(
12933 			&gcm_test_case_8, OUT_OF_PLACE, 400,
12934 			gcm_test_case_8.plaintext.len);
12935 }
12936 
12937 static int
12938 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
12939 {
12940 	/* This test is not for OPENSSL PMD */
12941 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
12942 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
12943 		return -ENOTSUP;
12944 
12945 	return test_authenticated_encryption_SGL(
12946 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
12947 }
12948 
12949 static int
12950 test_authentication_verify_fail_when_data_corrupted(
12951 		struct crypto_testsuite_params *ts_params,
12952 		struct crypto_unittest_params *ut_params,
12953 		const struct test_crypto_vector *reference)
12954 {
12955 	return test_authentication_verify_fail_when_data_corruption(
12956 			ts_params, ut_params, reference, 1);
12957 }
12958 
12959 static int
12960 test_authentication_verify_fail_when_tag_corrupted(
12961 		struct crypto_testsuite_params *ts_params,
12962 		struct crypto_unittest_params *ut_params,
12963 		const struct test_crypto_vector *reference)
12964 {
12965 	return test_authentication_verify_fail_when_data_corruption(
12966 			ts_params, ut_params, reference, 0);
12967 }
12968 
12969 static int
12970 test_authentication_verify_GMAC_fail_when_data_corrupted(
12971 		struct crypto_testsuite_params *ts_params,
12972 		struct crypto_unittest_params *ut_params,
12973 		const struct test_crypto_vector *reference)
12974 {
12975 	return test_authentication_verify_GMAC_fail_when_corruption(
12976 			ts_params, ut_params, reference, 1);
12977 }
12978 
12979 static int
12980 test_authentication_verify_GMAC_fail_when_tag_corrupted(
12981 		struct crypto_testsuite_params *ts_params,
12982 		struct crypto_unittest_params *ut_params,
12983 		const struct test_crypto_vector *reference)
12984 {
12985 	return test_authentication_verify_GMAC_fail_when_corruption(
12986 			ts_params, ut_params, reference, 0);
12987 }
12988 
12989 static int
12990 test_authenticated_decryption_fail_when_data_corrupted(
12991 		struct crypto_testsuite_params *ts_params,
12992 		struct crypto_unittest_params *ut_params,
12993 		const struct test_crypto_vector *reference)
12994 {
12995 	return test_authenticated_decryption_fail_when_corruption(
12996 			ts_params, ut_params, reference, 1);
12997 }
12998 
12999 static int
13000 test_authenticated_decryption_fail_when_tag_corrupted(
13001 		struct crypto_testsuite_params *ts_params,
13002 		struct crypto_unittest_params *ut_params,
13003 		const struct test_crypto_vector *reference)
13004 {
13005 	return test_authenticated_decryption_fail_when_corruption(
13006 			ts_params, ut_params, reference, 0);
13007 }
13008 
13009 static int
13010 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
13011 {
13012 	return test_authentication_verify_fail_when_data_corrupted(
13013 			&testsuite_params, &unittest_params,
13014 			&hmac_sha1_test_crypto_vector);
13015 }
13016 
13017 static int
13018 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
13019 {
13020 	return test_authentication_verify_fail_when_tag_corrupted(
13021 			&testsuite_params, &unittest_params,
13022 			&hmac_sha1_test_crypto_vector);
13023 }
13024 
13025 static int
13026 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
13027 {
13028 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
13029 			&testsuite_params, &unittest_params,
13030 			&aes128_gmac_test_vector);
13031 }
13032 
13033 static int
13034 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
13035 {
13036 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
13037 			&testsuite_params, &unittest_params,
13038 			&aes128_gmac_test_vector);
13039 }
13040 
13041 static int
13042 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
13043 {
13044 	return test_authenticated_decryption_fail_when_data_corrupted(
13045 			&testsuite_params,
13046 			&unittest_params,
13047 			&aes128cbc_hmac_sha1_test_vector);
13048 }
13049 
13050 static int
13051 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
13052 {
13053 	return test_authenticated_decryption_fail_when_tag_corrupted(
13054 			&testsuite_params,
13055 			&unittest_params,
13056 			&aes128cbc_hmac_sha1_test_vector);
13057 }
13058 
13059 static int
13060 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13061 {
13062 	return test_authenticated_encryt_with_esn(
13063 			&testsuite_params,
13064 			&unittest_params,
13065 			&aes128cbc_hmac_sha1_aad_test_vector);
13066 }
13067 
13068 static int
13069 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
13070 {
13071 	return test_authenticated_decrypt_with_esn(
13072 			&testsuite_params,
13073 			&unittest_params,
13074 			&aes128cbc_hmac_sha1_aad_test_vector);
13075 }
13076 
13077 static int
13078 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
13079 {
13080 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
13081 }
13082 
13083 static int
13084 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
13085 {
13086 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
13087 }
13088 
13089 #ifdef RTE_CRYPTO_SCHEDULER
13090 
13091 /* global AESNI worker IDs for the scheduler test */
13092 uint8_t aesni_ids[2];
13093 
13094 static int
13095 test_scheduler_attach_slave_op(void)
13096 {
13097 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13098 	uint8_t sched_id = ts_params->valid_devs[0];
13099 	uint32_t nb_devs, i, nb_devs_attached = 0;
13100 	int ret;
13101 	char vdev_name[32];
13102 
13103 	/* create 2 AESNI_MB if necessary */
13104 	nb_devs = rte_cryptodev_device_count_by_driver(
13105 			rte_cryptodev_driver_id_get(
13106 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)));
13107 	if (nb_devs < 2) {
13108 		for (i = nb_devs; i < 2; i++) {
13109 			snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
13110 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
13111 					i);
13112 			ret = rte_vdev_init(vdev_name, NULL);
13113 
13114 			TEST_ASSERT(ret == 0,
13115 				"Failed to create instance %u of"
13116 				" pmd : %s",
13117 				i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13118 		}
13119 	}
13120 
13121 	/* attach 2 AESNI_MB cdevs */
13122 	for (i = 0; i < rte_cryptodev_count() && nb_devs_attached < 2;
13123 			i++) {
13124 		struct rte_cryptodev_info info;
13125 		unsigned int session_size;
13126 
13127 		rte_cryptodev_info_get(i, &info);
13128 		if (info.driver_id != rte_cryptodev_driver_id_get(
13129 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
13130 			continue;
13131 
13132 		session_size = rte_cryptodev_sym_get_private_session_size(i);
13133 		/*
13134 		 * Create the session mempool again, since now there are new devices
13135 		 * to use the mempool.
13136 		 */
13137 		if (ts_params->session_mpool) {
13138 			rte_mempool_free(ts_params->session_mpool);
13139 			ts_params->session_mpool = NULL;
13140 		}
13141 		if (ts_params->session_priv_mpool) {
13142 			rte_mempool_free(ts_params->session_priv_mpool);
13143 			ts_params->session_priv_mpool = NULL;
13144 		}
13145 
13146 		if (info.sym.max_nb_sessions != 0 &&
13147 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
13148 			RTE_LOG(ERR, USER1,
13149 					"Device does not support "
13150 					"at least %u sessions\n",
13151 					MAX_NB_SESSIONS);
13152 			return TEST_FAILED;
13153 		}
13154 		/*
13155 		 * Create mempool with maximum number of sessions,
13156 		 * to include the session headers
13157 		 */
13158 		if (ts_params->session_mpool == NULL) {
13159 			ts_params->session_mpool =
13160 				rte_cryptodev_sym_session_pool_create(
13161 						"test_sess_mp",
13162 						MAX_NB_SESSIONS, 0, 0, 0,
13163 						SOCKET_ID_ANY);
13164 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
13165 					"session mempool allocation failed");
13166 		}
13167 
13168 		/*
13169 		 * Create mempool with maximum number of sessions,
13170 		 * to include device specific session private data
13171 		 */
13172 		if (ts_params->session_priv_mpool == NULL) {
13173 			ts_params->session_priv_mpool = rte_mempool_create(
13174 					"test_sess_mp_priv",
13175 					MAX_NB_SESSIONS,
13176 					session_size,
13177 					0, 0, NULL, NULL, NULL,
13178 					NULL, SOCKET_ID_ANY,
13179 					0);
13180 
13181 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
13182 					"session mempool allocation failed");
13183 		}
13184 
13185 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
13186 		ts_params->qp_conf.mp_session_private =
13187 				ts_params->session_priv_mpool;
13188 
13189 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
13190 				(uint8_t)i);
13191 
13192 		TEST_ASSERT(ret == 0,
13193 			"Failed to attach device %u of pmd : %s", i,
13194 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
13195 
13196 		aesni_ids[nb_devs_attached] = (uint8_t)i;
13197 
13198 		nb_devs_attached++;
13199 	}
13200 
13201 	return 0;
13202 }
13203 
13204 static int
13205 test_scheduler_detach_slave_op(void)
13206 {
13207 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13208 	uint8_t sched_id = ts_params->valid_devs[0];
13209 	uint32_t i;
13210 	int ret;
13211 
13212 	for (i = 0; i < 2; i++) {
13213 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
13214 				aesni_ids[i]);
13215 		TEST_ASSERT(ret == 0,
13216 			"Failed to detach device %u", aesni_ids[i]);
13217 	}
13218 
13219 	return 0;
13220 }
13221 
13222 static int
13223 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
13224 {
13225 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13226 	uint8_t sched_id = ts_params->valid_devs[0];
13227 	/* set mode */
13228 	return rte_cryptodev_scheduler_mode_set(sched_id,
13229 		scheduler_mode);
13230 }
13231 
13232 static int
13233 test_scheduler_mode_roundrobin_op(void)
13234 {
13235 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
13236 			0, "Failed to set roundrobin mode");
13237 	return 0;
13238 
13239 }
13240 
13241 static int
13242 test_scheduler_mode_multicore_op(void)
13243 {
13244 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
13245 			0, "Failed to set multicore mode");
13246 
13247 	return 0;
13248 }
13249 
13250 static int
13251 test_scheduler_mode_failover_op(void)
13252 {
13253 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
13254 			0, "Failed to set failover mode");
13255 
13256 	return 0;
13257 }
13258 
13259 static int
13260 test_scheduler_mode_pkt_size_distr_op(void)
13261 {
13262 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
13263 			0, "Failed to set pktsize mode");
13264 
13265 	return 0;
13266 }
13267 
13268 static struct unit_test_suite cryptodev_scheduler_testsuite  = {
13269 	.suite_name = "Crypto Device Scheduler Unit Test Suite",
13270 	.setup = testsuite_setup,
13271 	.teardown = testsuite_teardown,
13272 	.unit_test_cases = {
13273 		/* Multi Core */
13274 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13275 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_multicore_op),
13276 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13277 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13278 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13279 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13280 
13281 		/* Round Robin */
13282 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13283 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_roundrobin_op),
13284 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13285 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13286 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13287 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13288 
13289 		/* Fail over */
13290 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13291 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_failover_op),
13292 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13293 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13294 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13295 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13296 
13297 		/* PKT SIZE */
13298 		TEST_CASE_ST(NULL, NULL, test_scheduler_attach_slave_op),
13299 		TEST_CASE_ST(NULL, NULL, test_scheduler_mode_pkt_size_distr_op),
13300 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13301 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13302 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13303 		TEST_CASE_ST(NULL, NULL, test_scheduler_detach_slave_op),
13304 
13305 		TEST_CASES_END() /**< NULL terminate unit test array */
13306 	}
13307 };
13308 
13309 #endif /* RTE_CRYPTO_SCHEDULER */
13310 
13311 static struct unit_test_suite cryptodev_testsuite  = {
13312 	.suite_name = "Crypto Unit Test Suite",
13313 	.setup = testsuite_setup,
13314 	.teardown = testsuite_teardown,
13315 	.unit_test_cases = {
13316 		TEST_CASE_ST(ut_setup, ut_teardown,
13317 				test_device_configure_invalid_dev_id),
13318 		TEST_CASE_ST(ut_setup, ut_teardown,
13319 				test_queue_pair_descriptor_setup),
13320 		TEST_CASE_ST(ut_setup, ut_teardown,
13321 				test_device_configure_invalid_queue_pair_ids),
13322 		TEST_CASE_ST(ut_setup, ut_teardown,
13323 				test_multi_session),
13324 		TEST_CASE_ST(ut_setup, ut_teardown,
13325 				test_multi_session_random_usage),
13326 
13327 		TEST_CASE_ST(ut_setup, ut_teardown,
13328 			test_null_invalid_operation),
13329 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
13330 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13331 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13332 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13333 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13334 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_cipheronly_all),
13335 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_docsis_all),
13336 		TEST_CASE_ST(ut_setup, ut_teardown, test_DES_docsis_all),
13337 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13338 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
13339 
13340 		/** AES CCM Authenticated Encryption 128 bits key */
13341 		TEST_CASE_ST(ut_setup, ut_teardown,
13342 			test_AES_CCM_authenticated_encryption_test_case_128_1),
13343 		TEST_CASE_ST(ut_setup, ut_teardown,
13344 			test_AES_CCM_authenticated_encryption_test_case_128_2),
13345 		TEST_CASE_ST(ut_setup, ut_teardown,
13346 			test_AES_CCM_authenticated_encryption_test_case_128_3),
13347 
13348 		/** AES CCM Authenticated Decryption 128 bits key*/
13349 		TEST_CASE_ST(ut_setup, ut_teardown,
13350 			test_AES_CCM_authenticated_decryption_test_case_128_1),
13351 		TEST_CASE_ST(ut_setup, ut_teardown,
13352 			test_AES_CCM_authenticated_decryption_test_case_128_2),
13353 		TEST_CASE_ST(ut_setup, ut_teardown,
13354 			test_AES_CCM_authenticated_decryption_test_case_128_3),
13355 
13356 		/** AES CCM Authenticated Encryption 192 bits key */
13357 		TEST_CASE_ST(ut_setup, ut_teardown,
13358 			test_AES_CCM_authenticated_encryption_test_case_192_1),
13359 		TEST_CASE_ST(ut_setup, ut_teardown,
13360 			test_AES_CCM_authenticated_encryption_test_case_192_2),
13361 		TEST_CASE_ST(ut_setup, ut_teardown,
13362 			test_AES_CCM_authenticated_encryption_test_case_192_3),
13363 
13364 		/** AES CCM Authenticated Decryption 192 bits key*/
13365 		TEST_CASE_ST(ut_setup, ut_teardown,
13366 			test_AES_CCM_authenticated_decryption_test_case_192_1),
13367 		TEST_CASE_ST(ut_setup, ut_teardown,
13368 			test_AES_CCM_authenticated_decryption_test_case_192_2),
13369 		TEST_CASE_ST(ut_setup, ut_teardown,
13370 			test_AES_CCM_authenticated_decryption_test_case_192_3),
13371 
13372 		/** AES CCM Authenticated Encryption 256 bits key */
13373 		TEST_CASE_ST(ut_setup, ut_teardown,
13374 			test_AES_CCM_authenticated_encryption_test_case_256_1),
13375 		TEST_CASE_ST(ut_setup, ut_teardown,
13376 			test_AES_CCM_authenticated_encryption_test_case_256_2),
13377 		TEST_CASE_ST(ut_setup, ut_teardown,
13378 			test_AES_CCM_authenticated_encryption_test_case_256_3),
13379 
13380 		/** AES CCM Authenticated Decryption 256 bits key*/
13381 		TEST_CASE_ST(ut_setup, ut_teardown,
13382 			test_AES_CCM_authenticated_decryption_test_case_256_1),
13383 		TEST_CASE_ST(ut_setup, ut_teardown,
13384 			test_AES_CCM_authenticated_decryption_test_case_256_2),
13385 		TEST_CASE_ST(ut_setup, ut_teardown,
13386 			test_AES_CCM_authenticated_decryption_test_case_256_3),
13387 
13388 		/** AES GCM Authenticated Encryption */
13389 		TEST_CASE_ST(ut_setup, ut_teardown,
13390 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
13391 		TEST_CASE_ST(ut_setup, ut_teardown,
13392 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
13393 		TEST_CASE_ST(ut_setup, ut_teardown,
13394 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
13395 		TEST_CASE_ST(ut_setup, ut_teardown,
13396 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
13397 		TEST_CASE_ST(ut_setup, ut_teardown,
13398 			test_AES_GCM_authenticated_encryption_test_case_1),
13399 		TEST_CASE_ST(ut_setup, ut_teardown,
13400 			test_AES_GCM_authenticated_encryption_test_case_2),
13401 		TEST_CASE_ST(ut_setup, ut_teardown,
13402 			test_AES_GCM_authenticated_encryption_test_case_3),
13403 		TEST_CASE_ST(ut_setup, ut_teardown,
13404 			test_AES_GCM_authenticated_encryption_test_case_4),
13405 		TEST_CASE_ST(ut_setup, ut_teardown,
13406 			test_AES_GCM_authenticated_encryption_test_case_5),
13407 		TEST_CASE_ST(ut_setup, ut_teardown,
13408 			test_AES_GCM_authenticated_encryption_test_case_6),
13409 		TEST_CASE_ST(ut_setup, ut_teardown,
13410 			test_AES_GCM_authenticated_encryption_test_case_7),
13411 		TEST_CASE_ST(ut_setup, ut_teardown,
13412 			test_AES_GCM_authenticated_encryption_test_case_8),
13413 		TEST_CASE_ST(ut_setup, ut_teardown,
13414 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
13415 
13416 		/** AES GCM Authenticated Decryption */
13417 		TEST_CASE_ST(ut_setup, ut_teardown,
13418 			test_AES_GCM_authenticated_decryption_test_case_1),
13419 		TEST_CASE_ST(ut_setup, ut_teardown,
13420 			test_AES_GCM_authenticated_decryption_test_case_2),
13421 		TEST_CASE_ST(ut_setup, ut_teardown,
13422 			test_AES_GCM_authenticated_decryption_test_case_3),
13423 		TEST_CASE_ST(ut_setup, ut_teardown,
13424 			test_AES_GCM_authenticated_decryption_test_case_4),
13425 		TEST_CASE_ST(ut_setup, ut_teardown,
13426 			test_AES_GCM_authenticated_decryption_test_case_5),
13427 		TEST_CASE_ST(ut_setup, ut_teardown,
13428 			test_AES_GCM_authenticated_decryption_test_case_6),
13429 		TEST_CASE_ST(ut_setup, ut_teardown,
13430 			test_AES_GCM_authenticated_decryption_test_case_7),
13431 		TEST_CASE_ST(ut_setup, ut_teardown,
13432 			test_AES_GCM_authenticated_decryption_test_case_8),
13433 		TEST_CASE_ST(ut_setup, ut_teardown,
13434 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
13435 
13436 		/** AES GCM Authenticated Encryption 192 bits key */
13437 		TEST_CASE_ST(ut_setup, ut_teardown,
13438 			test_AES_GCM_auth_encryption_test_case_192_1),
13439 		TEST_CASE_ST(ut_setup, ut_teardown,
13440 			test_AES_GCM_auth_encryption_test_case_192_2),
13441 		TEST_CASE_ST(ut_setup, ut_teardown,
13442 			test_AES_GCM_auth_encryption_test_case_192_3),
13443 		TEST_CASE_ST(ut_setup, ut_teardown,
13444 			test_AES_GCM_auth_encryption_test_case_192_4),
13445 		TEST_CASE_ST(ut_setup, ut_teardown,
13446 			test_AES_GCM_auth_encryption_test_case_192_5),
13447 		TEST_CASE_ST(ut_setup, ut_teardown,
13448 			test_AES_GCM_auth_encryption_test_case_192_6),
13449 		TEST_CASE_ST(ut_setup, ut_teardown,
13450 			test_AES_GCM_auth_encryption_test_case_192_7),
13451 
13452 		/** AES GCM Authenticated Decryption 192 bits key */
13453 		TEST_CASE_ST(ut_setup, ut_teardown,
13454 			test_AES_GCM_auth_decryption_test_case_192_1),
13455 		TEST_CASE_ST(ut_setup, ut_teardown,
13456 			test_AES_GCM_auth_decryption_test_case_192_2),
13457 		TEST_CASE_ST(ut_setup, ut_teardown,
13458 			test_AES_GCM_auth_decryption_test_case_192_3),
13459 		TEST_CASE_ST(ut_setup, ut_teardown,
13460 			test_AES_GCM_auth_decryption_test_case_192_4),
13461 		TEST_CASE_ST(ut_setup, ut_teardown,
13462 			test_AES_GCM_auth_decryption_test_case_192_5),
13463 		TEST_CASE_ST(ut_setup, ut_teardown,
13464 			test_AES_GCM_auth_decryption_test_case_192_6),
13465 		TEST_CASE_ST(ut_setup, ut_teardown,
13466 			test_AES_GCM_auth_decryption_test_case_192_7),
13467 
13468 		/** AES GCM Authenticated Encryption 256 bits key */
13469 		TEST_CASE_ST(ut_setup, ut_teardown,
13470 			test_AES_GCM_auth_encryption_test_case_256_1),
13471 		TEST_CASE_ST(ut_setup, ut_teardown,
13472 			test_AES_GCM_auth_encryption_test_case_256_2),
13473 		TEST_CASE_ST(ut_setup, ut_teardown,
13474 			test_AES_GCM_auth_encryption_test_case_256_3),
13475 		TEST_CASE_ST(ut_setup, ut_teardown,
13476 			test_AES_GCM_auth_encryption_test_case_256_4),
13477 		TEST_CASE_ST(ut_setup, ut_teardown,
13478 			test_AES_GCM_auth_encryption_test_case_256_5),
13479 		TEST_CASE_ST(ut_setup, ut_teardown,
13480 			test_AES_GCM_auth_encryption_test_case_256_6),
13481 		TEST_CASE_ST(ut_setup, ut_teardown,
13482 			test_AES_GCM_auth_encryption_test_case_256_7),
13483 
13484 		/** AES GCM Authenticated Decryption 256 bits key */
13485 		TEST_CASE_ST(ut_setup, ut_teardown,
13486 			test_AES_GCM_auth_decryption_test_case_256_1),
13487 		TEST_CASE_ST(ut_setup, ut_teardown,
13488 			test_AES_GCM_auth_decryption_test_case_256_2),
13489 		TEST_CASE_ST(ut_setup, ut_teardown,
13490 			test_AES_GCM_auth_decryption_test_case_256_3),
13491 		TEST_CASE_ST(ut_setup, ut_teardown,
13492 			test_AES_GCM_auth_decryption_test_case_256_4),
13493 		TEST_CASE_ST(ut_setup, ut_teardown,
13494 			test_AES_GCM_auth_decryption_test_case_256_5),
13495 		TEST_CASE_ST(ut_setup, ut_teardown,
13496 			test_AES_GCM_auth_decryption_test_case_256_6),
13497 		TEST_CASE_ST(ut_setup, ut_teardown,
13498 			test_AES_GCM_auth_decryption_test_case_256_7),
13499 
13500 		/** AES GCM Authenticated Encryption big aad size */
13501 		TEST_CASE_ST(ut_setup, ut_teardown,
13502 			test_AES_GCM_auth_encryption_test_case_aad_1),
13503 		TEST_CASE_ST(ut_setup, ut_teardown,
13504 			test_AES_GCM_auth_encryption_test_case_aad_2),
13505 
13506 		/** AES GCM Authenticated Decryption big aad size */
13507 		TEST_CASE_ST(ut_setup, ut_teardown,
13508 			test_AES_GCM_auth_decryption_test_case_aad_1),
13509 		TEST_CASE_ST(ut_setup, ut_teardown,
13510 			test_AES_GCM_auth_decryption_test_case_aad_2),
13511 
13512 		/** Out of place tests */
13513 		TEST_CASE_ST(ut_setup, ut_teardown,
13514 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
13515 		TEST_CASE_ST(ut_setup, ut_teardown,
13516 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
13517 
13518 		/** Session-less tests */
13519 		TEST_CASE_ST(ut_setup, ut_teardown,
13520 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
13521 		TEST_CASE_ST(ut_setup, ut_teardown,
13522 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
13523 
13524 		/** AES GMAC Authentication */
13525 		TEST_CASE_ST(ut_setup, ut_teardown,
13526 			test_AES_GMAC_authentication_test_case_1),
13527 		TEST_CASE_ST(ut_setup, ut_teardown,
13528 			test_AES_GMAC_authentication_verify_test_case_1),
13529 		TEST_CASE_ST(ut_setup, ut_teardown,
13530 			test_AES_GMAC_authentication_test_case_2),
13531 		TEST_CASE_ST(ut_setup, ut_teardown,
13532 			test_AES_GMAC_authentication_verify_test_case_2),
13533 		TEST_CASE_ST(ut_setup, ut_teardown,
13534 			test_AES_GMAC_authentication_test_case_3),
13535 		TEST_CASE_ST(ut_setup, ut_teardown,
13536 			test_AES_GMAC_authentication_verify_test_case_3),
13537 		TEST_CASE_ST(ut_setup, ut_teardown,
13538 			test_AES_GMAC_authentication_test_case_4),
13539 		TEST_CASE_ST(ut_setup, ut_teardown,
13540 			test_AES_GMAC_authentication_verify_test_case_4),
13541 		TEST_CASE_ST(ut_setup, ut_teardown,
13542 			test_AES_GMAC_authentication_SGL_40B),
13543 		TEST_CASE_ST(ut_setup, ut_teardown,
13544 			test_AES_GMAC_authentication_SGL_80B),
13545 		TEST_CASE_ST(ut_setup, ut_teardown,
13546 			test_AES_GMAC_authentication_SGL_2048B),
13547 		TEST_CASE_ST(ut_setup, ut_teardown,
13548 			test_AES_GMAC_authentication_SGL_2047B),
13549 
13550 		/** Chacha20-Poly1305 */
13551 		TEST_CASE_ST(ut_setup, ut_teardown,
13552 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
13553 		TEST_CASE_ST(ut_setup, ut_teardown,
13554 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
13555 		/** SNOW 3G encrypt only (UEA2) */
13556 		TEST_CASE_ST(ut_setup, ut_teardown,
13557 			test_snow3g_encryption_test_case_1),
13558 		TEST_CASE_ST(ut_setup, ut_teardown,
13559 			test_snow3g_encryption_test_case_2),
13560 		TEST_CASE_ST(ut_setup, ut_teardown,
13561 			test_snow3g_encryption_test_case_3),
13562 		TEST_CASE_ST(ut_setup, ut_teardown,
13563 			test_snow3g_encryption_test_case_4),
13564 		TEST_CASE_ST(ut_setup, ut_teardown,
13565 			test_snow3g_encryption_test_case_5),
13566 
13567 		TEST_CASE_ST(ut_setup, ut_teardown,
13568 			test_snow3g_encryption_test_case_1_oop),
13569 		TEST_CASE_ST(ut_setup, ut_teardown,
13570 			test_snow3g_encryption_test_case_1_oop_sgl),
13571 		TEST_CASE_ST(ut_setup, ut_teardown,
13572 			test_snow3g_encryption_test_case_1_offset_oop),
13573 		TEST_CASE_ST(ut_setup, ut_teardown,
13574 			test_snow3g_decryption_test_case_1_oop),
13575 
13576 		/** SNOW 3G generate auth, then encrypt (UEA2) */
13577 		TEST_CASE_ST(ut_setup, ut_teardown,
13578 			test_snow3g_auth_cipher_test_case_1),
13579 		TEST_CASE_ST(ut_setup, ut_teardown,
13580 			test_snow3g_auth_cipher_test_case_2),
13581 		TEST_CASE_ST(ut_setup, ut_teardown,
13582 			test_snow3g_auth_cipher_test_case_2_oop),
13583 		TEST_CASE_ST(ut_setup, ut_teardown,
13584 			test_snow3g_auth_cipher_part_digest_enc),
13585 		TEST_CASE_ST(ut_setup, ut_teardown,
13586 			test_snow3g_auth_cipher_part_digest_enc_oop),
13587 		TEST_CASE_ST(ut_setup, ut_teardown,
13588 			test_snow3g_auth_cipher_test_case_3_sgl),
13589 		TEST_CASE_ST(ut_setup, ut_teardown,
13590 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
13591 		TEST_CASE_ST(ut_setup, ut_teardown,
13592 			test_snow3g_auth_cipher_part_digest_enc_sgl),
13593 		TEST_CASE_ST(ut_setup, ut_teardown,
13594 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
13595 
13596 		/** SNOW 3G decrypt (UEA2), then verify auth */
13597 		TEST_CASE_ST(ut_setup, ut_teardown,
13598 			test_snow3g_auth_cipher_verify_test_case_1),
13599 		TEST_CASE_ST(ut_setup, ut_teardown,
13600 			test_snow3g_auth_cipher_verify_test_case_2),
13601 		TEST_CASE_ST(ut_setup, ut_teardown,
13602 			test_snow3g_auth_cipher_verify_test_case_2_oop),
13603 		TEST_CASE_ST(ut_setup, ut_teardown,
13604 			test_snow3g_auth_cipher_verify_part_digest_enc),
13605 		TEST_CASE_ST(ut_setup, ut_teardown,
13606 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
13607 		TEST_CASE_ST(ut_setup, ut_teardown,
13608 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
13609 		TEST_CASE_ST(ut_setup, ut_teardown,
13610 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
13611 		TEST_CASE_ST(ut_setup, ut_teardown,
13612 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
13613 		TEST_CASE_ST(ut_setup, ut_teardown,
13614 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
13615 
13616 		/** SNOW 3G decrypt only (UEA2) */
13617 		TEST_CASE_ST(ut_setup, ut_teardown,
13618 			test_snow3g_decryption_test_case_1),
13619 		TEST_CASE_ST(ut_setup, ut_teardown,
13620 			test_snow3g_decryption_test_case_2),
13621 		TEST_CASE_ST(ut_setup, ut_teardown,
13622 			test_snow3g_decryption_test_case_3),
13623 		TEST_CASE_ST(ut_setup, ut_teardown,
13624 			test_snow3g_decryption_test_case_4),
13625 		TEST_CASE_ST(ut_setup, ut_teardown,
13626 			test_snow3g_decryption_test_case_5),
13627 		TEST_CASE_ST(ut_setup, ut_teardown,
13628 			test_snow3g_decryption_with_digest_test_case_1),
13629 		TEST_CASE_ST(ut_setup, ut_teardown,
13630 			test_snow3g_hash_generate_test_case_1),
13631 		TEST_CASE_ST(ut_setup, ut_teardown,
13632 			test_snow3g_hash_generate_test_case_2),
13633 		TEST_CASE_ST(ut_setup, ut_teardown,
13634 			test_snow3g_hash_generate_test_case_3),
13635 		/* Tests with buffers which length is not byte-aligned */
13636 		TEST_CASE_ST(ut_setup, ut_teardown,
13637 			test_snow3g_hash_generate_test_case_4),
13638 		TEST_CASE_ST(ut_setup, ut_teardown,
13639 			test_snow3g_hash_generate_test_case_5),
13640 		TEST_CASE_ST(ut_setup, ut_teardown,
13641 			test_snow3g_hash_generate_test_case_6),
13642 		TEST_CASE_ST(ut_setup, ut_teardown,
13643 			test_snow3g_hash_verify_test_case_1),
13644 		TEST_CASE_ST(ut_setup, ut_teardown,
13645 			test_snow3g_hash_verify_test_case_2),
13646 		TEST_CASE_ST(ut_setup, ut_teardown,
13647 			test_snow3g_hash_verify_test_case_3),
13648 		/* Tests with buffers which length is not byte-aligned */
13649 		TEST_CASE_ST(ut_setup, ut_teardown,
13650 			test_snow3g_hash_verify_test_case_4),
13651 		TEST_CASE_ST(ut_setup, ut_teardown,
13652 			test_snow3g_hash_verify_test_case_5),
13653 		TEST_CASE_ST(ut_setup, ut_teardown,
13654 			test_snow3g_hash_verify_test_case_6),
13655 		TEST_CASE_ST(ut_setup, ut_teardown,
13656 			test_snow3g_cipher_auth_test_case_1),
13657 		TEST_CASE_ST(ut_setup, ut_teardown,
13658 			test_snow3g_auth_cipher_with_digest_test_case_1),
13659 
13660 		/** ZUC encrypt only (EEA3) */
13661 		TEST_CASE_ST(ut_setup, ut_teardown,
13662 			test_zuc_encryption_test_case_1),
13663 		TEST_CASE_ST(ut_setup, ut_teardown,
13664 			test_zuc_encryption_test_case_2),
13665 		TEST_CASE_ST(ut_setup, ut_teardown,
13666 			test_zuc_encryption_test_case_3),
13667 		TEST_CASE_ST(ut_setup, ut_teardown,
13668 			test_zuc_encryption_test_case_4),
13669 		TEST_CASE_ST(ut_setup, ut_teardown,
13670 			test_zuc_encryption_test_case_5),
13671 		TEST_CASE_ST(ut_setup, ut_teardown,
13672 			test_zuc_encryption_test_case_6_sgl),
13673 
13674 		/** ZUC authenticate (EIA3) */
13675 		TEST_CASE_ST(ut_setup, ut_teardown,
13676 			test_zuc_hash_generate_test_case_1),
13677 		TEST_CASE_ST(ut_setup, ut_teardown,
13678 			test_zuc_hash_generate_test_case_2),
13679 		TEST_CASE_ST(ut_setup, ut_teardown,
13680 			test_zuc_hash_generate_test_case_3),
13681 		TEST_CASE_ST(ut_setup, ut_teardown,
13682 			test_zuc_hash_generate_test_case_4),
13683 		TEST_CASE_ST(ut_setup, ut_teardown,
13684 			test_zuc_hash_generate_test_case_5),
13685 		TEST_CASE_ST(ut_setup, ut_teardown,
13686 			test_zuc_hash_generate_test_case_6),
13687 		TEST_CASE_ST(ut_setup, ut_teardown,
13688 			test_zuc_hash_generate_test_case_7),
13689 		TEST_CASE_ST(ut_setup, ut_teardown,
13690 			test_zuc_hash_generate_test_case_8),
13691 
13692 		/** ZUC alg-chain (EEA3/EIA3) */
13693 		TEST_CASE_ST(ut_setup, ut_teardown,
13694 			test_zuc_cipher_auth_test_case_1),
13695 		TEST_CASE_ST(ut_setup, ut_teardown,
13696 			test_zuc_cipher_auth_test_case_2),
13697 
13698 		/** ZUC generate auth, then encrypt (EEA3) */
13699 		TEST_CASE_ST(ut_setup, ut_teardown,
13700 			test_zuc_auth_cipher_test_case_1),
13701 		TEST_CASE_ST(ut_setup, ut_teardown,
13702 			test_zuc_auth_cipher_test_case_1_oop),
13703 		TEST_CASE_ST(ut_setup, ut_teardown,
13704 			test_zuc_auth_cipher_test_case_1_sgl),
13705 		TEST_CASE_ST(ut_setup, ut_teardown,
13706 			test_zuc_auth_cipher_test_case_1_oop_sgl),
13707 
13708 		/** ZUC decrypt (EEA3), then verify auth */
13709 		TEST_CASE_ST(ut_setup, ut_teardown,
13710 			test_zuc_auth_cipher_verify_test_case_1),
13711 		TEST_CASE_ST(ut_setup, ut_teardown,
13712 			test_zuc_auth_cipher_verify_test_case_1_oop),
13713 		TEST_CASE_ST(ut_setup, ut_teardown,
13714 			test_zuc_auth_cipher_verify_test_case_1_sgl),
13715 		TEST_CASE_ST(ut_setup, ut_teardown,
13716 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
13717 
13718 		/** HMAC_MD5 Authentication */
13719 		TEST_CASE_ST(ut_setup, ut_teardown,
13720 			test_MD5_HMAC_generate_case_1),
13721 		TEST_CASE_ST(ut_setup, ut_teardown,
13722 			test_MD5_HMAC_verify_case_1),
13723 		TEST_CASE_ST(ut_setup, ut_teardown,
13724 			test_MD5_HMAC_generate_case_2),
13725 		TEST_CASE_ST(ut_setup, ut_teardown,
13726 			test_MD5_HMAC_verify_case_2),
13727 
13728 		/** KASUMI hash only (UIA1) */
13729 		TEST_CASE_ST(ut_setup, ut_teardown,
13730 			test_kasumi_hash_generate_test_case_1),
13731 		TEST_CASE_ST(ut_setup, ut_teardown,
13732 			test_kasumi_hash_generate_test_case_2),
13733 		TEST_CASE_ST(ut_setup, ut_teardown,
13734 			test_kasumi_hash_generate_test_case_3),
13735 		TEST_CASE_ST(ut_setup, ut_teardown,
13736 			test_kasumi_hash_generate_test_case_4),
13737 		TEST_CASE_ST(ut_setup, ut_teardown,
13738 			test_kasumi_hash_generate_test_case_5),
13739 		TEST_CASE_ST(ut_setup, ut_teardown,
13740 			test_kasumi_hash_generate_test_case_6),
13741 
13742 		TEST_CASE_ST(ut_setup, ut_teardown,
13743 			test_kasumi_hash_verify_test_case_1),
13744 		TEST_CASE_ST(ut_setup, ut_teardown,
13745 			test_kasumi_hash_verify_test_case_2),
13746 		TEST_CASE_ST(ut_setup, ut_teardown,
13747 			test_kasumi_hash_verify_test_case_3),
13748 		TEST_CASE_ST(ut_setup, ut_teardown,
13749 			test_kasumi_hash_verify_test_case_4),
13750 		TEST_CASE_ST(ut_setup, ut_teardown,
13751 			test_kasumi_hash_verify_test_case_5),
13752 
13753 		/** KASUMI encrypt only (UEA1) */
13754 		TEST_CASE_ST(ut_setup, ut_teardown,
13755 			test_kasumi_encryption_test_case_1),
13756 		TEST_CASE_ST(ut_setup, ut_teardown,
13757 			test_kasumi_encryption_test_case_1_sgl),
13758 		TEST_CASE_ST(ut_setup, ut_teardown,
13759 			test_kasumi_encryption_test_case_1_oop),
13760 		TEST_CASE_ST(ut_setup, ut_teardown,
13761 			test_kasumi_encryption_test_case_1_oop_sgl),
13762 		TEST_CASE_ST(ut_setup, ut_teardown,
13763 			test_kasumi_encryption_test_case_2),
13764 		TEST_CASE_ST(ut_setup, ut_teardown,
13765 			test_kasumi_encryption_test_case_3),
13766 		TEST_CASE_ST(ut_setup, ut_teardown,
13767 			test_kasumi_encryption_test_case_4),
13768 		TEST_CASE_ST(ut_setup, ut_teardown,
13769 			test_kasumi_encryption_test_case_5),
13770 
13771 		/** KASUMI decrypt only (UEA1) */
13772 		TEST_CASE_ST(ut_setup, ut_teardown,
13773 			test_kasumi_decryption_test_case_1),
13774 		TEST_CASE_ST(ut_setup, ut_teardown,
13775 			test_kasumi_decryption_test_case_2),
13776 		TEST_CASE_ST(ut_setup, ut_teardown,
13777 			test_kasumi_decryption_test_case_3),
13778 		TEST_CASE_ST(ut_setup, ut_teardown,
13779 			test_kasumi_decryption_test_case_4),
13780 		TEST_CASE_ST(ut_setup, ut_teardown,
13781 			test_kasumi_decryption_test_case_5),
13782 		TEST_CASE_ST(ut_setup, ut_teardown,
13783 			test_kasumi_decryption_test_case_1_oop),
13784 
13785 		TEST_CASE_ST(ut_setup, ut_teardown,
13786 			test_kasumi_cipher_auth_test_case_1),
13787 
13788 		/** KASUMI generate auth, then encrypt (F8) */
13789 		TEST_CASE_ST(ut_setup, ut_teardown,
13790 			test_kasumi_auth_cipher_test_case_1),
13791 		TEST_CASE_ST(ut_setup, ut_teardown,
13792 			test_kasumi_auth_cipher_test_case_2),
13793 		TEST_CASE_ST(ut_setup, ut_teardown,
13794 			test_kasumi_auth_cipher_test_case_2_oop),
13795 		TEST_CASE_ST(ut_setup, ut_teardown,
13796 			test_kasumi_auth_cipher_test_case_2_sgl),
13797 		TEST_CASE_ST(ut_setup, ut_teardown,
13798 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
13799 
13800 		/** KASUMI decrypt (F8), then verify auth */
13801 		TEST_CASE_ST(ut_setup, ut_teardown,
13802 			test_kasumi_auth_cipher_verify_test_case_1),
13803 		TEST_CASE_ST(ut_setup, ut_teardown,
13804 			test_kasumi_auth_cipher_verify_test_case_2),
13805 		TEST_CASE_ST(ut_setup, ut_teardown,
13806 			test_kasumi_auth_cipher_verify_test_case_2_oop),
13807 		TEST_CASE_ST(ut_setup, ut_teardown,
13808 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
13809 		TEST_CASE_ST(ut_setup, ut_teardown,
13810 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
13811 
13812 		/** ESN Testcase */
13813 		TEST_CASE_ST(ut_setup, ut_teardown,
13814 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
13815 		TEST_CASE_ST(ut_setup, ut_teardown,
13816 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
13817 
13818 		/** Negative tests */
13819 		TEST_CASE_ST(ut_setup, ut_teardown,
13820 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13821 		TEST_CASE_ST(ut_setup, ut_teardown,
13822 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13823 		TEST_CASE_ST(ut_setup, ut_teardown,
13824 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
13825 		TEST_CASE_ST(ut_setup, ut_teardown,
13826 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
13827 		TEST_CASE_ST(ut_setup, ut_teardown,
13828 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
13829 		TEST_CASE_ST(ut_setup, ut_teardown,
13830 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
13831 		TEST_CASE_ST(ut_setup, ut_teardown,
13832 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
13833 		TEST_CASE_ST(ut_setup, ut_teardown,
13834 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
13835 		TEST_CASE_ST(ut_setup, ut_teardown,
13836 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
13837 		TEST_CASE_ST(ut_setup, ut_teardown,
13838 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
13839 		TEST_CASE_ST(ut_setup, ut_teardown,
13840 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
13841 		TEST_CASE_ST(ut_setup, ut_teardown,
13842 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
13843 		TEST_CASE_ST(ut_setup, ut_teardown,
13844 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
13845 		TEST_CASE_ST(ut_setup, ut_teardown,
13846 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
13847 		TEST_CASE_ST(ut_setup, ut_teardown,
13848 			authentication_verify_AES128_GMAC_fail_data_corrupt),
13849 		TEST_CASE_ST(ut_setup, ut_teardown,
13850 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
13851 		TEST_CASE_ST(ut_setup, ut_teardown,
13852 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
13853 		TEST_CASE_ST(ut_setup, ut_teardown,
13854 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
13855 
13856 		/** Mixed CIPHER + HASH algorithms */
13857 		/** AUTH AES CMAC + CIPHER AES CTR */
13858 		TEST_CASE_ST(ut_setup, ut_teardown,
13859 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
13860 		TEST_CASE_ST(ut_setup, ut_teardown,
13861 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13862 		TEST_CASE_ST(ut_setup, ut_teardown,
13863 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13864 		TEST_CASE_ST(ut_setup, ut_teardown,
13865 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13866 		TEST_CASE_ST(ut_setup, ut_teardown,
13867 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
13868 		TEST_CASE_ST(ut_setup, ut_teardown,
13869 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
13870 		TEST_CASE_ST(ut_setup, ut_teardown,
13871 		       test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
13872 		TEST_CASE_ST(ut_setup, ut_teardown,
13873 		   test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
13874 
13875 		/** AUTH ZUC + CIPHER SNOW3G */
13876 		TEST_CASE_ST(ut_setup, ut_teardown,
13877 			test_auth_zuc_cipher_snow_test_case_1),
13878 		TEST_CASE_ST(ut_setup, ut_teardown,
13879 			test_verify_auth_zuc_cipher_snow_test_case_1),
13880 		/** AUTH AES CMAC + CIPHER SNOW3G */
13881 		TEST_CASE_ST(ut_setup, ut_teardown,
13882 			test_auth_aes_cmac_cipher_snow_test_case_1),
13883 		TEST_CASE_ST(ut_setup, ut_teardown,
13884 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
13885 		/** AUTH ZUC + CIPHER AES CTR */
13886 		TEST_CASE_ST(ut_setup, ut_teardown,
13887 			test_auth_zuc_cipher_aes_ctr_test_case_1),
13888 		TEST_CASE_ST(ut_setup, ut_teardown,
13889 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
13890 		/** AUTH SNOW3G + CIPHER AES CTR */
13891 		TEST_CASE_ST(ut_setup, ut_teardown,
13892 			test_auth_snow_cipher_aes_ctr_test_case_1),
13893 		TEST_CASE_ST(ut_setup, ut_teardown,
13894 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
13895 		/** AUTH SNOW3G + CIPHER ZUC */
13896 		TEST_CASE_ST(ut_setup, ut_teardown,
13897 			test_auth_snow_cipher_zuc_test_case_1),
13898 		TEST_CASE_ST(ut_setup, ut_teardown,
13899 			test_verify_auth_snow_cipher_zuc_test_case_1),
13900 		/** AUTH AES CMAC + CIPHER ZUC */
13901 		TEST_CASE_ST(ut_setup, ut_teardown,
13902 			test_auth_aes_cmac_cipher_zuc_test_case_1),
13903 		TEST_CASE_ST(ut_setup, ut_teardown,
13904 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
13905 
13906 		/** AUTH NULL + CIPHER SNOW3G */
13907 		TEST_CASE_ST(ut_setup, ut_teardown,
13908 			test_auth_null_cipher_snow_test_case_1),
13909 		TEST_CASE_ST(ut_setup, ut_teardown,
13910 			test_verify_auth_null_cipher_snow_test_case_1),
13911 		/** AUTH NULL + CIPHER ZUC */
13912 		TEST_CASE_ST(ut_setup, ut_teardown,
13913 			test_auth_null_cipher_zuc_test_case_1),
13914 		TEST_CASE_ST(ut_setup, ut_teardown,
13915 			test_verify_auth_null_cipher_zuc_test_case_1),
13916 		/** AUTH SNOW3G + CIPHER NULL */
13917 		TEST_CASE_ST(ut_setup, ut_teardown,
13918 			test_auth_snow_cipher_null_test_case_1),
13919 		TEST_CASE_ST(ut_setup, ut_teardown,
13920 			test_verify_auth_snow_cipher_null_test_case_1),
13921 		/** AUTH ZUC + CIPHER NULL */
13922 		TEST_CASE_ST(ut_setup, ut_teardown,
13923 			test_auth_zuc_cipher_null_test_case_1),
13924 		TEST_CASE_ST(ut_setup, ut_teardown,
13925 			test_verify_auth_zuc_cipher_null_test_case_1),
13926 		/** AUTH NULL + CIPHER AES CTR */
13927 		TEST_CASE_ST(ut_setup, ut_teardown,
13928 			test_auth_null_cipher_aes_ctr_test_case_1),
13929 		TEST_CASE_ST(ut_setup, ut_teardown,
13930 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
13931 		/** AUTH AES CMAC + CIPHER NULL */
13932 		TEST_CASE_ST(ut_setup, ut_teardown,
13933 			test_auth_aes_cmac_cipher_null_test_case_1),
13934 		TEST_CASE_ST(ut_setup, ut_teardown,
13935 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
13936 
13937 #ifdef RTE_LIB_SECURITY
13938 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13939 			test_PDCP_PROTO_all),
13940 		TEST_CASE_ST(ut_setup_security, ut_teardown,
13941 			test_DOCSIS_PROTO_all),
13942 #endif
13943 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
13944 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
13945 		TEST_CASES_END() /**< NULL terminate unit test array */
13946 	}
13947 };
13948 
13949 static struct unit_test_suite cryptodev_virtio_testsuite = {
13950 	.suite_name = "Crypto VIRTIO Unit Test Suite",
13951 	.setup = testsuite_setup,
13952 	.teardown = testsuite_teardown,
13953 	.unit_test_cases = {
13954 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13955 
13956 		TEST_CASES_END() /**< NULL terminate unit test array */
13957 	}
13958 };
13959 
13960 static struct unit_test_suite cryptodev_caam_jr_testsuite  = {
13961 	.suite_name = "Crypto CAAM JR Unit Test Suite",
13962 	.setup = testsuite_setup,
13963 	.teardown = testsuite_teardown,
13964 	.unit_test_cases = {
13965 		TEST_CASE_ST(ut_setup, ut_teardown,
13966 			     test_device_configure_invalid_dev_id),
13967 		TEST_CASE_ST(ut_setup, ut_teardown,
13968 			     test_multi_session),
13969 
13970 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13971 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13972 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13973 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13974 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13975 
13976 		TEST_CASES_END() /**< NULL terminate unit test array */
13977 	}
13978 };
13979 
13980 static struct unit_test_suite cryptodev_mrvl_testsuite  = {
13981 	.suite_name = "Crypto Device Marvell Component Test Suite",
13982 	.setup = testsuite_setup,
13983 	.teardown = testsuite_teardown,
13984 	.unit_test_cases = {
13985 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
13986 		TEST_CASE_ST(ut_setup, ut_teardown,
13987 				test_multi_session_random_usage),
13988 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
13989 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
13990 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
13991 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
13992 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
13993 
13994 		/** Negative tests */
13995 		TEST_CASE_ST(ut_setup, ut_teardown,
13996 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
13997 		TEST_CASE_ST(ut_setup, ut_teardown,
13998 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
13999 		TEST_CASE_ST(ut_setup, ut_teardown,
14000 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14001 		TEST_CASE_ST(ut_setup, ut_teardown,
14002 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14003 
14004 		TEST_CASES_END() /**< NULL terminate unit test array */
14005 	}
14006 };
14007 
14008 static struct unit_test_suite cryptodev_ccp_testsuite  = {
14009 	.suite_name = "Crypto Device CCP Unit Test Suite",
14010 	.setup = testsuite_setup,
14011 	.teardown = testsuite_teardown,
14012 	.unit_test_cases = {
14013 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
14014 		TEST_CASE_ST(ut_setup, ut_teardown,
14015 				test_multi_session_random_usage),
14016 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_chain_all),
14017 		TEST_CASE_ST(ut_setup, ut_teardown, test_AES_cipheronly_all),
14018 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_chain_all),
14019 		TEST_CASE_ST(ut_setup, ut_teardown, test_3DES_cipheronly_all),
14020 		TEST_CASE_ST(ut_setup, ut_teardown, test_authonly_all),
14021 
14022 		/** Negative tests */
14023 		TEST_CASE_ST(ut_setup, ut_teardown,
14024 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
14025 		TEST_CASE_ST(ut_setup, ut_teardown,
14026 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
14027 		TEST_CASE_ST(ut_setup, ut_teardown,
14028 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
14029 		TEST_CASE_ST(ut_setup, ut_teardown,
14030 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
14031 
14032 		TEST_CASES_END() /**< NULL terminate unit test array */
14033 	}
14034 };
14035 
14036 static int
14037 test_cryptodev_qat(void /*argv __rte_unused, int argc __rte_unused*/)
14038 {
14039 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14040 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14041 
14042 	if (gbl_driver_id == -1) {
14043 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14044 		return TEST_SKIPPED;
14045 	}
14046 
14047 	return unit_test_suite_runner(&cryptodev_testsuite);
14048 }
14049 
14050 static int
14051 test_cryptodev_virtio(void /*argv __rte_unused, int argc __rte_unused*/)
14052 {
14053 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14054 			RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
14055 
14056 	if (gbl_driver_id == -1) {
14057 		RTE_LOG(ERR, USER1, "VIRTIO PMD must be loaded.\n");
14058 		return TEST_FAILED;
14059 	}
14060 
14061 	return unit_test_suite_runner(&cryptodev_virtio_testsuite);
14062 }
14063 
14064 static int
14065 test_cryptodev_aesni_mb(void /*argv __rte_unused, int argc __rte_unused*/)
14066 {
14067 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14068 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14069 
14070 	if (gbl_driver_id == -1) {
14071 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14072 		return TEST_SKIPPED;
14073 	}
14074 
14075 	return unit_test_suite_runner(&cryptodev_testsuite);
14076 }
14077 
14078 static int
14079 test_cryptodev_cpu_aesni_mb(void)
14080 {
14081 	int32_t rc;
14082 	enum rte_security_session_action_type at;
14083 
14084 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14085 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14086 
14087 	if (gbl_driver_id == -1) {
14088 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14089 		return TEST_SKIPPED;
14090 	}
14091 
14092 	at = gbl_action_type;
14093 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14094 	rc = unit_test_suite_runner(&cryptodev_testsuite);
14095 	gbl_action_type = at;
14096 	return rc;
14097 }
14098 
14099 static int
14100 test_cryptodev_openssl(void)
14101 {
14102 	gbl_driver_id = rte_cryptodev_driver_id_get(
14103 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
14104 
14105 	if (gbl_driver_id == -1) {
14106 		RTE_LOG(ERR, USER1, "OPENSSL PMD must be loaded.\n");
14107 		return TEST_SKIPPED;
14108 	}
14109 
14110 	return unit_test_suite_runner(&cryptodev_testsuite);
14111 }
14112 
14113 static int
14114 test_cryptodev_aesni_gcm(void)
14115 {
14116 	gbl_driver_id = rte_cryptodev_driver_id_get(
14117 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14118 
14119 	if (gbl_driver_id == -1) {
14120 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14121 		return TEST_SKIPPED;
14122 	}
14123 
14124 	return unit_test_suite_runner(&cryptodev_testsuite);
14125 }
14126 
14127 static int
14128 test_cryptodev_cpu_aesni_gcm(void)
14129 {
14130 	int32_t rc;
14131 	enum rte_security_session_action_type at;
14132 
14133 	gbl_driver_id = rte_cryptodev_driver_id_get(
14134 			RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
14135 
14136 	if (gbl_driver_id == -1) {
14137 		RTE_LOG(ERR, USER1, "AESNI GCM PMD must be loaded.\n");
14138 		return TEST_SKIPPED;
14139 	}
14140 
14141 	at = gbl_action_type;
14142 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
14143 	rc = unit_test_suite_runner(&cryptodev_testsuite);
14144 	gbl_action_type = at;
14145 	return rc;
14146 }
14147 
14148 static int
14149 test_cryptodev_null(void)
14150 {
14151 	gbl_driver_id = rte_cryptodev_driver_id_get(
14152 			RTE_STR(CRYPTODEV_NAME_NULL_PMD));
14153 
14154 	if (gbl_driver_id == -1) {
14155 		RTE_LOG(ERR, USER1, "NULL PMD must be loaded.\n");
14156 		return TEST_SKIPPED;
14157 	}
14158 
14159 	return unit_test_suite_runner(&cryptodev_testsuite);
14160 }
14161 
14162 static int
14163 test_cryptodev_sw_snow3g(void /*argv __rte_unused, int argc __rte_unused*/)
14164 {
14165 	gbl_driver_id = rte_cryptodev_driver_id_get(
14166 			RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
14167 
14168 	if (gbl_driver_id == -1) {
14169 		RTE_LOG(ERR, USER1, "SNOW3G PMD must be loaded.\n");
14170 		return TEST_SKIPPED;
14171 	}
14172 
14173 	return unit_test_suite_runner(&cryptodev_testsuite);
14174 }
14175 
14176 static int
14177 test_cryptodev_sw_kasumi(void /*argv __rte_unused, int argc __rte_unused*/)
14178 {
14179 	gbl_driver_id = rte_cryptodev_driver_id_get(
14180 			RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
14181 
14182 	if (gbl_driver_id == -1) {
14183 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14184 		return TEST_SKIPPED;
14185 	}
14186 
14187 	return unit_test_suite_runner(&cryptodev_testsuite);
14188 }
14189 
14190 static int
14191 test_cryptodev_sw_zuc(void /*argv __rte_unused, int argc __rte_unused*/)
14192 {
14193 	gbl_driver_id = rte_cryptodev_driver_id_get(
14194 			RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
14195 
14196 	if (gbl_driver_id == -1) {
14197 		RTE_LOG(ERR, USER1, "ZUC PMD must be loaded.\n");
14198 		return TEST_SKIPPED;
14199 	}
14200 
14201 	return unit_test_suite_runner(&cryptodev_testsuite);
14202 }
14203 
14204 static int
14205 test_cryptodev_armv8(void)
14206 {
14207 	gbl_driver_id = rte_cryptodev_driver_id_get(
14208 			RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
14209 
14210 	if (gbl_driver_id == -1) {
14211 		RTE_LOG(ERR, USER1, "ARMV8 PMD must be loaded.\n");
14212 		return TEST_SKIPPED;
14213 	}
14214 
14215 	return unit_test_suite_runner(&cryptodev_testsuite);
14216 }
14217 
14218 static int
14219 test_cryptodev_mrvl(void)
14220 {
14221 	gbl_driver_id = rte_cryptodev_driver_id_get(
14222 			RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
14223 
14224 	if (gbl_driver_id == -1) {
14225 		RTE_LOG(ERR, USER1, "MVSAM PMD must be loaded.\n");
14226 		return TEST_SKIPPED;
14227 	}
14228 
14229 	return unit_test_suite_runner(&cryptodev_mrvl_testsuite);
14230 }
14231 
14232 #ifdef RTE_CRYPTO_SCHEDULER
14233 
14234 static int
14235 test_cryptodev_scheduler(void /*argv __rte_unused, int argc __rte_unused*/)
14236 {
14237 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14238 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14239 
14240 	if (gbl_driver_id == -1) {
14241 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
14242 		return TEST_SKIPPED;
14243 	}
14244 
14245 	if (rte_cryptodev_driver_id_get(
14246 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
14247 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
14248 		return TEST_SKIPPED;
14249 }
14250 	return unit_test_suite_runner(&cryptodev_scheduler_testsuite);
14251 }
14252 
14253 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
14254 
14255 #endif
14256 
14257 static int
14258 test_cryptodev_dpaa2_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14259 {
14260 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14261 			RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
14262 
14263 	if (gbl_driver_id == -1) {
14264 		RTE_LOG(ERR, USER1, "DPAA2 SEC PMD must be loaded.\n");
14265 		return TEST_SKIPPED;
14266 	}
14267 
14268 	return unit_test_suite_runner(&cryptodev_testsuite);
14269 }
14270 
14271 static int
14272 test_cryptodev_dpaa_sec(void /*argv __rte_unused, int argc __rte_unused*/)
14273 {
14274 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14275 			RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
14276 
14277 	if (gbl_driver_id == -1) {
14278 		RTE_LOG(ERR, USER1, "DPAA SEC PMD must be loaded.\n");
14279 		return TEST_SKIPPED;
14280 	}
14281 
14282 	return unit_test_suite_runner(&cryptodev_testsuite);
14283 }
14284 
14285 static int
14286 test_cryptodev_ccp(void)
14287 {
14288 	gbl_driver_id = rte_cryptodev_driver_id_get(
14289 			RTE_STR(CRYPTODEV_NAME_CCP_PMD));
14290 
14291 	if (gbl_driver_id == -1) {
14292 		RTE_LOG(ERR, USER1, "CCP PMD must be loaded.\n");
14293 		return TEST_FAILED;
14294 	}
14295 
14296 	return unit_test_suite_runner(&cryptodev_ccp_testsuite);
14297 }
14298 
14299 static int
14300 test_cryptodev_octeontx(void)
14301 {
14302 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14303 			RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
14304 	if (gbl_driver_id == -1) {
14305 		RTE_LOG(ERR, USER1, "OCTEONTX PMD must be loaded.\n");
14306 		return TEST_FAILED;
14307 	}
14308 	return unit_test_suite_runner(&cryptodev_testsuite);
14309 }
14310 
14311 static int
14312 test_cryptodev_octeontx2(void)
14313 {
14314 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14315 			RTE_STR(CRYPTODEV_NAME_OCTEONTX2_PMD));
14316 	if (gbl_driver_id == -1) {
14317 		RTE_LOG(ERR, USER1, "OCTEON TX2 PMD must be loaded.\n");
14318 		return TEST_FAILED;
14319 	}
14320 	return unit_test_suite_runner(&cryptodev_testsuite);
14321 }
14322 
14323 static int
14324 test_cryptodev_caam_jr(void /*argv __rte_unused, int argc __rte_unused*/)
14325 {
14326 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14327 			RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
14328 
14329 	if (gbl_driver_id == -1) {
14330 		RTE_LOG(ERR, USER1, "CAAM_JR PMD must be loaded.\n");
14331 		return TEST_FAILED;
14332 	}
14333 
14334 	return unit_test_suite_runner(&cryptodev_caam_jr_testsuite);
14335 }
14336 
14337 static int
14338 test_cryptodev_nitrox(void)
14339 {
14340 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14341 			RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
14342 
14343 	if (gbl_driver_id == -1) {
14344 		RTE_LOG(ERR, USER1, "NITROX PMD must be loaded.\n");
14345 		return TEST_FAILED;
14346 	}
14347 
14348 	return unit_test_suite_runner(&cryptodev_testsuite);
14349 }
14350 
14351 static int
14352 test_cryptodev_bcmfs(void)
14353 {
14354 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14355 			RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
14356 
14357 	if (gbl_driver_id == -1) {
14358 		RTE_LOG(ERR, USER1, "BCMFS PMD must be loaded.\n");
14359 		return TEST_FAILED;
14360 	}
14361 
14362 	return unit_test_suite_runner(&cryptodev_testsuite);
14363 }
14364 
14365 static int
14366 test_cryptodev_qat_raw_api(void /*argv __rte_unused, int argc __rte_unused*/)
14367 {
14368 	int ret;
14369 
14370 	gbl_driver_id =	rte_cryptodev_driver_id_get(
14371 			RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
14372 
14373 	if (gbl_driver_id == -1) {
14374 		RTE_LOG(ERR, USER1, "QAT PMD must be loaded.\n");
14375 		return TEST_SKIPPED;
14376 	}
14377 
14378 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
14379 	ret = unit_test_suite_runner(&cryptodev_testsuite);
14380 	global_api_test_type = CRYPTODEV_API_TEST;
14381 
14382 	return ret;
14383 }
14384 
14385 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
14386 		test_cryptodev_qat_raw_api);
14387 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
14388 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
14389 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
14390 	test_cryptodev_cpu_aesni_mb);
14391 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
14392 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
14393 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
14394 	test_cryptodev_cpu_aesni_gcm);
14395 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
14396 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
14397 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
14398 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
14399 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
14400 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
14401 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
14402 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
14403 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
14404 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
14405 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
14406 REGISTER_TEST_COMMAND(cryptodev_octeontx2_autotest, test_cryptodev_octeontx2);
14407 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
14408 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
14409 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
14410