xref: /dpdk/app/test/test_cryptodev.c (revision 42a8fc7daa46256d150278fc9a7a846e27945a0c)
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_ip.h>
20 #include <rte_string_fns.h>
21 #include <rte_tcp.h>
22 #include <rte_udp.h>
23 
24 #ifdef RTE_CRYPTO_SCHEDULER
25 #include <rte_cryptodev_scheduler.h>
26 #include <rte_cryptodev_scheduler_operations.h>
27 #endif
28 
29 #include <rte_lcore.h>
30 
31 #include "test.h"
32 #include "test_cryptodev.h"
33 
34 #include "test_cryptodev_blockcipher.h"
35 #include "test_cryptodev_aes_test_vectors.h"
36 #include "test_cryptodev_des_test_vectors.h"
37 #include "test_cryptodev_hash_test_vectors.h"
38 #include "test_cryptodev_kasumi_test_vectors.h"
39 #include "test_cryptodev_kasumi_hash_test_vectors.h"
40 #include "test_cryptodev_snow3g_test_vectors.h"
41 #include "test_cryptodev_snow3g_hash_test_vectors.h"
42 #include "test_cryptodev_zuc_test_vectors.h"
43 #include "test_cryptodev_aead_test_vectors.h"
44 #include "test_cryptodev_hmac_test_vectors.h"
45 #include "test_cryptodev_mixed_test_vectors.h"
46 #ifdef RTE_LIB_SECURITY
47 #include "test_cryptodev_security_ipsec.h"
48 #include "test_cryptodev_security_ipsec_test_vectors.h"
49 #include "test_cryptodev_security_pdcp_test_vectors.h"
50 #include "test_cryptodev_security_pdcp_sdap_test_vectors.h"
51 #include "test_cryptodev_security_pdcp_test_func.h"
52 #include "test_cryptodev_security_docsis_test_vectors.h"
53 
54 #define SDAP_DISABLED	0
55 #define SDAP_ENABLED	1
56 #endif
57 
58 #define VDEV_ARGS_SIZE 100
59 #define MAX_NB_SESSIONS 4
60 
61 #define MAX_DRV_SERVICE_CTX_SIZE 256
62 
63 #define MAX_RAW_DEQUEUE_COUNT	65535
64 
65 #define IN_PLACE 0
66 #define OUT_OF_PLACE 1
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_unittest_params {
76 	struct rte_crypto_sym_xform cipher_xform;
77 	struct rte_crypto_sym_xform auth_xform;
78 	struct rte_crypto_sym_xform aead_xform;
79 #ifdef RTE_LIB_SECURITY
80 	struct rte_security_docsis_xform docsis_xform;
81 #endif
82 
83 	union {
84 		struct rte_cryptodev_sym_session *sess;
85 #ifdef RTE_LIB_SECURITY
86 		struct rte_security_session *sec_session;
87 #endif
88 	};
89 #ifdef RTE_LIB_SECURITY
90 	enum rte_security_session_action_type type;
91 #endif
92 	struct rte_crypto_op *op;
93 
94 	struct rte_mbuf *obuf, *ibuf;
95 
96 	uint8_t *digest;
97 };
98 
99 #define ALIGN_POW2_ROUNDUP(num, align) \
100 	(((num) + (align) - 1) & ~((align) - 1))
101 
102 #define ADD_STATIC_TESTSUITE(index, parent_ts, child_ts, num_child_ts)	\
103 	for (j = 0; j < num_child_ts; index++, j++)			\
104 		parent_ts.unit_test_suites[index] = child_ts[j]
105 
106 #define ADD_BLOCKCIPHER_TESTSUITE(index, parent_ts, blk_types, num_blk_types)	\
107 	for (j = 0; j < num_blk_types; index++, j++)				\
108 		parent_ts.unit_test_suites[index] =				\
109 				build_blockcipher_test_suite(blk_types[j])
110 
111 #define FREE_BLOCKCIPHER_TESTSUITE(index, parent_ts, num_blk_types)		\
112 	for (j = index; j < index + num_blk_types; j++)				\
113 		free_blockcipher_test_suite(parent_ts.unit_test_suites[j])
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 int
132 security_proto_supported(enum rte_security_session_action_type action,
133 	enum rte_security_session_protocol proto);
134 
135 static int
136 dev_configure_and_start(uint64_t ff_disable);
137 
138 static struct rte_mbuf *
139 setup_test_string(struct rte_mempool *mpool,
140 		const char *string, size_t len, uint8_t blocksize)
141 {
142 	struct rte_mbuf *m = rte_pktmbuf_alloc(mpool);
143 	size_t t_len = len - (blocksize ? (len % blocksize) : 0);
144 
145 	if (m) {
146 		char *dst;
147 
148 		memset(m->buf_addr, 0, m->buf_len);
149 		dst = rte_pktmbuf_append(m, t_len);
150 		if (!dst) {
151 			rte_pktmbuf_free(m);
152 			return NULL;
153 		}
154 		if (string != NULL)
155 			rte_memcpy(dst, string, t_len);
156 		else
157 			memset(dst, 0, t_len);
158 	}
159 
160 	return m;
161 }
162 
163 /* Get number of bytes in X bits (rounding up) */
164 static uint32_t
165 ceil_byte_length(uint32_t num_bits)
166 {
167 	if (num_bits % 8)
168 		return ((num_bits >> 3) + 1);
169 	else
170 		return (num_bits >> 3);
171 }
172 
173 static void
174 post_process_raw_dp_op(void *user_data,	uint32_t index __rte_unused,
175 		uint8_t is_op_success)
176 {
177 	struct rte_crypto_op *op = user_data;
178 	op->status = is_op_success ? RTE_CRYPTO_OP_STATUS_SUCCESS :
179 			RTE_CRYPTO_OP_STATUS_ERROR;
180 }
181 
182 static struct crypto_testsuite_params testsuite_params = { NULL };
183 struct crypto_testsuite_params *p_testsuite_params = &testsuite_params;
184 static struct crypto_unittest_params unittest_params;
185 
186 void
187 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id,
188 		struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth,
189 		uint8_t len_in_bits, uint8_t cipher_iv_len)
190 {
191 	struct rte_crypto_sym_op *sop = op->sym;
192 	struct rte_crypto_op *ret_op = NULL;
193 	struct rte_crypto_vec data_vec[UINT8_MAX], dest_data_vec[UINT8_MAX];
194 	struct rte_crypto_va_iova_ptr cipher_iv, digest, aad_auth_iv;
195 	union rte_crypto_sym_ofs ofs;
196 	struct rte_crypto_sym_vec vec;
197 	struct rte_crypto_sgl sgl, dest_sgl;
198 	uint32_t max_len;
199 	union rte_cryptodev_session_ctx sess;
200 	uint64_t auth_end_iova;
201 	uint32_t count = 0;
202 	struct rte_crypto_raw_dp_ctx *ctx;
203 	uint32_t cipher_offset = 0, cipher_len = 0, auth_offset = 0,
204 			auth_len = 0;
205 	int32_t n;
206 	uint32_t n_success;
207 	int ctx_service_size;
208 	int32_t status = 0;
209 	int enqueue_status, dequeue_status;
210 	struct crypto_unittest_params *ut_params = &unittest_params;
211 	int is_sgl = sop->m_src->nb_segs > 1;
212 	int is_oop = 0;
213 
214 	ctx_service_size = rte_cryptodev_get_raw_dp_ctx_size(dev_id);
215 	if (ctx_service_size < 0) {
216 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
217 		return;
218 	}
219 
220 	ctx = malloc(ctx_service_size);
221 	if (!ctx) {
222 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
223 		return;
224 	}
225 
226 	/* Both are enums, setting crypto_sess will suit any session type */
227 	sess.crypto_sess = op->sym->session;
228 
229 	if (rte_cryptodev_configure_raw_dp_ctx(dev_id, qp_id, ctx,
230 			op->sess_type, sess, 0) < 0) {
231 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
232 		goto exit;
233 	}
234 
235 	cipher_iv.iova = 0;
236 	cipher_iv.va = NULL;
237 	aad_auth_iv.iova = 0;
238 	aad_auth_iv.va = NULL;
239 	digest.iova = 0;
240 	digest.va = NULL;
241 	sgl.vec = data_vec;
242 	vec.num = 1;
243 	vec.src_sgl = &sgl;
244 	vec.iv = &cipher_iv;
245 	vec.digest = &digest;
246 	vec.aad = &aad_auth_iv;
247 	vec.status = &status;
248 
249 	ofs.raw = 0;
250 
251 	if ((sop->m_dst != NULL) && (sop->m_dst != sop->m_src))
252 		is_oop = 1;
253 
254 	if (is_cipher && is_auth) {
255 		cipher_offset = sop->cipher.data.offset;
256 		cipher_len = sop->cipher.data.length;
257 		auth_offset = sop->auth.data.offset;
258 		auth_len = sop->auth.data.length;
259 		max_len = RTE_MAX(cipher_offset + cipher_len,
260 				auth_offset + auth_len);
261 		if (len_in_bits) {
262 			max_len = max_len >> 3;
263 			cipher_offset = cipher_offset >> 3;
264 			auth_offset = auth_offset >> 3;
265 			cipher_len = cipher_len >> 3;
266 			auth_len = auth_len >> 3;
267 		}
268 		ofs.ofs.cipher.head = cipher_offset;
269 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
270 		ofs.ofs.auth.head = auth_offset;
271 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
272 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
273 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
274 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
275 				op, void *, IV_OFFSET + cipher_iv_len);
276 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
277 				cipher_iv_len);
278 		digest.va = (void *)sop->auth.digest.data;
279 		digest.iova = sop->auth.digest.phys_addr;
280 
281 		if (is_sgl) {
282 			uint32_t remaining_off = auth_offset + auth_len;
283 			struct rte_mbuf *sgl_buf = sop->m_src;
284 			if (is_oop)
285 				sgl_buf = sop->m_dst;
286 
287 			while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)
288 					&& sgl_buf->next != NULL) {
289 				remaining_off -= rte_pktmbuf_data_len(sgl_buf);
290 				sgl_buf = sgl_buf->next;
291 			}
292 
293 			auth_end_iova = (uint64_t)rte_pktmbuf_iova_offset(
294 				sgl_buf, remaining_off);
295 		} else {
296 			auth_end_iova = rte_pktmbuf_iova(op->sym->m_src) +
297 							 auth_offset + auth_len;
298 		}
299 		/* Then check if digest-encrypted conditions are met */
300 		if ((auth_offset + auth_len < cipher_offset + cipher_len) &&
301 				(digest.iova == auth_end_iova) && is_sgl)
302 			max_len = RTE_MAX(max_len,
303 				auth_offset + auth_len +
304 				ut_params->auth_xform.auth.digest_length);
305 
306 	} else if (is_cipher) {
307 		cipher_offset = sop->cipher.data.offset;
308 		cipher_len = sop->cipher.data.length;
309 		max_len = cipher_len + cipher_offset;
310 		if (len_in_bits) {
311 			max_len = max_len >> 3;
312 			cipher_offset = cipher_offset >> 3;
313 			cipher_len = cipher_len >> 3;
314 		}
315 		ofs.ofs.cipher.head = cipher_offset;
316 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
317 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
318 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
319 
320 	} else if (is_auth) {
321 		auth_offset = sop->auth.data.offset;
322 		auth_len = sop->auth.data.length;
323 		max_len = auth_len + auth_offset;
324 		if (len_in_bits) {
325 			max_len = max_len >> 3;
326 			auth_offset = auth_offset >> 3;
327 			auth_len = auth_len >> 3;
328 		}
329 		ofs.ofs.auth.head = auth_offset;
330 		ofs.ofs.auth.tail = max_len - auth_offset - auth_len;
331 		aad_auth_iv.va = rte_crypto_op_ctod_offset(
332 				op, void *, IV_OFFSET + cipher_iv_len);
333 		aad_auth_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET +
334 				cipher_iv_len);
335 		digest.va = (void *)sop->auth.digest.data;
336 		digest.iova = sop->auth.digest.phys_addr;
337 
338 	} else { /* aead */
339 		cipher_offset = sop->aead.data.offset;
340 		cipher_len = sop->aead.data.length;
341 		max_len = cipher_len + cipher_offset;
342 		if (len_in_bits) {
343 			max_len = max_len >> 3;
344 			cipher_offset = cipher_offset >> 3;
345 			cipher_len = cipher_len >> 3;
346 		}
347 		ofs.ofs.cipher.head = cipher_offset;
348 		ofs.ofs.cipher.tail = max_len - cipher_offset - cipher_len;
349 		cipher_iv.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
350 		cipher_iv.iova = rte_crypto_op_ctophys_offset(op, IV_OFFSET);
351 		aad_auth_iv.va = (void *)sop->aead.aad.data;
352 		aad_auth_iv.iova = sop->aead.aad.phys_addr;
353 		digest.va = (void *)sop->aead.digest.data;
354 		digest.iova = sop->aead.digest.phys_addr;
355 	}
356 
357 	n = rte_crypto_mbuf_to_vec(sop->m_src, 0, max_len,
358 			data_vec, RTE_DIM(data_vec));
359 	if (n < 0 || n > sop->m_src->nb_segs) {
360 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
361 		goto exit;
362 	}
363 
364 	sgl.num = n;
365 	/* Out of place */
366 	if (is_oop) {
367 		dest_sgl.vec = dest_data_vec;
368 		vec.dest_sgl = &dest_sgl;
369 		n = rte_crypto_mbuf_to_vec(sop->m_dst, 0, max_len,
370 				dest_data_vec, RTE_DIM(dest_data_vec));
371 		if (n < 0 || n > sop->m_dst->nb_segs) {
372 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
373 			goto exit;
374 		}
375 		dest_sgl.num = n;
376 	} else
377 		vec.dest_sgl = NULL;
378 
379 	if (rte_cryptodev_raw_enqueue_burst(ctx, &vec, ofs, (void **)&op,
380 			&enqueue_status) < 1) {
381 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
382 		goto exit;
383 	}
384 
385 	if (enqueue_status == 0) {
386 		status = rte_cryptodev_raw_enqueue_done(ctx, 1);
387 		if (status < 0) {
388 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
389 			goto exit;
390 		}
391 	} else if (enqueue_status < 0) {
392 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
393 		goto exit;
394 	}
395 
396 	n = n_success = 0;
397 	while (count++ < MAX_RAW_DEQUEUE_COUNT && n == 0) {
398 		n = rte_cryptodev_raw_dequeue_burst(ctx,
399 			NULL, 1, post_process_raw_dp_op,
400 				(void **)&ret_op, 0, &n_success,
401 				&dequeue_status);
402 		if (dequeue_status < 0) {
403 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
404 			goto exit;
405 		}
406 		if (n == 0)
407 			rte_pause();
408 	}
409 
410 	if (n == 1 && dequeue_status == 0) {
411 		if (rte_cryptodev_raw_dequeue_done(ctx, 1) < 0) {
412 			op->status = RTE_CRYPTO_OP_STATUS_ERROR;
413 			goto exit;
414 		}
415 	}
416 
417 	op->status = (count == MAX_RAW_DEQUEUE_COUNT + 1 || ret_op != op ||
418 			ret_op->status == RTE_CRYPTO_OP_STATUS_ERROR ||
419 			n_success < 1) ? RTE_CRYPTO_OP_STATUS_ERROR :
420 					RTE_CRYPTO_OP_STATUS_SUCCESS;
421 
422 exit:
423 	free(ctx);
424 }
425 
426 static void
427 process_cpu_aead_op(uint8_t dev_id, struct rte_crypto_op *op)
428 {
429 	int32_t n, st;
430 	struct rte_crypto_sym_op *sop;
431 	union rte_crypto_sym_ofs ofs;
432 	struct rte_crypto_sgl sgl;
433 	struct rte_crypto_sym_vec symvec;
434 	struct rte_crypto_va_iova_ptr iv_ptr, aad_ptr, digest_ptr;
435 	struct rte_crypto_vec vec[UINT8_MAX];
436 
437 	sop = op->sym;
438 
439 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->aead.data.offset,
440 		sop->aead.data.length, vec, RTE_DIM(vec));
441 
442 	if (n < 0 || n != sop->m_src->nb_segs) {
443 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
444 		return;
445 	}
446 
447 	sgl.vec = vec;
448 	sgl.num = n;
449 	symvec.src_sgl = &sgl;
450 	symvec.iv = &iv_ptr;
451 	symvec.digest = &digest_ptr;
452 	symvec.aad = &aad_ptr;
453 	symvec.status = &st;
454 	symvec.num = 1;
455 
456 	/* for CPU crypto the IOVA address is not required */
457 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
458 	digest_ptr.va = (void *)sop->aead.digest.data;
459 	aad_ptr.va = (void *)sop->aead.aad.data;
460 
461 	ofs.raw = 0;
462 
463 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
464 		&symvec);
465 
466 	if (n != 1)
467 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
468 	else
469 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
470 }
471 
472 static void
473 process_cpu_crypt_auth_op(uint8_t dev_id, struct rte_crypto_op *op)
474 {
475 	int32_t n, st;
476 	struct rte_crypto_sym_op *sop;
477 	union rte_crypto_sym_ofs ofs;
478 	struct rte_crypto_sgl sgl;
479 	struct rte_crypto_sym_vec symvec;
480 	struct rte_crypto_va_iova_ptr iv_ptr, digest_ptr;
481 	struct rte_crypto_vec vec[UINT8_MAX];
482 
483 	sop = op->sym;
484 
485 	n = rte_crypto_mbuf_to_vec(sop->m_src, sop->auth.data.offset,
486 		sop->auth.data.length, vec, RTE_DIM(vec));
487 
488 	if (n < 0 || n != sop->m_src->nb_segs) {
489 		op->status = RTE_CRYPTO_OP_STATUS_ERROR;
490 		return;
491 	}
492 
493 	sgl.vec = vec;
494 	sgl.num = n;
495 	symvec.src_sgl = &sgl;
496 	symvec.iv = &iv_ptr;
497 	symvec.digest = &digest_ptr;
498 	symvec.status = &st;
499 	symvec.num = 1;
500 
501 	iv_ptr.va = rte_crypto_op_ctod_offset(op, void *, IV_OFFSET);
502 	digest_ptr.va = (void *)sop->auth.digest.data;
503 
504 	ofs.raw = 0;
505 	ofs.ofs.cipher.head = sop->cipher.data.offset - sop->auth.data.offset;
506 	ofs.ofs.cipher.tail = (sop->auth.data.offset + sop->auth.data.length) -
507 		(sop->cipher.data.offset + sop->cipher.data.length);
508 
509 	n = rte_cryptodev_sym_cpu_crypto_process(dev_id, sop->session, ofs,
510 		&symvec);
511 
512 	if (n != 1)
513 		op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
514 	else
515 		op->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
516 }
517 
518 static struct rte_crypto_op *
519 process_crypto_request(uint8_t dev_id, struct rte_crypto_op *op)
520 {
521 
522 	RTE_VERIFY(gbl_action_type != RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO);
523 
524 	if (rte_cryptodev_enqueue_burst(dev_id, 0, &op, 1) != 1) {
525 		RTE_LOG(ERR, USER1, "Error sending packet for encryption\n");
526 		return NULL;
527 	}
528 
529 	op = NULL;
530 
531 	while (rte_cryptodev_dequeue_burst(dev_id, 0, &op, 1) == 0)
532 		rte_pause();
533 
534 	if (op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
535 		RTE_LOG(DEBUG, USER1, "Operation status %d\n", op->status);
536 		return NULL;
537 	}
538 
539 	return op;
540 }
541 
542 static int
543 testsuite_setup(void)
544 {
545 	struct crypto_testsuite_params *ts_params = &testsuite_params;
546 	struct rte_cryptodev_info info;
547 	uint32_t i = 0, nb_devs, dev_id;
548 	uint16_t qp_id;
549 
550 	memset(ts_params, 0, sizeof(*ts_params));
551 
552 	ts_params->mbuf_pool = rte_mempool_lookup("CRYPTO_MBUFPOOL");
553 	if (ts_params->mbuf_pool == NULL) {
554 		/* Not already created so create */
555 		ts_params->mbuf_pool = rte_pktmbuf_pool_create(
556 				"CRYPTO_MBUFPOOL",
557 				NUM_MBUFS, MBUF_CACHE_SIZE, 0, MBUF_SIZE,
558 				rte_socket_id());
559 		if (ts_params->mbuf_pool == NULL) {
560 			RTE_LOG(ERR, USER1, "Can't create CRYPTO_MBUFPOOL\n");
561 			return TEST_FAILED;
562 		}
563 	}
564 
565 	ts_params->large_mbuf_pool = rte_mempool_lookup(
566 			"CRYPTO_LARGE_MBUFPOOL");
567 	if (ts_params->large_mbuf_pool == NULL) {
568 		/* Not already created so create */
569 		ts_params->large_mbuf_pool = rte_pktmbuf_pool_create(
570 				"CRYPTO_LARGE_MBUFPOOL",
571 				1, 0, 0, UINT16_MAX,
572 				rte_socket_id());
573 		if (ts_params->large_mbuf_pool == NULL) {
574 			RTE_LOG(ERR, USER1,
575 				"Can't create CRYPTO_LARGE_MBUFPOOL\n");
576 			return TEST_FAILED;
577 		}
578 	}
579 
580 	ts_params->op_mpool = rte_crypto_op_pool_create(
581 			"MBUF_CRYPTO_SYM_OP_POOL",
582 			RTE_CRYPTO_OP_TYPE_SYMMETRIC,
583 			NUM_MBUFS, MBUF_CACHE_SIZE,
584 			DEFAULT_NUM_XFORMS *
585 			sizeof(struct rte_crypto_sym_xform) +
586 			MAXIMUM_IV_LENGTH,
587 			rte_socket_id());
588 	if (ts_params->op_mpool == NULL) {
589 		RTE_LOG(ERR, USER1, "Can't create CRYPTO_OP_POOL\n");
590 		return TEST_FAILED;
591 	}
592 
593 	nb_devs = rte_cryptodev_count();
594 	if (nb_devs < 1) {
595 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
596 		return TEST_SKIPPED;
597 	}
598 
599 	if (rte_cryptodev_device_count_by_driver(gbl_driver_id) < 1) {
600 		RTE_LOG(WARNING, USER1, "No %s devices found?\n",
601 				rte_cryptodev_driver_name_get(gbl_driver_id));
602 		return TEST_SKIPPED;
603 	}
604 
605 	/* Create list of valid crypto devs */
606 	for (i = 0; i < nb_devs; i++) {
607 		rte_cryptodev_info_get(i, &info);
608 		if (info.driver_id == gbl_driver_id)
609 			ts_params->valid_devs[ts_params->valid_dev_count++] = i;
610 	}
611 
612 	if (ts_params->valid_dev_count < 1)
613 		return TEST_FAILED;
614 
615 	/* Set up all the qps on the first of the valid devices found */
616 
617 	dev_id = ts_params->valid_devs[0];
618 
619 	rte_cryptodev_info_get(dev_id, &info);
620 
621 	ts_params->conf.nb_queue_pairs = info.max_nb_queue_pairs;
622 	ts_params->conf.socket_id = SOCKET_ID_ANY;
623 	ts_params->conf.ff_disable = RTE_CRYPTODEV_FF_SECURITY;
624 
625 	unsigned int session_size =
626 		rte_cryptodev_sym_get_private_session_size(dev_id);
627 
628 #ifdef RTE_LIB_SECURITY
629 	unsigned int security_session_size = rte_security_session_get_size(
630 			rte_cryptodev_get_sec_ctx(dev_id));
631 
632 	if (session_size < security_session_size)
633 		session_size = security_session_size;
634 #endif
635 	/*
636 	 * Create mempool with maximum number of sessions.
637 	 */
638 	if (info.sym.max_nb_sessions != 0 &&
639 			info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
640 		RTE_LOG(ERR, USER1, "Device does not support "
641 				"at least %u sessions\n",
642 				MAX_NB_SESSIONS);
643 		return TEST_FAILED;
644 	}
645 
646 	ts_params->session_mpool = rte_cryptodev_sym_session_pool_create(
647 			"test_sess_mp", MAX_NB_SESSIONS, 0, 0, 0,
648 			SOCKET_ID_ANY);
649 	TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
650 			"session mempool allocation failed");
651 
652 	ts_params->session_priv_mpool = rte_mempool_create(
653 			"test_sess_mp_priv",
654 			MAX_NB_SESSIONS,
655 			session_size,
656 			0, 0, NULL, NULL, NULL,
657 			NULL, SOCKET_ID_ANY,
658 			0);
659 	TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
660 			"session mempool allocation failed");
661 
662 
663 
664 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id,
665 			&ts_params->conf),
666 			"Failed to configure cryptodev %u with %u qps",
667 			dev_id, ts_params->conf.nb_queue_pairs);
668 
669 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
670 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
671 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
672 
673 	for (qp_id = 0; qp_id < info.max_nb_queue_pairs; qp_id++) {
674 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
675 			dev_id, qp_id, &ts_params->qp_conf,
676 			rte_cryptodev_socket_id(dev_id)),
677 			"Failed to setup queue pair %u on cryptodev %u",
678 			qp_id, dev_id);
679 	}
680 
681 	return TEST_SUCCESS;
682 }
683 
684 static void
685 testsuite_teardown(void)
686 {
687 	struct crypto_testsuite_params *ts_params = &testsuite_params;
688 	int res;
689 
690 	if (ts_params->mbuf_pool != NULL) {
691 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
692 		rte_mempool_avail_count(ts_params->mbuf_pool));
693 	}
694 
695 	if (ts_params->op_mpool != NULL) {
696 		RTE_LOG(DEBUG, USER1, "CRYPTO_OP_POOL count %u\n",
697 		rte_mempool_avail_count(ts_params->op_mpool));
698 	}
699 
700 	/* Free session mempools */
701 	if (ts_params->session_priv_mpool != NULL) {
702 		rte_mempool_free(ts_params->session_priv_mpool);
703 		ts_params->session_priv_mpool = NULL;
704 	}
705 
706 	if (ts_params->session_mpool != NULL) {
707 		rte_mempool_free(ts_params->session_mpool);
708 		ts_params->session_mpool = NULL;
709 	}
710 
711 	res = rte_cryptodev_close(ts_params->valid_devs[0]);
712 	if (res)
713 		RTE_LOG(ERR, USER1, "Crypto device close error %d\n", res);
714 }
715 
716 static int
717 check_capabilities_supported(enum rte_crypto_sym_xform_type type,
718 		const int *algs, uint16_t num_algs)
719 {
720 	uint8_t dev_id = testsuite_params.valid_devs[0];
721 	bool some_alg_supported = FALSE;
722 	uint16_t i;
723 
724 	for (i = 0; i < num_algs && !some_alg_supported; i++) {
725 		struct rte_cryptodev_sym_capability_idx alg = {
726 			type, {algs[i]}
727 		};
728 		if (rte_cryptodev_sym_capability_get(dev_id,
729 				&alg) != NULL)
730 			some_alg_supported = TRUE;
731 	}
732 	if (!some_alg_supported)
733 		return TEST_SKIPPED;
734 
735 	return 0;
736 }
737 
738 int
739 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers,
740 		uint16_t num_ciphers)
741 {
742 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_CIPHER,
743 			(const int *) ciphers, num_ciphers);
744 }
745 
746 int
747 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths,
748 		uint16_t num_auths)
749 {
750 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AUTH,
751 			(const int *) auths, num_auths);
752 }
753 
754 int
755 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads,
756 		uint16_t num_aeads)
757 {
758 	return check_capabilities_supported(RTE_CRYPTO_SYM_XFORM_AEAD,
759 			(const int *) aeads, num_aeads);
760 }
761 
762 static int
763 null_testsuite_setup(void)
764 {
765 	struct crypto_testsuite_params *ts_params = &testsuite_params;
766 	uint8_t dev_id = ts_params->valid_devs[0];
767 	struct rte_cryptodev_info dev_info;
768 	const enum rte_crypto_cipher_algorithm ciphers[] = {
769 		RTE_CRYPTO_CIPHER_NULL
770 	};
771 	const enum rte_crypto_auth_algorithm auths[] = {
772 		RTE_CRYPTO_AUTH_NULL
773 	};
774 
775 	rte_cryptodev_info_get(dev_id, &dev_info);
776 
777 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
778 		RTE_LOG(INFO, USER1, "Feature flag requirements for NULL "
779 				"testsuite not met\n");
780 		return TEST_SKIPPED;
781 	}
782 
783 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
784 			&& check_auth_capabilities_supported(auths,
785 			RTE_DIM(auths)) != 0) {
786 		RTE_LOG(INFO, USER1, "Capability requirements for NULL "
787 				"testsuite not met\n");
788 		return TEST_SKIPPED;
789 	}
790 
791 	return 0;
792 }
793 
794 static int
795 crypto_gen_testsuite_setup(void)
796 {
797 	struct crypto_testsuite_params *ts_params = &testsuite_params;
798 	uint8_t dev_id = ts_params->valid_devs[0];
799 	struct rte_cryptodev_info dev_info;
800 
801 	rte_cryptodev_info_get(dev_id, &dev_info);
802 
803 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
804 		RTE_LOG(INFO, USER1, "Feature flag requirements for Crypto Gen "
805 				"testsuite not met\n");
806 		return TEST_SKIPPED;
807 	}
808 
809 	return 0;
810 }
811 
812 #ifdef RTE_LIB_SECURITY
813 static int
814 ipsec_proto_testsuite_setup(void)
815 {
816 	struct crypto_testsuite_params *ts_params = &testsuite_params;
817 	struct crypto_unittest_params *ut_params = &unittest_params;
818 	struct rte_cryptodev_info dev_info;
819 	int ret = 0;
820 
821 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
822 
823 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SECURITY)) {
824 		RTE_LOG(INFO, USER1, "Feature flag requirements for IPsec Proto "
825 				"testsuite not met\n");
826 		return TEST_SKIPPED;
827 	}
828 
829 	/* Reconfigure to enable security */
830 	ret = dev_configure_and_start(0);
831 	if (ret != TEST_SUCCESS)
832 		return ret;
833 
834 	/* Set action type */
835 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
836 
837 	if (security_proto_supported(
838 			RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
839 			RTE_SECURITY_PROTOCOL_IPSEC) < 0) {
840 		RTE_LOG(INFO, USER1, "Capability requirements for IPsec Proto "
841 				"test not met\n");
842 		ret = TEST_SKIPPED;
843 	}
844 
845 	test_ipsec_alg_list_populate();
846 	test_ipsec_ah_alg_list_populate();
847 
848 	/*
849 	 * Stop the device. Device would be started again by individual test
850 	 * case setup routine.
851 	 */
852 	rte_cryptodev_stop(ts_params->valid_devs[0]);
853 
854 	return ret;
855 }
856 
857 static int
858 pdcp_proto_testsuite_setup(void)
859 {
860 	struct crypto_testsuite_params *ts_params = &testsuite_params;
861 	uint8_t dev_id = ts_params->valid_devs[0];
862 	struct rte_cryptodev_info dev_info;
863 	const enum rte_crypto_cipher_algorithm ciphers[] = {
864 		RTE_CRYPTO_CIPHER_NULL,
865 		RTE_CRYPTO_CIPHER_AES_CTR,
866 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
867 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
868 	};
869 	const enum rte_crypto_auth_algorithm auths[] = {
870 		RTE_CRYPTO_AUTH_NULL,
871 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
872 		RTE_CRYPTO_AUTH_AES_CMAC,
873 		RTE_CRYPTO_AUTH_ZUC_EIA3
874 	};
875 
876 	rte_cryptodev_info_get(dev_id, &dev_info);
877 
878 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
879 			!(dev_info.feature_flags &
880 			RTE_CRYPTODEV_FF_SECURITY)) {
881 		RTE_LOG(INFO, USER1, "Feature flag requirements for PDCP Proto "
882 				"testsuite not met\n");
883 		return TEST_SKIPPED;
884 	}
885 
886 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
887 			&& check_auth_capabilities_supported(auths,
888 			RTE_DIM(auths)) != 0) {
889 		RTE_LOG(INFO, USER1, "Capability requirements for PDCP Proto "
890 				"testsuite not met\n");
891 		return TEST_SKIPPED;
892 	}
893 
894 	return 0;
895 }
896 
897 static int
898 docsis_proto_testsuite_setup(void)
899 {
900 	struct crypto_testsuite_params *ts_params = &testsuite_params;
901 	uint8_t dev_id = ts_params->valid_devs[0];
902 	struct rte_cryptodev_info dev_info;
903 	const enum rte_crypto_cipher_algorithm ciphers[] = {
904 		RTE_CRYPTO_CIPHER_AES_DOCSISBPI
905 	};
906 
907 	rte_cryptodev_info_get(dev_id, &dev_info);
908 
909 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
910 			!(dev_info.feature_flags &
911 			RTE_CRYPTODEV_FF_SECURITY)) {
912 		RTE_LOG(INFO, USER1, "Feature flag requirements for DOCSIS "
913 				"Proto testsuite not met\n");
914 		return TEST_SKIPPED;
915 	}
916 
917 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0) {
918 		RTE_LOG(INFO, USER1, "Capability requirements for DOCSIS Proto "
919 				"testsuite not met\n");
920 		return TEST_SKIPPED;
921 	}
922 
923 	return 0;
924 }
925 #endif
926 
927 static int
928 aes_ccm_auth_testsuite_setup(void)
929 {
930 	struct crypto_testsuite_params *ts_params = &testsuite_params;
931 	uint8_t dev_id = ts_params->valid_devs[0];
932 	struct rte_cryptodev_info dev_info;
933 	const enum rte_crypto_aead_algorithm aeads[] = {
934 		RTE_CRYPTO_AEAD_AES_CCM
935 	};
936 
937 	rte_cryptodev_info_get(dev_id, &dev_info);
938 
939 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
940 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
941 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
942 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES CCM "
943 				"testsuite not met\n");
944 		return TEST_SKIPPED;
945 	}
946 
947 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
948 		RTE_LOG(INFO, USER1, "Capability requirements for AES CCM "
949 				"testsuite not met\n");
950 		return TEST_SKIPPED;
951 	}
952 
953 	return 0;
954 }
955 
956 static int
957 aes_gcm_auth_testsuite_setup(void)
958 {
959 	struct crypto_testsuite_params *ts_params = &testsuite_params;
960 	uint8_t dev_id = ts_params->valid_devs[0];
961 	struct rte_cryptodev_info dev_info;
962 	const enum rte_crypto_aead_algorithm aeads[] = {
963 		RTE_CRYPTO_AEAD_AES_GCM
964 	};
965 
966 	rte_cryptodev_info_get(dev_id, &dev_info);
967 
968 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
969 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GCM "
970 				"testsuite not met\n");
971 		return TEST_SKIPPED;
972 	}
973 
974 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
975 		RTE_LOG(INFO, USER1, "Capability requirements for AES GCM "
976 				"testsuite not met\n");
977 		return TEST_SKIPPED;
978 	}
979 
980 	return 0;
981 }
982 
983 static int
984 aes_gmac_auth_testsuite_setup(void)
985 {
986 	struct crypto_testsuite_params *ts_params = &testsuite_params;
987 	uint8_t dev_id = ts_params->valid_devs[0];
988 	struct rte_cryptodev_info dev_info;
989 	const enum rte_crypto_auth_algorithm auths[] = {
990 		RTE_CRYPTO_AUTH_AES_GMAC
991 	};
992 
993 	rte_cryptodev_info_get(dev_id, &dev_info);
994 
995 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
996 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
997 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
998 		RTE_LOG(INFO, USER1, "Feature flag requirements for AES GMAC "
999 				"testsuite not met\n");
1000 		return TEST_SKIPPED;
1001 	}
1002 
1003 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1004 		RTE_LOG(INFO, USER1, "Capability requirements for AES GMAC "
1005 				"testsuite not met\n");
1006 		return TEST_SKIPPED;
1007 	}
1008 
1009 	return 0;
1010 }
1011 
1012 static int
1013 chacha20_poly1305_testsuite_setup(void)
1014 {
1015 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1016 	uint8_t dev_id = ts_params->valid_devs[0];
1017 	struct rte_cryptodev_info dev_info;
1018 	const enum rte_crypto_aead_algorithm aeads[] = {
1019 		RTE_CRYPTO_AEAD_CHACHA20_POLY1305
1020 	};
1021 
1022 	rte_cryptodev_info_get(dev_id, &dev_info);
1023 
1024 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1025 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1026 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1027 		RTE_LOG(INFO, USER1, "Feature flag requirements for "
1028 				"Chacha20-Poly1305 testsuite not met\n");
1029 		return TEST_SKIPPED;
1030 	}
1031 
1032 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1033 		RTE_LOG(INFO, USER1, "Capability requirements for "
1034 				"Chacha20-Poly1305 testsuite not met\n");
1035 		return TEST_SKIPPED;
1036 	}
1037 
1038 	return 0;
1039 }
1040 
1041 static int
1042 snow3g_testsuite_setup(void)
1043 {
1044 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1045 	uint8_t dev_id = ts_params->valid_devs[0];
1046 	struct rte_cryptodev_info dev_info;
1047 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1048 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1049 
1050 	};
1051 	const enum rte_crypto_auth_algorithm auths[] = {
1052 		RTE_CRYPTO_AUTH_SNOW3G_UIA2
1053 	};
1054 
1055 	rte_cryptodev_info_get(dev_id, &dev_info);
1056 
1057 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1058 		RTE_LOG(INFO, USER1, "Feature flag requirements for Snow3G "
1059 				"testsuite not met\n");
1060 		return TEST_SKIPPED;
1061 	}
1062 
1063 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1064 			&& check_auth_capabilities_supported(auths,
1065 			RTE_DIM(auths)) != 0) {
1066 		RTE_LOG(INFO, USER1, "Capability requirements for Snow3G "
1067 				"testsuite not met\n");
1068 		return TEST_SKIPPED;
1069 	}
1070 
1071 	return 0;
1072 }
1073 
1074 static int
1075 zuc_testsuite_setup(void)
1076 {
1077 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1078 	uint8_t dev_id = ts_params->valid_devs[0];
1079 	struct rte_cryptodev_info dev_info;
1080 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1081 		RTE_CRYPTO_CIPHER_ZUC_EEA3
1082 	};
1083 	const enum rte_crypto_auth_algorithm auths[] = {
1084 		RTE_CRYPTO_AUTH_ZUC_EIA3
1085 	};
1086 
1087 	rte_cryptodev_info_get(dev_id, &dev_info);
1088 
1089 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1090 		RTE_LOG(INFO, USER1, "Feature flag requirements for ZUC "
1091 				"testsuite not met\n");
1092 		return TEST_SKIPPED;
1093 	}
1094 
1095 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1096 			&& check_auth_capabilities_supported(auths,
1097 			RTE_DIM(auths)) != 0) {
1098 		RTE_LOG(INFO, USER1, "Capability requirements for ZUC "
1099 				"testsuite not met\n");
1100 		return TEST_SKIPPED;
1101 	}
1102 
1103 	return 0;
1104 }
1105 
1106 static int
1107 hmac_md5_auth_testsuite_setup(void)
1108 {
1109 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1110 	uint8_t dev_id = ts_params->valid_devs[0];
1111 	struct rte_cryptodev_info dev_info;
1112 	const enum rte_crypto_auth_algorithm auths[] = {
1113 		RTE_CRYPTO_AUTH_MD5_HMAC
1114 	};
1115 
1116 	rte_cryptodev_info_get(dev_id, &dev_info);
1117 
1118 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1119 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1120 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1121 		RTE_LOG(INFO, USER1, "Feature flag requirements for HMAC MD5 "
1122 				"Auth testsuite not met\n");
1123 		return TEST_SKIPPED;
1124 	}
1125 
1126 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1127 		RTE_LOG(INFO, USER1, "Capability requirements for HMAC MD5 "
1128 				"testsuite not met\n");
1129 		return TEST_SKIPPED;
1130 	}
1131 
1132 	return 0;
1133 }
1134 
1135 static int
1136 kasumi_testsuite_setup(void)
1137 {
1138 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1139 	uint8_t dev_id = ts_params->valid_devs[0];
1140 	struct rte_cryptodev_info dev_info;
1141 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1142 		RTE_CRYPTO_CIPHER_KASUMI_F8
1143 	};
1144 	const enum rte_crypto_auth_algorithm auths[] = {
1145 		RTE_CRYPTO_AUTH_KASUMI_F9
1146 	};
1147 
1148 	rte_cryptodev_info_get(dev_id, &dev_info);
1149 
1150 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1151 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1152 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1153 		RTE_LOG(INFO, USER1, "Feature flag requirements for Kasumi "
1154 				"testsuite not met\n");
1155 		return TEST_SKIPPED;
1156 	}
1157 
1158 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1159 			&& check_auth_capabilities_supported(auths,
1160 			RTE_DIM(auths)) != 0) {
1161 		RTE_LOG(INFO, USER1, "Capability requirements for Kasumi "
1162 				"testsuite not met\n");
1163 		return TEST_SKIPPED;
1164 	}
1165 
1166 	return 0;
1167 }
1168 
1169 static int
1170 negative_aes_gcm_testsuite_setup(void)
1171 {
1172 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1173 	uint8_t dev_id = ts_params->valid_devs[0];
1174 	struct rte_cryptodev_info dev_info;
1175 	const enum rte_crypto_aead_algorithm aeads[] = {
1176 		RTE_CRYPTO_AEAD_AES_GCM
1177 	};
1178 
1179 	rte_cryptodev_info_get(dev_id, &dev_info);
1180 
1181 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1182 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1183 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1184 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1185 				"AES GCM testsuite not met\n");
1186 		return TEST_SKIPPED;
1187 	}
1188 
1189 	if (check_aead_capabilities_supported(aeads, RTE_DIM(aeads)) != 0) {
1190 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1191 				"AES GCM testsuite not met\n");
1192 		return TEST_SKIPPED;
1193 	}
1194 
1195 	return 0;
1196 }
1197 
1198 static int
1199 negative_aes_gmac_testsuite_setup(void)
1200 {
1201 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1202 	uint8_t dev_id = ts_params->valid_devs[0];
1203 	struct rte_cryptodev_info dev_info;
1204 	const enum rte_crypto_auth_algorithm auths[] = {
1205 		RTE_CRYPTO_AUTH_AES_GMAC
1206 	};
1207 
1208 	rte_cryptodev_info_get(dev_id, &dev_info);
1209 
1210 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1211 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1212 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1213 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1214 				"AES GMAC testsuite not met\n");
1215 		return TEST_SKIPPED;
1216 	}
1217 
1218 	if (check_auth_capabilities_supported(auths, RTE_DIM(auths)) != 0) {
1219 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1220 				"AES GMAC testsuite not met\n");
1221 		return TEST_SKIPPED;
1222 	}
1223 
1224 	return 0;
1225 }
1226 
1227 static int
1228 mixed_cipher_hash_testsuite_setup(void)
1229 {
1230 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1231 	uint8_t dev_id = ts_params->valid_devs[0];
1232 	struct rte_cryptodev_info dev_info;
1233 	uint64_t feat_flags;
1234 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1235 		RTE_CRYPTO_CIPHER_NULL,
1236 		RTE_CRYPTO_CIPHER_AES_CTR,
1237 		RTE_CRYPTO_CIPHER_ZUC_EEA3,
1238 		RTE_CRYPTO_CIPHER_SNOW3G_UEA2
1239 	};
1240 	const enum rte_crypto_auth_algorithm auths[] = {
1241 		RTE_CRYPTO_AUTH_NULL,
1242 		RTE_CRYPTO_AUTH_SNOW3G_UIA2,
1243 		RTE_CRYPTO_AUTH_AES_CMAC,
1244 		RTE_CRYPTO_AUTH_ZUC_EIA3
1245 	};
1246 
1247 	rte_cryptodev_info_get(dev_id, &dev_info);
1248 	feat_flags = dev_info.feature_flags;
1249 
1250 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1251 			(global_api_test_type == CRYPTODEV_RAW_API_TEST)) {
1252 		RTE_LOG(INFO, USER1, "Feature flag requirements for Mixed "
1253 				"Cipher Hash testsuite not met\n");
1254 		return TEST_SKIPPED;
1255 	}
1256 
1257 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1258 			&& check_auth_capabilities_supported(auths,
1259 			RTE_DIM(auths)) != 0) {
1260 		RTE_LOG(INFO, USER1, "Capability requirements for Mixed "
1261 				"Cipher Hash testsuite not met\n");
1262 		return TEST_SKIPPED;
1263 	}
1264 
1265 	return 0;
1266 }
1267 
1268 static int
1269 esn_testsuite_setup(void)
1270 {
1271 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1272 	uint8_t dev_id = ts_params->valid_devs[0];
1273 	struct rte_cryptodev_info dev_info;
1274 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1275 		RTE_CRYPTO_CIPHER_AES_CBC
1276 	};
1277 	const enum rte_crypto_auth_algorithm auths[] = {
1278 		RTE_CRYPTO_AUTH_SHA1_HMAC
1279 	};
1280 
1281 	rte_cryptodev_info_get(dev_id, &dev_info);
1282 
1283 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1284 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1285 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1286 		RTE_LOG(INFO, USER1, "Feature flag requirements for ESN "
1287 				"testsuite not met\n");
1288 		return TEST_SKIPPED;
1289 	}
1290 
1291 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1292 			&& check_auth_capabilities_supported(auths,
1293 			RTE_DIM(auths)) != 0) {
1294 		RTE_LOG(INFO, USER1, "Capability requirements for ESN "
1295 				"testsuite not met\n");
1296 		return TEST_SKIPPED;
1297 	}
1298 
1299 	return 0;
1300 }
1301 
1302 static int
1303 multi_session_testsuite_setup(void)
1304 {
1305 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1306 	uint8_t dev_id = ts_params->valid_devs[0];
1307 	struct rte_cryptodev_info dev_info;
1308 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1309 		RTE_CRYPTO_CIPHER_AES_CBC
1310 	};
1311 	const enum rte_crypto_auth_algorithm auths[] = {
1312 		RTE_CRYPTO_AUTH_SHA512_HMAC
1313 	};
1314 
1315 	rte_cryptodev_info_get(dev_id, &dev_info);
1316 
1317 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO)) {
1318 		RTE_LOG(INFO, USER1, "Feature flag requirements for Multi "
1319 				"Session testsuite not met\n");
1320 		return TEST_SKIPPED;
1321 	}
1322 
1323 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1324 			&& check_auth_capabilities_supported(auths,
1325 			RTE_DIM(auths)) != 0) {
1326 		RTE_LOG(INFO, USER1, "Capability requirements for Multi "
1327 				"Session testsuite not met\n");
1328 		return TEST_SKIPPED;
1329 	}
1330 
1331 	return 0;
1332 }
1333 
1334 static int
1335 negative_hmac_sha1_testsuite_setup(void)
1336 {
1337 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1338 	uint8_t dev_id = ts_params->valid_devs[0];
1339 	struct rte_cryptodev_info dev_info;
1340 	const enum rte_crypto_cipher_algorithm ciphers[] = {
1341 		RTE_CRYPTO_CIPHER_AES_CBC
1342 	};
1343 	const enum rte_crypto_auth_algorithm auths[] = {
1344 		RTE_CRYPTO_AUTH_SHA1_HMAC
1345 	};
1346 
1347 	rte_cryptodev_info_get(dev_id, &dev_info);
1348 
1349 	if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) ||
1350 			((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
1351 			!(dev_info.feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
1352 		RTE_LOG(INFO, USER1, "Feature flag requirements for Negative "
1353 				"HMAC SHA1 testsuite not met\n");
1354 		return TEST_SKIPPED;
1355 	}
1356 
1357 	if (check_cipher_capabilities_supported(ciphers, RTE_DIM(ciphers)) != 0
1358 			&& check_auth_capabilities_supported(auths,
1359 			RTE_DIM(auths)) != 0) {
1360 		RTE_LOG(INFO, USER1, "Capability requirements for Negative "
1361 				"HMAC SHA1 testsuite not met\n");
1362 		return TEST_SKIPPED;
1363 	}
1364 
1365 	return 0;
1366 }
1367 
1368 static int
1369 dev_configure_and_start(uint64_t ff_disable)
1370 {
1371 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1372 	struct crypto_unittest_params *ut_params = &unittest_params;
1373 
1374 	uint16_t qp_id;
1375 
1376 	/* Clear unit test parameters before running test */
1377 	memset(ut_params, 0, sizeof(*ut_params));
1378 
1379 	/* Reconfigure device to default parameters */
1380 	ts_params->conf.socket_id = SOCKET_ID_ANY;
1381 	ts_params->conf.ff_disable = ff_disable;
1382 	ts_params->qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
1383 	ts_params->qp_conf.mp_session = ts_params->session_mpool;
1384 	ts_params->qp_conf.mp_session_private = ts_params->session_priv_mpool;
1385 
1386 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1387 			&ts_params->conf),
1388 			"Failed to configure cryptodev %u",
1389 			ts_params->valid_devs[0]);
1390 
1391 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs ; qp_id++) {
1392 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1393 			ts_params->valid_devs[0], qp_id,
1394 			&ts_params->qp_conf,
1395 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1396 			"Failed to setup queue pair %u on cryptodev %u",
1397 			qp_id, ts_params->valid_devs[0]);
1398 	}
1399 
1400 
1401 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
1402 
1403 	/* Start the device */
1404 	TEST_ASSERT_SUCCESS(rte_cryptodev_start(ts_params->valid_devs[0]),
1405 			"Failed to start cryptodev %u",
1406 			ts_params->valid_devs[0]);
1407 
1408 	return TEST_SUCCESS;
1409 }
1410 
1411 int
1412 ut_setup(void)
1413 {
1414 	/* Configure and start the device with security feature disabled */
1415 	return dev_configure_and_start(RTE_CRYPTODEV_FF_SECURITY);
1416 }
1417 
1418 static int
1419 ut_setup_security(void)
1420 {
1421 	/* Configure and start the device with no features disabled */
1422 	return dev_configure_and_start(0);
1423 }
1424 
1425 void
1426 ut_teardown(void)
1427 {
1428 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1429 	struct crypto_unittest_params *ut_params = &unittest_params;
1430 
1431 	/* free crypto session structure */
1432 #ifdef RTE_LIB_SECURITY
1433 	if (ut_params->type == RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL) {
1434 		if (ut_params->sec_session) {
1435 			rte_security_session_destroy(rte_cryptodev_get_sec_ctx
1436 						(ts_params->valid_devs[0]),
1437 						ut_params->sec_session);
1438 			ut_params->sec_session = NULL;
1439 		}
1440 	} else
1441 #endif
1442 	{
1443 		if (ut_params->sess) {
1444 			rte_cryptodev_sym_session_clear(
1445 					ts_params->valid_devs[0],
1446 					ut_params->sess);
1447 			rte_cryptodev_sym_session_free(ut_params->sess);
1448 			ut_params->sess = NULL;
1449 		}
1450 	}
1451 
1452 	/* free crypto operation structure */
1453 	if (ut_params->op)
1454 		rte_crypto_op_free(ut_params->op);
1455 
1456 	/*
1457 	 * free mbuf - both obuf and ibuf are usually the same,
1458 	 * so check if they point at the same address is necessary,
1459 	 * to avoid freeing the mbuf twice.
1460 	 */
1461 	if (ut_params->obuf) {
1462 		rte_pktmbuf_free(ut_params->obuf);
1463 		if (ut_params->ibuf == ut_params->obuf)
1464 			ut_params->ibuf = 0;
1465 		ut_params->obuf = 0;
1466 	}
1467 	if (ut_params->ibuf) {
1468 		rte_pktmbuf_free(ut_params->ibuf);
1469 		ut_params->ibuf = 0;
1470 	}
1471 
1472 	if (ts_params->mbuf_pool != NULL)
1473 		RTE_LOG(DEBUG, USER1, "CRYPTO_MBUFPOOL count %u\n",
1474 			rte_mempool_avail_count(ts_params->mbuf_pool));
1475 
1476 	/* Stop the device */
1477 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1478 }
1479 
1480 static int
1481 test_device_configure_invalid_dev_id(void)
1482 {
1483 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1484 	uint16_t dev_id, num_devs = 0;
1485 
1486 	TEST_ASSERT((num_devs = rte_cryptodev_count()) >= 1,
1487 			"Need at least %d devices for test", 1);
1488 
1489 	/* valid dev_id values */
1490 	dev_id = ts_params->valid_devs[0];
1491 
1492 	/* Stop the device in case it's started so it can be configured */
1493 	rte_cryptodev_stop(dev_id);
1494 
1495 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(dev_id, &ts_params->conf),
1496 			"Failed test for rte_cryptodev_configure: "
1497 			"invalid dev_num %u", dev_id);
1498 
1499 	/* invalid dev_id values */
1500 	dev_id = num_devs;
1501 
1502 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1503 			"Failed test for rte_cryptodev_configure: "
1504 			"invalid dev_num %u", dev_id);
1505 
1506 	dev_id = 0xff;
1507 
1508 	TEST_ASSERT_FAIL(rte_cryptodev_configure(dev_id, &ts_params->conf),
1509 			"Failed test for rte_cryptodev_configure:"
1510 			"invalid dev_num %u", dev_id);
1511 
1512 	return TEST_SUCCESS;
1513 }
1514 
1515 static int
1516 test_device_configure_invalid_queue_pair_ids(void)
1517 {
1518 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1519 	uint16_t orig_nb_qps = ts_params->conf.nb_queue_pairs;
1520 
1521 	/* Stop the device in case it's started so it can be configured */
1522 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1523 
1524 	/* valid - max value queue pairs */
1525 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1526 
1527 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1528 			&ts_params->conf),
1529 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1530 			ts_params->valid_devs[0], ts_params->conf.nb_queue_pairs);
1531 
1532 	/* valid - one queue pairs */
1533 	ts_params->conf.nb_queue_pairs = 1;
1534 
1535 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1536 			&ts_params->conf),
1537 			"Failed to configure cryptodev: dev_id %u, qp_id %u",
1538 			ts_params->valid_devs[0],
1539 			ts_params->conf.nb_queue_pairs);
1540 
1541 
1542 	/* invalid - zero queue pairs */
1543 	ts_params->conf.nb_queue_pairs = 0;
1544 
1545 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1546 			&ts_params->conf),
1547 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1548 			" invalid qps: %u",
1549 			ts_params->valid_devs[0],
1550 			ts_params->conf.nb_queue_pairs);
1551 
1552 
1553 	/* invalid - max value supported by field queue pairs */
1554 	ts_params->conf.nb_queue_pairs = UINT16_MAX;
1555 
1556 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1557 			&ts_params->conf),
1558 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1559 			" invalid qps: %u",
1560 			ts_params->valid_devs[0],
1561 			ts_params->conf.nb_queue_pairs);
1562 
1563 
1564 	/* invalid - max value + 1 queue pairs */
1565 	ts_params->conf.nb_queue_pairs = orig_nb_qps + 1;
1566 
1567 	TEST_ASSERT_FAIL(rte_cryptodev_configure(ts_params->valid_devs[0],
1568 			&ts_params->conf),
1569 			"Failed test for rte_cryptodev_configure, dev_id %u,"
1570 			" invalid qps: %u",
1571 			ts_params->valid_devs[0],
1572 			ts_params->conf.nb_queue_pairs);
1573 
1574 	/* revert to original testsuite value */
1575 	ts_params->conf.nb_queue_pairs = orig_nb_qps;
1576 
1577 	return TEST_SUCCESS;
1578 }
1579 
1580 static int
1581 test_queue_pair_descriptor_setup(void)
1582 {
1583 	struct crypto_testsuite_params *ts_params = &testsuite_params;
1584 	struct rte_cryptodev_qp_conf qp_conf = {
1585 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
1586 	};
1587 	uint16_t qp_id;
1588 
1589 	/* Stop the device in case it's started so it can be configured */
1590 	rte_cryptodev_stop(ts_params->valid_devs[0]);
1591 
1592 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
1593 			&ts_params->conf),
1594 			"Failed to configure cryptodev %u",
1595 			ts_params->valid_devs[0]);
1596 
1597 	/*
1598 	 * Test various ring sizes on this device. memzones can't be
1599 	 * freed so are re-used if ring is released and re-created.
1600 	 */
1601 	qp_conf.nb_descriptors = MIN_NUM_OPS_INFLIGHT; /* min size*/
1602 	qp_conf.mp_session = ts_params->session_mpool;
1603 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
1604 
1605 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1606 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1607 				ts_params->valid_devs[0], qp_id, &qp_conf,
1608 				rte_cryptodev_socket_id(
1609 						ts_params->valid_devs[0])),
1610 				"Failed test for "
1611 				"rte_cryptodev_queue_pair_setup: num_inflights "
1612 				"%u on qp %u on cryptodev %u",
1613 				qp_conf.nb_descriptors, qp_id,
1614 				ts_params->valid_devs[0]);
1615 	}
1616 
1617 	qp_conf.nb_descriptors = (uint32_t)(MAX_NUM_OPS_INFLIGHT / 2);
1618 
1619 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1620 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1621 				ts_params->valid_devs[0], qp_id, &qp_conf,
1622 				rte_cryptodev_socket_id(
1623 						ts_params->valid_devs[0])),
1624 				"Failed test for"
1625 				" rte_cryptodev_queue_pair_setup: num_inflights"
1626 				" %u on qp %u on cryptodev %u",
1627 				qp_conf.nb_descriptors, qp_id,
1628 				ts_params->valid_devs[0]);
1629 	}
1630 
1631 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT; /* valid */
1632 
1633 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1634 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1635 				ts_params->valid_devs[0], qp_id, &qp_conf,
1636 				rte_cryptodev_socket_id(
1637 						ts_params->valid_devs[0])),
1638 				"Failed test for "
1639 				"rte_cryptodev_queue_pair_setup: num_inflights"
1640 				" %u on qp %u on cryptodev %u",
1641 				qp_conf.nb_descriptors, qp_id,
1642 				ts_params->valid_devs[0]);
1643 	}
1644 
1645 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;
1646 
1647 	for (qp_id = 0; qp_id < ts_params->conf.nb_queue_pairs; qp_id++) {
1648 		TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
1649 				ts_params->valid_devs[0], qp_id, &qp_conf,
1650 				rte_cryptodev_socket_id(
1651 						ts_params->valid_devs[0])),
1652 				"Failed test for"
1653 				" rte_cryptodev_queue_pair_setup:"
1654 				"num_inflights %u on qp %u on cryptodev %u",
1655 				qp_conf.nb_descriptors, qp_id,
1656 				ts_params->valid_devs[0]);
1657 	}
1658 
1659 	/* test invalid queue pair id */
1660 	qp_conf.nb_descriptors = DEFAULT_NUM_OPS_INFLIGHT;	/*valid */
1661 
1662 	qp_id = ts_params->conf.nb_queue_pairs;		/*invalid */
1663 
1664 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1665 			ts_params->valid_devs[0],
1666 			qp_id, &qp_conf,
1667 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1668 			"Failed test for rte_cryptodev_queue_pair_setup:"
1669 			"invalid qp %u on cryptodev %u",
1670 			qp_id, ts_params->valid_devs[0]);
1671 
1672 	qp_id = 0xffff; /*invalid*/
1673 
1674 	TEST_ASSERT_FAIL(rte_cryptodev_queue_pair_setup(
1675 			ts_params->valid_devs[0],
1676 			qp_id, &qp_conf,
1677 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
1678 			"Failed test for rte_cryptodev_queue_pair_setup:"
1679 			"invalid qp %u on cryptodev %u",
1680 			qp_id, ts_params->valid_devs[0]);
1681 
1682 	return TEST_SUCCESS;
1683 }
1684 
1685 /* ***** Plaintext data for tests ***** */
1686 
1687 const char catch_22_quote_1[] =
1688 		"There was only one catch and that was Catch-22, which "
1689 		"specified that a concern for one's safety in the face of "
1690 		"dangers that were real and immediate was the process of a "
1691 		"rational mind. Orr was crazy and could be grounded. All he "
1692 		"had to do was ask; and as soon as he did, he would no longer "
1693 		"be crazy and would have to fly more missions. Orr would be "
1694 		"crazy to fly more missions and sane if he didn't, but if he "
1695 		"was sane he had to fly them. If he flew them he was crazy "
1696 		"and didn't have to; but if he didn't want to he was sane and "
1697 		"had to. Yossarian was moved very deeply by the absolute "
1698 		"simplicity of this clause of Catch-22 and let out a "
1699 		"respectful whistle. \"That's some catch, that Catch-22\", he "
1700 		"observed. \"It's the best there is,\" Doc Daneeka agreed.";
1701 
1702 const char catch_22_quote[] =
1703 		"What a lousy earth! He wondered how many people were "
1704 		"destitute that same night even in his own prosperous country, "
1705 		"how many homes were shanties, how many husbands were drunk "
1706 		"and wives socked, and how many children were bullied, abused, "
1707 		"or abandoned. How many families hungered for food they could "
1708 		"not afford to buy? How many hearts were broken? How many "
1709 		"suicides would take place that same night, how many people "
1710 		"would go insane? How many cockroaches and landlords would "
1711 		"triumph? How many winners were losers, successes failures, "
1712 		"and rich men poor men? How many wise guys were stupid? How "
1713 		"many happy endings were unhappy endings? How many honest men "
1714 		"were liars, brave men cowards, loyal men traitors, how many "
1715 		"sainted men were corrupt, how many people in positions of "
1716 		"trust had sold their souls to bodyguards, how many had never "
1717 		"had souls? How many straight-and-narrow paths were crooked "
1718 		"paths? How many best families were worst families and how "
1719 		"many good people were bad people? When you added them all up "
1720 		"and then subtracted, you might be left with only the children, "
1721 		"and perhaps with Albert Einstein and an old violinist or "
1722 		"sculptor somewhere.";
1723 
1724 #define QUOTE_480_BYTES		(480)
1725 #define QUOTE_512_BYTES		(512)
1726 #define QUOTE_768_BYTES		(768)
1727 #define QUOTE_1024_BYTES	(1024)
1728 
1729 
1730 
1731 /* ***** SHA1 Hash Tests ***** */
1732 
1733 #define HMAC_KEY_LENGTH_SHA1	(DIGEST_BYTE_LENGTH_SHA1)
1734 
1735 static uint8_t hmac_sha1_key[] = {
1736 	0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
1737 	0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
1738 	0xDE, 0xF4, 0xDE, 0xAD };
1739 
1740 /* ***** SHA224 Hash Tests ***** */
1741 
1742 #define HMAC_KEY_LENGTH_SHA224	(DIGEST_BYTE_LENGTH_SHA224)
1743 
1744 
1745 /* ***** AES-CBC Cipher Tests ***** */
1746 
1747 #define CIPHER_KEY_LENGTH_AES_CBC	(16)
1748 #define CIPHER_IV_LENGTH_AES_CBC	(CIPHER_KEY_LENGTH_AES_CBC)
1749 
1750 static uint8_t aes_cbc_key[] = {
1751 	0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
1752 	0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A };
1753 
1754 static uint8_t aes_cbc_iv[] = {
1755 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1756 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
1757 
1758 
1759 /* ***** AES-CBC / HMAC-SHA1 Hash Tests ***** */
1760 
1761 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_ciphertext[] = {
1762 	0x8B, 0x4D, 0xDA, 0x1B, 0xCF, 0x04, 0xA0, 0x31,
1763 	0xB4, 0xBF, 0xBD, 0x68, 0x43, 0x20, 0x7E, 0x76,
1764 	0xB1, 0x96, 0x8B, 0xA2, 0x7C, 0xA2, 0x83, 0x9E,
1765 	0x39, 0x5A, 0x2F, 0x7E, 0x92, 0xB4, 0x48, 0x1A,
1766 	0x3F, 0x6B, 0x5D, 0xDF, 0x52, 0x85, 0x5F, 0x8E,
1767 	0x42, 0x3C, 0xFB, 0xE9, 0x1A, 0x24, 0xD6, 0x08,
1768 	0xDD, 0xFD, 0x16, 0xFB, 0xE9, 0x55, 0xEF, 0xF0,
1769 	0xA0, 0x8D, 0x13, 0xAB, 0x81, 0xC6, 0x90, 0x01,
1770 	0xB5, 0x18, 0x84, 0xB3, 0xF6, 0xE6, 0x11, 0x57,
1771 	0xD6, 0x71, 0xC6, 0x3C, 0x3F, 0x2F, 0x33, 0xEE,
1772 	0x24, 0x42, 0x6E, 0xAC, 0x0B, 0xCA, 0xEC, 0xF9,
1773 	0x84, 0xF8, 0x22, 0xAA, 0x60, 0xF0, 0x32, 0xA9,
1774 	0x75, 0x75, 0x3B, 0xCB, 0x70, 0x21, 0x0A, 0x8D,
1775 	0x0F, 0xE0, 0xC4, 0x78, 0x2B, 0xF8, 0x97, 0xE3,
1776 	0xE4, 0x26, 0x4B, 0x29, 0xDA, 0x88, 0xCD, 0x46,
1777 	0xEC, 0xAA, 0xF9, 0x7F, 0xF1, 0x15, 0xEA, 0xC3,
1778 	0x87, 0xE6, 0x31, 0xF2, 0xCF, 0xDE, 0x4D, 0x80,
1779 	0x70, 0x91, 0x7E, 0x0C, 0xF7, 0x26, 0x3A, 0x92,
1780 	0x4F, 0x18, 0x83, 0xC0, 0x8F, 0x59, 0x01, 0xA5,
1781 	0x88, 0xD1, 0xDB, 0x26, 0x71, 0x27, 0x16, 0xF5,
1782 	0xEE, 0x10, 0x82, 0xAC, 0x68, 0x26, 0x9B, 0xE2,
1783 	0x6D, 0xD8, 0x9A, 0x80, 0xDF, 0x04, 0x31, 0xD5,
1784 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1785 	0x58, 0x34, 0x85, 0x61, 0x1C, 0x42, 0x10, 0x76,
1786 	0x73, 0x02, 0x42, 0xC9, 0x23, 0x18, 0x8E, 0xB4,
1787 	0x6F, 0xB4, 0xA3, 0x54, 0x6E, 0x88, 0x3B, 0x62,
1788 	0x7C, 0x02, 0x8D, 0x4C, 0x9F, 0xC8, 0x45, 0xF4,
1789 	0xC9, 0xDE, 0x4F, 0xEB, 0x22, 0x83, 0x1B, 0xE4,
1790 	0x49, 0x37, 0xE4, 0xAD, 0xE7, 0xCD, 0x21, 0x54,
1791 	0xBC, 0x1C, 0xC2, 0x04, 0x97, 0xB4, 0x10, 0x61,
1792 	0xF0, 0xE4, 0xEF, 0x27, 0x63, 0x3A, 0xDA, 0x91,
1793 	0x41, 0x25, 0x62, 0x1C, 0x5C, 0xB6, 0x38, 0x4A,
1794 	0x88, 0x71, 0x59, 0x5A, 0x8D, 0xA0, 0x09, 0xAF,
1795 	0x72, 0x94, 0xD7, 0x79, 0x5C, 0x60, 0x7C, 0x8F,
1796 	0x4C, 0xF5, 0xD9, 0xA1, 0x39, 0x6D, 0x81, 0x28,
1797 	0xEF, 0x13, 0x28, 0xDF, 0xF5, 0x3E, 0xF7, 0x8E,
1798 	0x09, 0x9C, 0x78, 0x18, 0x79, 0xB8, 0x68, 0xD7,
1799 	0xA8, 0x29, 0x62, 0xAD, 0xDE, 0xE1, 0x61, 0x76,
1800 	0x1B, 0x05, 0x16, 0xCD, 0xBF, 0x02, 0x8E, 0xA6,
1801 	0x43, 0x6E, 0x92, 0x55, 0x4F, 0x60, 0x9C, 0x03,
1802 	0xB8, 0x4F, 0xA3, 0x02, 0xAC, 0xA8, 0xA7, 0x0C,
1803 	0x1E, 0xB5, 0x6B, 0xF8, 0xC8, 0x4D, 0xDE, 0xD2,
1804 	0xB0, 0x29, 0x6E, 0x40, 0xE6, 0xD6, 0xC9, 0xE6,
1805 	0xB9, 0x0F, 0xB6, 0x63, 0xF5, 0xAA, 0x2B, 0x96,
1806 	0xA7, 0x16, 0xAC, 0x4E, 0x0A, 0x33, 0x1C, 0xA6,
1807 	0xE6, 0xBD, 0x8A, 0xCF, 0x40, 0xA9, 0xB2, 0xFA,
1808 	0x63, 0x27, 0xFD, 0x9B, 0xD9, 0xFC, 0xD5, 0x87,
1809 	0x8D, 0x4C, 0xB6, 0xA4, 0xCB, 0xE7, 0x74, 0x55,
1810 	0xF4, 0xFB, 0x41, 0x25, 0xB5, 0x4B, 0x0A, 0x1B,
1811 	0xB1, 0xD6, 0xB7, 0xD9, 0x47, 0x2A, 0xC3, 0x98,
1812 	0x6A, 0xC4, 0x03, 0x73, 0x1F, 0x93, 0x6E, 0x53,
1813 	0x19, 0x25, 0x64, 0x15, 0x83, 0xF9, 0x73, 0x2A,
1814 	0x74, 0xB4, 0x93, 0x69, 0xC4, 0x72, 0xFC, 0x26,
1815 	0xA2, 0x9F, 0x43, 0x45, 0xDD, 0xB9, 0xEF, 0x36,
1816 	0xC8, 0x3A, 0xCD, 0x99, 0x9B, 0x54, 0x1A, 0x36,
1817 	0xC1, 0x59, 0xF8, 0x98, 0xA8, 0xCC, 0x28, 0x0D,
1818 	0x73, 0x4C, 0xEE, 0x98, 0xCB, 0x7C, 0x58, 0x7E,
1819 	0x20, 0x75, 0x1E, 0xB7, 0xC9, 0xF8, 0xF2, 0x0E,
1820 	0x63, 0x9E, 0x05, 0x78, 0x1A, 0xB6, 0xA8, 0x7A,
1821 	0xF9, 0x98, 0x6A, 0xA6, 0x46, 0x84, 0x2E, 0xF6,
1822 	0x4B, 0xDC, 0x9B, 0x8F, 0x9B, 0x8F, 0xEE, 0xB4,
1823 	0xAA, 0x3F, 0xEE, 0xC0, 0x37, 0x27, 0x76, 0xC7,
1824 	0x95, 0xBB, 0x26, 0x74, 0x69, 0x12, 0x7F, 0xF1,
1825 	0xBB, 0xFF, 0xAE, 0xB5, 0x99, 0x6E, 0xCB, 0x0C
1826 };
1827 
1828 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest[] = {
1829 	0x9a, 0x4f, 0x88, 0x1b, 0xb6, 0x8f, 0xd8, 0x60,
1830 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
1831 	0x18, 0x8c, 0x1d, 0x32
1832 };
1833 
1834 
1835 /* Multisession Vector context Test */
1836 /*Begin Session 0 */
1837 static uint8_t ms_aes_cbc_key0[] = {
1838 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1839 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1840 };
1841 
1842 static uint8_t ms_aes_cbc_iv0[] = {
1843 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1844 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1845 };
1846 
1847 static const uint8_t ms_aes_cbc_cipher0[] = {
1848 		0x3C, 0xE4, 0xEE, 0x42, 0xB6, 0x9B, 0xC3, 0x38,
1849 		0x5F, 0xAD, 0x54, 0xDC, 0xA8, 0x32, 0x81, 0xDC,
1850 		0x7A, 0x6F, 0x85, 0x58, 0x07, 0x35, 0xED, 0xEB,
1851 		0xAD, 0x79, 0x79, 0x96, 0xD3, 0x0E, 0xA6, 0xD9,
1852 		0xAA, 0x86, 0xA4, 0x8F, 0xB5, 0xD6, 0x6E, 0x6D,
1853 		0x0C, 0x91, 0x2F, 0xC4, 0x67, 0x98, 0x0E, 0xC4,
1854 		0x8D, 0x83, 0x68, 0x69, 0xC4, 0xD3, 0x94, 0x34,
1855 		0xC4, 0x5D, 0x60, 0x55, 0x22, 0x87, 0x8F, 0x6F,
1856 		0x17, 0x8E, 0x75, 0xE4, 0x02, 0xF5, 0x1B, 0x99,
1857 		0xC8, 0x39, 0xA9, 0xAB, 0x23, 0x91, 0x12, 0xED,
1858 		0x08, 0xE7, 0xD9, 0x25, 0x89, 0x24, 0x4F, 0x8D,
1859 		0x68, 0xF3, 0x10, 0x39, 0x0A, 0xEE, 0x45, 0x24,
1860 		0xDF, 0x7A, 0x9D, 0x00, 0x25, 0xE5, 0x35, 0x71,
1861 		0x4E, 0x40, 0x59, 0x6F, 0x0A, 0x13, 0xB3, 0x72,
1862 		0x1D, 0x98, 0x63, 0x94, 0x89, 0xA5, 0x39, 0x8E,
1863 		0xD3, 0x9C, 0x8A, 0x7F, 0x71, 0x2F, 0xC7, 0xCD,
1864 		0x81, 0x05, 0xDC, 0xC0, 0x8D, 0xCE, 0x6D, 0x18,
1865 		0x30, 0xC4, 0x72, 0x51, 0xF0, 0x27, 0xC8, 0xF6,
1866 		0x60, 0x5B, 0x7C, 0xB2, 0xE3, 0x49, 0x0C, 0x29,
1867 		0xC6, 0x9F, 0x39, 0x57, 0x80, 0x55, 0x24, 0x2C,
1868 		0x9B, 0x0F, 0x5A, 0xB3, 0x89, 0x55, 0x31, 0x96,
1869 		0x0D, 0xCD, 0xF6, 0x51, 0x03, 0x2D, 0x89, 0x26,
1870 		0x74, 0x44, 0xD6, 0xE8, 0xDC, 0xEA, 0x44, 0x55,
1871 		0x64, 0x71, 0x9C, 0x9F, 0x5D, 0xBA, 0x39, 0x46,
1872 		0xA8, 0x17, 0xA1, 0x9C, 0x52, 0x9D, 0xBC, 0x6B,
1873 		0x4A, 0x98, 0xE6, 0xEA, 0x33, 0xEC, 0x58, 0xB4,
1874 		0x43, 0xF0, 0x32, 0x45, 0xA4, 0xC1, 0x55, 0xB7,
1875 		0x5D, 0xB5, 0x59, 0xB2, 0xE3, 0x96, 0xFF, 0xA5,
1876 		0xAF, 0xE1, 0x86, 0x1B, 0x42, 0xE6, 0x3B, 0xA0,
1877 		0x90, 0x4A, 0xE8, 0x8C, 0x21, 0x7F, 0x36, 0x1E,
1878 		0x5B, 0x65, 0x25, 0xD1, 0xC1, 0x5A, 0xCA, 0x3D,
1879 		0x10, 0xED, 0x2D, 0x79, 0xD0, 0x0F, 0x58, 0x44,
1880 		0x69, 0x81, 0xF5, 0xD4, 0xC9, 0x0F, 0x90, 0x76,
1881 		0x1F, 0x54, 0xD2, 0xD5, 0x97, 0xCE, 0x2C, 0xE3,
1882 		0xEF, 0xF4, 0xB7, 0xC6, 0x3A, 0x87, 0x7F, 0x83,
1883 		0x2A, 0xAF, 0xCD, 0x90, 0x12, 0xA7, 0x7D, 0x85,
1884 		0x1D, 0x62, 0xD3, 0x85, 0x25, 0x05, 0xDB, 0x45,
1885 		0x92, 0xA3, 0xF6, 0xA2, 0xA8, 0x41, 0xE4, 0x25,
1886 		0x86, 0x87, 0x67, 0x24, 0xEC, 0x89, 0x23, 0x2A,
1887 		0x9B, 0x20, 0x4D, 0x93, 0xEE, 0xE2, 0x2E, 0xC1,
1888 		0x0B, 0x15, 0x33, 0xCF, 0x00, 0xD1, 0x1A, 0xDA,
1889 		0x93, 0xFD, 0x28, 0x21, 0x5B, 0xCF, 0xD1, 0xF3,
1890 		0x5A, 0x81, 0xBA, 0x82, 0x5E, 0x2F, 0x61, 0xB4,
1891 		0x05, 0x71, 0xB5, 0xF4, 0x39, 0x3C, 0x1F, 0x60,
1892 		0x00, 0x7A, 0xC4, 0xF8, 0x35, 0x20, 0x6C, 0x3A,
1893 		0xCC, 0x03, 0x8F, 0x7B, 0xA2, 0xB6, 0x65, 0x8A,
1894 		0xB6, 0x5F, 0xFD, 0x25, 0xD3, 0x5F, 0x92, 0xF9,
1895 		0xAE, 0x17, 0x9B, 0x5E, 0x6E, 0x9A, 0xE4, 0x55,
1896 		0x10, 0x25, 0x07, 0xA4, 0xAF, 0x21, 0x69, 0x13,
1897 		0xD8, 0xFA, 0x31, 0xED, 0xF7, 0xA7, 0xA7, 0x3B,
1898 		0xB8, 0x96, 0x8E, 0x10, 0x86, 0x74, 0xD8, 0xB1,
1899 		0x34, 0x9E, 0x9B, 0x6A, 0x26, 0xA8, 0xD4, 0xD0,
1900 		0xB5, 0xF6, 0xDE, 0xE7, 0xCA, 0x06, 0xDC, 0xA3,
1901 		0x6F, 0xEE, 0x6B, 0x1E, 0xB5, 0x30, 0x99, 0x23,
1902 		0xF9, 0x76, 0xF0, 0xA0, 0xCF, 0x3B, 0x94, 0x7B,
1903 		0x19, 0x8D, 0xA5, 0x0C, 0x18, 0xA6, 0x1D, 0x07,
1904 		0x89, 0xBE, 0x5B, 0x61, 0xE5, 0xF1, 0x42, 0xDB,
1905 		0xD4, 0x2E, 0x02, 0x1F, 0xCE, 0xEF, 0x92, 0xB1,
1906 		0x1B, 0x56, 0x50, 0xF2, 0x16, 0xE5, 0xE7, 0x4F,
1907 		0xFD, 0xBB, 0x3E, 0xD2, 0xFC, 0x3C, 0xC6, 0x0F,
1908 		0xF9, 0x12, 0x4E, 0xCB, 0x1E, 0x0C, 0x15, 0x84,
1909 		0x2A, 0x14, 0x8A, 0x02, 0xE4, 0x7E, 0x95, 0x5B,
1910 		0x86, 0xDB, 0x9B, 0x62, 0x5B, 0x19, 0xD2, 0x17,
1911 		0xFA, 0x13, 0xBB, 0x6B, 0x3F, 0x45, 0x9F, 0xBF
1912 };
1913 
1914 
1915 static  uint8_t ms_hmac_key0[] = {
1916 		0xFF, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
1917 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
1918 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
1919 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
1920 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
1921 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
1922 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
1923 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
1924 };
1925 
1926 static const uint8_t ms_hmac_digest0[] = {
1927 		0x43, 0x52, 0xED, 0x34, 0xAB, 0x36, 0xB2, 0x51,
1928 		0xFB, 0xA3, 0xA6, 0x7C, 0x38, 0xFC, 0x42, 0x8F,
1929 		0x57, 0x64, 0xAB, 0x81, 0xA7, 0x89, 0xB7, 0x6C,
1930 		0xA0, 0xDC, 0xB9, 0x4D, 0xC4, 0x30, 0xF9, 0xD4,
1931 		0x10, 0x82, 0x55, 0xD0, 0xAB, 0x32, 0xFB, 0x56,
1932 		0x0D, 0xE4, 0x68, 0x3D, 0x76, 0xD0, 0x7B, 0xE4,
1933 		0xA6, 0x2C, 0x34, 0x9E, 0x8C, 0x41, 0xF8, 0x23,
1934 		0x28, 0x1B, 0x3A, 0x90, 0x26, 0x34, 0x47, 0x90
1935 		};
1936 
1937 /* End Session 0 */
1938 /* Begin session 1 */
1939 
1940 static  uint8_t ms_aes_cbc_key1[] = {
1941 		0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1942 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1943 };
1944 
1945 static  uint8_t ms_aes_cbc_iv1[] = {
1946 	0xf1, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1947 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1948 };
1949 
1950 static const uint8_t ms_aes_cbc_cipher1[] = {
1951 		0x5A, 0x7A, 0x67, 0x5D, 0xB8, 0xE1, 0xDC, 0x71,
1952 		0x39, 0xA8, 0x74, 0x93, 0x9C, 0x4C, 0xFE, 0x23,
1953 		0x61, 0xCD, 0xA4, 0xB3, 0xD9, 0xCE, 0x99, 0x09,
1954 		0x2A, 0x23, 0xF3, 0x29, 0xBF, 0x4C, 0xB4, 0x6A,
1955 		0x1B, 0x6B, 0x73, 0x4D, 0x48, 0x0C, 0xCF, 0x6C,
1956 		0x5E, 0x34, 0x9E, 0x7F, 0xBC, 0x8F, 0xCC, 0x8F,
1957 		0x75, 0x1D, 0x3D, 0x77, 0x10, 0x76, 0xC8, 0xB9,
1958 		0x99, 0x6F, 0xD6, 0x56, 0x75, 0xA9, 0xB2, 0x66,
1959 		0xC2, 0x24, 0x2B, 0x9C, 0xFE, 0x40, 0x8E, 0x43,
1960 		0x20, 0x97, 0x1B, 0xFA, 0xD0, 0xCF, 0x04, 0xAB,
1961 		0xBB, 0xF6, 0x5D, 0xF5, 0xA0, 0x19, 0x7C, 0x23,
1962 		0x5D, 0x80, 0x8C, 0x49, 0xF6, 0x76, 0x88, 0x29,
1963 		0x27, 0x4C, 0x59, 0x2B, 0x43, 0xA6, 0xB2, 0x26,
1964 		0x27, 0x78, 0xBE, 0x1B, 0xE1, 0x4F, 0x5A, 0x1F,
1965 		0xFC, 0x68, 0x08, 0xE7, 0xC4, 0xD1, 0x34, 0x68,
1966 		0xB7, 0x13, 0x14, 0x41, 0x62, 0x6B, 0x1F, 0x77,
1967 		0x0C, 0x68, 0x1D, 0x0D, 0xED, 0x89, 0xAA, 0xD8,
1968 		0x97, 0x02, 0xBA, 0x5E, 0xD4, 0x84, 0x25, 0x97,
1969 		0x03, 0xA5, 0xA6, 0x13, 0x66, 0x02, 0xF4, 0xC3,
1970 		0xF3, 0xD3, 0xCC, 0x95, 0xC3, 0x87, 0x46, 0x90,
1971 		0x1F, 0x6E, 0x14, 0xA8, 0x00, 0xF2, 0x6F, 0xD5,
1972 		0xA1, 0xAD, 0xD5, 0x40, 0xA2, 0x0F, 0x32, 0x7E,
1973 		0x99, 0xA3, 0xF5, 0x53, 0xC3, 0x26, 0xA1, 0x45,
1974 		0x01, 0x88, 0x57, 0x84, 0x3E, 0x7B, 0x4E, 0x0B,
1975 		0x3C, 0xB5, 0x3E, 0x9E, 0xE9, 0x78, 0x77, 0xC5,
1976 		0xC0, 0x89, 0xA8, 0xF8, 0xF1, 0xA5, 0x2D, 0x5D,
1977 		0xF9, 0xC6, 0xFB, 0xCB, 0x05, 0x23, 0xBD, 0x6E,
1978 		0x5E, 0x14, 0xC6, 0x57, 0x73, 0xCF, 0x98, 0xBD,
1979 		0x10, 0x8B, 0x18, 0xA6, 0x01, 0x5B, 0x13, 0xAE,
1980 		0x8E, 0xDE, 0x1F, 0xB5, 0xB7, 0x40, 0x6C, 0xC1,
1981 		0x1E, 0xA1, 0x19, 0x20, 0x9E, 0x95, 0xE0, 0x2F,
1982 		0x1C, 0xF5, 0xD9, 0xD0, 0x2B, 0x1E, 0x82, 0x25,
1983 		0x62, 0xB4, 0xEB, 0xA1, 0x1F, 0xCE, 0x44, 0xA1,
1984 		0xCB, 0x92, 0x01, 0x6B, 0xE4, 0x26, 0x23, 0xE3,
1985 		0xC5, 0x67, 0x35, 0x55, 0xDA, 0xE5, 0x27, 0xEE,
1986 		0x8D, 0x12, 0x84, 0xB7, 0xBA, 0xA7, 0x1C, 0xD6,
1987 		0x32, 0x3F, 0x67, 0xED, 0xFB, 0x5B, 0x8B, 0x52,
1988 		0x46, 0x8C, 0xF9, 0x69, 0xCD, 0xAE, 0x79, 0xAA,
1989 		0x37, 0x78, 0x49, 0xEB, 0xC6, 0x8E, 0x76, 0x63,
1990 		0x84, 0xFF, 0x9D, 0x22, 0x99, 0x51, 0xB7, 0x5E,
1991 		0x83, 0x4C, 0x8B, 0xDF, 0x5A, 0x07, 0xCC, 0xBA,
1992 		0x42, 0xA5, 0x98, 0xB6, 0x47, 0x0E, 0x66, 0xEB,
1993 		0x23, 0x0E, 0xBA, 0x44, 0xA8, 0xAA, 0x20, 0x71,
1994 		0x79, 0x9C, 0x77, 0x5F, 0xF5, 0xFE, 0xEC, 0xEF,
1995 		0xC6, 0x64, 0x3D, 0x84, 0xD0, 0x2B, 0xA7, 0x0A,
1996 		0xC3, 0x72, 0x5B, 0x9C, 0xFA, 0xA8, 0x87, 0x95,
1997 		0x94, 0x11, 0x38, 0xA7, 0x1E, 0x58, 0xE3, 0x73,
1998 		0xC6, 0xC9, 0xD1, 0x7B, 0x92, 0xDB, 0x0F, 0x49,
1999 		0x74, 0xC2, 0xA2, 0x0E, 0x35, 0x57, 0xAC, 0xDB,
2000 		0x9A, 0x1C, 0xCF, 0x5A, 0x32, 0x3E, 0x26, 0x9B,
2001 		0xEC, 0xB3, 0xEF, 0x9C, 0xFE, 0xBE, 0x52, 0xAC,
2002 		0xB1, 0x29, 0xDD, 0xFD, 0x07, 0xE2, 0xEE, 0xED,
2003 		0xE4, 0x46, 0x37, 0xFE, 0xD1, 0xDC, 0xCD, 0x02,
2004 		0xF9, 0x31, 0xB0, 0xFB, 0x36, 0xB7, 0x34, 0xA4,
2005 		0x76, 0xE8, 0x57, 0xBF, 0x99, 0x92, 0xC7, 0xAF,
2006 		0x98, 0x10, 0xE2, 0x70, 0xCA, 0xC9, 0x2B, 0x82,
2007 		0x06, 0x96, 0x88, 0x0D, 0xB3, 0xAC, 0x9E, 0x6D,
2008 		0x43, 0xBC, 0x5B, 0x31, 0xCF, 0x65, 0x8D, 0xA6,
2009 		0xC7, 0xFE, 0x73, 0xE1, 0x54, 0xF7, 0x10, 0xF9,
2010 		0x86, 0xF7, 0xDF, 0xA1, 0xA1, 0xD8, 0xAE, 0x35,
2011 		0xB3, 0x90, 0xDC, 0x6F, 0x43, 0x7A, 0x8B, 0xE0,
2012 		0xFE, 0x8F, 0x33, 0x4D, 0x29, 0x6C, 0x45, 0x53,
2013 		0x73, 0xDD, 0x21, 0x0B, 0x85, 0x30, 0xB5, 0xA5,
2014 		0xF3, 0x5D, 0xEC, 0x79, 0x61, 0x9D, 0x9E, 0xB3
2015 
2016 };
2017 
2018 static uint8_t ms_hmac_key1[] = {
2019 		0xFE, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2020 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2021 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2022 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2023 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2024 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2025 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2026 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2027 };
2028 
2029 static const uint8_t ms_hmac_digest1[] = {
2030 		0xCE, 0x6E, 0x5F, 0x77, 0x96, 0x9A, 0xB1, 0x69,
2031 		0x2D, 0x5E, 0xF3, 0x2F, 0x32, 0x10, 0xCB, 0x50,
2032 		0x0E, 0x09, 0x56, 0x25, 0x07, 0x34, 0xC9, 0x20,
2033 		0xEC, 0x13, 0x43, 0x23, 0x5C, 0x08, 0x8B, 0xCD,
2034 		0xDC, 0x86, 0x8C, 0xEE, 0x0A, 0x95, 0x2E, 0xB9,
2035 		0x8C, 0x7B, 0x02, 0x7A, 0xD4, 0xE1, 0x49, 0xB4,
2036 		0x45, 0xB5, 0x52, 0x37, 0xC6, 0xFF, 0xFE, 0xAA,
2037 		0x0A, 0x87, 0xB8, 0x51, 0xF9, 0x2A, 0x01, 0x8F
2038 };
2039 /* End Session 1  */
2040 /* Begin Session 2 */
2041 static  uint8_t ms_aes_cbc_key2[] = {
2042 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2043 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2044 };
2045 
2046 static  uint8_t ms_aes_cbc_iv2[] = {
2047 		0xff, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2048 		0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2049 };
2050 
2051 static const uint8_t ms_aes_cbc_cipher2[] = {
2052 		0xBB, 0x3C, 0x68, 0x25, 0xFD, 0xB6, 0xA2, 0x91,
2053 		0x20, 0x56, 0xF6, 0x30, 0x35, 0xFC, 0x9E, 0x97,
2054 		0xF2, 0x90, 0xFC, 0x7E, 0x3E, 0x0A, 0x75, 0xC8,
2055 		0x4C, 0xF2, 0x2D, 0xAC, 0xD3, 0x93, 0xF0, 0xC5,
2056 		0x14, 0x88, 0x8A, 0x23, 0xC2, 0x59, 0x9A, 0x98,
2057 		0x4B, 0xD5, 0x2C, 0xDA, 0x43, 0xA9, 0x34, 0x69,
2058 		0x7C, 0x6D, 0xDB, 0xDC, 0xCB, 0xC0, 0xA0, 0x09,
2059 		0xA7, 0x86, 0x16, 0x4B, 0xBF, 0xA8, 0xB6, 0xCF,
2060 		0x7F, 0x74, 0x1F, 0x22, 0xF0, 0xF6, 0xBB, 0x44,
2061 		0x8B, 0x4C, 0x9E, 0x23, 0xF8, 0x9F, 0xFC, 0x5B,
2062 		0x9E, 0x9C, 0x2A, 0x79, 0x30, 0x8F, 0xBF, 0xA9,
2063 		0x68, 0xA1, 0x20, 0x71, 0x7C, 0x77, 0x22, 0x34,
2064 		0x07, 0xCD, 0xC6, 0xF6, 0x50, 0x0A, 0x08, 0x99,
2065 		0x17, 0x98, 0xE3, 0x93, 0x8A, 0xB0, 0xEE, 0xDF,
2066 		0xC2, 0xBA, 0x3B, 0x44, 0x73, 0xDF, 0xDD, 0xDC,
2067 		0x14, 0x4D, 0x3B, 0xBB, 0x5E, 0x58, 0xC1, 0x26,
2068 		0xA7, 0xAE, 0x47, 0xF3, 0x24, 0x6D, 0x4F, 0xD3,
2069 		0x6E, 0x3E, 0x33, 0xE6, 0x7F, 0xCA, 0x50, 0xAF,
2070 		0x5D, 0x3D, 0xA0, 0xDD, 0xC9, 0xF3, 0x30, 0xD3,
2071 		0x6E, 0x8B, 0x2E, 0x12, 0x24, 0x34, 0xF0, 0xD3,
2072 		0xC7, 0x8D, 0x23, 0x29, 0xAA, 0x05, 0xE1, 0xFA,
2073 		0x2E, 0xF6, 0x8D, 0x37, 0x86, 0xC0, 0x6D, 0x13,
2074 		0x2D, 0x98, 0xF3, 0x52, 0x39, 0x22, 0xCE, 0x38,
2075 		0xC2, 0x1A, 0x72, 0xED, 0xFB, 0xCC, 0xE4, 0x71,
2076 		0x5A, 0x0C, 0x0D, 0x09, 0xF8, 0xE8, 0x1B, 0xBC,
2077 		0x53, 0xC8, 0xD8, 0x8F, 0xE5, 0x98, 0x5A, 0xB1,
2078 		0x06, 0xA6, 0x5B, 0xE6, 0xA2, 0x88, 0x21, 0x9E,
2079 		0x36, 0xC0, 0x34, 0xF9, 0xFB, 0x3B, 0x0A, 0x22,
2080 		0x00, 0x00, 0x39, 0x48, 0x8D, 0x23, 0x74, 0x62,
2081 		0x72, 0x91, 0xE6, 0x36, 0xAA, 0x77, 0x9C, 0x72,
2082 		0x9D, 0xA8, 0xC3, 0xA9, 0xD5, 0x44, 0x72, 0xA6,
2083 		0xB9, 0x28, 0x8F, 0x64, 0x4C, 0x8A, 0x64, 0xE6,
2084 		0x4E, 0xFA, 0xEF, 0x87, 0xDE, 0x7B, 0x22, 0x44,
2085 		0xB0, 0xDF, 0x2E, 0x5F, 0x0B, 0xA5, 0xF2, 0x24,
2086 		0x07, 0x5C, 0x2D, 0x39, 0xB7, 0x3D, 0x8A, 0xE5,
2087 		0x0E, 0x9D, 0x4E, 0x50, 0xED, 0x03, 0x99, 0x8E,
2088 		0xF0, 0x06, 0x55, 0x4E, 0xA2, 0x24, 0xE7, 0x17,
2089 		0x46, 0xDF, 0x6C, 0xCD, 0xC6, 0x44, 0xE8, 0xF9,
2090 		0xB9, 0x1B, 0x36, 0xF6, 0x7F, 0x10, 0xA4, 0x7D,
2091 		0x90, 0xBD, 0xE4, 0xAA, 0xD6, 0x9E, 0x18, 0x9D,
2092 		0x22, 0x35, 0xD6, 0x55, 0x54, 0xAA, 0xF7, 0x22,
2093 		0xA3, 0x3E, 0xEF, 0xC8, 0xA2, 0x34, 0x8D, 0xA9,
2094 		0x37, 0x63, 0xA6, 0xC3, 0x57, 0xCB, 0x0C, 0x49,
2095 		0x7D, 0x02, 0xBE, 0xAA, 0x13, 0x75, 0xB7, 0x4E,
2096 		0x52, 0x62, 0xA5, 0xC2, 0x33, 0xC7, 0x6C, 0x1B,
2097 		0xF6, 0x34, 0xF6, 0x09, 0xA5, 0x0C, 0xC7, 0xA2,
2098 		0x61, 0x48, 0x62, 0x7D, 0x17, 0x15, 0xE3, 0x95,
2099 		0xC8, 0x63, 0xD2, 0xA4, 0x43, 0xA9, 0x49, 0x07,
2100 		0xB2, 0x3B, 0x2B, 0x62, 0x7D, 0xCB, 0x51, 0xB3,
2101 		0x25, 0x33, 0x47, 0x0E, 0x14, 0x67, 0xDC, 0x6A,
2102 		0x9B, 0x51, 0xAC, 0x9D, 0x8F, 0xA2, 0x2B, 0x57,
2103 		0x8C, 0x5C, 0x5F, 0x76, 0x23, 0x92, 0x0F, 0x84,
2104 		0x46, 0x0E, 0x40, 0x85, 0x38, 0x60, 0xFA, 0x61,
2105 		0x20, 0xC5, 0xE3, 0xF1, 0x70, 0xAC, 0x1B, 0xBF,
2106 		0xC4, 0x2B, 0xC5, 0x67, 0xD1, 0x43, 0xC5, 0x17,
2107 		0x74, 0x71, 0x69, 0x6F, 0x82, 0x89, 0x19, 0x8A,
2108 		0x70, 0x43, 0x92, 0x01, 0xC4, 0x63, 0x7E, 0xB1,
2109 		0x59, 0x4E, 0xCD, 0xEA, 0x93, 0xA4, 0x52, 0x53,
2110 		0x9B, 0x61, 0x5B, 0xD2, 0x3E, 0x19, 0x39, 0xB7,
2111 		0x32, 0xEA, 0x8E, 0xF8, 0x1D, 0x76, 0x5C, 0xB2,
2112 		0x73, 0x2D, 0x91, 0xC0, 0x18, 0xED, 0x25, 0x2A,
2113 		0x53, 0x64, 0xF0, 0x92, 0x31, 0x55, 0x21, 0xA8,
2114 		0x24, 0xA9, 0xD1, 0x02, 0xF6, 0x6C, 0x2B, 0x70,
2115 		0xA9, 0x59, 0xC1, 0xD6, 0xC3, 0x57, 0x5B, 0x92
2116 };
2117 
2118 static  uint8_t ms_hmac_key2[] = {
2119 		0xFC, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
2120 		0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2121 		0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2122 		0x9A, 0xAF, 0x88, 0x1B, 0xB6, 0x8F, 0xF8, 0x60,
2123 		0xA2, 0x5A, 0x7F, 0x3F, 0xF4, 0x72, 0x70, 0xF1,
2124 		0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2125 		0x47, 0x3A, 0x75, 0x61, 0x5C, 0xA2, 0x10, 0x76,
2126 		0x9A, 0xAF, 0x77, 0x5B, 0xB6, 0x7F, 0xF7, 0x60
2127 };
2128 
2129 static const uint8_t ms_hmac_digest2[] = {
2130 		0xA5, 0x0F, 0x9C, 0xFB, 0x08, 0x62, 0x59, 0xFF,
2131 		0x80, 0x2F, 0xEB, 0x4B, 0xE1, 0x46, 0x21, 0xD6,
2132 		0x02, 0x98, 0xF2, 0x8E, 0xF4, 0xEC, 0xD4, 0x77,
2133 		0x86, 0x4C, 0x31, 0x28, 0xC8, 0x25, 0x80, 0x27,
2134 		0x3A, 0x72, 0x5D, 0x6A, 0x56, 0x8A, 0xD3, 0x82,
2135 		0xB0, 0xEC, 0x31, 0x6D, 0x8B, 0x6B, 0xB4, 0x24,
2136 		0xE7, 0x62, 0xC1, 0x52, 0xBC, 0x14, 0x1B, 0x8E,
2137 		0xEC, 0x9A, 0xF1, 0x47, 0x80, 0xD2, 0xB0, 0x59
2138 };
2139 
2140 /* End Session 2 */
2141 
2142 
2143 static int
2144 test_AES_CBC_HMAC_SHA1_encrypt_digest(void)
2145 {
2146 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2147 	struct crypto_unittest_params *ut_params = &unittest_params;
2148 	int status;
2149 
2150 	/* Verify the capabilities */
2151 	struct rte_cryptodev_sym_capability_idx cap_idx;
2152 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2153 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
2154 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2155 			&cap_idx) == NULL)
2156 		return TEST_SKIPPED;
2157 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2158 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
2159 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
2160 			&cap_idx) == NULL)
2161 		return TEST_SKIPPED;
2162 
2163 	/* Generate test mbuf data and space for digest */
2164 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2165 			catch_22_quote,	QUOTE_512_BYTES, 0);
2166 
2167 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2168 			DIGEST_BYTE_LENGTH_SHA1);
2169 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2170 
2171 	/* Setup Cipher Parameters */
2172 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2173 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2174 
2175 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2176 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
2177 	ut_params->cipher_xform.cipher.key.data = aes_cbc_key;
2178 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2179 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2180 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2181 
2182 	/* Setup HMAC Parameters */
2183 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2184 
2185 	ut_params->auth_xform.next = NULL;
2186 
2187 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
2188 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
2189 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA1;
2190 	ut_params->auth_xform.auth.key.data = hmac_sha1_key;
2191 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA1;
2192 
2193 	ut_params->sess = rte_cryptodev_sym_session_create(
2194 			ts_params->session_mpool);
2195 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2196 
2197 	/* Create crypto session*/
2198 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
2199 			ut_params->sess, &ut_params->cipher_xform,
2200 			ts_params->session_priv_mpool);
2201 
2202 	if (status == -ENOTSUP)
2203 		return TEST_SKIPPED;
2204 
2205 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
2206 
2207 	/* Generate crypto op data structure */
2208 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2209 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2210 	TEST_ASSERT_NOT_NULL(ut_params->op,
2211 			"Failed to allocate symmetric crypto operation struct");
2212 
2213 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2214 
2215 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2216 
2217 	/* set crypto operation source mbuf */
2218 	sym_op->m_src = ut_params->ibuf;
2219 
2220 	/* Set crypto operation authentication parameters */
2221 	sym_op->auth.digest.data = ut_params->digest;
2222 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2223 			ut_params->ibuf, QUOTE_512_BYTES);
2224 
2225 	sym_op->auth.data.offset = 0;
2226 	sym_op->auth.data.length = QUOTE_512_BYTES;
2227 
2228 	/* Copy IV at the end of the crypto operation */
2229 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2230 			aes_cbc_iv, CIPHER_IV_LENGTH_AES_CBC);
2231 
2232 	/* Set crypto operation cipher parameters */
2233 	sym_op->cipher.data.offset = 0;
2234 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2235 
2236 	/* Process crypto operation */
2237 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2238 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2239 			ut_params->op);
2240 	else
2241 		TEST_ASSERT_NOT_NULL(
2242 			process_crypto_request(ts_params->valid_devs[0],
2243 				ut_params->op),
2244 				"failed to process sym crypto op");
2245 
2246 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2247 			"crypto op processing failed");
2248 
2249 	/* Validate obuf */
2250 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
2251 			uint8_t *);
2252 
2253 	TEST_ASSERT_BUFFERS_ARE_EQUAL(ciphertext,
2254 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
2255 			QUOTE_512_BYTES,
2256 			"ciphertext data not as expected");
2257 
2258 	uint8_t *digest = ciphertext + QUOTE_512_BYTES;
2259 
2260 	TEST_ASSERT_BUFFERS_ARE_EQUAL(digest,
2261 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA1_digest,
2262 			gbl_driver_id == rte_cryptodev_driver_id_get(
2263 					RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) ?
2264 					TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 :
2265 					DIGEST_BYTE_LENGTH_SHA1,
2266 			"Generated digest data not as expected");
2267 
2268 	return TEST_SUCCESS;
2269 }
2270 
2271 /* ***** AES-CBC / HMAC-SHA512 Hash Tests ***** */
2272 
2273 #define HMAC_KEY_LENGTH_SHA512  (DIGEST_BYTE_LENGTH_SHA512)
2274 
2275 static uint8_t hmac_sha512_key[] = {
2276 	0x42, 0x1a, 0x7d, 0x3d, 0xf5, 0x82, 0x80, 0xf1,
2277 	0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA,
2278 	0x58, 0x34, 0x85, 0x65, 0x1C, 0x42, 0x50, 0x76,
2279 	0x9a, 0xaf, 0x88, 0x1b, 0xb6, 0x8f, 0xf8, 0x60,
2280 	0xa2, 0x5a, 0x7f, 0x3f, 0xf4, 0x72, 0x70, 0xf1,
2281 	0xF5, 0x35, 0x4C, 0x3B, 0xDD, 0x90, 0x65, 0xB0,
2282 	0x47, 0x3a, 0x75, 0x61, 0x5C, 0xa2, 0x10, 0x76,
2283 	0x9a, 0xaf, 0x77, 0x5b, 0xb6, 0x7f, 0xf7, 0x60 };
2284 
2285 static const uint8_t catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest[] = {
2286 	0x5D, 0x54, 0x66, 0xC1, 0x6E, 0xBC, 0x04, 0xB8,
2287 	0x46, 0xB8, 0x08, 0x6E, 0xE0, 0xF0, 0x43, 0x48,
2288 	0x37, 0x96, 0x9C, 0xC6, 0x9C, 0xC2, 0x1E, 0xE8,
2289 	0xF2, 0x0C, 0x0B, 0xEF, 0x86, 0xA2, 0xE3, 0x70,
2290 	0x95, 0xC8, 0xB3, 0x06, 0x47, 0xA9, 0x90, 0xE8,
2291 	0xA0, 0xC6, 0x72, 0x69, 0x05, 0xC0, 0x0D, 0x0E,
2292 	0x21, 0x96, 0x65, 0x93, 0x74, 0x43, 0x2A, 0x1D,
2293 	0x2E, 0xBF, 0xC2, 0xC2, 0xEE, 0xCC, 0x2F, 0x0A };
2294 
2295 
2296 
2297 static int
2298 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2299 		struct crypto_unittest_params *ut_params,
2300 		uint8_t *cipher_key,
2301 		uint8_t *hmac_key);
2302 
2303 static int
2304 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2305 		struct crypto_unittest_params *ut_params,
2306 		struct crypto_testsuite_params *ts_params,
2307 		const uint8_t *cipher,
2308 		const uint8_t *digest,
2309 		const uint8_t *iv);
2310 
2311 
2312 static int
2313 test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
2314 		struct crypto_unittest_params *ut_params,
2315 		uint8_t *cipher_key,
2316 		uint8_t *hmac_key)
2317 {
2318 
2319 	/* Setup Cipher Parameters */
2320 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2321 	ut_params->cipher_xform.next = NULL;
2322 
2323 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
2324 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
2325 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2326 	ut_params->cipher_xform.cipher.key.length = CIPHER_KEY_LENGTH_AES_CBC;
2327 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2328 	ut_params->cipher_xform.cipher.iv.length = CIPHER_IV_LENGTH_AES_CBC;
2329 
2330 	/* Setup HMAC Parameters */
2331 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2332 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2333 
2334 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
2335 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA512_HMAC;
2336 	ut_params->auth_xform.auth.key.data = hmac_key;
2337 	ut_params->auth_xform.auth.key.length = HMAC_KEY_LENGTH_SHA512;
2338 	ut_params->auth_xform.auth.digest_length = DIGEST_BYTE_LENGTH_SHA512;
2339 
2340 	return TEST_SUCCESS;
2341 }
2342 
2343 
2344 static int
2345 test_AES_CBC_HMAC_SHA512_decrypt_perform(struct rte_cryptodev_sym_session *sess,
2346 		struct crypto_unittest_params *ut_params,
2347 		struct crypto_testsuite_params *ts_params,
2348 		const uint8_t *cipher,
2349 		const uint8_t *digest,
2350 		const uint8_t *iv)
2351 {
2352 	/* Generate test mbuf data and digest */
2353 	ut_params->ibuf = setup_test_string(ts_params->mbuf_pool,
2354 			(const char *)
2355 			cipher,
2356 			QUOTE_512_BYTES, 0);
2357 
2358 	ut_params->digest = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
2359 			DIGEST_BYTE_LENGTH_SHA512);
2360 	TEST_ASSERT_NOT_NULL(ut_params->digest, "no room to append digest");
2361 
2362 	rte_memcpy(ut_params->digest,
2363 			digest,
2364 			DIGEST_BYTE_LENGTH_SHA512);
2365 
2366 	/* Generate Crypto op data structure */
2367 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2368 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2369 	TEST_ASSERT_NOT_NULL(ut_params->op,
2370 			"Failed to allocate symmetric crypto operation struct");
2371 
2372 	rte_crypto_op_attach_sym_session(ut_params->op, sess);
2373 
2374 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2375 
2376 	/* set crypto operation source mbuf */
2377 	sym_op->m_src = ut_params->ibuf;
2378 
2379 	sym_op->auth.digest.data = ut_params->digest;
2380 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2381 			ut_params->ibuf, QUOTE_512_BYTES);
2382 
2383 	sym_op->auth.data.offset = 0;
2384 	sym_op->auth.data.length = QUOTE_512_BYTES;
2385 
2386 	/* Copy IV at the end of the crypto operation */
2387 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2388 			iv, CIPHER_IV_LENGTH_AES_CBC);
2389 
2390 	sym_op->cipher.data.offset = 0;
2391 	sym_op->cipher.data.length = QUOTE_512_BYTES;
2392 
2393 	/* Process crypto operation */
2394 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
2395 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
2396 			ut_params->op);
2397 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
2398 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
2399 				ut_params->op, 1, 1, 0, 0);
2400 	else
2401 		TEST_ASSERT_NOT_NULL(
2402 				process_crypto_request(ts_params->valid_devs[0],
2403 					ut_params->op),
2404 					"failed to process sym crypto op");
2405 
2406 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2407 			"crypto op processing failed");
2408 
2409 	ut_params->obuf = ut_params->op->sym->m_src;
2410 
2411 	/* Validate obuf */
2412 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
2413 			rte_pktmbuf_mtod(ut_params->obuf, uint8_t *),
2414 			catch_22_quote,
2415 			QUOTE_512_BYTES,
2416 			"Plaintext data not as expected");
2417 
2418 	/* Validate obuf */
2419 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
2420 			"Digest verification failed");
2421 
2422 	return TEST_SUCCESS;
2423 }
2424 
2425 /* ***** SNOW 3G Tests ***** */
2426 static int
2427 create_wireless_algo_hash_session(uint8_t dev_id,
2428 	const uint8_t *key, const uint8_t key_len,
2429 	const uint8_t iv_len, const uint8_t auth_len,
2430 	enum rte_crypto_auth_operation op,
2431 	enum rte_crypto_auth_algorithm algo)
2432 {
2433 	uint8_t hash_key[key_len];
2434 	int status;
2435 
2436 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2437 	struct crypto_unittest_params *ut_params = &unittest_params;
2438 
2439 	memcpy(hash_key, key, key_len);
2440 
2441 	debug_hexdump(stdout, "key:", key, key_len);
2442 
2443 	/* Setup Authentication Parameters */
2444 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2445 	ut_params->auth_xform.next = NULL;
2446 
2447 	ut_params->auth_xform.auth.op = op;
2448 	ut_params->auth_xform.auth.algo = algo;
2449 	ut_params->auth_xform.auth.key.length = key_len;
2450 	ut_params->auth_xform.auth.key.data = hash_key;
2451 	ut_params->auth_xform.auth.digest_length = auth_len;
2452 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
2453 	ut_params->auth_xform.auth.iv.length = iv_len;
2454 	ut_params->sess = rte_cryptodev_sym_session_create(
2455 			ts_params->session_mpool);
2456 
2457 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2458 			&ut_params->auth_xform,
2459 			ts_params->session_priv_mpool);
2460 	if (status == -ENOTSUP)
2461 		return TEST_SKIPPED;
2462 
2463 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2464 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2465 	return 0;
2466 }
2467 
2468 static int
2469 create_wireless_algo_cipher_session(uint8_t dev_id,
2470 			enum rte_crypto_cipher_operation op,
2471 			enum rte_crypto_cipher_algorithm algo,
2472 			const uint8_t *key, const uint8_t key_len,
2473 			uint8_t iv_len)
2474 {
2475 	uint8_t cipher_key[key_len];
2476 	int status;
2477 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2478 	struct crypto_unittest_params *ut_params = &unittest_params;
2479 
2480 	memcpy(cipher_key, key, key_len);
2481 
2482 	/* Setup Cipher Parameters */
2483 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2484 	ut_params->cipher_xform.next = NULL;
2485 
2486 	ut_params->cipher_xform.cipher.algo = algo;
2487 	ut_params->cipher_xform.cipher.op = op;
2488 	ut_params->cipher_xform.cipher.key.data = cipher_key;
2489 	ut_params->cipher_xform.cipher.key.length = key_len;
2490 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2491 	ut_params->cipher_xform.cipher.iv.length = iv_len;
2492 
2493 	debug_hexdump(stdout, "key:", key, key_len);
2494 
2495 	/* Create Crypto session */
2496 	ut_params->sess = rte_cryptodev_sym_session_create(
2497 			ts_params->session_mpool);
2498 
2499 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2500 			&ut_params->cipher_xform,
2501 			ts_params->session_priv_mpool);
2502 	if (status == -ENOTSUP)
2503 		return TEST_SKIPPED;
2504 
2505 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2506 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2507 	return 0;
2508 }
2509 
2510 static int
2511 create_wireless_algo_cipher_operation(const uint8_t *iv, uint8_t iv_len,
2512 			unsigned int cipher_len,
2513 			unsigned int cipher_offset)
2514 {
2515 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2516 	struct crypto_unittest_params *ut_params = &unittest_params;
2517 
2518 	/* Generate Crypto op data structure */
2519 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2520 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2521 	TEST_ASSERT_NOT_NULL(ut_params->op,
2522 				"Failed to allocate pktmbuf offload");
2523 
2524 	/* Set crypto operation data parameters */
2525 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2526 
2527 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2528 
2529 	/* set crypto operation source mbuf */
2530 	sym_op->m_src = ut_params->ibuf;
2531 
2532 	/* iv */
2533 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2534 			iv, iv_len);
2535 	sym_op->cipher.data.length = cipher_len;
2536 	sym_op->cipher.data.offset = cipher_offset;
2537 	return 0;
2538 }
2539 
2540 static int
2541 create_wireless_algo_cipher_operation_oop(const uint8_t *iv, uint8_t iv_len,
2542 			unsigned int cipher_len,
2543 			unsigned int cipher_offset)
2544 {
2545 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2546 	struct crypto_unittest_params *ut_params = &unittest_params;
2547 
2548 	/* Generate Crypto op data structure */
2549 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2550 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2551 	TEST_ASSERT_NOT_NULL(ut_params->op,
2552 				"Failed to allocate pktmbuf offload");
2553 
2554 	/* Set crypto operation data parameters */
2555 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2556 
2557 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2558 
2559 	/* set crypto operation source mbuf */
2560 	sym_op->m_src = ut_params->ibuf;
2561 	sym_op->m_dst = ut_params->obuf;
2562 
2563 	/* iv */
2564 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2565 			iv, iv_len);
2566 	sym_op->cipher.data.length = cipher_len;
2567 	sym_op->cipher.data.offset = cipher_offset;
2568 	return 0;
2569 }
2570 
2571 static int
2572 create_wireless_algo_cipher_auth_session(uint8_t dev_id,
2573 		enum rte_crypto_cipher_operation cipher_op,
2574 		enum rte_crypto_auth_operation auth_op,
2575 		enum rte_crypto_auth_algorithm auth_algo,
2576 		enum rte_crypto_cipher_algorithm cipher_algo,
2577 		const uint8_t *key, uint8_t key_len,
2578 		uint8_t auth_iv_len, uint8_t auth_len,
2579 		uint8_t cipher_iv_len)
2580 
2581 {
2582 	uint8_t cipher_auth_key[key_len];
2583 	int status;
2584 
2585 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2586 	struct crypto_unittest_params *ut_params = &unittest_params;
2587 
2588 	memcpy(cipher_auth_key, key, key_len);
2589 
2590 	/* Setup Authentication Parameters */
2591 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2592 	ut_params->auth_xform.next = NULL;
2593 
2594 	ut_params->auth_xform.auth.op = auth_op;
2595 	ut_params->auth_xform.auth.algo = auth_algo;
2596 	ut_params->auth_xform.auth.key.length = key_len;
2597 	/* Hash key = cipher key */
2598 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2599 	ut_params->auth_xform.auth.digest_length = auth_len;
2600 	/* Auth IV will be after cipher IV */
2601 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2602 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2603 
2604 	/* Setup Cipher Parameters */
2605 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2606 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2607 
2608 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2609 	ut_params->cipher_xform.cipher.op = cipher_op;
2610 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2611 	ut_params->cipher_xform.cipher.key.length = key_len;
2612 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2613 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2614 
2615 	debug_hexdump(stdout, "key:", key, key_len);
2616 
2617 	/* Create Crypto session*/
2618 	ut_params->sess = rte_cryptodev_sym_session_create(
2619 			ts_params->session_mpool);
2620 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2621 
2622 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2623 			&ut_params->cipher_xform,
2624 			ts_params->session_priv_mpool);
2625 	if (status == -ENOTSUP)
2626 		return TEST_SKIPPED;
2627 
2628 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2629 	return 0;
2630 }
2631 
2632 static int
2633 create_wireless_cipher_auth_session(uint8_t dev_id,
2634 		enum rte_crypto_cipher_operation cipher_op,
2635 		enum rte_crypto_auth_operation auth_op,
2636 		enum rte_crypto_auth_algorithm auth_algo,
2637 		enum rte_crypto_cipher_algorithm cipher_algo,
2638 		const struct wireless_test_data *tdata)
2639 {
2640 	const uint8_t key_len = tdata->key.len;
2641 	uint8_t cipher_auth_key[key_len];
2642 	int status;
2643 
2644 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2645 	struct crypto_unittest_params *ut_params = &unittest_params;
2646 	const uint8_t *key = tdata->key.data;
2647 	const uint8_t auth_len = tdata->digest.len;
2648 	uint8_t cipher_iv_len = tdata->cipher_iv.len;
2649 	uint8_t auth_iv_len = tdata->auth_iv.len;
2650 
2651 	memcpy(cipher_auth_key, key, key_len);
2652 
2653 	/* Setup Authentication Parameters */
2654 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2655 	ut_params->auth_xform.next = NULL;
2656 
2657 	ut_params->auth_xform.auth.op = auth_op;
2658 	ut_params->auth_xform.auth.algo = auth_algo;
2659 	ut_params->auth_xform.auth.key.length = key_len;
2660 	/* Hash key = cipher key */
2661 	ut_params->auth_xform.auth.key.data = cipher_auth_key;
2662 	ut_params->auth_xform.auth.digest_length = auth_len;
2663 	/* Auth IV will be after cipher IV */
2664 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2665 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2666 
2667 	/* Setup Cipher Parameters */
2668 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2669 	ut_params->cipher_xform.next = &ut_params->auth_xform;
2670 
2671 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2672 	ut_params->cipher_xform.cipher.op = cipher_op;
2673 	ut_params->cipher_xform.cipher.key.data = cipher_auth_key;
2674 	ut_params->cipher_xform.cipher.key.length = key_len;
2675 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2676 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2677 
2678 
2679 	debug_hexdump(stdout, "key:", key, key_len);
2680 
2681 	/* Create Crypto session*/
2682 	ut_params->sess = rte_cryptodev_sym_session_create(
2683 			ts_params->session_mpool);
2684 
2685 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2686 			&ut_params->cipher_xform,
2687 			ts_params->session_priv_mpool);
2688 	if (status == -ENOTSUP)
2689 		return TEST_SKIPPED;
2690 
2691 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2692 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2693 	return 0;
2694 }
2695 
2696 static int
2697 create_zuc_cipher_auth_encrypt_generate_session(uint8_t dev_id,
2698 		const struct wireless_test_data *tdata)
2699 {
2700 	return create_wireless_cipher_auth_session(dev_id,
2701 		RTE_CRYPTO_CIPHER_OP_ENCRYPT,
2702 		RTE_CRYPTO_AUTH_OP_GENERATE, RTE_CRYPTO_AUTH_ZUC_EIA3,
2703 		RTE_CRYPTO_CIPHER_ZUC_EEA3, tdata);
2704 }
2705 
2706 static int
2707 create_wireless_algo_auth_cipher_session(uint8_t dev_id,
2708 		enum rte_crypto_cipher_operation cipher_op,
2709 		enum rte_crypto_auth_operation auth_op,
2710 		enum rte_crypto_auth_algorithm auth_algo,
2711 		enum rte_crypto_cipher_algorithm cipher_algo,
2712 		const uint8_t *key, const uint8_t key_len,
2713 		uint8_t auth_iv_len, uint8_t auth_len,
2714 		uint8_t cipher_iv_len)
2715 {
2716 	uint8_t auth_cipher_key[key_len];
2717 	int status;
2718 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2719 	struct crypto_unittest_params *ut_params = &unittest_params;
2720 
2721 	memcpy(auth_cipher_key, key, key_len);
2722 
2723 	/* Setup Authentication Parameters */
2724 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
2725 	ut_params->auth_xform.auth.op = auth_op;
2726 	ut_params->auth_xform.next = &ut_params->cipher_xform;
2727 	ut_params->auth_xform.auth.algo = auth_algo;
2728 	ut_params->auth_xform.auth.key.length = key_len;
2729 	ut_params->auth_xform.auth.key.data = auth_cipher_key;
2730 	ut_params->auth_xform.auth.digest_length = auth_len;
2731 	/* Auth IV will be after cipher IV */
2732 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET + cipher_iv_len;
2733 	ut_params->auth_xform.auth.iv.length = auth_iv_len;
2734 
2735 	/* Setup Cipher Parameters */
2736 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
2737 	ut_params->cipher_xform.next = NULL;
2738 	ut_params->cipher_xform.cipher.algo = cipher_algo;
2739 	ut_params->cipher_xform.cipher.op = cipher_op;
2740 	ut_params->cipher_xform.cipher.key.data = auth_cipher_key;
2741 	ut_params->cipher_xform.cipher.key.length = key_len;
2742 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
2743 	ut_params->cipher_xform.cipher.iv.length = cipher_iv_len;
2744 
2745 	debug_hexdump(stdout, "key:", key, key_len);
2746 
2747 	/* Create Crypto session*/
2748 	ut_params->sess = rte_cryptodev_sym_session_create(
2749 			ts_params->session_mpool);
2750 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
2751 
2752 	if (cipher_op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
2753 		ut_params->auth_xform.next = NULL;
2754 		ut_params->cipher_xform.next = &ut_params->auth_xform;
2755 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2756 				&ut_params->cipher_xform,
2757 				ts_params->session_priv_mpool);
2758 
2759 	} else
2760 		status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
2761 				&ut_params->auth_xform,
2762 				ts_params->session_priv_mpool);
2763 
2764 	if (status == -ENOTSUP)
2765 		return TEST_SKIPPED;
2766 
2767 	TEST_ASSERT_EQUAL(status, 0, "session init failed");
2768 
2769 	return 0;
2770 }
2771 
2772 static int
2773 create_wireless_algo_hash_operation(const uint8_t *auth_tag,
2774 		unsigned int auth_tag_len,
2775 		const uint8_t *iv, unsigned int iv_len,
2776 		unsigned int data_pad_len,
2777 		enum rte_crypto_auth_operation op,
2778 		unsigned int auth_len, unsigned int auth_offset)
2779 {
2780 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2781 
2782 	struct crypto_unittest_params *ut_params = &unittest_params;
2783 
2784 	/* Generate Crypto op data structure */
2785 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2786 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2787 	TEST_ASSERT_NOT_NULL(ut_params->op,
2788 		"Failed to allocate pktmbuf offload");
2789 
2790 	/* Set crypto operation data parameters */
2791 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2792 
2793 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2794 
2795 	/* set crypto operation source mbuf */
2796 	sym_op->m_src = ut_params->ibuf;
2797 
2798 	/* iv */
2799 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
2800 			iv, iv_len);
2801 	/* digest */
2802 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2803 					ut_params->ibuf, auth_tag_len);
2804 
2805 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2806 				"no room to append auth tag");
2807 	ut_params->digest = sym_op->auth.digest.data;
2808 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2809 			ut_params->ibuf, data_pad_len);
2810 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2811 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2812 	else
2813 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2814 
2815 	debug_hexdump(stdout, "digest:",
2816 		sym_op->auth.digest.data,
2817 		auth_tag_len);
2818 
2819 	sym_op->auth.data.length = auth_len;
2820 	sym_op->auth.data.offset = auth_offset;
2821 
2822 	return 0;
2823 }
2824 
2825 static int
2826 create_wireless_cipher_hash_operation(const struct wireless_test_data *tdata,
2827 	enum rte_crypto_auth_operation op)
2828 {
2829 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2830 	struct crypto_unittest_params *ut_params = &unittest_params;
2831 
2832 	const uint8_t *auth_tag = tdata->digest.data;
2833 	const unsigned int auth_tag_len = tdata->digest.len;
2834 	unsigned int plaintext_len = ceil_byte_length(tdata->plaintext.len);
2835 	unsigned int data_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
2836 
2837 	const uint8_t *cipher_iv = tdata->cipher_iv.data;
2838 	const uint8_t cipher_iv_len = tdata->cipher_iv.len;
2839 	const uint8_t *auth_iv = tdata->auth_iv.data;
2840 	const uint8_t auth_iv_len = tdata->auth_iv.len;
2841 	const unsigned int cipher_len = tdata->validCipherLenInBits.len;
2842 	const unsigned int auth_len = tdata->validAuthLenInBits.len;
2843 
2844 	/* Generate Crypto op data structure */
2845 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2846 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2847 	TEST_ASSERT_NOT_NULL(ut_params->op,
2848 			"Failed to allocate pktmbuf offload");
2849 	/* Set crypto operation data parameters */
2850 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2851 
2852 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2853 
2854 	/* set crypto operation source mbuf */
2855 	sym_op->m_src = ut_params->ibuf;
2856 
2857 	/* digest */
2858 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2859 			ut_params->ibuf, auth_tag_len);
2860 
2861 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2862 			"no room to append auth tag");
2863 	ut_params->digest = sym_op->auth.digest.data;
2864 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2865 			ut_params->ibuf, data_pad_len);
2866 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2867 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2868 	else
2869 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2870 
2871 	debug_hexdump(stdout, "digest:",
2872 		sym_op->auth.digest.data,
2873 		auth_tag_len);
2874 
2875 	/* Copy cipher and auth IVs at the end of the crypto operation */
2876 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2877 						IV_OFFSET);
2878 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2879 	iv_ptr += cipher_iv_len;
2880 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2881 
2882 	sym_op->cipher.data.length = cipher_len;
2883 	sym_op->cipher.data.offset = 0;
2884 	sym_op->auth.data.length = auth_len;
2885 	sym_op->auth.data.offset = 0;
2886 
2887 	return 0;
2888 }
2889 
2890 static int
2891 create_zuc_cipher_hash_generate_operation(
2892 		const struct wireless_test_data *tdata)
2893 {
2894 	return create_wireless_cipher_hash_operation(tdata,
2895 		RTE_CRYPTO_AUTH_OP_GENERATE);
2896 }
2897 
2898 static int
2899 create_wireless_algo_cipher_hash_operation(const uint8_t *auth_tag,
2900 		const unsigned auth_tag_len,
2901 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2902 		unsigned data_pad_len,
2903 		enum rte_crypto_auth_operation op,
2904 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2905 		const unsigned cipher_len, const unsigned cipher_offset,
2906 		const unsigned auth_len, const unsigned auth_offset)
2907 {
2908 	struct crypto_testsuite_params *ts_params = &testsuite_params;
2909 	struct crypto_unittest_params *ut_params = &unittest_params;
2910 
2911 	enum rte_crypto_cipher_algorithm cipher_algo =
2912 			ut_params->cipher_xform.cipher.algo;
2913 	enum rte_crypto_auth_algorithm auth_algo =
2914 			ut_params->auth_xform.auth.algo;
2915 
2916 	/* Generate Crypto op data structure */
2917 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
2918 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
2919 	TEST_ASSERT_NOT_NULL(ut_params->op,
2920 			"Failed to allocate pktmbuf offload");
2921 	/* Set crypto operation data parameters */
2922 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
2923 
2924 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
2925 
2926 	/* set crypto operation source mbuf */
2927 	sym_op->m_src = ut_params->ibuf;
2928 
2929 	/* digest */
2930 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
2931 			ut_params->ibuf, auth_tag_len);
2932 
2933 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
2934 			"no room to append auth tag");
2935 	ut_params->digest = sym_op->auth.digest.data;
2936 
2937 	if (rte_pktmbuf_is_contiguous(ut_params->ibuf)) {
2938 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2939 				ut_params->ibuf, data_pad_len);
2940 	} else {
2941 		struct rte_mbuf *m = ut_params->ibuf;
2942 		unsigned int offset = data_pad_len;
2943 
2944 		while (offset > m->data_len && m->next != NULL) {
2945 			offset -= m->data_len;
2946 			m = m->next;
2947 		}
2948 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
2949 			m, offset);
2950 	}
2951 
2952 	if (op == RTE_CRYPTO_AUTH_OP_GENERATE)
2953 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
2954 	else
2955 		rte_memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
2956 
2957 	debug_hexdump(stdout, "digest:",
2958 		sym_op->auth.digest.data,
2959 		auth_tag_len);
2960 
2961 	/* Copy cipher and auth IVs at the end of the crypto operation */
2962 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op, uint8_t *,
2963 						IV_OFFSET);
2964 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
2965 	iv_ptr += cipher_iv_len;
2966 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
2967 
2968 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
2969 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
2970 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
2971 		sym_op->cipher.data.length = cipher_len;
2972 		sym_op->cipher.data.offset = cipher_offset;
2973 	} else {
2974 		sym_op->cipher.data.length = cipher_len >> 3;
2975 		sym_op->cipher.data.offset = cipher_offset >> 3;
2976 	}
2977 
2978 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
2979 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
2980 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
2981 		sym_op->auth.data.length = auth_len;
2982 		sym_op->auth.data.offset = auth_offset;
2983 	} else {
2984 		sym_op->auth.data.length = auth_len >> 3;
2985 		sym_op->auth.data.offset = auth_offset >> 3;
2986 	}
2987 
2988 	return 0;
2989 }
2990 
2991 static int
2992 create_wireless_algo_auth_cipher_operation(
2993 		const uint8_t *auth_tag, unsigned int auth_tag_len,
2994 		const uint8_t *cipher_iv, uint8_t cipher_iv_len,
2995 		const uint8_t *auth_iv, uint8_t auth_iv_len,
2996 		unsigned int data_pad_len,
2997 		unsigned int cipher_len, unsigned int cipher_offset,
2998 		unsigned int auth_len, unsigned int auth_offset,
2999 		uint8_t op_mode, uint8_t do_sgl, uint8_t verify)
3000 {
3001 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3002 	struct crypto_unittest_params *ut_params = &unittest_params;
3003 
3004 	enum rte_crypto_cipher_algorithm cipher_algo =
3005 			ut_params->cipher_xform.cipher.algo;
3006 	enum rte_crypto_auth_algorithm auth_algo =
3007 			ut_params->auth_xform.auth.algo;
3008 
3009 	/* Generate Crypto op data structure */
3010 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
3011 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
3012 	TEST_ASSERT_NOT_NULL(ut_params->op,
3013 			"Failed to allocate pktmbuf offload");
3014 
3015 	/* Set crypto operation data parameters */
3016 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
3017 
3018 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
3019 
3020 	/* set crypto operation mbufs */
3021 	sym_op->m_src = ut_params->ibuf;
3022 	if (op_mode == OUT_OF_PLACE)
3023 		sym_op->m_dst = ut_params->obuf;
3024 
3025 	/* digest */
3026 	if (!do_sgl) {
3027 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(
3028 			(op_mode == IN_PLACE ?
3029 				ut_params->ibuf : ut_params->obuf),
3030 			uint8_t *, data_pad_len);
3031 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
3032 			(op_mode == IN_PLACE ?
3033 				ut_params->ibuf : ut_params->obuf),
3034 			data_pad_len);
3035 		memset(sym_op->auth.digest.data, 0, auth_tag_len);
3036 	} else {
3037 		uint16_t remaining_off = (auth_offset >> 3) + (auth_len >> 3);
3038 		struct rte_mbuf *sgl_buf = (op_mode == IN_PLACE ?
3039 				sym_op->m_src : sym_op->m_dst);
3040 		while (remaining_off >= rte_pktmbuf_data_len(sgl_buf)) {
3041 			remaining_off -= rte_pktmbuf_data_len(sgl_buf);
3042 			sgl_buf = sgl_buf->next;
3043 		}
3044 		sym_op->auth.digest.data = rte_pktmbuf_mtod_offset(sgl_buf,
3045 				uint8_t *, remaining_off);
3046 		sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(sgl_buf,
3047 				remaining_off);
3048 		memset(sym_op->auth.digest.data, 0, remaining_off);
3049 		while (sgl_buf->next != NULL) {
3050 			memset(rte_pktmbuf_mtod(sgl_buf, uint8_t *),
3051 				0, rte_pktmbuf_data_len(sgl_buf));
3052 			sgl_buf = sgl_buf->next;
3053 		}
3054 	}
3055 
3056 	/* Copy digest for the verification */
3057 	if (verify)
3058 		memcpy(sym_op->auth.digest.data, auth_tag, auth_tag_len);
3059 
3060 	/* Copy cipher and auth IVs at the end of the crypto operation */
3061 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(
3062 			ut_params->op, uint8_t *, IV_OFFSET);
3063 
3064 	rte_memcpy(iv_ptr, cipher_iv, cipher_iv_len);
3065 	iv_ptr += cipher_iv_len;
3066 	rte_memcpy(iv_ptr, auth_iv, auth_iv_len);
3067 
3068 	/* Only copy over the offset data needed from src to dst in OOP,
3069 	 * if the auth and cipher offsets are not aligned
3070 	 */
3071 	if (op_mode == OUT_OF_PLACE) {
3072 		if (cipher_offset > auth_offset)
3073 			rte_memcpy(
3074 				rte_pktmbuf_mtod_offset(
3075 					sym_op->m_dst,
3076 					uint8_t *, auth_offset >> 3),
3077 				rte_pktmbuf_mtod_offset(
3078 					sym_op->m_src,
3079 					uint8_t *, auth_offset >> 3),
3080 				((cipher_offset >> 3) - (auth_offset >> 3)));
3081 	}
3082 
3083 	if (cipher_algo == RTE_CRYPTO_CIPHER_SNOW3G_UEA2 ||
3084 		cipher_algo == RTE_CRYPTO_CIPHER_KASUMI_F8 ||
3085 		cipher_algo == RTE_CRYPTO_CIPHER_ZUC_EEA3) {
3086 		sym_op->cipher.data.length = cipher_len;
3087 		sym_op->cipher.data.offset = cipher_offset;
3088 	} else {
3089 		sym_op->cipher.data.length = cipher_len >> 3;
3090 		sym_op->cipher.data.offset = cipher_offset >> 3;
3091 	}
3092 
3093 	if (auth_algo == RTE_CRYPTO_AUTH_SNOW3G_UIA2 ||
3094 		auth_algo == RTE_CRYPTO_AUTH_KASUMI_F9 ||
3095 		auth_algo == RTE_CRYPTO_AUTH_ZUC_EIA3) {
3096 		sym_op->auth.data.length = auth_len;
3097 		sym_op->auth.data.offset = auth_offset;
3098 	} else {
3099 		sym_op->auth.data.length = auth_len >> 3;
3100 		sym_op->auth.data.offset = auth_offset >> 3;
3101 	}
3102 
3103 	return 0;
3104 }
3105 
3106 static int
3107 test_snow3g_authentication(const struct snow3g_hash_test_data *tdata)
3108 {
3109 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3110 	struct crypto_unittest_params *ut_params = &unittest_params;
3111 
3112 	int retval;
3113 	unsigned plaintext_pad_len;
3114 	unsigned plaintext_len;
3115 	uint8_t *plaintext;
3116 	struct rte_cryptodev_info dev_info;
3117 
3118 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3119 	uint64_t feat_flags = dev_info.feature_flags;
3120 
3121 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3122 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3123 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3124 		return TEST_SKIPPED;
3125 	}
3126 
3127 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3128 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3129 		printf("Device doesn't support RAW data-path APIs.\n");
3130 		return TEST_SKIPPED;
3131 	}
3132 
3133 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3134 		return TEST_SKIPPED;
3135 
3136 	/* Verify the capabilities */
3137 	struct rte_cryptodev_sym_capability_idx cap_idx;
3138 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3139 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3140 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3141 			&cap_idx) == NULL)
3142 		return TEST_SKIPPED;
3143 
3144 	/* Create SNOW 3G session */
3145 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3146 			tdata->key.data, tdata->key.len,
3147 			tdata->auth_iv.len, tdata->digest.len,
3148 			RTE_CRYPTO_AUTH_OP_GENERATE,
3149 			RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3150 	if (retval < 0)
3151 		return retval;
3152 
3153 	/* alloc mbuf and set payload */
3154 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3155 
3156 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3157 	rte_pktmbuf_tailroom(ut_params->ibuf));
3158 
3159 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3160 	/* Append data which is padded to a multiple of */
3161 	/* the algorithms block size */
3162 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3163 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3164 				plaintext_pad_len);
3165 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3166 
3167 	/* Create SNOW 3G operation */
3168 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3169 			tdata->auth_iv.data, tdata->auth_iv.len,
3170 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3171 			tdata->validAuthLenInBits.len,
3172 			0);
3173 	if (retval < 0)
3174 		return retval;
3175 
3176 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3177 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3178 				ut_params->op, 0, 1, 1, 0);
3179 	else
3180 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3181 				ut_params->op);
3182 	ut_params->obuf = ut_params->op->sym->m_src;
3183 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3184 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3185 			+ plaintext_pad_len;
3186 
3187 	/* Validate obuf */
3188 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3189 	ut_params->digest,
3190 	tdata->digest.data,
3191 	DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
3192 	"SNOW 3G Generated auth tag not as expected");
3193 
3194 	return 0;
3195 }
3196 
3197 static int
3198 test_snow3g_authentication_verify(const struct snow3g_hash_test_data *tdata)
3199 {
3200 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3201 	struct crypto_unittest_params *ut_params = &unittest_params;
3202 
3203 	int retval;
3204 	unsigned plaintext_pad_len;
3205 	unsigned plaintext_len;
3206 	uint8_t *plaintext;
3207 	struct rte_cryptodev_info dev_info;
3208 
3209 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3210 	uint64_t feat_flags = dev_info.feature_flags;
3211 
3212 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
3213 			((tdata->validAuthLenInBits.len % 8) != 0)) {
3214 		printf("Device doesn't support NON-Byte Aligned Data.\n");
3215 		return TEST_SKIPPED;
3216 	}
3217 
3218 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3219 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3220 		printf("Device doesn't support RAW data-path APIs.\n");
3221 		return TEST_SKIPPED;
3222 	}
3223 
3224 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3225 		return TEST_SKIPPED;
3226 
3227 	/* Verify the capabilities */
3228 	struct rte_cryptodev_sym_capability_idx cap_idx;
3229 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3230 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
3231 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3232 			&cap_idx) == NULL)
3233 		return TEST_SKIPPED;
3234 
3235 	/* Create SNOW 3G session */
3236 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3237 				tdata->key.data, tdata->key.len,
3238 				tdata->auth_iv.len, tdata->digest.len,
3239 				RTE_CRYPTO_AUTH_OP_VERIFY,
3240 				RTE_CRYPTO_AUTH_SNOW3G_UIA2);
3241 	if (retval < 0)
3242 		return retval;
3243 	/* alloc mbuf and set payload */
3244 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3245 
3246 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3247 	rte_pktmbuf_tailroom(ut_params->ibuf));
3248 
3249 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3250 	/* Append data which is padded to a multiple of */
3251 	/* the algorithms block size */
3252 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
3253 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3254 				plaintext_pad_len);
3255 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3256 
3257 	/* Create SNOW 3G operation */
3258 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3259 			tdata->digest.len,
3260 			tdata->auth_iv.data, tdata->auth_iv.len,
3261 			plaintext_pad_len,
3262 			RTE_CRYPTO_AUTH_OP_VERIFY,
3263 			tdata->validAuthLenInBits.len,
3264 			0);
3265 	if (retval < 0)
3266 		return retval;
3267 
3268 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3269 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3270 				ut_params->op, 0, 1, 1, 0);
3271 	else
3272 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3273 				ut_params->op);
3274 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3275 	ut_params->obuf = ut_params->op->sym->m_src;
3276 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3277 				+ plaintext_pad_len;
3278 
3279 	/* Validate obuf */
3280 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3281 		return 0;
3282 	else
3283 		return -1;
3284 
3285 	return 0;
3286 }
3287 
3288 static int
3289 test_kasumi_authentication(const struct kasumi_hash_test_data *tdata)
3290 {
3291 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3292 	struct crypto_unittest_params *ut_params = &unittest_params;
3293 
3294 	int retval;
3295 	unsigned plaintext_pad_len;
3296 	unsigned plaintext_len;
3297 	uint8_t *plaintext;
3298 	struct rte_cryptodev_info dev_info;
3299 
3300 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3301 	uint64_t feat_flags = dev_info.feature_flags;
3302 
3303 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3304 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3305 		printf("Device doesn't support RAW data-path APIs.\n");
3306 		return TEST_SKIPPED;
3307 	}
3308 
3309 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3310 		return TEST_SKIPPED;
3311 
3312 	/* Verify the capabilities */
3313 	struct rte_cryptodev_sym_capability_idx cap_idx;
3314 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3315 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3316 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3317 			&cap_idx) == NULL)
3318 		return TEST_SKIPPED;
3319 
3320 	/* Create KASUMI session */
3321 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3322 			tdata->key.data, tdata->key.len,
3323 			0, tdata->digest.len,
3324 			RTE_CRYPTO_AUTH_OP_GENERATE,
3325 			RTE_CRYPTO_AUTH_KASUMI_F9);
3326 	if (retval < 0)
3327 		return retval;
3328 
3329 	/* alloc mbuf and set payload */
3330 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3331 
3332 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3333 	rte_pktmbuf_tailroom(ut_params->ibuf));
3334 
3335 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3336 	/* Append data which is padded to a multiple of */
3337 	/* the algorithms block size */
3338 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3339 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3340 				plaintext_pad_len);
3341 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3342 
3343 	/* Create KASUMI operation */
3344 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
3345 			NULL, 0,
3346 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
3347 			tdata->plaintext.len,
3348 			0);
3349 	if (retval < 0)
3350 		return retval;
3351 
3352 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3353 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
3354 			ut_params->op);
3355 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3356 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3357 				ut_params->op, 0, 1, 1, 0);
3358 	else
3359 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3360 			ut_params->op);
3361 
3362 	ut_params->obuf = ut_params->op->sym->m_src;
3363 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3364 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3365 			+ plaintext_pad_len;
3366 
3367 	/* Validate obuf */
3368 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
3369 	ut_params->digest,
3370 	tdata->digest.data,
3371 	DIGEST_BYTE_LENGTH_KASUMI_F9,
3372 	"KASUMI Generated auth tag not as expected");
3373 
3374 	return 0;
3375 }
3376 
3377 static int
3378 test_kasumi_authentication_verify(const struct kasumi_hash_test_data *tdata)
3379 {
3380 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3381 	struct crypto_unittest_params *ut_params = &unittest_params;
3382 
3383 	int retval;
3384 	unsigned plaintext_pad_len;
3385 	unsigned plaintext_len;
3386 	uint8_t *plaintext;
3387 	struct rte_cryptodev_info dev_info;
3388 
3389 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3390 	uint64_t feat_flags = dev_info.feature_flags;
3391 
3392 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3393 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3394 		printf("Device doesn't support RAW data-path APIs.\n");
3395 		return TEST_SKIPPED;
3396 	}
3397 
3398 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3399 		return TEST_SKIPPED;
3400 
3401 	/* Verify the capabilities */
3402 	struct rte_cryptodev_sym_capability_idx cap_idx;
3403 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
3404 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
3405 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3406 			&cap_idx) == NULL)
3407 		return TEST_SKIPPED;
3408 
3409 	/* Create KASUMI session */
3410 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
3411 				tdata->key.data, tdata->key.len,
3412 				0, tdata->digest.len,
3413 				RTE_CRYPTO_AUTH_OP_VERIFY,
3414 				RTE_CRYPTO_AUTH_KASUMI_F9);
3415 	if (retval < 0)
3416 		return retval;
3417 	/* alloc mbuf and set payload */
3418 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3419 
3420 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3421 	rte_pktmbuf_tailroom(ut_params->ibuf));
3422 
3423 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3424 	/* Append data which is padded to a multiple */
3425 	/* of the algorithms block size */
3426 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3427 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3428 				plaintext_pad_len);
3429 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3430 
3431 	/* Create KASUMI operation */
3432 	retval = create_wireless_algo_hash_operation(tdata->digest.data,
3433 			tdata->digest.len,
3434 			NULL, 0,
3435 			plaintext_pad_len,
3436 			RTE_CRYPTO_AUTH_OP_VERIFY,
3437 			tdata->plaintext.len,
3438 			0);
3439 	if (retval < 0)
3440 		return retval;
3441 
3442 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3443 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3444 				ut_params->op, 0, 1, 1, 0);
3445 	else
3446 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3447 				ut_params->op);
3448 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3449 	ut_params->obuf = ut_params->op->sym->m_src;
3450 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
3451 				+ plaintext_pad_len;
3452 
3453 	/* Validate obuf */
3454 	if (ut_params->op->status == RTE_CRYPTO_OP_STATUS_SUCCESS)
3455 		return 0;
3456 	else
3457 		return -1;
3458 
3459 	return 0;
3460 }
3461 
3462 static int
3463 test_snow3g_hash_generate_test_case_1(void)
3464 {
3465 	return test_snow3g_authentication(&snow3g_hash_test_case_1);
3466 }
3467 
3468 static int
3469 test_snow3g_hash_generate_test_case_2(void)
3470 {
3471 	return test_snow3g_authentication(&snow3g_hash_test_case_2);
3472 }
3473 
3474 static int
3475 test_snow3g_hash_generate_test_case_3(void)
3476 {
3477 	return test_snow3g_authentication(&snow3g_hash_test_case_3);
3478 }
3479 
3480 static int
3481 test_snow3g_hash_generate_test_case_4(void)
3482 {
3483 	return test_snow3g_authentication(&snow3g_hash_test_case_4);
3484 }
3485 
3486 static int
3487 test_snow3g_hash_generate_test_case_5(void)
3488 {
3489 	return test_snow3g_authentication(&snow3g_hash_test_case_5);
3490 }
3491 
3492 static int
3493 test_snow3g_hash_generate_test_case_6(void)
3494 {
3495 	return test_snow3g_authentication(&snow3g_hash_test_case_6);
3496 }
3497 
3498 static int
3499 test_snow3g_hash_verify_test_case_1(void)
3500 {
3501 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_1);
3502 
3503 }
3504 
3505 static int
3506 test_snow3g_hash_verify_test_case_2(void)
3507 {
3508 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_2);
3509 }
3510 
3511 static int
3512 test_snow3g_hash_verify_test_case_3(void)
3513 {
3514 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_3);
3515 }
3516 
3517 static int
3518 test_snow3g_hash_verify_test_case_4(void)
3519 {
3520 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_4);
3521 }
3522 
3523 static int
3524 test_snow3g_hash_verify_test_case_5(void)
3525 {
3526 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_5);
3527 }
3528 
3529 static int
3530 test_snow3g_hash_verify_test_case_6(void)
3531 {
3532 	return test_snow3g_authentication_verify(&snow3g_hash_test_case_6);
3533 }
3534 
3535 static int
3536 test_kasumi_hash_generate_test_case_1(void)
3537 {
3538 	return test_kasumi_authentication(&kasumi_hash_test_case_1);
3539 }
3540 
3541 static int
3542 test_kasumi_hash_generate_test_case_2(void)
3543 {
3544 	return test_kasumi_authentication(&kasumi_hash_test_case_2);
3545 }
3546 
3547 static int
3548 test_kasumi_hash_generate_test_case_3(void)
3549 {
3550 	return test_kasumi_authentication(&kasumi_hash_test_case_3);
3551 }
3552 
3553 static int
3554 test_kasumi_hash_generate_test_case_4(void)
3555 {
3556 	return test_kasumi_authentication(&kasumi_hash_test_case_4);
3557 }
3558 
3559 static int
3560 test_kasumi_hash_generate_test_case_5(void)
3561 {
3562 	return test_kasumi_authentication(&kasumi_hash_test_case_5);
3563 }
3564 
3565 static int
3566 test_kasumi_hash_generate_test_case_6(void)
3567 {
3568 	return test_kasumi_authentication(&kasumi_hash_test_case_6);
3569 }
3570 
3571 static int
3572 test_kasumi_hash_verify_test_case_1(void)
3573 {
3574 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_1);
3575 }
3576 
3577 static int
3578 test_kasumi_hash_verify_test_case_2(void)
3579 {
3580 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_2);
3581 }
3582 
3583 static int
3584 test_kasumi_hash_verify_test_case_3(void)
3585 {
3586 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_3);
3587 }
3588 
3589 static int
3590 test_kasumi_hash_verify_test_case_4(void)
3591 {
3592 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_4);
3593 }
3594 
3595 static int
3596 test_kasumi_hash_verify_test_case_5(void)
3597 {
3598 	return test_kasumi_authentication_verify(&kasumi_hash_test_case_5);
3599 }
3600 
3601 static int
3602 test_kasumi_encryption(const struct kasumi_test_data *tdata)
3603 {
3604 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3605 	struct crypto_unittest_params *ut_params = &unittest_params;
3606 
3607 	int retval;
3608 	uint8_t *plaintext, *ciphertext;
3609 	unsigned plaintext_pad_len;
3610 	unsigned plaintext_len;
3611 	struct rte_cryptodev_info dev_info;
3612 
3613 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3614 	uint64_t feat_flags = dev_info.feature_flags;
3615 
3616 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3617 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3618 		printf("Device doesn't support RAW data-path APIs.\n");
3619 		return TEST_SKIPPED;
3620 	}
3621 
3622 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3623 		return TEST_SKIPPED;
3624 
3625 	/* Verify the capabilities */
3626 	struct rte_cryptodev_sym_capability_idx cap_idx;
3627 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3628 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3629 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3630 			&cap_idx) == NULL)
3631 		return TEST_SKIPPED;
3632 
3633 	/* Create KASUMI session */
3634 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3635 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3636 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3637 					tdata->key.data, tdata->key.len,
3638 					tdata->cipher_iv.len);
3639 	if (retval < 0)
3640 		return retval;
3641 
3642 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3643 
3644 	/* Clear mbuf payload */
3645 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3646 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3647 
3648 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3649 	/* Append data which is padded to a multiple */
3650 	/* of the algorithms block size */
3651 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3652 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3653 				plaintext_pad_len);
3654 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3655 
3656 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3657 
3658 	/* Create KASUMI operation */
3659 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3660 				tdata->cipher_iv.len,
3661 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3662 				tdata->validCipherOffsetInBits.len);
3663 	if (retval < 0)
3664 		return retval;
3665 
3666 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3667 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3668 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3669 	else
3670 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3671 				ut_params->op);
3672 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3673 
3674 	ut_params->obuf = ut_params->op->sym->m_dst;
3675 	if (ut_params->obuf)
3676 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3677 	else
3678 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3679 
3680 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3681 
3682 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3683 				(tdata->validCipherOffsetInBits.len >> 3);
3684 	/* Validate obuf */
3685 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3686 		ciphertext,
3687 		reference_ciphertext,
3688 		tdata->validCipherLenInBits.len,
3689 		"KASUMI Ciphertext data not as expected");
3690 	return 0;
3691 }
3692 
3693 static int
3694 test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
3695 {
3696 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3697 	struct crypto_unittest_params *ut_params = &unittest_params;
3698 
3699 	int retval;
3700 
3701 	unsigned int plaintext_pad_len;
3702 	unsigned int plaintext_len;
3703 
3704 	uint8_t buffer[10000];
3705 	const uint8_t *ciphertext;
3706 
3707 	struct rte_cryptodev_info dev_info;
3708 
3709 	/* Verify the capabilities */
3710 	struct rte_cryptodev_sym_capability_idx cap_idx;
3711 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3712 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3713 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3714 			&cap_idx) == NULL)
3715 		return TEST_SKIPPED;
3716 
3717 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3718 
3719 	uint64_t feat_flags = dev_info.feature_flags;
3720 
3721 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
3722 		printf("Device doesn't support in-place scatter-gather. "
3723 				"Test Skipped.\n");
3724 		return TEST_SKIPPED;
3725 	}
3726 
3727 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
3728 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
3729 		printf("Device doesn't support RAW data-path APIs.\n");
3730 		return TEST_SKIPPED;
3731 	}
3732 
3733 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3734 		return TEST_SKIPPED;
3735 
3736 	/* Create KASUMI session */
3737 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3738 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3739 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3740 					tdata->key.data, tdata->key.len,
3741 					tdata->cipher_iv.len);
3742 	if (retval < 0)
3743 		return retval;
3744 
3745 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3746 
3747 
3748 	/* Append data which is padded to a multiple */
3749 	/* of the algorithms block size */
3750 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3751 
3752 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3753 			plaintext_pad_len, 10, 0);
3754 
3755 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3756 
3757 	/* Create KASUMI operation */
3758 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
3759 				tdata->cipher_iv.len,
3760 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3761 				tdata->validCipherOffsetInBits.len);
3762 	if (retval < 0)
3763 		return retval;
3764 
3765 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3766 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
3767 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
3768 	else
3769 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3770 						ut_params->op);
3771 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3772 
3773 	ut_params->obuf = ut_params->op->sym->m_dst;
3774 
3775 	if (ut_params->obuf)
3776 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3777 				plaintext_len, buffer);
3778 	else
3779 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3780 				tdata->validCipherOffsetInBits.len >> 3,
3781 				plaintext_len, buffer);
3782 
3783 	/* Validate obuf */
3784 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3785 
3786 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3787 				(tdata->validCipherOffsetInBits.len >> 3);
3788 	/* Validate obuf */
3789 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3790 		ciphertext,
3791 		reference_ciphertext,
3792 		tdata->validCipherLenInBits.len,
3793 		"KASUMI Ciphertext data not as expected");
3794 	return 0;
3795 }
3796 
3797 static int
3798 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
3799 {
3800 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3801 	struct crypto_unittest_params *ut_params = &unittest_params;
3802 
3803 	int retval;
3804 	uint8_t *plaintext, *ciphertext;
3805 	unsigned plaintext_pad_len;
3806 	unsigned plaintext_len;
3807 
3808 	/* Verify the capabilities */
3809 	struct rte_cryptodev_sym_capability_idx cap_idx;
3810 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3811 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3812 	/* Data-path service does not support OOP */
3813 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3814 			&cap_idx) == NULL)
3815 		return TEST_SKIPPED;
3816 
3817 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3818 		return TEST_SKIPPED;
3819 
3820 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3821 		return TEST_SKIPPED;
3822 
3823 	/* Create KASUMI session */
3824 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3825 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3826 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3827 					tdata->key.data, tdata->key.len,
3828 					tdata->cipher_iv.len);
3829 	if (retval < 0)
3830 		return retval;
3831 
3832 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3833 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
3834 
3835 	/* Clear mbuf payload */
3836 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
3837 	       rte_pktmbuf_tailroom(ut_params->ibuf));
3838 
3839 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3840 	/* Append data which is padded to a multiple */
3841 	/* of the algorithms block size */
3842 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3843 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
3844 				plaintext_pad_len);
3845 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
3846 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
3847 
3848 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
3849 
3850 	/* Create KASUMI operation */
3851 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3852 				tdata->cipher_iv.len,
3853 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3854 				tdata->validCipherOffsetInBits.len);
3855 	if (retval < 0)
3856 		return retval;
3857 
3858 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3859 						ut_params->op);
3860 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3861 
3862 	ut_params->obuf = ut_params->op->sym->m_dst;
3863 	if (ut_params->obuf)
3864 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
3865 	else
3866 		ciphertext = plaintext + (tdata->validCipherOffsetInBits.len >> 3);
3867 
3868 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
3869 
3870 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3871 				(tdata->validCipherOffsetInBits.len >> 3);
3872 	/* Validate obuf */
3873 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3874 		ciphertext,
3875 		reference_ciphertext,
3876 		tdata->validCipherLenInBits.len,
3877 		"KASUMI Ciphertext data not as expected");
3878 	return 0;
3879 }
3880 
3881 static int
3882 test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
3883 {
3884 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3885 	struct crypto_unittest_params *ut_params = &unittest_params;
3886 
3887 	int retval;
3888 	unsigned int plaintext_pad_len;
3889 	unsigned int plaintext_len;
3890 
3891 	const uint8_t *ciphertext;
3892 	uint8_t buffer[2048];
3893 
3894 	struct rte_cryptodev_info dev_info;
3895 
3896 	/* Verify the capabilities */
3897 	struct rte_cryptodev_sym_capability_idx cap_idx;
3898 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3899 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3900 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3901 			&cap_idx) == NULL)
3902 		return TEST_SKIPPED;
3903 
3904 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3905 		return TEST_SKIPPED;
3906 
3907 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3908 		return TEST_SKIPPED;
3909 
3910 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
3911 
3912 	uint64_t feat_flags = dev_info.feature_flags;
3913 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
3914 		printf("Device doesn't support out-of-place scatter-gather "
3915 				"in both input and output mbufs. "
3916 				"Test Skipped.\n");
3917 		return TEST_SKIPPED;
3918 	}
3919 
3920 	/* Create KASUMI session */
3921 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
3922 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
3923 					RTE_CRYPTO_CIPHER_KASUMI_F8,
3924 					tdata->key.data, tdata->key.len,
3925 					tdata->cipher_iv.len);
3926 	if (retval < 0)
3927 		return retval;
3928 
3929 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
3930 	/* Append data which is padded to a multiple */
3931 	/* of the algorithms block size */
3932 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
3933 
3934 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
3935 			plaintext_pad_len, 10, 0);
3936 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
3937 			plaintext_pad_len, 3, 0);
3938 
3939 	/* Append data which is padded to a multiple */
3940 	/* of the algorithms block size */
3941 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
3942 
3943 	/* Create KASUMI operation */
3944 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
3945 				tdata->cipher_iv.len,
3946 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
3947 				tdata->validCipherOffsetInBits.len);
3948 	if (retval < 0)
3949 		return retval;
3950 
3951 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
3952 						ut_params->op);
3953 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
3954 
3955 	ut_params->obuf = ut_params->op->sym->m_dst;
3956 	if (ut_params->obuf)
3957 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
3958 				plaintext_pad_len, buffer);
3959 	else
3960 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
3961 				tdata->validCipherOffsetInBits.len >> 3,
3962 				plaintext_pad_len, buffer);
3963 
3964 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
3965 				(tdata->validCipherOffsetInBits.len >> 3);
3966 	/* Validate obuf */
3967 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
3968 		ciphertext,
3969 		reference_ciphertext,
3970 		tdata->validCipherLenInBits.len,
3971 		"KASUMI Ciphertext data not as expected");
3972 	return 0;
3973 }
3974 
3975 
3976 static int
3977 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
3978 {
3979 	struct crypto_testsuite_params *ts_params = &testsuite_params;
3980 	struct crypto_unittest_params *ut_params = &unittest_params;
3981 
3982 	int retval;
3983 	uint8_t *ciphertext, *plaintext;
3984 	unsigned ciphertext_pad_len;
3985 	unsigned ciphertext_len;
3986 
3987 	/* Verify the capabilities */
3988 	struct rte_cryptodev_sym_capability_idx cap_idx;
3989 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
3990 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
3991 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
3992 			&cap_idx) == NULL)
3993 		return TEST_SKIPPED;
3994 
3995 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
3996 		return TEST_SKIPPED;
3997 
3998 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
3999 		return TEST_SKIPPED;
4000 
4001 	/* Create KASUMI session */
4002 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4003 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4004 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4005 					tdata->key.data, tdata->key.len,
4006 					tdata->cipher_iv.len);
4007 	if (retval < 0)
4008 		return retval;
4009 
4010 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4011 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4012 
4013 	/* Clear mbuf payload */
4014 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4015 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4016 
4017 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4018 	/* Append data which is padded to a multiple */
4019 	/* of the algorithms block size */
4020 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4021 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4022 				ciphertext_pad_len);
4023 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4024 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4025 
4026 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4027 
4028 	/* Create KASUMI operation */
4029 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4030 				tdata->cipher_iv.len,
4031 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4032 				tdata->validCipherOffsetInBits.len);
4033 	if (retval < 0)
4034 		return retval;
4035 
4036 	ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4037 						ut_params->op);
4038 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4039 
4040 	ut_params->obuf = ut_params->op->sym->m_dst;
4041 	if (ut_params->obuf)
4042 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4043 	else
4044 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4045 
4046 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4047 
4048 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4049 				(tdata->validCipherOffsetInBits.len >> 3);
4050 	/* Validate obuf */
4051 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4052 		plaintext,
4053 		reference_plaintext,
4054 		tdata->validCipherLenInBits.len,
4055 		"KASUMI Plaintext data not as expected");
4056 	return 0;
4057 }
4058 
4059 static int
4060 test_kasumi_decryption(const struct kasumi_test_data *tdata)
4061 {
4062 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4063 	struct crypto_unittest_params *ut_params = &unittest_params;
4064 
4065 	int retval;
4066 	uint8_t *ciphertext, *plaintext;
4067 	unsigned ciphertext_pad_len;
4068 	unsigned ciphertext_len;
4069 	struct rte_cryptodev_info dev_info;
4070 
4071 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4072 	uint64_t feat_flags = dev_info.feature_flags;
4073 
4074 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4075 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4076 		printf("Device doesn't support RAW data-path APIs.\n");
4077 		return TEST_SKIPPED;
4078 	}
4079 
4080 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4081 		return TEST_SKIPPED;
4082 
4083 	/* Verify the capabilities */
4084 	struct rte_cryptodev_sym_capability_idx cap_idx;
4085 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4086 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
4087 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4088 			&cap_idx) == NULL)
4089 		return TEST_SKIPPED;
4090 
4091 	/* Create KASUMI session */
4092 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4093 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4094 					RTE_CRYPTO_CIPHER_KASUMI_F8,
4095 					tdata->key.data, tdata->key.len,
4096 					tdata->cipher_iv.len);
4097 	if (retval < 0)
4098 		return retval;
4099 
4100 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4101 
4102 	/* Clear mbuf payload */
4103 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4104 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4105 
4106 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4107 	/* Append data which is padded to a multiple */
4108 	/* of the algorithms block size */
4109 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 8);
4110 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4111 				ciphertext_pad_len);
4112 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4113 
4114 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4115 
4116 	/* Create KASUMI operation */
4117 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4118 			tdata->cipher_iv.len,
4119 			RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
4120 			tdata->validCipherOffsetInBits.len);
4121 	if (retval < 0)
4122 		return retval;
4123 
4124 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4125 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4126 				ut_params->op, 1, 0, 1, 0);
4127 	else
4128 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4129 						ut_params->op);
4130 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4131 
4132 	ut_params->obuf = ut_params->op->sym->m_dst;
4133 	if (ut_params->obuf)
4134 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4135 	else
4136 		plaintext = ciphertext + (tdata->validCipherOffsetInBits.len >> 3);
4137 
4138 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4139 
4140 	const uint8_t *reference_plaintext = tdata->plaintext.data +
4141 				(tdata->validCipherOffsetInBits.len >> 3);
4142 	/* Validate obuf */
4143 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4144 		plaintext,
4145 		reference_plaintext,
4146 		tdata->validCipherLenInBits.len,
4147 		"KASUMI Plaintext data not as expected");
4148 	return 0;
4149 }
4150 
4151 static int
4152 test_snow3g_encryption(const struct snow3g_test_data *tdata)
4153 {
4154 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4155 	struct crypto_unittest_params *ut_params = &unittest_params;
4156 
4157 	int retval;
4158 	uint8_t *plaintext, *ciphertext;
4159 	unsigned plaintext_pad_len;
4160 	unsigned plaintext_len;
4161 	struct rte_cryptodev_info dev_info;
4162 
4163 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4164 	uint64_t feat_flags = dev_info.feature_flags;
4165 
4166 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4167 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4168 		printf("Device doesn't support RAW data-path APIs.\n");
4169 		return TEST_SKIPPED;
4170 	}
4171 
4172 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4173 		return TEST_SKIPPED;
4174 
4175 	/* Verify the capabilities */
4176 	struct rte_cryptodev_sym_capability_idx cap_idx;
4177 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4178 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4179 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4180 			&cap_idx) == NULL)
4181 		return TEST_SKIPPED;
4182 
4183 	/* Create SNOW 3G session */
4184 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4185 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4186 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4187 					tdata->key.data, tdata->key.len,
4188 					tdata->cipher_iv.len);
4189 	if (retval < 0)
4190 		return retval;
4191 
4192 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4193 
4194 	/* Clear mbuf payload */
4195 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4196 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4197 
4198 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4199 	/* Append data which is padded to a multiple of */
4200 	/* the algorithms block size */
4201 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4202 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4203 				plaintext_pad_len);
4204 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4205 
4206 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4207 
4208 	/* Create SNOW 3G operation */
4209 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4210 					tdata->cipher_iv.len,
4211 					tdata->validCipherLenInBits.len,
4212 					0);
4213 	if (retval < 0)
4214 		return retval;
4215 
4216 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4217 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4218 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4219 	else
4220 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4221 						ut_params->op);
4222 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4223 
4224 	ut_params->obuf = ut_params->op->sym->m_dst;
4225 	if (ut_params->obuf)
4226 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4227 	else
4228 		ciphertext = plaintext;
4229 
4230 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4231 
4232 	/* Validate obuf */
4233 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4234 		ciphertext,
4235 		tdata->ciphertext.data,
4236 		tdata->validDataLenInBits.len,
4237 		"SNOW 3G Ciphertext data not as expected");
4238 	return 0;
4239 }
4240 
4241 
4242 static int
4243 test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
4244 {
4245 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4246 	struct crypto_unittest_params *ut_params = &unittest_params;
4247 	uint8_t *plaintext, *ciphertext;
4248 
4249 	int retval;
4250 	unsigned plaintext_pad_len;
4251 	unsigned plaintext_len;
4252 	struct rte_cryptodev_info dev_info;
4253 
4254 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4255 	uint64_t feat_flags = dev_info.feature_flags;
4256 
4257 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4258 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4259 		printf("Device does not support RAW data-path APIs.\n");
4260 		return -ENOTSUP;
4261 	}
4262 
4263 	/* Verify the capabilities */
4264 	struct rte_cryptodev_sym_capability_idx cap_idx;
4265 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4266 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4267 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4268 			&cap_idx) == NULL)
4269 		return TEST_SKIPPED;
4270 
4271 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4272 		return TEST_SKIPPED;
4273 
4274 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4275 		return TEST_SKIPPED;
4276 
4277 	/* Create SNOW 3G session */
4278 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4279 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4280 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4281 					tdata->key.data, tdata->key.len,
4282 					tdata->cipher_iv.len);
4283 	if (retval < 0)
4284 		return retval;
4285 
4286 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4287 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4288 
4289 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4290 			"Failed to allocate input buffer in mempool");
4291 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4292 			"Failed to allocate output buffer in mempool");
4293 
4294 	/* Clear mbuf payload */
4295 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4296 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4297 
4298 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4299 	/* Append data which is padded to a multiple of */
4300 	/* the algorithms block size */
4301 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4302 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4303 				plaintext_pad_len);
4304 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4305 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4306 
4307 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4308 
4309 	/* Create SNOW 3G operation */
4310 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4311 					tdata->cipher_iv.len,
4312 					tdata->validCipherLenInBits.len,
4313 					0);
4314 	if (retval < 0)
4315 		return retval;
4316 
4317 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4318 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4319 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4320 	else
4321 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4322 						ut_params->op);
4323 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4324 
4325 	ut_params->obuf = ut_params->op->sym->m_dst;
4326 	if (ut_params->obuf)
4327 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4328 	else
4329 		ciphertext = plaintext;
4330 
4331 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4332 
4333 	/* Validate obuf */
4334 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4335 		ciphertext,
4336 		tdata->ciphertext.data,
4337 		tdata->validDataLenInBits.len,
4338 		"SNOW 3G Ciphertext data not as expected");
4339 	return 0;
4340 }
4341 
4342 static int
4343 test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
4344 {
4345 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4346 	struct crypto_unittest_params *ut_params = &unittest_params;
4347 
4348 	int retval;
4349 	unsigned int plaintext_pad_len;
4350 	unsigned int plaintext_len;
4351 	uint8_t buffer[10000];
4352 	const uint8_t *ciphertext;
4353 
4354 	struct rte_cryptodev_info dev_info;
4355 
4356 	/* Verify the capabilities */
4357 	struct rte_cryptodev_sym_capability_idx cap_idx;
4358 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4359 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4360 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4361 			&cap_idx) == NULL)
4362 		return TEST_SKIPPED;
4363 
4364 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4365 		return TEST_SKIPPED;
4366 
4367 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4368 		return TEST_SKIPPED;
4369 
4370 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4371 
4372 	uint64_t feat_flags = dev_info.feature_flags;
4373 
4374 	if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
4375 		printf("Device doesn't support out-of-place scatter-gather "
4376 				"in both input and output mbufs. "
4377 				"Test Skipped.\n");
4378 		return TEST_SKIPPED;
4379 	}
4380 
4381 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4382 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4383 		printf("Device does not support RAW data-path APIs.\n");
4384 		return -ENOTSUP;
4385 	}
4386 
4387 	/* Create SNOW 3G session */
4388 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4389 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4390 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4391 					tdata->key.data, tdata->key.len,
4392 					tdata->cipher_iv.len);
4393 	if (retval < 0)
4394 		return retval;
4395 
4396 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4397 	/* Append data which is padded to a multiple of */
4398 	/* the algorithms block size */
4399 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4400 
4401 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
4402 			plaintext_pad_len, 10, 0);
4403 	ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
4404 			plaintext_pad_len, 3, 0);
4405 
4406 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4407 			"Failed to allocate input buffer in mempool");
4408 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4409 			"Failed to allocate output buffer in mempool");
4410 
4411 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
4412 
4413 	/* Create SNOW 3G operation */
4414 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4415 					tdata->cipher_iv.len,
4416 					tdata->validCipherLenInBits.len,
4417 					0);
4418 	if (retval < 0)
4419 		return retval;
4420 
4421 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4422 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4423 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4424 	else
4425 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4426 						ut_params->op);
4427 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4428 
4429 	ut_params->obuf = ut_params->op->sym->m_dst;
4430 	if (ut_params->obuf)
4431 		ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
4432 				plaintext_len, buffer);
4433 	else
4434 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
4435 				plaintext_len, buffer);
4436 
4437 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4438 
4439 	/* Validate obuf */
4440 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4441 		ciphertext,
4442 		tdata->ciphertext.data,
4443 		tdata->validDataLenInBits.len,
4444 		"SNOW 3G Ciphertext data not as expected");
4445 
4446 	return 0;
4447 }
4448 
4449 /* Shift right a buffer by "offset" bits, "offset" < 8 */
4450 static void
4451 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
4452 {
4453 	uint8_t curr_byte, prev_byte;
4454 	uint32_t length_in_bytes = ceil_byte_length(length + offset);
4455 	uint8_t lower_byte_mask = (1 << offset) - 1;
4456 	unsigned i;
4457 
4458 	prev_byte = buffer[0];
4459 	buffer[0] >>= offset;
4460 
4461 	for (i = 1; i < length_in_bytes; i++) {
4462 		curr_byte = buffer[i];
4463 		buffer[i] = ((prev_byte & lower_byte_mask) << (8 - offset)) |
4464 				(curr_byte >> offset);
4465 		prev_byte = curr_byte;
4466 	}
4467 }
4468 
4469 static int
4470 test_snow3g_encryption_offset_oop(const struct snow3g_test_data *tdata)
4471 {
4472 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4473 	struct crypto_unittest_params *ut_params = &unittest_params;
4474 	uint8_t *plaintext, *ciphertext;
4475 	int retval;
4476 	uint32_t plaintext_len;
4477 	uint32_t plaintext_pad_len;
4478 	uint8_t extra_offset = 4;
4479 	uint8_t *expected_ciphertext_shifted;
4480 	struct rte_cryptodev_info dev_info;
4481 
4482 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4483 	uint64_t feat_flags = dev_info.feature_flags;
4484 
4485 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4486 			((tdata->validDataLenInBits.len % 8) != 0)) {
4487 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4488 		return TEST_SKIPPED;
4489 	}
4490 
4491 	/* Verify the capabilities */
4492 	struct rte_cryptodev_sym_capability_idx cap_idx;
4493 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4494 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4495 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4496 			&cap_idx) == NULL)
4497 		return TEST_SKIPPED;
4498 
4499 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4500 		return TEST_SKIPPED;
4501 
4502 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4503 		return TEST_SKIPPED;
4504 
4505 	/* Create SNOW 3G session */
4506 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4507 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4508 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4509 					tdata->key.data, tdata->key.len,
4510 					tdata->cipher_iv.len);
4511 	if (retval < 0)
4512 		return retval;
4513 
4514 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4515 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4516 
4517 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4518 			"Failed to allocate input buffer in mempool");
4519 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4520 			"Failed to allocate output buffer in mempool");
4521 
4522 	/* Clear mbuf payload */
4523 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4524 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4525 
4526 	plaintext_len = ceil_byte_length(tdata->plaintext.len + extra_offset);
4527 	/*
4528 	 * Append data which is padded to a
4529 	 * multiple of the algorithms block size
4530 	 */
4531 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4532 
4533 	plaintext = (uint8_t *) rte_pktmbuf_append(ut_params->ibuf,
4534 						plaintext_pad_len);
4535 
4536 	rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
4537 
4538 	memcpy(plaintext, tdata->plaintext.data, (tdata->plaintext.len >> 3));
4539 	buffer_shift_right(plaintext, tdata->plaintext.len, extra_offset);
4540 
4541 #ifdef RTE_APP_TEST_DEBUG
4542 	rte_hexdump(stdout, "plaintext:", plaintext, tdata->plaintext.len);
4543 #endif
4544 	/* Create SNOW 3G operation */
4545 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4546 					tdata->cipher_iv.len,
4547 					tdata->validCipherLenInBits.len,
4548 					extra_offset);
4549 	if (retval < 0)
4550 		return retval;
4551 
4552 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4553 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4554 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4555 	else
4556 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4557 						ut_params->op);
4558 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4559 
4560 	ut_params->obuf = ut_params->op->sym->m_dst;
4561 	if (ut_params->obuf)
4562 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4563 	else
4564 		ciphertext = plaintext;
4565 
4566 #ifdef RTE_APP_TEST_DEBUG
4567 	rte_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4568 #endif
4569 
4570 	expected_ciphertext_shifted = rte_malloc(NULL, plaintext_len, 8);
4571 
4572 	TEST_ASSERT_NOT_NULL(expected_ciphertext_shifted,
4573 			"failed to reserve memory for ciphertext shifted\n");
4574 
4575 	memcpy(expected_ciphertext_shifted, tdata->ciphertext.data,
4576 			ceil_byte_length(tdata->ciphertext.len));
4577 	buffer_shift_right(expected_ciphertext_shifted, tdata->ciphertext.len,
4578 			extra_offset);
4579 	/* Validate obuf */
4580 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
4581 		ciphertext,
4582 		expected_ciphertext_shifted,
4583 		tdata->validDataLenInBits.len,
4584 		extra_offset,
4585 		"SNOW 3G Ciphertext data not as expected");
4586 	return 0;
4587 }
4588 
4589 static int test_snow3g_decryption(const struct snow3g_test_data *tdata)
4590 {
4591 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4592 	struct crypto_unittest_params *ut_params = &unittest_params;
4593 
4594 	int retval;
4595 
4596 	uint8_t *plaintext, *ciphertext;
4597 	unsigned ciphertext_pad_len;
4598 	unsigned ciphertext_len;
4599 	struct rte_cryptodev_info dev_info;
4600 
4601 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4602 	uint64_t feat_flags = dev_info.feature_flags;
4603 
4604 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4605 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4606 		printf("Device doesn't support RAW data-path APIs.\n");
4607 		return TEST_SKIPPED;
4608 	}
4609 
4610 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4611 		return TEST_SKIPPED;
4612 
4613 	/* Verify the capabilities */
4614 	struct rte_cryptodev_sym_capability_idx cap_idx;
4615 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4616 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4617 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4618 			&cap_idx) == NULL)
4619 		return TEST_SKIPPED;
4620 
4621 	/* Create SNOW 3G session */
4622 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4623 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4624 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4625 					tdata->key.data, tdata->key.len,
4626 					tdata->cipher_iv.len);
4627 	if (retval < 0)
4628 		return retval;
4629 
4630 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4631 
4632 	/* Clear mbuf payload */
4633 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4634 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4635 
4636 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4637 	/* Append data which is padded to a multiple of */
4638 	/* the algorithms block size */
4639 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4640 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4641 				ciphertext_pad_len);
4642 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4643 
4644 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4645 
4646 	/* Create SNOW 3G operation */
4647 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
4648 					tdata->cipher_iv.len,
4649 					tdata->validCipherLenInBits.len,
4650 					tdata->cipher.offset_bits);
4651 	if (retval < 0)
4652 		return retval;
4653 
4654 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4655 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4656 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4657 	else
4658 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4659 						ut_params->op);
4660 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4661 	ut_params->obuf = ut_params->op->sym->m_dst;
4662 	if (ut_params->obuf)
4663 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4664 	else
4665 		plaintext = ciphertext;
4666 
4667 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4668 
4669 	/* Validate obuf */
4670 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4671 				tdata->plaintext.data,
4672 				tdata->validDataLenInBits.len,
4673 				"SNOW 3G Plaintext data not as expected");
4674 	return 0;
4675 }
4676 
4677 static int test_snow3g_decryption_oop(const struct snow3g_test_data *tdata)
4678 {
4679 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4680 	struct crypto_unittest_params *ut_params = &unittest_params;
4681 
4682 	int retval;
4683 
4684 	uint8_t *plaintext, *ciphertext;
4685 	unsigned ciphertext_pad_len;
4686 	unsigned ciphertext_len;
4687 	struct rte_cryptodev_info dev_info;
4688 
4689 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4690 	uint64_t feat_flags = dev_info.feature_flags;
4691 
4692 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4693 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4694 		printf("Device does not support RAW data-path APIs.\n");
4695 		return -ENOTSUP;
4696 	}
4697 	/* Verify the capabilities */
4698 	struct rte_cryptodev_sym_capability_idx cap_idx;
4699 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4700 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4701 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4702 			&cap_idx) == NULL)
4703 		return TEST_SKIPPED;
4704 
4705 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4706 		return TEST_SKIPPED;
4707 
4708 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4709 		return TEST_SKIPPED;
4710 
4711 	/* Create SNOW 3G session */
4712 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
4713 					RTE_CRYPTO_CIPHER_OP_DECRYPT,
4714 					RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4715 					tdata->key.data, tdata->key.len,
4716 					tdata->cipher_iv.len);
4717 	if (retval < 0)
4718 		return retval;
4719 
4720 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4721 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4722 
4723 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
4724 			"Failed to allocate input buffer");
4725 	TEST_ASSERT_NOT_NULL(ut_params->obuf,
4726 			"Failed to allocate output buffer");
4727 
4728 	/* Clear mbuf payload */
4729 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4730 	       rte_pktmbuf_tailroom(ut_params->ibuf));
4731 
4732 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
4733 		       rte_pktmbuf_tailroom(ut_params->obuf));
4734 
4735 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
4736 	/* Append data which is padded to a multiple of */
4737 	/* the algorithms block size */
4738 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
4739 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4740 				ciphertext_pad_len);
4741 	rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
4742 	memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
4743 
4744 	debug_hexdump(stdout, "ciphertext:", ciphertext, ciphertext_len);
4745 
4746 	/* Create SNOW 3G operation */
4747 	retval = create_wireless_algo_cipher_operation_oop(tdata->cipher_iv.data,
4748 					tdata->cipher_iv.len,
4749 					tdata->validCipherLenInBits.len,
4750 					0);
4751 	if (retval < 0)
4752 		return retval;
4753 
4754 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4755 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4756 			ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
4757 	else
4758 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4759 						ut_params->op);
4760 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4761 	ut_params->obuf = ut_params->op->sym->m_dst;
4762 	if (ut_params->obuf)
4763 		plaintext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4764 	else
4765 		plaintext = ciphertext;
4766 
4767 	debug_hexdump(stdout, "plaintext:", plaintext, ciphertext_len);
4768 
4769 	/* Validate obuf */
4770 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(plaintext,
4771 				tdata->plaintext.data,
4772 				tdata->validDataLenInBits.len,
4773 				"SNOW 3G Plaintext data not as expected");
4774 	return 0;
4775 }
4776 
4777 static int
4778 test_zuc_cipher_auth(const struct wireless_test_data *tdata)
4779 {
4780 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4781 	struct crypto_unittest_params *ut_params = &unittest_params;
4782 
4783 	int retval;
4784 
4785 	uint8_t *plaintext, *ciphertext;
4786 	unsigned int plaintext_pad_len;
4787 	unsigned int plaintext_len;
4788 
4789 	struct rte_cryptodev_info dev_info;
4790 	struct rte_cryptodev_sym_capability_idx cap_idx;
4791 
4792 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4793 	uint64_t feat_flags = dev_info.feature_flags;
4794 
4795 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
4796 			((tdata->validAuthLenInBits.len % 8 != 0) ||
4797 			(tdata->validDataLenInBits.len % 8 != 0))) {
4798 		printf("Device doesn't support NON-Byte Aligned Data.\n");
4799 		return TEST_SKIPPED;
4800 	}
4801 
4802 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4803 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4804 		printf("Device doesn't support RAW data-path APIs.\n");
4805 		return TEST_SKIPPED;
4806 	}
4807 
4808 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4809 		return TEST_SKIPPED;
4810 
4811 	/* Check if device supports ZUC EEA3 */
4812 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4813 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_ZUC_EEA3;
4814 
4815 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4816 			&cap_idx) == NULL)
4817 		return TEST_SKIPPED;
4818 
4819 	/* Check if device supports ZUC EIA3 */
4820 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4821 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_ZUC_EIA3;
4822 
4823 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4824 			&cap_idx) == NULL)
4825 		return TEST_SKIPPED;
4826 
4827 	/* Create ZUC session */
4828 	retval = create_zuc_cipher_auth_encrypt_generate_session(
4829 			ts_params->valid_devs[0],
4830 			tdata);
4831 	if (retval != 0)
4832 		return retval;
4833 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4834 
4835 	/* clear mbuf payload */
4836 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4837 			rte_pktmbuf_tailroom(ut_params->ibuf));
4838 
4839 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4840 	/* Append data which is padded to a multiple of */
4841 	/* the algorithms block size */
4842 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4843 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4844 				plaintext_pad_len);
4845 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4846 
4847 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4848 
4849 	/* Create ZUC operation */
4850 	retval = create_zuc_cipher_hash_generate_operation(tdata);
4851 	if (retval < 0)
4852 		return retval;
4853 
4854 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4855 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4856 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4857 	else
4858 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4859 			ut_params->op);
4860 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4861 	ut_params->obuf = ut_params->op->sym->m_src;
4862 	if (ut_params->obuf)
4863 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4864 	else
4865 		ciphertext = plaintext;
4866 
4867 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4868 	/* Validate obuf */
4869 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4870 			ciphertext,
4871 			tdata->ciphertext.data,
4872 			tdata->validDataLenInBits.len,
4873 			"ZUC Ciphertext data not as expected");
4874 
4875 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4876 	    + plaintext_pad_len;
4877 
4878 	/* Validate obuf */
4879 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4880 			ut_params->digest,
4881 			tdata->digest.data,
4882 			4,
4883 			"ZUC Generated auth tag not as expected");
4884 	return 0;
4885 }
4886 
4887 static int
4888 test_snow3g_cipher_auth(const struct snow3g_test_data *tdata)
4889 {
4890 	struct crypto_testsuite_params *ts_params = &testsuite_params;
4891 	struct crypto_unittest_params *ut_params = &unittest_params;
4892 
4893 	int retval;
4894 
4895 	uint8_t *plaintext, *ciphertext;
4896 	unsigned plaintext_pad_len;
4897 	unsigned plaintext_len;
4898 	struct rte_cryptodev_info dev_info;
4899 
4900 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
4901 	uint64_t feat_flags = dev_info.feature_flags;
4902 
4903 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
4904 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
4905 		printf("Device doesn't support RAW data-path APIs.\n");
4906 		return TEST_SKIPPED;
4907 	}
4908 
4909 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
4910 		return TEST_SKIPPED;
4911 
4912 	/* Verify the capabilities */
4913 	struct rte_cryptodev_sym_capability_idx cap_idx;
4914 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
4915 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
4916 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4917 			&cap_idx) == NULL)
4918 		return TEST_SKIPPED;
4919 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
4920 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
4921 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
4922 			&cap_idx) == NULL)
4923 		return TEST_SKIPPED;
4924 
4925 	/* Create SNOW 3G session */
4926 	retval = create_wireless_algo_cipher_auth_session(ts_params->valid_devs[0],
4927 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
4928 			RTE_CRYPTO_AUTH_OP_GENERATE,
4929 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
4930 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
4931 			tdata->key.data, tdata->key.len,
4932 			tdata->auth_iv.len, tdata->digest.len,
4933 			tdata->cipher_iv.len);
4934 	if (retval != 0)
4935 		return retval;
4936 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
4937 
4938 	/* clear mbuf payload */
4939 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
4940 			rte_pktmbuf_tailroom(ut_params->ibuf));
4941 
4942 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
4943 	/* Append data which is padded to a multiple of */
4944 	/* the algorithms block size */
4945 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
4946 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
4947 				plaintext_pad_len);
4948 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
4949 
4950 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
4951 
4952 	/* Create SNOW 3G operation */
4953 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
4954 			tdata->digest.len, tdata->auth_iv.data,
4955 			tdata->auth_iv.len,
4956 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
4957 			tdata->cipher_iv.data, tdata->cipher_iv.len,
4958 			tdata->validCipherLenInBits.len,
4959 			0,
4960 			tdata->validAuthLenInBits.len,
4961 			0
4962 			);
4963 	if (retval < 0)
4964 		return retval;
4965 
4966 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
4967 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
4968 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
4969 	else
4970 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
4971 			ut_params->op);
4972 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
4973 	ut_params->obuf = ut_params->op->sym->m_src;
4974 	if (ut_params->obuf)
4975 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
4976 	else
4977 		ciphertext = plaintext;
4978 
4979 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
4980 	/* Validate obuf */
4981 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
4982 			ciphertext,
4983 			tdata->ciphertext.data,
4984 			tdata->validDataLenInBits.len,
4985 			"SNOW 3G Ciphertext data not as expected");
4986 
4987 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
4988 	    + plaintext_pad_len;
4989 
4990 	/* Validate obuf */
4991 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
4992 			ut_params->digest,
4993 			tdata->digest.data,
4994 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
4995 			"SNOW 3G Generated auth tag not as expected");
4996 	return 0;
4997 }
4998 
4999 static int
5000 test_snow3g_auth_cipher(const struct snow3g_test_data *tdata,
5001 	uint8_t op_mode, uint8_t verify)
5002 {
5003 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5004 	struct crypto_unittest_params *ut_params = &unittest_params;
5005 
5006 	int retval;
5007 
5008 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5009 	unsigned int plaintext_pad_len;
5010 	unsigned int plaintext_len;
5011 	unsigned int ciphertext_pad_len;
5012 	unsigned int ciphertext_len;
5013 
5014 	struct rte_cryptodev_info dev_info;
5015 
5016 	/* Verify the capabilities */
5017 	struct rte_cryptodev_sym_capability_idx cap_idx;
5018 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5019 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5020 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5021 			&cap_idx) == NULL)
5022 		return TEST_SKIPPED;
5023 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5024 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5025 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5026 			&cap_idx) == NULL)
5027 		return TEST_SKIPPED;
5028 
5029 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5030 		return TEST_SKIPPED;
5031 
5032 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5033 
5034 	uint64_t feat_flags = dev_info.feature_flags;
5035 
5036 	if (op_mode == OUT_OF_PLACE) {
5037 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5038 			printf("Device doesn't support digest encrypted.\n");
5039 			return TEST_SKIPPED;
5040 		}
5041 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5042 			return TEST_SKIPPED;
5043 	}
5044 
5045 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5046 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5047 		printf("Device doesn't support RAW data-path APIs.\n");
5048 		return TEST_SKIPPED;
5049 	}
5050 
5051 	/* Create SNOW 3G session */
5052 	retval = create_wireless_algo_auth_cipher_session(
5053 			ts_params->valid_devs[0],
5054 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5055 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5056 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5057 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5058 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5059 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5060 			tdata->key.data, tdata->key.len,
5061 			tdata->auth_iv.len, tdata->digest.len,
5062 			tdata->cipher_iv.len);
5063 	if (retval != 0)
5064 		return retval;
5065 
5066 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5067 	if (op_mode == OUT_OF_PLACE)
5068 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5069 
5070 	/* clear mbuf payload */
5071 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5072 		rte_pktmbuf_tailroom(ut_params->ibuf));
5073 	if (op_mode == OUT_OF_PLACE)
5074 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5075 			rte_pktmbuf_tailroom(ut_params->obuf));
5076 
5077 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5078 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5079 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5080 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5081 
5082 	if (verify) {
5083 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5084 					ciphertext_pad_len);
5085 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5086 		if (op_mode == OUT_OF_PLACE)
5087 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5088 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5089 			ciphertext_len);
5090 	} else {
5091 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5092 					plaintext_pad_len);
5093 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5094 		if (op_mode == OUT_OF_PLACE)
5095 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5096 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5097 	}
5098 
5099 	/* Create SNOW 3G operation */
5100 	retval = create_wireless_algo_auth_cipher_operation(
5101 		tdata->digest.data, tdata->digest.len,
5102 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5103 		tdata->auth_iv.data, tdata->auth_iv.len,
5104 		(tdata->digest.offset_bytes == 0 ?
5105 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5106 			: tdata->digest.offset_bytes),
5107 		tdata->validCipherLenInBits.len,
5108 		tdata->cipher.offset_bits,
5109 		tdata->validAuthLenInBits.len,
5110 		tdata->auth.offset_bits,
5111 		op_mode, 0, verify);
5112 
5113 	if (retval < 0)
5114 		return retval;
5115 
5116 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5117 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5118 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5119 	else
5120 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5121 			ut_params->op);
5122 
5123 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5124 
5125 	ut_params->obuf = (op_mode == IN_PLACE ?
5126 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5127 
5128 	if (verify) {
5129 		if (ut_params->obuf)
5130 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5131 							uint8_t *);
5132 		else
5133 			plaintext = ciphertext +
5134 				(tdata->cipher.offset_bits >> 3);
5135 
5136 		debug_hexdump(stdout, "plaintext:", plaintext,
5137 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5138 		debug_hexdump(stdout, "plaintext expected:",
5139 			tdata->plaintext.data,
5140 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5141 	} else {
5142 		if (ut_params->obuf)
5143 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5144 							uint8_t *);
5145 		else
5146 			ciphertext = plaintext;
5147 
5148 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5149 			ciphertext_len);
5150 		debug_hexdump(stdout, "ciphertext expected:",
5151 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5152 
5153 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5154 			+ (tdata->digest.offset_bytes == 0 ?
5155 		plaintext_pad_len : tdata->digest.offset_bytes);
5156 
5157 		debug_hexdump(stdout, "digest:", ut_params->digest,
5158 			tdata->digest.len);
5159 		debug_hexdump(stdout, "digest expected:", tdata->digest.data,
5160 				tdata->digest.len);
5161 	}
5162 
5163 	/* Validate obuf */
5164 	if (verify) {
5165 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5166 			plaintext,
5167 			tdata->plaintext.data,
5168 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5169 			 (tdata->digest.len << 3)),
5170 			tdata->cipher.offset_bits,
5171 			"SNOW 3G Plaintext data not as expected");
5172 	} else {
5173 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5174 			ciphertext,
5175 			tdata->ciphertext.data,
5176 			(tdata->validDataLenInBits.len -
5177 			 tdata->cipher.offset_bits),
5178 			tdata->cipher.offset_bits,
5179 			"SNOW 3G Ciphertext data not as expected");
5180 
5181 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5182 			ut_params->digest,
5183 			tdata->digest.data,
5184 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5185 			"SNOW 3G Generated auth tag not as expected");
5186 	}
5187 	return 0;
5188 }
5189 
5190 static int
5191 test_snow3g_auth_cipher_sgl(const struct snow3g_test_data *tdata,
5192 	uint8_t op_mode, uint8_t verify)
5193 {
5194 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5195 	struct crypto_unittest_params *ut_params = &unittest_params;
5196 
5197 	int retval;
5198 
5199 	const uint8_t *plaintext = NULL;
5200 	const uint8_t *ciphertext = NULL;
5201 	const uint8_t *digest = NULL;
5202 	unsigned int plaintext_pad_len;
5203 	unsigned int plaintext_len;
5204 	unsigned int ciphertext_pad_len;
5205 	unsigned int ciphertext_len;
5206 	uint8_t buffer[10000];
5207 	uint8_t digest_buffer[10000];
5208 
5209 	struct rte_cryptodev_info dev_info;
5210 
5211 	/* Verify the capabilities */
5212 	struct rte_cryptodev_sym_capability_idx cap_idx;
5213 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5214 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SNOW3G_UIA2;
5215 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5216 			&cap_idx) == NULL)
5217 		return TEST_SKIPPED;
5218 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5219 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_SNOW3G_UEA2;
5220 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5221 			&cap_idx) == NULL)
5222 		return TEST_SKIPPED;
5223 
5224 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5225 		return TEST_SKIPPED;
5226 
5227 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5228 
5229 	uint64_t feat_flags = dev_info.feature_flags;
5230 
5231 	if (op_mode == IN_PLACE) {
5232 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5233 			printf("Device doesn't support in-place scatter-gather "
5234 					"in both input and output mbufs.\n");
5235 			return TEST_SKIPPED;
5236 		}
5237 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5238 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5239 			printf("Device doesn't support RAW data-path APIs.\n");
5240 			return TEST_SKIPPED;
5241 		}
5242 	} else {
5243 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5244 			return TEST_SKIPPED;
5245 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5246 			printf("Device doesn't support out-of-place scatter-gather "
5247 					"in both input and output mbufs.\n");
5248 			return TEST_SKIPPED;
5249 		}
5250 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5251 			printf("Device doesn't support digest encrypted.\n");
5252 			return TEST_SKIPPED;
5253 		}
5254 	}
5255 
5256 	/* Create SNOW 3G session */
5257 	retval = create_wireless_algo_auth_cipher_session(
5258 			ts_params->valid_devs[0],
5259 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5260 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5261 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5262 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5263 			RTE_CRYPTO_AUTH_SNOW3G_UIA2,
5264 			RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
5265 			tdata->key.data, tdata->key.len,
5266 			tdata->auth_iv.len, tdata->digest.len,
5267 			tdata->cipher_iv.len);
5268 
5269 	if (retval != 0)
5270 		return retval;
5271 
5272 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5273 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5274 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5275 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5276 
5277 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5278 			plaintext_pad_len, 15, 0);
5279 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5280 			"Failed to allocate input buffer in mempool");
5281 
5282 	if (op_mode == OUT_OF_PLACE) {
5283 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5284 				plaintext_pad_len, 15, 0);
5285 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5286 				"Failed to allocate output buffer in mempool");
5287 	}
5288 
5289 	if (verify) {
5290 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5291 			tdata->ciphertext.data);
5292 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5293 					ciphertext_len, buffer);
5294 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5295 			ciphertext_len);
5296 	} else {
5297 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5298 			tdata->plaintext.data);
5299 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5300 					plaintext_len, buffer);
5301 		debug_hexdump(stdout, "plaintext:", plaintext,
5302 			plaintext_len);
5303 	}
5304 	memset(buffer, 0, sizeof(buffer));
5305 
5306 	/* Create SNOW 3G operation */
5307 	retval = create_wireless_algo_auth_cipher_operation(
5308 		tdata->digest.data, tdata->digest.len,
5309 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5310 		tdata->auth_iv.data, tdata->auth_iv.len,
5311 		(tdata->digest.offset_bytes == 0 ?
5312 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5313 			: tdata->digest.offset_bytes),
5314 		tdata->validCipherLenInBits.len,
5315 		tdata->cipher.offset_bits,
5316 		tdata->validAuthLenInBits.len,
5317 		tdata->auth.offset_bits,
5318 		op_mode, 1, verify);
5319 
5320 	if (retval < 0)
5321 		return retval;
5322 
5323 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5324 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5325 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5326 	else
5327 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5328 			ut_params->op);
5329 
5330 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5331 
5332 	ut_params->obuf = (op_mode == IN_PLACE ?
5333 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5334 
5335 	if (verify) {
5336 		if (ut_params->obuf)
5337 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5338 					plaintext_len, buffer);
5339 		else
5340 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5341 					plaintext_len, buffer);
5342 
5343 		debug_hexdump(stdout, "plaintext:", plaintext,
5344 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5345 		debug_hexdump(stdout, "plaintext expected:",
5346 			tdata->plaintext.data,
5347 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5348 	} else {
5349 		if (ut_params->obuf)
5350 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5351 					ciphertext_len, buffer);
5352 		else
5353 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5354 					ciphertext_len, buffer);
5355 
5356 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5357 			ciphertext_len);
5358 		debug_hexdump(stdout, "ciphertext expected:",
5359 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5360 
5361 		if (ut_params->obuf)
5362 			digest = rte_pktmbuf_read(ut_params->obuf,
5363 				(tdata->digest.offset_bytes == 0 ?
5364 				plaintext_pad_len : tdata->digest.offset_bytes),
5365 				tdata->digest.len, digest_buffer);
5366 		else
5367 			digest = rte_pktmbuf_read(ut_params->ibuf,
5368 				(tdata->digest.offset_bytes == 0 ?
5369 				plaintext_pad_len : tdata->digest.offset_bytes),
5370 				tdata->digest.len, digest_buffer);
5371 
5372 		debug_hexdump(stdout, "digest:", digest,
5373 			tdata->digest.len);
5374 		debug_hexdump(stdout, "digest expected:",
5375 			tdata->digest.data, tdata->digest.len);
5376 	}
5377 
5378 	/* Validate obuf */
5379 	if (verify) {
5380 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5381 			plaintext,
5382 			tdata->plaintext.data,
5383 			(tdata->plaintext.len - tdata->cipher.offset_bits -
5384 			 (tdata->digest.len << 3)),
5385 			tdata->cipher.offset_bits,
5386 			"SNOW 3G Plaintext data not as expected");
5387 	} else {
5388 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(
5389 			ciphertext,
5390 			tdata->ciphertext.data,
5391 			(tdata->validDataLenInBits.len -
5392 			 tdata->cipher.offset_bits),
5393 			tdata->cipher.offset_bits,
5394 			"SNOW 3G Ciphertext data not as expected");
5395 
5396 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5397 			digest,
5398 			tdata->digest.data,
5399 			DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5400 			"SNOW 3G Generated auth tag not as expected");
5401 	}
5402 	return 0;
5403 }
5404 
5405 static int
5406 test_kasumi_auth_cipher(const struct kasumi_test_data *tdata,
5407 	uint8_t op_mode, uint8_t verify)
5408 {
5409 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5410 	struct crypto_unittest_params *ut_params = &unittest_params;
5411 
5412 	int retval;
5413 
5414 	uint8_t *plaintext = NULL, *ciphertext = NULL;
5415 	unsigned int plaintext_pad_len;
5416 	unsigned int plaintext_len;
5417 	unsigned int ciphertext_pad_len;
5418 	unsigned int ciphertext_len;
5419 
5420 	struct rte_cryptodev_info dev_info;
5421 
5422 	/* Verify the capabilities */
5423 	struct rte_cryptodev_sym_capability_idx cap_idx;
5424 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5425 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5426 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5427 			&cap_idx) == NULL)
5428 		return TEST_SKIPPED;
5429 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5430 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5431 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5432 			&cap_idx) == NULL)
5433 		return TEST_SKIPPED;
5434 
5435 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5436 
5437 	uint64_t feat_flags = dev_info.feature_flags;
5438 
5439 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5440 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5441 		printf("Device doesn't support RAW data-path APIs.\n");
5442 		return TEST_SKIPPED;
5443 	}
5444 
5445 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5446 		return TEST_SKIPPED;
5447 
5448 	if (op_mode == OUT_OF_PLACE) {
5449 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5450 			return TEST_SKIPPED;
5451 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5452 			printf("Device doesn't support digest encrypted.\n");
5453 			return TEST_SKIPPED;
5454 		}
5455 	}
5456 
5457 	/* Create KASUMI session */
5458 	retval = create_wireless_algo_auth_cipher_session(
5459 			ts_params->valid_devs[0],
5460 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5461 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5462 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5463 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5464 			RTE_CRYPTO_AUTH_KASUMI_F9,
5465 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5466 			tdata->key.data, tdata->key.len,
5467 			0, tdata->digest.len,
5468 			tdata->cipher_iv.len);
5469 
5470 	if (retval != 0)
5471 		return retval;
5472 
5473 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5474 	if (op_mode == OUT_OF_PLACE)
5475 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5476 
5477 	/* clear mbuf payload */
5478 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5479 		rte_pktmbuf_tailroom(ut_params->ibuf));
5480 	if (op_mode == OUT_OF_PLACE)
5481 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
5482 			rte_pktmbuf_tailroom(ut_params->obuf));
5483 
5484 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5485 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5486 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5487 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5488 
5489 	if (verify) {
5490 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5491 					ciphertext_pad_len);
5492 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
5493 		if (op_mode == OUT_OF_PLACE)
5494 			rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
5495 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5496 			ciphertext_len);
5497 	} else {
5498 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5499 					plaintext_pad_len);
5500 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5501 		if (op_mode == OUT_OF_PLACE)
5502 			rte_pktmbuf_append(ut_params->obuf, plaintext_pad_len);
5503 		debug_hexdump(stdout, "plaintext:", plaintext,
5504 			plaintext_len);
5505 	}
5506 
5507 	/* Create KASUMI operation */
5508 	retval = create_wireless_algo_auth_cipher_operation(
5509 		tdata->digest.data, tdata->digest.len,
5510 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5511 		NULL, 0,
5512 		(tdata->digest.offset_bytes == 0 ?
5513 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5514 			: tdata->digest.offset_bytes),
5515 		tdata->validCipherLenInBits.len,
5516 		tdata->validCipherOffsetInBits.len,
5517 		tdata->validAuthLenInBits.len,
5518 		0,
5519 		op_mode, 0, verify);
5520 
5521 	if (retval < 0)
5522 		return retval;
5523 
5524 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5525 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5526 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5527 	else
5528 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5529 			ut_params->op);
5530 
5531 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5532 
5533 	ut_params->obuf = (op_mode == IN_PLACE ?
5534 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5535 
5536 
5537 	if (verify) {
5538 		if (ut_params->obuf)
5539 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
5540 							uint8_t *);
5541 		else
5542 			plaintext = ciphertext;
5543 
5544 		debug_hexdump(stdout, "plaintext:", plaintext,
5545 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5546 		debug_hexdump(stdout, "plaintext expected:",
5547 			tdata->plaintext.data,
5548 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5549 	} else {
5550 		if (ut_params->obuf)
5551 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
5552 							uint8_t *);
5553 		else
5554 			ciphertext = plaintext;
5555 
5556 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5557 			ciphertext_len);
5558 		debug_hexdump(stdout, "ciphertext expected:",
5559 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5560 
5561 		ut_params->digest = rte_pktmbuf_mtod(
5562 			ut_params->obuf, uint8_t *) +
5563 			(tdata->digest.offset_bytes == 0 ?
5564 			plaintext_pad_len : tdata->digest.offset_bytes);
5565 
5566 		debug_hexdump(stdout, "digest:", ut_params->digest,
5567 			tdata->digest.len);
5568 		debug_hexdump(stdout, "digest expected:",
5569 			tdata->digest.data, tdata->digest.len);
5570 	}
5571 
5572 	/* Validate obuf */
5573 	if (verify) {
5574 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5575 			plaintext,
5576 			tdata->plaintext.data,
5577 			tdata->plaintext.len >> 3,
5578 			"KASUMI Plaintext data not as expected");
5579 	} else {
5580 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5581 			ciphertext,
5582 			tdata->ciphertext.data,
5583 			tdata->ciphertext.len >> 3,
5584 			"KASUMI Ciphertext data not as expected");
5585 
5586 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5587 			ut_params->digest,
5588 			tdata->digest.data,
5589 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5590 			"KASUMI Generated auth tag not as expected");
5591 	}
5592 	return 0;
5593 }
5594 
5595 static int
5596 test_kasumi_auth_cipher_sgl(const struct kasumi_test_data *tdata,
5597 	uint8_t op_mode, uint8_t verify)
5598 {
5599 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5600 	struct crypto_unittest_params *ut_params = &unittest_params;
5601 
5602 	int retval;
5603 
5604 	const uint8_t *plaintext = NULL;
5605 	const uint8_t *ciphertext = NULL;
5606 	const uint8_t *digest = NULL;
5607 	unsigned int plaintext_pad_len;
5608 	unsigned int plaintext_len;
5609 	unsigned int ciphertext_pad_len;
5610 	unsigned int ciphertext_len;
5611 	uint8_t buffer[10000];
5612 	uint8_t digest_buffer[10000];
5613 
5614 	struct rte_cryptodev_info dev_info;
5615 
5616 	/* Verify the capabilities */
5617 	struct rte_cryptodev_sym_capability_idx cap_idx;
5618 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5619 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5620 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5621 			&cap_idx) == NULL)
5622 		return TEST_SKIPPED;
5623 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5624 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5625 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5626 			&cap_idx) == NULL)
5627 		return TEST_SKIPPED;
5628 
5629 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5630 		return TEST_SKIPPED;
5631 
5632 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5633 
5634 	uint64_t feat_flags = dev_info.feature_flags;
5635 
5636 	if (op_mode == IN_PLACE) {
5637 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
5638 			printf("Device doesn't support in-place scatter-gather "
5639 					"in both input and output mbufs.\n");
5640 			return TEST_SKIPPED;
5641 		}
5642 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5643 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5644 			printf("Device doesn't support RAW data-path APIs.\n");
5645 			return TEST_SKIPPED;
5646 		}
5647 	} else {
5648 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5649 			return TEST_SKIPPED;
5650 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
5651 			printf("Device doesn't support out-of-place scatter-gather "
5652 					"in both input and output mbufs.\n");
5653 			return TEST_SKIPPED;
5654 		}
5655 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
5656 			printf("Device doesn't support digest encrypted.\n");
5657 			return TEST_SKIPPED;
5658 		}
5659 	}
5660 
5661 	/* Create KASUMI session */
5662 	retval = create_wireless_algo_auth_cipher_session(
5663 			ts_params->valid_devs[0],
5664 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
5665 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
5666 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
5667 					: RTE_CRYPTO_AUTH_OP_GENERATE),
5668 			RTE_CRYPTO_AUTH_KASUMI_F9,
5669 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5670 			tdata->key.data, tdata->key.len,
5671 			0, tdata->digest.len,
5672 			tdata->cipher_iv.len);
5673 
5674 	if (retval != 0)
5675 		return retval;
5676 
5677 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
5678 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5679 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
5680 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5681 
5682 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
5683 			plaintext_pad_len, 15, 0);
5684 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
5685 			"Failed to allocate input buffer in mempool");
5686 
5687 	if (op_mode == OUT_OF_PLACE) {
5688 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
5689 				plaintext_pad_len, 15, 0);
5690 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
5691 				"Failed to allocate output buffer in mempool");
5692 	}
5693 
5694 	if (verify) {
5695 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
5696 			tdata->ciphertext.data);
5697 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5698 					ciphertext_len, buffer);
5699 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5700 			ciphertext_len);
5701 	} else {
5702 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
5703 			tdata->plaintext.data);
5704 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5705 					plaintext_len, buffer);
5706 		debug_hexdump(stdout, "plaintext:", plaintext,
5707 			plaintext_len);
5708 	}
5709 	memset(buffer, 0, sizeof(buffer));
5710 
5711 	/* Create KASUMI operation */
5712 	retval = create_wireless_algo_auth_cipher_operation(
5713 		tdata->digest.data, tdata->digest.len,
5714 		tdata->cipher_iv.data, tdata->cipher_iv.len,
5715 		NULL, 0,
5716 		(tdata->digest.offset_bytes == 0 ?
5717 		(verify ? ciphertext_pad_len : plaintext_pad_len)
5718 			: tdata->digest.offset_bytes),
5719 		tdata->validCipherLenInBits.len,
5720 		tdata->validCipherOffsetInBits.len,
5721 		tdata->validAuthLenInBits.len,
5722 		0,
5723 		op_mode, 1, verify);
5724 
5725 	if (retval < 0)
5726 		return retval;
5727 
5728 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5729 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5730 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5731 	else
5732 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5733 			ut_params->op);
5734 
5735 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5736 
5737 	ut_params->obuf = (op_mode == IN_PLACE ?
5738 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
5739 
5740 	if (verify) {
5741 		if (ut_params->obuf)
5742 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
5743 					plaintext_len, buffer);
5744 		else
5745 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
5746 					plaintext_len, buffer);
5747 
5748 		debug_hexdump(stdout, "plaintext:", plaintext,
5749 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5750 		debug_hexdump(stdout, "plaintext expected:",
5751 			tdata->plaintext.data,
5752 			(tdata->plaintext.len >> 3) - tdata->digest.len);
5753 	} else {
5754 		if (ut_params->obuf)
5755 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
5756 					ciphertext_len, buffer);
5757 		else
5758 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
5759 					ciphertext_len, buffer);
5760 
5761 		debug_hexdump(stdout, "ciphertext:", ciphertext,
5762 			ciphertext_len);
5763 		debug_hexdump(stdout, "ciphertext expected:",
5764 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
5765 
5766 		if (ut_params->obuf)
5767 			digest = rte_pktmbuf_read(ut_params->obuf,
5768 				(tdata->digest.offset_bytes == 0 ?
5769 				plaintext_pad_len : tdata->digest.offset_bytes),
5770 				tdata->digest.len, digest_buffer);
5771 		else
5772 			digest = rte_pktmbuf_read(ut_params->ibuf,
5773 				(tdata->digest.offset_bytes == 0 ?
5774 				plaintext_pad_len : tdata->digest.offset_bytes),
5775 				tdata->digest.len, digest_buffer);
5776 
5777 		debug_hexdump(stdout, "digest:", digest,
5778 			tdata->digest.len);
5779 		debug_hexdump(stdout, "digest expected:",
5780 			tdata->digest.data, tdata->digest.len);
5781 	}
5782 
5783 	/* Validate obuf */
5784 	if (verify) {
5785 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5786 			plaintext,
5787 			tdata->plaintext.data,
5788 			tdata->plaintext.len >> 3,
5789 			"KASUMI Plaintext data not as expected");
5790 	} else {
5791 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5792 			ciphertext,
5793 			tdata->ciphertext.data,
5794 			tdata->validDataLenInBits.len,
5795 			"KASUMI Ciphertext data not as expected");
5796 
5797 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
5798 			digest,
5799 			tdata->digest.data,
5800 			DIGEST_BYTE_LENGTH_KASUMI_F9,
5801 			"KASUMI Generated auth tag not as expected");
5802 	}
5803 	return 0;
5804 }
5805 
5806 static int
5807 test_kasumi_cipher_auth(const struct kasumi_test_data *tdata)
5808 {
5809 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5810 	struct crypto_unittest_params *ut_params = &unittest_params;
5811 
5812 	int retval;
5813 
5814 	uint8_t *plaintext, *ciphertext;
5815 	unsigned plaintext_pad_len;
5816 	unsigned plaintext_len;
5817 	struct rte_cryptodev_info dev_info;
5818 
5819 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5820 	uint64_t feat_flags = dev_info.feature_flags;
5821 
5822 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5823 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5824 		printf("Device doesn't support RAW data-path APIs.\n");
5825 		return TEST_SKIPPED;
5826 	}
5827 
5828 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
5829 		return TEST_SKIPPED;
5830 
5831 	/* Verify the capabilities */
5832 	struct rte_cryptodev_sym_capability_idx cap_idx;
5833 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5834 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_KASUMI_F9;
5835 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5836 			&cap_idx) == NULL)
5837 		return TEST_SKIPPED;
5838 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5839 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_KASUMI_F8;
5840 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5841 			&cap_idx) == NULL)
5842 		return TEST_SKIPPED;
5843 
5844 	/* Create KASUMI session */
5845 	retval = create_wireless_algo_cipher_auth_session(
5846 			ts_params->valid_devs[0],
5847 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
5848 			RTE_CRYPTO_AUTH_OP_GENERATE,
5849 			RTE_CRYPTO_AUTH_KASUMI_F9,
5850 			RTE_CRYPTO_CIPHER_KASUMI_F8,
5851 			tdata->key.data, tdata->key.len,
5852 			0, tdata->digest.len,
5853 			tdata->cipher_iv.len);
5854 	if (retval != 0)
5855 		return retval;
5856 
5857 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
5858 
5859 	/* clear mbuf payload */
5860 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
5861 			rte_pktmbuf_tailroom(ut_params->ibuf));
5862 
5863 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
5864 	/* Append data which is padded to a multiple of */
5865 	/* the algorithms block size */
5866 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
5867 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
5868 				plaintext_pad_len);
5869 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
5870 
5871 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
5872 
5873 	/* Create KASUMI operation */
5874 	retval = create_wireless_algo_cipher_hash_operation(tdata->digest.data,
5875 				tdata->digest.len, NULL, 0,
5876 				plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
5877 				tdata->cipher_iv.data, tdata->cipher_iv.len,
5878 				RTE_ALIGN_CEIL(tdata->validCipherLenInBits.len, 8),
5879 				tdata->validCipherOffsetInBits.len,
5880 				tdata->validAuthLenInBits.len,
5881 				0
5882 				);
5883 	if (retval < 0)
5884 		return retval;
5885 
5886 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
5887 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
5888 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
5889 	else
5890 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
5891 			ut_params->op);
5892 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
5893 
5894 	if (ut_params->op->sym->m_dst)
5895 		ut_params->obuf = ut_params->op->sym->m_dst;
5896 	else
5897 		ut_params->obuf = ut_params->op->sym->m_src;
5898 
5899 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
5900 				tdata->validCipherOffsetInBits.len >> 3);
5901 
5902 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
5903 			+ plaintext_pad_len;
5904 
5905 	const uint8_t *reference_ciphertext = tdata->ciphertext.data +
5906 				(tdata->validCipherOffsetInBits.len >> 3);
5907 	/* Validate obuf */
5908 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
5909 		ciphertext,
5910 		reference_ciphertext,
5911 		tdata->validCipherLenInBits.len,
5912 		"KASUMI Ciphertext data not as expected");
5913 
5914 	/* Validate obuf */
5915 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
5916 		ut_params->digest,
5917 		tdata->digest.data,
5918 		DIGEST_BYTE_LENGTH_SNOW3G_UIA2,
5919 		"KASUMI Generated auth tag not as expected");
5920 	return 0;
5921 }
5922 
5923 static int
5924 check_cipher_capability(const struct crypto_testsuite_params *ts_params,
5925 			const enum rte_crypto_cipher_algorithm cipher_algo,
5926 			const uint16_t key_size, const uint16_t iv_size)
5927 {
5928 	struct rte_cryptodev_sym_capability_idx cap_idx;
5929 	const struct rte_cryptodev_symmetric_capability *cap;
5930 
5931 	/* Check if device supports the algorithm */
5932 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
5933 	cap_idx.algo.cipher = cipher_algo;
5934 
5935 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5936 			&cap_idx);
5937 
5938 	if (cap == NULL)
5939 		return -1;
5940 
5941 	/* Check if device supports key size and IV size */
5942 	if (rte_cryptodev_sym_capability_check_cipher(cap, key_size,
5943 			iv_size) < 0) {
5944 		return -1;
5945 	}
5946 
5947 	return 0;
5948 }
5949 
5950 static int
5951 check_auth_capability(const struct crypto_testsuite_params *ts_params,
5952 			const enum rte_crypto_auth_algorithm auth_algo,
5953 			const uint16_t key_size, const uint16_t iv_size,
5954 			const uint16_t tag_size)
5955 {
5956 	struct rte_cryptodev_sym_capability_idx cap_idx;
5957 	const struct rte_cryptodev_symmetric_capability *cap;
5958 
5959 	/* Check if device supports the algorithm */
5960 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
5961 	cap_idx.algo.auth = auth_algo;
5962 
5963 	cap = rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
5964 			&cap_idx);
5965 
5966 	if (cap == NULL)
5967 		return -1;
5968 
5969 	/* Check if device supports key size and IV size */
5970 	if (rte_cryptodev_sym_capability_check_auth(cap, key_size,
5971 			tag_size, iv_size) < 0) {
5972 		return -1;
5973 	}
5974 
5975 	return 0;
5976 }
5977 
5978 static int
5979 test_zuc_encryption(const struct wireless_test_data *tdata)
5980 {
5981 	struct crypto_testsuite_params *ts_params = &testsuite_params;
5982 	struct crypto_unittest_params *ut_params = &unittest_params;
5983 
5984 	int retval;
5985 	uint8_t *plaintext, *ciphertext;
5986 	unsigned plaintext_pad_len;
5987 	unsigned plaintext_len;
5988 	struct rte_cryptodev_info dev_info;
5989 
5990 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
5991 	uint64_t feat_flags = dev_info.feature_flags;
5992 
5993 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
5994 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
5995 		printf("Device doesn't support RAW data-path APIs.\n");
5996 		return TEST_SKIPPED;
5997 	}
5998 
5999 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6000 		return TEST_SKIPPED;
6001 
6002 	/* Check if device supports ZUC EEA3 */
6003 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6004 			tdata->key.len, tdata->cipher_iv.len) < 0)
6005 		return TEST_SKIPPED;
6006 
6007 	/* Create ZUC session */
6008 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6009 					RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6010 					RTE_CRYPTO_CIPHER_ZUC_EEA3,
6011 					tdata->key.data, tdata->key.len,
6012 					tdata->cipher_iv.len);
6013 	if (retval != 0)
6014 		return retval;
6015 
6016 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6017 
6018 	/* Clear mbuf payload */
6019 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6020 	       rte_pktmbuf_tailroom(ut_params->ibuf));
6021 
6022 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6023 	/* Append data which is padded to a multiple */
6024 	/* of the algorithms block size */
6025 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6026 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6027 				plaintext_pad_len);
6028 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6029 
6030 	debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
6031 
6032 	/* Create ZUC operation */
6033 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6034 					tdata->cipher_iv.len,
6035 					tdata->plaintext.len,
6036 					tdata->validCipherOffsetInBits.len);
6037 	if (retval < 0)
6038 		return retval;
6039 
6040 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6041 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6042 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6043 	else
6044 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6045 						ut_params->op);
6046 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6047 
6048 	ut_params->obuf = ut_params->op->sym->m_dst;
6049 	if (ut_params->obuf)
6050 		ciphertext = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *);
6051 	else
6052 		ciphertext = plaintext;
6053 
6054 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6055 
6056 	/* Validate obuf */
6057 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6058 		ciphertext,
6059 		tdata->ciphertext.data,
6060 		tdata->validCipherLenInBits.len,
6061 		"ZUC Ciphertext data not as expected");
6062 	return 0;
6063 }
6064 
6065 static int
6066 test_zuc_encryption_sgl(const struct wireless_test_data *tdata)
6067 {
6068 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6069 	struct crypto_unittest_params *ut_params = &unittest_params;
6070 
6071 	int retval;
6072 
6073 	unsigned int plaintext_pad_len;
6074 	unsigned int plaintext_len;
6075 	const uint8_t *ciphertext;
6076 	uint8_t ciphertext_buffer[2048];
6077 	struct rte_cryptodev_info dev_info;
6078 
6079 	/* Check if device supports ZUC EEA3 */
6080 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6081 			tdata->key.len, tdata->cipher_iv.len) < 0)
6082 		return TEST_SKIPPED;
6083 
6084 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6085 		return TEST_SKIPPED;
6086 
6087 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6088 
6089 	uint64_t feat_flags = dev_info.feature_flags;
6090 
6091 	if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6092 		printf("Device doesn't support in-place scatter-gather. "
6093 				"Test Skipped.\n");
6094 		return TEST_SKIPPED;
6095 	}
6096 
6097 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6098 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6099 		printf("Device doesn't support RAW data-path APIs.\n");
6100 		return TEST_SKIPPED;
6101 	}
6102 
6103 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6104 
6105 	/* Append data which is padded to a multiple */
6106 	/* of the algorithms block size */
6107 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6108 
6109 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6110 			plaintext_pad_len, 10, 0);
6111 
6112 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6113 			tdata->plaintext.data);
6114 
6115 	/* Create ZUC session */
6116 	retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
6117 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
6118 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6119 			tdata->key.data, tdata->key.len,
6120 			tdata->cipher_iv.len);
6121 	if (retval < 0)
6122 		return retval;
6123 
6124 	/* Clear mbuf payload */
6125 
6126 	pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
6127 
6128 	/* Create ZUC operation */
6129 	retval = create_wireless_algo_cipher_operation(tdata->cipher_iv.data,
6130 			tdata->cipher_iv.len, tdata->plaintext.len,
6131 			tdata->validCipherOffsetInBits.len);
6132 	if (retval < 0)
6133 		return retval;
6134 
6135 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6136 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6137 				ut_params->op, 1, 0, 1, tdata->cipher_iv.len);
6138 	else
6139 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6140 						ut_params->op);
6141 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6142 
6143 	ut_params->obuf = ut_params->op->sym->m_dst;
6144 	if (ut_params->obuf)
6145 		ciphertext = rte_pktmbuf_read(ut_params->obuf,
6146 			0, plaintext_len, ciphertext_buffer);
6147 	else
6148 		ciphertext = rte_pktmbuf_read(ut_params->ibuf,
6149 			0, plaintext_len, ciphertext_buffer);
6150 
6151 	/* Validate obuf */
6152 	debug_hexdump(stdout, "ciphertext:", ciphertext, plaintext_len);
6153 
6154 	/* Validate obuf */
6155 	TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6156 		ciphertext,
6157 		tdata->ciphertext.data,
6158 		tdata->validCipherLenInBits.len,
6159 		"ZUC Ciphertext data not as expected");
6160 
6161 	return 0;
6162 }
6163 
6164 static int
6165 test_zuc_authentication(const struct wireless_test_data *tdata)
6166 {
6167 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6168 	struct crypto_unittest_params *ut_params = &unittest_params;
6169 
6170 	int retval;
6171 	unsigned plaintext_pad_len;
6172 	unsigned plaintext_len;
6173 	uint8_t *plaintext;
6174 
6175 	struct rte_cryptodev_info dev_info;
6176 
6177 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6178 	uint64_t feat_flags = dev_info.feature_flags;
6179 
6180 	if (!(feat_flags & RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA) &&
6181 			(tdata->validAuthLenInBits.len % 8 != 0)) {
6182 		printf("Device doesn't support NON-Byte Aligned Data.\n");
6183 		return TEST_SKIPPED;
6184 	}
6185 
6186 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6187 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6188 		printf("Device doesn't support RAW data-path APIs.\n");
6189 		return TEST_SKIPPED;
6190 	}
6191 
6192 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
6193 		return TEST_SKIPPED;
6194 
6195 	/* Check if device supports ZUC EIA3 */
6196 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6197 			tdata->key.len, tdata->auth_iv.len,
6198 			tdata->digest.len) < 0)
6199 		return TEST_SKIPPED;
6200 
6201 	/* Create ZUC session */
6202 	retval = create_wireless_algo_hash_session(ts_params->valid_devs[0],
6203 			tdata->key.data, tdata->key.len,
6204 			tdata->auth_iv.len, tdata->digest.len,
6205 			RTE_CRYPTO_AUTH_OP_GENERATE,
6206 			RTE_CRYPTO_AUTH_ZUC_EIA3);
6207 	if (retval != 0)
6208 		return retval;
6209 
6210 	/* alloc mbuf and set payload */
6211 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6212 
6213 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6214 	rte_pktmbuf_tailroom(ut_params->ibuf));
6215 
6216 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6217 	/* Append data which is padded to a multiple of */
6218 	/* the algorithms block size */
6219 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
6220 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6221 				plaintext_pad_len);
6222 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6223 
6224 	/* Create ZUC operation */
6225 	retval = create_wireless_algo_hash_operation(NULL, tdata->digest.len,
6226 			tdata->auth_iv.data, tdata->auth_iv.len,
6227 			plaintext_pad_len, RTE_CRYPTO_AUTH_OP_GENERATE,
6228 			tdata->validAuthLenInBits.len,
6229 			0);
6230 	if (retval < 0)
6231 		return retval;
6232 
6233 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6234 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6235 				ut_params->op, 0, 1, 1, 0);
6236 	else
6237 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6238 				ut_params->op);
6239 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6240 	ut_params->obuf = ut_params->op->sym->m_src;
6241 	ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
6242 			+ plaintext_pad_len;
6243 
6244 	/* Validate obuf */
6245 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
6246 	ut_params->digest,
6247 	tdata->digest.data,
6248 	tdata->digest.len,
6249 	"ZUC Generated auth tag not as expected");
6250 
6251 	return 0;
6252 }
6253 
6254 static int
6255 test_zuc_auth_cipher(const struct wireless_test_data *tdata,
6256 	uint8_t op_mode, uint8_t verify)
6257 {
6258 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6259 	struct crypto_unittest_params *ut_params = &unittest_params;
6260 
6261 	int retval;
6262 
6263 	uint8_t *plaintext = NULL, *ciphertext = NULL;
6264 	unsigned int plaintext_pad_len;
6265 	unsigned int plaintext_len;
6266 	unsigned int ciphertext_pad_len;
6267 	unsigned int ciphertext_len;
6268 
6269 	struct rte_cryptodev_info dev_info;
6270 
6271 	/* Check if device supports ZUC EEA3 */
6272 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6273 			tdata->key.len, tdata->cipher_iv.len) < 0)
6274 		return TEST_SKIPPED;
6275 
6276 	/* Check if device supports ZUC EIA3 */
6277 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6278 			tdata->key.len, tdata->auth_iv.len,
6279 			tdata->digest.len) < 0)
6280 		return TEST_SKIPPED;
6281 
6282 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6283 
6284 	uint64_t feat_flags = dev_info.feature_flags;
6285 
6286 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6287 		printf("Device doesn't support digest encrypted.\n");
6288 		return TEST_SKIPPED;
6289 	}
6290 	if (op_mode == IN_PLACE) {
6291 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6292 			printf("Device doesn't support in-place scatter-gather "
6293 					"in both input and output mbufs.\n");
6294 			return TEST_SKIPPED;
6295 		}
6296 
6297 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6298 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6299 			printf("Device doesn't support RAW data-path APIs.\n");
6300 			return TEST_SKIPPED;
6301 		}
6302 	} else {
6303 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6304 			return TEST_SKIPPED;
6305 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6306 			printf("Device doesn't support out-of-place scatter-gather "
6307 					"in both input and output mbufs.\n");
6308 			return TEST_SKIPPED;
6309 		}
6310 	}
6311 
6312 	/* Create ZUC session */
6313 	retval = create_wireless_algo_auth_cipher_session(
6314 			ts_params->valid_devs[0],
6315 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6316 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6317 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6318 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6319 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6320 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6321 			tdata->key.data, tdata->key.len,
6322 			tdata->auth_iv.len, tdata->digest.len,
6323 			tdata->cipher_iv.len);
6324 
6325 	if (retval != 0)
6326 		return retval;
6327 
6328 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6329 	if (op_mode == OUT_OF_PLACE)
6330 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
6331 
6332 	/* clear mbuf payload */
6333 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
6334 		rte_pktmbuf_tailroom(ut_params->ibuf));
6335 	if (op_mode == OUT_OF_PLACE)
6336 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
6337 			rte_pktmbuf_tailroom(ut_params->obuf));
6338 
6339 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6340 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6341 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6342 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6343 
6344 	if (verify) {
6345 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6346 					ciphertext_pad_len);
6347 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
6348 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6349 			ciphertext_len);
6350 	} else {
6351 		/* make sure enough space to cover partial digest verify case */
6352 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
6353 					ciphertext_pad_len);
6354 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
6355 		debug_hexdump(stdout, "plaintext:", plaintext,
6356 			plaintext_len);
6357 	}
6358 
6359 	if (op_mode == OUT_OF_PLACE)
6360 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
6361 
6362 	/* Create ZUC operation */
6363 	retval = create_wireless_algo_auth_cipher_operation(
6364 		tdata->digest.data, tdata->digest.len,
6365 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6366 		tdata->auth_iv.data, tdata->auth_iv.len,
6367 		(tdata->digest.offset_bytes == 0 ?
6368 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6369 			: tdata->digest.offset_bytes),
6370 		tdata->validCipherLenInBits.len,
6371 		tdata->validCipherOffsetInBits.len,
6372 		tdata->validAuthLenInBits.len,
6373 		0,
6374 		op_mode, 0, verify);
6375 
6376 	if (retval < 0)
6377 		return retval;
6378 
6379 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6380 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6381 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6382 	else
6383 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6384 			ut_params->op);
6385 
6386 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6387 
6388 	ut_params->obuf = (op_mode == IN_PLACE ?
6389 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6390 
6391 
6392 	if (verify) {
6393 		if (ut_params->obuf)
6394 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
6395 							uint8_t *);
6396 		else
6397 			plaintext = ciphertext;
6398 
6399 		debug_hexdump(stdout, "plaintext:", plaintext,
6400 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6401 		debug_hexdump(stdout, "plaintext expected:",
6402 			tdata->plaintext.data,
6403 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6404 	} else {
6405 		if (ut_params->obuf)
6406 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
6407 							uint8_t *);
6408 		else
6409 			ciphertext = plaintext;
6410 
6411 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6412 			ciphertext_len);
6413 		debug_hexdump(stdout, "ciphertext expected:",
6414 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6415 
6416 		ut_params->digest = rte_pktmbuf_mtod(
6417 			ut_params->obuf, uint8_t *) +
6418 			(tdata->digest.offset_bytes == 0 ?
6419 			plaintext_pad_len : tdata->digest.offset_bytes);
6420 
6421 		debug_hexdump(stdout, "digest:", ut_params->digest,
6422 			tdata->digest.len);
6423 		debug_hexdump(stdout, "digest expected:",
6424 			tdata->digest.data, tdata->digest.len);
6425 	}
6426 
6427 	/* Validate obuf */
6428 	if (verify) {
6429 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6430 			plaintext,
6431 			tdata->plaintext.data,
6432 			tdata->plaintext.len >> 3,
6433 			"ZUC Plaintext data not as expected");
6434 	} else {
6435 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6436 			ciphertext,
6437 			tdata->ciphertext.data,
6438 			tdata->ciphertext.len >> 3,
6439 			"ZUC Ciphertext data not as expected");
6440 
6441 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6442 			ut_params->digest,
6443 			tdata->digest.data,
6444 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6445 			"ZUC Generated auth tag not as expected");
6446 	}
6447 	return 0;
6448 }
6449 
6450 static int
6451 test_zuc_auth_cipher_sgl(const struct wireless_test_data *tdata,
6452 	uint8_t op_mode, uint8_t verify)
6453 {
6454 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6455 	struct crypto_unittest_params *ut_params = &unittest_params;
6456 
6457 	int retval;
6458 
6459 	const uint8_t *plaintext = NULL;
6460 	const uint8_t *ciphertext = NULL;
6461 	const uint8_t *digest = NULL;
6462 	unsigned int plaintext_pad_len;
6463 	unsigned int plaintext_len;
6464 	unsigned int ciphertext_pad_len;
6465 	unsigned int ciphertext_len;
6466 	uint8_t buffer[10000];
6467 	uint8_t digest_buffer[10000];
6468 
6469 	struct rte_cryptodev_info dev_info;
6470 
6471 	/* Check if device supports ZUC EEA3 */
6472 	if (check_cipher_capability(ts_params, RTE_CRYPTO_CIPHER_ZUC_EEA3,
6473 			tdata->key.len, tdata->cipher_iv.len) < 0)
6474 		return TEST_SKIPPED;
6475 
6476 	/* Check if device supports ZUC EIA3 */
6477 	if (check_auth_capability(ts_params, RTE_CRYPTO_AUTH_ZUC_EIA3,
6478 			tdata->key.len, tdata->auth_iv.len,
6479 			tdata->digest.len) < 0)
6480 		return TEST_SKIPPED;
6481 
6482 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6483 
6484 	uint64_t feat_flags = dev_info.feature_flags;
6485 
6486 	if (op_mode == IN_PLACE) {
6487 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
6488 			printf("Device doesn't support in-place scatter-gather "
6489 					"in both input and output mbufs.\n");
6490 			return TEST_SKIPPED;
6491 		}
6492 
6493 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
6494 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
6495 			printf("Device doesn't support RAW data-path APIs.\n");
6496 			return TEST_SKIPPED;
6497 		}
6498 	} else {
6499 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6500 			return TEST_SKIPPED;
6501 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
6502 			printf("Device doesn't support out-of-place scatter-gather "
6503 					"in both input and output mbufs.\n");
6504 			return TEST_SKIPPED;
6505 		}
6506 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6507 			printf("Device doesn't support digest encrypted.\n");
6508 			return TEST_SKIPPED;
6509 		}
6510 	}
6511 
6512 	/* Create ZUC session */
6513 	retval = create_wireless_algo_auth_cipher_session(
6514 			ts_params->valid_devs[0],
6515 			(verify ? RTE_CRYPTO_CIPHER_OP_DECRYPT
6516 					: RTE_CRYPTO_CIPHER_OP_ENCRYPT),
6517 			(verify ? RTE_CRYPTO_AUTH_OP_VERIFY
6518 					: RTE_CRYPTO_AUTH_OP_GENERATE),
6519 			RTE_CRYPTO_AUTH_ZUC_EIA3,
6520 			RTE_CRYPTO_CIPHER_ZUC_EEA3,
6521 			tdata->key.data, tdata->key.len,
6522 			tdata->auth_iv.len, tdata->digest.len,
6523 			tdata->cipher_iv.len);
6524 
6525 	if (retval != 0)
6526 		return retval;
6527 
6528 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len);
6529 	plaintext_len = ceil_byte_length(tdata->plaintext.len);
6530 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
6531 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
6532 
6533 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
6534 			plaintext_pad_len, 15, 0);
6535 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
6536 			"Failed to allocate input buffer in mempool");
6537 
6538 	if (op_mode == OUT_OF_PLACE) {
6539 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
6540 				plaintext_pad_len, 15, 0);
6541 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
6542 				"Failed to allocate output buffer in mempool");
6543 	}
6544 
6545 	if (verify) {
6546 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
6547 			tdata->ciphertext.data);
6548 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6549 					ciphertext_len, buffer);
6550 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6551 			ciphertext_len);
6552 	} else {
6553 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
6554 			tdata->plaintext.data);
6555 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6556 					plaintext_len, buffer);
6557 		debug_hexdump(stdout, "plaintext:", plaintext,
6558 			plaintext_len);
6559 	}
6560 	memset(buffer, 0, sizeof(buffer));
6561 
6562 	/* Create ZUC operation */
6563 	retval = create_wireless_algo_auth_cipher_operation(
6564 		tdata->digest.data, tdata->digest.len,
6565 		tdata->cipher_iv.data, tdata->cipher_iv.len,
6566 		NULL, 0,
6567 		(tdata->digest.offset_bytes == 0 ?
6568 		(verify ? ciphertext_pad_len : plaintext_pad_len)
6569 			: tdata->digest.offset_bytes),
6570 		tdata->validCipherLenInBits.len,
6571 		tdata->validCipherOffsetInBits.len,
6572 		tdata->validAuthLenInBits.len,
6573 		0,
6574 		op_mode, 1, verify);
6575 
6576 	if (retval < 0)
6577 		return retval;
6578 
6579 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6580 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
6581 				ut_params->op, 1, 1, 1, tdata->cipher_iv.len);
6582 	else
6583 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
6584 			ut_params->op);
6585 
6586 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
6587 
6588 	ut_params->obuf = (op_mode == IN_PLACE ?
6589 		ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
6590 
6591 	if (verify) {
6592 		if (ut_params->obuf)
6593 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
6594 					plaintext_len, buffer);
6595 		else
6596 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
6597 					plaintext_len, buffer);
6598 
6599 		debug_hexdump(stdout, "plaintext:", plaintext,
6600 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6601 		debug_hexdump(stdout, "plaintext expected:",
6602 			tdata->plaintext.data,
6603 			(tdata->plaintext.len >> 3) - tdata->digest.len);
6604 	} else {
6605 		if (ut_params->obuf)
6606 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
6607 					ciphertext_len, buffer);
6608 		else
6609 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
6610 					ciphertext_len, buffer);
6611 
6612 		debug_hexdump(stdout, "ciphertext:", ciphertext,
6613 			ciphertext_len);
6614 		debug_hexdump(stdout, "ciphertext expected:",
6615 			tdata->ciphertext.data, tdata->ciphertext.len >> 3);
6616 
6617 		if (ut_params->obuf)
6618 			digest = rte_pktmbuf_read(ut_params->obuf,
6619 				(tdata->digest.offset_bytes == 0 ?
6620 				plaintext_pad_len : tdata->digest.offset_bytes),
6621 				tdata->digest.len, digest_buffer);
6622 		else
6623 			digest = rte_pktmbuf_read(ut_params->ibuf,
6624 				(tdata->digest.offset_bytes == 0 ?
6625 				plaintext_pad_len : tdata->digest.offset_bytes),
6626 				tdata->digest.len, digest_buffer);
6627 
6628 		debug_hexdump(stdout, "digest:", digest,
6629 			tdata->digest.len);
6630 		debug_hexdump(stdout, "digest expected:",
6631 			tdata->digest.data, tdata->digest.len);
6632 	}
6633 
6634 	/* Validate obuf */
6635 	if (verify) {
6636 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6637 			plaintext,
6638 			tdata->plaintext.data,
6639 			tdata->plaintext.len >> 3,
6640 			"ZUC Plaintext data not as expected");
6641 	} else {
6642 		TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
6643 			ciphertext,
6644 			tdata->ciphertext.data,
6645 			tdata->validDataLenInBits.len,
6646 			"ZUC Ciphertext data not as expected");
6647 
6648 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
6649 			digest,
6650 			tdata->digest.data,
6651 			DIGEST_BYTE_LENGTH_KASUMI_F9,
6652 			"ZUC Generated auth tag not as expected");
6653 	}
6654 	return 0;
6655 }
6656 
6657 static int
6658 test_kasumi_encryption_test_case_1(void)
6659 {
6660 	return test_kasumi_encryption(&kasumi_test_case_1);
6661 }
6662 
6663 static int
6664 test_kasumi_encryption_test_case_1_sgl(void)
6665 {
6666 	return test_kasumi_encryption_sgl(&kasumi_test_case_1);
6667 }
6668 
6669 static int
6670 test_kasumi_encryption_test_case_1_oop(void)
6671 {
6672 	return test_kasumi_encryption_oop(&kasumi_test_case_1);
6673 }
6674 
6675 static int
6676 test_kasumi_encryption_test_case_1_oop_sgl(void)
6677 {
6678 	return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
6679 }
6680 
6681 static int
6682 test_kasumi_encryption_test_case_2(void)
6683 {
6684 	return test_kasumi_encryption(&kasumi_test_case_2);
6685 }
6686 
6687 static int
6688 test_kasumi_encryption_test_case_3(void)
6689 {
6690 	return test_kasumi_encryption(&kasumi_test_case_3);
6691 }
6692 
6693 static int
6694 test_kasumi_encryption_test_case_4(void)
6695 {
6696 	return test_kasumi_encryption(&kasumi_test_case_4);
6697 }
6698 
6699 static int
6700 test_kasumi_encryption_test_case_5(void)
6701 {
6702 	return test_kasumi_encryption(&kasumi_test_case_5);
6703 }
6704 
6705 static int
6706 test_kasumi_decryption_test_case_1(void)
6707 {
6708 	return test_kasumi_decryption(&kasumi_test_case_1);
6709 }
6710 
6711 static int
6712 test_kasumi_decryption_test_case_1_oop(void)
6713 {
6714 	return test_kasumi_decryption_oop(&kasumi_test_case_1);
6715 }
6716 
6717 static int
6718 test_kasumi_decryption_test_case_2(void)
6719 {
6720 	return test_kasumi_decryption(&kasumi_test_case_2);
6721 }
6722 
6723 static int
6724 test_kasumi_decryption_test_case_3(void)
6725 {
6726 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6727 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6728 		return TEST_SKIPPED;
6729 	return test_kasumi_decryption(&kasumi_test_case_3);
6730 }
6731 
6732 static int
6733 test_kasumi_decryption_test_case_4(void)
6734 {
6735 	return test_kasumi_decryption(&kasumi_test_case_4);
6736 }
6737 
6738 static int
6739 test_kasumi_decryption_test_case_5(void)
6740 {
6741 	return test_kasumi_decryption(&kasumi_test_case_5);
6742 }
6743 static int
6744 test_snow3g_encryption_test_case_1(void)
6745 {
6746 	return test_snow3g_encryption(&snow3g_test_case_1);
6747 }
6748 
6749 static int
6750 test_snow3g_encryption_test_case_1_oop(void)
6751 {
6752 	return test_snow3g_encryption_oop(&snow3g_test_case_1);
6753 }
6754 
6755 static int
6756 test_snow3g_encryption_test_case_1_oop_sgl(void)
6757 {
6758 	return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
6759 }
6760 
6761 
6762 static int
6763 test_snow3g_encryption_test_case_1_offset_oop(void)
6764 {
6765 	return test_snow3g_encryption_offset_oop(&snow3g_test_case_1);
6766 }
6767 
6768 static int
6769 test_snow3g_encryption_test_case_2(void)
6770 {
6771 	return test_snow3g_encryption(&snow3g_test_case_2);
6772 }
6773 
6774 static int
6775 test_snow3g_encryption_test_case_3(void)
6776 {
6777 	return test_snow3g_encryption(&snow3g_test_case_3);
6778 }
6779 
6780 static int
6781 test_snow3g_encryption_test_case_4(void)
6782 {
6783 	return test_snow3g_encryption(&snow3g_test_case_4);
6784 }
6785 
6786 static int
6787 test_snow3g_encryption_test_case_5(void)
6788 {
6789 	return test_snow3g_encryption(&snow3g_test_case_5);
6790 }
6791 
6792 static int
6793 test_snow3g_decryption_test_case_1(void)
6794 {
6795 	return test_snow3g_decryption(&snow3g_test_case_1);
6796 }
6797 
6798 static int
6799 test_snow3g_decryption_test_case_1_oop(void)
6800 {
6801 	return test_snow3g_decryption_oop(&snow3g_test_case_1);
6802 }
6803 
6804 static int
6805 test_snow3g_decryption_test_case_2(void)
6806 {
6807 	return test_snow3g_decryption(&snow3g_test_case_2);
6808 }
6809 
6810 static int
6811 test_snow3g_decryption_test_case_3(void)
6812 {
6813 	return test_snow3g_decryption(&snow3g_test_case_3);
6814 }
6815 
6816 static int
6817 test_snow3g_decryption_test_case_4(void)
6818 {
6819 	return test_snow3g_decryption(&snow3g_test_case_4);
6820 }
6821 
6822 static int
6823 test_snow3g_decryption_test_case_5(void)
6824 {
6825 	return test_snow3g_decryption(&snow3g_test_case_5);
6826 }
6827 
6828 /*
6829  * Function prepares snow3g_hash_test_data from snow3g_test_data.
6830  * Pattern digest from snow3g_test_data must be allocated as
6831  * 4 last bytes in plaintext.
6832  */
6833 static void
6834 snow3g_hash_test_vector_setup(const struct snow3g_test_data *pattern,
6835 		struct snow3g_hash_test_data *output)
6836 {
6837 	if ((pattern != NULL) && (output != NULL)) {
6838 		output->key.len = pattern->key.len;
6839 
6840 		memcpy(output->key.data,
6841 		pattern->key.data, pattern->key.len);
6842 
6843 		output->auth_iv.len = pattern->auth_iv.len;
6844 
6845 		memcpy(output->auth_iv.data,
6846 		pattern->auth_iv.data, pattern->auth_iv.len);
6847 
6848 		output->plaintext.len = pattern->plaintext.len;
6849 
6850 		memcpy(output->plaintext.data,
6851 		pattern->plaintext.data, pattern->plaintext.len >> 3);
6852 
6853 		output->digest.len = pattern->digest.len;
6854 
6855 		memcpy(output->digest.data,
6856 		&pattern->plaintext.data[pattern->digest.offset_bytes],
6857 		pattern->digest.len);
6858 
6859 		output->validAuthLenInBits.len =
6860 		pattern->validAuthLenInBits.len;
6861 	}
6862 }
6863 
6864 /*
6865  * Test case verify computed cipher and digest from snow3g_test_case_7 data.
6866  */
6867 static int
6868 test_snow3g_decryption_with_digest_test_case_1(void)
6869 {
6870 	struct snow3g_hash_test_data snow3g_hash_data;
6871 	struct rte_cryptodev_info dev_info;
6872 	struct crypto_testsuite_params *ts_params = &testsuite_params;
6873 
6874 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
6875 	uint64_t feat_flags = dev_info.feature_flags;
6876 
6877 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
6878 		printf("Device doesn't support encrypted digest operations.\n");
6879 		return TEST_SKIPPED;
6880 	}
6881 
6882 	/*
6883 	 * Function prepare data for hash verification test case.
6884 	 * Digest is allocated in 4 last bytes in plaintext, pattern.
6885 	 */
6886 	snow3g_hash_test_vector_setup(&snow3g_test_case_7, &snow3g_hash_data);
6887 
6888 	return test_snow3g_decryption(&snow3g_test_case_7) &
6889 			test_snow3g_authentication_verify(&snow3g_hash_data);
6890 }
6891 
6892 static int
6893 test_snow3g_cipher_auth_test_case_1(void)
6894 {
6895 	return test_snow3g_cipher_auth(&snow3g_test_case_3);
6896 }
6897 
6898 static int
6899 test_snow3g_auth_cipher_test_case_1(void)
6900 {
6901 	return test_snow3g_auth_cipher(
6902 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 0);
6903 }
6904 
6905 static int
6906 test_snow3g_auth_cipher_test_case_2(void)
6907 {
6908 	return test_snow3g_auth_cipher(
6909 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 0);
6910 }
6911 
6912 static int
6913 test_snow3g_auth_cipher_test_case_2_oop(void)
6914 {
6915 	return test_snow3g_auth_cipher(
6916 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
6917 }
6918 
6919 static int
6920 test_snow3g_auth_cipher_part_digest_enc(void)
6921 {
6922 	return test_snow3g_auth_cipher(
6923 		&snow3g_auth_cipher_partial_digest_encryption,
6924 			IN_PLACE, 0);
6925 }
6926 
6927 static int
6928 test_snow3g_auth_cipher_part_digest_enc_oop(void)
6929 {
6930 	return test_snow3g_auth_cipher(
6931 		&snow3g_auth_cipher_partial_digest_encryption,
6932 			OUT_OF_PLACE, 0);
6933 }
6934 
6935 static int
6936 test_snow3g_auth_cipher_test_case_3_sgl(void)
6937 {
6938 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6939 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6940 		return TEST_SKIPPED;
6941 	return test_snow3g_auth_cipher_sgl(
6942 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 0);
6943 }
6944 
6945 static int
6946 test_snow3g_auth_cipher_test_case_3_oop_sgl(void)
6947 {
6948 	return test_snow3g_auth_cipher_sgl(
6949 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 0);
6950 }
6951 
6952 static int
6953 test_snow3g_auth_cipher_part_digest_enc_sgl(void)
6954 {
6955 	/* rte_crypto_mbuf_to_vec does not support incomplete mbuf build */
6956 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
6957 		return TEST_SKIPPED;
6958 	return test_snow3g_auth_cipher_sgl(
6959 		&snow3g_auth_cipher_partial_digest_encryption,
6960 			IN_PLACE, 0);
6961 }
6962 
6963 static int
6964 test_snow3g_auth_cipher_part_digest_enc_oop_sgl(void)
6965 {
6966 	return test_snow3g_auth_cipher_sgl(
6967 		&snow3g_auth_cipher_partial_digest_encryption,
6968 			OUT_OF_PLACE, 0);
6969 }
6970 
6971 static int
6972 test_snow3g_auth_cipher_verify_test_case_1(void)
6973 {
6974 	return test_snow3g_auth_cipher(
6975 		&snow3g_auth_cipher_test_case_1, IN_PLACE, 1);
6976 }
6977 
6978 static int
6979 test_snow3g_auth_cipher_verify_test_case_2(void)
6980 {
6981 	return test_snow3g_auth_cipher(
6982 		&snow3g_auth_cipher_test_case_2, IN_PLACE, 1);
6983 }
6984 
6985 static int
6986 test_snow3g_auth_cipher_verify_test_case_2_oop(void)
6987 {
6988 	return test_snow3g_auth_cipher(
6989 		&snow3g_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
6990 }
6991 
6992 static int
6993 test_snow3g_auth_cipher_verify_part_digest_enc(void)
6994 {
6995 	return test_snow3g_auth_cipher(
6996 		&snow3g_auth_cipher_partial_digest_encryption,
6997 			IN_PLACE, 1);
6998 }
6999 
7000 static int
7001 test_snow3g_auth_cipher_verify_part_digest_enc_oop(void)
7002 {
7003 	return test_snow3g_auth_cipher(
7004 		&snow3g_auth_cipher_partial_digest_encryption,
7005 			OUT_OF_PLACE, 1);
7006 }
7007 
7008 static int
7009 test_snow3g_auth_cipher_verify_test_case_3_sgl(void)
7010 {
7011 	return test_snow3g_auth_cipher_sgl(
7012 		&snow3g_auth_cipher_test_case_3, IN_PLACE, 1);
7013 }
7014 
7015 static int
7016 test_snow3g_auth_cipher_verify_test_case_3_oop_sgl(void)
7017 {
7018 	return test_snow3g_auth_cipher_sgl(
7019 		&snow3g_auth_cipher_test_case_3, OUT_OF_PLACE, 1);
7020 }
7021 
7022 static int
7023 test_snow3g_auth_cipher_verify_part_digest_enc_sgl(void)
7024 {
7025 	return test_snow3g_auth_cipher_sgl(
7026 		&snow3g_auth_cipher_partial_digest_encryption,
7027 			IN_PLACE, 1);
7028 }
7029 
7030 static int
7031 test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl(void)
7032 {
7033 	return test_snow3g_auth_cipher_sgl(
7034 		&snow3g_auth_cipher_partial_digest_encryption,
7035 			OUT_OF_PLACE, 1);
7036 }
7037 
7038 static int
7039 test_snow3g_auth_cipher_with_digest_test_case_1(void)
7040 {
7041 	return test_snow3g_auth_cipher(
7042 		&snow3g_test_case_7, IN_PLACE, 0);
7043 }
7044 
7045 static int
7046 test_kasumi_auth_cipher_test_case_1(void)
7047 {
7048 	return test_kasumi_auth_cipher(
7049 		&kasumi_test_case_3, IN_PLACE, 0);
7050 }
7051 
7052 static int
7053 test_kasumi_auth_cipher_test_case_2(void)
7054 {
7055 	return test_kasumi_auth_cipher(
7056 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7057 }
7058 
7059 static int
7060 test_kasumi_auth_cipher_test_case_2_oop(void)
7061 {
7062 	return test_kasumi_auth_cipher(
7063 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7064 }
7065 
7066 static int
7067 test_kasumi_auth_cipher_test_case_2_sgl(void)
7068 {
7069 	return test_kasumi_auth_cipher_sgl(
7070 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 0);
7071 }
7072 
7073 static int
7074 test_kasumi_auth_cipher_test_case_2_oop_sgl(void)
7075 {
7076 	return test_kasumi_auth_cipher_sgl(
7077 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 0);
7078 }
7079 
7080 static int
7081 test_kasumi_auth_cipher_verify_test_case_1(void)
7082 {
7083 	return test_kasumi_auth_cipher(
7084 		&kasumi_test_case_3, IN_PLACE, 1);
7085 }
7086 
7087 static int
7088 test_kasumi_auth_cipher_verify_test_case_2(void)
7089 {
7090 	return test_kasumi_auth_cipher(
7091 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7092 }
7093 
7094 static int
7095 test_kasumi_auth_cipher_verify_test_case_2_oop(void)
7096 {
7097 	return test_kasumi_auth_cipher(
7098 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7099 }
7100 
7101 static int
7102 test_kasumi_auth_cipher_verify_test_case_2_sgl(void)
7103 {
7104 	return test_kasumi_auth_cipher_sgl(
7105 		&kasumi_auth_cipher_test_case_2, IN_PLACE, 1);
7106 }
7107 
7108 static int
7109 test_kasumi_auth_cipher_verify_test_case_2_oop_sgl(void)
7110 {
7111 	return test_kasumi_auth_cipher_sgl(
7112 		&kasumi_auth_cipher_test_case_2, OUT_OF_PLACE, 1);
7113 }
7114 
7115 static int
7116 test_kasumi_cipher_auth_test_case_1(void)
7117 {
7118 	return test_kasumi_cipher_auth(&kasumi_test_case_6);
7119 }
7120 
7121 static int
7122 test_zuc_encryption_test_case_1(void)
7123 {
7124 	return test_zuc_encryption(&zuc_test_case_cipher_193b);
7125 }
7126 
7127 static int
7128 test_zuc_encryption_test_case_2(void)
7129 {
7130 	return test_zuc_encryption(&zuc_test_case_cipher_800b);
7131 }
7132 
7133 static int
7134 test_zuc_encryption_test_case_3(void)
7135 {
7136 	return test_zuc_encryption(&zuc_test_case_cipher_1570b);
7137 }
7138 
7139 static int
7140 test_zuc_encryption_test_case_4(void)
7141 {
7142 	return test_zuc_encryption(&zuc_test_case_cipher_2798b);
7143 }
7144 
7145 static int
7146 test_zuc_encryption_test_case_5(void)
7147 {
7148 	return test_zuc_encryption(&zuc_test_case_cipher_4019b);
7149 }
7150 
7151 static int
7152 test_zuc_encryption_test_case_6_sgl(void)
7153 {
7154 	return test_zuc_encryption_sgl(&zuc_test_case_cipher_193b);
7155 }
7156 
7157 static int
7158 test_zuc_hash_generate_test_case_1(void)
7159 {
7160 	return test_zuc_authentication(&zuc_test_case_auth_1b);
7161 }
7162 
7163 static int
7164 test_zuc_hash_generate_test_case_2(void)
7165 {
7166 	return test_zuc_authentication(&zuc_test_case_auth_90b);
7167 }
7168 
7169 static int
7170 test_zuc_hash_generate_test_case_3(void)
7171 {
7172 	return test_zuc_authentication(&zuc_test_case_auth_577b);
7173 }
7174 
7175 static int
7176 test_zuc_hash_generate_test_case_4(void)
7177 {
7178 	return test_zuc_authentication(&zuc_test_case_auth_2079b);
7179 }
7180 
7181 static int
7182 test_zuc_hash_generate_test_case_5(void)
7183 {
7184 	return test_zuc_authentication(&zuc_test_auth_5670b);
7185 }
7186 
7187 static int
7188 test_zuc_hash_generate_test_case_6(void)
7189 {
7190 	return test_zuc_authentication(&zuc_test_case_auth_128b);
7191 }
7192 
7193 static int
7194 test_zuc_hash_generate_test_case_7(void)
7195 {
7196 	return test_zuc_authentication(&zuc_test_case_auth_2080b);
7197 }
7198 
7199 static int
7200 test_zuc_hash_generate_test_case_8(void)
7201 {
7202 	return test_zuc_authentication(&zuc_test_case_auth_584b);
7203 }
7204 
7205 static int
7206 test_zuc_hash_generate_test_case_9(void)
7207 {
7208 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_32b);
7209 }
7210 
7211 static int
7212 test_zuc_hash_generate_test_case_10(void)
7213 {
7214 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_64b);
7215 }
7216 
7217 static int
7218 test_zuc_hash_generate_test_case_11(void)
7219 {
7220 	return test_zuc_authentication(&zuc_test_case_auth_4000b_mac_128b);
7221 }
7222 
7223 static int
7224 test_zuc_cipher_auth_test_case_1(void)
7225 {
7226 	return test_zuc_cipher_auth(&zuc_test_case_cipher_200b_auth_200b);
7227 }
7228 
7229 static int
7230 test_zuc_cipher_auth_test_case_2(void)
7231 {
7232 	return test_zuc_cipher_auth(&zuc_test_case_cipher_800b_auth_120b);
7233 }
7234 
7235 static int
7236 test_zuc_auth_cipher_test_case_1(void)
7237 {
7238 	return test_zuc_auth_cipher(
7239 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7240 }
7241 
7242 static int
7243 test_zuc_auth_cipher_test_case_1_oop(void)
7244 {
7245 	return test_zuc_auth_cipher(
7246 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7247 }
7248 
7249 static int
7250 test_zuc_auth_cipher_test_case_1_sgl(void)
7251 {
7252 	return test_zuc_auth_cipher_sgl(
7253 		&zuc_auth_cipher_test_case_1, IN_PLACE, 0);
7254 }
7255 
7256 static int
7257 test_zuc_auth_cipher_test_case_1_oop_sgl(void)
7258 {
7259 	return test_zuc_auth_cipher_sgl(
7260 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 0);
7261 }
7262 
7263 static int
7264 test_zuc_auth_cipher_verify_test_case_1(void)
7265 {
7266 	return test_zuc_auth_cipher(
7267 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7268 }
7269 
7270 static int
7271 test_zuc_auth_cipher_verify_test_case_1_oop(void)
7272 {
7273 	return test_zuc_auth_cipher(
7274 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7275 }
7276 
7277 static int
7278 test_zuc_auth_cipher_verify_test_case_1_sgl(void)
7279 {
7280 	return test_zuc_auth_cipher_sgl(
7281 		&zuc_auth_cipher_test_case_1, IN_PLACE, 1);
7282 }
7283 
7284 static int
7285 test_zuc_auth_cipher_verify_test_case_1_oop_sgl(void)
7286 {
7287 	return test_zuc_auth_cipher_sgl(
7288 		&zuc_auth_cipher_test_case_1, OUT_OF_PLACE, 1);
7289 }
7290 
7291 static int
7292 test_zuc256_encryption_test_case_1(void)
7293 {
7294 	return test_zuc_encryption(&zuc256_test_case_cipher_1);
7295 }
7296 
7297 static int
7298 test_zuc256_encryption_test_case_2(void)
7299 {
7300 	return test_zuc_encryption(&zuc256_test_case_cipher_2);
7301 }
7302 
7303 static int
7304 test_zuc256_authentication_test_case_1(void)
7305 {
7306 	return test_zuc_authentication(&zuc256_test_case_auth_1);
7307 }
7308 
7309 static int
7310 test_zuc256_authentication_test_case_2(void)
7311 {
7312 	return test_zuc_authentication(&zuc256_test_case_auth_2);
7313 }
7314 
7315 static int
7316 test_mixed_check_if_unsupported(const struct mixed_cipher_auth_test_data *tdata)
7317 {
7318 	uint8_t dev_id = testsuite_params.valid_devs[0];
7319 
7320 	struct rte_cryptodev_sym_capability_idx cap_idx;
7321 
7322 	/* Check if device supports particular cipher algorithm */
7323 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
7324 	cap_idx.algo.cipher = tdata->cipher_algo;
7325 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7326 		return TEST_SKIPPED;
7327 
7328 	/* Check if device supports particular hash algorithm */
7329 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
7330 	cap_idx.algo.auth = tdata->auth_algo;
7331 	if (rte_cryptodev_sym_capability_get(dev_id, &cap_idx) == NULL)
7332 		return TEST_SKIPPED;
7333 
7334 	return 0;
7335 }
7336 
7337 static int
7338 test_mixed_auth_cipher(const struct mixed_cipher_auth_test_data *tdata,
7339 	uint8_t op_mode, uint8_t verify)
7340 {
7341 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7342 	struct crypto_unittest_params *ut_params = &unittest_params;
7343 
7344 	int retval;
7345 
7346 	uint8_t *plaintext = NULL, *ciphertext = NULL;
7347 	unsigned int plaintext_pad_len;
7348 	unsigned int plaintext_len;
7349 	unsigned int ciphertext_pad_len;
7350 	unsigned int ciphertext_len;
7351 
7352 	struct rte_cryptodev_info dev_info;
7353 	struct rte_crypto_op *op;
7354 
7355 	/* Check if device supports particular algorithms separately */
7356 	if (test_mixed_check_if_unsupported(tdata))
7357 		return TEST_SKIPPED;
7358 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7359 		return TEST_SKIPPED;
7360 
7361 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7362 
7363 	uint64_t feat_flags = dev_info.feature_flags;
7364 
7365 	if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7366 		printf("Device doesn't support digest encrypted.\n");
7367 		return TEST_SKIPPED;
7368 	}
7369 
7370 	/* Create the session */
7371 	if (verify)
7372 		retval = create_wireless_algo_cipher_auth_session(
7373 				ts_params->valid_devs[0],
7374 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7375 				RTE_CRYPTO_AUTH_OP_VERIFY,
7376 				tdata->auth_algo,
7377 				tdata->cipher_algo,
7378 				tdata->auth_key.data, tdata->auth_key.len,
7379 				tdata->auth_iv.len, tdata->digest_enc.len,
7380 				tdata->cipher_iv.len);
7381 	else
7382 		retval = create_wireless_algo_auth_cipher_session(
7383 				ts_params->valid_devs[0],
7384 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7385 				RTE_CRYPTO_AUTH_OP_GENERATE,
7386 				tdata->auth_algo,
7387 				tdata->cipher_algo,
7388 				tdata->auth_key.data, tdata->auth_key.len,
7389 				tdata->auth_iv.len, tdata->digest_enc.len,
7390 				tdata->cipher_iv.len);
7391 	if (retval != 0)
7392 		return retval;
7393 
7394 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7395 	if (op_mode == OUT_OF_PLACE)
7396 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
7397 
7398 	/* clear mbuf payload */
7399 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
7400 		rte_pktmbuf_tailroom(ut_params->ibuf));
7401 	if (op_mode == OUT_OF_PLACE) {
7402 
7403 		memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
7404 				rte_pktmbuf_tailroom(ut_params->obuf));
7405 	}
7406 
7407 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7408 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7409 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7410 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7411 
7412 	if (verify) {
7413 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7414 				ciphertext_pad_len);
7415 		memcpy(ciphertext, tdata->ciphertext.data, ciphertext_len);
7416 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7417 				ciphertext_len);
7418 	} else {
7419 		/* make sure enough space to cover partial digest verify case */
7420 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
7421 				ciphertext_pad_len);
7422 		memcpy(plaintext, tdata->plaintext.data, plaintext_len);
7423 		debug_hexdump(stdout, "plaintext:", plaintext, plaintext_len);
7424 	}
7425 
7426 	if (op_mode == OUT_OF_PLACE)
7427 		rte_pktmbuf_append(ut_params->obuf, ciphertext_pad_len);
7428 
7429 	/* Create the operation */
7430 	retval = create_wireless_algo_auth_cipher_operation(
7431 			tdata->digest_enc.data, tdata->digest_enc.len,
7432 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7433 			tdata->auth_iv.data, tdata->auth_iv.len,
7434 			(tdata->digest_enc.offset == 0 ?
7435 				plaintext_pad_len
7436 				: tdata->digest_enc.offset),
7437 			tdata->validCipherLen.len_bits,
7438 			tdata->cipher.offset_bits,
7439 			tdata->validAuthLen.len_bits,
7440 			tdata->auth.offset_bits,
7441 			op_mode, 0, verify);
7442 
7443 	if (retval < 0)
7444 		return retval;
7445 
7446 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7447 
7448 	/* Check if the op failed because the device doesn't */
7449 	/* support this particular combination of algorithms */
7450 	if (op == NULL && ut_params->op->status ==
7451 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7452 		printf("Device doesn't support this mixed combination. "
7453 				"Test Skipped.\n");
7454 		return TEST_SKIPPED;
7455 	}
7456 	ut_params->op = op;
7457 
7458 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7459 
7460 	ut_params->obuf = (op_mode == IN_PLACE ?
7461 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7462 
7463 	if (verify) {
7464 		if (ut_params->obuf)
7465 			plaintext = rte_pktmbuf_mtod(ut_params->obuf,
7466 							uint8_t *);
7467 		else
7468 			plaintext = ciphertext +
7469 					(tdata->cipher.offset_bits >> 3);
7470 
7471 		debug_hexdump(stdout, "plaintext:", plaintext,
7472 				tdata->plaintext.len_bits >> 3);
7473 		debug_hexdump(stdout, "plaintext expected:",
7474 				tdata->plaintext.data,
7475 				tdata->plaintext.len_bits >> 3);
7476 	} else {
7477 		if (ut_params->obuf)
7478 			ciphertext = rte_pktmbuf_mtod(ut_params->obuf,
7479 					uint8_t *);
7480 		else
7481 			ciphertext = plaintext;
7482 
7483 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7484 				ciphertext_len);
7485 		debug_hexdump(stdout, "ciphertext expected:",
7486 				tdata->ciphertext.data,
7487 				tdata->ciphertext.len_bits >> 3);
7488 
7489 		ut_params->digest = rte_pktmbuf_mtod(ut_params->obuf, uint8_t *)
7490 				+ (tdata->digest_enc.offset == 0 ?
7491 		plaintext_pad_len : tdata->digest_enc.offset);
7492 
7493 		debug_hexdump(stdout, "digest:", ut_params->digest,
7494 				tdata->digest_enc.len);
7495 		debug_hexdump(stdout, "digest expected:",
7496 				tdata->digest_enc.data,
7497 				tdata->digest_enc.len);
7498 	}
7499 
7500 	if (!verify) {
7501 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7502 				ut_params->digest,
7503 				tdata->digest_enc.data,
7504 				tdata->digest_enc.len,
7505 				"Generated auth tag not as expected");
7506 	}
7507 
7508 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7509 		if (verify) {
7510 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7511 					plaintext,
7512 					tdata->plaintext.data,
7513 					tdata->plaintext.len_bits >> 3,
7514 					"Plaintext data not as expected");
7515 		} else {
7516 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7517 					ciphertext,
7518 					tdata->ciphertext.data,
7519 					tdata->validDataLen.len_bits,
7520 					"Ciphertext data not as expected");
7521 		}
7522 	}
7523 
7524 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7525 			"crypto op processing failed");
7526 
7527 	return 0;
7528 }
7529 
7530 static int
7531 test_mixed_auth_cipher_sgl(const struct mixed_cipher_auth_test_data *tdata,
7532 	uint8_t op_mode, uint8_t verify)
7533 {
7534 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7535 	struct crypto_unittest_params *ut_params = &unittest_params;
7536 
7537 	int retval;
7538 
7539 	const uint8_t *plaintext = NULL;
7540 	const uint8_t *ciphertext = NULL;
7541 	const uint8_t *digest = NULL;
7542 	unsigned int plaintext_pad_len;
7543 	unsigned int plaintext_len;
7544 	unsigned int ciphertext_pad_len;
7545 	unsigned int ciphertext_len;
7546 	uint8_t buffer[10000];
7547 	uint8_t digest_buffer[10000];
7548 
7549 	struct rte_cryptodev_info dev_info;
7550 	struct rte_crypto_op *op;
7551 
7552 	/* Check if device supports particular algorithms */
7553 	if (test_mixed_check_if_unsupported(tdata))
7554 		return TEST_SKIPPED;
7555 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
7556 		return TEST_SKIPPED;
7557 
7558 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
7559 
7560 	uint64_t feat_flags = dev_info.feature_flags;
7561 
7562 	if (op_mode == IN_PLACE) {
7563 		if (!(feat_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) {
7564 			printf("Device doesn't support in-place scatter-gather "
7565 					"in both input and output mbufs.\n");
7566 			return TEST_SKIPPED;
7567 		}
7568 	} else {
7569 		if (!(feat_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)) {
7570 			printf("Device doesn't support out-of-place scatter-gather "
7571 					"in both input and output mbufs.\n");
7572 			return TEST_SKIPPED;
7573 		}
7574 		if (!(feat_flags & RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED)) {
7575 			printf("Device doesn't support digest encrypted.\n");
7576 			return TEST_SKIPPED;
7577 		}
7578 	}
7579 
7580 	/* Create the session */
7581 	if (verify)
7582 		retval = create_wireless_algo_cipher_auth_session(
7583 				ts_params->valid_devs[0],
7584 				RTE_CRYPTO_CIPHER_OP_DECRYPT,
7585 				RTE_CRYPTO_AUTH_OP_VERIFY,
7586 				tdata->auth_algo,
7587 				tdata->cipher_algo,
7588 				tdata->auth_key.data, tdata->auth_key.len,
7589 				tdata->auth_iv.len, tdata->digest_enc.len,
7590 				tdata->cipher_iv.len);
7591 	else
7592 		retval = create_wireless_algo_auth_cipher_session(
7593 				ts_params->valid_devs[0],
7594 				RTE_CRYPTO_CIPHER_OP_ENCRYPT,
7595 				RTE_CRYPTO_AUTH_OP_GENERATE,
7596 				tdata->auth_algo,
7597 				tdata->cipher_algo,
7598 				tdata->auth_key.data, tdata->auth_key.len,
7599 				tdata->auth_iv.len, tdata->digest_enc.len,
7600 				tdata->cipher_iv.len);
7601 	if (retval != 0)
7602 		return retval;
7603 
7604 	ciphertext_len = ceil_byte_length(tdata->ciphertext.len_bits);
7605 	plaintext_len = ceil_byte_length(tdata->plaintext.len_bits);
7606 	ciphertext_pad_len = RTE_ALIGN_CEIL(ciphertext_len, 16);
7607 	plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
7608 
7609 	ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
7610 			ciphertext_pad_len, 15, 0);
7611 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
7612 			"Failed to allocate input buffer in mempool");
7613 
7614 	if (op_mode == OUT_OF_PLACE) {
7615 		ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
7616 				plaintext_pad_len, 15, 0);
7617 		TEST_ASSERT_NOT_NULL(ut_params->obuf,
7618 				"Failed to allocate output buffer in mempool");
7619 	}
7620 
7621 	if (verify) {
7622 		pktmbuf_write(ut_params->ibuf, 0, ciphertext_len,
7623 			tdata->ciphertext.data);
7624 		ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7625 					ciphertext_len, buffer);
7626 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7627 			ciphertext_len);
7628 	} else {
7629 		pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
7630 			tdata->plaintext.data);
7631 		plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7632 					plaintext_len, buffer);
7633 		debug_hexdump(stdout, "plaintext:", plaintext,
7634 			plaintext_len);
7635 	}
7636 	memset(buffer, 0, sizeof(buffer));
7637 
7638 	/* Create the operation */
7639 	retval = create_wireless_algo_auth_cipher_operation(
7640 			tdata->digest_enc.data, tdata->digest_enc.len,
7641 			tdata->cipher_iv.data, tdata->cipher_iv.len,
7642 			tdata->auth_iv.data, tdata->auth_iv.len,
7643 			(tdata->digest_enc.offset == 0 ?
7644 				plaintext_pad_len
7645 				: tdata->digest_enc.offset),
7646 			tdata->validCipherLen.len_bits,
7647 			tdata->cipher.offset_bits,
7648 			tdata->validAuthLen.len_bits,
7649 			tdata->auth.offset_bits,
7650 			op_mode, 1, verify);
7651 
7652 	if (retval < 0)
7653 		return retval;
7654 
7655 	op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
7656 
7657 	/* Check if the op failed because the device doesn't */
7658 	/* support this particular combination of algorithms */
7659 	if (op == NULL && ut_params->op->status ==
7660 			RTE_CRYPTO_OP_STATUS_INVALID_SESSION) {
7661 		printf("Device doesn't support this mixed combination. "
7662 				"Test Skipped.\n");
7663 		return TEST_SKIPPED;
7664 	}
7665 	ut_params->op = op;
7666 
7667 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
7668 
7669 	ut_params->obuf = (op_mode == IN_PLACE ?
7670 			ut_params->op->sym->m_src : ut_params->op->sym->m_dst);
7671 
7672 	if (verify) {
7673 		if (ut_params->obuf)
7674 			plaintext = rte_pktmbuf_read(ut_params->obuf, 0,
7675 					plaintext_len, buffer);
7676 		else
7677 			plaintext = rte_pktmbuf_read(ut_params->ibuf, 0,
7678 					plaintext_len, buffer);
7679 
7680 		debug_hexdump(stdout, "plaintext:", plaintext,
7681 				(tdata->plaintext.len_bits >> 3) -
7682 				tdata->digest_enc.len);
7683 		debug_hexdump(stdout, "plaintext expected:",
7684 				tdata->plaintext.data,
7685 				(tdata->plaintext.len_bits >> 3) -
7686 				tdata->digest_enc.len);
7687 	} else {
7688 		if (ut_params->obuf)
7689 			ciphertext = rte_pktmbuf_read(ut_params->obuf, 0,
7690 					ciphertext_len, buffer);
7691 		else
7692 			ciphertext = rte_pktmbuf_read(ut_params->ibuf, 0,
7693 					ciphertext_len, buffer);
7694 
7695 		debug_hexdump(stdout, "ciphertext:", ciphertext,
7696 			ciphertext_len);
7697 		debug_hexdump(stdout, "ciphertext expected:",
7698 			tdata->ciphertext.data,
7699 			tdata->ciphertext.len_bits >> 3);
7700 
7701 		if (ut_params->obuf)
7702 			digest = rte_pktmbuf_read(ut_params->obuf,
7703 					(tdata->digest_enc.offset == 0 ?
7704 						plaintext_pad_len :
7705 						tdata->digest_enc.offset),
7706 					tdata->digest_enc.len, digest_buffer);
7707 		else
7708 			digest = rte_pktmbuf_read(ut_params->ibuf,
7709 					(tdata->digest_enc.offset == 0 ?
7710 						plaintext_pad_len :
7711 						tdata->digest_enc.offset),
7712 					tdata->digest_enc.len, digest_buffer);
7713 
7714 		debug_hexdump(stdout, "digest:", digest,
7715 				tdata->digest_enc.len);
7716 		debug_hexdump(stdout, "digest expected:",
7717 				tdata->digest_enc.data, tdata->digest_enc.len);
7718 	}
7719 
7720 	if (!verify) {
7721 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
7722 				digest,
7723 				tdata->digest_enc.data,
7724 				tdata->digest_enc.len,
7725 				"Generated auth tag not as expected");
7726 	}
7727 
7728 	if (tdata->cipher_algo != RTE_CRYPTO_CIPHER_NULL) {
7729 		if (verify) {
7730 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7731 					plaintext,
7732 					tdata->plaintext.data,
7733 					tdata->plaintext.len_bits >> 3,
7734 					"Plaintext data not as expected");
7735 		} else {
7736 			TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
7737 					ciphertext,
7738 					tdata->ciphertext.data,
7739 					tdata->validDataLen.len_bits,
7740 					"Ciphertext data not as expected");
7741 		}
7742 	}
7743 
7744 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
7745 			"crypto op processing failed");
7746 
7747 	return 0;
7748 }
7749 
7750 /** AUTH AES CMAC + CIPHER AES CTR */
7751 
7752 static int
7753 test_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7754 {
7755 	return test_mixed_auth_cipher(
7756 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7757 }
7758 
7759 static int
7760 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7761 {
7762 	return test_mixed_auth_cipher(
7763 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7764 }
7765 
7766 static int
7767 test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7768 {
7769 	return test_mixed_auth_cipher_sgl(
7770 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 0);
7771 }
7772 
7773 static int
7774 test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7775 {
7776 	return test_mixed_auth_cipher_sgl(
7777 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7778 }
7779 
7780 static int
7781 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1(void)
7782 {
7783 	return test_mixed_auth_cipher(
7784 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7785 }
7786 
7787 static int
7788 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop(void)
7789 {
7790 	return test_mixed_auth_cipher(
7791 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7792 }
7793 
7794 static int
7795 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl(void)
7796 {
7797 	return test_mixed_auth_cipher_sgl(
7798 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, IN_PLACE, 1);
7799 }
7800 
7801 static int
7802 test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl(void)
7803 {
7804 	return test_mixed_auth_cipher_sgl(
7805 		&auth_aes_cmac_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7806 }
7807 
7808 /** MIXED AUTH + CIPHER */
7809 
7810 static int
7811 test_auth_zuc_cipher_snow_test_case_1(void)
7812 {
7813 	return test_mixed_auth_cipher(
7814 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7815 }
7816 
7817 static int
7818 test_verify_auth_zuc_cipher_snow_test_case_1(void)
7819 {
7820 	return test_mixed_auth_cipher(
7821 		&auth_zuc_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7822 }
7823 
7824 static int
7825 test_auth_aes_cmac_cipher_snow_test_case_1(void)
7826 {
7827 	return test_mixed_auth_cipher(
7828 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7829 }
7830 
7831 static int
7832 test_verify_auth_aes_cmac_cipher_snow_test_case_1(void)
7833 {
7834 	return test_mixed_auth_cipher(
7835 		&auth_aes_cmac_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7836 }
7837 
7838 static int
7839 test_auth_zuc_cipher_aes_ctr_test_case_1(void)
7840 {
7841 	return test_mixed_auth_cipher(
7842 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7843 }
7844 
7845 static int
7846 test_verify_auth_zuc_cipher_aes_ctr_test_case_1(void)
7847 {
7848 	return test_mixed_auth_cipher(
7849 		&auth_zuc_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7850 }
7851 
7852 static int
7853 test_auth_snow_cipher_aes_ctr_test_case_1(void)
7854 {
7855 	return test_mixed_auth_cipher(
7856 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7857 }
7858 
7859 static int
7860 test_verify_auth_snow_cipher_aes_ctr_test_case_1(void)
7861 {
7862 	return test_mixed_auth_cipher(
7863 		&auth_snow_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7864 }
7865 
7866 static int
7867 test_auth_snow_cipher_zuc_test_case_1(void)
7868 {
7869 	return test_mixed_auth_cipher(
7870 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7871 }
7872 
7873 static int
7874 test_verify_auth_snow_cipher_zuc_test_case_1(void)
7875 {
7876 	return test_mixed_auth_cipher(
7877 		&auth_snow_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7878 }
7879 
7880 static int
7881 test_auth_aes_cmac_cipher_zuc_test_case_1(void)
7882 {
7883 	return test_mixed_auth_cipher(
7884 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7885 }
7886 
7887 static int
7888 test_verify_auth_aes_cmac_cipher_zuc_test_case_1(void)
7889 {
7890 	return test_mixed_auth_cipher(
7891 		&auth_aes_cmac_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7892 }
7893 
7894 static int
7895 test_auth_null_cipher_snow_test_case_1(void)
7896 {
7897 	return test_mixed_auth_cipher(
7898 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 0);
7899 }
7900 
7901 static int
7902 test_verify_auth_null_cipher_snow_test_case_1(void)
7903 {
7904 	return test_mixed_auth_cipher(
7905 		&auth_null_cipher_snow_test_case_1, OUT_OF_PLACE, 1);
7906 }
7907 
7908 static int
7909 test_auth_null_cipher_zuc_test_case_1(void)
7910 {
7911 	return test_mixed_auth_cipher(
7912 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 0);
7913 }
7914 
7915 static int
7916 test_verify_auth_null_cipher_zuc_test_case_1(void)
7917 {
7918 	return test_mixed_auth_cipher(
7919 		&auth_null_cipher_zuc_test_case_1, OUT_OF_PLACE, 1);
7920 }
7921 
7922 static int
7923 test_auth_snow_cipher_null_test_case_1(void)
7924 {
7925 	return test_mixed_auth_cipher(
7926 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7927 }
7928 
7929 static int
7930 test_verify_auth_snow_cipher_null_test_case_1(void)
7931 {
7932 	return test_mixed_auth_cipher(
7933 		&auth_snow_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7934 }
7935 
7936 static int
7937 test_auth_zuc_cipher_null_test_case_1(void)
7938 {
7939 	return test_mixed_auth_cipher(
7940 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7941 }
7942 
7943 static int
7944 test_verify_auth_zuc_cipher_null_test_case_1(void)
7945 {
7946 	return test_mixed_auth_cipher(
7947 		&auth_zuc_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7948 }
7949 
7950 static int
7951 test_auth_null_cipher_aes_ctr_test_case_1(void)
7952 {
7953 	return test_mixed_auth_cipher(
7954 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 0);
7955 }
7956 
7957 static int
7958 test_verify_auth_null_cipher_aes_ctr_test_case_1(void)
7959 {
7960 	return test_mixed_auth_cipher(
7961 		&auth_null_cipher_aes_ctr_test_case_1, OUT_OF_PLACE, 1);
7962 }
7963 
7964 static int
7965 test_auth_aes_cmac_cipher_null_test_case_1(void)
7966 {
7967 	return test_mixed_auth_cipher(
7968 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 0);
7969 }
7970 
7971 static int
7972 test_verify_auth_aes_cmac_cipher_null_test_case_1(void)
7973 {
7974 	return test_mixed_auth_cipher(
7975 		&auth_aes_cmac_cipher_null_test_case_1, OUT_OF_PLACE, 1);
7976 }
7977 
7978 /* ***** AEAD algorithm Tests ***** */
7979 
7980 static int
7981 create_aead_session(uint8_t dev_id, enum rte_crypto_aead_algorithm algo,
7982 		enum rte_crypto_aead_operation op,
7983 		const uint8_t *key, const uint8_t key_len,
7984 		const uint16_t aad_len, const uint8_t auth_len,
7985 		uint8_t iv_len)
7986 {
7987 	uint8_t aead_key[key_len];
7988 	int status;
7989 
7990 	struct crypto_testsuite_params *ts_params = &testsuite_params;
7991 	struct crypto_unittest_params *ut_params = &unittest_params;
7992 
7993 	memcpy(aead_key, key, key_len);
7994 
7995 	/* Setup AEAD Parameters */
7996 	ut_params->aead_xform.type = RTE_CRYPTO_SYM_XFORM_AEAD;
7997 	ut_params->aead_xform.next = NULL;
7998 	ut_params->aead_xform.aead.algo = algo;
7999 	ut_params->aead_xform.aead.op = op;
8000 	ut_params->aead_xform.aead.key.data = aead_key;
8001 	ut_params->aead_xform.aead.key.length = key_len;
8002 	ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
8003 	ut_params->aead_xform.aead.iv.length = iv_len;
8004 	ut_params->aead_xform.aead.digest_length = auth_len;
8005 	ut_params->aead_xform.aead.aad_length = aad_len;
8006 
8007 	debug_hexdump(stdout, "key:", key, key_len);
8008 
8009 	/* Create Crypto session*/
8010 	ut_params->sess = rte_cryptodev_sym_session_create(
8011 			ts_params->session_mpool);
8012 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
8013 
8014 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
8015 			&ut_params->aead_xform,
8016 			ts_params->session_priv_mpool);
8017 
8018 	return status;
8019 }
8020 
8021 static int
8022 create_aead_xform(struct rte_crypto_op *op,
8023 		enum rte_crypto_aead_algorithm algo,
8024 		enum rte_crypto_aead_operation aead_op,
8025 		uint8_t *key, const uint8_t key_len,
8026 		const uint8_t aad_len, const uint8_t auth_len,
8027 		uint8_t iv_len)
8028 {
8029 	TEST_ASSERT_NOT_NULL(rte_crypto_op_sym_xforms_alloc(op, 1),
8030 			"failed to allocate space for crypto transform");
8031 
8032 	struct rte_crypto_sym_op *sym_op = op->sym;
8033 
8034 	/* Setup AEAD Parameters */
8035 	sym_op->xform->type = RTE_CRYPTO_SYM_XFORM_AEAD;
8036 	sym_op->xform->next = NULL;
8037 	sym_op->xform->aead.algo = algo;
8038 	sym_op->xform->aead.op = aead_op;
8039 	sym_op->xform->aead.key.data = key;
8040 	sym_op->xform->aead.key.length = key_len;
8041 	sym_op->xform->aead.iv.offset = IV_OFFSET;
8042 	sym_op->xform->aead.iv.length = iv_len;
8043 	sym_op->xform->aead.digest_length = auth_len;
8044 	sym_op->xform->aead.aad_length = aad_len;
8045 
8046 	debug_hexdump(stdout, "key:", key, key_len);
8047 
8048 	return 0;
8049 }
8050 
8051 static int
8052 create_aead_operation(enum rte_crypto_aead_operation op,
8053 		const struct aead_test_data *tdata)
8054 {
8055 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8056 	struct crypto_unittest_params *ut_params = &unittest_params;
8057 
8058 	uint8_t *plaintext, *ciphertext;
8059 	unsigned int aad_pad_len, plaintext_pad_len;
8060 
8061 	/* Generate Crypto op data structure */
8062 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8063 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8064 	TEST_ASSERT_NOT_NULL(ut_params->op,
8065 			"Failed to allocate symmetric crypto operation struct");
8066 
8067 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
8068 
8069 	/* Append aad data */
8070 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
8071 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len + 18, 16);
8072 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8073 				aad_pad_len);
8074 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8075 				"no room to append aad");
8076 
8077 		sym_op->aead.aad.phys_addr =
8078 				rte_pktmbuf_iova(ut_params->ibuf);
8079 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
8080 		memcpy(sym_op->aead.aad.data + 18, tdata->aad.data, tdata->aad.len);
8081 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8082 			tdata->aad.len);
8083 
8084 		/* Append IV at the end of the crypto operation*/
8085 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8086 				uint8_t *, IV_OFFSET);
8087 
8088 		/* Copy IV 1 byte after the IV pointer, according to the API */
8089 		rte_memcpy(iv_ptr + 1, tdata->iv.data, tdata->iv.len);
8090 		debug_hexdump(stdout, "iv:", iv_ptr,
8091 			tdata->iv.len);
8092 	} else {
8093 		aad_pad_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
8094 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8095 				aad_pad_len);
8096 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
8097 				"no room to append aad");
8098 
8099 		sym_op->aead.aad.phys_addr =
8100 				rte_pktmbuf_iova(ut_params->ibuf);
8101 		memcpy(sym_op->aead.aad.data, tdata->aad.data, tdata->aad.len);
8102 		debug_hexdump(stdout, "aad:", sym_op->aead.aad.data,
8103 			tdata->aad.len);
8104 
8105 		/* Append IV at the end of the crypto operation*/
8106 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
8107 				uint8_t *, IV_OFFSET);
8108 
8109 		if (tdata->iv.len == 0) {
8110 			rte_memcpy(iv_ptr, tdata->iv.data, AES_GCM_J0_LENGTH);
8111 			debug_hexdump(stdout, "iv:", iv_ptr,
8112 				AES_GCM_J0_LENGTH);
8113 		} else {
8114 			rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
8115 			debug_hexdump(stdout, "iv:", iv_ptr,
8116 				tdata->iv.len);
8117 		}
8118 	}
8119 
8120 	/* Append plaintext/ciphertext */
8121 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8122 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8123 		plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8124 				plaintext_pad_len);
8125 		TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
8126 
8127 		memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
8128 		debug_hexdump(stdout, "plaintext:", plaintext,
8129 				tdata->plaintext.len);
8130 
8131 		if (ut_params->obuf) {
8132 			ciphertext = (uint8_t *)rte_pktmbuf_append(
8133 					ut_params->obuf,
8134 					plaintext_pad_len + aad_pad_len);
8135 			TEST_ASSERT_NOT_NULL(ciphertext,
8136 					"no room to append ciphertext");
8137 
8138 			memset(ciphertext + aad_pad_len, 0,
8139 					tdata->ciphertext.len);
8140 		}
8141 	} else {
8142 		plaintext_pad_len = RTE_ALIGN_CEIL(tdata->ciphertext.len, 16);
8143 		ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8144 				plaintext_pad_len);
8145 		TEST_ASSERT_NOT_NULL(ciphertext,
8146 				"no room to append ciphertext");
8147 
8148 		memcpy(ciphertext, tdata->ciphertext.data,
8149 				tdata->ciphertext.len);
8150 		debug_hexdump(stdout, "ciphertext:", ciphertext,
8151 				tdata->ciphertext.len);
8152 
8153 		if (ut_params->obuf) {
8154 			plaintext = (uint8_t *)rte_pktmbuf_append(
8155 					ut_params->obuf,
8156 					plaintext_pad_len + aad_pad_len);
8157 			TEST_ASSERT_NOT_NULL(plaintext,
8158 					"no room to append plaintext");
8159 
8160 			memset(plaintext + aad_pad_len, 0,
8161 					tdata->plaintext.len);
8162 		}
8163 	}
8164 
8165 	/* Append digest data */
8166 	if (op == RTE_CRYPTO_AEAD_OP_ENCRYPT) {
8167 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8168 				ut_params->obuf ? ut_params->obuf :
8169 						ut_params->ibuf,
8170 						tdata->auth_tag.len);
8171 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8172 				"no room to append digest");
8173 		memset(sym_op->aead.digest.data, 0, tdata->auth_tag.len);
8174 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8175 				ut_params->obuf ? ut_params->obuf :
8176 						ut_params->ibuf,
8177 						plaintext_pad_len +
8178 						aad_pad_len);
8179 	} else {
8180 		sym_op->aead.digest.data = (uint8_t *)rte_pktmbuf_append(
8181 				ut_params->ibuf, tdata->auth_tag.len);
8182 		TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
8183 				"no room to append digest");
8184 		sym_op->aead.digest.phys_addr = rte_pktmbuf_iova_offset(
8185 				ut_params->ibuf,
8186 				plaintext_pad_len + aad_pad_len);
8187 
8188 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
8189 			tdata->auth_tag.len);
8190 		debug_hexdump(stdout, "digest:",
8191 			sym_op->aead.digest.data,
8192 			tdata->auth_tag.len);
8193 	}
8194 
8195 	sym_op->aead.data.length = tdata->plaintext.len;
8196 	sym_op->aead.data.offset = aad_pad_len;
8197 
8198 	return 0;
8199 }
8200 
8201 static int
8202 test_authenticated_encryption(const struct aead_test_data *tdata)
8203 {
8204 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8205 	struct crypto_unittest_params *ut_params = &unittest_params;
8206 
8207 	int retval;
8208 	uint8_t *ciphertext, *auth_tag;
8209 	uint16_t plaintext_pad_len;
8210 	uint32_t i;
8211 	struct rte_cryptodev_info dev_info;
8212 
8213 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8214 	uint64_t feat_flags = dev_info.feature_flags;
8215 
8216 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8217 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8218 		printf("Device doesn't support RAW data-path APIs.\n");
8219 		return TEST_SKIPPED;
8220 	}
8221 
8222 	/* Verify the capabilities */
8223 	struct rte_cryptodev_sym_capability_idx cap_idx;
8224 	const struct rte_cryptodev_symmetric_capability *capability;
8225 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
8226 	cap_idx.algo.aead = tdata->algo;
8227 	capability = rte_cryptodev_sym_capability_get(
8228 			ts_params->valid_devs[0], &cap_idx);
8229 	if (capability == NULL)
8230 		return TEST_SKIPPED;
8231 	if (rte_cryptodev_sym_capability_check_aead(
8232 			capability, tdata->key.len, tdata->auth_tag.len,
8233 			tdata->aad.len, tdata->iv.len))
8234 		return TEST_SKIPPED;
8235 
8236 	/* Create AEAD session */
8237 	retval = create_aead_session(ts_params->valid_devs[0],
8238 			tdata->algo,
8239 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
8240 			tdata->key.data, tdata->key.len,
8241 			tdata->aad.len, tdata->auth_tag.len,
8242 			tdata->iv.len);
8243 	if (retval < 0)
8244 		return retval;
8245 
8246 	if (tdata->aad.len > MBUF_SIZE) {
8247 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
8248 		/* Populate full size of add data */
8249 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
8250 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
8251 	} else
8252 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8253 
8254 	/* clear mbuf payload */
8255 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8256 			rte_pktmbuf_tailroom(ut_params->ibuf));
8257 
8258 	/* Create AEAD operation */
8259 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
8260 	if (retval < 0)
8261 		return retval;
8262 
8263 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
8264 
8265 	ut_params->op->sym->m_src = ut_params->ibuf;
8266 
8267 	/* Process crypto operation */
8268 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
8269 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
8270 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
8271 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8272 				ut_params->op, 0, 0, 0, 0);
8273 	else
8274 		TEST_ASSERT_NOT_NULL(
8275 			process_crypto_request(ts_params->valid_devs[0],
8276 			ut_params->op), "failed to process sym crypto op");
8277 
8278 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
8279 			"crypto op processing failed");
8280 
8281 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
8282 
8283 	if (ut_params->op->sym->m_dst) {
8284 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8285 				uint8_t *);
8286 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
8287 				uint8_t *, plaintext_pad_len);
8288 	} else {
8289 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
8290 				uint8_t *,
8291 				ut_params->op->sym->cipher.data.offset);
8292 		auth_tag = ciphertext + plaintext_pad_len;
8293 	}
8294 
8295 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
8296 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
8297 
8298 	/* Validate obuf */
8299 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8300 			ciphertext,
8301 			tdata->ciphertext.data,
8302 			tdata->ciphertext.len,
8303 			"Ciphertext data not as expected");
8304 
8305 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
8306 			auth_tag,
8307 			tdata->auth_tag.data,
8308 			tdata->auth_tag.len,
8309 			"Generated auth tag not as expected");
8310 
8311 	return 0;
8312 
8313 }
8314 
8315 #ifdef RTE_LIB_SECURITY
8316 static int
8317 security_proto_supported(enum rte_security_session_action_type action,
8318 	enum rte_security_session_protocol proto)
8319 {
8320 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8321 
8322 	const struct rte_security_capability *capabilities;
8323 	const struct rte_security_capability *capability;
8324 	uint16_t i = 0;
8325 
8326 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8327 				rte_cryptodev_get_sec_ctx(
8328 				ts_params->valid_devs[0]);
8329 
8330 
8331 	capabilities = rte_security_capabilities_get(ctx);
8332 
8333 	if (capabilities == NULL)
8334 		return -ENOTSUP;
8335 
8336 	while ((capability = &capabilities[i++])->action !=
8337 			RTE_SECURITY_ACTION_TYPE_NONE) {
8338 		if (capability->action == action &&
8339 				capability->protocol == proto)
8340 			return 0;
8341 	}
8342 
8343 	return -ENOTSUP;
8344 }
8345 
8346 /* Basic algorithm run function for async inplace mode.
8347  * Creates a session from input parameters and runs one operation
8348  * on input_vec. Checks the output of the crypto operation against
8349  * output_vec.
8350  */
8351 static int test_pdcp_proto(int i, int oop, enum rte_crypto_cipher_operation opc,
8352 			   enum rte_crypto_auth_operation opa,
8353 			   const uint8_t *input_vec, unsigned int input_vec_len,
8354 			   const uint8_t *output_vec,
8355 			   unsigned int output_vec_len,
8356 			   enum rte_crypto_cipher_algorithm cipher_alg,
8357 			   const uint8_t *cipher_key, uint32_t cipher_key_len,
8358 			   enum rte_crypto_auth_algorithm auth_alg,
8359 			   const uint8_t *auth_key, uint32_t auth_key_len,
8360 			   uint8_t bearer, enum rte_security_pdcp_domain domain,
8361 			   uint8_t packet_direction, uint8_t sn_size,
8362 			   uint32_t hfn, uint32_t hfn_threshold, uint8_t sdap)
8363 {
8364 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8365 	struct crypto_unittest_params *ut_params = &unittest_params;
8366 	uint8_t *plaintext;
8367 	int ret = TEST_SUCCESS;
8368 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8369 				rte_cryptodev_get_sec_ctx(
8370 				ts_params->valid_devs[0]);
8371 	struct rte_cryptodev_info dev_info;
8372 	uint64_t feat_flags;
8373 
8374 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8375 	feat_flags = dev_info.feature_flags;
8376 
8377 	/* Verify the capabilities */
8378 	struct rte_security_capability_idx sec_cap_idx;
8379 
8380 	sec_cap_idx.action = ut_params->type;
8381 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8382 	sec_cap_idx.pdcp.domain = domain;
8383 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8384 		return TEST_SKIPPED;
8385 
8386 	/* Generate test mbuf data */
8387 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8388 
8389 	/* clear mbuf payload */
8390 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8391 			rte_pktmbuf_tailroom(ut_params->ibuf));
8392 
8393 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8394 						  input_vec_len);
8395 	memcpy(plaintext, input_vec, input_vec_len);
8396 
8397 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8398 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8399 		printf("Device does not support RAW data-path APIs.\n");
8400 		return TEST_SKIPPED;
8401 	}
8402 	/* Out of place support */
8403 	if (oop) {
8404 		/*
8405 		 * For out-op-place we need to alloc another mbuf
8406 		 */
8407 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8408 		rte_pktmbuf_append(ut_params->obuf, output_vec_len);
8409 	}
8410 
8411 	/* Setup Cipher Parameters */
8412 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8413 	ut_params->cipher_xform.cipher.algo = cipher_alg;
8414 	ut_params->cipher_xform.cipher.op = opc;
8415 	ut_params->cipher_xform.cipher.key.data = cipher_key;
8416 	ut_params->cipher_xform.cipher.key.length = cipher_key_len;
8417 	ut_params->cipher_xform.cipher.iv.length =
8418 				packet_direction ? 4 : 0;
8419 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
8420 
8421 	/* Setup HMAC Parameters if ICV header is required */
8422 	if (auth_alg != 0) {
8423 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8424 		ut_params->auth_xform.next = NULL;
8425 		ut_params->auth_xform.auth.algo = auth_alg;
8426 		ut_params->auth_xform.auth.op = opa;
8427 		ut_params->auth_xform.auth.key.data = auth_key;
8428 		ut_params->auth_xform.auth.key.length = auth_key_len;
8429 
8430 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8431 	} else {
8432 		ut_params->cipher_xform.next = NULL;
8433 	}
8434 
8435 	struct rte_security_session_conf sess_conf = {
8436 		.action_type = ut_params->type,
8437 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8438 		{.pdcp = {
8439 			.bearer = bearer,
8440 			.domain = domain,
8441 			.pkt_dir = packet_direction,
8442 			.sn_size = sn_size,
8443 			.hfn = packet_direction ? 0 : hfn,
8444 			/**
8445 			 * hfn can be set as pdcp_test_hfn[i]
8446 			 * if hfn_ovrd is not set. Here, PDCP
8447 			 * packet direction is just used to
8448 			 * run half of the cases with session
8449 			 * HFN and other half with per packet
8450 			 * HFN.
8451 			 */
8452 			.hfn_threshold = hfn_threshold,
8453 			.hfn_ovrd = packet_direction ? 1 : 0,
8454 			.sdap_enabled = sdap,
8455 		} },
8456 		.crypto_xform = &ut_params->cipher_xform
8457 	};
8458 
8459 	/* Create security session */
8460 	ut_params->sec_session = rte_security_session_create(ctx,
8461 				&sess_conf, ts_params->session_mpool,
8462 				ts_params->session_priv_mpool);
8463 
8464 	if (!ut_params->sec_session) {
8465 		printf("TestCase %s()-%d line %d failed %s: ",
8466 			__func__, i, __LINE__, "Failed to allocate session");
8467 		ret = TEST_FAILED;
8468 		goto on_err;
8469 	}
8470 
8471 	/* Generate crypto op data structure */
8472 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8473 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8474 	if (!ut_params->op) {
8475 		printf("TestCase %s()-%d line %d failed %s: ",
8476 			__func__, i, __LINE__,
8477 			"Failed to allocate symmetric crypto operation struct");
8478 		ret = TEST_FAILED;
8479 		goto on_err;
8480 	}
8481 
8482 	uint32_t *per_pkt_hfn = rte_crypto_op_ctod_offset(ut_params->op,
8483 					uint32_t *, IV_OFFSET);
8484 	*per_pkt_hfn = packet_direction ? hfn : 0;
8485 
8486 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8487 
8488 	/* set crypto operation source mbuf */
8489 	ut_params->op->sym->m_src = ut_params->ibuf;
8490 	if (oop)
8491 		ut_params->op->sym->m_dst = ut_params->obuf;
8492 
8493 	/* Process crypto operation */
8494 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8495 		/* filling lengths */
8496 		ut_params->op->sym->cipher.data.length = ut_params->op->sym->m_src->pkt_len;
8497 		ut_params->op->sym->auth.data.length = ut_params->op->sym->m_src->pkt_len;
8498 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8499 			ut_params->op, 1, 1, 0, 0);
8500 	} else {
8501 		ut_params->op = process_crypto_request(ts_params->valid_devs[0], ut_params->op);
8502 	}
8503 	if (ut_params->op == NULL) {
8504 		printf("TestCase %s()-%d line %d failed %s: ",
8505 			__func__, i, __LINE__,
8506 			"failed to process sym crypto op");
8507 		ret = TEST_FAILED;
8508 		goto on_err;
8509 	}
8510 
8511 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8512 		printf("TestCase %s()-%d line %d failed %s: ",
8513 			__func__, i, __LINE__, "crypto op processing failed");
8514 		ret = TEST_FAILED;
8515 		goto on_err;
8516 	}
8517 
8518 	/* Validate obuf */
8519 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8520 			uint8_t *);
8521 	if (oop) {
8522 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8523 				uint8_t *);
8524 	}
8525 
8526 	if (memcmp(ciphertext, output_vec, output_vec_len)) {
8527 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8528 		rte_hexdump(stdout, "encrypted", ciphertext, output_vec_len);
8529 		rte_hexdump(stdout, "reference", output_vec, output_vec_len);
8530 		ret = TEST_FAILED;
8531 		goto on_err;
8532 	}
8533 
8534 on_err:
8535 	rte_crypto_op_free(ut_params->op);
8536 	ut_params->op = NULL;
8537 
8538 	if (ut_params->sec_session)
8539 		rte_security_session_destroy(ctx, ut_params->sec_session);
8540 	ut_params->sec_session = NULL;
8541 
8542 	rte_pktmbuf_free(ut_params->ibuf);
8543 	ut_params->ibuf = NULL;
8544 	if (oop) {
8545 		rte_pktmbuf_free(ut_params->obuf);
8546 		ut_params->obuf = NULL;
8547 	}
8548 
8549 	return ret;
8550 }
8551 
8552 static int
8553 test_pdcp_proto_SGL(int i, int oop,
8554 	enum rte_crypto_cipher_operation opc,
8555 	enum rte_crypto_auth_operation opa,
8556 	uint8_t *input_vec,
8557 	unsigned int input_vec_len,
8558 	uint8_t *output_vec,
8559 	unsigned int output_vec_len,
8560 	uint32_t fragsz,
8561 	uint32_t fragsz_oop)
8562 {
8563 	struct crypto_testsuite_params *ts_params = &testsuite_params;
8564 	struct crypto_unittest_params *ut_params = &unittest_params;
8565 	uint8_t *plaintext;
8566 	struct rte_mbuf *buf, *buf_oop = NULL;
8567 	int ret = TEST_SUCCESS;
8568 	int to_trn = 0;
8569 	int to_trn_tbl[16];
8570 	int segs = 1;
8571 	unsigned int trn_data = 0;
8572 	struct rte_cryptodev_info dev_info;
8573 	uint64_t feat_flags;
8574 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
8575 				rte_cryptodev_get_sec_ctx(
8576 				ts_params->valid_devs[0]);
8577 	struct rte_mbuf *temp_mbuf;
8578 
8579 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
8580 	feat_flags = dev_info.feature_flags;
8581 
8582 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
8583 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
8584 		printf("Device does not support RAW data-path APIs.\n");
8585 		return -ENOTSUP;
8586 	}
8587 	/* Verify the capabilities */
8588 	struct rte_security_capability_idx sec_cap_idx;
8589 
8590 	sec_cap_idx.action = ut_params->type;
8591 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_PDCP;
8592 	sec_cap_idx.pdcp.domain = pdcp_test_params[i].domain;
8593 	if (rte_security_capability_get(ctx, &sec_cap_idx) == NULL)
8594 		return TEST_SKIPPED;
8595 
8596 	if (fragsz > input_vec_len)
8597 		fragsz = input_vec_len;
8598 
8599 	uint16_t plaintext_len = fragsz;
8600 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
8601 
8602 	if (fragsz_oop > output_vec_len)
8603 		frag_size_oop = output_vec_len;
8604 
8605 	int ecx = 0;
8606 	if (input_vec_len % fragsz != 0) {
8607 		if (input_vec_len / fragsz + 1 > 16)
8608 			return 1;
8609 	} else if (input_vec_len / fragsz > 16)
8610 		return 1;
8611 
8612 	/* Out of place support */
8613 	if (oop) {
8614 		/*
8615 		 * For out-op-place we need to alloc another mbuf
8616 		 */
8617 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8618 		rte_pktmbuf_append(ut_params->obuf, frag_size_oop);
8619 		buf_oop = ut_params->obuf;
8620 	}
8621 
8622 	/* Generate test mbuf data */
8623 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8624 
8625 	/* clear mbuf payload */
8626 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
8627 			rte_pktmbuf_tailroom(ut_params->ibuf));
8628 
8629 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
8630 						  plaintext_len);
8631 	memcpy(plaintext, input_vec, plaintext_len);
8632 	trn_data += plaintext_len;
8633 
8634 	buf = ut_params->ibuf;
8635 
8636 	/*
8637 	 * Loop until no more fragments
8638 	 */
8639 
8640 	while (trn_data < input_vec_len) {
8641 		++segs;
8642 		to_trn = (input_vec_len - trn_data < fragsz) ?
8643 				(input_vec_len - trn_data) : fragsz;
8644 
8645 		to_trn_tbl[ecx++] = to_trn;
8646 
8647 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
8648 		buf = buf->next;
8649 
8650 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
8651 				rte_pktmbuf_tailroom(buf));
8652 
8653 		/* OOP */
8654 		if (oop && !fragsz_oop) {
8655 			buf_oop->next =
8656 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
8657 			buf_oop = buf_oop->next;
8658 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8659 					0, rte_pktmbuf_tailroom(buf_oop));
8660 			rte_pktmbuf_append(buf_oop, to_trn);
8661 		}
8662 
8663 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
8664 				to_trn);
8665 
8666 		memcpy(plaintext, input_vec + trn_data, to_trn);
8667 		trn_data += to_trn;
8668 	}
8669 
8670 	ut_params->ibuf->nb_segs = segs;
8671 
8672 	segs = 1;
8673 	if (fragsz_oop && oop) {
8674 		to_trn = 0;
8675 		ecx = 0;
8676 
8677 		trn_data = frag_size_oop;
8678 		while (trn_data < output_vec_len) {
8679 			++segs;
8680 			to_trn =
8681 				(output_vec_len - trn_data <
8682 						frag_size_oop) ?
8683 				(output_vec_len - trn_data) :
8684 						frag_size_oop;
8685 
8686 			to_trn_tbl[ecx++] = to_trn;
8687 
8688 			buf_oop->next =
8689 				rte_pktmbuf_alloc(ts_params->mbuf_pool);
8690 			buf_oop = buf_oop->next;
8691 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
8692 					0, rte_pktmbuf_tailroom(buf_oop));
8693 			rte_pktmbuf_append(buf_oop, to_trn);
8694 
8695 			trn_data += to_trn;
8696 		}
8697 		ut_params->obuf->nb_segs = segs;
8698 	}
8699 
8700 	/* Setup Cipher Parameters */
8701 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
8702 	ut_params->cipher_xform.cipher.algo = pdcp_test_params[i].cipher_alg;
8703 	ut_params->cipher_xform.cipher.op = opc;
8704 	ut_params->cipher_xform.cipher.key.data = pdcp_test_crypto_key[i];
8705 	ut_params->cipher_xform.cipher.key.length =
8706 					pdcp_test_params[i].cipher_key_len;
8707 	ut_params->cipher_xform.cipher.iv.length = 0;
8708 
8709 	/* Setup HMAC Parameters if ICV header is required */
8710 	if (pdcp_test_params[i].auth_alg != 0) {
8711 		ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
8712 		ut_params->auth_xform.next = NULL;
8713 		ut_params->auth_xform.auth.algo = pdcp_test_params[i].auth_alg;
8714 		ut_params->auth_xform.auth.op = opa;
8715 		ut_params->auth_xform.auth.key.data = pdcp_test_auth_key[i];
8716 		ut_params->auth_xform.auth.key.length =
8717 					pdcp_test_params[i].auth_key_len;
8718 
8719 		ut_params->cipher_xform.next = &ut_params->auth_xform;
8720 	} else {
8721 		ut_params->cipher_xform.next = NULL;
8722 	}
8723 
8724 	struct rte_security_session_conf sess_conf = {
8725 		.action_type = ut_params->type,
8726 		.protocol = RTE_SECURITY_PROTOCOL_PDCP,
8727 		{.pdcp = {
8728 			.bearer = pdcp_test_bearer[i],
8729 			.domain = pdcp_test_params[i].domain,
8730 			.pkt_dir = pdcp_test_packet_direction[i],
8731 			.sn_size = pdcp_test_data_sn_size[i],
8732 			.hfn = pdcp_test_hfn[i],
8733 			.hfn_threshold = pdcp_test_hfn_threshold[i],
8734 			.hfn_ovrd = 0,
8735 		} },
8736 		.crypto_xform = &ut_params->cipher_xform
8737 	};
8738 
8739 	/* Create security session */
8740 	ut_params->sec_session = rte_security_session_create(ctx,
8741 				&sess_conf, ts_params->session_mpool,
8742 				ts_params->session_priv_mpool);
8743 
8744 	if (!ut_params->sec_session) {
8745 		printf("TestCase %s()-%d line %d failed %s: ",
8746 			__func__, i, __LINE__, "Failed to allocate session");
8747 		ret = TEST_FAILED;
8748 		goto on_err;
8749 	}
8750 
8751 	/* Generate crypto op data structure */
8752 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
8753 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
8754 	if (!ut_params->op) {
8755 		printf("TestCase %s()-%d line %d failed %s: ",
8756 			__func__, i, __LINE__,
8757 			"Failed to allocate symmetric crypto operation struct");
8758 		ret = TEST_FAILED;
8759 		goto on_err;
8760 	}
8761 
8762 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
8763 
8764 	/* set crypto operation source mbuf */
8765 	ut_params->op->sym->m_src = ut_params->ibuf;
8766 	if (oop)
8767 		ut_params->op->sym->m_dst = ut_params->obuf;
8768 
8769 	/* Process crypto operation */
8770 	temp_mbuf = ut_params->op->sym->m_src;
8771 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST) {
8772 		/* filling lengths */
8773 		while (temp_mbuf) {
8774 			ut_params->op->sym->cipher.data.length
8775 				+= temp_mbuf->pkt_len;
8776 			ut_params->op->sym->auth.data.length
8777 				+= temp_mbuf->pkt_len;
8778 			temp_mbuf = temp_mbuf->next;
8779 		}
8780 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
8781 			ut_params->op, 1, 1, 0, 0);
8782 	} else {
8783 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
8784 							ut_params->op);
8785 	}
8786 	if (ut_params->op == NULL) {
8787 		printf("TestCase %s()-%d line %d failed %s: ",
8788 			__func__, i, __LINE__,
8789 			"failed to process sym crypto op");
8790 		ret = TEST_FAILED;
8791 		goto on_err;
8792 	}
8793 
8794 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
8795 		printf("TestCase %s()-%d line %d failed %s: ",
8796 			__func__, i, __LINE__, "crypto op processing failed");
8797 		ret = TEST_FAILED;
8798 		goto on_err;
8799 	}
8800 
8801 	/* Validate obuf */
8802 	uint8_t *ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_src,
8803 			uint8_t *);
8804 	if (oop) {
8805 		ciphertext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
8806 				uint8_t *);
8807 	}
8808 	if (fragsz_oop)
8809 		fragsz = frag_size_oop;
8810 	if (memcmp(ciphertext, output_vec, fragsz)) {
8811 		printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8812 		rte_hexdump(stdout, "encrypted", ciphertext, fragsz);
8813 		rte_hexdump(stdout, "reference", output_vec, fragsz);
8814 		ret = TEST_FAILED;
8815 		goto on_err;
8816 	}
8817 
8818 	buf = ut_params->op->sym->m_src->next;
8819 	if (oop)
8820 		buf = ut_params->op->sym->m_dst->next;
8821 
8822 	unsigned int off = fragsz;
8823 
8824 	ecx = 0;
8825 	while (buf) {
8826 		ciphertext = rte_pktmbuf_mtod(buf,
8827 				uint8_t *);
8828 		if (memcmp(ciphertext, output_vec + off, to_trn_tbl[ecx])) {
8829 			printf("\n=======PDCP TestCase #%d failed: Data Mismatch ", i);
8830 			rte_hexdump(stdout, "encrypted", ciphertext, to_trn_tbl[ecx]);
8831 			rte_hexdump(stdout, "reference", output_vec + off,
8832 					to_trn_tbl[ecx]);
8833 			ret = TEST_FAILED;
8834 			goto on_err;
8835 		}
8836 		off += to_trn_tbl[ecx++];
8837 		buf = buf->next;
8838 	}
8839 on_err:
8840 	rte_crypto_op_free(ut_params->op);
8841 	ut_params->op = NULL;
8842 
8843 	if (ut_params->sec_session)
8844 		rte_security_session_destroy(ctx, ut_params->sec_session);
8845 	ut_params->sec_session = NULL;
8846 
8847 	rte_pktmbuf_free(ut_params->ibuf);
8848 	ut_params->ibuf = NULL;
8849 	if (oop) {
8850 		rte_pktmbuf_free(ut_params->obuf);
8851 		ut_params->obuf = NULL;
8852 	}
8853 
8854 	return ret;
8855 }
8856 
8857 int
8858 test_pdcp_proto_cplane_encap(int i)
8859 {
8860 	return test_pdcp_proto(
8861 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8862 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8863 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8864 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8865 		pdcp_test_params[i].cipher_key_len,
8866 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8867 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8868 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8869 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8870 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8871 }
8872 
8873 int
8874 test_pdcp_proto_uplane_encap(int i)
8875 {
8876 	return test_pdcp_proto(
8877 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8878 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8879 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8880 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8881 		pdcp_test_params[i].cipher_key_len,
8882 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8883 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8884 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8885 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8886 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8887 }
8888 
8889 int
8890 test_pdcp_proto_uplane_encap_with_int(int i)
8891 {
8892 	return test_pdcp_proto(
8893 		i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT, RTE_CRYPTO_AUTH_OP_GENERATE,
8894 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8895 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8896 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8897 		pdcp_test_params[i].cipher_key_len,
8898 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8899 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8900 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8901 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8902 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8903 }
8904 
8905 int
8906 test_pdcp_proto_cplane_decap(int i)
8907 {
8908 	return test_pdcp_proto(
8909 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8910 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8911 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8912 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8913 		pdcp_test_params[i].cipher_key_len,
8914 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8915 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8916 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8917 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8918 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8919 }
8920 
8921 int
8922 test_pdcp_proto_uplane_decap(int i)
8923 {
8924 	return test_pdcp_proto(
8925 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8926 		pdcp_test_data_out[i], pdcp_test_data_in_len[i],
8927 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8928 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8929 		pdcp_test_params[i].cipher_key_len,
8930 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8931 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8932 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8933 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8934 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8935 }
8936 
8937 int
8938 test_pdcp_proto_uplane_decap_with_int(int i)
8939 {
8940 	return test_pdcp_proto(
8941 		i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT, RTE_CRYPTO_AUTH_OP_VERIFY,
8942 		pdcp_test_data_out[i], pdcp_test_data_in_len[i] + 4,
8943 		pdcp_test_data_in[i], pdcp_test_data_in_len[i],
8944 		pdcp_test_params[i].cipher_alg, pdcp_test_crypto_key[i],
8945 		pdcp_test_params[i].cipher_key_len,
8946 		pdcp_test_params[i].auth_alg, pdcp_test_auth_key[i],
8947 		pdcp_test_params[i].auth_key_len, pdcp_test_bearer[i],
8948 		pdcp_test_params[i].domain, pdcp_test_packet_direction[i],
8949 		pdcp_test_data_sn_size[i], pdcp_test_hfn[i],
8950 		pdcp_test_hfn_threshold[i], SDAP_DISABLED);
8951 }
8952 
8953 static int
8954 test_PDCP_PROTO_SGL_in_place_32B(void)
8955 {
8956 	/* i can be used for running any PDCP case
8957 	 * In this case it is uplane 12-bit AES-SNOW DL encap
8958 	 */
8959 	int i = PDCP_UPLANE_12BIT_OFFSET + AES_ENC + SNOW_AUTH + DOWNLINK;
8960 	return test_pdcp_proto_SGL(i, IN_PLACE,
8961 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8962 			RTE_CRYPTO_AUTH_OP_GENERATE,
8963 			pdcp_test_data_in[i],
8964 			pdcp_test_data_in_len[i],
8965 			pdcp_test_data_out[i],
8966 			pdcp_test_data_in_len[i]+4,
8967 			32, 0);
8968 }
8969 static int
8970 test_PDCP_PROTO_SGL_oop_32B_128B(void)
8971 {
8972 	/* i can be used for running any PDCP case
8973 	 * In this case it is uplane 18-bit NULL-NULL DL encap
8974 	 */
8975 	int i = PDCP_UPLANE_18BIT_OFFSET + NULL_ENC + NULL_AUTH + DOWNLINK;
8976 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8977 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8978 			RTE_CRYPTO_AUTH_OP_GENERATE,
8979 			pdcp_test_data_in[i],
8980 			pdcp_test_data_in_len[i],
8981 			pdcp_test_data_out[i],
8982 			pdcp_test_data_in_len[i]+4,
8983 			32, 128);
8984 }
8985 static int
8986 test_PDCP_PROTO_SGL_oop_32B_40B(void)
8987 {
8988 	/* i can be used for running any PDCP case
8989 	 * In this case it is uplane 18-bit AES DL encap
8990 	 */
8991 	int i = PDCP_UPLANE_OFFSET + AES_ENC + EIGHTEEN_BIT_SEQ_NUM_OFFSET
8992 			+ DOWNLINK;
8993 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
8994 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
8995 			RTE_CRYPTO_AUTH_OP_GENERATE,
8996 			pdcp_test_data_in[i],
8997 			pdcp_test_data_in_len[i],
8998 			pdcp_test_data_out[i],
8999 			pdcp_test_data_in_len[i],
9000 			32, 40);
9001 }
9002 static int
9003 test_PDCP_PROTO_SGL_oop_128B_32B(void)
9004 {
9005 	/* i can be used for running any PDCP case
9006 	 * In this case it is cplane 12-bit AES-ZUC DL encap
9007 	 */
9008 	int i = PDCP_CPLANE_LONG_SN_OFFSET + AES_ENC + ZUC_AUTH + DOWNLINK;
9009 	return test_pdcp_proto_SGL(i, OUT_OF_PLACE,
9010 			RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9011 			RTE_CRYPTO_AUTH_OP_GENERATE,
9012 			pdcp_test_data_in[i],
9013 			pdcp_test_data_in_len[i],
9014 			pdcp_test_data_out[i],
9015 			pdcp_test_data_in_len[i]+4,
9016 			128, 32);
9017 }
9018 
9019 static int
9020 test_PDCP_SDAP_PROTO_encap_all(void)
9021 {
9022 	int i = 0, size = 0;
9023 	int err, all_err = TEST_SUCCESS;
9024 	const struct pdcp_sdap_test *cur_test;
9025 
9026 	size = RTE_DIM(list_pdcp_sdap_tests);
9027 
9028 	for (i = 0; i < size; i++) {
9029 		cur_test = &list_pdcp_sdap_tests[i];
9030 		err = test_pdcp_proto(
9031 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9032 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9033 			cur_test->in_len, cur_test->data_out,
9034 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9035 			cur_test->param.cipher_alg, cur_test->cipher_key,
9036 			cur_test->param.cipher_key_len,
9037 			cur_test->param.auth_alg,
9038 			cur_test->auth_key, cur_test->param.auth_key_len,
9039 			cur_test->bearer, cur_test->param.domain,
9040 			cur_test->packet_direction, cur_test->sn_size,
9041 			cur_test->hfn,
9042 			cur_test->hfn_threshold, SDAP_ENABLED);
9043 		if (err) {
9044 			printf("\t%d) %s: Encapsulation failed\n",
9045 					cur_test->test_idx,
9046 					cur_test->param.name);
9047 			err = TEST_FAILED;
9048 		} else {
9049 			printf("\t%d) %s: Encap PASS\n", cur_test->test_idx,
9050 					cur_test->param.name);
9051 			err = TEST_SUCCESS;
9052 		}
9053 		all_err += err;
9054 	}
9055 
9056 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9057 
9058 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9059 }
9060 
9061 static int
9062 test_PDCP_PROTO_short_mac(void)
9063 {
9064 	int i = 0, size = 0;
9065 	int err, all_err = TEST_SUCCESS;
9066 	const struct pdcp_short_mac_test *cur_test;
9067 
9068 	size = RTE_DIM(list_pdcp_smac_tests);
9069 
9070 	for (i = 0; i < size; i++) {
9071 		cur_test = &list_pdcp_smac_tests[i];
9072 		err = test_pdcp_proto(
9073 			i, 0, RTE_CRYPTO_CIPHER_OP_ENCRYPT,
9074 			RTE_CRYPTO_AUTH_OP_GENERATE, cur_test->data_in,
9075 			cur_test->in_len, cur_test->data_out,
9076 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9077 			RTE_CRYPTO_CIPHER_NULL, NULL,
9078 			0, cur_test->param.auth_alg,
9079 			cur_test->auth_key, cur_test->param.auth_key_len,
9080 			0, cur_test->param.domain, 0, 0,
9081 			0, 0, 0);
9082 		if (err) {
9083 			printf("\t%d) %s: Short MAC test failed\n",
9084 					cur_test->test_idx,
9085 					cur_test->param.name);
9086 			err = TEST_FAILED;
9087 		} else {
9088 			printf("\t%d) %s: Short MAC test PASS\n",
9089 					cur_test->test_idx,
9090 					cur_test->param.name);
9091 			rte_hexdump(stdout, "MAC I",
9092 				    cur_test->data_out + cur_test->in_len + 2,
9093 				    2);
9094 			err = TEST_SUCCESS;
9095 		}
9096 		all_err += err;
9097 	}
9098 
9099 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9100 
9101 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9102 
9103 }
9104 
9105 static int
9106 test_PDCP_SDAP_PROTO_decap_all(void)
9107 {
9108 	int i = 0, size = 0;
9109 	int err, all_err = TEST_SUCCESS;
9110 	const struct pdcp_sdap_test *cur_test;
9111 
9112 	size = RTE_DIM(list_pdcp_sdap_tests);
9113 
9114 	for (i = 0; i < size; i++) {
9115 		cur_test = &list_pdcp_sdap_tests[i];
9116 		err = test_pdcp_proto(
9117 			i, 0, RTE_CRYPTO_CIPHER_OP_DECRYPT,
9118 			RTE_CRYPTO_AUTH_OP_VERIFY,
9119 			cur_test->data_out,
9120 			cur_test->in_len + ((cur_test->auth_key) ? 4 : 0),
9121 			cur_test->data_in, cur_test->in_len,
9122 			cur_test->param.cipher_alg,
9123 			cur_test->cipher_key, cur_test->param.cipher_key_len,
9124 			cur_test->param.auth_alg, cur_test->auth_key,
9125 			cur_test->param.auth_key_len, cur_test->bearer,
9126 			cur_test->param.domain, cur_test->packet_direction,
9127 			cur_test->sn_size, cur_test->hfn,
9128 			cur_test->hfn_threshold, SDAP_ENABLED);
9129 		if (err) {
9130 			printf("\t%d) %s: Decapsulation failed\n",
9131 					cur_test->test_idx,
9132 					cur_test->param.name);
9133 			err = TEST_FAILED;
9134 		} else {
9135 			printf("\t%d) %s: Decap PASS\n", cur_test->test_idx,
9136 					cur_test->param.name);
9137 			err = TEST_SUCCESS;
9138 		}
9139 		all_err += err;
9140 	}
9141 
9142 	printf("Success: %d, Failure: %d\n", size + all_err, -all_err);
9143 
9144 	return (all_err == TEST_SUCCESS) ? TEST_SUCCESS : TEST_FAILED;
9145 }
9146 
9147 static int
9148 test_ipsec_proto_process(const struct ipsec_test_data td[],
9149 			 struct ipsec_test_data res_d[],
9150 			 int nb_td,
9151 			 bool silent,
9152 			 const struct ipsec_test_flags *flags)
9153 {
9154 	uint16_t v6_src[8] = {0x2607, 0xf8b0, 0x400c, 0x0c03, 0x0000, 0x0000,
9155 				0x0000, 0x001a};
9156 	uint16_t v6_dst[8] = {0x2001, 0x0470, 0xe5bf, 0xdead, 0x4957, 0x2174,
9157 				0xe82c, 0x4887};
9158 	const struct rte_ipv4_hdr *ipv4 =
9159 			(const struct rte_ipv4_hdr *)td[0].output_text.data;
9160 	struct crypto_testsuite_params *ts_params = &testsuite_params;
9161 	struct crypto_unittest_params *ut_params = &unittest_params;
9162 	struct rte_security_capability_idx sec_cap_idx;
9163 	const struct rte_security_capability *sec_cap;
9164 	struct rte_security_ipsec_xform ipsec_xform;
9165 	uint8_t dev_id = ts_params->valid_devs[0];
9166 	enum rte_security_ipsec_sa_direction dir;
9167 	struct ipsec_test_data *res_d_tmp = NULL;
9168 	int salt_len, i, ret = TEST_SUCCESS;
9169 	struct rte_security_ctx *ctx;
9170 	uint8_t *input_text;
9171 	uint32_t src, dst;
9172 	uint32_t verify;
9173 
9174 	ut_params->type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9175 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL;
9176 
9177 	/* Use first test data to create session */
9178 
9179 	/* Copy IPsec xform */
9180 	memcpy(&ipsec_xform, &td[0].ipsec_xform, sizeof(ipsec_xform));
9181 
9182 	dir = ipsec_xform.direction;
9183 	verify = flags->tunnel_hdr_verify;
9184 
9185 	memcpy(&src, &ipv4->src_addr, sizeof(ipv4->src_addr));
9186 	memcpy(&dst, &ipv4->dst_addr, sizeof(ipv4->dst_addr));
9187 
9188 	if ((dir == RTE_SECURITY_IPSEC_SA_DIR_INGRESS) && verify) {
9189 		if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR)
9190 			src += 1;
9191 		else if (verify == RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR)
9192 			dst += 1;
9193 	}
9194 
9195 	if (td->ipsec_xform.mode == RTE_SECURITY_IPSEC_SA_MODE_TUNNEL) {
9196 		if (td->ipsec_xform.tunnel.type ==
9197 				RTE_SECURITY_IPSEC_TUNNEL_IPV4) {
9198 			memcpy(&ipsec_xform.tunnel.ipv4.src_ip, &src,
9199 			       sizeof(src));
9200 			memcpy(&ipsec_xform.tunnel.ipv4.dst_ip, &dst,
9201 			       sizeof(dst));
9202 
9203 			if (flags->df == TEST_IPSEC_SET_DF_0_INNER_1)
9204 				ipsec_xform.tunnel.ipv4.df = 0;
9205 
9206 			if (flags->df == TEST_IPSEC_SET_DF_1_INNER_0)
9207 				ipsec_xform.tunnel.ipv4.df = 1;
9208 
9209 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9210 				ipsec_xform.tunnel.ipv4.dscp = 0;
9211 
9212 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9213 				ipsec_xform.tunnel.ipv4.dscp =
9214 						TEST_IPSEC_DSCP_VAL;
9215 
9216 		} else {
9217 			if (flags->dscp == TEST_IPSEC_SET_DSCP_0_INNER_1)
9218 				ipsec_xform.tunnel.ipv6.dscp = 0;
9219 
9220 			if (flags->dscp == TEST_IPSEC_SET_DSCP_1_INNER_0)
9221 				ipsec_xform.tunnel.ipv6.dscp =
9222 						TEST_IPSEC_DSCP_VAL;
9223 
9224 			memcpy(&ipsec_xform.tunnel.ipv6.src_addr, &v6_src,
9225 			       sizeof(v6_src));
9226 			memcpy(&ipsec_xform.tunnel.ipv6.dst_addr, &v6_dst,
9227 			       sizeof(v6_dst));
9228 		}
9229 	}
9230 
9231 	ctx = rte_cryptodev_get_sec_ctx(dev_id);
9232 
9233 	sec_cap_idx.action = ut_params->type;
9234 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_IPSEC;
9235 	sec_cap_idx.ipsec.proto = ipsec_xform.proto;
9236 	sec_cap_idx.ipsec.mode = ipsec_xform.mode;
9237 	sec_cap_idx.ipsec.direction = ipsec_xform.direction;
9238 
9239 	if (flags->udp_encap)
9240 		ipsec_xform.options.udp_encap = 1;
9241 
9242 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
9243 	if (sec_cap == NULL)
9244 		return TEST_SKIPPED;
9245 
9246 	/* Copy cipher session parameters */
9247 	if (td[0].aead) {
9248 		memcpy(&ut_params->aead_xform, &td[0].xform.aead,
9249 		       sizeof(ut_params->aead_xform));
9250 		ut_params->aead_xform.aead.key.data = td[0].key.data;
9251 		ut_params->aead_xform.aead.iv.offset = IV_OFFSET;
9252 
9253 		/* Verify crypto capabilities */
9254 		if (test_ipsec_crypto_caps_aead_verify(
9255 				sec_cap,
9256 				&ut_params->aead_xform) != 0) {
9257 			if (!silent)
9258 				RTE_LOG(INFO, USER1,
9259 					"Crypto capabilities not supported\n");
9260 			return TEST_SKIPPED;
9261 		}
9262 	} else if (td[0].auth_only) {
9263 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9264 		       sizeof(ut_params->auth_xform));
9265 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9266 
9267 		if (test_ipsec_crypto_caps_auth_verify(
9268 				sec_cap,
9269 				&ut_params->auth_xform) != 0) {
9270 			if (!silent)
9271 				RTE_LOG(INFO, USER1,
9272 					"Auth crypto capabilities not supported\n");
9273 			return TEST_SKIPPED;
9274 		}
9275 	} else {
9276 		memcpy(&ut_params->cipher_xform, &td[0].xform.chain.cipher,
9277 		       sizeof(ut_params->cipher_xform));
9278 		memcpy(&ut_params->auth_xform, &td[0].xform.chain.auth,
9279 		       sizeof(ut_params->auth_xform));
9280 		ut_params->cipher_xform.cipher.key.data = td[0].key.data;
9281 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
9282 		ut_params->auth_xform.auth.key.data = td[0].auth_key.data;
9283 
9284 		/* Verify crypto capabilities */
9285 
9286 		if (test_ipsec_crypto_caps_cipher_verify(
9287 				sec_cap,
9288 				&ut_params->cipher_xform) != 0) {
9289 			if (!silent)
9290 				RTE_LOG(INFO, USER1,
9291 					"Cipher crypto capabilities not supported\n");
9292 			return TEST_SKIPPED;
9293 		}
9294 
9295 		if (test_ipsec_crypto_caps_auth_verify(
9296 				sec_cap,
9297 				&ut_params->auth_xform) != 0) {
9298 			if (!silent)
9299 				RTE_LOG(INFO, USER1,
9300 					"Auth crypto capabilities not supported\n");
9301 			return TEST_SKIPPED;
9302 		}
9303 	}
9304 
9305 	if (test_ipsec_sec_caps_verify(&ipsec_xform, sec_cap, silent) != 0)
9306 		return TEST_SKIPPED;
9307 
9308 	struct rte_security_session_conf sess_conf = {
9309 		.action_type = ut_params->type,
9310 		.protocol = RTE_SECURITY_PROTOCOL_IPSEC,
9311 	};
9312 
9313 	if (td[0].aead || td[0].aes_gmac) {
9314 		salt_len = RTE_MIN(sizeof(ipsec_xform.salt), td[0].salt.len);
9315 		memcpy(&ipsec_xform.salt, td[0].salt.data, salt_len);
9316 	}
9317 
9318 	if (td[0].aead) {
9319 		sess_conf.ipsec = ipsec_xform;
9320 		sess_conf.crypto_xform = &ut_params->aead_xform;
9321 	} else if (td[0].auth_only) {
9322 		sess_conf.ipsec = ipsec_xform;
9323 		sess_conf.crypto_xform = &ut_params->auth_xform;
9324 	} else {
9325 		sess_conf.ipsec = ipsec_xform;
9326 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS) {
9327 			sess_conf.crypto_xform = &ut_params->cipher_xform;
9328 			ut_params->cipher_xform.next = &ut_params->auth_xform;
9329 		} else {
9330 			sess_conf.crypto_xform = &ut_params->auth_xform;
9331 			ut_params->auth_xform.next = &ut_params->cipher_xform;
9332 		}
9333 	}
9334 
9335 	/* Create security session */
9336 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
9337 					ts_params->session_mpool,
9338 					ts_params->session_priv_mpool);
9339 
9340 	if (ut_params->sec_session == NULL)
9341 		return TEST_SKIPPED;
9342 
9343 	for (i = 0; i < nb_td; i++) {
9344 		if (flags->antireplay &&
9345 		    (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)) {
9346 			sess_conf.ipsec.esn.value = td[i].ipsec_xform.esn.value;
9347 			ret = rte_security_session_update(ctx,
9348 				ut_params->sec_session, &sess_conf);
9349 			if (ret) {
9350 				printf("Could not update sequence number in "
9351 				       "session\n");
9352 				return TEST_SKIPPED;
9353 			}
9354 		}
9355 
9356 		/* Setup source mbuf payload */
9357 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
9358 		memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
9359 				rte_pktmbuf_tailroom(ut_params->ibuf));
9360 
9361 		input_text = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
9362 				td[i].input_text.len);
9363 
9364 		memcpy(input_text, td[i].input_text.data,
9365 		       td[i].input_text.len);
9366 
9367 		if (test_ipsec_pkt_update(input_text, flags))
9368 			return TEST_FAILED;
9369 
9370 		/* Generate crypto op data structure */
9371 		ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
9372 					RTE_CRYPTO_OP_TYPE_SYMMETRIC);
9373 		if (!ut_params->op) {
9374 			printf("TestCase %s line %d: %s\n",
9375 				__func__, __LINE__,
9376 				"failed to allocate crypto op");
9377 			ret = TEST_FAILED;
9378 			goto crypto_op_free;
9379 		}
9380 
9381 		/* Attach session to operation */
9382 		rte_security_attach_session(ut_params->op,
9383 					    ut_params->sec_session);
9384 
9385 		/* Set crypto operation mbufs */
9386 		ut_params->op->sym->m_src = ut_params->ibuf;
9387 		ut_params->op->sym->m_dst = NULL;
9388 
9389 		/* Copy IV in crypto operation when IV generation is disabled */
9390 		if (dir == RTE_SECURITY_IPSEC_SA_DIR_EGRESS &&
9391 		    ipsec_xform.options.iv_gen_disable == 1) {
9392 			uint8_t *iv = rte_crypto_op_ctod_offset(ut_params->op,
9393 								uint8_t *,
9394 								IV_OFFSET);
9395 			int len;
9396 
9397 			if (td[i].aead)
9398 				len = td[i].xform.aead.aead.iv.length;
9399 			else if (td[i].aes_gmac)
9400 				len = td[i].xform.chain.auth.auth.iv.length;
9401 			else
9402 				len = td[i].xform.chain.cipher.cipher.iv.length;
9403 
9404 			memcpy(iv, td[i].iv.data, len);
9405 		}
9406 
9407 		/* Process crypto operation */
9408 		process_crypto_request(dev_id, ut_params->op);
9409 
9410 		ret = test_ipsec_status_check(&td[i], ut_params->op, flags, dir,
9411 					      i + 1);
9412 		if (ret != TEST_SUCCESS)
9413 			goto crypto_op_free;
9414 
9415 		if (res_d != NULL)
9416 			res_d_tmp = &res_d[i];
9417 
9418 		ret = test_ipsec_post_process(ut_params->ibuf, &td[i],
9419 					      res_d_tmp, silent, flags);
9420 		if (ret != TEST_SUCCESS)
9421 			goto crypto_op_free;
9422 
9423 		ret = test_ipsec_stats_verify(ctx, ut_params->sec_session,
9424 					      flags, dir);
9425 		if (ret != TEST_SUCCESS)
9426 			goto crypto_op_free;
9427 
9428 		rte_crypto_op_free(ut_params->op);
9429 		ut_params->op = NULL;
9430 
9431 		rte_pktmbuf_free(ut_params->ibuf);
9432 		ut_params->ibuf = NULL;
9433 	}
9434 
9435 crypto_op_free:
9436 	rte_crypto_op_free(ut_params->op);
9437 	ut_params->op = NULL;
9438 
9439 	rte_pktmbuf_free(ut_params->ibuf);
9440 	ut_params->ibuf = NULL;
9441 
9442 	if (ut_params->sec_session)
9443 		rte_security_session_destroy(ctx, ut_params->sec_session);
9444 	ut_params->sec_session = NULL;
9445 
9446 	return ret;
9447 }
9448 
9449 static int
9450 test_ipsec_proto_known_vec(const void *test_data)
9451 {
9452 	struct ipsec_test_data td_outb;
9453 	struct ipsec_test_flags flags;
9454 
9455 	memset(&flags, 0, sizeof(flags));
9456 
9457 	memcpy(&td_outb, test_data, sizeof(td_outb));
9458 
9459 	if (td_outb.aes_gmac || td_outb.aead ||
9460 	    ((td_outb.ipsec_xform.proto != RTE_SECURITY_IPSEC_SA_PROTO_AH) &&
9461 	     (td_outb.xform.chain.cipher.cipher.algo != RTE_CRYPTO_CIPHER_NULL))) {
9462 		/* Disable IV gen to be able to test with known vectors */
9463 		td_outb.ipsec_xform.options.iv_gen_disable = 1;
9464 	}
9465 
9466 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9467 }
9468 
9469 static int
9470 test_ipsec_proto_known_vec_inb(const void *test_data)
9471 {
9472 	const struct ipsec_test_data *td = test_data;
9473 	struct ipsec_test_flags flags;
9474 	struct ipsec_test_data td_inb;
9475 
9476 	memset(&flags, 0, sizeof(flags));
9477 
9478 	if (td->ipsec_xform.direction == RTE_SECURITY_IPSEC_SA_DIR_EGRESS)
9479 		test_ipsec_td_in_from_out(td, &td_inb);
9480 	else
9481 		memcpy(&td_inb, td, sizeof(td_inb));
9482 
9483 	return test_ipsec_proto_process(&td_inb, NULL, 1, false, &flags);
9484 }
9485 
9486 static int
9487 test_ipsec_proto_known_vec_fragmented(const void *test_data)
9488 {
9489 	struct ipsec_test_data td_outb;
9490 	struct ipsec_test_flags flags;
9491 
9492 	memset(&flags, 0, sizeof(flags));
9493 	flags.fragment = true;
9494 
9495 	memcpy(&td_outb, test_data, sizeof(td_outb));
9496 
9497 	/* Disable IV gen to be able to test with known vectors */
9498 	td_outb.ipsec_xform.options.iv_gen_disable = 1;
9499 
9500 	return test_ipsec_proto_process(&td_outb, NULL, 1, false, &flags);
9501 }
9502 
9503 static int
9504 test_ipsec_proto_all(const struct ipsec_test_flags *flags)
9505 {
9506 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9507 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9508 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9509 	int ret;
9510 
9511 	if (flags->iv_gen ||
9512 	    flags->sa_expiry_pkts_soft ||
9513 	    flags->sa_expiry_pkts_hard)
9514 		nb_pkts = IPSEC_TEST_PACKETS_MAX;
9515 
9516 	for (i = 0; i < RTE_DIM(alg_list); i++) {
9517 		test_ipsec_td_prepare(alg_list[i].param1,
9518 				      alg_list[i].param2,
9519 				      flags,
9520 				      td_outb,
9521 				      nb_pkts);
9522 
9523 		if (!td_outb->aead) {
9524 			enum rte_crypto_cipher_algorithm cipher_alg;
9525 			enum rte_crypto_auth_algorithm auth_alg;
9526 
9527 			cipher_alg = td_outb->xform.chain.cipher.cipher.algo;
9528 			auth_alg = td_outb->xform.chain.auth.auth.algo;
9529 
9530 			if (td_outb->aes_gmac && cipher_alg != RTE_CRYPTO_CIPHER_NULL)
9531 				continue;
9532 
9533 			/* ICV is not applicable for NULL auth */
9534 			if (flags->icv_corrupt &&
9535 			    auth_alg == RTE_CRYPTO_AUTH_NULL)
9536 				continue;
9537 
9538 			/* IV is not applicable for NULL cipher */
9539 			if (flags->iv_gen &&
9540 			    cipher_alg == RTE_CRYPTO_CIPHER_NULL)
9541 				continue;
9542 		}
9543 
9544 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9545 					       flags);
9546 		if (ret == TEST_SKIPPED)
9547 			continue;
9548 
9549 		if (ret == TEST_FAILED)
9550 			return TEST_FAILED;
9551 
9552 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9553 
9554 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9555 					       flags);
9556 		if (ret == TEST_SKIPPED)
9557 			continue;
9558 
9559 		if (ret == TEST_FAILED)
9560 			return TEST_FAILED;
9561 
9562 		if (flags->display_alg)
9563 			test_ipsec_display_alg(alg_list[i].param1,
9564 					       alg_list[i].param2);
9565 
9566 		pass_cnt++;
9567 	}
9568 
9569 	if (pass_cnt > 0)
9570 		return TEST_SUCCESS;
9571 	else
9572 		return TEST_SKIPPED;
9573 }
9574 
9575 static int
9576 test_ipsec_ah_proto_all(const struct ipsec_test_flags *flags)
9577 {
9578 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
9579 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
9580 	unsigned int i, nb_pkts = 1, pass_cnt = 0;
9581 	int ret;
9582 
9583 	for (i = 0; i < RTE_DIM(ah_alg_list); i++) {
9584 		test_ipsec_td_prepare(ah_alg_list[i].param1,
9585 				      ah_alg_list[i].param2,
9586 				      flags,
9587 				      td_outb,
9588 				      nb_pkts);
9589 
9590 		ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
9591 					       flags);
9592 		if (ret == TEST_SKIPPED)
9593 			continue;
9594 
9595 		if (ret == TEST_FAILED)
9596 			return TEST_FAILED;
9597 
9598 		test_ipsec_td_update(td_inb, td_outb, nb_pkts, flags);
9599 
9600 		ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
9601 					       flags);
9602 		if (ret == TEST_SKIPPED)
9603 			continue;
9604 
9605 		if (ret == TEST_FAILED)
9606 			return TEST_FAILED;
9607 
9608 		if (flags->display_alg)
9609 			test_ipsec_display_alg(ah_alg_list[i].param1,
9610 					       ah_alg_list[i].param2);
9611 
9612 		pass_cnt++;
9613 	}
9614 
9615 	if (pass_cnt > 0)
9616 		return TEST_SUCCESS;
9617 	else
9618 		return TEST_SKIPPED;
9619 }
9620 
9621 static int
9622 test_ipsec_proto_display_list(const void *data __rte_unused)
9623 {
9624 	struct ipsec_test_flags flags;
9625 
9626 	memset(&flags, 0, sizeof(flags));
9627 
9628 	flags.display_alg = true;
9629 
9630 	return test_ipsec_proto_all(&flags);
9631 }
9632 
9633 static int
9634 test_ipsec_proto_ah_tunnel_ipv4(const void *data __rte_unused)
9635 {
9636 	struct ipsec_test_flags flags;
9637 
9638 	memset(&flags, 0, sizeof(flags));
9639 
9640 	flags.ah = true;
9641 	flags.display_alg = true;
9642 
9643 	return test_ipsec_ah_proto_all(&flags);
9644 }
9645 
9646 static int
9647 test_ipsec_proto_ah_transport_ipv4(const void *data __rte_unused)
9648 {
9649 	struct ipsec_test_flags flags;
9650 
9651 	memset(&flags, 0, sizeof(flags));
9652 
9653 	flags.ah = true;
9654 	flags.transport = true;
9655 
9656 	return test_ipsec_ah_proto_all(&flags);
9657 }
9658 
9659 static int
9660 test_ipsec_proto_iv_gen(const void *data __rte_unused)
9661 {
9662 	struct ipsec_test_flags flags;
9663 
9664 	memset(&flags, 0, sizeof(flags));
9665 
9666 	flags.iv_gen = true;
9667 
9668 	return test_ipsec_proto_all(&flags);
9669 }
9670 
9671 static int
9672 test_ipsec_proto_sa_exp_pkts_soft(const void *data __rte_unused)
9673 {
9674 	struct ipsec_test_flags flags;
9675 
9676 	memset(&flags, 0, sizeof(flags));
9677 
9678 	flags.sa_expiry_pkts_soft = true;
9679 
9680 	return test_ipsec_proto_all(&flags);
9681 }
9682 
9683 static int
9684 test_ipsec_proto_sa_exp_pkts_hard(const void *data __rte_unused)
9685 {
9686 	struct ipsec_test_flags flags;
9687 
9688 	memset(&flags, 0, sizeof(flags));
9689 
9690 	flags.sa_expiry_pkts_hard = true;
9691 
9692 	return test_ipsec_proto_all(&flags);
9693 }
9694 
9695 static int
9696 test_ipsec_proto_err_icv_corrupt(const void *data __rte_unused)
9697 {
9698 	struct ipsec_test_flags flags;
9699 
9700 	memset(&flags, 0, sizeof(flags));
9701 
9702 	flags.icv_corrupt = true;
9703 
9704 	return test_ipsec_proto_all(&flags);
9705 }
9706 
9707 static int
9708 test_ipsec_proto_udp_encap(const void *data __rte_unused)
9709 {
9710 	struct ipsec_test_flags flags;
9711 
9712 	memset(&flags, 0, sizeof(flags));
9713 
9714 	flags.udp_encap = true;
9715 
9716 	return test_ipsec_proto_all(&flags);
9717 }
9718 
9719 static int
9720 test_ipsec_proto_tunnel_src_dst_addr_verify(const void *data __rte_unused)
9721 {
9722 	struct ipsec_test_flags flags;
9723 
9724 	memset(&flags, 0, sizeof(flags));
9725 
9726 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_SRC_DST_ADDR;
9727 
9728 	return test_ipsec_proto_all(&flags);
9729 }
9730 
9731 static int
9732 test_ipsec_proto_tunnel_dst_addr_verify(const void *data __rte_unused)
9733 {
9734 	struct ipsec_test_flags flags;
9735 
9736 	memset(&flags, 0, sizeof(flags));
9737 
9738 	flags.tunnel_hdr_verify = RTE_SECURITY_IPSEC_TUNNEL_VERIFY_DST_ADDR;
9739 
9740 	return test_ipsec_proto_all(&flags);
9741 }
9742 
9743 static int
9744 test_ipsec_proto_udp_ports_verify(const void *data __rte_unused)
9745 {
9746 	struct ipsec_test_flags flags;
9747 
9748 	memset(&flags, 0, sizeof(flags));
9749 
9750 	flags.udp_encap = true;
9751 	flags.udp_ports_verify = true;
9752 
9753 	return test_ipsec_proto_all(&flags);
9754 }
9755 
9756 static int
9757 test_ipsec_proto_inner_ip_csum(const void *data __rte_unused)
9758 {
9759 	struct ipsec_test_flags flags;
9760 
9761 	memset(&flags, 0, sizeof(flags));
9762 
9763 	flags.ip_csum = true;
9764 
9765 	return test_ipsec_proto_all(&flags);
9766 }
9767 
9768 static int
9769 test_ipsec_proto_inner_l4_csum(const void *data __rte_unused)
9770 {
9771 	struct ipsec_test_flags flags;
9772 
9773 	memset(&flags, 0, sizeof(flags));
9774 
9775 	flags.l4_csum = true;
9776 
9777 	return test_ipsec_proto_all(&flags);
9778 }
9779 
9780 static int
9781 test_ipsec_proto_tunnel_v4_in_v4(const void *data __rte_unused)
9782 {
9783 	struct ipsec_test_flags flags;
9784 
9785 	memset(&flags, 0, sizeof(flags));
9786 
9787 	flags.ipv6 = false;
9788 	flags.tunnel_ipv6 = false;
9789 
9790 	return test_ipsec_proto_all(&flags);
9791 }
9792 
9793 static int
9794 test_ipsec_proto_tunnel_v6_in_v6(const void *data __rte_unused)
9795 {
9796 	struct ipsec_test_flags flags;
9797 
9798 	memset(&flags, 0, sizeof(flags));
9799 
9800 	flags.ipv6 = true;
9801 	flags.tunnel_ipv6 = true;
9802 
9803 	return test_ipsec_proto_all(&flags);
9804 }
9805 
9806 static int
9807 test_ipsec_proto_tunnel_v4_in_v6(const void *data __rte_unused)
9808 {
9809 	struct ipsec_test_flags flags;
9810 
9811 	memset(&flags, 0, sizeof(flags));
9812 
9813 	flags.ipv6 = false;
9814 	flags.tunnel_ipv6 = true;
9815 
9816 	return test_ipsec_proto_all(&flags);
9817 }
9818 
9819 static int
9820 test_ipsec_proto_tunnel_v6_in_v4(const void *data __rte_unused)
9821 {
9822 	struct ipsec_test_flags flags;
9823 
9824 	memset(&flags, 0, sizeof(flags));
9825 
9826 	flags.ipv6 = true;
9827 	flags.tunnel_ipv6 = false;
9828 
9829 	return test_ipsec_proto_all(&flags);
9830 }
9831 
9832 static int
9833 test_ipsec_proto_transport_v4(const void *data __rte_unused)
9834 {
9835 	struct ipsec_test_flags flags;
9836 
9837 	memset(&flags, 0, sizeof(flags));
9838 
9839 	flags.ipv6 = false;
9840 	flags.transport = true;
9841 
9842 	return test_ipsec_proto_all(&flags);
9843 }
9844 
9845 static int
9846 test_ipsec_proto_transport_l4_csum(const void *data __rte_unused)
9847 {
9848 	struct ipsec_test_flags flags = {
9849 		.l4_csum = true,
9850 		.transport = true,
9851 	};
9852 
9853 	return test_ipsec_proto_all(&flags);
9854 }
9855 
9856 static int
9857 test_ipsec_proto_stats(const void *data __rte_unused)
9858 {
9859 	struct ipsec_test_flags flags;
9860 
9861 	memset(&flags, 0, sizeof(flags));
9862 
9863 	flags.stats_success = true;
9864 
9865 	return test_ipsec_proto_all(&flags);
9866 }
9867 
9868 static int
9869 test_ipsec_proto_pkt_fragment(const void *data __rte_unused)
9870 {
9871 	struct ipsec_test_flags flags;
9872 
9873 	memset(&flags, 0, sizeof(flags));
9874 
9875 	flags.fragment = true;
9876 
9877 	return test_ipsec_proto_all(&flags);
9878 
9879 }
9880 
9881 static int
9882 test_ipsec_proto_copy_df_inner_0(const void *data __rte_unused)
9883 {
9884 	struct ipsec_test_flags flags;
9885 
9886 	memset(&flags, 0, sizeof(flags));
9887 
9888 	flags.df = TEST_IPSEC_COPY_DF_INNER_0;
9889 
9890 	return test_ipsec_proto_all(&flags);
9891 }
9892 
9893 static int
9894 test_ipsec_proto_copy_df_inner_1(const void *data __rte_unused)
9895 {
9896 	struct ipsec_test_flags flags;
9897 
9898 	memset(&flags, 0, sizeof(flags));
9899 
9900 	flags.df = TEST_IPSEC_COPY_DF_INNER_1;
9901 
9902 	return test_ipsec_proto_all(&flags);
9903 }
9904 
9905 static int
9906 test_ipsec_proto_set_df_0_inner_1(const void *data __rte_unused)
9907 {
9908 	struct ipsec_test_flags flags;
9909 
9910 	memset(&flags, 0, sizeof(flags));
9911 
9912 	flags.df = TEST_IPSEC_SET_DF_0_INNER_1;
9913 
9914 	return test_ipsec_proto_all(&flags);
9915 }
9916 
9917 static int
9918 test_ipsec_proto_set_df_1_inner_0(const void *data __rte_unused)
9919 {
9920 	struct ipsec_test_flags flags;
9921 
9922 	memset(&flags, 0, sizeof(flags));
9923 
9924 	flags.df = TEST_IPSEC_SET_DF_1_INNER_0;
9925 
9926 	return test_ipsec_proto_all(&flags);
9927 }
9928 
9929 static int
9930 test_ipsec_proto_ipv4_copy_dscp_inner_0(const void *data __rte_unused)
9931 {
9932 	struct ipsec_test_flags flags;
9933 
9934 	memset(&flags, 0, sizeof(flags));
9935 
9936 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9937 
9938 	return test_ipsec_proto_all(&flags);
9939 }
9940 
9941 static int
9942 test_ipsec_proto_ipv4_copy_dscp_inner_1(const void *data __rte_unused)
9943 {
9944 	struct ipsec_test_flags flags;
9945 
9946 	memset(&flags, 0, sizeof(flags));
9947 
9948 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
9949 
9950 	return test_ipsec_proto_all(&flags);
9951 }
9952 
9953 static int
9954 test_ipsec_proto_ipv4_set_dscp_0_inner_1(const void *data __rte_unused)
9955 {
9956 	struct ipsec_test_flags flags;
9957 
9958 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
9959 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9960 		return TEST_SKIPPED;
9961 
9962 	memset(&flags, 0, sizeof(flags));
9963 
9964 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
9965 
9966 	return test_ipsec_proto_all(&flags);
9967 }
9968 
9969 static int
9970 test_ipsec_proto_ipv4_set_dscp_1_inner_0(const void *data __rte_unused)
9971 {
9972 	struct ipsec_test_flags flags;
9973 
9974 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
9975 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
9976 		return TEST_SKIPPED;
9977 
9978 	memset(&flags, 0, sizeof(flags));
9979 
9980 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
9981 
9982 	return test_ipsec_proto_all(&flags);
9983 }
9984 
9985 static int
9986 test_ipsec_proto_ipv6_copy_dscp_inner_0(const void *data __rte_unused)
9987 {
9988 	struct ipsec_test_flags flags;
9989 
9990 	memset(&flags, 0, sizeof(flags));
9991 
9992 	flags.ipv6 = true;
9993 	flags.tunnel_ipv6 = true;
9994 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_0;
9995 
9996 	return test_ipsec_proto_all(&flags);
9997 }
9998 
9999 static int
10000 test_ipsec_proto_ipv6_copy_dscp_inner_1(const void *data __rte_unused)
10001 {
10002 	struct ipsec_test_flags flags;
10003 
10004 	memset(&flags, 0, sizeof(flags));
10005 
10006 	flags.ipv6 = true;
10007 	flags.tunnel_ipv6 = true;
10008 	flags.dscp = TEST_IPSEC_COPY_DSCP_INNER_1;
10009 
10010 	return test_ipsec_proto_all(&flags);
10011 }
10012 
10013 static int
10014 test_ipsec_proto_ipv6_set_dscp_0_inner_1(const void *data __rte_unused)
10015 {
10016 	struct ipsec_test_flags flags;
10017 
10018 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10019 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10020 		return TEST_SKIPPED;
10021 
10022 	memset(&flags, 0, sizeof(flags));
10023 
10024 	flags.ipv6 = true;
10025 	flags.tunnel_ipv6 = true;
10026 	flags.dscp = TEST_IPSEC_SET_DSCP_0_INNER_1;
10027 
10028 	return test_ipsec_proto_all(&flags);
10029 }
10030 
10031 static int
10032 test_ipsec_proto_ipv6_set_dscp_1_inner_0(const void *data __rte_unused)
10033 {
10034 	struct ipsec_test_flags flags;
10035 
10036 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
10037 			RTE_STR(CRYPTODEV_NAME_CN9K_PMD)))
10038 		return TEST_SKIPPED;
10039 
10040 	memset(&flags, 0, sizeof(flags));
10041 
10042 	flags.ipv6 = true;
10043 	flags.tunnel_ipv6 = true;
10044 	flags.dscp = TEST_IPSEC_SET_DSCP_1_INNER_0;
10045 
10046 	return test_ipsec_proto_all(&flags);
10047 }
10048 
10049 static int
10050 test_ipsec_pkt_replay(const void *test_data, const uint64_t esn[],
10051 		      bool replayed_pkt[], uint32_t nb_pkts, bool esn_en,
10052 		      uint64_t winsz)
10053 {
10054 	struct ipsec_test_data td_outb[IPSEC_TEST_PACKETS_MAX];
10055 	struct ipsec_test_data td_inb[IPSEC_TEST_PACKETS_MAX];
10056 	struct ipsec_test_flags flags;
10057 	uint32_t i = 0, ret = 0;
10058 
10059 	if (nb_pkts == 0)
10060 		return TEST_FAILED;
10061 
10062 	memset(&flags, 0, sizeof(flags));
10063 	flags.antireplay = true;
10064 
10065 	for (i = 0; i < nb_pkts; i++) {
10066 		memcpy(&td_outb[i], test_data, sizeof(td_outb[i]));
10067 		td_outb[i].ipsec_xform.options.iv_gen_disable = 1;
10068 		td_outb[i].ipsec_xform.replay_win_sz = winsz;
10069 		td_outb[i].ipsec_xform.options.esn = esn_en;
10070 	}
10071 
10072 	for (i = 0; i < nb_pkts; i++)
10073 		td_outb[i].ipsec_xform.esn.value = esn[i];
10074 
10075 	ret = test_ipsec_proto_process(td_outb, td_inb, nb_pkts, true,
10076 				       &flags);
10077 	if (ret != TEST_SUCCESS)
10078 		return ret;
10079 
10080 	test_ipsec_td_update(td_inb, td_outb, nb_pkts, &flags);
10081 
10082 	for (i = 0; i < nb_pkts; i++) {
10083 		td_inb[i].ipsec_xform.options.esn = esn_en;
10084 		/* Set antireplay flag for packets to be dropped */
10085 		td_inb[i].ar_packet = replayed_pkt[i];
10086 	}
10087 
10088 	ret = test_ipsec_proto_process(td_inb, NULL, nb_pkts, true,
10089 				       &flags);
10090 
10091 	return ret;
10092 }
10093 
10094 static int
10095 test_ipsec_proto_pkt_antireplay(const void *test_data, uint64_t winsz)
10096 {
10097 
10098 	uint32_t nb_pkts = 5;
10099 	bool replayed_pkt[5];
10100 	uint64_t esn[5];
10101 
10102 	/* 1. Advance the TOP of the window to WS * 2 */
10103 	esn[0] = winsz * 2;
10104 	/* 2. Test sequence number within the new window(WS + 1) */
10105 	esn[1] = winsz + 1;
10106 	/* 3. Test sequence number less than the window BOTTOM */
10107 	esn[2] = winsz;
10108 	/* 4. Test sequence number in the middle of the window */
10109 	esn[3] = winsz + (winsz / 2);
10110 	/* 5. Test replay of the packet in the middle of the window */
10111 	esn[4] = winsz + (winsz / 2);
10112 
10113 	replayed_pkt[0] = false;
10114 	replayed_pkt[1] = false;
10115 	replayed_pkt[2] = true;
10116 	replayed_pkt[3] = false;
10117 	replayed_pkt[4] = true;
10118 
10119 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10120 				     false, winsz);
10121 }
10122 
10123 static int
10124 test_ipsec_proto_pkt_antireplay1024(const void *test_data)
10125 {
10126 	return test_ipsec_proto_pkt_antireplay(test_data, 1024);
10127 }
10128 
10129 static int
10130 test_ipsec_proto_pkt_antireplay2048(const void *test_data)
10131 {
10132 	return test_ipsec_proto_pkt_antireplay(test_data, 2048);
10133 }
10134 
10135 static int
10136 test_ipsec_proto_pkt_antireplay4096(const void *test_data)
10137 {
10138 	return test_ipsec_proto_pkt_antireplay(test_data, 4096);
10139 }
10140 
10141 static int
10142 test_ipsec_proto_pkt_esn_antireplay(const void *test_data, uint64_t winsz)
10143 {
10144 
10145 	uint32_t nb_pkts = 7;
10146 	bool replayed_pkt[7];
10147 	uint64_t esn[7];
10148 
10149 	/* Set the initial sequence number */
10150 	esn[0] = (uint64_t)(0xFFFFFFFF - winsz);
10151 	/* 1. Advance the TOP of the window to (1<<32 + WS/2) */
10152 	esn[1] = (uint64_t)((1ULL << 32) + (winsz / 2));
10153 	/* 2. Test sequence number within new window (1<<32 + WS/2 + 1) */
10154 	esn[2] = (uint64_t)((1ULL << 32) - (winsz / 2) + 1);
10155 	/* 3. Test with sequence number within window (1<<32 - 1) */
10156 	esn[3] = (uint64_t)((1ULL << 32) - 1);
10157 	/* 4. Test with sequence number within window (1<<32 - 1) */
10158 	esn[4] = (uint64_t)(1ULL << 32);
10159 	/* 5. Test with duplicate sequence number within
10160 	 * new window (1<<32 - 1)
10161 	 */
10162 	esn[5] = (uint64_t)((1ULL << 32) - 1);
10163 	/* 6. Test with duplicate sequence number within new window (1<<32) */
10164 	esn[6] = (uint64_t)(1ULL << 32);
10165 
10166 	replayed_pkt[0] = false;
10167 	replayed_pkt[1] = false;
10168 	replayed_pkt[2] = false;
10169 	replayed_pkt[3] = false;
10170 	replayed_pkt[4] = false;
10171 	replayed_pkt[5] = true;
10172 	replayed_pkt[6] = true;
10173 
10174 	return test_ipsec_pkt_replay(test_data, esn, replayed_pkt, nb_pkts,
10175 				     true, winsz);
10176 }
10177 
10178 static int
10179 test_ipsec_proto_pkt_esn_antireplay1024(const void *test_data)
10180 {
10181 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 1024);
10182 }
10183 
10184 static int
10185 test_ipsec_proto_pkt_esn_antireplay2048(const void *test_data)
10186 {
10187 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 2048);
10188 }
10189 
10190 static int
10191 test_ipsec_proto_pkt_esn_antireplay4096(const void *test_data)
10192 {
10193 	return test_ipsec_proto_pkt_esn_antireplay(test_data, 4096);
10194 }
10195 
10196 static int
10197 test_PDCP_PROTO_all(void)
10198 {
10199 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10200 	struct crypto_unittest_params *ut_params = &unittest_params;
10201 	struct rte_cryptodev_info dev_info;
10202 	int status;
10203 
10204 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10205 	uint64_t feat_flags = dev_info.feature_flags;
10206 
10207 	if (!(feat_flags & RTE_CRYPTODEV_FF_SECURITY))
10208 		return TEST_SKIPPED;
10209 
10210 	/* Set action type */
10211 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10212 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10213 		gbl_action_type;
10214 
10215 	if (security_proto_supported(ut_params->type,
10216 			RTE_SECURITY_PROTOCOL_PDCP) < 0)
10217 		return TEST_SKIPPED;
10218 
10219 	status = test_PDCP_PROTO_cplane_encap_all();
10220 	status += test_PDCP_PROTO_cplane_decap_all();
10221 	status += test_PDCP_PROTO_uplane_encap_all();
10222 	status += test_PDCP_PROTO_uplane_decap_all();
10223 	status += test_PDCP_PROTO_SGL_in_place_32B();
10224 	status += test_PDCP_PROTO_SGL_oop_32B_128B();
10225 	status += test_PDCP_PROTO_SGL_oop_32B_40B();
10226 	status += test_PDCP_PROTO_SGL_oop_128B_32B();
10227 	status += test_PDCP_SDAP_PROTO_encap_all();
10228 	status += test_PDCP_SDAP_PROTO_decap_all();
10229 	status += test_PDCP_PROTO_short_mac();
10230 
10231 	if (status)
10232 		return TEST_FAILED;
10233 	else
10234 		return TEST_SUCCESS;
10235 }
10236 
10237 static int
10238 test_ipsec_proto_ipv4_ttl_decrement(const void *data __rte_unused)
10239 {
10240 	struct ipsec_test_flags flags = {
10241 		.dec_ttl_or_hop_limit = true
10242 	};
10243 
10244 	return test_ipsec_proto_all(&flags);
10245 }
10246 
10247 static int
10248 test_ipsec_proto_ipv6_hop_limit_decrement(const void *data __rte_unused)
10249 {
10250 	struct ipsec_test_flags flags = {
10251 		.ipv6 = true,
10252 		.dec_ttl_or_hop_limit = true
10253 	};
10254 
10255 	return test_ipsec_proto_all(&flags);
10256 }
10257 
10258 static int
10259 test_docsis_proto_uplink(const void *data)
10260 {
10261 	const struct docsis_test_data *d_td = data;
10262 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10263 	struct crypto_unittest_params *ut_params = &unittest_params;
10264 	uint8_t *plaintext = NULL;
10265 	uint8_t *ciphertext = NULL;
10266 	uint8_t *iv_ptr;
10267 	int32_t cipher_len, crc_len;
10268 	uint32_t crc_data_len;
10269 	int ret = TEST_SUCCESS;
10270 
10271 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10272 					rte_cryptodev_get_sec_ctx(
10273 						ts_params->valid_devs[0]);
10274 
10275 	/* Verify the capabilities */
10276 	struct rte_security_capability_idx sec_cap_idx;
10277 	const struct rte_security_capability *sec_cap;
10278 	const struct rte_cryptodev_capabilities *crypto_cap;
10279 	const struct rte_cryptodev_symmetric_capability *sym_cap;
10280 	int j = 0;
10281 
10282 	/* Set action type */
10283 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10284 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10285 		gbl_action_type;
10286 
10287 	if (security_proto_supported(ut_params->type,
10288 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10289 		return TEST_SKIPPED;
10290 
10291 	sec_cap_idx.action = ut_params->type;
10292 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10293 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_UPLINK;
10294 
10295 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10296 	if (sec_cap == NULL)
10297 		return TEST_SKIPPED;
10298 
10299 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10300 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10301 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10302 				crypto_cap->sym.xform_type ==
10303 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
10304 				crypto_cap->sym.cipher.algo ==
10305 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10306 			sym_cap = &crypto_cap->sym;
10307 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10308 						d_td->key.len,
10309 						d_td->iv.len) == 0)
10310 				break;
10311 		}
10312 	}
10313 
10314 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10315 		return TEST_SKIPPED;
10316 
10317 	/* Setup source mbuf payload */
10318 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10319 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10320 			rte_pktmbuf_tailroom(ut_params->ibuf));
10321 
10322 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10323 			d_td->ciphertext.len);
10324 
10325 	memcpy(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len);
10326 
10327 	/* Setup cipher session parameters */
10328 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10329 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10330 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
10331 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10332 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10333 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10334 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10335 	ut_params->cipher_xform.next = NULL;
10336 
10337 	/* Setup DOCSIS session parameters */
10338 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_UPLINK;
10339 
10340 	struct rte_security_session_conf sess_conf = {
10341 		.action_type = ut_params->type,
10342 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10343 		.docsis = ut_params->docsis_xform,
10344 		.crypto_xform = &ut_params->cipher_xform,
10345 	};
10346 
10347 	/* Create security session */
10348 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10349 					ts_params->session_mpool,
10350 					ts_params->session_priv_mpool);
10351 
10352 	if (!ut_params->sec_session) {
10353 		printf("Test function %s line %u: failed to allocate session\n",
10354 			__func__, __LINE__);
10355 		ret = TEST_FAILED;
10356 		goto on_err;
10357 	}
10358 
10359 	/* Generate crypto op data structure */
10360 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10361 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10362 	if (!ut_params->op) {
10363 		printf("Test function %s line %u: failed to allocate symmetric "
10364 			"crypto operation\n", __func__, __LINE__);
10365 		ret = TEST_FAILED;
10366 		goto on_err;
10367 	}
10368 
10369 	/* Setup CRC operation parameters */
10370 	crc_len = d_td->ciphertext.no_crc == false ?
10371 			(d_td->ciphertext.len -
10372 				d_td->ciphertext.crc_offset -
10373 				RTE_ETHER_CRC_LEN) :
10374 			0;
10375 	crc_len = crc_len > 0 ? crc_len : 0;
10376 	crc_data_len = crc_len == 0 ? 0 : RTE_ETHER_CRC_LEN;
10377 	ut_params->op->sym->auth.data.length = crc_len;
10378 	ut_params->op->sym->auth.data.offset = d_td->ciphertext.crc_offset;
10379 
10380 	/* Setup cipher operation parameters */
10381 	cipher_len = d_td->ciphertext.no_cipher == false ?
10382 			(d_td->ciphertext.len -
10383 				d_td->ciphertext.cipher_offset) :
10384 			0;
10385 	cipher_len = cipher_len > 0 ? cipher_len : 0;
10386 	ut_params->op->sym->cipher.data.length = cipher_len;
10387 	ut_params->op->sym->cipher.data.offset = d_td->ciphertext.cipher_offset;
10388 
10389 	/* Setup cipher IV */
10390 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10391 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10392 
10393 	/* Attach session to operation */
10394 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
10395 
10396 	/* Set crypto operation mbufs */
10397 	ut_params->op->sym->m_src = ut_params->ibuf;
10398 	ut_params->op->sym->m_dst = NULL;
10399 
10400 	/* Process crypto operation */
10401 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10402 			NULL) {
10403 		printf("Test function %s line %u: failed to process security "
10404 			"crypto op\n", __func__, __LINE__);
10405 		ret = TEST_FAILED;
10406 		goto on_err;
10407 	}
10408 
10409 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10410 		printf("Test function %s line %u: failed to process crypto op\n",
10411 			__func__, __LINE__);
10412 		ret = TEST_FAILED;
10413 		goto on_err;
10414 	}
10415 
10416 	/* Validate plaintext */
10417 	plaintext = ciphertext;
10418 
10419 	if (memcmp(plaintext, d_td->plaintext.data,
10420 			d_td->plaintext.len - crc_data_len)) {
10421 		printf("Test function %s line %u: plaintext not as expected\n",
10422 			__func__, __LINE__);
10423 		rte_hexdump(stdout, "expected", d_td->plaintext.data,
10424 				d_td->plaintext.len);
10425 		rte_hexdump(stdout, "actual", plaintext, d_td->plaintext.len);
10426 		ret = TEST_FAILED;
10427 		goto on_err;
10428 	}
10429 
10430 on_err:
10431 	rte_crypto_op_free(ut_params->op);
10432 	ut_params->op = NULL;
10433 
10434 	if (ut_params->sec_session)
10435 		rte_security_session_destroy(ctx, ut_params->sec_session);
10436 	ut_params->sec_session = NULL;
10437 
10438 	rte_pktmbuf_free(ut_params->ibuf);
10439 	ut_params->ibuf = NULL;
10440 
10441 	return ret;
10442 }
10443 
10444 static int
10445 test_docsis_proto_downlink(const void *data)
10446 {
10447 	const struct docsis_test_data *d_td = data;
10448 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10449 	struct crypto_unittest_params *ut_params = &unittest_params;
10450 	uint8_t *plaintext = NULL;
10451 	uint8_t *ciphertext = NULL;
10452 	uint8_t *iv_ptr;
10453 	int32_t cipher_len, crc_len;
10454 	int ret = TEST_SUCCESS;
10455 
10456 	struct rte_security_ctx *ctx = (struct rte_security_ctx *)
10457 					rte_cryptodev_get_sec_ctx(
10458 						ts_params->valid_devs[0]);
10459 
10460 	/* Verify the capabilities */
10461 	struct rte_security_capability_idx sec_cap_idx;
10462 	const struct rte_security_capability *sec_cap;
10463 	const struct rte_cryptodev_capabilities *crypto_cap;
10464 	const struct rte_cryptodev_symmetric_capability *sym_cap;
10465 	int j = 0;
10466 
10467 	/* Set action type */
10468 	ut_params->type = gbl_action_type == RTE_SECURITY_ACTION_TYPE_NONE ?
10469 		RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL :
10470 		gbl_action_type;
10471 
10472 	if (security_proto_supported(ut_params->type,
10473 			RTE_SECURITY_PROTOCOL_DOCSIS) < 0)
10474 		return TEST_SKIPPED;
10475 
10476 	sec_cap_idx.action = ut_params->type;
10477 	sec_cap_idx.protocol = RTE_SECURITY_PROTOCOL_DOCSIS;
10478 	sec_cap_idx.docsis.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10479 
10480 	sec_cap = rte_security_capability_get(ctx, &sec_cap_idx);
10481 	if (sec_cap == NULL)
10482 		return TEST_SKIPPED;
10483 
10484 	while ((crypto_cap = &sec_cap->crypto_capabilities[j++])->op !=
10485 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
10486 		if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_SYMMETRIC &&
10487 				crypto_cap->sym.xform_type ==
10488 					RTE_CRYPTO_SYM_XFORM_CIPHER &&
10489 				crypto_cap->sym.cipher.algo ==
10490 					RTE_CRYPTO_CIPHER_AES_DOCSISBPI) {
10491 			sym_cap = &crypto_cap->sym;
10492 			if (rte_cryptodev_sym_capability_check_cipher(sym_cap,
10493 						d_td->key.len,
10494 						d_td->iv.len) == 0)
10495 				break;
10496 		}
10497 	}
10498 
10499 	if (crypto_cap->op == RTE_CRYPTO_OP_TYPE_UNDEFINED)
10500 		return TEST_SKIPPED;
10501 
10502 	/* Setup source mbuf payload */
10503 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10504 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10505 			rte_pktmbuf_tailroom(ut_params->ibuf));
10506 
10507 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
10508 			d_td->plaintext.len);
10509 
10510 	memcpy(plaintext, d_td->plaintext.data, d_td->plaintext.len);
10511 
10512 	/* Setup cipher session parameters */
10513 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
10514 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_DOCSISBPI;
10515 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
10516 	ut_params->cipher_xform.cipher.key.data = d_td->key.data;
10517 	ut_params->cipher_xform.cipher.key.length = d_td->key.len;
10518 	ut_params->cipher_xform.cipher.iv.length = d_td->iv.len;
10519 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
10520 	ut_params->cipher_xform.next = NULL;
10521 
10522 	/* Setup DOCSIS session parameters */
10523 	ut_params->docsis_xform.direction = RTE_SECURITY_DOCSIS_DOWNLINK;
10524 
10525 	struct rte_security_session_conf sess_conf = {
10526 		.action_type = ut_params->type,
10527 		.protocol = RTE_SECURITY_PROTOCOL_DOCSIS,
10528 		.docsis = ut_params->docsis_xform,
10529 		.crypto_xform = &ut_params->cipher_xform,
10530 	};
10531 
10532 	/* Create security session */
10533 	ut_params->sec_session = rte_security_session_create(ctx, &sess_conf,
10534 					ts_params->session_mpool,
10535 					ts_params->session_priv_mpool);
10536 
10537 	if (!ut_params->sec_session) {
10538 		printf("Test function %s line %u: failed to allocate session\n",
10539 			__func__, __LINE__);
10540 		ret = TEST_FAILED;
10541 		goto on_err;
10542 	}
10543 
10544 	/* Generate crypto op data structure */
10545 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
10546 				RTE_CRYPTO_OP_TYPE_SYMMETRIC);
10547 	if (!ut_params->op) {
10548 		printf("Test function %s line %u: failed to allocate symmetric "
10549 			"crypto operation\n", __func__, __LINE__);
10550 		ret = TEST_FAILED;
10551 		goto on_err;
10552 	}
10553 
10554 	/* Setup CRC operation parameters */
10555 	crc_len = d_td->plaintext.no_crc == false ?
10556 			(d_td->plaintext.len -
10557 				d_td->plaintext.crc_offset -
10558 				RTE_ETHER_CRC_LEN) :
10559 			0;
10560 	crc_len = crc_len > 0 ? crc_len : 0;
10561 	ut_params->op->sym->auth.data.length = crc_len;
10562 	ut_params->op->sym->auth.data.offset = d_td->plaintext.crc_offset;
10563 
10564 	/* Setup cipher operation parameters */
10565 	cipher_len = d_td->plaintext.no_cipher == false ?
10566 			(d_td->plaintext.len -
10567 				d_td->plaintext.cipher_offset) :
10568 			0;
10569 	cipher_len = cipher_len > 0 ? cipher_len : 0;
10570 	ut_params->op->sym->cipher.data.length = cipher_len;
10571 	ut_params->op->sym->cipher.data.offset = d_td->plaintext.cipher_offset;
10572 
10573 	/* Setup cipher IV */
10574 	iv_ptr = (uint8_t *)ut_params->op + IV_OFFSET;
10575 	rte_memcpy(iv_ptr, d_td->iv.data, d_td->iv.len);
10576 
10577 	/* Attach session to operation */
10578 	rte_security_attach_session(ut_params->op, ut_params->sec_session);
10579 
10580 	/* Set crypto operation mbufs */
10581 	ut_params->op->sym->m_src = ut_params->ibuf;
10582 	ut_params->op->sym->m_dst = NULL;
10583 
10584 	/* Process crypto operation */
10585 	if (process_crypto_request(ts_params->valid_devs[0], ut_params->op) ==
10586 			NULL) {
10587 		printf("Test function %s line %u: failed to process crypto op\n",
10588 			__func__, __LINE__);
10589 		ret = TEST_FAILED;
10590 		goto on_err;
10591 	}
10592 
10593 	if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS) {
10594 		printf("Test function %s line %u: crypto op processing failed\n",
10595 			__func__, __LINE__);
10596 		ret = TEST_FAILED;
10597 		goto on_err;
10598 	}
10599 
10600 	/* Validate ciphertext */
10601 	ciphertext = plaintext;
10602 
10603 	if (memcmp(ciphertext, d_td->ciphertext.data, d_td->ciphertext.len)) {
10604 		printf("Test function %s line %u: plaintext not as expected\n",
10605 			__func__, __LINE__);
10606 		rte_hexdump(stdout, "expected", d_td->ciphertext.data,
10607 				d_td->ciphertext.len);
10608 		rte_hexdump(stdout, "actual", ciphertext, d_td->ciphertext.len);
10609 		ret = TEST_FAILED;
10610 		goto on_err;
10611 	}
10612 
10613 on_err:
10614 	rte_crypto_op_free(ut_params->op);
10615 	ut_params->op = NULL;
10616 
10617 	if (ut_params->sec_session)
10618 		rte_security_session_destroy(ctx, ut_params->sec_session);
10619 	ut_params->sec_session = NULL;
10620 
10621 	rte_pktmbuf_free(ut_params->ibuf);
10622 	ut_params->ibuf = NULL;
10623 
10624 	return ret;
10625 }
10626 #endif
10627 
10628 static int
10629 test_AES_GCM_authenticated_encryption_test_case_1(void)
10630 {
10631 	return test_authenticated_encryption(&gcm_test_case_1);
10632 }
10633 
10634 static int
10635 test_AES_GCM_authenticated_encryption_test_case_2(void)
10636 {
10637 	return test_authenticated_encryption(&gcm_test_case_2);
10638 }
10639 
10640 static int
10641 test_AES_GCM_authenticated_encryption_test_case_3(void)
10642 {
10643 	return test_authenticated_encryption(&gcm_test_case_3);
10644 }
10645 
10646 static int
10647 test_AES_GCM_authenticated_encryption_test_case_4(void)
10648 {
10649 	return test_authenticated_encryption(&gcm_test_case_4);
10650 }
10651 
10652 static int
10653 test_AES_GCM_authenticated_encryption_test_case_5(void)
10654 {
10655 	return test_authenticated_encryption(&gcm_test_case_5);
10656 }
10657 
10658 static int
10659 test_AES_GCM_authenticated_encryption_test_case_6(void)
10660 {
10661 	return test_authenticated_encryption(&gcm_test_case_6);
10662 }
10663 
10664 static int
10665 test_AES_GCM_authenticated_encryption_test_case_7(void)
10666 {
10667 	return test_authenticated_encryption(&gcm_test_case_7);
10668 }
10669 
10670 static int
10671 test_AES_GCM_authenticated_encryption_test_case_8(void)
10672 {
10673 	return test_authenticated_encryption(&gcm_test_case_8);
10674 }
10675 
10676 static int
10677 test_AES_GCM_J0_authenticated_encryption_test_case_1(void)
10678 {
10679 	return test_authenticated_encryption(&gcm_J0_test_case_1);
10680 }
10681 
10682 static int
10683 test_AES_GCM_auth_encryption_test_case_192_1(void)
10684 {
10685 	return test_authenticated_encryption(&gcm_test_case_192_1);
10686 }
10687 
10688 static int
10689 test_AES_GCM_auth_encryption_test_case_192_2(void)
10690 {
10691 	return test_authenticated_encryption(&gcm_test_case_192_2);
10692 }
10693 
10694 static int
10695 test_AES_GCM_auth_encryption_test_case_192_3(void)
10696 {
10697 	return test_authenticated_encryption(&gcm_test_case_192_3);
10698 }
10699 
10700 static int
10701 test_AES_GCM_auth_encryption_test_case_192_4(void)
10702 {
10703 	return test_authenticated_encryption(&gcm_test_case_192_4);
10704 }
10705 
10706 static int
10707 test_AES_GCM_auth_encryption_test_case_192_5(void)
10708 {
10709 	return test_authenticated_encryption(&gcm_test_case_192_5);
10710 }
10711 
10712 static int
10713 test_AES_GCM_auth_encryption_test_case_192_6(void)
10714 {
10715 	return test_authenticated_encryption(&gcm_test_case_192_6);
10716 }
10717 
10718 static int
10719 test_AES_GCM_auth_encryption_test_case_192_7(void)
10720 {
10721 	return test_authenticated_encryption(&gcm_test_case_192_7);
10722 }
10723 
10724 static int
10725 test_AES_GCM_auth_encryption_test_case_256_1(void)
10726 {
10727 	return test_authenticated_encryption(&gcm_test_case_256_1);
10728 }
10729 
10730 static int
10731 test_AES_GCM_auth_encryption_test_case_256_2(void)
10732 {
10733 	return test_authenticated_encryption(&gcm_test_case_256_2);
10734 }
10735 
10736 static int
10737 test_AES_GCM_auth_encryption_test_case_256_3(void)
10738 {
10739 	return test_authenticated_encryption(&gcm_test_case_256_3);
10740 }
10741 
10742 static int
10743 test_AES_GCM_auth_encryption_test_case_256_4(void)
10744 {
10745 	return test_authenticated_encryption(&gcm_test_case_256_4);
10746 }
10747 
10748 static int
10749 test_AES_GCM_auth_encryption_test_case_256_5(void)
10750 {
10751 	return test_authenticated_encryption(&gcm_test_case_256_5);
10752 }
10753 
10754 static int
10755 test_AES_GCM_auth_encryption_test_case_256_6(void)
10756 {
10757 	return test_authenticated_encryption(&gcm_test_case_256_6);
10758 }
10759 
10760 static int
10761 test_AES_GCM_auth_encryption_test_case_256_7(void)
10762 {
10763 	return test_authenticated_encryption(&gcm_test_case_256_7);
10764 }
10765 
10766 static int
10767 test_AES_GCM_auth_encryption_test_case_aad_1(void)
10768 {
10769 	return test_authenticated_encryption(&gcm_test_case_aad_1);
10770 }
10771 
10772 static int
10773 test_AES_GCM_auth_encryption_test_case_aad_2(void)
10774 {
10775 	return test_authenticated_encryption(&gcm_test_case_aad_2);
10776 }
10777 
10778 static int
10779 test_AES_GCM_auth_encryption_fail_iv_corrupt(void)
10780 {
10781 	struct aead_test_data tdata;
10782 	int res;
10783 
10784 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10785 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10786 	tdata.iv.data[0] += 1;
10787 	res = test_authenticated_encryption(&tdata);
10788 	if (res == TEST_SKIPPED)
10789 		return res;
10790 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10791 	return TEST_SUCCESS;
10792 }
10793 
10794 static int
10795 test_AES_GCM_auth_encryption_fail_in_data_corrupt(void)
10796 {
10797 	struct aead_test_data tdata;
10798 	int res;
10799 
10800 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10801 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10802 	tdata.plaintext.data[0] += 1;
10803 	res = test_authenticated_encryption(&tdata);
10804 	if (res == TEST_SKIPPED)
10805 		return res;
10806 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10807 	return TEST_SUCCESS;
10808 }
10809 
10810 static int
10811 test_AES_GCM_auth_encryption_fail_out_data_corrupt(void)
10812 {
10813 	struct aead_test_data tdata;
10814 	int res;
10815 
10816 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10817 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10818 	tdata.ciphertext.data[0] += 1;
10819 	res = test_authenticated_encryption(&tdata);
10820 	if (res == TEST_SKIPPED)
10821 		return res;
10822 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10823 	return TEST_SUCCESS;
10824 }
10825 
10826 static int
10827 test_AES_GCM_auth_encryption_fail_aad_len_corrupt(void)
10828 {
10829 	struct aead_test_data tdata;
10830 	int res;
10831 
10832 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10833 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10834 	tdata.aad.len += 1;
10835 	res = test_authenticated_encryption(&tdata);
10836 	if (res == TEST_SKIPPED)
10837 		return res;
10838 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10839 	return TEST_SUCCESS;
10840 }
10841 
10842 static int
10843 test_AES_GCM_auth_encryption_fail_aad_corrupt(void)
10844 {
10845 	struct aead_test_data tdata;
10846 	uint8_t aad[gcm_test_case_7.aad.len];
10847 	int res;
10848 
10849 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10850 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10851 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
10852 	aad[0] += 1;
10853 	tdata.aad.data = aad;
10854 	res = test_authenticated_encryption(&tdata);
10855 	if (res == TEST_SKIPPED)
10856 		return res;
10857 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10858 	return TEST_SUCCESS;
10859 }
10860 
10861 static int
10862 test_AES_GCM_auth_encryption_fail_tag_corrupt(void)
10863 {
10864 	struct aead_test_data tdata;
10865 	int res;
10866 
10867 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
10868 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
10869 	tdata.auth_tag.data[0] += 1;
10870 	res = test_authenticated_encryption(&tdata);
10871 	if (res == TEST_SKIPPED)
10872 		return res;
10873 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "encryption not failed");
10874 	return TEST_SUCCESS;
10875 }
10876 
10877 static int
10878 test_authenticated_decryption(const struct aead_test_data *tdata)
10879 {
10880 	struct crypto_testsuite_params *ts_params = &testsuite_params;
10881 	struct crypto_unittest_params *ut_params = &unittest_params;
10882 
10883 	int retval;
10884 	uint8_t *plaintext;
10885 	uint32_t i;
10886 	struct rte_cryptodev_info dev_info;
10887 
10888 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
10889 	uint64_t feat_flags = dev_info.feature_flags;
10890 
10891 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
10892 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
10893 		printf("Device doesn't support RAW data-path APIs.\n");
10894 		return TEST_SKIPPED;
10895 	}
10896 
10897 	/* Verify the capabilities */
10898 	struct rte_cryptodev_sym_capability_idx cap_idx;
10899 	const struct rte_cryptodev_symmetric_capability *capability;
10900 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
10901 	cap_idx.algo.aead = tdata->algo;
10902 	capability = rte_cryptodev_sym_capability_get(
10903 			ts_params->valid_devs[0], &cap_idx);
10904 	if (capability == NULL)
10905 		return TEST_SKIPPED;
10906 	if (rte_cryptodev_sym_capability_check_aead(
10907 			capability, tdata->key.len, tdata->auth_tag.len,
10908 			tdata->aad.len, tdata->iv.len))
10909 		return TEST_SKIPPED;
10910 
10911 	/* Create AEAD session */
10912 	retval = create_aead_session(ts_params->valid_devs[0],
10913 			tdata->algo,
10914 			RTE_CRYPTO_AEAD_OP_DECRYPT,
10915 			tdata->key.data, tdata->key.len,
10916 			tdata->aad.len, tdata->auth_tag.len,
10917 			tdata->iv.len);
10918 	if (retval < 0)
10919 		return retval;
10920 
10921 	/* alloc mbuf and set payload */
10922 	if (tdata->aad.len > MBUF_SIZE) {
10923 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
10924 		/* Populate full size of add data */
10925 		for (i = 32; i < MAX_AAD_LENGTH; i += 32)
10926 			memcpy(&tdata->aad.data[i], &tdata->aad.data[0], 32);
10927 	} else
10928 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
10929 
10930 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
10931 			rte_pktmbuf_tailroom(ut_params->ibuf));
10932 
10933 	/* Create AEAD operation */
10934 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
10935 	if (retval < 0)
10936 		return retval;
10937 
10938 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
10939 
10940 	ut_params->op->sym->m_src = ut_params->ibuf;
10941 
10942 	/* Process crypto operation */
10943 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
10944 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
10945 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
10946 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
10947 				ut_params->op, 0, 0, 0, 0);
10948 	else
10949 		TEST_ASSERT_NOT_NULL(
10950 			process_crypto_request(ts_params->valid_devs[0],
10951 			ut_params->op), "failed to process sym crypto op");
10952 
10953 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
10954 			"crypto op processing failed");
10955 
10956 	if (ut_params->op->sym->m_dst)
10957 		plaintext = rte_pktmbuf_mtod(ut_params->op->sym->m_dst,
10958 				uint8_t *);
10959 	else
10960 		plaintext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
10961 				uint8_t *,
10962 				ut_params->op->sym->cipher.data.offset);
10963 
10964 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
10965 
10966 	/* Validate obuf */
10967 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
10968 			plaintext,
10969 			tdata->plaintext.data,
10970 			tdata->plaintext.len,
10971 			"Plaintext data not as expected");
10972 
10973 	TEST_ASSERT_EQUAL(ut_params->op->status,
10974 			RTE_CRYPTO_OP_STATUS_SUCCESS,
10975 			"Authentication failed");
10976 
10977 	return 0;
10978 }
10979 
10980 static int
10981 test_AES_GCM_authenticated_decryption_test_case_1(void)
10982 {
10983 	return test_authenticated_decryption(&gcm_test_case_1);
10984 }
10985 
10986 static int
10987 test_AES_GCM_authenticated_decryption_test_case_2(void)
10988 {
10989 	return test_authenticated_decryption(&gcm_test_case_2);
10990 }
10991 
10992 static int
10993 test_AES_GCM_authenticated_decryption_test_case_3(void)
10994 {
10995 	return test_authenticated_decryption(&gcm_test_case_3);
10996 }
10997 
10998 static int
10999 test_AES_GCM_authenticated_decryption_test_case_4(void)
11000 {
11001 	return test_authenticated_decryption(&gcm_test_case_4);
11002 }
11003 
11004 static int
11005 test_AES_GCM_authenticated_decryption_test_case_5(void)
11006 {
11007 	return test_authenticated_decryption(&gcm_test_case_5);
11008 }
11009 
11010 static int
11011 test_AES_GCM_authenticated_decryption_test_case_6(void)
11012 {
11013 	return test_authenticated_decryption(&gcm_test_case_6);
11014 }
11015 
11016 static int
11017 test_AES_GCM_authenticated_decryption_test_case_7(void)
11018 {
11019 	return test_authenticated_decryption(&gcm_test_case_7);
11020 }
11021 
11022 static int
11023 test_AES_GCM_authenticated_decryption_test_case_8(void)
11024 {
11025 	return test_authenticated_decryption(&gcm_test_case_8);
11026 }
11027 
11028 static int
11029 test_AES_GCM_J0_authenticated_decryption_test_case_1(void)
11030 {
11031 	return test_authenticated_decryption(&gcm_J0_test_case_1);
11032 }
11033 
11034 static int
11035 test_AES_GCM_auth_decryption_test_case_192_1(void)
11036 {
11037 	return test_authenticated_decryption(&gcm_test_case_192_1);
11038 }
11039 
11040 static int
11041 test_AES_GCM_auth_decryption_test_case_192_2(void)
11042 {
11043 	return test_authenticated_decryption(&gcm_test_case_192_2);
11044 }
11045 
11046 static int
11047 test_AES_GCM_auth_decryption_test_case_192_3(void)
11048 {
11049 	return test_authenticated_decryption(&gcm_test_case_192_3);
11050 }
11051 
11052 static int
11053 test_AES_GCM_auth_decryption_test_case_192_4(void)
11054 {
11055 	return test_authenticated_decryption(&gcm_test_case_192_4);
11056 }
11057 
11058 static int
11059 test_AES_GCM_auth_decryption_test_case_192_5(void)
11060 {
11061 	return test_authenticated_decryption(&gcm_test_case_192_5);
11062 }
11063 
11064 static int
11065 test_AES_GCM_auth_decryption_test_case_192_6(void)
11066 {
11067 	return test_authenticated_decryption(&gcm_test_case_192_6);
11068 }
11069 
11070 static int
11071 test_AES_GCM_auth_decryption_test_case_192_7(void)
11072 {
11073 	return test_authenticated_decryption(&gcm_test_case_192_7);
11074 }
11075 
11076 static int
11077 test_AES_GCM_auth_decryption_test_case_256_1(void)
11078 {
11079 	return test_authenticated_decryption(&gcm_test_case_256_1);
11080 }
11081 
11082 static int
11083 test_AES_GCM_auth_decryption_test_case_256_2(void)
11084 {
11085 	return test_authenticated_decryption(&gcm_test_case_256_2);
11086 }
11087 
11088 static int
11089 test_AES_GCM_auth_decryption_test_case_256_3(void)
11090 {
11091 	return test_authenticated_decryption(&gcm_test_case_256_3);
11092 }
11093 
11094 static int
11095 test_AES_GCM_auth_decryption_test_case_256_4(void)
11096 {
11097 	return test_authenticated_decryption(&gcm_test_case_256_4);
11098 }
11099 
11100 static int
11101 test_AES_GCM_auth_decryption_test_case_256_5(void)
11102 {
11103 	return test_authenticated_decryption(&gcm_test_case_256_5);
11104 }
11105 
11106 static int
11107 test_AES_GCM_auth_decryption_test_case_256_6(void)
11108 {
11109 	return test_authenticated_decryption(&gcm_test_case_256_6);
11110 }
11111 
11112 static int
11113 test_AES_GCM_auth_decryption_test_case_256_7(void)
11114 {
11115 	return test_authenticated_decryption(&gcm_test_case_256_7);
11116 }
11117 
11118 static int
11119 test_AES_GCM_auth_decryption_test_case_aad_1(void)
11120 {
11121 	return test_authenticated_decryption(&gcm_test_case_aad_1);
11122 }
11123 
11124 static int
11125 test_AES_GCM_auth_decryption_test_case_aad_2(void)
11126 {
11127 	return test_authenticated_decryption(&gcm_test_case_aad_2);
11128 }
11129 
11130 static int
11131 test_AES_GCM_auth_decryption_fail_iv_corrupt(void)
11132 {
11133 	struct aead_test_data tdata;
11134 	int res;
11135 
11136 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11137 	tdata.iv.data[0] += 1;
11138 	res = test_authenticated_decryption(&tdata);
11139 	if (res == TEST_SKIPPED)
11140 		return res;
11141 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11142 	return TEST_SUCCESS;
11143 }
11144 
11145 static int
11146 test_AES_GCM_auth_decryption_fail_in_data_corrupt(void)
11147 {
11148 	struct aead_test_data tdata;
11149 	int res;
11150 
11151 	RTE_LOG(INFO, USER1, "This is a negative test, errors are expected\n");
11152 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11153 	tdata.plaintext.data[0] += 1;
11154 	res = test_authenticated_decryption(&tdata);
11155 	if (res == TEST_SKIPPED)
11156 		return res;
11157 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11158 	return TEST_SUCCESS;
11159 }
11160 
11161 static int
11162 test_AES_GCM_auth_decryption_fail_out_data_corrupt(void)
11163 {
11164 	struct aead_test_data tdata;
11165 	int res;
11166 
11167 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11168 	tdata.ciphertext.data[0] += 1;
11169 	res = test_authenticated_decryption(&tdata);
11170 	if (res == TEST_SKIPPED)
11171 		return res;
11172 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11173 	return TEST_SUCCESS;
11174 }
11175 
11176 static int
11177 test_AES_GCM_auth_decryption_fail_aad_len_corrupt(void)
11178 {
11179 	struct aead_test_data tdata;
11180 	int res;
11181 
11182 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11183 	tdata.aad.len += 1;
11184 	res = test_authenticated_decryption(&tdata);
11185 	if (res == TEST_SKIPPED)
11186 		return res;
11187 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11188 	return TEST_SUCCESS;
11189 }
11190 
11191 static int
11192 test_AES_GCM_auth_decryption_fail_aad_corrupt(void)
11193 {
11194 	struct aead_test_data tdata;
11195 	uint8_t aad[gcm_test_case_7.aad.len];
11196 	int res;
11197 
11198 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11199 	memcpy(aad, gcm_test_case_7.aad.data, gcm_test_case_7.aad.len);
11200 	aad[0] += 1;
11201 	tdata.aad.data = aad;
11202 	res = test_authenticated_decryption(&tdata);
11203 	if (res == TEST_SKIPPED)
11204 		return res;
11205 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "decryption not failed");
11206 	return TEST_SUCCESS;
11207 }
11208 
11209 static int
11210 test_AES_GCM_auth_decryption_fail_tag_corrupt(void)
11211 {
11212 	struct aead_test_data tdata;
11213 	int res;
11214 
11215 	memcpy(&tdata, &gcm_test_case_7, sizeof(struct aead_test_data));
11216 	tdata.auth_tag.data[0] += 1;
11217 	res = test_authenticated_decryption(&tdata);
11218 	if (res == TEST_SKIPPED)
11219 		return res;
11220 	TEST_ASSERT_EQUAL(res, TEST_FAILED, "authentication not failed");
11221 	return TEST_SUCCESS;
11222 }
11223 
11224 static int
11225 test_authenticated_encryption_oop(const struct aead_test_data *tdata)
11226 {
11227 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11228 	struct crypto_unittest_params *ut_params = &unittest_params;
11229 
11230 	int retval;
11231 	uint8_t *ciphertext, *auth_tag;
11232 	uint16_t plaintext_pad_len;
11233 	struct rte_cryptodev_info dev_info;
11234 
11235 	/* Verify the capabilities */
11236 	struct rte_cryptodev_sym_capability_idx cap_idx;
11237 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11238 	cap_idx.algo.aead = tdata->algo;
11239 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11240 			&cap_idx) == NULL)
11241 		return TEST_SKIPPED;
11242 
11243 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11244 	uint64_t feat_flags = dev_info.feature_flags;
11245 
11246 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11247 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)))
11248 		return TEST_SKIPPED;
11249 
11250 	/* not supported with CPU crypto */
11251 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11252 		return TEST_SKIPPED;
11253 
11254 	/* Create AEAD session */
11255 	retval = create_aead_session(ts_params->valid_devs[0],
11256 			tdata->algo,
11257 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
11258 			tdata->key.data, tdata->key.len,
11259 			tdata->aad.len, tdata->auth_tag.len,
11260 			tdata->iv.len);
11261 	if (retval < 0)
11262 		return retval;
11263 
11264 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11265 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11266 
11267 	/* clear mbuf payload */
11268 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11269 			rte_pktmbuf_tailroom(ut_params->ibuf));
11270 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11271 			rte_pktmbuf_tailroom(ut_params->obuf));
11272 
11273 	/* Create AEAD operation */
11274 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11275 	if (retval < 0)
11276 		return retval;
11277 
11278 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11279 
11280 	ut_params->op->sym->m_src = ut_params->ibuf;
11281 	ut_params->op->sym->m_dst = ut_params->obuf;
11282 
11283 	/* Process crypto operation */
11284 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11285 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11286 			ut_params->op, 0, 0, 0, 0);
11287 	else
11288 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11289 			ut_params->op), "failed to process sym crypto op");
11290 
11291 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11292 			"crypto op processing failed");
11293 
11294 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11295 
11296 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11297 			ut_params->op->sym->cipher.data.offset);
11298 	auth_tag = ciphertext + plaintext_pad_len;
11299 
11300 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11301 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11302 
11303 	/* Validate obuf */
11304 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11305 			ciphertext,
11306 			tdata->ciphertext.data,
11307 			tdata->ciphertext.len,
11308 			"Ciphertext data not as expected");
11309 
11310 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11311 			auth_tag,
11312 			tdata->auth_tag.data,
11313 			tdata->auth_tag.len,
11314 			"Generated auth tag not as expected");
11315 
11316 	return 0;
11317 
11318 }
11319 
11320 static int
11321 test_AES_GCM_authenticated_encryption_oop_test_case_1(void)
11322 {
11323 	return test_authenticated_encryption_oop(&gcm_test_case_5);
11324 }
11325 
11326 static int
11327 test_authenticated_decryption_oop(const struct aead_test_data *tdata)
11328 {
11329 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11330 	struct crypto_unittest_params *ut_params = &unittest_params;
11331 
11332 	int retval;
11333 	uint8_t *plaintext;
11334 	struct rte_cryptodev_info dev_info;
11335 
11336 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11337 	uint64_t feat_flags = dev_info.feature_flags;
11338 
11339 	/* Verify the capabilities */
11340 	struct rte_cryptodev_sym_capability_idx cap_idx;
11341 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11342 	cap_idx.algo.aead = tdata->algo;
11343 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11344 			&cap_idx) == NULL)
11345 		return TEST_SKIPPED;
11346 
11347 	/* not supported with CPU crypto and raw data-path APIs*/
11348 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO ||
11349 			global_api_test_type == CRYPTODEV_RAW_API_TEST)
11350 		return TEST_SKIPPED;
11351 
11352 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11353 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11354 		printf("Device does not support RAW data-path APIs.\n");
11355 		return TEST_SKIPPED;
11356 	}
11357 
11358 	/* Create AEAD session */
11359 	retval = create_aead_session(ts_params->valid_devs[0],
11360 			tdata->algo,
11361 			RTE_CRYPTO_AEAD_OP_DECRYPT,
11362 			tdata->key.data, tdata->key.len,
11363 			tdata->aad.len, tdata->auth_tag.len,
11364 			tdata->iv.len);
11365 	if (retval < 0)
11366 		return retval;
11367 
11368 	/* alloc mbuf and set payload */
11369 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11370 	ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11371 
11372 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11373 			rte_pktmbuf_tailroom(ut_params->ibuf));
11374 	memset(rte_pktmbuf_mtod(ut_params->obuf, uint8_t *), 0,
11375 			rte_pktmbuf_tailroom(ut_params->obuf));
11376 
11377 	/* Create AEAD operation */
11378 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11379 	if (retval < 0)
11380 		return retval;
11381 
11382 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11383 
11384 	ut_params->op->sym->m_src = ut_params->ibuf;
11385 	ut_params->op->sym->m_dst = ut_params->obuf;
11386 
11387 	/* Process crypto operation */
11388 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11389 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11390 				ut_params->op, 0, 0, 0, 0);
11391 	else
11392 		TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11393 			ut_params->op), "failed to process sym crypto op");
11394 
11395 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11396 			"crypto op processing failed");
11397 
11398 	plaintext = rte_pktmbuf_mtod_offset(ut_params->obuf, uint8_t *,
11399 			ut_params->op->sym->cipher.data.offset);
11400 
11401 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11402 
11403 	/* Validate obuf */
11404 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11405 			plaintext,
11406 			tdata->plaintext.data,
11407 			tdata->plaintext.len,
11408 			"Plaintext data not as expected");
11409 
11410 	TEST_ASSERT_EQUAL(ut_params->op->status,
11411 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11412 			"Authentication failed");
11413 	return 0;
11414 }
11415 
11416 static int
11417 test_AES_GCM_authenticated_decryption_oop_test_case_1(void)
11418 {
11419 	return test_authenticated_decryption_oop(&gcm_test_case_5);
11420 }
11421 
11422 static int
11423 test_authenticated_encryption_sessionless(
11424 		const struct aead_test_data *tdata)
11425 {
11426 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11427 	struct crypto_unittest_params *ut_params = &unittest_params;
11428 
11429 	int retval;
11430 	uint8_t *ciphertext, *auth_tag;
11431 	uint16_t plaintext_pad_len;
11432 	uint8_t key[tdata->key.len + 1];
11433 	struct rte_cryptodev_info dev_info;
11434 
11435 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11436 	uint64_t feat_flags = dev_info.feature_flags;
11437 
11438 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11439 		printf("Device doesn't support Sessionless ops.\n");
11440 		return TEST_SKIPPED;
11441 	}
11442 
11443 	/* not supported with CPU crypto */
11444 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11445 		return TEST_SKIPPED;
11446 
11447 	/* Verify the capabilities */
11448 	struct rte_cryptodev_sym_capability_idx cap_idx;
11449 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11450 	cap_idx.algo.aead = tdata->algo;
11451 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11452 			&cap_idx) == NULL)
11453 		return TEST_SKIPPED;
11454 
11455 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11456 
11457 	/* clear mbuf payload */
11458 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11459 			rte_pktmbuf_tailroom(ut_params->ibuf));
11460 
11461 	/* Create AEAD operation */
11462 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_ENCRYPT, tdata);
11463 	if (retval < 0)
11464 		return retval;
11465 
11466 	/* Create GCM xform */
11467 	memcpy(key, tdata->key.data, tdata->key.len);
11468 	retval = create_aead_xform(ut_params->op,
11469 			tdata->algo,
11470 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
11471 			key, tdata->key.len,
11472 			tdata->aad.len, tdata->auth_tag.len,
11473 			tdata->iv.len);
11474 	if (retval < 0)
11475 		return retval;
11476 
11477 	ut_params->op->sym->m_src = ut_params->ibuf;
11478 
11479 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11480 			RTE_CRYPTO_OP_SESSIONLESS,
11481 			"crypto op session type not sessionless");
11482 
11483 	/* Process crypto operation */
11484 	TEST_ASSERT_NOT_NULL(process_crypto_request(ts_params->valid_devs[0],
11485 			ut_params->op), "failed to process sym crypto op");
11486 
11487 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11488 
11489 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11490 			"crypto op status not success");
11491 
11492 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
11493 
11494 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11495 			ut_params->op->sym->cipher.data.offset);
11496 	auth_tag = ciphertext + plaintext_pad_len;
11497 
11498 	debug_hexdump(stdout, "ciphertext:", ciphertext, tdata->ciphertext.len);
11499 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->auth_tag.len);
11500 
11501 	/* Validate obuf */
11502 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11503 			ciphertext,
11504 			tdata->ciphertext.data,
11505 			tdata->ciphertext.len,
11506 			"Ciphertext data not as expected");
11507 
11508 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11509 			auth_tag,
11510 			tdata->auth_tag.data,
11511 			tdata->auth_tag.len,
11512 			"Generated auth tag not as expected");
11513 
11514 	return 0;
11515 
11516 }
11517 
11518 static int
11519 test_AES_GCM_authenticated_encryption_sessionless_test_case_1(void)
11520 {
11521 	return test_authenticated_encryption_sessionless(
11522 			&gcm_test_case_5);
11523 }
11524 
11525 static int
11526 test_authenticated_decryption_sessionless(
11527 		const struct aead_test_data *tdata)
11528 {
11529 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11530 	struct crypto_unittest_params *ut_params = &unittest_params;
11531 
11532 	int retval;
11533 	uint8_t *plaintext;
11534 	uint8_t key[tdata->key.len + 1];
11535 	struct rte_cryptodev_info dev_info;
11536 
11537 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11538 	uint64_t feat_flags = dev_info.feature_flags;
11539 
11540 	if (!(feat_flags & RTE_CRYPTODEV_FF_SYM_SESSIONLESS)) {
11541 		printf("Device doesn't support Sessionless ops.\n");
11542 		return TEST_SKIPPED;
11543 	}
11544 
11545 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11546 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11547 		printf("Device doesn't support RAW data-path APIs.\n");
11548 		return TEST_SKIPPED;
11549 	}
11550 
11551 	/* not supported with CPU crypto */
11552 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11553 		return TEST_SKIPPED;
11554 
11555 	/* Verify the capabilities */
11556 	struct rte_cryptodev_sym_capability_idx cap_idx;
11557 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
11558 	cap_idx.algo.aead = tdata->algo;
11559 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11560 			&cap_idx) == NULL)
11561 		return TEST_SKIPPED;
11562 
11563 	/* alloc mbuf and set payload */
11564 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11565 
11566 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11567 			rte_pktmbuf_tailroom(ut_params->ibuf));
11568 
11569 	/* Create AEAD operation */
11570 	retval = create_aead_operation(RTE_CRYPTO_AEAD_OP_DECRYPT, tdata);
11571 	if (retval < 0)
11572 		return retval;
11573 
11574 	/* Create AEAD xform */
11575 	memcpy(key, tdata->key.data, tdata->key.len);
11576 	retval = create_aead_xform(ut_params->op,
11577 			tdata->algo,
11578 			RTE_CRYPTO_AEAD_OP_DECRYPT,
11579 			key, tdata->key.len,
11580 			tdata->aad.len, tdata->auth_tag.len,
11581 			tdata->iv.len);
11582 	if (retval < 0)
11583 		return retval;
11584 
11585 	ut_params->op->sym->m_src = ut_params->ibuf;
11586 
11587 	TEST_ASSERT_EQUAL(ut_params->op->sess_type,
11588 			RTE_CRYPTO_OP_SESSIONLESS,
11589 			"crypto op session type not sessionless");
11590 
11591 	/* Process crypto operation */
11592 	if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11593 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11594 				ut_params->op, 0, 0, 0, 0);
11595 	else
11596 		TEST_ASSERT_NOT_NULL(process_crypto_request(
11597 			ts_params->valid_devs[0], ut_params->op),
11598 				"failed to process sym crypto op");
11599 
11600 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
11601 
11602 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11603 			"crypto op status not success");
11604 
11605 	plaintext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
11606 			ut_params->op->sym->cipher.data.offset);
11607 
11608 	debug_hexdump(stdout, "plaintext:", plaintext, tdata->ciphertext.len);
11609 
11610 	/* Validate obuf */
11611 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11612 			plaintext,
11613 			tdata->plaintext.data,
11614 			tdata->plaintext.len,
11615 			"Plaintext data not as expected");
11616 
11617 	TEST_ASSERT_EQUAL(ut_params->op->status,
11618 			RTE_CRYPTO_OP_STATUS_SUCCESS,
11619 			"Authentication failed");
11620 	return 0;
11621 }
11622 
11623 static int
11624 test_AES_GCM_authenticated_decryption_sessionless_test_case_1(void)
11625 {
11626 	return test_authenticated_decryption_sessionless(
11627 			&gcm_test_case_5);
11628 }
11629 
11630 static int
11631 test_AES_CCM_authenticated_encryption_test_case_128_1(void)
11632 {
11633 	return test_authenticated_encryption(&ccm_test_case_128_1);
11634 }
11635 
11636 static int
11637 test_AES_CCM_authenticated_encryption_test_case_128_2(void)
11638 {
11639 	return test_authenticated_encryption(&ccm_test_case_128_2);
11640 }
11641 
11642 static int
11643 test_AES_CCM_authenticated_encryption_test_case_128_3(void)
11644 {
11645 	return test_authenticated_encryption(&ccm_test_case_128_3);
11646 }
11647 
11648 static int
11649 test_AES_CCM_authenticated_decryption_test_case_128_1(void)
11650 {
11651 	return test_authenticated_decryption(&ccm_test_case_128_1);
11652 }
11653 
11654 static int
11655 test_AES_CCM_authenticated_decryption_test_case_128_2(void)
11656 {
11657 	return test_authenticated_decryption(&ccm_test_case_128_2);
11658 }
11659 
11660 static int
11661 test_AES_CCM_authenticated_decryption_test_case_128_3(void)
11662 {
11663 	return test_authenticated_decryption(&ccm_test_case_128_3);
11664 }
11665 
11666 static int
11667 test_AES_CCM_authenticated_encryption_test_case_192_1(void)
11668 {
11669 	return test_authenticated_encryption(&ccm_test_case_192_1);
11670 }
11671 
11672 static int
11673 test_AES_CCM_authenticated_encryption_test_case_192_2(void)
11674 {
11675 	return test_authenticated_encryption(&ccm_test_case_192_2);
11676 }
11677 
11678 static int
11679 test_AES_CCM_authenticated_encryption_test_case_192_3(void)
11680 {
11681 	return test_authenticated_encryption(&ccm_test_case_192_3);
11682 }
11683 
11684 static int
11685 test_AES_CCM_authenticated_decryption_test_case_192_1(void)
11686 {
11687 	return test_authenticated_decryption(&ccm_test_case_192_1);
11688 }
11689 
11690 static int
11691 test_AES_CCM_authenticated_decryption_test_case_192_2(void)
11692 {
11693 	return test_authenticated_decryption(&ccm_test_case_192_2);
11694 }
11695 
11696 static int
11697 test_AES_CCM_authenticated_decryption_test_case_192_3(void)
11698 {
11699 	return test_authenticated_decryption(&ccm_test_case_192_3);
11700 }
11701 
11702 static int
11703 test_AES_CCM_authenticated_encryption_test_case_256_1(void)
11704 {
11705 	return test_authenticated_encryption(&ccm_test_case_256_1);
11706 }
11707 
11708 static int
11709 test_AES_CCM_authenticated_encryption_test_case_256_2(void)
11710 {
11711 	return test_authenticated_encryption(&ccm_test_case_256_2);
11712 }
11713 
11714 static int
11715 test_AES_CCM_authenticated_encryption_test_case_256_3(void)
11716 {
11717 	return test_authenticated_encryption(&ccm_test_case_256_3);
11718 }
11719 
11720 static int
11721 test_AES_CCM_authenticated_decryption_test_case_256_1(void)
11722 {
11723 	return test_authenticated_decryption(&ccm_test_case_256_1);
11724 }
11725 
11726 static int
11727 test_AES_CCM_authenticated_decryption_test_case_256_2(void)
11728 {
11729 	return test_authenticated_decryption(&ccm_test_case_256_2);
11730 }
11731 
11732 static int
11733 test_AES_CCM_authenticated_decryption_test_case_256_3(void)
11734 {
11735 	return test_authenticated_decryption(&ccm_test_case_256_3);
11736 }
11737 
11738 static int
11739 test_stats(void)
11740 {
11741 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11742 	struct rte_cryptodev_stats stats;
11743 
11744 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11745 		return TEST_SKIPPED;
11746 
11747 	/* Verify the capabilities */
11748 	struct rte_cryptodev_sym_capability_idx cap_idx;
11749 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11750 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA1_HMAC;
11751 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11752 			&cap_idx) == NULL)
11753 		return TEST_SKIPPED;
11754 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
11755 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
11756 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11757 			&cap_idx) == NULL)
11758 		return TEST_SKIPPED;
11759 
11760 	if (rte_cryptodev_stats_get(ts_params->valid_devs[0], &stats)
11761 			== -ENOTSUP)
11762 		return TEST_SKIPPED;
11763 
11764 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11765 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0] + 600,
11766 			&stats) == -ENODEV),
11767 		"rte_cryptodev_stats_get invalid dev failed");
11768 	TEST_ASSERT((rte_cryptodev_stats_get(ts_params->valid_devs[0], 0) != 0),
11769 		"rte_cryptodev_stats_get invalid Param failed");
11770 
11771 	/* Test expected values */
11772 	test_AES_CBC_HMAC_SHA1_encrypt_digest();
11773 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11774 			&stats),
11775 		"rte_cryptodev_stats_get failed");
11776 	TEST_ASSERT((stats.enqueued_count == 1),
11777 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11778 	TEST_ASSERT((stats.dequeued_count == 1),
11779 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11780 	TEST_ASSERT((stats.enqueue_err_count == 0),
11781 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11782 	TEST_ASSERT((stats.dequeue_err_count == 0),
11783 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11784 
11785 	/* invalid device but should ignore and not reset device stats*/
11786 	rte_cryptodev_stats_reset(ts_params->valid_devs[0] + 300);
11787 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11788 			&stats),
11789 		"rte_cryptodev_stats_get failed");
11790 	TEST_ASSERT((stats.enqueued_count == 1),
11791 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11792 
11793 	/* check that a valid reset clears stats */
11794 	rte_cryptodev_stats_reset(ts_params->valid_devs[0]);
11795 	TEST_ASSERT_SUCCESS(rte_cryptodev_stats_get(ts_params->valid_devs[0],
11796 			&stats),
11797 					  "rte_cryptodev_stats_get failed");
11798 	TEST_ASSERT((stats.enqueued_count == 0),
11799 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11800 	TEST_ASSERT((stats.dequeued_count == 0),
11801 		"rte_cryptodev_stats_get returned unexpected enqueued stat");
11802 
11803 	return TEST_SUCCESS;
11804 }
11805 
11806 static int MD5_HMAC_create_session(struct crypto_testsuite_params *ts_params,
11807 				   struct crypto_unittest_params *ut_params,
11808 				   enum rte_crypto_auth_operation op,
11809 				   const struct HMAC_MD5_vector *test_case)
11810 {
11811 	uint8_t key[64];
11812 	int status;
11813 
11814 	memcpy(key, test_case->key.data, test_case->key.len);
11815 
11816 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11817 	ut_params->auth_xform.next = NULL;
11818 	ut_params->auth_xform.auth.op = op;
11819 
11820 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_MD5_HMAC;
11821 
11822 	ut_params->auth_xform.auth.digest_length = MD5_DIGEST_LEN;
11823 	ut_params->auth_xform.auth.key.length = test_case->key.len;
11824 	ut_params->auth_xform.auth.key.data = key;
11825 
11826 	ut_params->sess = rte_cryptodev_sym_session_create(
11827 			ts_params->session_mpool);
11828 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
11829 	if (ut_params->sess == NULL)
11830 		return TEST_FAILED;
11831 
11832 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
11833 			ut_params->sess, &ut_params->auth_xform,
11834 			ts_params->session_priv_mpool);
11835 	if (status == -ENOTSUP)
11836 		return TEST_SKIPPED;
11837 
11838 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
11839 
11840 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
11841 			rte_pktmbuf_tailroom(ut_params->ibuf));
11842 
11843 	return 0;
11844 }
11845 
11846 static int MD5_HMAC_create_op(struct crypto_unittest_params *ut_params,
11847 			      const struct HMAC_MD5_vector *test_case,
11848 			      uint8_t **plaintext)
11849 {
11850 	uint16_t plaintext_pad_len;
11851 
11852 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
11853 
11854 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11855 				16);
11856 
11857 	*plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
11858 			plaintext_pad_len);
11859 	memcpy(*plaintext, test_case->plaintext.data,
11860 			test_case->plaintext.len);
11861 
11862 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
11863 			ut_params->ibuf, MD5_DIGEST_LEN);
11864 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
11865 			"no room to append digest");
11866 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
11867 			ut_params->ibuf, plaintext_pad_len);
11868 
11869 	if (ut_params->auth_xform.auth.op == RTE_CRYPTO_AUTH_OP_VERIFY) {
11870 		rte_memcpy(sym_op->auth.digest.data, test_case->auth_tag.data,
11871 			   test_case->auth_tag.len);
11872 	}
11873 
11874 	sym_op->auth.data.offset = 0;
11875 	sym_op->auth.data.length = test_case->plaintext.len;
11876 
11877 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
11878 	ut_params->op->sym->m_src = ut_params->ibuf;
11879 
11880 	return 0;
11881 }
11882 
11883 static int
11884 test_MD5_HMAC_generate(const struct HMAC_MD5_vector *test_case)
11885 {
11886 	uint16_t plaintext_pad_len;
11887 	uint8_t *plaintext, *auth_tag;
11888 
11889 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11890 	struct crypto_unittest_params *ut_params = &unittest_params;
11891 	struct rte_cryptodev_info dev_info;
11892 
11893 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11894 	uint64_t feat_flags = dev_info.feature_flags;
11895 
11896 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11897 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11898 		printf("Device doesn't support RAW data-path APIs.\n");
11899 		return TEST_SKIPPED;
11900 	}
11901 
11902 	/* Verify the capabilities */
11903 	struct rte_cryptodev_sym_capability_idx cap_idx;
11904 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11905 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11906 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11907 			&cap_idx) == NULL)
11908 		return TEST_SKIPPED;
11909 
11910 	if (MD5_HMAC_create_session(ts_params, ut_params,
11911 			RTE_CRYPTO_AUTH_OP_GENERATE, test_case))
11912 		return TEST_FAILED;
11913 
11914 	/* Generate Crypto op data structure */
11915 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11916 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11917 	TEST_ASSERT_NOT_NULL(ut_params->op,
11918 			"Failed to allocate symmetric crypto operation struct");
11919 
11920 	plaintext_pad_len = RTE_ALIGN_CEIL(test_case->plaintext.len,
11921 				16);
11922 
11923 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11924 		return TEST_FAILED;
11925 
11926 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11927 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11928 			ut_params->op);
11929 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
11930 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
11931 				ut_params->op, 0, 1, 0, 0);
11932 	else
11933 		TEST_ASSERT_NOT_NULL(
11934 			process_crypto_request(ts_params->valid_devs[0],
11935 				ut_params->op),
11936 				"failed to process sym crypto op");
11937 
11938 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
11939 			"crypto op processing failed");
11940 
11941 	if (ut_params->op->sym->m_dst) {
11942 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
11943 				uint8_t *, plaintext_pad_len);
11944 	} else {
11945 		auth_tag = plaintext + plaintext_pad_len;
11946 	}
11947 
11948 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
11949 			auth_tag,
11950 			test_case->auth_tag.data,
11951 			test_case->auth_tag.len,
11952 			"HMAC_MD5 generated tag not as expected");
11953 
11954 	return TEST_SUCCESS;
11955 }
11956 
11957 static int
11958 test_MD5_HMAC_verify(const struct HMAC_MD5_vector *test_case)
11959 {
11960 	uint8_t *plaintext;
11961 
11962 	struct crypto_testsuite_params *ts_params = &testsuite_params;
11963 	struct crypto_unittest_params *ut_params = &unittest_params;
11964 	struct rte_cryptodev_info dev_info;
11965 
11966 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
11967 	uint64_t feat_flags = dev_info.feature_flags;
11968 
11969 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
11970 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
11971 		printf("Device doesn't support RAW data-path APIs.\n");
11972 		return TEST_SKIPPED;
11973 	}
11974 
11975 	/* Verify the capabilities */
11976 	struct rte_cryptodev_sym_capability_idx cap_idx;
11977 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
11978 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_MD5_HMAC;
11979 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
11980 			&cap_idx) == NULL)
11981 		return TEST_SKIPPED;
11982 
11983 	if (MD5_HMAC_create_session(ts_params, ut_params,
11984 			RTE_CRYPTO_AUTH_OP_VERIFY, test_case)) {
11985 		return TEST_FAILED;
11986 	}
11987 
11988 	/* Generate Crypto op data structure */
11989 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
11990 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
11991 	TEST_ASSERT_NOT_NULL(ut_params->op,
11992 			"Failed to allocate symmetric crypto operation struct");
11993 
11994 	if (MD5_HMAC_create_op(ut_params, test_case, &plaintext))
11995 		return TEST_FAILED;
11996 
11997 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
11998 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
11999 			ut_params->op);
12000 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12001 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12002 				ut_params->op, 0, 1, 0, 0);
12003 	else
12004 		TEST_ASSERT_NOT_NULL(
12005 			process_crypto_request(ts_params->valid_devs[0],
12006 				ut_params->op),
12007 				"failed to process sym crypto op");
12008 
12009 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12010 			"HMAC_MD5 crypto op processing failed");
12011 
12012 	return TEST_SUCCESS;
12013 }
12014 
12015 static int
12016 test_MD5_HMAC_generate_case_1(void)
12017 {
12018 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_1);
12019 }
12020 
12021 static int
12022 test_MD5_HMAC_verify_case_1(void)
12023 {
12024 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_1);
12025 }
12026 
12027 static int
12028 test_MD5_HMAC_generate_case_2(void)
12029 {
12030 	return test_MD5_HMAC_generate(&HMAC_MD5_test_case_2);
12031 }
12032 
12033 static int
12034 test_MD5_HMAC_verify_case_2(void)
12035 {
12036 	return test_MD5_HMAC_verify(&HMAC_MD5_test_case_2);
12037 }
12038 
12039 static int
12040 test_multi_session(void)
12041 {
12042 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12043 	struct crypto_unittest_params *ut_params = &unittest_params;
12044 
12045 	struct rte_cryptodev_info dev_info;
12046 	struct rte_cryptodev_sym_session **sessions;
12047 
12048 	uint16_t i;
12049 	int status;
12050 
12051 	/* Verify the capabilities */
12052 	struct rte_cryptodev_sym_capability_idx cap_idx;
12053 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12054 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12055 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12056 			&cap_idx) == NULL)
12057 		return TEST_SKIPPED;
12058 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12059 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12060 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12061 			&cap_idx) == NULL)
12062 		return TEST_SKIPPED;
12063 
12064 	test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(ut_params,
12065 			aes_cbc_key, hmac_sha512_key);
12066 
12067 
12068 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12069 
12070 	sessions = rte_malloc(NULL,
12071 			sizeof(struct rte_cryptodev_sym_session *) *
12072 			(MAX_NB_SESSIONS + 1), 0);
12073 
12074 	/* Create multiple crypto sessions*/
12075 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
12076 
12077 		sessions[i] = rte_cryptodev_sym_session_create(
12078 				ts_params->session_mpool);
12079 		TEST_ASSERT_NOT_NULL(sessions[i],
12080 				"Session creation failed at session number %u",
12081 				i);
12082 
12083 		status = rte_cryptodev_sym_session_init(
12084 				ts_params->valid_devs[0],
12085 				sessions[i], &ut_params->auth_xform,
12086 				ts_params->session_priv_mpool);
12087 		if (status == -ENOTSUP)
12088 			return TEST_SKIPPED;
12089 
12090 		/* Attempt to send a request on each session */
12091 		TEST_ASSERT_SUCCESS( test_AES_CBC_HMAC_SHA512_decrypt_perform(
12092 			sessions[i],
12093 			ut_params,
12094 			ts_params,
12095 			catch_22_quote_2_512_bytes_AES_CBC_ciphertext,
12096 			catch_22_quote_2_512_bytes_AES_CBC_HMAC_SHA512_digest,
12097 			aes_cbc_iv),
12098 			"Failed to perform decrypt on request number %u.", i);
12099 		/* free crypto operation structure */
12100 		if (ut_params->op)
12101 			rte_crypto_op_free(ut_params->op);
12102 
12103 		/*
12104 		 * free mbuf - both obuf and ibuf are usually the same,
12105 		 * so check if they point at the same address is necessary,
12106 		 * to avoid freeing the mbuf twice.
12107 		 */
12108 		if (ut_params->obuf) {
12109 			rte_pktmbuf_free(ut_params->obuf);
12110 			if (ut_params->ibuf == ut_params->obuf)
12111 				ut_params->ibuf = 0;
12112 			ut_params->obuf = 0;
12113 		}
12114 		if (ut_params->ibuf) {
12115 			rte_pktmbuf_free(ut_params->ibuf);
12116 			ut_params->ibuf = 0;
12117 		}
12118 	}
12119 
12120 	sessions[i] = NULL;
12121 	/* Next session create should fail */
12122 	rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12123 			sessions[i], &ut_params->auth_xform,
12124 			ts_params->session_priv_mpool);
12125 	TEST_ASSERT_NULL(sessions[i],
12126 			"Session creation succeeded unexpectedly!");
12127 
12128 	for (i = 0; i < MAX_NB_SESSIONS; i++) {
12129 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12130 				sessions[i]);
12131 		rte_cryptodev_sym_session_free(sessions[i]);
12132 	}
12133 
12134 	rte_free(sessions);
12135 
12136 	return TEST_SUCCESS;
12137 }
12138 
12139 struct multi_session_params {
12140 	struct crypto_unittest_params ut_params;
12141 	uint8_t *cipher_key;
12142 	uint8_t *hmac_key;
12143 	const uint8_t *cipher;
12144 	const uint8_t *digest;
12145 	uint8_t *iv;
12146 };
12147 
12148 #define MB_SESSION_NUMBER 3
12149 
12150 static int
12151 test_multi_session_random_usage(void)
12152 {
12153 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12154 	struct rte_cryptodev_info dev_info;
12155 	struct rte_cryptodev_sym_session **sessions;
12156 	uint32_t i, j;
12157 	struct multi_session_params ut_paramz[] = {
12158 
12159 		{
12160 			.cipher_key = ms_aes_cbc_key0,
12161 			.hmac_key = ms_hmac_key0,
12162 			.cipher = ms_aes_cbc_cipher0,
12163 			.digest = ms_hmac_digest0,
12164 			.iv = ms_aes_cbc_iv0
12165 		},
12166 		{
12167 			.cipher_key = ms_aes_cbc_key1,
12168 			.hmac_key = ms_hmac_key1,
12169 			.cipher = ms_aes_cbc_cipher1,
12170 			.digest = ms_hmac_digest1,
12171 			.iv = ms_aes_cbc_iv1
12172 		},
12173 		{
12174 			.cipher_key = ms_aes_cbc_key2,
12175 			.hmac_key = ms_hmac_key2,
12176 			.cipher = ms_aes_cbc_cipher2,
12177 			.digest = ms_hmac_digest2,
12178 			.iv = ms_aes_cbc_iv2
12179 		},
12180 
12181 	};
12182 	int status;
12183 
12184 	/* Verify the capabilities */
12185 	struct rte_cryptodev_sym_capability_idx cap_idx;
12186 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12187 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_SHA512_HMAC;
12188 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12189 			&cap_idx) == NULL)
12190 		return TEST_SKIPPED;
12191 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12192 	cap_idx.algo.cipher = RTE_CRYPTO_CIPHER_AES_CBC;
12193 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12194 			&cap_idx) == NULL)
12195 		return TEST_SKIPPED;
12196 
12197 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12198 
12199 	sessions = rte_malloc(NULL,
12200 			(sizeof(struct rte_cryptodev_sym_session *)
12201 					* MAX_NB_SESSIONS) + 1, 0);
12202 
12203 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
12204 		sessions[i] = rte_cryptodev_sym_session_create(
12205 				ts_params->session_mpool);
12206 		TEST_ASSERT_NOT_NULL(sessions[i],
12207 				"Session creation failed at session number %u",
12208 				i);
12209 
12210 		rte_memcpy(&ut_paramz[i].ut_params, &unittest_params,
12211 				sizeof(struct crypto_unittest_params));
12212 
12213 		test_AES_CBC_HMAC_SHA512_decrypt_create_session_params(
12214 				&ut_paramz[i].ut_params,
12215 				ut_paramz[i].cipher_key, ut_paramz[i].hmac_key);
12216 
12217 		/* Create multiple crypto sessions*/
12218 		status = rte_cryptodev_sym_session_init(
12219 				ts_params->valid_devs[0],
12220 				sessions[i],
12221 				&ut_paramz[i].ut_params.auth_xform,
12222 				ts_params->session_priv_mpool);
12223 
12224 		if (status == -ENOTSUP)
12225 			return TEST_SKIPPED;
12226 
12227 		TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12228 	}
12229 
12230 	srand(time(NULL));
12231 	for (i = 0; i < 40000; i++) {
12232 
12233 		j = rand() % MB_SESSION_NUMBER;
12234 
12235 		TEST_ASSERT_SUCCESS(
12236 			test_AES_CBC_HMAC_SHA512_decrypt_perform(
12237 					sessions[j],
12238 					&ut_paramz[j].ut_params,
12239 					ts_params, ut_paramz[j].cipher,
12240 					ut_paramz[j].digest,
12241 					ut_paramz[j].iv),
12242 			"Failed to perform decrypt on request number %u.", i);
12243 
12244 		if (ut_paramz[j].ut_params.op)
12245 			rte_crypto_op_free(ut_paramz[j].ut_params.op);
12246 
12247 		/*
12248 		 * free mbuf - both obuf and ibuf are usually the same,
12249 		 * so check if they point at the same address is necessary,
12250 		 * to avoid freeing the mbuf twice.
12251 		 */
12252 		if (ut_paramz[j].ut_params.obuf) {
12253 			rte_pktmbuf_free(ut_paramz[j].ut_params.obuf);
12254 			if (ut_paramz[j].ut_params.ibuf
12255 					== ut_paramz[j].ut_params.obuf)
12256 				ut_paramz[j].ut_params.ibuf = 0;
12257 			ut_paramz[j].ut_params.obuf = 0;
12258 		}
12259 		if (ut_paramz[j].ut_params.ibuf) {
12260 			rte_pktmbuf_free(ut_paramz[j].ut_params.ibuf);
12261 			ut_paramz[j].ut_params.ibuf = 0;
12262 		}
12263 	}
12264 
12265 	for (i = 0; i < MB_SESSION_NUMBER; i++) {
12266 		rte_cryptodev_sym_session_clear(ts_params->valid_devs[0],
12267 				sessions[i]);
12268 		rte_cryptodev_sym_session_free(sessions[i]);
12269 	}
12270 
12271 	rte_free(sessions);
12272 
12273 	return TEST_SUCCESS;
12274 }
12275 
12276 uint8_t orig_data[] = {0xab, 0xab, 0xab, 0xab,
12277 			0xab, 0xab, 0xab, 0xab,
12278 			0xab, 0xab, 0xab, 0xab,
12279 			0xab, 0xab, 0xab, 0xab};
12280 
12281 static int
12282 test_null_invalid_operation(void)
12283 {
12284 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12285 	struct crypto_unittest_params *ut_params = &unittest_params;
12286 	int ret;
12287 
12288 	/* This test is for NULL PMD only */
12289 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
12290 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12291 		return TEST_SKIPPED;
12292 
12293 	/* Setup Cipher Parameters */
12294 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12295 	ut_params->cipher_xform.next = NULL;
12296 
12297 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_AES_CBC;
12298 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12299 
12300 	ut_params->sess = rte_cryptodev_sym_session_create(
12301 			ts_params->session_mpool);
12302 
12303 	/* Create Crypto session*/
12304 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12305 			ut_params->sess, &ut_params->cipher_xform,
12306 			ts_params->session_priv_mpool);
12307 	TEST_ASSERT(ret < 0,
12308 			"Session creation succeeded unexpectedly");
12309 
12310 
12311 	/* Setup HMAC Parameters */
12312 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12313 	ut_params->auth_xform.next = NULL;
12314 
12315 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_SHA1_HMAC;
12316 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12317 
12318 	ut_params->sess = rte_cryptodev_sym_session_create(
12319 			ts_params->session_mpool);
12320 
12321 	/* Create Crypto session*/
12322 	ret = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12323 			ut_params->sess, &ut_params->auth_xform,
12324 			ts_params->session_priv_mpool);
12325 	TEST_ASSERT(ret < 0,
12326 			"Session creation succeeded unexpectedly");
12327 
12328 	return TEST_SUCCESS;
12329 }
12330 
12331 
12332 #define NULL_BURST_LENGTH (32)
12333 
12334 static int
12335 test_null_burst_operation(void)
12336 {
12337 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12338 	struct crypto_unittest_params *ut_params = &unittest_params;
12339 	int status;
12340 
12341 	unsigned i, burst_len = NULL_BURST_LENGTH;
12342 
12343 	struct rte_crypto_op *burst[NULL_BURST_LENGTH] = { NULL };
12344 	struct rte_crypto_op *burst_dequeued[NULL_BURST_LENGTH] = { NULL };
12345 
12346 	/* This test is for NULL PMD only */
12347 	if (gbl_driver_id != rte_cryptodev_driver_id_get(
12348 			RTE_STR(CRYPTODEV_NAME_NULL_PMD)))
12349 		return TEST_SKIPPED;
12350 
12351 	/* Setup Cipher Parameters */
12352 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
12353 	ut_params->cipher_xform.next = &ut_params->auth_xform;
12354 
12355 	ut_params->cipher_xform.cipher.algo = RTE_CRYPTO_CIPHER_NULL;
12356 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
12357 
12358 	/* Setup HMAC Parameters */
12359 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12360 	ut_params->auth_xform.next = NULL;
12361 
12362 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_NULL;
12363 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
12364 
12365 	ut_params->sess = rte_cryptodev_sym_session_create(
12366 			ts_params->session_mpool);
12367 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12368 
12369 	/* Create Crypto session*/
12370 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
12371 			ut_params->sess, &ut_params->cipher_xform,
12372 			ts_params->session_priv_mpool);
12373 
12374 	if (status == -ENOTSUP)
12375 		return TEST_SKIPPED;
12376 
12377 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
12378 
12379 	TEST_ASSERT_EQUAL(rte_crypto_op_bulk_alloc(ts_params->op_mpool,
12380 			RTE_CRYPTO_OP_TYPE_SYMMETRIC, burst, burst_len),
12381 			burst_len, "failed to generate burst of crypto ops");
12382 
12383 	/* Generate an operation for each mbuf in burst */
12384 	for (i = 0; i < burst_len; i++) {
12385 		struct rte_mbuf *m = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12386 
12387 		TEST_ASSERT_NOT_NULL(m, "Failed to allocate mbuf");
12388 
12389 		unsigned *data = (unsigned *)rte_pktmbuf_append(m,
12390 				sizeof(unsigned));
12391 		*data = i;
12392 
12393 		rte_crypto_op_attach_sym_session(burst[i], ut_params->sess);
12394 
12395 		burst[i]->sym->m_src = m;
12396 	}
12397 
12398 	/* Process crypto operation */
12399 	TEST_ASSERT_EQUAL(rte_cryptodev_enqueue_burst(ts_params->valid_devs[0],
12400 			0, burst, burst_len),
12401 			burst_len,
12402 			"Error enqueuing burst");
12403 
12404 	TEST_ASSERT_EQUAL(rte_cryptodev_dequeue_burst(ts_params->valid_devs[0],
12405 			0, burst_dequeued, burst_len),
12406 			burst_len,
12407 			"Error dequeuing burst");
12408 
12409 
12410 	for (i = 0; i < burst_len; i++) {
12411 		TEST_ASSERT_EQUAL(
12412 			*rte_pktmbuf_mtod(burst[i]->sym->m_src, uint32_t *),
12413 			*rte_pktmbuf_mtod(burst_dequeued[i]->sym->m_src,
12414 					uint32_t *),
12415 			"data not as expected");
12416 
12417 		rte_pktmbuf_free(burst[i]->sym->m_src);
12418 		rte_crypto_op_free(burst[i]);
12419 	}
12420 
12421 	return TEST_SUCCESS;
12422 }
12423 
12424 static uint16_t
12425 test_enq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12426 		  uint16_t nb_ops, void *user_param)
12427 {
12428 	RTE_SET_USED(dev_id);
12429 	RTE_SET_USED(qp_id);
12430 	RTE_SET_USED(ops);
12431 	RTE_SET_USED(user_param);
12432 
12433 	printf("crypto enqueue callback called\n");
12434 	return nb_ops;
12435 }
12436 
12437 static uint16_t
12438 test_deq_callback(uint16_t dev_id, uint16_t qp_id, struct rte_crypto_op **ops,
12439 		  uint16_t nb_ops, void *user_param)
12440 {
12441 	RTE_SET_USED(dev_id);
12442 	RTE_SET_USED(qp_id);
12443 	RTE_SET_USED(ops);
12444 	RTE_SET_USED(user_param);
12445 
12446 	printf("crypto dequeue callback called\n");
12447 	return nb_ops;
12448 }
12449 
12450 /*
12451  * Thread using enqueue/dequeue callback with RCU.
12452  */
12453 static int
12454 test_enqdeq_callback_thread(void *arg)
12455 {
12456 	RTE_SET_USED(arg);
12457 	/* DP thread calls rte_cryptodev_enqueue_burst()/
12458 	 * rte_cryptodev_dequeue_burst() and invokes callback.
12459 	 */
12460 	test_null_burst_operation();
12461 	return 0;
12462 }
12463 
12464 static int
12465 test_enq_callback_setup(void)
12466 {
12467 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12468 	struct rte_cryptodev_info dev_info;
12469 	struct rte_cryptodev_qp_conf qp_conf = {
12470 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
12471 	};
12472 
12473 	struct rte_cryptodev_cb *cb;
12474 	uint16_t qp_id = 0;
12475 
12476 	/* Stop the device in case it's started so it can be configured */
12477 	rte_cryptodev_stop(ts_params->valid_devs[0]);
12478 
12479 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12480 
12481 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12482 			&ts_params->conf),
12483 			"Failed to configure cryptodev %u",
12484 			ts_params->valid_devs[0]);
12485 
12486 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12487 	qp_conf.mp_session = ts_params->session_mpool;
12488 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
12489 
12490 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12491 			ts_params->valid_devs[0], qp_id, &qp_conf,
12492 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12493 			"Failed test for "
12494 			"rte_cryptodev_queue_pair_setup: num_inflights "
12495 			"%u on qp %u on cryptodev %u",
12496 			qp_conf.nb_descriptors, qp_id,
12497 			ts_params->valid_devs[0]);
12498 
12499 	/* Test with invalid crypto device */
12500 	cb = rte_cryptodev_add_enq_callback(RTE_CRYPTO_MAX_DEVS,
12501 			qp_id, test_enq_callback, NULL);
12502 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12503 			"cryptodev %u did not fail",
12504 			qp_id, RTE_CRYPTO_MAX_DEVS);
12505 
12506 	/* Test with invalid queue pair */
12507 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12508 			dev_info.max_nb_queue_pairs + 1,
12509 			test_enq_callback, NULL);
12510 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12511 			"cryptodev %u did not fail",
12512 			dev_info.max_nb_queue_pairs + 1,
12513 			ts_params->valid_devs[0]);
12514 
12515 	/* Test with NULL callback */
12516 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12517 			qp_id, NULL, NULL);
12518 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12519 			"cryptodev %u did not fail",
12520 			qp_id, ts_params->valid_devs[0]);
12521 
12522 	/* Test with valid configuration */
12523 	cb = rte_cryptodev_add_enq_callback(ts_params->valid_devs[0],
12524 			qp_id, test_enq_callback, NULL);
12525 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12526 			"qp %u on cryptodev %u",
12527 			qp_id, ts_params->valid_devs[0]);
12528 
12529 	rte_cryptodev_start(ts_params->valid_devs[0]);
12530 
12531 	/* Launch a thread */
12532 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12533 				rte_get_next_lcore(-1, 1, 0));
12534 
12535 	/* Wait until reader exited. */
12536 	rte_eal_mp_wait_lcore();
12537 
12538 	/* Test with invalid crypto device */
12539 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12540 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12541 			"Expected call to fail as crypto device is invalid");
12542 
12543 	/* Test with invalid queue pair */
12544 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12545 			ts_params->valid_devs[0],
12546 			dev_info.max_nb_queue_pairs + 1, cb),
12547 			"Expected call to fail as queue pair is invalid");
12548 
12549 	/* Test with NULL callback */
12550 	TEST_ASSERT_FAIL(rte_cryptodev_remove_enq_callback(
12551 			ts_params->valid_devs[0], qp_id, NULL),
12552 			"Expected call to fail as callback is NULL");
12553 
12554 	/* Test with valid configuration */
12555 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_enq_callback(
12556 			ts_params->valid_devs[0], qp_id, cb),
12557 			"Failed test to remove callback on "
12558 			"qp %u on cryptodev %u",
12559 			qp_id, ts_params->valid_devs[0]);
12560 
12561 	return TEST_SUCCESS;
12562 }
12563 
12564 static int
12565 test_deq_callback_setup(void)
12566 {
12567 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12568 	struct rte_cryptodev_info dev_info;
12569 	struct rte_cryptodev_qp_conf qp_conf = {
12570 		.nb_descriptors = MAX_NUM_OPS_INFLIGHT
12571 	};
12572 
12573 	struct rte_cryptodev_cb *cb;
12574 	uint16_t qp_id = 0;
12575 
12576 	/* Stop the device in case it's started so it can be configured */
12577 	rte_cryptodev_stop(ts_params->valid_devs[0]);
12578 
12579 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12580 
12581 	TEST_ASSERT_SUCCESS(rte_cryptodev_configure(ts_params->valid_devs[0],
12582 			&ts_params->conf),
12583 			"Failed to configure cryptodev %u",
12584 			ts_params->valid_devs[0]);
12585 
12586 	qp_conf.nb_descriptors = MAX_NUM_OPS_INFLIGHT;
12587 	qp_conf.mp_session = ts_params->session_mpool;
12588 	qp_conf.mp_session_private = ts_params->session_priv_mpool;
12589 
12590 	TEST_ASSERT_SUCCESS(rte_cryptodev_queue_pair_setup(
12591 			ts_params->valid_devs[0], qp_id, &qp_conf,
12592 			rte_cryptodev_socket_id(ts_params->valid_devs[0])),
12593 			"Failed test for "
12594 			"rte_cryptodev_queue_pair_setup: num_inflights "
12595 			"%u on qp %u on cryptodev %u",
12596 			qp_conf.nb_descriptors, qp_id,
12597 			ts_params->valid_devs[0]);
12598 
12599 	/* Test with invalid crypto device */
12600 	cb = rte_cryptodev_add_deq_callback(RTE_CRYPTO_MAX_DEVS,
12601 			qp_id, test_deq_callback, NULL);
12602 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12603 			"cryptodev %u did not fail",
12604 			qp_id, RTE_CRYPTO_MAX_DEVS);
12605 
12606 	/* Test with invalid queue pair */
12607 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12608 			dev_info.max_nb_queue_pairs + 1,
12609 			test_deq_callback, NULL);
12610 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12611 			"cryptodev %u did not fail",
12612 			dev_info.max_nb_queue_pairs + 1,
12613 			ts_params->valid_devs[0]);
12614 
12615 	/* Test with NULL callback */
12616 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12617 			qp_id, NULL, NULL);
12618 	TEST_ASSERT_NULL(cb, "Add callback on qp %u on "
12619 			"cryptodev %u did not fail",
12620 			qp_id, ts_params->valid_devs[0]);
12621 
12622 	/* Test with valid configuration */
12623 	cb = rte_cryptodev_add_deq_callback(ts_params->valid_devs[0],
12624 			qp_id, test_deq_callback, NULL);
12625 	TEST_ASSERT_NOT_NULL(cb, "Failed test to add callback on "
12626 			"qp %u on cryptodev %u",
12627 			qp_id, ts_params->valid_devs[0]);
12628 
12629 	rte_cryptodev_start(ts_params->valid_devs[0]);
12630 
12631 	/* Launch a thread */
12632 	rte_eal_remote_launch(test_enqdeq_callback_thread, NULL,
12633 				rte_get_next_lcore(-1, 1, 0));
12634 
12635 	/* Wait until reader exited. */
12636 	rte_eal_mp_wait_lcore();
12637 
12638 	/* Test with invalid crypto device */
12639 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12640 			RTE_CRYPTO_MAX_DEVS, qp_id, cb),
12641 			"Expected call to fail as crypto device is invalid");
12642 
12643 	/* Test with invalid queue pair */
12644 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12645 			ts_params->valid_devs[0],
12646 			dev_info.max_nb_queue_pairs + 1, cb),
12647 			"Expected call to fail as queue pair is invalid");
12648 
12649 	/* Test with NULL callback */
12650 	TEST_ASSERT_FAIL(rte_cryptodev_remove_deq_callback(
12651 			ts_params->valid_devs[0], qp_id, NULL),
12652 			"Expected call to fail as callback is NULL");
12653 
12654 	/* Test with valid configuration */
12655 	TEST_ASSERT_SUCCESS(rte_cryptodev_remove_deq_callback(
12656 			ts_params->valid_devs[0], qp_id, cb),
12657 			"Failed test to remove callback on "
12658 			"qp %u on cryptodev %u",
12659 			qp_id, ts_params->valid_devs[0]);
12660 
12661 	return TEST_SUCCESS;
12662 }
12663 
12664 static void
12665 generate_gmac_large_plaintext(uint8_t *data)
12666 {
12667 	uint16_t i;
12668 
12669 	for (i = 32; i < GMAC_LARGE_PLAINTEXT_LENGTH; i += 32)
12670 		memcpy(&data[i], &data[0], 32);
12671 }
12672 
12673 static int
12674 create_gmac_operation(enum rte_crypto_auth_operation op,
12675 		const struct gmac_test_data *tdata)
12676 {
12677 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12678 	struct crypto_unittest_params *ut_params = &unittest_params;
12679 	struct rte_crypto_sym_op *sym_op;
12680 
12681 	uint32_t plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12682 
12683 	/* Generate Crypto op data structure */
12684 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12685 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12686 	TEST_ASSERT_NOT_NULL(ut_params->op,
12687 			"Failed to allocate symmetric crypto operation struct");
12688 
12689 	sym_op = ut_params->op->sym;
12690 
12691 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
12692 			ut_params->ibuf, tdata->gmac_tag.len);
12693 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12694 			"no room to append digest");
12695 
12696 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
12697 			ut_params->ibuf, plaintext_pad_len);
12698 
12699 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12700 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12701 				tdata->gmac_tag.len);
12702 		debug_hexdump(stdout, "digest:",
12703 				sym_op->auth.digest.data,
12704 				tdata->gmac_tag.len);
12705 	}
12706 
12707 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12708 			uint8_t *, IV_OFFSET);
12709 
12710 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12711 
12712 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12713 
12714 	sym_op->cipher.data.length = 0;
12715 	sym_op->cipher.data.offset = 0;
12716 
12717 	sym_op->auth.data.offset = 0;
12718 	sym_op->auth.data.length = tdata->plaintext.len;
12719 
12720 	return 0;
12721 }
12722 
12723 static int
12724 create_gmac_operation_sgl(enum rte_crypto_auth_operation op,
12725 		const struct gmac_test_data *tdata,
12726 		void *digest_mem, uint64_t digest_phys)
12727 {
12728 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12729 	struct crypto_unittest_params *ut_params = &unittest_params;
12730 	struct rte_crypto_sym_op *sym_op;
12731 
12732 	/* Generate Crypto op data structure */
12733 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
12734 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
12735 	TEST_ASSERT_NOT_NULL(ut_params->op,
12736 			"Failed to allocate symmetric crypto operation struct");
12737 
12738 	sym_op = ut_params->op->sym;
12739 
12740 	sym_op->auth.digest.data = digest_mem;
12741 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
12742 			"no room to append digest");
12743 
12744 	sym_op->auth.digest.phys_addr = digest_phys;
12745 
12746 	if (op == RTE_CRYPTO_AUTH_OP_VERIFY) {
12747 		rte_memcpy(sym_op->auth.digest.data, tdata->gmac_tag.data,
12748 				tdata->gmac_tag.len);
12749 		debug_hexdump(stdout, "digest:",
12750 				sym_op->auth.digest.data,
12751 				tdata->gmac_tag.len);
12752 	}
12753 
12754 	uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
12755 			uint8_t *, IV_OFFSET);
12756 
12757 	rte_memcpy(iv_ptr, tdata->iv.data, tdata->iv.len);
12758 
12759 	debug_hexdump(stdout, "iv:", iv_ptr, tdata->iv.len);
12760 
12761 	sym_op->cipher.data.length = 0;
12762 	sym_op->cipher.data.offset = 0;
12763 
12764 	sym_op->auth.data.offset = 0;
12765 	sym_op->auth.data.length = tdata->plaintext.len;
12766 
12767 	return 0;
12768 }
12769 
12770 static int create_gmac_session(uint8_t dev_id,
12771 		const struct gmac_test_data *tdata,
12772 		enum rte_crypto_auth_operation auth_op)
12773 {
12774 	uint8_t auth_key[tdata->key.len];
12775 	int status;
12776 
12777 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12778 	struct crypto_unittest_params *ut_params = &unittest_params;
12779 
12780 	memcpy(auth_key, tdata->key.data, tdata->key.len);
12781 
12782 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12783 	ut_params->auth_xform.next = NULL;
12784 
12785 	ut_params->auth_xform.auth.algo = RTE_CRYPTO_AUTH_AES_GMAC;
12786 	ut_params->auth_xform.auth.op = auth_op;
12787 	ut_params->auth_xform.auth.digest_length = tdata->gmac_tag.len;
12788 	ut_params->auth_xform.auth.key.length = tdata->key.len;
12789 	ut_params->auth_xform.auth.key.data = auth_key;
12790 	ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
12791 	ut_params->auth_xform.auth.iv.length = tdata->iv.len;
12792 
12793 
12794 	ut_params->sess = rte_cryptodev_sym_session_create(
12795 			ts_params->session_mpool);
12796 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
12797 
12798 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
12799 			&ut_params->auth_xform,
12800 			ts_params->session_priv_mpool);
12801 
12802 	return status;
12803 }
12804 
12805 static int
12806 test_AES_GMAC_authentication(const struct gmac_test_data *tdata)
12807 {
12808 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12809 	struct crypto_unittest_params *ut_params = &unittest_params;
12810 	struct rte_cryptodev_info dev_info;
12811 
12812 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12813 	uint64_t feat_flags = dev_info.feature_flags;
12814 
12815 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12816 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12817 		printf("Device doesn't support RAW data-path APIs.\n");
12818 		return TEST_SKIPPED;
12819 	}
12820 
12821 	int retval;
12822 
12823 	uint8_t *auth_tag, *plaintext;
12824 	uint16_t plaintext_pad_len;
12825 
12826 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12827 			      "No GMAC length in the source data");
12828 
12829 	/* Verify the capabilities */
12830 	struct rte_cryptodev_sym_capability_idx cap_idx;
12831 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12832 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12833 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12834 			&cap_idx) == NULL)
12835 		return TEST_SKIPPED;
12836 
12837 	retval = create_gmac_session(ts_params->valid_devs[0],
12838 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
12839 
12840 	if (retval == -ENOTSUP)
12841 		return TEST_SKIPPED;
12842 	if (retval < 0)
12843 		return retval;
12844 
12845 	if (tdata->plaintext.len > MBUF_SIZE)
12846 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12847 	else
12848 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12849 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12850 			"Failed to allocate input buffer in mempool");
12851 
12852 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12853 			rte_pktmbuf_tailroom(ut_params->ibuf));
12854 
12855 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12856 	/*
12857 	 * Runtime generate the large plain text instead of use hard code
12858 	 * plain text vector. It is done to avoid create huge source file
12859 	 * with the test vector.
12860 	 */
12861 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12862 		generate_gmac_large_plaintext(tdata->plaintext.data);
12863 
12864 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12865 				plaintext_pad_len);
12866 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12867 
12868 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
12869 	debug_hexdump(stdout, "plaintext:", plaintext,
12870 			tdata->plaintext.len);
12871 
12872 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_GENERATE,
12873 			tdata);
12874 
12875 	if (retval < 0)
12876 		return retval;
12877 
12878 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
12879 
12880 	ut_params->op->sym->m_src = ut_params->ibuf;
12881 
12882 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
12883 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
12884 			ut_params->op);
12885 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
12886 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
12887 				ut_params->op, 0, 1, 0, 0);
12888 	else
12889 		TEST_ASSERT_NOT_NULL(
12890 			process_crypto_request(ts_params->valid_devs[0],
12891 			ut_params->op), "failed to process sym crypto op");
12892 
12893 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
12894 			"crypto op processing failed");
12895 
12896 	if (ut_params->op->sym->m_dst) {
12897 		auth_tag = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
12898 				uint8_t *, plaintext_pad_len);
12899 	} else {
12900 		auth_tag = plaintext + plaintext_pad_len;
12901 	}
12902 
12903 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
12904 
12905 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
12906 			auth_tag,
12907 			tdata->gmac_tag.data,
12908 			tdata->gmac_tag.len,
12909 			"GMAC Generated auth tag not as expected");
12910 
12911 	return 0;
12912 }
12913 
12914 static int
12915 test_AES_GMAC_authentication_test_case_1(void)
12916 {
12917 	return test_AES_GMAC_authentication(&gmac_test_case_1);
12918 }
12919 
12920 static int
12921 test_AES_GMAC_authentication_test_case_2(void)
12922 {
12923 	return test_AES_GMAC_authentication(&gmac_test_case_2);
12924 }
12925 
12926 static int
12927 test_AES_GMAC_authentication_test_case_3(void)
12928 {
12929 	return test_AES_GMAC_authentication(&gmac_test_case_3);
12930 }
12931 
12932 static int
12933 test_AES_GMAC_authentication_test_case_4(void)
12934 {
12935 	return test_AES_GMAC_authentication(&gmac_test_case_4);
12936 }
12937 
12938 static int
12939 test_AES_GMAC_authentication_verify(const struct gmac_test_data *tdata)
12940 {
12941 	struct crypto_testsuite_params *ts_params = &testsuite_params;
12942 	struct crypto_unittest_params *ut_params = &unittest_params;
12943 	int retval;
12944 	uint32_t plaintext_pad_len;
12945 	uint8_t *plaintext;
12946 	struct rte_cryptodev_info dev_info;
12947 
12948 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
12949 	uint64_t feat_flags = dev_info.feature_flags;
12950 
12951 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
12952 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
12953 		printf("Device doesn't support RAW data-path APIs.\n");
12954 		return TEST_SKIPPED;
12955 	}
12956 
12957 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
12958 			      "No GMAC length in the source data");
12959 
12960 	/* Verify the capabilities */
12961 	struct rte_cryptodev_sym_capability_idx cap_idx;
12962 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
12963 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
12964 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
12965 			&cap_idx) == NULL)
12966 		return TEST_SKIPPED;
12967 
12968 	retval = create_gmac_session(ts_params->valid_devs[0],
12969 			tdata, RTE_CRYPTO_AUTH_OP_VERIFY);
12970 
12971 	if (retval == -ENOTSUP)
12972 		return TEST_SKIPPED;
12973 	if (retval < 0)
12974 		return retval;
12975 
12976 	if (tdata->plaintext.len > MBUF_SIZE)
12977 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->large_mbuf_pool);
12978 	else
12979 		ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
12980 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
12981 			"Failed to allocate input buffer in mempool");
12982 
12983 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
12984 			rte_pktmbuf_tailroom(ut_params->ibuf));
12985 
12986 	plaintext_pad_len = RTE_ALIGN_CEIL(tdata->plaintext.len, 16);
12987 
12988 	/*
12989 	 * Runtime generate the large plain text instead of use hard code
12990 	 * plain text vector. It is done to avoid create huge source file
12991 	 * with the test vector.
12992 	 */
12993 	if (tdata->plaintext.len == GMAC_LARGE_PLAINTEXT_LENGTH)
12994 		generate_gmac_large_plaintext(tdata->plaintext.data);
12995 
12996 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
12997 				plaintext_pad_len);
12998 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
12999 
13000 	memcpy(plaintext, tdata->plaintext.data, tdata->plaintext.len);
13001 	debug_hexdump(stdout, "plaintext:", plaintext,
13002 			tdata->plaintext.len);
13003 
13004 	retval = create_gmac_operation(RTE_CRYPTO_AUTH_OP_VERIFY,
13005 			tdata);
13006 
13007 	if (retval < 0)
13008 		return retval;
13009 
13010 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13011 
13012 	ut_params->op->sym->m_src = ut_params->ibuf;
13013 
13014 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13015 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13016 			ut_params->op);
13017 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13018 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13019 				ut_params->op, 0, 1, 0, 0);
13020 	else
13021 		TEST_ASSERT_NOT_NULL(
13022 			process_crypto_request(ts_params->valid_devs[0],
13023 			ut_params->op), "failed to process sym crypto op");
13024 
13025 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13026 			"crypto op processing failed");
13027 
13028 	return 0;
13029 
13030 }
13031 
13032 static int
13033 test_AES_GMAC_authentication_verify_test_case_1(void)
13034 {
13035 	return test_AES_GMAC_authentication_verify(&gmac_test_case_1);
13036 }
13037 
13038 static int
13039 test_AES_GMAC_authentication_verify_test_case_2(void)
13040 {
13041 	return test_AES_GMAC_authentication_verify(&gmac_test_case_2);
13042 }
13043 
13044 static int
13045 test_AES_GMAC_authentication_verify_test_case_3(void)
13046 {
13047 	return test_AES_GMAC_authentication_verify(&gmac_test_case_3);
13048 }
13049 
13050 static int
13051 test_AES_GMAC_authentication_verify_test_case_4(void)
13052 {
13053 	return test_AES_GMAC_authentication_verify(&gmac_test_case_4);
13054 }
13055 
13056 static int
13057 test_AES_GMAC_authentication_SGL(const struct gmac_test_data *tdata,
13058 				uint32_t fragsz)
13059 {
13060 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13061 	struct crypto_unittest_params *ut_params = &unittest_params;
13062 	struct rte_cryptodev_info dev_info;
13063 	uint64_t feature_flags;
13064 	unsigned int trn_data = 0;
13065 	void *digest_mem = NULL;
13066 	uint32_t segs = 1;
13067 	unsigned int to_trn = 0;
13068 	struct rte_mbuf *buf = NULL;
13069 	uint8_t *auth_tag, *plaintext;
13070 	int retval;
13071 
13072 	TEST_ASSERT_NOT_EQUAL(tdata->gmac_tag.len, 0,
13073 			      "No GMAC length in the source data");
13074 
13075 	/* Verify the capabilities */
13076 	struct rte_cryptodev_sym_capability_idx cap_idx;
13077 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13078 	cap_idx.algo.auth = RTE_CRYPTO_AUTH_AES_GMAC;
13079 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13080 			&cap_idx) == NULL)
13081 		return TEST_SKIPPED;
13082 
13083 	/* Check for any input SGL support */
13084 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13085 	feature_flags = dev_info.feature_flags;
13086 
13087 	if ((!(feature_flags & RTE_CRYPTODEV_FF_IN_PLACE_SGL)) ||
13088 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT)) ||
13089 			(!(feature_flags & RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT)))
13090 		return TEST_SKIPPED;
13091 
13092 	if (fragsz > tdata->plaintext.len)
13093 		fragsz = tdata->plaintext.len;
13094 
13095 	uint16_t plaintext_len = fragsz;
13096 
13097 	retval = create_gmac_session(ts_params->valid_devs[0],
13098 			tdata, RTE_CRYPTO_AUTH_OP_GENERATE);
13099 
13100 	if (retval == -ENOTSUP)
13101 		return TEST_SKIPPED;
13102 	if (retval < 0)
13103 		return retval;
13104 
13105 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13106 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13107 			"Failed to allocate input buffer in mempool");
13108 
13109 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13110 			rte_pktmbuf_tailroom(ut_params->ibuf));
13111 
13112 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13113 				plaintext_len);
13114 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13115 
13116 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
13117 
13118 	trn_data += plaintext_len;
13119 
13120 	buf = ut_params->ibuf;
13121 
13122 	/*
13123 	 * Loop until no more fragments
13124 	 */
13125 
13126 	while (trn_data < tdata->plaintext.len) {
13127 		++segs;
13128 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
13129 				(tdata->plaintext.len - trn_data) : fragsz;
13130 
13131 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13132 		buf = buf->next;
13133 
13134 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
13135 				rte_pktmbuf_tailroom(buf));
13136 
13137 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
13138 				to_trn);
13139 
13140 		memcpy(plaintext, tdata->plaintext.data + trn_data,
13141 				to_trn);
13142 		trn_data += to_trn;
13143 		if (trn_data  == tdata->plaintext.len)
13144 			digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
13145 					tdata->gmac_tag.len);
13146 	}
13147 	ut_params->ibuf->nb_segs = segs;
13148 
13149 	/*
13150 	 * Place digest at the end of the last buffer
13151 	 */
13152 	uint64_t digest_phys = rte_pktmbuf_iova(buf) + to_trn;
13153 
13154 	if (!digest_mem) {
13155 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13156 				+ tdata->gmac_tag.len);
13157 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
13158 				tdata->plaintext.len);
13159 	}
13160 
13161 	retval = create_gmac_operation_sgl(RTE_CRYPTO_AUTH_OP_GENERATE,
13162 			tdata, digest_mem, digest_phys);
13163 
13164 	if (retval < 0)
13165 		return retval;
13166 
13167 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13168 
13169 	ut_params->op->sym->m_src = ut_params->ibuf;
13170 
13171 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
13172 		return TEST_SKIPPED;
13173 
13174 	TEST_ASSERT_NOT_NULL(
13175 		process_crypto_request(ts_params->valid_devs[0],
13176 		ut_params->op), "failed to process sym crypto op");
13177 
13178 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
13179 			"crypto op processing failed");
13180 
13181 	auth_tag = digest_mem;
13182 	debug_hexdump(stdout, "auth tag:", auth_tag, tdata->gmac_tag.len);
13183 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
13184 			auth_tag,
13185 			tdata->gmac_tag.data,
13186 			tdata->gmac_tag.len,
13187 			"GMAC Generated auth tag not as expected");
13188 
13189 	return 0;
13190 }
13191 
13192 /* Segment size not multiple of block size (16B) */
13193 static int
13194 test_AES_GMAC_authentication_SGL_40B(void)
13195 {
13196 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 40);
13197 }
13198 
13199 static int
13200 test_AES_GMAC_authentication_SGL_80B(void)
13201 {
13202 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_1, 80);
13203 }
13204 
13205 static int
13206 test_AES_GMAC_authentication_SGL_2048B(void)
13207 {
13208 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2048);
13209 }
13210 
13211 /* Segment size not multiple of block size (16B) */
13212 static int
13213 test_AES_GMAC_authentication_SGL_2047B(void)
13214 {
13215 	return test_AES_GMAC_authentication_SGL(&gmac_test_case_5, 2047);
13216 }
13217 
13218 struct test_crypto_vector {
13219 	enum rte_crypto_cipher_algorithm crypto_algo;
13220 	unsigned int cipher_offset;
13221 	unsigned int cipher_len;
13222 
13223 	struct {
13224 		uint8_t data[64];
13225 		unsigned int len;
13226 	} cipher_key;
13227 
13228 	struct {
13229 		uint8_t data[64];
13230 		unsigned int len;
13231 	} iv;
13232 
13233 	struct {
13234 		const uint8_t *data;
13235 		unsigned int len;
13236 	} plaintext;
13237 
13238 	struct {
13239 		const uint8_t *data;
13240 		unsigned int len;
13241 	} ciphertext;
13242 
13243 	enum rte_crypto_auth_algorithm auth_algo;
13244 	unsigned int auth_offset;
13245 
13246 	struct {
13247 		uint8_t data[128];
13248 		unsigned int len;
13249 	} auth_key;
13250 
13251 	struct {
13252 		const uint8_t *data;
13253 		unsigned int len;
13254 	} aad;
13255 
13256 	struct {
13257 		uint8_t data[128];
13258 		unsigned int len;
13259 	} digest;
13260 };
13261 
13262 static const struct test_crypto_vector
13263 hmac_sha1_test_crypto_vector = {
13264 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13265 	.plaintext = {
13266 		.data = plaintext_hash,
13267 		.len = 512
13268 	},
13269 	.auth_key = {
13270 		.data = {
13271 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13272 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13273 			0xDE, 0xF4, 0xDE, 0xAD
13274 		},
13275 		.len = 20
13276 	},
13277 	.digest = {
13278 		.data = {
13279 			0xC4, 0xB7, 0x0E, 0x6B, 0xDE, 0xD1, 0xE7, 0x77,
13280 			0x7E, 0x2E, 0x8F, 0xFC, 0x48, 0x39, 0x46, 0x17,
13281 			0x3F, 0x91, 0x64, 0x59
13282 		},
13283 		.len = 20
13284 	}
13285 };
13286 
13287 static const struct test_crypto_vector
13288 aes128_gmac_test_vector = {
13289 	.auth_algo = RTE_CRYPTO_AUTH_AES_GMAC,
13290 	.plaintext = {
13291 		.data = plaintext_hash,
13292 		.len = 512
13293 	},
13294 	.iv = {
13295 		.data = {
13296 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13297 			0x08, 0x09, 0x0A, 0x0B
13298 		},
13299 		.len = 12
13300 	},
13301 	.auth_key = {
13302 		.data = {
13303 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13304 			0xF1, 0x35, 0x5C, 0x3B, 0xDD, 0x9A, 0x65, 0xBA
13305 		},
13306 		.len = 16
13307 	},
13308 	.digest = {
13309 		.data = {
13310 			0xCA, 0x00, 0x99, 0x8B, 0x30, 0x7E, 0x74, 0x56,
13311 			0x32, 0xA7, 0x87, 0xB5, 0xE9, 0xB2, 0x34, 0x5A
13312 		},
13313 		.len = 16
13314 	}
13315 };
13316 
13317 static const struct test_crypto_vector
13318 aes128cbc_hmac_sha1_test_vector = {
13319 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13320 	.cipher_offset = 0,
13321 	.cipher_len = 512,
13322 	.cipher_key = {
13323 		.data = {
13324 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13325 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13326 		},
13327 		.len = 16
13328 	},
13329 	.iv = {
13330 		.data = {
13331 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13332 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13333 		},
13334 		.len = 16
13335 	},
13336 	.plaintext = {
13337 		.data = plaintext_hash,
13338 		.len = 512
13339 	},
13340 	.ciphertext = {
13341 		.data = ciphertext512_aes128cbc,
13342 		.len = 512
13343 	},
13344 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13345 	.auth_offset = 0,
13346 	.auth_key = {
13347 		.data = {
13348 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13349 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13350 			0xDE, 0xF4, 0xDE, 0xAD
13351 		},
13352 		.len = 20
13353 	},
13354 	.digest = {
13355 		.data = {
13356 			0x9A, 0x4F, 0x88, 0x1B, 0xB6, 0x8F, 0xD8, 0x60,
13357 			0x42, 0x1A, 0x7D, 0x3D, 0xF5, 0x82, 0x80, 0xF1,
13358 			0x18, 0x8C, 0x1D, 0x32
13359 		},
13360 		.len = 20
13361 	}
13362 };
13363 
13364 static const struct test_crypto_vector
13365 aes128cbc_hmac_sha1_aad_test_vector = {
13366 	.crypto_algo = RTE_CRYPTO_CIPHER_AES_CBC,
13367 	.cipher_offset = 8,
13368 	.cipher_len = 496,
13369 	.cipher_key = {
13370 		.data = {
13371 			0xE4, 0x23, 0x33, 0x8A, 0x35, 0x64, 0x61, 0xE2,
13372 			0x49, 0x03, 0xDD, 0xC6, 0xB8, 0xCA, 0x55, 0x7A
13373 		},
13374 		.len = 16
13375 	},
13376 	.iv = {
13377 		.data = {
13378 			0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
13379 			0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
13380 		},
13381 		.len = 16
13382 	},
13383 	.plaintext = {
13384 		.data = plaintext_hash,
13385 		.len = 512
13386 	},
13387 	.ciphertext = {
13388 		.data = ciphertext512_aes128cbc_aad,
13389 		.len = 512
13390 	},
13391 	.auth_algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
13392 	.auth_offset = 0,
13393 	.auth_key = {
13394 		.data = {
13395 			0xF8, 0x2A, 0xC7, 0x54, 0xDB, 0x96, 0x18, 0xAA,
13396 			0xC3, 0xA1, 0x53, 0xF6, 0x1F, 0x17, 0x60, 0xBD,
13397 			0xDE, 0xF4, 0xDE, 0xAD
13398 		},
13399 		.len = 20
13400 	},
13401 	.digest = {
13402 		.data = {
13403 			0x6D, 0xF3, 0x50, 0x79, 0x7A, 0x2A, 0xAC, 0x7F,
13404 			0xA6, 0xF0, 0xC6, 0x38, 0x1F, 0xA4, 0xDD, 0x9B,
13405 			0x62, 0x0F, 0xFB, 0x10
13406 		},
13407 		.len = 20
13408 	}
13409 };
13410 
13411 static void
13412 data_corruption(uint8_t *data)
13413 {
13414 	data[0] += 1;
13415 }
13416 
13417 static void
13418 tag_corruption(uint8_t *data, unsigned int tag_offset)
13419 {
13420 	data[tag_offset] += 1;
13421 }
13422 
13423 static int
13424 create_auth_session(struct crypto_unittest_params *ut_params,
13425 		uint8_t dev_id,
13426 		const struct test_crypto_vector *reference,
13427 		enum rte_crypto_auth_operation auth_op)
13428 {
13429 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13430 	uint8_t auth_key[reference->auth_key.len + 1];
13431 	int status;
13432 
13433 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13434 
13435 	/* Setup Authentication Parameters */
13436 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13437 	ut_params->auth_xform.auth.op = auth_op;
13438 	ut_params->auth_xform.next = NULL;
13439 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13440 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13441 	ut_params->auth_xform.auth.key.data = auth_key;
13442 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13443 
13444 	/* Create Crypto session*/
13445 	ut_params->sess = rte_cryptodev_sym_session_create(
13446 			ts_params->session_mpool);
13447 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13448 
13449 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13450 				&ut_params->auth_xform,
13451 				ts_params->session_priv_mpool);
13452 
13453 	return status;
13454 }
13455 
13456 static int
13457 create_auth_cipher_session(struct crypto_unittest_params *ut_params,
13458 		uint8_t dev_id,
13459 		const struct test_crypto_vector *reference,
13460 		enum rte_crypto_auth_operation auth_op,
13461 		enum rte_crypto_cipher_operation cipher_op)
13462 {
13463 	struct crypto_testsuite_params *ts_params = &testsuite_params;
13464 	uint8_t cipher_key[reference->cipher_key.len + 1];
13465 	uint8_t auth_key[reference->auth_key.len + 1];
13466 	int status;
13467 
13468 	memcpy(cipher_key, reference->cipher_key.data,
13469 			reference->cipher_key.len);
13470 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13471 
13472 	/* Setup Authentication Parameters */
13473 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13474 	ut_params->auth_xform.auth.op = auth_op;
13475 	ut_params->auth_xform.auth.algo = reference->auth_algo;
13476 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
13477 	ut_params->auth_xform.auth.key.data = auth_key;
13478 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
13479 
13480 	if (reference->auth_algo == RTE_CRYPTO_AUTH_AES_GMAC) {
13481 		ut_params->auth_xform.auth.iv.offset = IV_OFFSET;
13482 		ut_params->auth_xform.auth.iv.length = reference->iv.len;
13483 	} else {
13484 		ut_params->auth_xform.next = &ut_params->cipher_xform;
13485 
13486 		/* Setup Cipher Parameters */
13487 		ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13488 		ut_params->cipher_xform.next = NULL;
13489 		ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13490 		ut_params->cipher_xform.cipher.op = cipher_op;
13491 		ut_params->cipher_xform.cipher.key.data = cipher_key;
13492 		ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13493 		ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
13494 		ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
13495 	}
13496 
13497 	/* Create Crypto session*/
13498 	ut_params->sess = rte_cryptodev_sym_session_create(
13499 			ts_params->session_mpool);
13500 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
13501 
13502 	status = rte_cryptodev_sym_session_init(dev_id, ut_params->sess,
13503 				&ut_params->auth_xform,
13504 				ts_params->session_priv_mpool);
13505 
13506 	return status;
13507 }
13508 
13509 static int
13510 create_auth_operation(struct crypto_testsuite_params *ts_params,
13511 		struct crypto_unittest_params *ut_params,
13512 		const struct test_crypto_vector *reference,
13513 		unsigned int auth_generate)
13514 {
13515 	/* Generate Crypto op data structure */
13516 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13517 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13518 	TEST_ASSERT_NOT_NULL(ut_params->op,
13519 			"Failed to allocate pktmbuf offload");
13520 
13521 	/* Set crypto operation data parameters */
13522 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13523 
13524 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13525 
13526 	/* set crypto operation source mbuf */
13527 	sym_op->m_src = ut_params->ibuf;
13528 
13529 	/* digest */
13530 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13531 			ut_params->ibuf, reference->digest.len);
13532 
13533 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13534 			"no room to append auth tag");
13535 
13536 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13537 			ut_params->ibuf, reference->plaintext.len);
13538 
13539 	if (auth_generate)
13540 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13541 	else
13542 		memcpy(sym_op->auth.digest.data,
13543 				reference->digest.data,
13544 				reference->digest.len);
13545 
13546 	debug_hexdump(stdout, "digest:",
13547 			sym_op->auth.digest.data,
13548 			reference->digest.len);
13549 
13550 	sym_op->auth.data.length = reference->plaintext.len;
13551 	sym_op->auth.data.offset = 0;
13552 
13553 	return 0;
13554 }
13555 
13556 static int
13557 create_auth_GMAC_operation(struct crypto_testsuite_params *ts_params,
13558 		struct crypto_unittest_params *ut_params,
13559 		const struct test_crypto_vector *reference,
13560 		unsigned int auth_generate)
13561 {
13562 	/* Generate Crypto op data structure */
13563 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13564 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13565 	TEST_ASSERT_NOT_NULL(ut_params->op,
13566 			"Failed to allocate pktmbuf offload");
13567 
13568 	/* Set crypto operation data parameters */
13569 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13570 
13571 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13572 
13573 	/* set crypto operation source mbuf */
13574 	sym_op->m_src = ut_params->ibuf;
13575 
13576 	/* digest */
13577 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13578 			ut_params->ibuf, reference->digest.len);
13579 
13580 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13581 			"no room to append auth tag");
13582 
13583 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13584 			ut_params->ibuf, reference->ciphertext.len);
13585 
13586 	if (auth_generate)
13587 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13588 	else
13589 		memcpy(sym_op->auth.digest.data,
13590 				reference->digest.data,
13591 				reference->digest.len);
13592 
13593 	debug_hexdump(stdout, "digest:",
13594 			sym_op->auth.digest.data,
13595 			reference->digest.len);
13596 
13597 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13598 			reference->iv.data, reference->iv.len);
13599 
13600 	sym_op->cipher.data.length = 0;
13601 	sym_op->cipher.data.offset = 0;
13602 
13603 	sym_op->auth.data.length = reference->plaintext.len;
13604 	sym_op->auth.data.offset = 0;
13605 
13606 	return 0;
13607 }
13608 
13609 static int
13610 create_cipher_auth_operation(struct crypto_testsuite_params *ts_params,
13611 		struct crypto_unittest_params *ut_params,
13612 		const struct test_crypto_vector *reference,
13613 		unsigned int auth_generate)
13614 {
13615 	/* Generate Crypto op data structure */
13616 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
13617 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
13618 	TEST_ASSERT_NOT_NULL(ut_params->op,
13619 			"Failed to allocate pktmbuf offload");
13620 
13621 	/* Set crypto operation data parameters */
13622 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
13623 
13624 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
13625 
13626 	/* set crypto operation source mbuf */
13627 	sym_op->m_src = ut_params->ibuf;
13628 
13629 	/* digest */
13630 	sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
13631 			ut_params->ibuf, reference->digest.len);
13632 
13633 	TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
13634 			"no room to append auth tag");
13635 
13636 	sym_op->auth.digest.phys_addr = rte_pktmbuf_iova_offset(
13637 			ut_params->ibuf, reference->ciphertext.len);
13638 
13639 	if (auth_generate)
13640 		memset(sym_op->auth.digest.data, 0, reference->digest.len);
13641 	else
13642 		memcpy(sym_op->auth.digest.data,
13643 				reference->digest.data,
13644 				reference->digest.len);
13645 
13646 	debug_hexdump(stdout, "digest:",
13647 			sym_op->auth.digest.data,
13648 			reference->digest.len);
13649 
13650 	rte_memcpy(rte_crypto_op_ctod_offset(ut_params->op, uint8_t *, IV_OFFSET),
13651 			reference->iv.data, reference->iv.len);
13652 
13653 	sym_op->cipher.data.length = reference->cipher_len;
13654 	sym_op->cipher.data.offset = reference->cipher_offset;
13655 
13656 	sym_op->auth.data.length = reference->plaintext.len;
13657 	sym_op->auth.data.offset = reference->auth_offset;
13658 
13659 	return 0;
13660 }
13661 
13662 static int
13663 create_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13664 		struct crypto_unittest_params *ut_params,
13665 		const struct test_crypto_vector *reference)
13666 {
13667 	return create_auth_operation(ts_params, ut_params, reference, 0);
13668 }
13669 
13670 static int
13671 create_auth_verify_GMAC_operation(
13672 		struct crypto_testsuite_params *ts_params,
13673 		struct crypto_unittest_params *ut_params,
13674 		const struct test_crypto_vector *reference)
13675 {
13676 	return create_auth_GMAC_operation(ts_params, ut_params, reference, 0);
13677 }
13678 
13679 static int
13680 create_cipher_auth_verify_operation(struct crypto_testsuite_params *ts_params,
13681 		struct crypto_unittest_params *ut_params,
13682 		const struct test_crypto_vector *reference)
13683 {
13684 	return create_cipher_auth_operation(ts_params, ut_params, reference, 0);
13685 }
13686 
13687 static int
13688 test_authentication_verify_fail_when_data_corruption(
13689 		struct crypto_testsuite_params *ts_params,
13690 		struct crypto_unittest_params *ut_params,
13691 		const struct test_crypto_vector *reference,
13692 		unsigned int data_corrupted)
13693 {
13694 	int retval;
13695 
13696 	uint8_t *plaintext;
13697 	struct rte_cryptodev_info dev_info;
13698 
13699 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13700 	uint64_t feat_flags = dev_info.feature_flags;
13701 
13702 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13703 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13704 		printf("Device doesn't support RAW data-path APIs.\n");
13705 		return TEST_SKIPPED;
13706 	}
13707 
13708 	/* Verify the capabilities */
13709 	struct rte_cryptodev_sym_capability_idx cap_idx;
13710 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13711 	cap_idx.algo.auth = reference->auth_algo;
13712 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13713 			&cap_idx) == NULL)
13714 		return TEST_SKIPPED;
13715 
13716 
13717 	/* Create session */
13718 	retval = create_auth_session(ut_params,
13719 			ts_params->valid_devs[0],
13720 			reference,
13721 			RTE_CRYPTO_AUTH_OP_VERIFY);
13722 
13723 	if (retval == -ENOTSUP)
13724 		return TEST_SKIPPED;
13725 	if (retval < 0)
13726 		return retval;
13727 
13728 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13729 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13730 			"Failed to allocate input buffer in mempool");
13731 
13732 	/* clear mbuf payload */
13733 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13734 			rte_pktmbuf_tailroom(ut_params->ibuf));
13735 
13736 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13737 			reference->plaintext.len);
13738 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13739 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13740 
13741 	debug_hexdump(stdout, "plaintext:", plaintext,
13742 		reference->plaintext.len);
13743 
13744 	/* Create operation */
13745 	retval = create_auth_verify_operation(ts_params, ut_params, reference);
13746 
13747 	if (retval < 0)
13748 		return retval;
13749 
13750 	if (data_corrupted)
13751 		data_corruption(plaintext);
13752 	else
13753 		tag_corruption(plaintext, reference->plaintext.len);
13754 
13755 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13756 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13757 			ut_params->op);
13758 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13759 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13760 			"authentication not failed");
13761 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13762 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13763 				ut_params->op, 0, 1, 0, 0);
13764 	else {
13765 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13766 			ut_params->op);
13767 	}
13768 	if (ut_params->op == NULL)
13769 		return 0;
13770 	else if (ut_params->op->status != RTE_CRYPTO_OP_STATUS_SUCCESS)
13771 		return 0;
13772 
13773 	return -1;
13774 }
13775 
13776 static int
13777 test_authentication_verify_GMAC_fail_when_corruption(
13778 		struct crypto_testsuite_params *ts_params,
13779 		struct crypto_unittest_params *ut_params,
13780 		const struct test_crypto_vector *reference,
13781 		unsigned int data_corrupted)
13782 {
13783 	int retval;
13784 	uint8_t *plaintext;
13785 	struct rte_cryptodev_info dev_info;
13786 
13787 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13788 	uint64_t feat_flags = dev_info.feature_flags;
13789 
13790 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13791 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13792 		printf("Device doesn't support RAW data-path APIs.\n");
13793 		return TEST_SKIPPED;
13794 	}
13795 
13796 	/* Verify the capabilities */
13797 	struct rte_cryptodev_sym_capability_idx cap_idx;
13798 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13799 	cap_idx.algo.auth = reference->auth_algo;
13800 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13801 			&cap_idx) == NULL)
13802 		return TEST_SKIPPED;
13803 
13804 	/* Create session */
13805 	retval = create_auth_cipher_session(ut_params,
13806 			ts_params->valid_devs[0],
13807 			reference,
13808 			RTE_CRYPTO_AUTH_OP_VERIFY,
13809 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13810 	if (retval < 0)
13811 		return retval;
13812 
13813 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13814 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13815 			"Failed to allocate input buffer in mempool");
13816 
13817 	/* clear mbuf payload */
13818 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13819 			rte_pktmbuf_tailroom(ut_params->ibuf));
13820 
13821 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13822 			reference->plaintext.len);
13823 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
13824 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
13825 
13826 	debug_hexdump(stdout, "plaintext:", plaintext,
13827 		reference->plaintext.len);
13828 
13829 	/* Create operation */
13830 	retval = create_auth_verify_GMAC_operation(ts_params,
13831 			ut_params,
13832 			reference);
13833 
13834 	if (retval < 0)
13835 		return retval;
13836 
13837 	if (data_corrupted)
13838 		data_corruption(plaintext);
13839 	else
13840 		tag_corruption(plaintext, reference->aad.len);
13841 
13842 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13843 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13844 			ut_params->op);
13845 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13846 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13847 			"authentication not failed");
13848 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13849 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13850 				ut_params->op, 0, 1, 0, 0);
13851 	else {
13852 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13853 			ut_params->op);
13854 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13855 	}
13856 
13857 	return 0;
13858 }
13859 
13860 static int
13861 test_authenticated_decryption_fail_when_corruption(
13862 		struct crypto_testsuite_params *ts_params,
13863 		struct crypto_unittest_params *ut_params,
13864 		const struct test_crypto_vector *reference,
13865 		unsigned int data_corrupted)
13866 {
13867 	int retval;
13868 
13869 	uint8_t *ciphertext;
13870 	struct rte_cryptodev_info dev_info;
13871 
13872 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13873 	uint64_t feat_flags = dev_info.feature_flags;
13874 
13875 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13876 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13877 		printf("Device doesn't support RAW data-path APIs.\n");
13878 		return TEST_SKIPPED;
13879 	}
13880 
13881 	/* Verify the capabilities */
13882 	struct rte_cryptodev_sym_capability_idx cap_idx;
13883 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13884 	cap_idx.algo.auth = reference->auth_algo;
13885 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13886 			&cap_idx) == NULL)
13887 		return TEST_SKIPPED;
13888 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13889 	cap_idx.algo.cipher = reference->crypto_algo;
13890 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13891 			&cap_idx) == NULL)
13892 		return TEST_SKIPPED;
13893 
13894 	/* Create session */
13895 	retval = create_auth_cipher_session(ut_params,
13896 			ts_params->valid_devs[0],
13897 			reference,
13898 			RTE_CRYPTO_AUTH_OP_VERIFY,
13899 			RTE_CRYPTO_CIPHER_OP_DECRYPT);
13900 
13901 	if (retval == -ENOTSUP)
13902 		return TEST_SKIPPED;
13903 	if (retval < 0)
13904 		return retval;
13905 
13906 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
13907 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
13908 			"Failed to allocate input buffer in mempool");
13909 
13910 	/* clear mbuf payload */
13911 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
13912 			rte_pktmbuf_tailroom(ut_params->ibuf));
13913 
13914 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
13915 			reference->ciphertext.len);
13916 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
13917 	memcpy(ciphertext, reference->ciphertext.data,
13918 			reference->ciphertext.len);
13919 
13920 	/* Create operation */
13921 	retval = create_cipher_auth_verify_operation(ts_params,
13922 			ut_params,
13923 			reference);
13924 
13925 	if (retval < 0)
13926 		return retval;
13927 
13928 	if (data_corrupted)
13929 		data_corruption(ciphertext);
13930 	else
13931 		tag_corruption(ciphertext, reference->ciphertext.len);
13932 
13933 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO) {
13934 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
13935 			ut_params->op);
13936 		TEST_ASSERT_NOT_EQUAL(ut_params->op->status,
13937 			RTE_CRYPTO_OP_STATUS_SUCCESS,
13938 			"authentication not failed");
13939 	} else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
13940 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
13941 				ut_params->op, 1, 1, 0, 0);
13942 	else {
13943 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
13944 			ut_params->op);
13945 		TEST_ASSERT_NULL(ut_params->op, "authentication not failed");
13946 	}
13947 
13948 	return 0;
13949 }
13950 
13951 static int
13952 test_authenticated_encrypt_with_esn(
13953 		struct crypto_testsuite_params *ts_params,
13954 		struct crypto_unittest_params *ut_params,
13955 		const struct test_crypto_vector *reference)
13956 {
13957 	int retval;
13958 
13959 	uint8_t *authciphertext, *plaintext, *auth_tag;
13960 	uint16_t plaintext_pad_len;
13961 	uint8_t cipher_key[reference->cipher_key.len + 1];
13962 	uint8_t auth_key[reference->auth_key.len + 1];
13963 	struct rte_cryptodev_info dev_info;
13964 	int status;
13965 
13966 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
13967 	uint64_t feat_flags = dev_info.feature_flags;
13968 
13969 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
13970 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
13971 		printf("Device doesn't support RAW data-path APIs.\n");
13972 		return TEST_SKIPPED;
13973 	}
13974 
13975 	/* Verify the capabilities */
13976 	struct rte_cryptodev_sym_capability_idx cap_idx;
13977 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
13978 	cap_idx.algo.auth = reference->auth_algo;
13979 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13980 			&cap_idx) == NULL)
13981 		return TEST_SKIPPED;
13982 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13983 	cap_idx.algo.cipher = reference->crypto_algo;
13984 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
13985 			&cap_idx) == NULL)
13986 		return TEST_SKIPPED;
13987 
13988 	/* Create session */
13989 	memcpy(cipher_key, reference->cipher_key.data,
13990 			reference->cipher_key.len);
13991 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
13992 
13993 	/* Setup Cipher Parameters */
13994 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
13995 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
13996 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_ENCRYPT;
13997 	ut_params->cipher_xform.cipher.key.data = cipher_key;
13998 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
13999 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
14000 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
14001 
14002 	ut_params->cipher_xform.next = &ut_params->auth_xform;
14003 
14004 	/* Setup Authentication Parameters */
14005 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14006 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
14007 	ut_params->auth_xform.auth.algo = reference->auth_algo;
14008 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14009 	ut_params->auth_xform.auth.key.data = auth_key;
14010 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
14011 	ut_params->auth_xform.next = NULL;
14012 
14013 	/* Create Crypto session*/
14014 	ut_params->sess = rte_cryptodev_sym_session_create(
14015 			ts_params->session_mpool);
14016 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14017 
14018 	status = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14019 				ut_params->sess,
14020 				&ut_params->cipher_xform,
14021 				ts_params->session_priv_mpool);
14022 
14023 	if (status == -ENOTSUP)
14024 		return TEST_SKIPPED;
14025 
14026 	TEST_ASSERT_EQUAL(status, 0, "Session init failed");
14027 
14028 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14029 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14030 			"Failed to allocate input buffer in mempool");
14031 
14032 	/* clear mbuf payload */
14033 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14034 			rte_pktmbuf_tailroom(ut_params->ibuf));
14035 
14036 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14037 			reference->plaintext.len);
14038 	TEST_ASSERT_NOT_NULL(plaintext, "no room to append plaintext");
14039 	memcpy(plaintext, reference->plaintext.data, reference->plaintext.len);
14040 
14041 	/* Create operation */
14042 	retval = create_cipher_auth_operation(ts_params,
14043 			ut_params,
14044 			reference, 0);
14045 
14046 	if (retval < 0)
14047 		return retval;
14048 
14049 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14050 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14051 			ut_params->op);
14052 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14053 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14054 				ut_params->op, 1, 1, 0, 0);
14055 	else
14056 		ut_params->op = process_crypto_request(
14057 			ts_params->valid_devs[0], ut_params->op);
14058 
14059 	TEST_ASSERT_NOT_NULL(ut_params->op, "no crypto operation returned");
14060 
14061 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14062 			"crypto op processing failed");
14063 
14064 	plaintext_pad_len = RTE_ALIGN_CEIL(reference->plaintext.len, 16);
14065 
14066 	authciphertext = rte_pktmbuf_mtod_offset(ut_params->ibuf, uint8_t *,
14067 			ut_params->op->sym->auth.data.offset);
14068 	auth_tag = authciphertext + plaintext_pad_len;
14069 	debug_hexdump(stdout, "ciphertext:", authciphertext,
14070 			reference->ciphertext.len);
14071 	debug_hexdump(stdout, "auth tag:", auth_tag, reference->digest.len);
14072 
14073 	/* Validate obuf */
14074 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14075 			authciphertext,
14076 			reference->ciphertext.data,
14077 			reference->ciphertext.len,
14078 			"Ciphertext data not as expected");
14079 
14080 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14081 			auth_tag,
14082 			reference->digest.data,
14083 			reference->digest.len,
14084 			"Generated digest not as expected");
14085 
14086 	return TEST_SUCCESS;
14087 
14088 }
14089 
14090 static int
14091 test_authenticated_decrypt_with_esn(
14092 		struct crypto_testsuite_params *ts_params,
14093 		struct crypto_unittest_params *ut_params,
14094 		const struct test_crypto_vector *reference)
14095 {
14096 	int retval;
14097 
14098 	uint8_t *ciphertext;
14099 	uint8_t cipher_key[reference->cipher_key.len + 1];
14100 	uint8_t auth_key[reference->auth_key.len + 1];
14101 	struct rte_cryptodev_info dev_info;
14102 
14103 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14104 	uint64_t feat_flags = dev_info.feature_flags;
14105 
14106 	if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14107 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14108 		printf("Device doesn't support RAW data-path APIs.\n");
14109 		return TEST_SKIPPED;
14110 	}
14111 
14112 	/* Verify the capabilities */
14113 	struct rte_cryptodev_sym_capability_idx cap_idx;
14114 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14115 	cap_idx.algo.auth = reference->auth_algo;
14116 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14117 			&cap_idx) == NULL)
14118 		return TEST_SKIPPED;
14119 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14120 	cap_idx.algo.cipher = reference->crypto_algo;
14121 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14122 			&cap_idx) == NULL)
14123 		return TEST_SKIPPED;
14124 
14125 	/* Create session */
14126 	memcpy(cipher_key, reference->cipher_key.data,
14127 			reference->cipher_key.len);
14128 	memcpy(auth_key, reference->auth_key.data, reference->auth_key.len);
14129 
14130 	/* Setup Authentication Parameters */
14131 	ut_params->auth_xform.type = RTE_CRYPTO_SYM_XFORM_AUTH;
14132 	ut_params->auth_xform.auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
14133 	ut_params->auth_xform.auth.algo = reference->auth_algo;
14134 	ut_params->auth_xform.auth.key.length = reference->auth_key.len;
14135 	ut_params->auth_xform.auth.key.data = auth_key;
14136 	ut_params->auth_xform.auth.digest_length = reference->digest.len;
14137 	ut_params->auth_xform.next = &ut_params->cipher_xform;
14138 
14139 	/* Setup Cipher Parameters */
14140 	ut_params->cipher_xform.type = RTE_CRYPTO_SYM_XFORM_CIPHER;
14141 	ut_params->cipher_xform.next = NULL;
14142 	ut_params->cipher_xform.cipher.algo = reference->crypto_algo;
14143 	ut_params->cipher_xform.cipher.op = RTE_CRYPTO_CIPHER_OP_DECRYPT;
14144 	ut_params->cipher_xform.cipher.key.data = cipher_key;
14145 	ut_params->cipher_xform.cipher.key.length = reference->cipher_key.len;
14146 	ut_params->cipher_xform.cipher.iv.offset = IV_OFFSET;
14147 	ut_params->cipher_xform.cipher.iv.length = reference->iv.len;
14148 
14149 	/* Create Crypto session*/
14150 	ut_params->sess = rte_cryptodev_sym_session_create(
14151 			ts_params->session_mpool);
14152 	TEST_ASSERT_NOT_NULL(ut_params->sess, "Session creation failed");
14153 
14154 	retval = rte_cryptodev_sym_session_init(ts_params->valid_devs[0],
14155 				ut_params->sess,
14156 				&ut_params->auth_xform,
14157 				ts_params->session_priv_mpool);
14158 
14159 	if (retval == -ENOTSUP)
14160 		return TEST_SKIPPED;
14161 
14162 	TEST_ASSERT_EQUAL(retval, 0, "Session init failed");
14163 
14164 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14165 	TEST_ASSERT_NOT_NULL(ut_params->ibuf,
14166 			"Failed to allocate input buffer in mempool");
14167 
14168 	/* clear mbuf payload */
14169 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14170 			rte_pktmbuf_tailroom(ut_params->ibuf));
14171 
14172 	ciphertext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14173 			reference->ciphertext.len);
14174 	TEST_ASSERT_NOT_NULL(ciphertext, "no room to append ciphertext");
14175 	memcpy(ciphertext, reference->ciphertext.data,
14176 			reference->ciphertext.len);
14177 
14178 	/* Create operation */
14179 	retval = create_cipher_auth_verify_operation(ts_params,
14180 			ut_params,
14181 			reference);
14182 
14183 	if (retval < 0)
14184 		return retval;
14185 
14186 	if (gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14187 		process_cpu_crypt_auth_op(ts_params->valid_devs[0],
14188 			ut_params->op);
14189 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14190 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14191 				ut_params->op, 1, 1, 0, 0);
14192 	else
14193 		ut_params->op = process_crypto_request(ts_params->valid_devs[0],
14194 			ut_params->op);
14195 
14196 	TEST_ASSERT_NOT_NULL(ut_params->op, "failed crypto process");
14197 	TEST_ASSERT_EQUAL(ut_params->op->status,
14198 			RTE_CRYPTO_OP_STATUS_SUCCESS,
14199 			"crypto op processing passed");
14200 
14201 	ut_params->obuf = ut_params->op->sym->m_src;
14202 	TEST_ASSERT_NOT_NULL(ut_params->obuf, "failed to retrieve obuf");
14203 
14204 	return 0;
14205 }
14206 
14207 static int
14208 create_aead_operation_SGL(enum rte_crypto_aead_operation op,
14209 		const struct aead_test_data *tdata,
14210 		void *digest_mem, uint64_t digest_phys)
14211 {
14212 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14213 	struct crypto_unittest_params *ut_params = &unittest_params;
14214 
14215 	const unsigned int auth_tag_len = tdata->auth_tag.len;
14216 	const unsigned int iv_len = tdata->iv.len;
14217 	unsigned int aad_len = tdata->aad.len;
14218 	unsigned int aad_len_pad = 0;
14219 
14220 	/* Generate Crypto op data structure */
14221 	ut_params->op = rte_crypto_op_alloc(ts_params->op_mpool,
14222 			RTE_CRYPTO_OP_TYPE_SYMMETRIC);
14223 	TEST_ASSERT_NOT_NULL(ut_params->op,
14224 		"Failed to allocate symmetric crypto operation struct");
14225 
14226 	struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
14227 
14228 	sym_op->aead.digest.data = digest_mem;
14229 
14230 	TEST_ASSERT_NOT_NULL(sym_op->aead.digest.data,
14231 			"no room to append digest");
14232 
14233 	sym_op->aead.digest.phys_addr = digest_phys;
14234 
14235 	if (op == RTE_CRYPTO_AEAD_OP_DECRYPT) {
14236 		rte_memcpy(sym_op->aead.digest.data, tdata->auth_tag.data,
14237 				auth_tag_len);
14238 		debug_hexdump(stdout, "digest:",
14239 				sym_op->aead.digest.data,
14240 				auth_tag_len);
14241 	}
14242 
14243 	/* Append aad data */
14244 	if (tdata->algo == RTE_CRYPTO_AEAD_AES_CCM) {
14245 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14246 				uint8_t *, IV_OFFSET);
14247 
14248 		/* Copy IV 1 byte after the IV pointer, according to the API */
14249 		rte_memcpy(iv_ptr + 1, tdata->iv.data, iv_len);
14250 
14251 		aad_len = RTE_ALIGN_CEIL(aad_len + 18, 16);
14252 
14253 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14254 				ut_params->ibuf, aad_len);
14255 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14256 				"no room to prepend aad");
14257 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14258 				ut_params->ibuf);
14259 
14260 		memset(sym_op->aead.aad.data, 0, aad_len);
14261 		/* Copy AAD 18 bytes after the AAD pointer, according to the API */
14262 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14263 
14264 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14265 		debug_hexdump(stdout, "aad:",
14266 				sym_op->aead.aad.data, aad_len);
14267 	} else {
14268 		uint8_t *iv_ptr = rte_crypto_op_ctod_offset(ut_params->op,
14269 				uint8_t *, IV_OFFSET);
14270 
14271 		rte_memcpy(iv_ptr, tdata->iv.data, iv_len);
14272 
14273 		aad_len_pad = RTE_ALIGN_CEIL(aad_len, 16);
14274 
14275 		sym_op->aead.aad.data = (uint8_t *)rte_pktmbuf_prepend(
14276 				ut_params->ibuf, aad_len_pad);
14277 		TEST_ASSERT_NOT_NULL(sym_op->aead.aad.data,
14278 				"no room to prepend aad");
14279 		sym_op->aead.aad.phys_addr = rte_pktmbuf_iova(
14280 				ut_params->ibuf);
14281 
14282 		memset(sym_op->aead.aad.data, 0, aad_len);
14283 		rte_memcpy(sym_op->aead.aad.data, tdata->aad.data, aad_len);
14284 
14285 		debug_hexdump(stdout, "iv:", iv_ptr, iv_len);
14286 		debug_hexdump(stdout, "aad:",
14287 				sym_op->aead.aad.data, aad_len);
14288 	}
14289 
14290 	sym_op->aead.data.length = tdata->plaintext.len;
14291 	sym_op->aead.data.offset = aad_len_pad;
14292 
14293 	return 0;
14294 }
14295 
14296 #define SGL_MAX_NO	16
14297 
14298 static int
14299 test_authenticated_encryption_SGL(const struct aead_test_data *tdata,
14300 		const int oop, uint32_t fragsz, uint32_t fragsz_oop)
14301 {
14302 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14303 	struct crypto_unittest_params *ut_params = &unittest_params;
14304 	struct rte_mbuf *buf, *buf_oop = NULL, *buf_last_oop = NULL;
14305 	int retval;
14306 	int to_trn = 0;
14307 	int to_trn_tbl[SGL_MAX_NO];
14308 	int segs = 1;
14309 	unsigned int trn_data = 0;
14310 	uint8_t *plaintext, *ciphertext, *auth_tag;
14311 	struct rte_cryptodev_info dev_info;
14312 
14313 	/* Verify the capabilities */
14314 	struct rte_cryptodev_sym_capability_idx cap_idx;
14315 	cap_idx.type = RTE_CRYPTO_SYM_XFORM_AEAD;
14316 	cap_idx.algo.aead = tdata->algo;
14317 	if (rte_cryptodev_sym_capability_get(ts_params->valid_devs[0],
14318 			&cap_idx) == NULL)
14319 		return TEST_SKIPPED;
14320 
14321 	/* OOP not supported with CPU crypto */
14322 	if (oop && gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14323 		return TEST_SKIPPED;
14324 
14325 	/* Detailed check for the particular SGL support flag */
14326 	rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
14327 	if (!oop) {
14328 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
14329 		if (sgl_in && (!(dev_info.feature_flags &
14330 				RTE_CRYPTODEV_FF_IN_PLACE_SGL)))
14331 			return TEST_SKIPPED;
14332 
14333 		uint64_t feat_flags = dev_info.feature_flags;
14334 
14335 		if ((global_api_test_type == CRYPTODEV_RAW_API_TEST) &&
14336 			(!(feat_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP))) {
14337 			printf("Device doesn't support RAW data-path APIs.\n");
14338 			return TEST_SKIPPED;
14339 		}
14340 	} else {
14341 		unsigned int sgl_in = fragsz < tdata->plaintext.len;
14342 		unsigned int sgl_out = (fragsz_oop ? fragsz_oop : fragsz) <
14343 				tdata->plaintext.len;
14344 		/* Raw data path API does not support OOP */
14345 		if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14346 			return TEST_SKIPPED;
14347 		if (sgl_in && !sgl_out) {
14348 			if (!(dev_info.feature_flags &
14349 					RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT))
14350 				return TEST_SKIPPED;
14351 		} else if (!sgl_in && sgl_out) {
14352 			if (!(dev_info.feature_flags &
14353 					RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT))
14354 				return TEST_SKIPPED;
14355 		} else if (sgl_in && sgl_out) {
14356 			if (!(dev_info.feature_flags &
14357 					RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT))
14358 				return TEST_SKIPPED;
14359 		}
14360 	}
14361 
14362 	if (fragsz > tdata->plaintext.len)
14363 		fragsz = tdata->plaintext.len;
14364 
14365 	uint16_t plaintext_len = fragsz;
14366 	uint16_t frag_size_oop = fragsz_oop ? fragsz_oop : fragsz;
14367 
14368 	if (fragsz_oop > tdata->plaintext.len)
14369 		frag_size_oop = tdata->plaintext.len;
14370 
14371 	int ecx = 0;
14372 	void *digest_mem = NULL;
14373 
14374 	uint32_t prepend_len = RTE_ALIGN_CEIL(tdata->aad.len, 16);
14375 
14376 	if (tdata->plaintext.len % fragsz != 0) {
14377 		if (tdata->plaintext.len / fragsz + 1 > SGL_MAX_NO)
14378 			return 1;
14379 	}	else {
14380 		if (tdata->plaintext.len / fragsz > SGL_MAX_NO)
14381 			return 1;
14382 	}
14383 
14384 	/*
14385 	 * For out-op-place we need to alloc another mbuf
14386 	 */
14387 	if (oop) {
14388 		ut_params->obuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14389 		rte_pktmbuf_append(ut_params->obuf,
14390 				frag_size_oop + prepend_len);
14391 		buf_oop = ut_params->obuf;
14392 	}
14393 
14394 	/* Create AEAD session */
14395 	retval = create_aead_session(ts_params->valid_devs[0],
14396 			tdata->algo,
14397 			RTE_CRYPTO_AEAD_OP_ENCRYPT,
14398 			tdata->key.data, tdata->key.len,
14399 			tdata->aad.len, tdata->auth_tag.len,
14400 			tdata->iv.len);
14401 	if (retval < 0)
14402 		return retval;
14403 
14404 	ut_params->ibuf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14405 
14406 	/* clear mbuf payload */
14407 	memset(rte_pktmbuf_mtod(ut_params->ibuf, uint8_t *), 0,
14408 			rte_pktmbuf_tailroom(ut_params->ibuf));
14409 
14410 	plaintext = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14411 			plaintext_len);
14412 
14413 	memcpy(plaintext, tdata->plaintext.data, plaintext_len);
14414 
14415 	trn_data += plaintext_len;
14416 
14417 	buf = ut_params->ibuf;
14418 
14419 	/*
14420 	 * Loop until no more fragments
14421 	 */
14422 
14423 	while (trn_data < tdata->plaintext.len) {
14424 		++segs;
14425 		to_trn = (tdata->plaintext.len - trn_data < fragsz) ?
14426 				(tdata->plaintext.len - trn_data) : fragsz;
14427 
14428 		to_trn_tbl[ecx++] = to_trn;
14429 
14430 		buf->next = rte_pktmbuf_alloc(ts_params->mbuf_pool);
14431 		buf = buf->next;
14432 
14433 		memset(rte_pktmbuf_mtod(buf, uint8_t *), 0,
14434 				rte_pktmbuf_tailroom(buf));
14435 
14436 		/* OOP */
14437 		if (oop && !fragsz_oop) {
14438 			buf_last_oop = buf_oop->next =
14439 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
14440 			buf_oop = buf_oop->next;
14441 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14442 					0, rte_pktmbuf_tailroom(buf_oop));
14443 			rte_pktmbuf_append(buf_oop, to_trn);
14444 		}
14445 
14446 		plaintext = (uint8_t *)rte_pktmbuf_append(buf,
14447 				to_trn);
14448 
14449 		memcpy(plaintext, tdata->plaintext.data + trn_data,
14450 				to_trn);
14451 		trn_data += to_trn;
14452 		if (trn_data  == tdata->plaintext.len) {
14453 			if (oop) {
14454 				if (!fragsz_oop)
14455 					digest_mem = rte_pktmbuf_append(buf_oop,
14456 						tdata->auth_tag.len);
14457 			} else
14458 				digest_mem = (uint8_t *)rte_pktmbuf_append(buf,
14459 					tdata->auth_tag.len);
14460 		}
14461 	}
14462 
14463 	uint64_t digest_phys = 0;
14464 
14465 	ut_params->ibuf->nb_segs = segs;
14466 
14467 	segs = 1;
14468 	if (fragsz_oop && oop) {
14469 		to_trn = 0;
14470 		ecx = 0;
14471 
14472 		if (frag_size_oop == tdata->plaintext.len) {
14473 			digest_mem = rte_pktmbuf_append(ut_params->obuf,
14474 				tdata->auth_tag.len);
14475 
14476 			digest_phys = rte_pktmbuf_iova_offset(
14477 					ut_params->obuf,
14478 					tdata->plaintext.len + prepend_len);
14479 		}
14480 
14481 		trn_data = frag_size_oop;
14482 		while (trn_data < tdata->plaintext.len) {
14483 			++segs;
14484 			to_trn =
14485 				(tdata->plaintext.len - trn_data <
14486 						frag_size_oop) ?
14487 				(tdata->plaintext.len - trn_data) :
14488 						frag_size_oop;
14489 
14490 			to_trn_tbl[ecx++] = to_trn;
14491 
14492 			buf_last_oop = buf_oop->next =
14493 					rte_pktmbuf_alloc(ts_params->mbuf_pool);
14494 			buf_oop = buf_oop->next;
14495 			memset(rte_pktmbuf_mtod(buf_oop, uint8_t *),
14496 					0, rte_pktmbuf_tailroom(buf_oop));
14497 			rte_pktmbuf_append(buf_oop, to_trn);
14498 
14499 			trn_data += to_trn;
14500 
14501 			if (trn_data  == tdata->plaintext.len) {
14502 				digest_mem = rte_pktmbuf_append(buf_oop,
14503 					tdata->auth_tag.len);
14504 			}
14505 		}
14506 
14507 		ut_params->obuf->nb_segs = segs;
14508 	}
14509 
14510 	/*
14511 	 * Place digest at the end of the last buffer
14512 	 */
14513 	if (!digest_phys)
14514 		digest_phys = rte_pktmbuf_iova(buf) + to_trn;
14515 	if (oop && buf_last_oop)
14516 		digest_phys = rte_pktmbuf_iova(buf_last_oop) + to_trn;
14517 
14518 	if (!digest_mem && !oop) {
14519 		digest_mem = (uint8_t *)rte_pktmbuf_append(ut_params->ibuf,
14520 				+ tdata->auth_tag.len);
14521 		digest_phys = rte_pktmbuf_iova_offset(ut_params->ibuf,
14522 				tdata->plaintext.len);
14523 	}
14524 
14525 	/* Create AEAD operation */
14526 	retval = create_aead_operation_SGL(RTE_CRYPTO_AEAD_OP_ENCRYPT,
14527 			tdata, digest_mem, digest_phys);
14528 
14529 	if (retval < 0)
14530 		return retval;
14531 
14532 	rte_crypto_op_attach_sym_session(ut_params->op, ut_params->sess);
14533 
14534 	ut_params->op->sym->m_src = ut_params->ibuf;
14535 	if (oop)
14536 		ut_params->op->sym->m_dst = ut_params->obuf;
14537 
14538 	/* Process crypto operation */
14539 	if (oop == IN_PLACE &&
14540 			gbl_action_type == RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO)
14541 		process_cpu_aead_op(ts_params->valid_devs[0], ut_params->op);
14542 	else if (global_api_test_type == CRYPTODEV_RAW_API_TEST)
14543 		process_sym_raw_dp_op(ts_params->valid_devs[0], 0,
14544 				ut_params->op, 0, 0, 0, 0);
14545 	else
14546 		TEST_ASSERT_NOT_NULL(
14547 			process_crypto_request(ts_params->valid_devs[0],
14548 			ut_params->op), "failed to process sym crypto op");
14549 
14550 	TEST_ASSERT_EQUAL(ut_params->op->status, RTE_CRYPTO_OP_STATUS_SUCCESS,
14551 			"crypto op processing failed");
14552 
14553 
14554 	ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_src,
14555 			uint8_t *, prepend_len);
14556 	if (oop) {
14557 		ciphertext = rte_pktmbuf_mtod_offset(ut_params->op->sym->m_dst,
14558 				uint8_t *, prepend_len);
14559 	}
14560 
14561 	if (fragsz_oop)
14562 		fragsz = fragsz_oop;
14563 
14564 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14565 			ciphertext,
14566 			tdata->ciphertext.data,
14567 			fragsz,
14568 			"Ciphertext data not as expected");
14569 
14570 	buf = ut_params->op->sym->m_src->next;
14571 	if (oop)
14572 		buf = ut_params->op->sym->m_dst->next;
14573 
14574 	unsigned int off = fragsz;
14575 
14576 	ecx = 0;
14577 	while (buf) {
14578 		ciphertext = rte_pktmbuf_mtod(buf,
14579 				uint8_t *);
14580 
14581 		TEST_ASSERT_BUFFERS_ARE_EQUAL(
14582 				ciphertext,
14583 				tdata->ciphertext.data + off,
14584 				to_trn_tbl[ecx],
14585 				"Ciphertext data not as expected");
14586 
14587 		off += to_trn_tbl[ecx++];
14588 		buf = buf->next;
14589 	}
14590 
14591 	auth_tag = digest_mem;
14592 	TEST_ASSERT_BUFFERS_ARE_EQUAL(
14593 			auth_tag,
14594 			tdata->auth_tag.data,
14595 			tdata->auth_tag.len,
14596 			"Generated auth tag not as expected");
14597 
14598 	return 0;
14599 }
14600 
14601 static int
14602 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B(void)
14603 {
14604 	return test_authenticated_encryption_SGL(
14605 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 400, 400);
14606 }
14607 
14608 static int
14609 test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
14610 {
14611 	return test_authenticated_encryption_SGL(
14612 			&gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
14613 }
14614 
14615 static int
14616 test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
14617 {
14618 	return test_authenticated_encryption_SGL(
14619 			&gcm_test_case_8, OUT_OF_PLACE, 400,
14620 			gcm_test_case_8.plaintext.len);
14621 }
14622 
14623 static int
14624 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
14625 {
14626 	/* This test is not for OPENSSL PMD */
14627 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14628 			RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD)))
14629 		return TEST_SKIPPED;
14630 
14631 	return test_authenticated_encryption_SGL(
14632 			&gcm_test_case_SGL_1, IN_PLACE, 1500, 0);
14633 }
14634 
14635 static int
14636 test_authentication_verify_fail_when_data_corrupted(
14637 		struct crypto_testsuite_params *ts_params,
14638 		struct crypto_unittest_params *ut_params,
14639 		const struct test_crypto_vector *reference)
14640 {
14641 	return test_authentication_verify_fail_when_data_corruption(
14642 			ts_params, ut_params, reference, 1);
14643 }
14644 
14645 static int
14646 test_authentication_verify_fail_when_tag_corrupted(
14647 		struct crypto_testsuite_params *ts_params,
14648 		struct crypto_unittest_params *ut_params,
14649 		const struct test_crypto_vector *reference)
14650 {
14651 	return test_authentication_verify_fail_when_data_corruption(
14652 			ts_params, ut_params, reference, 0);
14653 }
14654 
14655 static int
14656 test_authentication_verify_GMAC_fail_when_data_corrupted(
14657 		struct crypto_testsuite_params *ts_params,
14658 		struct crypto_unittest_params *ut_params,
14659 		const struct test_crypto_vector *reference)
14660 {
14661 	return test_authentication_verify_GMAC_fail_when_corruption(
14662 			ts_params, ut_params, reference, 1);
14663 }
14664 
14665 static int
14666 test_authentication_verify_GMAC_fail_when_tag_corrupted(
14667 		struct crypto_testsuite_params *ts_params,
14668 		struct crypto_unittest_params *ut_params,
14669 		const struct test_crypto_vector *reference)
14670 {
14671 	return test_authentication_verify_GMAC_fail_when_corruption(
14672 			ts_params, ut_params, reference, 0);
14673 }
14674 
14675 static int
14676 test_authenticated_decryption_fail_when_data_corrupted(
14677 		struct crypto_testsuite_params *ts_params,
14678 		struct crypto_unittest_params *ut_params,
14679 		const struct test_crypto_vector *reference)
14680 {
14681 	return test_authenticated_decryption_fail_when_corruption(
14682 			ts_params, ut_params, reference, 1);
14683 }
14684 
14685 static int
14686 test_authenticated_decryption_fail_when_tag_corrupted(
14687 		struct crypto_testsuite_params *ts_params,
14688 		struct crypto_unittest_params *ut_params,
14689 		const struct test_crypto_vector *reference)
14690 {
14691 	return test_authenticated_decryption_fail_when_corruption(
14692 			ts_params, ut_params, reference, 0);
14693 }
14694 
14695 static int
14696 authentication_verify_HMAC_SHA1_fail_data_corrupt(void)
14697 {
14698 	return test_authentication_verify_fail_when_data_corrupted(
14699 			&testsuite_params, &unittest_params,
14700 			&hmac_sha1_test_crypto_vector);
14701 }
14702 
14703 static int
14704 authentication_verify_HMAC_SHA1_fail_tag_corrupt(void)
14705 {
14706 	return test_authentication_verify_fail_when_tag_corrupted(
14707 			&testsuite_params, &unittest_params,
14708 			&hmac_sha1_test_crypto_vector);
14709 }
14710 
14711 static int
14712 authentication_verify_AES128_GMAC_fail_data_corrupt(void)
14713 {
14714 	return test_authentication_verify_GMAC_fail_when_data_corrupted(
14715 			&testsuite_params, &unittest_params,
14716 			&aes128_gmac_test_vector);
14717 }
14718 
14719 static int
14720 authentication_verify_AES128_GMAC_fail_tag_corrupt(void)
14721 {
14722 	return test_authentication_verify_GMAC_fail_when_tag_corrupted(
14723 			&testsuite_params, &unittest_params,
14724 			&aes128_gmac_test_vector);
14725 }
14726 
14727 static int
14728 auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt(void)
14729 {
14730 	return test_authenticated_decryption_fail_when_data_corrupted(
14731 			&testsuite_params,
14732 			&unittest_params,
14733 			&aes128cbc_hmac_sha1_test_vector);
14734 }
14735 
14736 static int
14737 auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt(void)
14738 {
14739 	return test_authenticated_decryption_fail_when_tag_corrupted(
14740 			&testsuite_params,
14741 			&unittest_params,
14742 			&aes128cbc_hmac_sha1_test_vector);
14743 }
14744 
14745 static int
14746 auth_encrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14747 {
14748 	return test_authenticated_encrypt_with_esn(
14749 			&testsuite_params,
14750 			&unittest_params,
14751 			&aes128cbc_hmac_sha1_aad_test_vector);
14752 }
14753 
14754 static int
14755 auth_decrypt_AES128CBC_HMAC_SHA1_esn_check(void)
14756 {
14757 	return test_authenticated_decrypt_with_esn(
14758 			&testsuite_params,
14759 			&unittest_params,
14760 			&aes128cbc_hmac_sha1_aad_test_vector);
14761 }
14762 
14763 static int
14764 test_chacha20_poly1305_encrypt_test_case_rfc8439(void)
14765 {
14766 	return test_authenticated_encryption(&chacha20_poly1305_case_rfc8439);
14767 }
14768 
14769 static int
14770 test_chacha20_poly1305_decrypt_test_case_rfc8439(void)
14771 {
14772 	return test_authenticated_decryption(&chacha20_poly1305_case_rfc8439);
14773 }
14774 
14775 static int
14776 test_chacha20_poly1305_encrypt_SGL_out_of_place(void)
14777 {
14778 	return test_authenticated_encryption_SGL(
14779 		&chacha20_poly1305_case_2, OUT_OF_PLACE, 32,
14780 		chacha20_poly1305_case_2.plaintext.len);
14781 }
14782 
14783 #ifdef RTE_CRYPTO_SCHEDULER
14784 
14785 /* global AESNI worker IDs for the scheduler test */
14786 uint8_t aesni_ids[2];
14787 
14788 static int
14789 scheduler_testsuite_setup(void)
14790 {
14791 	uint32_t i = 0;
14792 	int32_t nb_devs, ret;
14793 	char vdev_args[VDEV_ARGS_SIZE] = {""};
14794 	char temp_str[VDEV_ARGS_SIZE] = {"mode=multi-core,"
14795 		"ordering=enable,name=cryptodev_test_scheduler,corelist="};
14796 	uint16_t worker_core_count = 0;
14797 	uint16_t socket_id = 0;
14798 
14799 	if (gbl_driver_id == rte_cryptodev_driver_id_get(
14800 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD))) {
14801 
14802 		/* Identify the Worker Cores
14803 		 * Use 2 worker cores for the device args
14804 		 */
14805 		RTE_LCORE_FOREACH_WORKER(i) {
14806 			if (worker_core_count > 1)
14807 				break;
14808 			snprintf(vdev_args, sizeof(vdev_args),
14809 					"%s%d", temp_str, i);
14810 			strcpy(temp_str, vdev_args);
14811 			strlcat(temp_str, ";", sizeof(temp_str));
14812 			worker_core_count++;
14813 			socket_id = rte_lcore_to_socket_id(i);
14814 		}
14815 		if (worker_core_count != 2) {
14816 			RTE_LOG(ERR, USER1,
14817 				"Cryptodev scheduler test require at least "
14818 				"two worker cores to run. "
14819 				"Please use the correct coremask.\n");
14820 			return TEST_FAILED;
14821 		}
14822 		strcpy(temp_str, vdev_args);
14823 		snprintf(vdev_args, sizeof(vdev_args), "%s,socket_id=%d",
14824 				temp_str, socket_id);
14825 		RTE_LOG(DEBUG, USER1, "vdev_args: %s\n", vdev_args);
14826 		nb_devs = rte_cryptodev_device_count_by_driver(
14827 				rte_cryptodev_driver_id_get(
14828 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD)));
14829 		if (nb_devs < 1) {
14830 			ret = rte_vdev_init(
14831 				RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD),
14832 					vdev_args);
14833 			TEST_ASSERT(ret == 0,
14834 				"Failed to create instance %u of pmd : %s",
14835 				i, RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
14836 		}
14837 	}
14838 	return testsuite_setup();
14839 }
14840 
14841 static int
14842 test_scheduler_attach_worker_op(void)
14843 {
14844 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14845 	uint8_t sched_id = ts_params->valid_devs[0];
14846 	uint32_t i, nb_devs_attached = 0;
14847 	int ret;
14848 	char vdev_name[32];
14849 	unsigned int count = rte_cryptodev_count();
14850 
14851 	/* create 2 AESNI_MB vdevs on top of existing devices */
14852 	for (i = count; i < count + 2; i++) {
14853 		snprintf(vdev_name, sizeof(vdev_name), "%s_%u",
14854 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD),
14855 				i);
14856 		ret = rte_vdev_init(vdev_name, NULL);
14857 
14858 		TEST_ASSERT(ret == 0,
14859 			"Failed to create instance %u of"
14860 			" pmd : %s",
14861 			i, RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14862 
14863 		if (ret < 0) {
14864 			RTE_LOG(ERR, USER1,
14865 				"Failed to create 2 AESNI MB PMDs.\n");
14866 			return TEST_SKIPPED;
14867 		}
14868 	}
14869 
14870 	/* attach 2 AESNI_MB cdevs */
14871 	for (i = count; i < count + 2; i++) {
14872 		struct rte_cryptodev_info info;
14873 		unsigned int session_size;
14874 
14875 		rte_cryptodev_info_get(i, &info);
14876 		if (info.driver_id != rte_cryptodev_driver_id_get(
14877 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)))
14878 			continue;
14879 
14880 		session_size = rte_cryptodev_sym_get_private_session_size(i);
14881 		/*
14882 		 * Create the session mempool again, since now there are new devices
14883 		 * to use the mempool.
14884 		 */
14885 		if (ts_params->session_mpool) {
14886 			rte_mempool_free(ts_params->session_mpool);
14887 			ts_params->session_mpool = NULL;
14888 		}
14889 		if (ts_params->session_priv_mpool) {
14890 			rte_mempool_free(ts_params->session_priv_mpool);
14891 			ts_params->session_priv_mpool = NULL;
14892 		}
14893 
14894 		if (info.sym.max_nb_sessions != 0 &&
14895 				info.sym.max_nb_sessions < MAX_NB_SESSIONS) {
14896 			RTE_LOG(ERR, USER1,
14897 					"Device does not support "
14898 					"at least %u sessions\n",
14899 					MAX_NB_SESSIONS);
14900 			return TEST_FAILED;
14901 		}
14902 		/*
14903 		 * Create mempool with maximum number of sessions,
14904 		 * to include the session headers
14905 		 */
14906 		if (ts_params->session_mpool == NULL) {
14907 			ts_params->session_mpool =
14908 				rte_cryptodev_sym_session_pool_create(
14909 						"test_sess_mp",
14910 						MAX_NB_SESSIONS, 0, 0, 0,
14911 						SOCKET_ID_ANY);
14912 			TEST_ASSERT_NOT_NULL(ts_params->session_mpool,
14913 					"session mempool allocation failed");
14914 		}
14915 
14916 		/*
14917 		 * Create mempool with maximum number of sessions,
14918 		 * to include device specific session private data
14919 		 */
14920 		if (ts_params->session_priv_mpool == NULL) {
14921 			ts_params->session_priv_mpool = rte_mempool_create(
14922 					"test_sess_mp_priv",
14923 					MAX_NB_SESSIONS,
14924 					session_size,
14925 					0, 0, NULL, NULL, NULL,
14926 					NULL, SOCKET_ID_ANY,
14927 					0);
14928 
14929 			TEST_ASSERT_NOT_NULL(ts_params->session_priv_mpool,
14930 					"session mempool allocation failed");
14931 		}
14932 
14933 		ts_params->qp_conf.mp_session = ts_params->session_mpool;
14934 		ts_params->qp_conf.mp_session_private =
14935 				ts_params->session_priv_mpool;
14936 
14937 		ret = rte_cryptodev_scheduler_worker_attach(sched_id,
14938 				(uint8_t)i);
14939 
14940 		TEST_ASSERT(ret == 0,
14941 			"Failed to attach device %u of pmd : %s", i,
14942 			RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
14943 
14944 		aesni_ids[nb_devs_attached] = (uint8_t)i;
14945 
14946 		nb_devs_attached++;
14947 	}
14948 
14949 	return 0;
14950 }
14951 
14952 static int
14953 test_scheduler_detach_worker_op(void)
14954 {
14955 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14956 	uint8_t sched_id = ts_params->valid_devs[0];
14957 	uint32_t i;
14958 	int ret;
14959 
14960 	for (i = 0; i < 2; i++) {
14961 		ret = rte_cryptodev_scheduler_worker_detach(sched_id,
14962 				aesni_ids[i]);
14963 		TEST_ASSERT(ret == 0,
14964 			"Failed to detach device %u", aesni_ids[i]);
14965 	}
14966 
14967 	return 0;
14968 }
14969 
14970 static int
14971 test_scheduler_mode_op(enum rte_cryptodev_scheduler_mode scheduler_mode)
14972 {
14973 	struct crypto_testsuite_params *ts_params = &testsuite_params;
14974 	uint8_t sched_id = ts_params->valid_devs[0];
14975 	/* set mode */
14976 	return rte_cryptodev_scheduler_mode_set(sched_id,
14977 		scheduler_mode);
14978 }
14979 
14980 static int
14981 test_scheduler_mode_roundrobin_op(void)
14982 {
14983 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) ==
14984 			0, "Failed to set roundrobin mode");
14985 	return 0;
14986 
14987 }
14988 
14989 static int
14990 test_scheduler_mode_multicore_op(void)
14991 {
14992 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) ==
14993 			0, "Failed to set multicore mode");
14994 
14995 	return 0;
14996 }
14997 
14998 static int
14999 test_scheduler_mode_failover_op(void)
15000 {
15001 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) ==
15002 			0, "Failed to set failover mode");
15003 
15004 	return 0;
15005 }
15006 
15007 static int
15008 test_scheduler_mode_pkt_size_distr_op(void)
15009 {
15010 	TEST_ASSERT(test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) ==
15011 			0, "Failed to set pktsize mode");
15012 
15013 	return 0;
15014 }
15015 
15016 static int
15017 scheduler_multicore_testsuite_setup(void)
15018 {
15019 	if (test_scheduler_attach_worker_op() < 0)
15020 		return TEST_SKIPPED;
15021 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_MULTICORE) < 0)
15022 		return TEST_SKIPPED;
15023 	return 0;
15024 }
15025 
15026 static int
15027 scheduler_roundrobin_testsuite_setup(void)
15028 {
15029 	if (test_scheduler_attach_worker_op() < 0)
15030 		return TEST_SKIPPED;
15031 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_ROUNDROBIN) < 0)
15032 		return TEST_SKIPPED;
15033 	return 0;
15034 }
15035 
15036 static int
15037 scheduler_failover_testsuite_setup(void)
15038 {
15039 	if (test_scheduler_attach_worker_op() < 0)
15040 		return TEST_SKIPPED;
15041 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_FAILOVER) < 0)
15042 		return TEST_SKIPPED;
15043 	return 0;
15044 }
15045 
15046 static int
15047 scheduler_pkt_size_distr_testsuite_setup(void)
15048 {
15049 	if (test_scheduler_attach_worker_op() < 0)
15050 		return TEST_SKIPPED;
15051 	if (test_scheduler_mode_op(CDEV_SCHED_MODE_PKT_SIZE_DISTR) < 0)
15052 		return TEST_SKIPPED;
15053 	return 0;
15054 }
15055 
15056 static void
15057 scheduler_mode_testsuite_teardown(void)
15058 {
15059 	test_scheduler_detach_worker_op();
15060 }
15061 
15062 #endif /* RTE_CRYPTO_SCHEDULER */
15063 
15064 static struct unit_test_suite end_testsuite = {
15065 	.suite_name = NULL,
15066 	.setup = NULL,
15067 	.teardown = NULL,
15068 	.unit_test_suites = NULL
15069 };
15070 
15071 #ifdef RTE_LIB_SECURITY
15072 static struct unit_test_suite ipsec_proto_testsuite  = {
15073 	.suite_name = "IPsec Proto Unit Test Suite",
15074 	.setup = ipsec_proto_testsuite_setup,
15075 	.unit_test_cases = {
15076 		TEST_CASE_NAMED_WITH_DATA(
15077 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15078 			ut_setup_security, ut_teardown,
15079 			test_ipsec_proto_known_vec, &pkt_aes_128_gcm),
15080 		TEST_CASE_NAMED_WITH_DATA(
15081 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15082 			ut_setup_security, ut_teardown,
15083 			test_ipsec_proto_known_vec, &pkt_aes_192_gcm),
15084 		TEST_CASE_NAMED_WITH_DATA(
15085 			"Outbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15086 			ut_setup_security, ut_teardown,
15087 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm),
15088 		TEST_CASE_NAMED_WITH_DATA(
15089 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15090 			ut_setup_security, ut_teardown,
15091 			test_ipsec_proto_known_vec,
15092 			&pkt_aes_128_cbc_hmac_sha256),
15093 		TEST_CASE_NAMED_WITH_DATA(
15094 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15095 			ut_setup_security, ut_teardown,
15096 			test_ipsec_proto_known_vec,
15097 			&pkt_aes_128_cbc_hmac_sha384),
15098 		TEST_CASE_NAMED_WITH_DATA(
15099 			"Outbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15100 			ut_setup_security, ut_teardown,
15101 			test_ipsec_proto_known_vec,
15102 			&pkt_aes_128_cbc_hmac_sha512),
15103 		TEST_CASE_NAMED_WITH_DATA(
15104 			"Outbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15105 			ut_setup_security, ut_teardown,
15106 			test_ipsec_proto_known_vec, &pkt_aes_256_gcm_v6),
15107 		TEST_CASE_NAMED_WITH_DATA(
15108 			"Outbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15109 			ut_setup_security, ut_teardown,
15110 			test_ipsec_proto_known_vec,
15111 			&pkt_aes_128_cbc_hmac_sha256_v6),
15112 		TEST_CASE_NAMED_WITH_DATA(
15113 			"Outbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15114 			ut_setup_security, ut_teardown,
15115 			test_ipsec_proto_known_vec,
15116 			&pkt_null_aes_xcbc),
15117 		TEST_CASE_NAMED_WITH_DATA(
15118 			"Outbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15119 			ut_setup_security, ut_teardown,
15120 			test_ipsec_proto_known_vec,
15121 			&pkt_ah_tunnel_sha256),
15122 		TEST_CASE_NAMED_WITH_DATA(
15123 			"Outbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15124 			ut_setup_security, ut_teardown,
15125 			test_ipsec_proto_known_vec,
15126 			&pkt_ah_transport_sha256),
15127 		TEST_CASE_NAMED_WITH_DATA(
15128 			"Outbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15129 			ut_setup_security, ut_teardown,
15130 			test_ipsec_proto_known_vec,
15131 			&pkt_ah_ipv4_aes_gmac_128),
15132 		TEST_CASE_NAMED_WITH_DATA(
15133 			"Outbound fragmented packet",
15134 			ut_setup_security, ut_teardown,
15135 			test_ipsec_proto_known_vec_fragmented,
15136 			&pkt_aes_128_gcm_frag),
15137 		TEST_CASE_NAMED_WITH_DATA(
15138 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 128)",
15139 			ut_setup_security, ut_teardown,
15140 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_gcm),
15141 		TEST_CASE_NAMED_WITH_DATA(
15142 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 192)",
15143 			ut_setup_security, ut_teardown,
15144 			test_ipsec_proto_known_vec_inb, &pkt_aes_192_gcm),
15145 		TEST_CASE_NAMED_WITH_DATA(
15146 			"Inbound known vector (ESP tunnel mode IPv4 AES-GCM 256)",
15147 			ut_setup_security, ut_teardown,
15148 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm),
15149 		TEST_CASE_NAMED_WITH_DATA(
15150 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128)",
15151 			ut_setup_security, ut_teardown,
15152 			test_ipsec_proto_known_vec_inb, &pkt_aes_128_cbc_null),
15153 		TEST_CASE_NAMED_WITH_DATA(
15154 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15155 			ut_setup_security, ut_teardown,
15156 			test_ipsec_proto_known_vec_inb,
15157 			&pkt_aes_128_cbc_hmac_sha256),
15158 		TEST_CASE_NAMED_WITH_DATA(
15159 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA384 [24B ICV])",
15160 			ut_setup_security, ut_teardown,
15161 			test_ipsec_proto_known_vec_inb,
15162 			&pkt_aes_128_cbc_hmac_sha384),
15163 		TEST_CASE_NAMED_WITH_DATA(
15164 			"Inbound known vector (ESP tunnel mode IPv4 AES-CBC 128 HMAC-SHA512 [32B ICV])",
15165 			ut_setup_security, ut_teardown,
15166 			test_ipsec_proto_known_vec_inb,
15167 			&pkt_aes_128_cbc_hmac_sha512),
15168 		TEST_CASE_NAMED_WITH_DATA(
15169 			"Inbound known vector (ESP tunnel mode IPv6 AES-GCM 128)",
15170 			ut_setup_security, ut_teardown,
15171 			test_ipsec_proto_known_vec_inb, &pkt_aes_256_gcm_v6),
15172 		TEST_CASE_NAMED_WITH_DATA(
15173 			"Inbound known vector (ESP tunnel mode IPv6 AES-CBC 128 HMAC-SHA256 [16B ICV])",
15174 			ut_setup_security, ut_teardown,
15175 			test_ipsec_proto_known_vec_inb,
15176 			&pkt_aes_128_cbc_hmac_sha256_v6),
15177 		TEST_CASE_NAMED_WITH_DATA(
15178 			"Inbound known vector (ESP tunnel mode IPv4 NULL AES-XCBC-MAC [12B ICV])",
15179 			ut_setup_security, ut_teardown,
15180 			test_ipsec_proto_known_vec_inb,
15181 			&pkt_null_aes_xcbc),
15182 		TEST_CASE_NAMED_WITH_DATA(
15183 			"Inbound known vector (AH tunnel mode IPv4 HMAC-SHA256)",
15184 			ut_setup_security, ut_teardown,
15185 			test_ipsec_proto_known_vec_inb,
15186 			&pkt_ah_tunnel_sha256),
15187 		TEST_CASE_NAMED_WITH_DATA(
15188 			"Inbound known vector (AH transport mode IPv4 HMAC-SHA256)",
15189 			ut_setup_security, ut_teardown,
15190 			test_ipsec_proto_known_vec_inb,
15191 			&pkt_ah_transport_sha256),
15192 		TEST_CASE_NAMED_WITH_DATA(
15193 			"Inbound known vector (AH transport mode IPv4 AES-GMAC 128)",
15194 			ut_setup_security, ut_teardown,
15195 			test_ipsec_proto_known_vec_inb,
15196 			&pkt_ah_ipv4_aes_gmac_128),
15197 		TEST_CASE_NAMED_ST(
15198 			"Combined test alg list",
15199 			ut_setup_security, ut_teardown,
15200 			test_ipsec_proto_display_list),
15201 		TEST_CASE_NAMED_ST(
15202 			"Combined test alg list (AH)",
15203 			ut_setup_security, ut_teardown,
15204 			test_ipsec_proto_ah_tunnel_ipv4),
15205 		TEST_CASE_NAMED_ST(
15206 			"IV generation",
15207 			ut_setup_security, ut_teardown,
15208 			test_ipsec_proto_iv_gen),
15209 		TEST_CASE_NAMED_ST(
15210 			"UDP encapsulation",
15211 			ut_setup_security, ut_teardown,
15212 			test_ipsec_proto_udp_encap),
15213 		TEST_CASE_NAMED_ST(
15214 			"UDP encapsulation ports verification test",
15215 			ut_setup_security, ut_teardown,
15216 			test_ipsec_proto_udp_ports_verify),
15217 		TEST_CASE_NAMED_ST(
15218 			"SA expiry packets soft",
15219 			ut_setup_security, ut_teardown,
15220 			test_ipsec_proto_sa_exp_pkts_soft),
15221 		TEST_CASE_NAMED_ST(
15222 			"SA expiry packets hard",
15223 			ut_setup_security, ut_teardown,
15224 			test_ipsec_proto_sa_exp_pkts_hard),
15225 		TEST_CASE_NAMED_ST(
15226 			"Negative test: ICV corruption",
15227 			ut_setup_security, ut_teardown,
15228 			test_ipsec_proto_err_icv_corrupt),
15229 		TEST_CASE_NAMED_ST(
15230 			"Tunnel dst addr verification",
15231 			ut_setup_security, ut_teardown,
15232 			test_ipsec_proto_tunnel_dst_addr_verify),
15233 		TEST_CASE_NAMED_ST(
15234 			"Tunnel src and dst addr verification",
15235 			ut_setup_security, ut_teardown,
15236 			test_ipsec_proto_tunnel_src_dst_addr_verify),
15237 		TEST_CASE_NAMED_ST(
15238 			"Inner IP checksum",
15239 			ut_setup_security, ut_teardown,
15240 			test_ipsec_proto_inner_ip_csum),
15241 		TEST_CASE_NAMED_ST(
15242 			"Inner L4 checksum",
15243 			ut_setup_security, ut_teardown,
15244 			test_ipsec_proto_inner_l4_csum),
15245 		TEST_CASE_NAMED_ST(
15246 			"Tunnel IPv4 in IPv4",
15247 			ut_setup_security, ut_teardown,
15248 			test_ipsec_proto_tunnel_v4_in_v4),
15249 		TEST_CASE_NAMED_ST(
15250 			"Tunnel IPv6 in IPv6",
15251 			ut_setup_security, ut_teardown,
15252 			test_ipsec_proto_tunnel_v6_in_v6),
15253 		TEST_CASE_NAMED_ST(
15254 			"Tunnel IPv4 in IPv6",
15255 			ut_setup_security, ut_teardown,
15256 			test_ipsec_proto_tunnel_v4_in_v6),
15257 		TEST_CASE_NAMED_ST(
15258 			"Tunnel IPv6 in IPv4",
15259 			ut_setup_security, ut_teardown,
15260 			test_ipsec_proto_tunnel_v6_in_v4),
15261 		TEST_CASE_NAMED_ST(
15262 			"Transport IPv4",
15263 			ut_setup_security, ut_teardown,
15264 			test_ipsec_proto_transport_v4),
15265 		TEST_CASE_NAMED_ST(
15266 			"AH transport IPv4",
15267 			ut_setup_security, ut_teardown,
15268 			test_ipsec_proto_ah_transport_ipv4),
15269 		TEST_CASE_NAMED_ST(
15270 			"Transport l4 checksum",
15271 			ut_setup_security, ut_teardown,
15272 			test_ipsec_proto_transport_l4_csum),
15273 		TEST_CASE_NAMED_ST(
15274 			"Statistics: success",
15275 			ut_setup_security, ut_teardown,
15276 			test_ipsec_proto_stats),
15277 		TEST_CASE_NAMED_ST(
15278 			"Fragmented packet",
15279 			ut_setup_security, ut_teardown,
15280 			test_ipsec_proto_pkt_fragment),
15281 		TEST_CASE_NAMED_ST(
15282 			"Tunnel header copy DF (inner 0)",
15283 			ut_setup_security, ut_teardown,
15284 			test_ipsec_proto_copy_df_inner_0),
15285 		TEST_CASE_NAMED_ST(
15286 			"Tunnel header copy DF (inner 1)",
15287 			ut_setup_security, ut_teardown,
15288 			test_ipsec_proto_copy_df_inner_1),
15289 		TEST_CASE_NAMED_ST(
15290 			"Tunnel header set DF 0 (inner 1)",
15291 			ut_setup_security, ut_teardown,
15292 			test_ipsec_proto_set_df_0_inner_1),
15293 		TEST_CASE_NAMED_ST(
15294 			"Tunnel header set DF 1 (inner 0)",
15295 			ut_setup_security, ut_teardown,
15296 			test_ipsec_proto_set_df_1_inner_0),
15297 		TEST_CASE_NAMED_ST(
15298 			"Tunnel header IPv4 copy DSCP (inner 0)",
15299 			ut_setup_security, ut_teardown,
15300 			test_ipsec_proto_ipv4_copy_dscp_inner_0),
15301 		TEST_CASE_NAMED_ST(
15302 			"Tunnel header IPv4 copy DSCP (inner 1)",
15303 			ut_setup_security, ut_teardown,
15304 			test_ipsec_proto_ipv4_copy_dscp_inner_1),
15305 		TEST_CASE_NAMED_ST(
15306 			"Tunnel header IPv4 set DSCP 0 (inner 1)",
15307 			ut_setup_security, ut_teardown,
15308 			test_ipsec_proto_ipv4_set_dscp_0_inner_1),
15309 		TEST_CASE_NAMED_ST(
15310 			"Tunnel header IPv4 set DSCP 1 (inner 0)",
15311 			ut_setup_security, ut_teardown,
15312 			test_ipsec_proto_ipv4_set_dscp_1_inner_0),
15313 		TEST_CASE_NAMED_ST(
15314 			"Tunnel header IPv6 copy DSCP (inner 0)",
15315 			ut_setup_security, ut_teardown,
15316 			test_ipsec_proto_ipv6_copy_dscp_inner_0),
15317 		TEST_CASE_NAMED_ST(
15318 			"Tunnel header IPv6 copy DSCP (inner 1)",
15319 			ut_setup_security, ut_teardown,
15320 			test_ipsec_proto_ipv6_copy_dscp_inner_1),
15321 		TEST_CASE_NAMED_ST(
15322 			"Tunnel header IPv6 set DSCP 0 (inner 1)",
15323 			ut_setup_security, ut_teardown,
15324 			test_ipsec_proto_ipv6_set_dscp_0_inner_1),
15325 		TEST_CASE_NAMED_ST(
15326 			"Tunnel header IPv6 set DSCP 1 (inner 0)",
15327 			ut_setup_security, ut_teardown,
15328 			test_ipsec_proto_ipv6_set_dscp_1_inner_0),
15329 		TEST_CASE_NAMED_WITH_DATA(
15330 			"Antireplay with window size 1024",
15331 			ut_setup_security, ut_teardown,
15332 			test_ipsec_proto_pkt_antireplay1024, &pkt_aes_128_gcm),
15333 		TEST_CASE_NAMED_WITH_DATA(
15334 			"Antireplay with window size 2048",
15335 			ut_setup_security, ut_teardown,
15336 			test_ipsec_proto_pkt_antireplay2048, &pkt_aes_128_gcm),
15337 		TEST_CASE_NAMED_WITH_DATA(
15338 			"Antireplay with window size 4096",
15339 			ut_setup_security, ut_teardown,
15340 			test_ipsec_proto_pkt_antireplay4096, &pkt_aes_128_gcm),
15341 		TEST_CASE_NAMED_WITH_DATA(
15342 			"ESN and Antireplay with window size 1024",
15343 			ut_setup_security, ut_teardown,
15344 			test_ipsec_proto_pkt_esn_antireplay1024,
15345 			&pkt_aes_128_gcm),
15346 		TEST_CASE_NAMED_WITH_DATA(
15347 			"ESN and Antireplay with window size 2048",
15348 			ut_setup_security, ut_teardown,
15349 			test_ipsec_proto_pkt_esn_antireplay2048,
15350 			&pkt_aes_128_gcm),
15351 		TEST_CASE_NAMED_WITH_DATA(
15352 			"ESN and Antireplay with window size 4096",
15353 			ut_setup_security, ut_teardown,
15354 			test_ipsec_proto_pkt_esn_antireplay4096,
15355 			&pkt_aes_128_gcm),
15356 		TEST_CASE_NAMED_ST(
15357 			"Tunnel header IPv4 decrement inner TTL",
15358 			ut_setup_security, ut_teardown,
15359 			test_ipsec_proto_ipv4_ttl_decrement),
15360 		TEST_CASE_NAMED_ST(
15361 			"Tunnel header IPv6 decrement inner hop limit",
15362 			ut_setup_security, ut_teardown,
15363 			test_ipsec_proto_ipv6_hop_limit_decrement),
15364 		TEST_CASES_END() /**< NULL terminate unit test array */
15365 	}
15366 };
15367 
15368 static struct unit_test_suite pdcp_proto_testsuite  = {
15369 	.suite_name = "PDCP Proto Unit Test Suite",
15370 	.setup = pdcp_proto_testsuite_setup,
15371 	.unit_test_cases = {
15372 		TEST_CASE_ST(ut_setup_security, ut_teardown,
15373 			test_PDCP_PROTO_all),
15374 		TEST_CASES_END() /**< NULL terminate unit test array */
15375 	}
15376 };
15377 
15378 #define ADD_UPLINK_TESTCASE(data)						\
15379 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_uplink, ut_setup_security,	\
15380 	ut_teardown, test_docsis_proto_uplink, (const void *) &data),		\
15381 
15382 #define ADD_DOWNLINK_TESTCASE(data)						\
15383 	TEST_CASE_NAMED_WITH_DATA(data.test_descr_downlink, ut_setup_security,	\
15384 	ut_teardown, test_docsis_proto_downlink, (const void *) &data),		\
15385 
15386 static struct unit_test_suite docsis_proto_testsuite  = {
15387 	.suite_name = "DOCSIS Proto Unit Test Suite",
15388 	.setup = docsis_proto_testsuite_setup,
15389 	.unit_test_cases = {
15390 		/* Uplink */
15391 		ADD_UPLINK_TESTCASE(docsis_test_case_1)
15392 		ADD_UPLINK_TESTCASE(docsis_test_case_2)
15393 		ADD_UPLINK_TESTCASE(docsis_test_case_3)
15394 		ADD_UPLINK_TESTCASE(docsis_test_case_4)
15395 		ADD_UPLINK_TESTCASE(docsis_test_case_5)
15396 		ADD_UPLINK_TESTCASE(docsis_test_case_6)
15397 		ADD_UPLINK_TESTCASE(docsis_test_case_7)
15398 		ADD_UPLINK_TESTCASE(docsis_test_case_8)
15399 		ADD_UPLINK_TESTCASE(docsis_test_case_9)
15400 		ADD_UPLINK_TESTCASE(docsis_test_case_10)
15401 		ADD_UPLINK_TESTCASE(docsis_test_case_11)
15402 		ADD_UPLINK_TESTCASE(docsis_test_case_12)
15403 		ADD_UPLINK_TESTCASE(docsis_test_case_13)
15404 		ADD_UPLINK_TESTCASE(docsis_test_case_14)
15405 		ADD_UPLINK_TESTCASE(docsis_test_case_15)
15406 		ADD_UPLINK_TESTCASE(docsis_test_case_16)
15407 		ADD_UPLINK_TESTCASE(docsis_test_case_17)
15408 		ADD_UPLINK_TESTCASE(docsis_test_case_18)
15409 		ADD_UPLINK_TESTCASE(docsis_test_case_19)
15410 		ADD_UPLINK_TESTCASE(docsis_test_case_20)
15411 		ADD_UPLINK_TESTCASE(docsis_test_case_21)
15412 		ADD_UPLINK_TESTCASE(docsis_test_case_22)
15413 		ADD_UPLINK_TESTCASE(docsis_test_case_23)
15414 		ADD_UPLINK_TESTCASE(docsis_test_case_24)
15415 		ADD_UPLINK_TESTCASE(docsis_test_case_25)
15416 		ADD_UPLINK_TESTCASE(docsis_test_case_26)
15417 		/* Downlink */
15418 		ADD_DOWNLINK_TESTCASE(docsis_test_case_1)
15419 		ADD_DOWNLINK_TESTCASE(docsis_test_case_2)
15420 		ADD_DOWNLINK_TESTCASE(docsis_test_case_3)
15421 		ADD_DOWNLINK_TESTCASE(docsis_test_case_4)
15422 		ADD_DOWNLINK_TESTCASE(docsis_test_case_5)
15423 		ADD_DOWNLINK_TESTCASE(docsis_test_case_6)
15424 		ADD_DOWNLINK_TESTCASE(docsis_test_case_7)
15425 		ADD_DOWNLINK_TESTCASE(docsis_test_case_8)
15426 		ADD_DOWNLINK_TESTCASE(docsis_test_case_9)
15427 		ADD_DOWNLINK_TESTCASE(docsis_test_case_10)
15428 		ADD_DOWNLINK_TESTCASE(docsis_test_case_11)
15429 		ADD_DOWNLINK_TESTCASE(docsis_test_case_12)
15430 		ADD_DOWNLINK_TESTCASE(docsis_test_case_13)
15431 		ADD_DOWNLINK_TESTCASE(docsis_test_case_14)
15432 		ADD_DOWNLINK_TESTCASE(docsis_test_case_15)
15433 		ADD_DOWNLINK_TESTCASE(docsis_test_case_16)
15434 		ADD_DOWNLINK_TESTCASE(docsis_test_case_17)
15435 		ADD_DOWNLINK_TESTCASE(docsis_test_case_18)
15436 		ADD_DOWNLINK_TESTCASE(docsis_test_case_19)
15437 		ADD_DOWNLINK_TESTCASE(docsis_test_case_20)
15438 		ADD_DOWNLINK_TESTCASE(docsis_test_case_21)
15439 		ADD_DOWNLINK_TESTCASE(docsis_test_case_22)
15440 		ADD_DOWNLINK_TESTCASE(docsis_test_case_23)
15441 		ADD_DOWNLINK_TESTCASE(docsis_test_case_24)
15442 		ADD_DOWNLINK_TESTCASE(docsis_test_case_25)
15443 		ADD_DOWNLINK_TESTCASE(docsis_test_case_26)
15444 		TEST_CASES_END() /**< NULL terminate unit test array */
15445 	}
15446 };
15447 #endif
15448 
15449 static struct unit_test_suite cryptodev_gen_testsuite  = {
15450 	.suite_name = "Crypto General Unit Test Suite",
15451 	.setup = crypto_gen_testsuite_setup,
15452 	.unit_test_cases = {
15453 		TEST_CASE_ST(ut_setup, ut_teardown,
15454 				test_device_configure_invalid_dev_id),
15455 		TEST_CASE_ST(ut_setup, ut_teardown,
15456 				test_queue_pair_descriptor_setup),
15457 		TEST_CASE_ST(ut_setup, ut_teardown,
15458 				test_device_configure_invalid_queue_pair_ids),
15459 		TEST_CASE_ST(ut_setup, ut_teardown, test_stats),
15460 		TEST_CASE_ST(ut_setup, ut_teardown, test_enq_callback_setup),
15461 		TEST_CASE_ST(ut_setup, ut_teardown, test_deq_callback_setup),
15462 		TEST_CASES_END() /**< NULL terminate unit test array */
15463 	}
15464 };
15465 
15466 static struct unit_test_suite cryptodev_negative_hmac_sha1_testsuite = {
15467 	.suite_name = "Negative HMAC SHA1 Unit Test Suite",
15468 	.setup = negative_hmac_sha1_testsuite_setup,
15469 	.unit_test_cases = {
15470 		/** Negative tests */
15471 		TEST_CASE_ST(ut_setup, ut_teardown,
15472 			authentication_verify_HMAC_SHA1_fail_data_corrupt),
15473 		TEST_CASE_ST(ut_setup, ut_teardown,
15474 			authentication_verify_HMAC_SHA1_fail_tag_corrupt),
15475 		TEST_CASE_ST(ut_setup, ut_teardown,
15476 			auth_decryption_AES128CBC_HMAC_SHA1_fail_data_corrupt),
15477 		TEST_CASE_ST(ut_setup, ut_teardown,
15478 			auth_decryption_AES128CBC_HMAC_SHA1_fail_tag_corrupt),
15479 
15480 		TEST_CASES_END() /**< NULL terminate unit test array */
15481 	}
15482 };
15483 
15484 static struct unit_test_suite cryptodev_multi_session_testsuite = {
15485 	.suite_name = "Multi Session Unit Test Suite",
15486 	.setup = multi_session_testsuite_setup,
15487 	.unit_test_cases = {
15488 		TEST_CASE_ST(ut_setup, ut_teardown, test_multi_session),
15489 		TEST_CASE_ST(ut_setup, ut_teardown,
15490 				test_multi_session_random_usage),
15491 
15492 		TEST_CASES_END() /**< NULL terminate unit test array */
15493 	}
15494 };
15495 
15496 static struct unit_test_suite cryptodev_null_testsuite  = {
15497 	.suite_name = "NULL Test Suite",
15498 	.setup = null_testsuite_setup,
15499 	.unit_test_cases = {
15500 		TEST_CASE_ST(ut_setup, ut_teardown,
15501 			test_null_invalid_operation),
15502 		TEST_CASE_ST(ut_setup, ut_teardown, test_null_burst_operation),
15503 		TEST_CASES_END()
15504 	}
15505 };
15506 
15507 static struct unit_test_suite cryptodev_aes_ccm_auth_testsuite  = {
15508 	.suite_name = "AES CCM Authenticated Test Suite",
15509 	.setup = aes_ccm_auth_testsuite_setup,
15510 	.unit_test_cases = {
15511 		/** AES CCM Authenticated Encryption 128 bits key*/
15512 		TEST_CASE_ST(ut_setup, ut_teardown,
15513 			test_AES_CCM_authenticated_encryption_test_case_128_1),
15514 		TEST_CASE_ST(ut_setup, ut_teardown,
15515 			test_AES_CCM_authenticated_encryption_test_case_128_2),
15516 		TEST_CASE_ST(ut_setup, ut_teardown,
15517 			test_AES_CCM_authenticated_encryption_test_case_128_3),
15518 
15519 		/** AES CCM Authenticated Decryption 128 bits key*/
15520 		TEST_CASE_ST(ut_setup, ut_teardown,
15521 			test_AES_CCM_authenticated_decryption_test_case_128_1),
15522 		TEST_CASE_ST(ut_setup, ut_teardown,
15523 			test_AES_CCM_authenticated_decryption_test_case_128_2),
15524 		TEST_CASE_ST(ut_setup, ut_teardown,
15525 			test_AES_CCM_authenticated_decryption_test_case_128_3),
15526 
15527 		/** AES CCM Authenticated Encryption 192 bits key */
15528 		TEST_CASE_ST(ut_setup, ut_teardown,
15529 			test_AES_CCM_authenticated_encryption_test_case_192_1),
15530 		TEST_CASE_ST(ut_setup, ut_teardown,
15531 			test_AES_CCM_authenticated_encryption_test_case_192_2),
15532 		TEST_CASE_ST(ut_setup, ut_teardown,
15533 			test_AES_CCM_authenticated_encryption_test_case_192_3),
15534 
15535 		/** AES CCM Authenticated Decryption 192 bits key*/
15536 		TEST_CASE_ST(ut_setup, ut_teardown,
15537 			test_AES_CCM_authenticated_decryption_test_case_192_1),
15538 		TEST_CASE_ST(ut_setup, ut_teardown,
15539 			test_AES_CCM_authenticated_decryption_test_case_192_2),
15540 		TEST_CASE_ST(ut_setup, ut_teardown,
15541 			test_AES_CCM_authenticated_decryption_test_case_192_3),
15542 
15543 		/** AES CCM Authenticated Encryption 256 bits key */
15544 		TEST_CASE_ST(ut_setup, ut_teardown,
15545 			test_AES_CCM_authenticated_encryption_test_case_256_1),
15546 		TEST_CASE_ST(ut_setup, ut_teardown,
15547 			test_AES_CCM_authenticated_encryption_test_case_256_2),
15548 		TEST_CASE_ST(ut_setup, ut_teardown,
15549 			test_AES_CCM_authenticated_encryption_test_case_256_3),
15550 
15551 		/** AES CCM Authenticated Decryption 256 bits key*/
15552 		TEST_CASE_ST(ut_setup, ut_teardown,
15553 			test_AES_CCM_authenticated_decryption_test_case_256_1),
15554 		TEST_CASE_ST(ut_setup, ut_teardown,
15555 			test_AES_CCM_authenticated_decryption_test_case_256_2),
15556 		TEST_CASE_ST(ut_setup, ut_teardown,
15557 			test_AES_CCM_authenticated_decryption_test_case_256_3),
15558 		TEST_CASES_END()
15559 	}
15560 };
15561 
15562 static struct unit_test_suite cryptodev_aes_gcm_auth_testsuite  = {
15563 	.suite_name = "AES GCM Authenticated Test Suite",
15564 	.setup = aes_gcm_auth_testsuite_setup,
15565 	.unit_test_cases = {
15566 		/** AES GCM Authenticated Encryption */
15567 		TEST_CASE_ST(ut_setup, ut_teardown,
15568 			test_AES_GCM_auth_encrypt_SGL_in_place_1500B),
15569 		TEST_CASE_ST(ut_setup, ut_teardown,
15570 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_400B),
15571 		TEST_CASE_ST(ut_setup, ut_teardown,
15572 			test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B),
15573 		TEST_CASE_ST(ut_setup, ut_teardown,
15574 			test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
15575 		TEST_CASE_ST(ut_setup, ut_teardown,
15576 			test_AES_GCM_authenticated_encryption_test_case_1),
15577 		TEST_CASE_ST(ut_setup, ut_teardown,
15578 			test_AES_GCM_authenticated_encryption_test_case_2),
15579 		TEST_CASE_ST(ut_setup, ut_teardown,
15580 			test_AES_GCM_authenticated_encryption_test_case_3),
15581 		TEST_CASE_ST(ut_setup, ut_teardown,
15582 			test_AES_GCM_authenticated_encryption_test_case_4),
15583 		TEST_CASE_ST(ut_setup, ut_teardown,
15584 			test_AES_GCM_authenticated_encryption_test_case_5),
15585 		TEST_CASE_ST(ut_setup, ut_teardown,
15586 			test_AES_GCM_authenticated_encryption_test_case_6),
15587 		TEST_CASE_ST(ut_setup, ut_teardown,
15588 			test_AES_GCM_authenticated_encryption_test_case_7),
15589 		TEST_CASE_ST(ut_setup, ut_teardown,
15590 			test_AES_GCM_authenticated_encryption_test_case_8),
15591 		TEST_CASE_ST(ut_setup, ut_teardown,
15592 			test_AES_GCM_J0_authenticated_encryption_test_case_1),
15593 
15594 		/** AES GCM Authenticated Decryption */
15595 		TEST_CASE_ST(ut_setup, ut_teardown,
15596 			test_AES_GCM_authenticated_decryption_test_case_1),
15597 		TEST_CASE_ST(ut_setup, ut_teardown,
15598 			test_AES_GCM_authenticated_decryption_test_case_2),
15599 		TEST_CASE_ST(ut_setup, ut_teardown,
15600 			test_AES_GCM_authenticated_decryption_test_case_3),
15601 		TEST_CASE_ST(ut_setup, ut_teardown,
15602 			test_AES_GCM_authenticated_decryption_test_case_4),
15603 		TEST_CASE_ST(ut_setup, ut_teardown,
15604 			test_AES_GCM_authenticated_decryption_test_case_5),
15605 		TEST_CASE_ST(ut_setup, ut_teardown,
15606 			test_AES_GCM_authenticated_decryption_test_case_6),
15607 		TEST_CASE_ST(ut_setup, ut_teardown,
15608 			test_AES_GCM_authenticated_decryption_test_case_7),
15609 		TEST_CASE_ST(ut_setup, ut_teardown,
15610 			test_AES_GCM_authenticated_decryption_test_case_8),
15611 		TEST_CASE_ST(ut_setup, ut_teardown,
15612 			test_AES_GCM_J0_authenticated_decryption_test_case_1),
15613 
15614 		/** AES GCM Authenticated Encryption 192 bits key */
15615 		TEST_CASE_ST(ut_setup, ut_teardown,
15616 			test_AES_GCM_auth_encryption_test_case_192_1),
15617 		TEST_CASE_ST(ut_setup, ut_teardown,
15618 			test_AES_GCM_auth_encryption_test_case_192_2),
15619 		TEST_CASE_ST(ut_setup, ut_teardown,
15620 			test_AES_GCM_auth_encryption_test_case_192_3),
15621 		TEST_CASE_ST(ut_setup, ut_teardown,
15622 			test_AES_GCM_auth_encryption_test_case_192_4),
15623 		TEST_CASE_ST(ut_setup, ut_teardown,
15624 			test_AES_GCM_auth_encryption_test_case_192_5),
15625 		TEST_CASE_ST(ut_setup, ut_teardown,
15626 			test_AES_GCM_auth_encryption_test_case_192_6),
15627 		TEST_CASE_ST(ut_setup, ut_teardown,
15628 			test_AES_GCM_auth_encryption_test_case_192_7),
15629 
15630 		/** AES GCM Authenticated Decryption 192 bits key */
15631 		TEST_CASE_ST(ut_setup, ut_teardown,
15632 			test_AES_GCM_auth_decryption_test_case_192_1),
15633 		TEST_CASE_ST(ut_setup, ut_teardown,
15634 			test_AES_GCM_auth_decryption_test_case_192_2),
15635 		TEST_CASE_ST(ut_setup, ut_teardown,
15636 			test_AES_GCM_auth_decryption_test_case_192_3),
15637 		TEST_CASE_ST(ut_setup, ut_teardown,
15638 			test_AES_GCM_auth_decryption_test_case_192_4),
15639 		TEST_CASE_ST(ut_setup, ut_teardown,
15640 			test_AES_GCM_auth_decryption_test_case_192_5),
15641 		TEST_CASE_ST(ut_setup, ut_teardown,
15642 			test_AES_GCM_auth_decryption_test_case_192_6),
15643 		TEST_CASE_ST(ut_setup, ut_teardown,
15644 			test_AES_GCM_auth_decryption_test_case_192_7),
15645 
15646 		/** AES GCM Authenticated Encryption 256 bits key */
15647 		TEST_CASE_ST(ut_setup, ut_teardown,
15648 			test_AES_GCM_auth_encryption_test_case_256_1),
15649 		TEST_CASE_ST(ut_setup, ut_teardown,
15650 			test_AES_GCM_auth_encryption_test_case_256_2),
15651 		TEST_CASE_ST(ut_setup, ut_teardown,
15652 			test_AES_GCM_auth_encryption_test_case_256_3),
15653 		TEST_CASE_ST(ut_setup, ut_teardown,
15654 			test_AES_GCM_auth_encryption_test_case_256_4),
15655 		TEST_CASE_ST(ut_setup, ut_teardown,
15656 			test_AES_GCM_auth_encryption_test_case_256_5),
15657 		TEST_CASE_ST(ut_setup, ut_teardown,
15658 			test_AES_GCM_auth_encryption_test_case_256_6),
15659 		TEST_CASE_ST(ut_setup, ut_teardown,
15660 			test_AES_GCM_auth_encryption_test_case_256_7),
15661 
15662 		/** AES GCM Authenticated Decryption 256 bits key */
15663 		TEST_CASE_ST(ut_setup, ut_teardown,
15664 			test_AES_GCM_auth_decryption_test_case_256_1),
15665 		TEST_CASE_ST(ut_setup, ut_teardown,
15666 			test_AES_GCM_auth_decryption_test_case_256_2),
15667 		TEST_CASE_ST(ut_setup, ut_teardown,
15668 			test_AES_GCM_auth_decryption_test_case_256_3),
15669 		TEST_CASE_ST(ut_setup, ut_teardown,
15670 			test_AES_GCM_auth_decryption_test_case_256_4),
15671 		TEST_CASE_ST(ut_setup, ut_teardown,
15672 			test_AES_GCM_auth_decryption_test_case_256_5),
15673 		TEST_CASE_ST(ut_setup, ut_teardown,
15674 			test_AES_GCM_auth_decryption_test_case_256_6),
15675 		TEST_CASE_ST(ut_setup, ut_teardown,
15676 			test_AES_GCM_auth_decryption_test_case_256_7),
15677 
15678 		/** AES GCM Authenticated Encryption big aad size */
15679 		TEST_CASE_ST(ut_setup, ut_teardown,
15680 			test_AES_GCM_auth_encryption_test_case_aad_1),
15681 		TEST_CASE_ST(ut_setup, ut_teardown,
15682 			test_AES_GCM_auth_encryption_test_case_aad_2),
15683 
15684 		/** AES GCM Authenticated Decryption big aad size */
15685 		TEST_CASE_ST(ut_setup, ut_teardown,
15686 			test_AES_GCM_auth_decryption_test_case_aad_1),
15687 		TEST_CASE_ST(ut_setup, ut_teardown,
15688 			test_AES_GCM_auth_decryption_test_case_aad_2),
15689 
15690 		/** Out of place tests */
15691 		TEST_CASE_ST(ut_setup, ut_teardown,
15692 			test_AES_GCM_authenticated_encryption_oop_test_case_1),
15693 		TEST_CASE_ST(ut_setup, ut_teardown,
15694 			test_AES_GCM_authenticated_decryption_oop_test_case_1),
15695 
15696 		/** Session-less tests */
15697 		TEST_CASE_ST(ut_setup, ut_teardown,
15698 			test_AES_GCM_authenticated_encryption_sessionless_test_case_1),
15699 		TEST_CASE_ST(ut_setup, ut_teardown,
15700 			test_AES_GCM_authenticated_decryption_sessionless_test_case_1),
15701 
15702 		TEST_CASES_END()
15703 	}
15704 };
15705 
15706 static struct unit_test_suite cryptodev_aes_gmac_auth_testsuite  = {
15707 	.suite_name = "AES GMAC Authentication Test Suite",
15708 	.setup = aes_gmac_auth_testsuite_setup,
15709 	.unit_test_cases = {
15710 		TEST_CASE_ST(ut_setup, ut_teardown,
15711 			test_AES_GMAC_authentication_test_case_1),
15712 		TEST_CASE_ST(ut_setup, ut_teardown,
15713 			test_AES_GMAC_authentication_verify_test_case_1),
15714 		TEST_CASE_ST(ut_setup, ut_teardown,
15715 			test_AES_GMAC_authentication_test_case_2),
15716 		TEST_CASE_ST(ut_setup, ut_teardown,
15717 			test_AES_GMAC_authentication_verify_test_case_2),
15718 		TEST_CASE_ST(ut_setup, ut_teardown,
15719 			test_AES_GMAC_authentication_test_case_3),
15720 		TEST_CASE_ST(ut_setup, ut_teardown,
15721 			test_AES_GMAC_authentication_verify_test_case_3),
15722 		TEST_CASE_ST(ut_setup, ut_teardown,
15723 			test_AES_GMAC_authentication_test_case_4),
15724 		TEST_CASE_ST(ut_setup, ut_teardown,
15725 			test_AES_GMAC_authentication_verify_test_case_4),
15726 		TEST_CASE_ST(ut_setup, ut_teardown,
15727 			test_AES_GMAC_authentication_SGL_40B),
15728 		TEST_CASE_ST(ut_setup, ut_teardown,
15729 			test_AES_GMAC_authentication_SGL_80B),
15730 		TEST_CASE_ST(ut_setup, ut_teardown,
15731 			test_AES_GMAC_authentication_SGL_2048B),
15732 		TEST_CASE_ST(ut_setup, ut_teardown,
15733 			test_AES_GMAC_authentication_SGL_2047B),
15734 
15735 		TEST_CASES_END()
15736 	}
15737 };
15738 
15739 static struct unit_test_suite cryptodev_chacha20_poly1305_testsuite  = {
15740 	.suite_name = "Chacha20-Poly1305 Test Suite",
15741 	.setup = chacha20_poly1305_testsuite_setup,
15742 	.unit_test_cases = {
15743 		TEST_CASE_ST(ut_setup, ut_teardown,
15744 			test_chacha20_poly1305_encrypt_test_case_rfc8439),
15745 		TEST_CASE_ST(ut_setup, ut_teardown,
15746 			test_chacha20_poly1305_decrypt_test_case_rfc8439),
15747 		TEST_CASE_ST(ut_setup, ut_teardown,
15748 			test_chacha20_poly1305_encrypt_SGL_out_of_place),
15749 		TEST_CASES_END()
15750 	}
15751 };
15752 
15753 static struct unit_test_suite cryptodev_snow3g_testsuite  = {
15754 	.suite_name = "SNOW 3G Test Suite",
15755 	.setup = snow3g_testsuite_setup,
15756 	.unit_test_cases = {
15757 		/** SNOW 3G encrypt only (UEA2) */
15758 		TEST_CASE_ST(ut_setup, ut_teardown,
15759 			test_snow3g_encryption_test_case_1),
15760 		TEST_CASE_ST(ut_setup, ut_teardown,
15761 			test_snow3g_encryption_test_case_2),
15762 		TEST_CASE_ST(ut_setup, ut_teardown,
15763 			test_snow3g_encryption_test_case_3),
15764 		TEST_CASE_ST(ut_setup, ut_teardown,
15765 			test_snow3g_encryption_test_case_4),
15766 		TEST_CASE_ST(ut_setup, ut_teardown,
15767 			test_snow3g_encryption_test_case_5),
15768 
15769 		TEST_CASE_ST(ut_setup, ut_teardown,
15770 			test_snow3g_encryption_test_case_1_oop),
15771 		TEST_CASE_ST(ut_setup, ut_teardown,
15772 			test_snow3g_encryption_test_case_1_oop_sgl),
15773 		TEST_CASE_ST(ut_setup, ut_teardown,
15774 			test_snow3g_encryption_test_case_1_offset_oop),
15775 		TEST_CASE_ST(ut_setup, ut_teardown,
15776 			test_snow3g_decryption_test_case_1_oop),
15777 
15778 		/** SNOW 3G generate auth, then encrypt (UEA2) */
15779 		TEST_CASE_ST(ut_setup, ut_teardown,
15780 			test_snow3g_auth_cipher_test_case_1),
15781 		TEST_CASE_ST(ut_setup, ut_teardown,
15782 			test_snow3g_auth_cipher_test_case_2),
15783 		TEST_CASE_ST(ut_setup, ut_teardown,
15784 			test_snow3g_auth_cipher_test_case_2_oop),
15785 		TEST_CASE_ST(ut_setup, ut_teardown,
15786 			test_snow3g_auth_cipher_part_digest_enc),
15787 		TEST_CASE_ST(ut_setup, ut_teardown,
15788 			test_snow3g_auth_cipher_part_digest_enc_oop),
15789 		TEST_CASE_ST(ut_setup, ut_teardown,
15790 			test_snow3g_auth_cipher_test_case_3_sgl),
15791 		TEST_CASE_ST(ut_setup, ut_teardown,
15792 			test_snow3g_auth_cipher_test_case_3_oop_sgl),
15793 		TEST_CASE_ST(ut_setup, ut_teardown,
15794 			test_snow3g_auth_cipher_part_digest_enc_sgl),
15795 		TEST_CASE_ST(ut_setup, ut_teardown,
15796 			test_snow3g_auth_cipher_part_digest_enc_oop_sgl),
15797 
15798 		/** SNOW 3G decrypt (UEA2), then verify auth */
15799 		TEST_CASE_ST(ut_setup, ut_teardown,
15800 			test_snow3g_auth_cipher_verify_test_case_1),
15801 		TEST_CASE_ST(ut_setup, ut_teardown,
15802 			test_snow3g_auth_cipher_verify_test_case_2),
15803 		TEST_CASE_ST(ut_setup, ut_teardown,
15804 			test_snow3g_auth_cipher_verify_test_case_2_oop),
15805 		TEST_CASE_ST(ut_setup, ut_teardown,
15806 			test_snow3g_auth_cipher_verify_part_digest_enc),
15807 		TEST_CASE_ST(ut_setup, ut_teardown,
15808 			test_snow3g_auth_cipher_verify_part_digest_enc_oop),
15809 		TEST_CASE_ST(ut_setup, ut_teardown,
15810 			test_snow3g_auth_cipher_verify_test_case_3_sgl),
15811 		TEST_CASE_ST(ut_setup, ut_teardown,
15812 			test_snow3g_auth_cipher_verify_test_case_3_oop_sgl),
15813 		TEST_CASE_ST(ut_setup, ut_teardown,
15814 			test_snow3g_auth_cipher_verify_part_digest_enc_sgl),
15815 		TEST_CASE_ST(ut_setup, ut_teardown,
15816 			test_snow3g_auth_cipher_verify_part_digest_enc_oop_sgl),
15817 
15818 		/** SNOW 3G decrypt only (UEA2) */
15819 		TEST_CASE_ST(ut_setup, ut_teardown,
15820 			test_snow3g_decryption_test_case_1),
15821 		TEST_CASE_ST(ut_setup, ut_teardown,
15822 			test_snow3g_decryption_test_case_2),
15823 		TEST_CASE_ST(ut_setup, ut_teardown,
15824 			test_snow3g_decryption_test_case_3),
15825 		TEST_CASE_ST(ut_setup, ut_teardown,
15826 			test_snow3g_decryption_test_case_4),
15827 		TEST_CASE_ST(ut_setup, ut_teardown,
15828 			test_snow3g_decryption_test_case_5),
15829 		TEST_CASE_ST(ut_setup, ut_teardown,
15830 			test_snow3g_decryption_with_digest_test_case_1),
15831 		TEST_CASE_ST(ut_setup, ut_teardown,
15832 			test_snow3g_hash_generate_test_case_1),
15833 		TEST_CASE_ST(ut_setup, ut_teardown,
15834 			test_snow3g_hash_generate_test_case_2),
15835 		TEST_CASE_ST(ut_setup, ut_teardown,
15836 			test_snow3g_hash_generate_test_case_3),
15837 
15838 		/* Tests with buffers which length is not byte-aligned */
15839 		TEST_CASE_ST(ut_setup, ut_teardown,
15840 			test_snow3g_hash_generate_test_case_4),
15841 		TEST_CASE_ST(ut_setup, ut_teardown,
15842 			test_snow3g_hash_generate_test_case_5),
15843 		TEST_CASE_ST(ut_setup, ut_teardown,
15844 			test_snow3g_hash_generate_test_case_6),
15845 		TEST_CASE_ST(ut_setup, ut_teardown,
15846 			test_snow3g_hash_verify_test_case_1),
15847 		TEST_CASE_ST(ut_setup, ut_teardown,
15848 			test_snow3g_hash_verify_test_case_2),
15849 		TEST_CASE_ST(ut_setup, ut_teardown,
15850 			test_snow3g_hash_verify_test_case_3),
15851 
15852 		/* Tests with buffers which length is not byte-aligned */
15853 		TEST_CASE_ST(ut_setup, ut_teardown,
15854 			test_snow3g_hash_verify_test_case_4),
15855 		TEST_CASE_ST(ut_setup, ut_teardown,
15856 			test_snow3g_hash_verify_test_case_5),
15857 		TEST_CASE_ST(ut_setup, ut_teardown,
15858 			test_snow3g_hash_verify_test_case_6),
15859 		TEST_CASE_ST(ut_setup, ut_teardown,
15860 			test_snow3g_cipher_auth_test_case_1),
15861 		TEST_CASE_ST(ut_setup, ut_teardown,
15862 			test_snow3g_auth_cipher_with_digest_test_case_1),
15863 		TEST_CASES_END()
15864 	}
15865 };
15866 
15867 static struct unit_test_suite cryptodev_zuc_testsuite  = {
15868 	.suite_name = "ZUC Test Suite",
15869 	.setup = zuc_testsuite_setup,
15870 	.unit_test_cases = {
15871 		/** ZUC encrypt only (EEA3) */
15872 		TEST_CASE_ST(ut_setup, ut_teardown,
15873 			test_zuc_encryption_test_case_1),
15874 		TEST_CASE_ST(ut_setup, ut_teardown,
15875 			test_zuc_encryption_test_case_2),
15876 		TEST_CASE_ST(ut_setup, ut_teardown,
15877 			test_zuc_encryption_test_case_3),
15878 		TEST_CASE_ST(ut_setup, ut_teardown,
15879 			test_zuc_encryption_test_case_4),
15880 		TEST_CASE_ST(ut_setup, ut_teardown,
15881 			test_zuc_encryption_test_case_5),
15882 		TEST_CASE_ST(ut_setup, ut_teardown,
15883 			test_zuc_encryption_test_case_6_sgl),
15884 
15885 		/** ZUC authenticate (EIA3) */
15886 		TEST_CASE_ST(ut_setup, ut_teardown,
15887 			test_zuc_hash_generate_test_case_1),
15888 		TEST_CASE_ST(ut_setup, ut_teardown,
15889 			test_zuc_hash_generate_test_case_2),
15890 		TEST_CASE_ST(ut_setup, ut_teardown,
15891 			test_zuc_hash_generate_test_case_3),
15892 		TEST_CASE_ST(ut_setup, ut_teardown,
15893 			test_zuc_hash_generate_test_case_4),
15894 		TEST_CASE_ST(ut_setup, ut_teardown,
15895 			test_zuc_hash_generate_test_case_5),
15896 		TEST_CASE_ST(ut_setup, ut_teardown,
15897 			test_zuc_hash_generate_test_case_6),
15898 		TEST_CASE_ST(ut_setup, ut_teardown,
15899 			test_zuc_hash_generate_test_case_7),
15900 		TEST_CASE_ST(ut_setup, ut_teardown,
15901 			test_zuc_hash_generate_test_case_8),
15902 		TEST_CASE_ST(ut_setup, ut_teardown,
15903 			test_zuc_hash_generate_test_case_9),
15904 		TEST_CASE_ST(ut_setup, ut_teardown,
15905 			test_zuc_hash_generate_test_case_10),
15906 		TEST_CASE_ST(ut_setup, ut_teardown,
15907 			test_zuc_hash_generate_test_case_11),
15908 
15909 
15910 		/** ZUC alg-chain (EEA3/EIA3) */
15911 		TEST_CASE_ST(ut_setup, ut_teardown,
15912 			test_zuc_cipher_auth_test_case_1),
15913 		TEST_CASE_ST(ut_setup, ut_teardown,
15914 			test_zuc_cipher_auth_test_case_2),
15915 
15916 		/** ZUC generate auth, then encrypt (EEA3) */
15917 		TEST_CASE_ST(ut_setup, ut_teardown,
15918 			test_zuc_auth_cipher_test_case_1),
15919 		TEST_CASE_ST(ut_setup, ut_teardown,
15920 			test_zuc_auth_cipher_test_case_1_oop),
15921 		TEST_CASE_ST(ut_setup, ut_teardown,
15922 			test_zuc_auth_cipher_test_case_1_sgl),
15923 		TEST_CASE_ST(ut_setup, ut_teardown,
15924 			test_zuc_auth_cipher_test_case_1_oop_sgl),
15925 
15926 		/** ZUC decrypt (EEA3), then verify auth */
15927 		TEST_CASE_ST(ut_setup, ut_teardown,
15928 			test_zuc_auth_cipher_verify_test_case_1),
15929 		TEST_CASE_ST(ut_setup, ut_teardown,
15930 			test_zuc_auth_cipher_verify_test_case_1_oop),
15931 		TEST_CASE_ST(ut_setup, ut_teardown,
15932 			test_zuc_auth_cipher_verify_test_case_1_sgl),
15933 		TEST_CASE_ST(ut_setup, ut_teardown,
15934 			test_zuc_auth_cipher_verify_test_case_1_oop_sgl),
15935 
15936 		/** ZUC-256 encrypt only **/
15937 		TEST_CASE_ST(ut_setup, ut_teardown,
15938 			test_zuc256_encryption_test_case_1),
15939 		TEST_CASE_ST(ut_setup, ut_teardown,
15940 			test_zuc256_encryption_test_case_2),
15941 
15942 		/** ZUC-256 authentication only **/
15943 		TEST_CASE_ST(ut_setup, ut_teardown,
15944 			test_zuc256_authentication_test_case_1),
15945 		TEST_CASE_ST(ut_setup, ut_teardown,
15946 			test_zuc256_authentication_test_case_2),
15947 
15948 		TEST_CASES_END()
15949 	}
15950 };
15951 
15952 static struct unit_test_suite cryptodev_hmac_md5_auth_testsuite  = {
15953 	.suite_name = "HMAC_MD5 Authentication Test Suite",
15954 	.setup = hmac_md5_auth_testsuite_setup,
15955 	.unit_test_cases = {
15956 		TEST_CASE_ST(ut_setup, ut_teardown,
15957 			test_MD5_HMAC_generate_case_1),
15958 		TEST_CASE_ST(ut_setup, ut_teardown,
15959 			test_MD5_HMAC_verify_case_1),
15960 		TEST_CASE_ST(ut_setup, ut_teardown,
15961 			test_MD5_HMAC_generate_case_2),
15962 		TEST_CASE_ST(ut_setup, ut_teardown,
15963 			test_MD5_HMAC_verify_case_2),
15964 		TEST_CASES_END()
15965 	}
15966 };
15967 
15968 static struct unit_test_suite cryptodev_kasumi_testsuite  = {
15969 	.suite_name = "Kasumi Test Suite",
15970 	.setup = kasumi_testsuite_setup,
15971 	.unit_test_cases = {
15972 		/** KASUMI hash only (UIA1) */
15973 		TEST_CASE_ST(ut_setup, ut_teardown,
15974 			test_kasumi_hash_generate_test_case_1),
15975 		TEST_CASE_ST(ut_setup, ut_teardown,
15976 			test_kasumi_hash_generate_test_case_2),
15977 		TEST_CASE_ST(ut_setup, ut_teardown,
15978 			test_kasumi_hash_generate_test_case_3),
15979 		TEST_CASE_ST(ut_setup, ut_teardown,
15980 			test_kasumi_hash_generate_test_case_4),
15981 		TEST_CASE_ST(ut_setup, ut_teardown,
15982 			test_kasumi_hash_generate_test_case_5),
15983 		TEST_CASE_ST(ut_setup, ut_teardown,
15984 			test_kasumi_hash_generate_test_case_6),
15985 
15986 		TEST_CASE_ST(ut_setup, ut_teardown,
15987 			test_kasumi_hash_verify_test_case_1),
15988 		TEST_CASE_ST(ut_setup, ut_teardown,
15989 			test_kasumi_hash_verify_test_case_2),
15990 		TEST_CASE_ST(ut_setup, ut_teardown,
15991 			test_kasumi_hash_verify_test_case_3),
15992 		TEST_CASE_ST(ut_setup, ut_teardown,
15993 			test_kasumi_hash_verify_test_case_4),
15994 		TEST_CASE_ST(ut_setup, ut_teardown,
15995 			test_kasumi_hash_verify_test_case_5),
15996 
15997 		/** KASUMI encrypt only (UEA1) */
15998 		TEST_CASE_ST(ut_setup, ut_teardown,
15999 			test_kasumi_encryption_test_case_1),
16000 		TEST_CASE_ST(ut_setup, ut_teardown,
16001 			test_kasumi_encryption_test_case_1_sgl),
16002 		TEST_CASE_ST(ut_setup, ut_teardown,
16003 			test_kasumi_encryption_test_case_1_oop),
16004 		TEST_CASE_ST(ut_setup, ut_teardown,
16005 			test_kasumi_encryption_test_case_1_oop_sgl),
16006 		TEST_CASE_ST(ut_setup, ut_teardown,
16007 			test_kasumi_encryption_test_case_2),
16008 		TEST_CASE_ST(ut_setup, ut_teardown,
16009 			test_kasumi_encryption_test_case_3),
16010 		TEST_CASE_ST(ut_setup, ut_teardown,
16011 			test_kasumi_encryption_test_case_4),
16012 		TEST_CASE_ST(ut_setup, ut_teardown,
16013 			test_kasumi_encryption_test_case_5),
16014 
16015 		/** KASUMI decrypt only (UEA1) */
16016 		TEST_CASE_ST(ut_setup, ut_teardown,
16017 			test_kasumi_decryption_test_case_1),
16018 		TEST_CASE_ST(ut_setup, ut_teardown,
16019 			test_kasumi_decryption_test_case_2),
16020 		TEST_CASE_ST(ut_setup, ut_teardown,
16021 			test_kasumi_decryption_test_case_3),
16022 		TEST_CASE_ST(ut_setup, ut_teardown,
16023 			test_kasumi_decryption_test_case_4),
16024 		TEST_CASE_ST(ut_setup, ut_teardown,
16025 			test_kasumi_decryption_test_case_5),
16026 		TEST_CASE_ST(ut_setup, ut_teardown,
16027 			test_kasumi_decryption_test_case_1_oop),
16028 		TEST_CASE_ST(ut_setup, ut_teardown,
16029 			test_kasumi_cipher_auth_test_case_1),
16030 
16031 		/** KASUMI generate auth, then encrypt (F8) */
16032 		TEST_CASE_ST(ut_setup, ut_teardown,
16033 			test_kasumi_auth_cipher_test_case_1),
16034 		TEST_CASE_ST(ut_setup, ut_teardown,
16035 			test_kasumi_auth_cipher_test_case_2),
16036 		TEST_CASE_ST(ut_setup, ut_teardown,
16037 			test_kasumi_auth_cipher_test_case_2_oop),
16038 		TEST_CASE_ST(ut_setup, ut_teardown,
16039 			test_kasumi_auth_cipher_test_case_2_sgl),
16040 		TEST_CASE_ST(ut_setup, ut_teardown,
16041 			test_kasumi_auth_cipher_test_case_2_oop_sgl),
16042 
16043 		/** KASUMI decrypt (F8), then verify auth */
16044 		TEST_CASE_ST(ut_setup, ut_teardown,
16045 			test_kasumi_auth_cipher_verify_test_case_1),
16046 		TEST_CASE_ST(ut_setup, ut_teardown,
16047 			test_kasumi_auth_cipher_verify_test_case_2),
16048 		TEST_CASE_ST(ut_setup, ut_teardown,
16049 			test_kasumi_auth_cipher_verify_test_case_2_oop),
16050 		TEST_CASE_ST(ut_setup, ut_teardown,
16051 			test_kasumi_auth_cipher_verify_test_case_2_sgl),
16052 		TEST_CASE_ST(ut_setup, ut_teardown,
16053 			test_kasumi_auth_cipher_verify_test_case_2_oop_sgl),
16054 
16055 		TEST_CASES_END()
16056 	}
16057 };
16058 
16059 static struct unit_test_suite cryptodev_esn_testsuite  = {
16060 	.suite_name = "ESN Test Suite",
16061 	.setup = esn_testsuite_setup,
16062 	.unit_test_cases = {
16063 		TEST_CASE_ST(ut_setup, ut_teardown,
16064 			auth_encrypt_AES128CBC_HMAC_SHA1_esn_check),
16065 		TEST_CASE_ST(ut_setup, ut_teardown,
16066 			auth_decrypt_AES128CBC_HMAC_SHA1_esn_check),
16067 		TEST_CASES_END()
16068 	}
16069 };
16070 
16071 static struct unit_test_suite cryptodev_negative_aes_gcm_testsuite  = {
16072 	.suite_name = "Negative AES GCM Test Suite",
16073 	.setup = negative_aes_gcm_testsuite_setup,
16074 	.unit_test_cases = {
16075 		TEST_CASE_ST(ut_setup, ut_teardown,
16076 			test_AES_GCM_auth_encryption_fail_iv_corrupt),
16077 		TEST_CASE_ST(ut_setup, ut_teardown,
16078 			test_AES_GCM_auth_encryption_fail_in_data_corrupt),
16079 		TEST_CASE_ST(ut_setup, ut_teardown,
16080 			test_AES_GCM_auth_encryption_fail_out_data_corrupt),
16081 		TEST_CASE_ST(ut_setup, ut_teardown,
16082 			test_AES_GCM_auth_encryption_fail_aad_len_corrupt),
16083 		TEST_CASE_ST(ut_setup, ut_teardown,
16084 			test_AES_GCM_auth_encryption_fail_aad_corrupt),
16085 		TEST_CASE_ST(ut_setup, ut_teardown,
16086 			test_AES_GCM_auth_encryption_fail_tag_corrupt),
16087 		TEST_CASE_ST(ut_setup, ut_teardown,
16088 			test_AES_GCM_auth_decryption_fail_iv_corrupt),
16089 		TEST_CASE_ST(ut_setup, ut_teardown,
16090 			test_AES_GCM_auth_decryption_fail_in_data_corrupt),
16091 		TEST_CASE_ST(ut_setup, ut_teardown,
16092 			test_AES_GCM_auth_decryption_fail_out_data_corrupt),
16093 		TEST_CASE_ST(ut_setup, ut_teardown,
16094 			test_AES_GCM_auth_decryption_fail_aad_len_corrupt),
16095 		TEST_CASE_ST(ut_setup, ut_teardown,
16096 			test_AES_GCM_auth_decryption_fail_aad_corrupt),
16097 		TEST_CASE_ST(ut_setup, ut_teardown,
16098 			test_AES_GCM_auth_decryption_fail_tag_corrupt),
16099 
16100 		TEST_CASES_END()
16101 	}
16102 };
16103 
16104 static struct unit_test_suite cryptodev_negative_aes_gmac_testsuite  = {
16105 	.suite_name = "Negative AES GMAC Test Suite",
16106 	.setup = negative_aes_gmac_testsuite_setup,
16107 	.unit_test_cases = {
16108 		TEST_CASE_ST(ut_setup, ut_teardown,
16109 			authentication_verify_AES128_GMAC_fail_data_corrupt),
16110 		TEST_CASE_ST(ut_setup, ut_teardown,
16111 			authentication_verify_AES128_GMAC_fail_tag_corrupt),
16112 
16113 		TEST_CASES_END()
16114 	}
16115 };
16116 
16117 static struct unit_test_suite cryptodev_mixed_cipher_hash_testsuite  = {
16118 	.suite_name = "Mixed CIPHER + HASH algorithms Test Suite",
16119 	.setup = mixed_cipher_hash_testsuite_setup,
16120 	.unit_test_cases = {
16121 		/** AUTH AES CMAC + CIPHER AES CTR */
16122 		TEST_CASE_ST(ut_setup, ut_teardown,
16123 			test_aes_cmac_aes_ctr_digest_enc_test_case_1),
16124 		TEST_CASE_ST(ut_setup, ut_teardown,
16125 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16126 		TEST_CASE_ST(ut_setup, ut_teardown,
16127 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16128 		TEST_CASE_ST(ut_setup, ut_teardown,
16129 			test_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16130 		TEST_CASE_ST(ut_setup, ut_teardown,
16131 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1),
16132 		TEST_CASE_ST(ut_setup, ut_teardown,
16133 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop),
16134 		TEST_CASE_ST(ut_setup, ut_teardown,
16135 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_sgl),
16136 		TEST_CASE_ST(ut_setup, ut_teardown,
16137 			test_verify_aes_cmac_aes_ctr_digest_enc_test_case_1_oop_sgl),
16138 
16139 		/** AUTH ZUC + CIPHER SNOW3G */
16140 		TEST_CASE_ST(ut_setup, ut_teardown,
16141 			test_auth_zuc_cipher_snow_test_case_1),
16142 		TEST_CASE_ST(ut_setup, ut_teardown,
16143 			test_verify_auth_zuc_cipher_snow_test_case_1),
16144 		/** AUTH AES CMAC + CIPHER SNOW3G */
16145 		TEST_CASE_ST(ut_setup, ut_teardown,
16146 			test_auth_aes_cmac_cipher_snow_test_case_1),
16147 		TEST_CASE_ST(ut_setup, ut_teardown,
16148 			test_verify_auth_aes_cmac_cipher_snow_test_case_1),
16149 		/** AUTH ZUC + CIPHER AES CTR */
16150 		TEST_CASE_ST(ut_setup, ut_teardown,
16151 			test_auth_zuc_cipher_aes_ctr_test_case_1),
16152 		TEST_CASE_ST(ut_setup, ut_teardown,
16153 			test_verify_auth_zuc_cipher_aes_ctr_test_case_1),
16154 		/** AUTH SNOW3G + CIPHER AES CTR */
16155 		TEST_CASE_ST(ut_setup, ut_teardown,
16156 			test_auth_snow_cipher_aes_ctr_test_case_1),
16157 		TEST_CASE_ST(ut_setup, ut_teardown,
16158 			test_verify_auth_snow_cipher_aes_ctr_test_case_1),
16159 		/** AUTH SNOW3G + CIPHER ZUC */
16160 		TEST_CASE_ST(ut_setup, ut_teardown,
16161 			test_auth_snow_cipher_zuc_test_case_1),
16162 		TEST_CASE_ST(ut_setup, ut_teardown,
16163 			test_verify_auth_snow_cipher_zuc_test_case_1),
16164 		/** AUTH AES CMAC + CIPHER ZUC */
16165 		TEST_CASE_ST(ut_setup, ut_teardown,
16166 			test_auth_aes_cmac_cipher_zuc_test_case_1),
16167 		TEST_CASE_ST(ut_setup, ut_teardown,
16168 			test_verify_auth_aes_cmac_cipher_zuc_test_case_1),
16169 
16170 		/** AUTH NULL + CIPHER SNOW3G */
16171 		TEST_CASE_ST(ut_setup, ut_teardown,
16172 			test_auth_null_cipher_snow_test_case_1),
16173 		TEST_CASE_ST(ut_setup, ut_teardown,
16174 			test_verify_auth_null_cipher_snow_test_case_1),
16175 		/** AUTH NULL + CIPHER ZUC */
16176 		TEST_CASE_ST(ut_setup, ut_teardown,
16177 			test_auth_null_cipher_zuc_test_case_1),
16178 		TEST_CASE_ST(ut_setup, ut_teardown,
16179 			test_verify_auth_null_cipher_zuc_test_case_1),
16180 		/** AUTH SNOW3G + CIPHER NULL */
16181 		TEST_CASE_ST(ut_setup, ut_teardown,
16182 			test_auth_snow_cipher_null_test_case_1),
16183 		TEST_CASE_ST(ut_setup, ut_teardown,
16184 			test_verify_auth_snow_cipher_null_test_case_1),
16185 		/** AUTH ZUC + CIPHER NULL */
16186 		TEST_CASE_ST(ut_setup, ut_teardown,
16187 			test_auth_zuc_cipher_null_test_case_1),
16188 		TEST_CASE_ST(ut_setup, ut_teardown,
16189 			test_verify_auth_zuc_cipher_null_test_case_1),
16190 		/** AUTH NULL + CIPHER AES CTR */
16191 		TEST_CASE_ST(ut_setup, ut_teardown,
16192 			test_auth_null_cipher_aes_ctr_test_case_1),
16193 		TEST_CASE_ST(ut_setup, ut_teardown,
16194 			test_verify_auth_null_cipher_aes_ctr_test_case_1),
16195 		/** AUTH AES CMAC + CIPHER NULL */
16196 		TEST_CASE_ST(ut_setup, ut_teardown,
16197 			test_auth_aes_cmac_cipher_null_test_case_1),
16198 		TEST_CASE_ST(ut_setup, ut_teardown,
16199 			test_verify_auth_aes_cmac_cipher_null_test_case_1),
16200 		TEST_CASES_END()
16201 	}
16202 };
16203 
16204 static int
16205 run_cryptodev_testsuite(const char *pmd_name)
16206 {
16207 	uint8_t ret, j, i = 0, blk_start_idx = 0;
16208 	const enum blockcipher_test_type blk_suites[] = {
16209 		BLKCIPHER_AES_CHAIN_TYPE,
16210 		BLKCIPHER_AES_CIPHERONLY_TYPE,
16211 		BLKCIPHER_AES_DOCSIS_TYPE,
16212 		BLKCIPHER_3DES_CHAIN_TYPE,
16213 		BLKCIPHER_3DES_CIPHERONLY_TYPE,
16214 		BLKCIPHER_DES_CIPHERONLY_TYPE,
16215 		BLKCIPHER_DES_DOCSIS_TYPE,
16216 		BLKCIPHER_AUTHONLY_TYPE};
16217 	struct unit_test_suite *static_suites[] = {
16218 		&cryptodev_multi_session_testsuite,
16219 		&cryptodev_null_testsuite,
16220 		&cryptodev_aes_ccm_auth_testsuite,
16221 		&cryptodev_aes_gcm_auth_testsuite,
16222 		&cryptodev_aes_gmac_auth_testsuite,
16223 		&cryptodev_snow3g_testsuite,
16224 		&cryptodev_chacha20_poly1305_testsuite,
16225 		&cryptodev_zuc_testsuite,
16226 		&cryptodev_hmac_md5_auth_testsuite,
16227 		&cryptodev_kasumi_testsuite,
16228 		&cryptodev_esn_testsuite,
16229 		&cryptodev_negative_aes_gcm_testsuite,
16230 		&cryptodev_negative_aes_gmac_testsuite,
16231 		&cryptodev_mixed_cipher_hash_testsuite,
16232 		&cryptodev_negative_hmac_sha1_testsuite,
16233 		&cryptodev_gen_testsuite,
16234 #ifdef RTE_LIB_SECURITY
16235 		&ipsec_proto_testsuite,
16236 		&pdcp_proto_testsuite,
16237 		&docsis_proto_testsuite,
16238 #endif
16239 		&end_testsuite
16240 	};
16241 	static struct unit_test_suite ts = {
16242 		.suite_name = "Cryptodev Unit Test Suite",
16243 		.setup = testsuite_setup,
16244 		.teardown = testsuite_teardown,
16245 		.unit_test_cases = {TEST_CASES_END()}
16246 	};
16247 
16248 	gbl_driver_id = rte_cryptodev_driver_id_get(pmd_name);
16249 
16250 	if (gbl_driver_id == -1) {
16251 		RTE_LOG(ERR, USER1, "%s PMD must be loaded.\n", pmd_name);
16252 		return TEST_SKIPPED;
16253 	}
16254 
16255 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16256 			(RTE_DIM(blk_suites) + RTE_DIM(static_suites)));
16257 
16258 	ADD_BLOCKCIPHER_TESTSUITE(i, ts, blk_suites, RTE_DIM(blk_suites));
16259 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16260 	ret = unit_test_suite_runner(&ts);
16261 
16262 	FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx, ts, RTE_DIM(blk_suites));
16263 	free(ts.unit_test_suites);
16264 	return ret;
16265 }
16266 
16267 static int
16268 require_feature_flag(const char *pmd_name, uint64_t flag, const char *flag_name)
16269 {
16270 	struct rte_cryptodev_info dev_info;
16271 	uint8_t i, nb_devs;
16272 	int driver_id;
16273 
16274 	driver_id = rte_cryptodev_driver_id_get(pmd_name);
16275 	if (driver_id == -1) {
16276 		RTE_LOG(WARNING, USER1, "%s PMD must be loaded.\n", pmd_name);
16277 		return TEST_SKIPPED;
16278 	}
16279 
16280 	nb_devs = rte_cryptodev_count();
16281 	if (nb_devs < 1) {
16282 		RTE_LOG(WARNING, USER1, "No crypto devices found?\n");
16283 		return TEST_SKIPPED;
16284 	}
16285 
16286 	for (i = 0; i < nb_devs; i++) {
16287 		rte_cryptodev_info_get(i, &dev_info);
16288 		if (dev_info.driver_id == driver_id) {
16289 			if (!(dev_info.feature_flags & flag)) {
16290 				RTE_LOG(INFO, USER1, "%s not supported\n",
16291 						flag_name);
16292 				return TEST_SKIPPED;
16293 			}
16294 			return 0; /* found */
16295 		}
16296 	}
16297 
16298 	RTE_LOG(INFO, USER1, "%s not supported\n", flag_name);
16299 	return TEST_SKIPPED;
16300 }
16301 
16302 static int
16303 test_cryptodev_qat(void)
16304 {
16305 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD));
16306 }
16307 
16308 static int
16309 test_cryptodev_virtio(void)
16310 {
16311 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_VIRTIO_PMD));
16312 }
16313 
16314 static int
16315 test_cryptodev_aesni_mb(void)
16316 {
16317 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16318 }
16319 
16320 static int
16321 test_cryptodev_cpu_aesni_mb(void)
16322 {
16323 	int32_t rc;
16324 	enum rte_security_session_action_type at = gbl_action_type;
16325 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16326 	rc = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD));
16327 	gbl_action_type = at;
16328 	return rc;
16329 }
16330 
16331 static int
16332 test_cryptodev_chacha_poly_mb(void)
16333 {
16334 	int32_t rc;
16335 	enum rte_security_session_action_type at = gbl_action_type;
16336 	rc = run_cryptodev_testsuite(
16337 			RTE_STR(CRYPTODEV_NAME_CHACHA20_POLY1305_PMD));
16338 	gbl_action_type = at;
16339 	return rc;
16340 }
16341 
16342 static int
16343 test_cryptodev_openssl(void)
16344 {
16345 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OPENSSL_PMD));
16346 }
16347 
16348 static int
16349 test_cryptodev_aesni_gcm(void)
16350 {
16351 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16352 }
16353 
16354 static int
16355 test_cryptodev_cpu_aesni_gcm(void)
16356 {
16357 	int32_t rc;
16358 	enum rte_security_session_action_type at = gbl_action_type;
16359 	gbl_action_type = RTE_SECURITY_ACTION_TYPE_CPU_CRYPTO;
16360 	rc  = run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_AESNI_GCM_PMD));
16361 	gbl_action_type = at;
16362 	return rc;
16363 }
16364 
16365 static int
16366 test_cryptodev_mlx5(void)
16367 {
16368 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MLX5_PMD));
16369 }
16370 
16371 static int
16372 test_cryptodev_null(void)
16373 {
16374 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NULL_PMD));
16375 }
16376 
16377 static int
16378 test_cryptodev_sw_snow3g(void)
16379 {
16380 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_SNOW3G_PMD));
16381 }
16382 
16383 static int
16384 test_cryptodev_sw_kasumi(void)
16385 {
16386 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_KASUMI_PMD));
16387 }
16388 
16389 static int
16390 test_cryptodev_sw_zuc(void)
16391 {
16392 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ZUC_PMD));
16393 }
16394 
16395 static int
16396 test_cryptodev_armv8(void)
16397 {
16398 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_ARMV8_PMD));
16399 }
16400 
16401 static int
16402 test_cryptodev_mrvl(void)
16403 {
16404 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_MVSAM_PMD));
16405 }
16406 
16407 #ifdef RTE_CRYPTO_SCHEDULER
16408 
16409 static int
16410 test_cryptodev_scheduler(void)
16411 {
16412 	uint8_t ret, sched_i, j, i = 0, blk_start_idx = 0;
16413 	const enum blockcipher_test_type blk_suites[] = {
16414 		BLKCIPHER_AES_CHAIN_TYPE,
16415 		BLKCIPHER_AES_CIPHERONLY_TYPE,
16416 		BLKCIPHER_AUTHONLY_TYPE
16417 	};
16418 	static struct unit_test_suite scheduler_multicore = {
16419 		.suite_name = "Scheduler Multicore Unit Test Suite",
16420 		.setup = scheduler_multicore_testsuite_setup,
16421 		.teardown = scheduler_mode_testsuite_teardown,
16422 		.unit_test_cases = {TEST_CASES_END()}
16423 	};
16424 	static struct unit_test_suite scheduler_round_robin = {
16425 		.suite_name = "Scheduler Round Robin Unit Test Suite",
16426 		.setup = scheduler_roundrobin_testsuite_setup,
16427 		.teardown = scheduler_mode_testsuite_teardown,
16428 		.unit_test_cases = {TEST_CASES_END()}
16429 	};
16430 	static struct unit_test_suite scheduler_failover = {
16431 		.suite_name = "Scheduler Failover Unit Test Suite",
16432 		.setup = scheduler_failover_testsuite_setup,
16433 		.teardown = scheduler_mode_testsuite_teardown,
16434 		.unit_test_cases = {TEST_CASES_END()}
16435 	};
16436 	static struct unit_test_suite scheduler_pkt_size_distr = {
16437 		.suite_name = "Scheduler Pkt Size Distr Unit Test Suite",
16438 		.setup = scheduler_pkt_size_distr_testsuite_setup,
16439 		.teardown = scheduler_mode_testsuite_teardown,
16440 		.unit_test_cases = {TEST_CASES_END()}
16441 	};
16442 	struct unit_test_suite *sched_mode_suites[] = {
16443 		&scheduler_multicore,
16444 		&scheduler_round_robin,
16445 		&scheduler_failover,
16446 		&scheduler_pkt_size_distr
16447 	};
16448 	static struct unit_test_suite scheduler_config = {
16449 		.suite_name = "Crypto Device Scheduler Config Unit Test Suite",
16450 		.unit_test_cases = {
16451 			TEST_CASE(test_scheduler_attach_worker_op),
16452 			TEST_CASE(test_scheduler_mode_multicore_op),
16453 			TEST_CASE(test_scheduler_mode_roundrobin_op),
16454 			TEST_CASE(test_scheduler_mode_failover_op),
16455 			TEST_CASE(test_scheduler_mode_pkt_size_distr_op),
16456 			TEST_CASE(test_scheduler_detach_worker_op),
16457 
16458 			TEST_CASES_END() /**< NULL terminate array */
16459 		}
16460 	};
16461 	struct unit_test_suite *static_suites[] = {
16462 		&scheduler_config,
16463 		&end_testsuite
16464 	};
16465 	static struct unit_test_suite ts = {
16466 		.suite_name = "Scheduler Unit Test Suite",
16467 		.setup = scheduler_testsuite_setup,
16468 		.teardown = testsuite_teardown,
16469 		.unit_test_cases = {TEST_CASES_END()}
16470 	};
16471 
16472 	gbl_driver_id =	rte_cryptodev_driver_id_get(
16473 			RTE_STR(CRYPTODEV_NAME_SCHEDULER_PMD));
16474 
16475 	if (gbl_driver_id == -1) {
16476 		RTE_LOG(ERR, USER1, "SCHEDULER PMD must be loaded.\n");
16477 		return TEST_SKIPPED;
16478 	}
16479 
16480 	if (rte_cryptodev_driver_id_get(
16481 				RTE_STR(CRYPTODEV_NAME_AESNI_MB_PMD)) == -1) {
16482 		RTE_LOG(ERR, USER1, "AESNI MB PMD must be loaded.\n");
16483 		return TEST_SKIPPED;
16484 	}
16485 
16486 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16487 		uint8_t blk_i = 0;
16488 		sched_mode_suites[sched_i]->unit_test_suites = malloc(sizeof
16489 				(struct unit_test_suite *) *
16490 				(RTE_DIM(blk_suites) + 1));
16491 		ADD_BLOCKCIPHER_TESTSUITE(blk_i, (*sched_mode_suites[sched_i]),
16492 				blk_suites, RTE_DIM(blk_suites));
16493 		sched_mode_suites[sched_i]->unit_test_suites[blk_i] = &end_testsuite;
16494 	}
16495 
16496 	ts.unit_test_suites = malloc(sizeof(struct unit_test_suite *) *
16497 			(RTE_DIM(static_suites) + RTE_DIM(sched_mode_suites)));
16498 	ADD_STATIC_TESTSUITE(i, ts, sched_mode_suites,
16499 			RTE_DIM(sched_mode_suites));
16500 	ADD_STATIC_TESTSUITE(i, ts, static_suites, RTE_DIM(static_suites));
16501 	ret = unit_test_suite_runner(&ts);
16502 
16503 	for (sched_i = 0; sched_i < RTE_DIM(sched_mode_suites); sched_i++) {
16504 		FREE_BLOCKCIPHER_TESTSUITE(blk_start_idx,
16505 				(*sched_mode_suites[sched_i]),
16506 				RTE_DIM(blk_suites));
16507 		free(sched_mode_suites[sched_i]->unit_test_suites);
16508 	}
16509 	free(ts.unit_test_suites);
16510 	return ret;
16511 }
16512 
16513 REGISTER_TEST_COMMAND(cryptodev_scheduler_autotest, test_cryptodev_scheduler);
16514 
16515 #endif
16516 
16517 static int
16518 test_cryptodev_dpaa2_sec(void)
16519 {
16520 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD));
16521 }
16522 
16523 static int
16524 test_cryptodev_dpaa_sec(void)
16525 {
16526 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD));
16527 }
16528 
16529 static int
16530 test_cryptodev_ccp(void)
16531 {
16532 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CCP_PMD));
16533 }
16534 
16535 static int
16536 test_cryptodev_octeontx(void)
16537 {
16538 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_OCTEONTX_SYM_PMD));
16539 }
16540 
16541 static int
16542 test_cryptodev_caam_jr(void)
16543 {
16544 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CAAM_JR_PMD));
16545 }
16546 
16547 static int
16548 test_cryptodev_nitrox(void)
16549 {
16550 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_NITROX_PMD));
16551 }
16552 
16553 static int
16554 test_cryptodev_bcmfs(void)
16555 {
16556 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_BCMFS_PMD));
16557 }
16558 
16559 static int
16560 test_cryptodev_qat_raw_api(void)
16561 {
16562 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_QAT_SYM_PMD);
16563 	int ret;
16564 
16565 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16566 			"RAW API");
16567 	if (ret)
16568 		return ret;
16569 
16570 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16571 	ret = run_cryptodev_testsuite(pmd_name);
16572 	global_api_test_type = CRYPTODEV_API_TEST;
16573 
16574 	return ret;
16575 }
16576 
16577 static int
16578 test_cryptodev_cn9k(void)
16579 {
16580 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN9K_PMD));
16581 }
16582 
16583 static int
16584 test_cryptodev_cn10k(void)
16585 {
16586 	return run_cryptodev_testsuite(RTE_STR(CRYPTODEV_NAME_CN10K_PMD));
16587 }
16588 
16589 static int
16590 test_cryptodev_dpaa2_sec_raw_api(void)
16591 {
16592 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA2_SEC_PMD);
16593 	int ret;
16594 
16595 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16596 			"RAW API");
16597 	if (ret)
16598 		return ret;
16599 
16600 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16601 	ret = run_cryptodev_testsuite(pmd_name);
16602 	global_api_test_type = CRYPTODEV_API_TEST;
16603 
16604 	return ret;
16605 }
16606 
16607 static int
16608 test_cryptodev_dpaa_sec_raw_api(void)
16609 {
16610 	static const char *pmd_name = RTE_STR(CRYPTODEV_NAME_DPAA_SEC_PMD);
16611 	int ret;
16612 
16613 	ret = require_feature_flag(pmd_name, RTE_CRYPTODEV_FF_SYM_RAW_DP,
16614 			"RAW API");
16615 	if (ret)
16616 		return ret;
16617 
16618 	global_api_test_type = CRYPTODEV_RAW_API_TEST;
16619 	ret = run_cryptodev_testsuite(pmd_name);
16620 	global_api_test_type = CRYPTODEV_API_TEST;
16621 
16622 	return ret;
16623 }
16624 
16625 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_raw_api_autotest,
16626 		test_cryptodev_dpaa2_sec_raw_api);
16627 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_raw_api_autotest,
16628 		test_cryptodev_dpaa_sec_raw_api);
16629 REGISTER_TEST_COMMAND(cryptodev_qat_raw_api_autotest,
16630 		test_cryptodev_qat_raw_api);
16631 REGISTER_TEST_COMMAND(cryptodev_qat_autotest, test_cryptodev_qat);
16632 REGISTER_TEST_COMMAND(cryptodev_aesni_mb_autotest, test_cryptodev_aesni_mb);
16633 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_mb_autotest,
16634 	test_cryptodev_cpu_aesni_mb);
16635 REGISTER_TEST_COMMAND(cryptodev_chacha_poly_mb_autotest,
16636 	test_cryptodev_chacha_poly_mb);
16637 REGISTER_TEST_COMMAND(cryptodev_openssl_autotest, test_cryptodev_openssl);
16638 REGISTER_TEST_COMMAND(cryptodev_aesni_gcm_autotest, test_cryptodev_aesni_gcm);
16639 REGISTER_TEST_COMMAND(cryptodev_cpu_aesni_gcm_autotest,
16640 	test_cryptodev_cpu_aesni_gcm);
16641 REGISTER_TEST_COMMAND(cryptodev_mlx5_autotest, test_cryptodev_mlx5);
16642 REGISTER_TEST_COMMAND(cryptodev_null_autotest, test_cryptodev_null);
16643 REGISTER_TEST_COMMAND(cryptodev_sw_snow3g_autotest, test_cryptodev_sw_snow3g);
16644 REGISTER_TEST_COMMAND(cryptodev_sw_kasumi_autotest, test_cryptodev_sw_kasumi);
16645 REGISTER_TEST_COMMAND(cryptodev_sw_zuc_autotest, test_cryptodev_sw_zuc);
16646 REGISTER_TEST_COMMAND(cryptodev_sw_armv8_autotest, test_cryptodev_armv8);
16647 REGISTER_TEST_COMMAND(cryptodev_sw_mvsam_autotest, test_cryptodev_mrvl);
16648 REGISTER_TEST_COMMAND(cryptodev_dpaa2_sec_autotest, test_cryptodev_dpaa2_sec);
16649 REGISTER_TEST_COMMAND(cryptodev_dpaa_sec_autotest, test_cryptodev_dpaa_sec);
16650 REGISTER_TEST_COMMAND(cryptodev_ccp_autotest, test_cryptodev_ccp);
16651 REGISTER_TEST_COMMAND(cryptodev_virtio_autotest, test_cryptodev_virtio);
16652 REGISTER_TEST_COMMAND(cryptodev_octeontx_autotest, test_cryptodev_octeontx);
16653 REGISTER_TEST_COMMAND(cryptodev_caam_jr_autotest, test_cryptodev_caam_jr);
16654 REGISTER_TEST_COMMAND(cryptodev_nitrox_autotest, test_cryptodev_nitrox);
16655 REGISTER_TEST_COMMAND(cryptodev_bcmfs_autotest, test_cryptodev_bcmfs);
16656 REGISTER_TEST_COMMAND(cryptodev_cn9k_autotest, test_cryptodev_cn9k);
16657 REGISTER_TEST_COMMAND(cryptodev_cn10k_autotest, test_cryptodev_cn10k);
16658